OSDN Git Service

update darwin to use link_gcc_c_sequence.
[pf3gnuchains/gcc-fork.git] / gcc / gimple.c
1 /* Gimple IR support functions.
2
3    Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4    Contributed by Aldy Hernandez <aldyh@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "target.h"
27 #include "tree.h"
28 #include "ggc.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "gimple.h"
32 #include "toplev.h"
33 #include "diagnostic.h"
34 #include "tree-flow.h"
35 #include "value-prof.h"
36 #include "flags.h"
37 #include "alias.h"
38 #include "demangle.h"
39 #include "langhooks.h"
40
41 /* Global type table.  FIXME lto, it should be possible to re-use some
42    of the type hashing routines in tree.c (type_hash_canon, type_hash_lookup,
43    etc), but those assume that types were built with the various
44    build_*_type routines which is not the case with the streamer.  */
45 static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
46   htab_t gimple_types;
47 static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
48   htab_t gimple_canonical_types;
49 static GTY((if_marked ("tree_int_map_marked_p"), param_is (struct tree_int_map)))
50   htab_t type_hash_cache;
51
52 /* Global type comparison cache.  This is by TYPE_UID for space efficiency
53    and thus cannot use and does not need GC.  */
54 static htab_t gtc_visited;
55 static struct obstack gtc_ob;
56
57 /* All the tuples have their operand vector (if present) at the very bottom
58    of the structure.  Therefore, the offset required to find the
59    operands vector the size of the structure minus the size of the 1
60    element tree array at the end (see gimple_ops).  */
61 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \
62         (HAS_TREE_OP ? sizeof (struct STRUCT) - sizeof (tree) : 0),
63 EXPORTED_CONST size_t gimple_ops_offset_[] = {
64 #include "gsstruct.def"
65 };
66 #undef DEFGSSTRUCT
67
68 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof(struct STRUCT),
69 static const size_t gsstruct_code_size[] = {
70 #include "gsstruct.def"
71 };
72 #undef DEFGSSTRUCT
73
74 #define DEFGSCODE(SYM, NAME, GSSCODE)   NAME,
75 const char *const gimple_code_name[] = {
76 #include "gimple.def"
77 };
78 #undef DEFGSCODE
79
80 #define DEFGSCODE(SYM, NAME, GSSCODE)   GSSCODE,
81 EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = {
82 #include "gimple.def"
83 };
84 #undef DEFGSCODE
85
86 #ifdef GATHER_STATISTICS
87 /* Gimple stats.  */
88
89 int gimple_alloc_counts[(int) gimple_alloc_kind_all];
90 int gimple_alloc_sizes[(int) gimple_alloc_kind_all];
91
92 /* Keep in sync with gimple.h:enum gimple_alloc_kind.  */
93 static const char * const gimple_alloc_kind_names[] = {
94     "assignments",
95     "phi nodes",
96     "conditionals",
97     "sequences",
98     "everything else"
99 };
100
101 #endif /* GATHER_STATISTICS */
102
103 /* A cache of gimple_seq objects.  Sequences are created and destroyed
104    fairly often during gimplification.  */
105 static GTY ((deletable)) struct gimple_seq_d *gimple_seq_cache;
106
107 /* Private API manipulation functions shared only with some
108    other files.  */
109 extern void gimple_set_stored_syms (gimple, bitmap, bitmap_obstack *);
110 extern void gimple_set_loaded_syms (gimple, bitmap, bitmap_obstack *);
111
112 /* Gimple tuple constructors.
113    Note: Any constructor taking a ``gimple_seq'' as a parameter, can
114    be passed a NULL to start with an empty sequence.  */
115
116 /* Set the code for statement G to CODE.  */
117
118 static inline void
119 gimple_set_code (gimple g, enum gimple_code code)
120 {
121   g->gsbase.code = code;
122 }
123
124 /* Return the number of bytes needed to hold a GIMPLE statement with
125    code CODE.  */
126
127 static inline size_t
128 gimple_size (enum gimple_code code)
129 {
130   return gsstruct_code_size[gss_for_code (code)];
131 }
132
133 /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
134    operands.  */
135
136 gimple
137 gimple_alloc_stat (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
138 {
139   size_t size;
140   gimple stmt;
141
142   size = gimple_size (code);
143   if (num_ops > 0)
144     size += sizeof (tree) * (num_ops - 1);
145
146 #ifdef GATHER_STATISTICS
147   {
148     enum gimple_alloc_kind kind = gimple_alloc_kind (code);
149     gimple_alloc_counts[(int) kind]++;
150     gimple_alloc_sizes[(int) kind] += size;
151   }
152 #endif
153
154   stmt = ggc_alloc_cleared_gimple_statement_d_stat (size PASS_MEM_STAT);
155   gimple_set_code (stmt, code);
156   gimple_set_num_ops (stmt, num_ops);
157
158   /* Do not call gimple_set_modified here as it has other side
159      effects and this tuple is still not completely built.  */
160   stmt->gsbase.modified = 1;
161
162   return stmt;
163 }
164
165 /* Set SUBCODE to be the code of the expression computed by statement G.  */
166
167 static inline void
168 gimple_set_subcode (gimple g, unsigned subcode)
169 {
170   /* We only have 16 bits for the RHS code.  Assert that we are not
171      overflowing it.  */
172   gcc_assert (subcode < (1 << 16));
173   g->gsbase.subcode = subcode;
174 }
175
176
177
178 /* Build a tuple with operands.  CODE is the statement to build (which
179    must be one of the GIMPLE_WITH_OPS tuples).  SUBCODE is the sub-code
180    for the new tuple.  NUM_OPS is the number of operands to allocate.  */
181
182 #define gimple_build_with_ops(c, s, n) \
183   gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO)
184
185 static gimple
186 gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
187                             unsigned num_ops MEM_STAT_DECL)
188 {
189   gimple s = gimple_alloc_stat (code, num_ops PASS_MEM_STAT);
190   gimple_set_subcode (s, subcode);
191
192   return s;
193 }
194
195
196 /* Build a GIMPLE_RETURN statement returning RETVAL.  */
197
198 gimple
199 gimple_build_return (tree retval)
200 {
201   gimple s = gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, 1);
202   if (retval)
203     gimple_return_set_retval (s, retval);
204   return s;
205 }
206
207 /* Reset alias information on call S.  */
208
209 void
210 gimple_call_reset_alias_info (gimple s)
211 {
212   if (gimple_call_flags (s) & ECF_CONST)
213     memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
214   else
215     pt_solution_reset (gimple_call_use_set (s));
216   if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
217     memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
218   else
219     pt_solution_reset (gimple_call_clobber_set (s));
220 }
221
222 /* Helper for gimple_build_call, gimple_build_call_vec and
223    gimple_build_call_from_tree.  Build the basic components of a
224    GIMPLE_CALL statement to function FN with NARGS arguments.  */
225
226 static inline gimple
227 gimple_build_call_1 (tree fn, unsigned nargs)
228 {
229   gimple s = gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK, nargs + 3);
230   if (TREE_CODE (fn) == FUNCTION_DECL)
231     fn = build_fold_addr_expr (fn);
232   gimple_set_op (s, 1, fn);
233   gimple_call_reset_alias_info (s);
234   return s;
235 }
236
237
238 /* Build a GIMPLE_CALL statement to function FN with the arguments
239    specified in vector ARGS.  */
240
241 gimple
242 gimple_build_call_vec (tree fn, VEC(tree, heap) *args)
243 {
244   unsigned i;
245   unsigned nargs = VEC_length (tree, args);
246   gimple call = gimple_build_call_1 (fn, nargs);
247
248   for (i = 0; i < nargs; i++)
249     gimple_call_set_arg (call, i, VEC_index (tree, args, i));
250
251   return call;
252 }
253
254
255 /* Build a GIMPLE_CALL statement to function FN.  NARGS is the number of
256    arguments.  The ... are the arguments.  */
257
258 gimple
259 gimple_build_call (tree fn, unsigned nargs, ...)
260 {
261   va_list ap;
262   gimple call;
263   unsigned i;
264
265   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
266
267   call = gimple_build_call_1 (fn, nargs);
268
269   va_start (ap, nargs);
270   for (i = 0; i < nargs; i++)
271     gimple_call_set_arg (call, i, va_arg (ap, tree));
272   va_end (ap);
273
274   return call;
275 }
276
277
278 /* Build a GIMPLE_CALL statement from CALL_EXPR T.  Note that T is
279    assumed to be in GIMPLE form already.  Minimal checking is done of
280    this fact.  */
281
282 gimple
283 gimple_build_call_from_tree (tree t)
284 {
285   unsigned i, nargs;
286   gimple call;
287   tree fndecl = get_callee_fndecl (t);
288
289   gcc_assert (TREE_CODE (t) == CALL_EXPR);
290
291   nargs = call_expr_nargs (t);
292   call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
293
294   for (i = 0; i < nargs; i++)
295     gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
296
297   gimple_set_block (call, TREE_BLOCK (t));
298
299   /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL.  */
300   gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
301   gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
302   gimple_call_set_cannot_inline (call, CALL_CANNOT_INLINE_P (t));
303   gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
304   gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
305   gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
306   gimple_call_set_nothrow (call, TREE_NOTHROW (t));
307   gimple_set_no_warning (call, TREE_NO_WARNING (t));
308
309   return call;
310 }
311
312
313 /* Extract the operands and code for expression EXPR into *SUBCODE_P,
314    *OP1_P, *OP2_P and *OP3_P respectively.  */
315
316 void
317 extract_ops_from_tree_1 (tree expr, enum tree_code *subcode_p, tree *op1_p,
318                          tree *op2_p, tree *op3_p)
319 {
320   enum gimple_rhs_class grhs_class;
321
322   *subcode_p = TREE_CODE (expr);
323   grhs_class = get_gimple_rhs_class (*subcode_p);
324
325   if (grhs_class == GIMPLE_TERNARY_RHS)
326     {
327       *op1_p = TREE_OPERAND (expr, 0);
328       *op2_p = TREE_OPERAND (expr, 1);
329       *op3_p = TREE_OPERAND (expr, 2);
330     }
331   else if (grhs_class == GIMPLE_BINARY_RHS)
332     {
333       *op1_p = TREE_OPERAND (expr, 0);
334       *op2_p = TREE_OPERAND (expr, 1);
335       *op3_p = NULL_TREE;
336     }
337   else if (grhs_class == GIMPLE_UNARY_RHS)
338     {
339       *op1_p = TREE_OPERAND (expr, 0);
340       *op2_p = NULL_TREE;
341       *op3_p = NULL_TREE;
342     }
343   else if (grhs_class == GIMPLE_SINGLE_RHS)
344     {
345       *op1_p = expr;
346       *op2_p = NULL_TREE;
347       *op3_p = NULL_TREE;
348     }
349   else
350     gcc_unreachable ();
351 }
352
353
354 /* Build a GIMPLE_ASSIGN statement.
355
356    LHS of the assignment.
357    RHS of the assignment which can be unary or binary.  */
358
359 gimple
360 gimple_build_assign_stat (tree lhs, tree rhs MEM_STAT_DECL)
361 {
362   enum tree_code subcode;
363   tree op1, op2, op3;
364
365   extract_ops_from_tree_1 (rhs, &subcode, &op1, &op2, &op3);
366   return gimple_build_assign_with_ops_stat (subcode, lhs, op1, op2, op3
367                                             PASS_MEM_STAT);
368 }
369
370
371 /* Build a GIMPLE_ASSIGN statement with sub-code SUBCODE and operands
372    OP1 and OP2.  If OP2 is NULL then SUBCODE must be of class
373    GIMPLE_UNARY_RHS or GIMPLE_SINGLE_RHS.  */
374
375 gimple
376 gimple_build_assign_with_ops_stat (enum tree_code subcode, tree lhs, tree op1,
377                                    tree op2, tree op3 MEM_STAT_DECL)
378 {
379   unsigned num_ops;
380   gimple p;
381
382   /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
383      code).  */
384   num_ops = get_gimple_rhs_num_ops (subcode) + 1;
385
386   p = gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
387                                   PASS_MEM_STAT);
388   gimple_assign_set_lhs (p, lhs);
389   gimple_assign_set_rhs1 (p, op1);
390   if (op2)
391     {
392       gcc_assert (num_ops > 2);
393       gimple_assign_set_rhs2 (p, op2);
394     }
395
396   if (op3)
397     {
398       gcc_assert (num_ops > 3);
399       gimple_assign_set_rhs3 (p, op3);
400     }
401
402   return p;
403 }
404
405
406 /* Build a new GIMPLE_ASSIGN tuple and append it to the end of *SEQ_P.
407
408    DST/SRC are the destination and source respectively.  You can pass
409    ungimplified trees in DST or SRC, in which case they will be
410    converted to a gimple operand if necessary.
411
412    This function returns the newly created GIMPLE_ASSIGN tuple.  */
413
414 gimple
415 gimplify_assign (tree dst, tree src, gimple_seq *seq_p)
416 {
417   tree t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
418   gimplify_and_add (t, seq_p);
419   ggc_free (t);
420   return gimple_seq_last_stmt (*seq_p);
421 }
422
423
424 /* Build a GIMPLE_COND statement.
425
426    PRED is the condition used to compare LHS and the RHS.
427    T_LABEL is the label to jump to if the condition is true.
428    F_LABEL is the label to jump to otherwise.  */
429
430 gimple
431 gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
432                    tree t_label, tree f_label)
433 {
434   gimple p;
435
436   gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
437   p = gimple_build_with_ops (GIMPLE_COND, pred_code, 4);
438   gimple_cond_set_lhs (p, lhs);
439   gimple_cond_set_rhs (p, rhs);
440   gimple_cond_set_true_label (p, t_label);
441   gimple_cond_set_false_label (p, f_label);
442   return p;
443 }
444
445
446 /* Extract operands for a GIMPLE_COND statement out of COND_EXPR tree COND.  */
447
448 void
449 gimple_cond_get_ops_from_tree (tree cond, enum tree_code *code_p,
450                                tree *lhs_p, tree *rhs_p)
451 {
452   gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison
453               || TREE_CODE (cond) == TRUTH_NOT_EXPR
454               || is_gimple_min_invariant (cond)
455               || SSA_VAR_P (cond));
456
457   extract_ops_from_tree (cond, code_p, lhs_p, rhs_p);
458
459   /* Canonicalize conditionals of the form 'if (!VAL)'.  */
460   if (*code_p == TRUTH_NOT_EXPR)
461     {
462       *code_p = EQ_EXPR;
463       gcc_assert (*lhs_p && *rhs_p == NULL_TREE);
464       *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
465     }
466   /* Canonicalize conditionals of the form 'if (VAL)'  */
467   else if (TREE_CODE_CLASS (*code_p) != tcc_comparison)
468     {
469       *code_p = NE_EXPR;
470       gcc_assert (*lhs_p && *rhs_p == NULL_TREE);
471       *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
472     }
473 }
474
475
476 /* Build a GIMPLE_COND statement from the conditional expression tree
477    COND.  T_LABEL and F_LABEL are as in gimple_build_cond.  */
478
479 gimple
480 gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
481 {
482   enum tree_code code;
483   tree lhs, rhs;
484
485   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
486   return gimple_build_cond (code, lhs, rhs, t_label, f_label);
487 }
488
489 /* Set code, lhs, and rhs of a GIMPLE_COND from a suitable
490    boolean expression tree COND.  */
491
492 void
493 gimple_cond_set_condition_from_tree (gimple stmt, tree cond)
494 {
495   enum tree_code code;
496   tree lhs, rhs;
497
498   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
499   gimple_cond_set_condition (stmt, code, lhs, rhs);
500 }
501
502 /* Build a GIMPLE_LABEL statement for LABEL.  */
503
504 gimple
505 gimple_build_label (tree label)
506 {
507   gimple p = gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1);
508   gimple_label_set_label (p, label);
509   return p;
510 }
511
512 /* Build a GIMPLE_GOTO statement to label DEST.  */
513
514 gimple
515 gimple_build_goto (tree dest)
516 {
517   gimple p = gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1);
518   gimple_goto_set_dest (p, dest);
519   return p;
520 }
521
522
523 /* Build a GIMPLE_NOP statement.  */
524
525 gimple
526 gimple_build_nop (void)
527 {
528   return gimple_alloc (GIMPLE_NOP, 0);
529 }
530
531
532 /* Build a GIMPLE_BIND statement.
533    VARS are the variables in BODY.
534    BLOCK is the containing block.  */
535
536 gimple
537 gimple_build_bind (tree vars, gimple_seq body, tree block)
538 {
539   gimple p = gimple_alloc (GIMPLE_BIND, 0);
540   gimple_bind_set_vars (p, vars);
541   if (body)
542     gimple_bind_set_body (p, body);
543   if (block)
544     gimple_bind_set_block (p, block);
545   return p;
546 }
547
548 /* Helper function to set the simple fields of a asm stmt.
549
550    STRING is a pointer to a string that is the asm blocks assembly code.
551    NINPUT is the number of register inputs.
552    NOUTPUT is the number of register outputs.
553    NCLOBBERS is the number of clobbered registers.
554    */
555
556 static inline gimple
557 gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
558                     unsigned nclobbers, unsigned nlabels)
559 {
560   gimple p;
561   int size = strlen (string);
562
563   /* ASMs with labels cannot have outputs.  This should have been
564      enforced by the front end.  */
565   gcc_assert (nlabels == 0 || noutputs == 0);
566
567   p = gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
568                              ninputs + noutputs + nclobbers + nlabels);
569
570   p->gimple_asm.ni = ninputs;
571   p->gimple_asm.no = noutputs;
572   p->gimple_asm.nc = nclobbers;
573   p->gimple_asm.nl = nlabels;
574   p->gimple_asm.string = ggc_alloc_string (string, size);
575
576 #ifdef GATHER_STATISTICS
577   gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
578 #endif
579
580   return p;
581 }
582
583 /* Build a GIMPLE_ASM statement.
584
585    STRING is the assembly code.
586    NINPUT is the number of register inputs.
587    NOUTPUT is the number of register outputs.
588    NCLOBBERS is the number of clobbered registers.
589    INPUTS is a vector of the input register parameters.
590    OUTPUTS is a vector of the output register parameters.
591    CLOBBERS is a vector of the clobbered register parameters.
592    LABELS is a vector of destination labels.  */
593
594 gimple
595 gimple_build_asm_vec (const char *string, VEC(tree,gc)* inputs,
596                       VEC(tree,gc)* outputs, VEC(tree,gc)* clobbers,
597                       VEC(tree,gc)* labels)
598 {
599   gimple p;
600   unsigned i;
601
602   p = gimple_build_asm_1 (string,
603                           VEC_length (tree, inputs),
604                           VEC_length (tree, outputs),
605                           VEC_length (tree, clobbers),
606                           VEC_length (tree, labels));
607
608   for (i = 0; i < VEC_length (tree, inputs); i++)
609     gimple_asm_set_input_op (p, i, VEC_index (tree, inputs, i));
610
611   for (i = 0; i < VEC_length (tree, outputs); i++)
612     gimple_asm_set_output_op (p, i, VEC_index (tree, outputs, i));
613
614   for (i = 0; i < VEC_length (tree, clobbers); i++)
615     gimple_asm_set_clobber_op (p, i, VEC_index (tree, clobbers, i));
616
617   for (i = 0; i < VEC_length (tree, labels); i++)
618     gimple_asm_set_label_op (p, i, VEC_index (tree, labels, i));
619
620   return p;
621 }
622
623 /* Build a GIMPLE_CATCH statement.
624
625   TYPES are the catch types.
626   HANDLER is the exception handler.  */
627
628 gimple
629 gimple_build_catch (tree types, gimple_seq handler)
630 {
631   gimple p = gimple_alloc (GIMPLE_CATCH, 0);
632   gimple_catch_set_types (p, types);
633   if (handler)
634     gimple_catch_set_handler (p, handler);
635
636   return p;
637 }
638
639 /* Build a GIMPLE_EH_FILTER statement.
640
641    TYPES are the filter's types.
642    FAILURE is the filter's failure action.  */
643
644 gimple
645 gimple_build_eh_filter (tree types, gimple_seq failure)
646 {
647   gimple p = gimple_alloc (GIMPLE_EH_FILTER, 0);
648   gimple_eh_filter_set_types (p, types);
649   if (failure)
650     gimple_eh_filter_set_failure (p, failure);
651
652   return p;
653 }
654
655 /* Build a GIMPLE_EH_MUST_NOT_THROW statement.  */
656
657 gimple
658 gimple_build_eh_must_not_throw (tree decl)
659 {
660   gimple p = gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0);
661
662   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
663   gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
664   gimple_eh_must_not_throw_set_fndecl (p, decl);
665
666   return p;
667 }
668
669 /* Build a GIMPLE_TRY statement.
670
671    EVAL is the expression to evaluate.
672    CLEANUP is the cleanup expression.
673    KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on
674    whether this is a try/catch or a try/finally respectively.  */
675
676 gimple
677 gimple_build_try (gimple_seq eval, gimple_seq cleanup,
678                   enum gimple_try_flags kind)
679 {
680   gimple p;
681
682   gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
683   p = gimple_alloc (GIMPLE_TRY, 0);
684   gimple_set_subcode (p, kind);
685   if (eval)
686     gimple_try_set_eval (p, eval);
687   if (cleanup)
688     gimple_try_set_cleanup (p, cleanup);
689
690   return p;
691 }
692
693 /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
694
695    CLEANUP is the cleanup expression.  */
696
697 gimple
698 gimple_build_wce (gimple_seq cleanup)
699 {
700   gimple p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
701   if (cleanup)
702     gimple_wce_set_cleanup (p, cleanup);
703
704   return p;
705 }
706
707
708 /* Build a GIMPLE_RESX statement.  */
709
710 gimple
711 gimple_build_resx (int region)
712 {
713   gimple p = gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0);
714   p->gimple_eh_ctrl.region = region;
715   return p;
716 }
717
718
719 /* The helper for constructing a gimple switch statement.
720    INDEX is the switch's index.
721    NLABELS is the number of labels in the switch excluding the default.
722    DEFAULT_LABEL is the default label for the switch statement.  */
723
724 gimple
725 gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
726 {
727   /* nlabels + 1 default label + 1 index.  */
728   gimple p = gimple_build_with_ops (GIMPLE_SWITCH, ERROR_MARK,
729                                     1 + (default_label != NULL) + nlabels);
730   gimple_switch_set_index (p, index);
731   if (default_label)
732     gimple_switch_set_default_label (p, default_label);
733   return p;
734 }
735
736
737 /* Build a GIMPLE_SWITCH statement.
738
739    INDEX is the switch's index.
740    NLABELS is the number of labels in the switch excluding the DEFAULT_LABEL.
741    ... are the labels excluding the default.  */
742
743 gimple
744 gimple_build_switch (unsigned nlabels, tree index, tree default_label, ...)
745 {
746   va_list al;
747   unsigned i, offset;
748   gimple p = gimple_build_switch_nlabels (nlabels, index, default_label);
749
750   /* Store the rest of the labels.  */
751   va_start (al, default_label);
752   offset = (default_label != NULL);
753   for (i = 0; i < nlabels; i++)
754     gimple_switch_set_label (p, i + offset, va_arg (al, tree));
755   va_end (al);
756
757   return p;
758 }
759
760
761 /* Build a GIMPLE_SWITCH statement.
762
763    INDEX is the switch's index.
764    DEFAULT_LABEL is the default label
765    ARGS is a vector of labels excluding the default.  */
766
767 gimple
768 gimple_build_switch_vec (tree index, tree default_label, VEC(tree, heap) *args)
769 {
770   unsigned i, offset, nlabels = VEC_length (tree, args);
771   gimple p = gimple_build_switch_nlabels (nlabels, index, default_label);
772
773   /* Copy the labels from the vector to the switch statement.  */
774   offset = (default_label != NULL);
775   for (i = 0; i < nlabels; i++)
776     gimple_switch_set_label (p, i + offset, VEC_index (tree, args, i));
777
778   return p;
779 }
780
781 /* Build a GIMPLE_EH_DISPATCH statement.  */
782
783 gimple
784 gimple_build_eh_dispatch (int region)
785 {
786   gimple p = gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0);
787   p->gimple_eh_ctrl.region = region;
788   return p;
789 }
790
791 /* Build a new GIMPLE_DEBUG_BIND statement.
792
793    VAR is bound to VALUE; block and location are taken from STMT.  */
794
795 gimple
796 gimple_build_debug_bind_stat (tree var, tree value, gimple stmt MEM_STAT_DECL)
797 {
798   gimple p = gimple_build_with_ops_stat (GIMPLE_DEBUG,
799                                          (unsigned)GIMPLE_DEBUG_BIND, 2
800                                          PASS_MEM_STAT);
801
802   gimple_debug_bind_set_var (p, var);
803   gimple_debug_bind_set_value (p, value);
804   if (stmt)
805     {
806       gimple_set_block (p, gimple_block (stmt));
807       gimple_set_location (p, gimple_location (stmt));
808     }
809
810   return p;
811 }
812
813
814 /* Build a GIMPLE_OMP_CRITICAL statement.
815
816    BODY is the sequence of statements for which only one thread can execute.
817    NAME is optional identifier for this critical block.  */
818
819 gimple
820 gimple_build_omp_critical (gimple_seq body, tree name)
821 {
822   gimple p = gimple_alloc (GIMPLE_OMP_CRITICAL, 0);
823   gimple_omp_critical_set_name (p, name);
824   if (body)
825     gimple_omp_set_body (p, body);
826
827   return p;
828 }
829
830 /* Build a GIMPLE_OMP_FOR statement.
831
832    BODY is sequence of statements inside the for loop.
833    CLAUSES, are any of the OMP loop construct's clauses: private, firstprivate,
834    lastprivate, reductions, ordered, schedule, and nowait.
835    COLLAPSE is the collapse count.
836    PRE_BODY is the sequence of statements that are loop invariant.  */
837
838 gimple
839 gimple_build_omp_for (gimple_seq body, tree clauses, size_t collapse,
840                       gimple_seq pre_body)
841 {
842   gimple p = gimple_alloc (GIMPLE_OMP_FOR, 0);
843   if (body)
844     gimple_omp_set_body (p, body);
845   gimple_omp_for_set_clauses (p, clauses);
846   p->gimple_omp_for.collapse = collapse;
847   p->gimple_omp_for.iter
848       = ggc_alloc_cleared_vec_gimple_omp_for_iter (collapse);
849   if (pre_body)
850     gimple_omp_for_set_pre_body (p, pre_body);
851
852   return p;
853 }
854
855
856 /* Build a GIMPLE_OMP_PARALLEL statement.
857
858    BODY is sequence of statements which are executed in parallel.
859    CLAUSES, are the OMP parallel construct's clauses.
860    CHILD_FN is the function created for the parallel threads to execute.
861    DATA_ARG are the shared data argument(s).  */
862
863 gimple
864 gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
865                            tree data_arg)
866 {
867   gimple p = gimple_alloc (GIMPLE_OMP_PARALLEL, 0);
868   if (body)
869     gimple_omp_set_body (p, body);
870   gimple_omp_parallel_set_clauses (p, clauses);
871   gimple_omp_parallel_set_child_fn (p, child_fn);
872   gimple_omp_parallel_set_data_arg (p, data_arg);
873
874   return p;
875 }
876
877
878 /* Build a GIMPLE_OMP_TASK statement.
879
880    BODY is sequence of statements which are executed by the explicit task.
881    CLAUSES, are the OMP parallel construct's clauses.
882    CHILD_FN is the function created for the parallel threads to execute.
883    DATA_ARG are the shared data argument(s).
884    COPY_FN is the optional function for firstprivate initialization.
885    ARG_SIZE and ARG_ALIGN are size and alignment of the data block.  */
886
887 gimple
888 gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn,
889                        tree data_arg, tree copy_fn, tree arg_size,
890                        tree arg_align)
891 {
892   gimple p = gimple_alloc (GIMPLE_OMP_TASK, 0);
893   if (body)
894     gimple_omp_set_body (p, body);
895   gimple_omp_task_set_clauses (p, clauses);
896   gimple_omp_task_set_child_fn (p, child_fn);
897   gimple_omp_task_set_data_arg (p, data_arg);
898   gimple_omp_task_set_copy_fn (p, copy_fn);
899   gimple_omp_task_set_arg_size (p, arg_size);
900   gimple_omp_task_set_arg_align (p, arg_align);
901
902   return p;
903 }
904
905
906 /* Build a GIMPLE_OMP_SECTION statement for a sections statement.
907
908    BODY is the sequence of statements in the section.  */
909
910 gimple
911 gimple_build_omp_section (gimple_seq body)
912 {
913   gimple p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
914   if (body)
915     gimple_omp_set_body (p, body);
916
917   return p;
918 }
919
920
921 /* Build a GIMPLE_OMP_MASTER statement.
922
923    BODY is the sequence of statements to be executed by just the master.  */
924
925 gimple
926 gimple_build_omp_master (gimple_seq body)
927 {
928   gimple p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
929   if (body)
930     gimple_omp_set_body (p, body);
931
932   return p;
933 }
934
935
936 /* Build a GIMPLE_OMP_CONTINUE statement.
937
938    CONTROL_DEF is the definition of the control variable.
939    CONTROL_USE is the use of the control variable.  */
940
941 gimple
942 gimple_build_omp_continue (tree control_def, tree control_use)
943 {
944   gimple p = gimple_alloc (GIMPLE_OMP_CONTINUE, 0);
945   gimple_omp_continue_set_control_def (p, control_def);
946   gimple_omp_continue_set_control_use (p, control_use);
947   return p;
948 }
949
950 /* Build a GIMPLE_OMP_ORDERED statement.
951
952    BODY is the sequence of statements inside a loop that will executed in
953    sequence.  */
954
955 gimple
956 gimple_build_omp_ordered (gimple_seq body)
957 {
958   gimple p = gimple_alloc (GIMPLE_OMP_ORDERED, 0);
959   if (body)
960     gimple_omp_set_body (p, body);
961
962   return p;
963 }
964
965
966 /* Build a GIMPLE_OMP_RETURN statement.
967    WAIT_P is true if this is a non-waiting return.  */
968
969 gimple
970 gimple_build_omp_return (bool wait_p)
971 {
972   gimple p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
973   if (wait_p)
974     gimple_omp_return_set_nowait (p);
975
976   return p;
977 }
978
979
980 /* Build a GIMPLE_OMP_SECTIONS statement.
981
982    BODY is a sequence of section statements.
983    CLAUSES are any of the OMP sections contsruct's clauses: private,
984    firstprivate, lastprivate, reduction, and nowait.  */
985
986 gimple
987 gimple_build_omp_sections (gimple_seq body, tree clauses)
988 {
989   gimple p = gimple_alloc (GIMPLE_OMP_SECTIONS, 0);
990   if (body)
991     gimple_omp_set_body (p, body);
992   gimple_omp_sections_set_clauses (p, clauses);
993
994   return p;
995 }
996
997
998 /* Build a GIMPLE_OMP_SECTIONS_SWITCH.  */
999
1000 gimple
1001 gimple_build_omp_sections_switch (void)
1002 {
1003   return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
1004 }
1005
1006
1007 /* Build a GIMPLE_OMP_SINGLE statement.
1008
1009    BODY is the sequence of statements that will be executed once.
1010    CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
1011    copyprivate, nowait.  */
1012
1013 gimple
1014 gimple_build_omp_single (gimple_seq body, tree clauses)
1015 {
1016   gimple p = gimple_alloc (GIMPLE_OMP_SINGLE, 0);
1017   if (body)
1018     gimple_omp_set_body (p, body);
1019   gimple_omp_single_set_clauses (p, clauses);
1020
1021   return p;
1022 }
1023
1024
1025 /* Build a GIMPLE_OMP_ATOMIC_LOAD statement.  */
1026
1027 gimple
1028 gimple_build_omp_atomic_load (tree lhs, tree rhs)
1029 {
1030   gimple p = gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0);
1031   gimple_omp_atomic_load_set_lhs (p, lhs);
1032   gimple_omp_atomic_load_set_rhs (p, rhs);
1033   return p;
1034 }
1035
1036 /* Build a GIMPLE_OMP_ATOMIC_STORE statement.
1037
1038    VAL is the value we are storing.  */
1039
1040 gimple
1041 gimple_build_omp_atomic_store (tree val)
1042 {
1043   gimple p = gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0);
1044   gimple_omp_atomic_store_set_val (p, val);
1045   return p;
1046 }
1047
1048 /* Build a GIMPLE_PREDICT statement.  PREDICT is one of the predictors from
1049    predict.def, OUTCOME is NOT_TAKEN or TAKEN.  */
1050
1051 gimple
1052 gimple_build_predict (enum br_predictor predictor, enum prediction outcome)
1053 {
1054   gimple p = gimple_alloc (GIMPLE_PREDICT, 0);
1055   /* Ensure all the predictors fit into the lower bits of the subcode.  */
1056   gcc_assert ((int) END_PREDICTORS <= GF_PREDICT_TAKEN);
1057   gimple_predict_set_predictor (p, predictor);
1058   gimple_predict_set_outcome (p, outcome);
1059   return p;
1060 }
1061
1062 #if defined ENABLE_GIMPLE_CHECKING
1063 /* Complain of a gimple type mismatch and die.  */
1064
1065 void
1066 gimple_check_failed (const_gimple gs, const char *file, int line,
1067                      const char *function, enum gimple_code code,
1068                      enum tree_code subcode)
1069 {
1070   internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d",
1071                   gimple_code_name[code],
1072                   tree_code_name[subcode],
1073                   gimple_code_name[gimple_code (gs)],
1074                   gs->gsbase.subcode > 0
1075                     ? tree_code_name[gs->gsbase.subcode]
1076                     : "",
1077                   function, trim_filename (file), line);
1078 }
1079 #endif /* ENABLE_GIMPLE_CHECKING */
1080
1081
1082 /* Allocate a new GIMPLE sequence in GC memory and return it.  If
1083    there are free sequences in GIMPLE_SEQ_CACHE return one of those
1084    instead.  */
1085
1086 gimple_seq
1087 gimple_seq_alloc (void)
1088 {
1089   gimple_seq seq = gimple_seq_cache;
1090   if (seq)
1091     {
1092       gimple_seq_cache = gimple_seq_cache->next_free;
1093       gcc_assert (gimple_seq_cache != seq);
1094       memset (seq, 0, sizeof (*seq));
1095     }
1096   else
1097     {
1098       seq = ggc_alloc_cleared_gimple_seq_d ();
1099 #ifdef GATHER_STATISTICS
1100       gimple_alloc_counts[(int) gimple_alloc_kind_seq]++;
1101       gimple_alloc_sizes[(int) gimple_alloc_kind_seq] += sizeof (*seq);
1102 #endif
1103     }
1104
1105   return seq;
1106 }
1107
1108 /* Return SEQ to the free pool of GIMPLE sequences.  */
1109
1110 void
1111 gimple_seq_free (gimple_seq seq)
1112 {
1113   if (seq == NULL)
1114     return;
1115
1116   gcc_assert (gimple_seq_first (seq) == NULL);
1117   gcc_assert (gimple_seq_last (seq) == NULL);
1118
1119   /* If this triggers, it's a sign that the same list is being freed
1120      twice.  */
1121   gcc_assert (seq != gimple_seq_cache || gimple_seq_cache == NULL);
1122
1123   /* Add SEQ to the pool of free sequences.  */
1124   seq->next_free = gimple_seq_cache;
1125   gimple_seq_cache = seq;
1126 }
1127
1128
1129 /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
1130    *SEQ_P is NULL, a new sequence is allocated.  */
1131
1132 void
1133 gimple_seq_add_stmt (gimple_seq *seq_p, gimple gs)
1134 {
1135   gimple_stmt_iterator si;
1136
1137   if (gs == NULL)
1138     return;
1139
1140   if (*seq_p == NULL)
1141     *seq_p = gimple_seq_alloc ();
1142
1143   si = gsi_last (*seq_p);
1144   gsi_insert_after (&si, gs, GSI_NEW_STMT);
1145 }
1146
1147
1148 /* Append sequence SRC to the end of sequence *DST_P.  If *DST_P is
1149    NULL, a new sequence is allocated.  */
1150
1151 void
1152 gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
1153 {
1154   gimple_stmt_iterator si;
1155
1156   if (src == NULL)
1157     return;
1158
1159   if (*dst_p == NULL)
1160     *dst_p = gimple_seq_alloc ();
1161
1162   si = gsi_last (*dst_p);
1163   gsi_insert_seq_after (&si, src, GSI_NEW_STMT);
1164 }
1165
1166
1167 /* Helper function of empty_body_p.  Return true if STMT is an empty
1168    statement.  */
1169
1170 static bool
1171 empty_stmt_p (gimple stmt)
1172 {
1173   if (gimple_code (stmt) == GIMPLE_NOP)
1174     return true;
1175   if (gimple_code (stmt) == GIMPLE_BIND)
1176     return empty_body_p (gimple_bind_body (stmt));
1177   return false;
1178 }
1179
1180
1181 /* Return true if BODY contains nothing but empty statements.  */
1182
1183 bool
1184 empty_body_p (gimple_seq body)
1185 {
1186   gimple_stmt_iterator i;
1187
1188   if (gimple_seq_empty_p (body))
1189     return true;
1190   for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
1191     if (!empty_stmt_p (gsi_stmt (i))
1192         && !is_gimple_debug (gsi_stmt (i)))
1193       return false;
1194
1195   return true;
1196 }
1197
1198
1199 /* Perform a deep copy of sequence SRC and return the result.  */
1200
1201 gimple_seq
1202 gimple_seq_copy (gimple_seq src)
1203 {
1204   gimple_stmt_iterator gsi;
1205   gimple_seq new_seq = gimple_seq_alloc ();
1206   gimple stmt;
1207
1208   for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
1209     {
1210       stmt = gimple_copy (gsi_stmt (gsi));
1211       gimple_seq_add_stmt (&new_seq, stmt);
1212     }
1213
1214   return new_seq;
1215 }
1216
1217
1218 /* Walk all the statements in the sequence SEQ calling walk_gimple_stmt
1219    on each one.  WI is as in walk_gimple_stmt.
1220
1221    If walk_gimple_stmt returns non-NULL, the walk is stopped, the
1222    value is stored in WI->CALLBACK_RESULT and the statement that
1223    produced the value is returned.
1224
1225    Otherwise, all the statements are walked and NULL returned.  */
1226
1227 gimple
1228 walk_gimple_seq (gimple_seq seq, walk_stmt_fn callback_stmt,
1229                  walk_tree_fn callback_op, struct walk_stmt_info *wi)
1230 {
1231   gimple_stmt_iterator gsi;
1232
1233   for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
1234     {
1235       tree ret = walk_gimple_stmt (&gsi, callback_stmt, callback_op, wi);
1236       if (ret)
1237         {
1238           /* If CALLBACK_STMT or CALLBACK_OP return a value, WI must exist
1239              to hold it.  */
1240           gcc_assert (wi);
1241           wi->callback_result = ret;
1242           return gsi_stmt (gsi);
1243         }
1244     }
1245
1246   if (wi)
1247     wi->callback_result = NULL_TREE;
1248
1249   return NULL;
1250 }
1251
1252
1253 /* Helper function for walk_gimple_stmt.  Walk operands of a GIMPLE_ASM.  */
1254
1255 static tree
1256 walk_gimple_asm (gimple stmt, walk_tree_fn callback_op,
1257                  struct walk_stmt_info *wi)
1258 {
1259   tree ret, op;
1260   unsigned noutputs;
1261   const char **oconstraints;
1262   unsigned i, n;
1263   const char *constraint;
1264   bool allows_mem, allows_reg, is_inout;
1265
1266   noutputs = gimple_asm_noutputs (stmt);
1267   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
1268
1269   if (wi)
1270     wi->is_lhs = true;
1271
1272   for (i = 0; i < noutputs; i++)
1273     {
1274       op = gimple_asm_output_op (stmt, i);
1275       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
1276       oconstraints[i] = constraint;
1277       parse_output_constraint (&constraint, i, 0, 0, &allows_mem, &allows_reg,
1278                                &is_inout);
1279       if (wi)
1280         wi->val_only = (allows_reg || !allows_mem);
1281       ret = walk_tree (&TREE_VALUE (op), callback_op, wi, NULL);
1282       if (ret)
1283         return ret;
1284     }
1285
1286   n = gimple_asm_ninputs (stmt);
1287   for (i = 0; i < n; i++)
1288     {
1289       op = gimple_asm_input_op (stmt, i);
1290       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
1291       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
1292                               oconstraints, &allows_mem, &allows_reg);
1293       if (wi)
1294         {
1295           wi->val_only = (allows_reg || !allows_mem);
1296           /* Although input "m" is not really a LHS, we need a lvalue.  */
1297           wi->is_lhs = !wi->val_only;
1298         }
1299       ret = walk_tree (&TREE_VALUE (op), callback_op, wi, NULL);
1300       if (ret)
1301         return ret;
1302     }
1303
1304   if (wi)
1305     {
1306       wi->is_lhs = false;
1307       wi->val_only = true;
1308     }
1309
1310   n = gimple_asm_nlabels (stmt);
1311   for (i = 0; i < n; i++)
1312     {
1313       op = gimple_asm_label_op (stmt, i);
1314       ret = walk_tree (&TREE_VALUE (op), callback_op, wi, NULL);
1315       if (ret)
1316         return ret;
1317     }
1318
1319   return NULL_TREE;
1320 }
1321
1322
1323 /* Helper function of WALK_GIMPLE_STMT.  Walk every tree operand in
1324    STMT.  CALLBACK_OP and WI are as in WALK_GIMPLE_STMT.
1325
1326    CALLBACK_OP is called on each operand of STMT via walk_tree.
1327    Additional parameters to walk_tree must be stored in WI.  For each operand
1328    OP, walk_tree is called as:
1329
1330         walk_tree (&OP, CALLBACK_OP, WI, WI->PSET)
1331
1332    If CALLBACK_OP returns non-NULL for an operand, the remaining
1333    operands are not scanned.
1334
1335    The return value is that returned by the last call to walk_tree, or
1336    NULL_TREE if no CALLBACK_OP is specified.  */
1337
1338 tree
1339 walk_gimple_op (gimple stmt, walk_tree_fn callback_op,
1340                 struct walk_stmt_info *wi)
1341 {
1342   struct pointer_set_t *pset = (wi) ? wi->pset : NULL;
1343   unsigned i;
1344   tree ret = NULL_TREE;
1345
1346   switch (gimple_code (stmt))
1347     {
1348     case GIMPLE_ASSIGN:
1349       /* Walk the RHS operands.  If the LHS is of a non-renamable type or
1350          is a register variable, we may use a COMPONENT_REF on the RHS.  */
1351       if (wi)
1352         {
1353           tree lhs = gimple_assign_lhs (stmt);
1354           wi->val_only
1355             = (is_gimple_reg_type (TREE_TYPE (lhs)) && !is_gimple_reg (lhs))
1356               || !gimple_assign_single_p (stmt);
1357         }
1358
1359       for (i = 1; i < gimple_num_ops (stmt); i++)
1360         {
1361           ret = walk_tree (gimple_op_ptr (stmt, i), callback_op, wi,
1362                            pset);
1363           if (ret)
1364             return ret;
1365         }
1366
1367       /* Walk the LHS.  If the RHS is appropriate for a memory, we
1368          may use a COMPONENT_REF on the LHS.  */
1369       if (wi)
1370         {
1371           /* If the RHS has more than 1 operand, it is not appropriate
1372              for the memory.  */
1373           wi->val_only = !is_gimple_mem_rhs (gimple_assign_rhs1 (stmt))
1374                          || !gimple_assign_single_p (stmt);
1375           wi->is_lhs = true;
1376         }
1377
1378       ret = walk_tree (gimple_op_ptr (stmt, 0), callback_op, wi, pset);
1379       if (ret)
1380         return ret;
1381
1382       if (wi)
1383         {
1384           wi->val_only = true;
1385           wi->is_lhs = false;
1386         }
1387       break;
1388
1389     case GIMPLE_CALL:
1390       if (wi)
1391         {
1392           wi->is_lhs = false;
1393           wi->val_only = true;
1394         }
1395
1396       ret = walk_tree (gimple_call_chain_ptr (stmt), callback_op, wi, pset);
1397       if (ret)
1398         return ret;
1399
1400       ret = walk_tree (gimple_call_fn_ptr (stmt), callback_op, wi, pset);
1401       if (ret)
1402         return ret;
1403
1404       for (i = 0; i < gimple_call_num_args (stmt); i++)
1405         {
1406           if (wi)
1407             wi->val_only = is_gimple_reg_type (gimple_call_arg (stmt, i));
1408           ret = walk_tree (gimple_call_arg_ptr (stmt, i), callback_op, wi,
1409                            pset);
1410           if (ret)
1411             return ret;
1412         }
1413
1414       if (gimple_call_lhs (stmt))
1415         {
1416           if (wi)
1417             {
1418               wi->is_lhs = true;
1419               wi->val_only = is_gimple_reg_type (gimple_call_lhs (stmt));
1420             }
1421
1422           ret = walk_tree (gimple_call_lhs_ptr (stmt), callback_op, wi, pset);
1423           if (ret)
1424             return ret;
1425         }
1426
1427       if (wi)
1428         {
1429           wi->is_lhs = false;
1430           wi->val_only = true;
1431         }
1432       break;
1433
1434     case GIMPLE_CATCH:
1435       ret = walk_tree (gimple_catch_types_ptr (stmt), callback_op, wi,
1436                        pset);
1437       if (ret)
1438         return ret;
1439       break;
1440
1441     case GIMPLE_EH_FILTER:
1442       ret = walk_tree (gimple_eh_filter_types_ptr (stmt), callback_op, wi,
1443                        pset);
1444       if (ret)
1445         return ret;
1446       break;
1447
1448     case GIMPLE_ASM:
1449       ret = walk_gimple_asm (stmt, callback_op, wi);
1450       if (ret)
1451         return ret;
1452       break;
1453
1454     case GIMPLE_OMP_CONTINUE:
1455       ret = walk_tree (gimple_omp_continue_control_def_ptr (stmt),
1456                        callback_op, wi, pset);
1457       if (ret)
1458         return ret;
1459
1460       ret = walk_tree (gimple_omp_continue_control_use_ptr (stmt),
1461                        callback_op, wi, pset);
1462       if (ret)
1463         return ret;
1464       break;
1465
1466     case GIMPLE_OMP_CRITICAL:
1467       ret = walk_tree (gimple_omp_critical_name_ptr (stmt), callback_op, wi,
1468                        pset);
1469       if (ret)
1470         return ret;
1471       break;
1472
1473     case GIMPLE_OMP_FOR:
1474       ret = walk_tree (gimple_omp_for_clauses_ptr (stmt), callback_op, wi,
1475                        pset);
1476       if (ret)
1477         return ret;
1478       for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
1479         {
1480           ret = walk_tree (gimple_omp_for_index_ptr (stmt, i), callback_op,
1481                            wi, pset);
1482           if (ret)
1483             return ret;
1484           ret = walk_tree (gimple_omp_for_initial_ptr (stmt, i), callback_op,
1485                            wi, pset);
1486           if (ret)
1487             return ret;
1488           ret = walk_tree (gimple_omp_for_final_ptr (stmt, i), callback_op,
1489                            wi, pset);
1490           if (ret)
1491             return ret;
1492           ret = walk_tree (gimple_omp_for_incr_ptr (stmt, i), callback_op,
1493                            wi, pset);
1494         }
1495       if (ret)
1496         return ret;
1497       break;
1498
1499     case GIMPLE_OMP_PARALLEL:
1500       ret = walk_tree (gimple_omp_parallel_clauses_ptr (stmt), callback_op,
1501                        wi, pset);
1502       if (ret)
1503         return ret;
1504       ret = walk_tree (gimple_omp_parallel_child_fn_ptr (stmt), callback_op,
1505                        wi, pset);
1506       if (ret)
1507         return ret;
1508       ret = walk_tree (gimple_omp_parallel_data_arg_ptr (stmt), callback_op,
1509                        wi, pset);
1510       if (ret)
1511         return ret;
1512       break;
1513
1514     case GIMPLE_OMP_TASK:
1515       ret = walk_tree (gimple_omp_task_clauses_ptr (stmt), callback_op,
1516                        wi, pset);
1517       if (ret)
1518         return ret;
1519       ret = walk_tree (gimple_omp_task_child_fn_ptr (stmt), callback_op,
1520                        wi, pset);
1521       if (ret)
1522         return ret;
1523       ret = walk_tree (gimple_omp_task_data_arg_ptr (stmt), callback_op,
1524                        wi, pset);
1525       if (ret)
1526         return ret;
1527       ret = walk_tree (gimple_omp_task_copy_fn_ptr (stmt), callback_op,
1528                        wi, pset);
1529       if (ret)
1530         return ret;
1531       ret = walk_tree (gimple_omp_task_arg_size_ptr (stmt), callback_op,
1532                        wi, pset);
1533       if (ret)
1534         return ret;
1535       ret = walk_tree (gimple_omp_task_arg_align_ptr (stmt), callback_op,
1536                        wi, pset);
1537       if (ret)
1538         return ret;
1539       break;
1540
1541     case GIMPLE_OMP_SECTIONS:
1542       ret = walk_tree (gimple_omp_sections_clauses_ptr (stmt), callback_op,
1543                        wi, pset);
1544       if (ret)
1545         return ret;
1546
1547       ret = walk_tree (gimple_omp_sections_control_ptr (stmt), callback_op,
1548                        wi, pset);
1549       if (ret)
1550         return ret;
1551
1552       break;
1553
1554     case GIMPLE_OMP_SINGLE:
1555       ret = walk_tree (gimple_omp_single_clauses_ptr (stmt), callback_op, wi,
1556                        pset);
1557       if (ret)
1558         return ret;
1559       break;
1560
1561     case GIMPLE_OMP_ATOMIC_LOAD:
1562       ret = walk_tree (gimple_omp_atomic_load_lhs_ptr (stmt), callback_op, wi,
1563                        pset);
1564       if (ret)
1565         return ret;
1566
1567       ret = walk_tree (gimple_omp_atomic_load_rhs_ptr (stmt), callback_op, wi,
1568                        pset);
1569       if (ret)
1570         return ret;
1571       break;
1572
1573     case GIMPLE_OMP_ATOMIC_STORE:
1574       ret = walk_tree (gimple_omp_atomic_store_val_ptr (stmt), callback_op,
1575                        wi, pset);
1576       if (ret)
1577         return ret;
1578       break;
1579
1580       /* Tuples that do not have operands.  */
1581     case GIMPLE_NOP:
1582     case GIMPLE_RESX:
1583     case GIMPLE_OMP_RETURN:
1584     case GIMPLE_PREDICT:
1585       break;
1586
1587     default:
1588       {
1589         enum gimple_statement_structure_enum gss;
1590         gss = gimple_statement_structure (stmt);
1591         if (gss == GSS_WITH_OPS || gss == GSS_WITH_MEM_OPS)
1592           for (i = 0; i < gimple_num_ops (stmt); i++)
1593             {
1594               ret = walk_tree (gimple_op_ptr (stmt, i), callback_op, wi, pset);
1595               if (ret)
1596                 return ret;
1597             }
1598       }
1599       break;
1600     }
1601
1602   return NULL_TREE;
1603 }
1604
1605
1606 /* Walk the current statement in GSI (optionally using traversal state
1607    stored in WI).  If WI is NULL, no state is kept during traversal.
1608    The callback CALLBACK_STMT is called.  If CALLBACK_STMT indicates
1609    that it has handled all the operands of the statement, its return
1610    value is returned.  Otherwise, the return value from CALLBACK_STMT
1611    is discarded and its operands are scanned.
1612
1613    If CALLBACK_STMT is NULL or it didn't handle the operands,
1614    CALLBACK_OP is called on each operand of the statement via
1615    walk_gimple_op.  If walk_gimple_op returns non-NULL for any
1616    operand, the remaining operands are not scanned.  In this case, the
1617    return value from CALLBACK_OP is returned.
1618
1619    In any other case, NULL_TREE is returned.  */
1620
1621 tree
1622 walk_gimple_stmt (gimple_stmt_iterator *gsi, walk_stmt_fn callback_stmt,
1623                   walk_tree_fn callback_op, struct walk_stmt_info *wi)
1624 {
1625   gimple ret;
1626   tree tree_ret;
1627   gimple stmt = gsi_stmt (*gsi);
1628
1629   if (wi)
1630     wi->gsi = *gsi;
1631
1632   if (wi && wi->want_locations && gimple_has_location (stmt))
1633     input_location = gimple_location (stmt);
1634
1635   ret = NULL;
1636
1637   /* Invoke the statement callback.  Return if the callback handled
1638      all of STMT operands by itself.  */
1639   if (callback_stmt)
1640     {
1641       bool handled_ops = false;
1642       tree_ret = callback_stmt (gsi, &handled_ops, wi);
1643       if (handled_ops)
1644         return tree_ret;
1645
1646       /* If CALLBACK_STMT did not handle operands, it should not have
1647          a value to return.  */
1648       gcc_assert (tree_ret == NULL);
1649
1650       /* Re-read stmt in case the callback changed it.  */
1651       stmt = gsi_stmt (*gsi);
1652     }
1653
1654   /* If CALLBACK_OP is defined, invoke it on every operand of STMT.  */
1655   if (callback_op)
1656     {
1657       tree_ret = walk_gimple_op (stmt, callback_op, wi);
1658       if (tree_ret)
1659         return tree_ret;
1660     }
1661
1662   /* If STMT can have statements inside (e.g. GIMPLE_BIND), walk them.  */
1663   switch (gimple_code (stmt))
1664     {
1665     case GIMPLE_BIND:
1666       ret = walk_gimple_seq (gimple_bind_body (stmt), callback_stmt,
1667                              callback_op, wi);
1668       if (ret)
1669         return wi->callback_result;
1670       break;
1671
1672     case GIMPLE_CATCH:
1673       ret = walk_gimple_seq (gimple_catch_handler (stmt), callback_stmt,
1674                              callback_op, wi);
1675       if (ret)
1676         return wi->callback_result;
1677       break;
1678
1679     case GIMPLE_EH_FILTER:
1680       ret = walk_gimple_seq (gimple_eh_filter_failure (stmt), callback_stmt,
1681                              callback_op, wi);
1682       if (ret)
1683         return wi->callback_result;
1684       break;
1685
1686     case GIMPLE_TRY:
1687       ret = walk_gimple_seq (gimple_try_eval (stmt), callback_stmt, callback_op,
1688                              wi);
1689       if (ret)
1690         return wi->callback_result;
1691
1692       ret = walk_gimple_seq (gimple_try_cleanup (stmt), callback_stmt,
1693                              callback_op, wi);
1694       if (ret)
1695         return wi->callback_result;
1696       break;
1697
1698     case GIMPLE_OMP_FOR:
1699       ret = walk_gimple_seq (gimple_omp_for_pre_body (stmt), callback_stmt,
1700                              callback_op, wi);
1701       if (ret)
1702         return wi->callback_result;
1703
1704       /* FALL THROUGH.  */
1705     case GIMPLE_OMP_CRITICAL:
1706     case GIMPLE_OMP_MASTER:
1707     case GIMPLE_OMP_ORDERED:
1708     case GIMPLE_OMP_SECTION:
1709     case GIMPLE_OMP_PARALLEL:
1710     case GIMPLE_OMP_TASK:
1711     case GIMPLE_OMP_SECTIONS:
1712     case GIMPLE_OMP_SINGLE:
1713       ret = walk_gimple_seq (gimple_omp_body (stmt), callback_stmt, callback_op,
1714                              wi);
1715       if (ret)
1716         return wi->callback_result;
1717       break;
1718
1719     case GIMPLE_WITH_CLEANUP_EXPR:
1720       ret = walk_gimple_seq (gimple_wce_cleanup (stmt), callback_stmt,
1721                              callback_op, wi);
1722       if (ret)
1723         return wi->callback_result;
1724       break;
1725
1726     default:
1727       gcc_assert (!gimple_has_substatements (stmt));
1728       break;
1729     }
1730
1731   return NULL;
1732 }
1733
1734
1735 /* Set sequence SEQ to be the GIMPLE body for function FN.  */
1736
1737 void
1738 gimple_set_body (tree fndecl, gimple_seq seq)
1739 {
1740   struct function *fn = DECL_STRUCT_FUNCTION (fndecl);
1741   if (fn == NULL)
1742     {
1743       /* If FNDECL still does not have a function structure associated
1744          with it, then it does not make sense for it to receive a
1745          GIMPLE body.  */
1746       gcc_assert (seq == NULL);
1747     }
1748   else
1749     fn->gimple_body = seq;
1750 }
1751
1752
1753 /* Return the body of GIMPLE statements for function FN.  After the
1754    CFG pass, the function body doesn't exist anymore because it has
1755    been split up into basic blocks.  In this case, it returns
1756    NULL.  */
1757
1758 gimple_seq
1759 gimple_body (tree fndecl)
1760 {
1761   struct function *fn = DECL_STRUCT_FUNCTION (fndecl);
1762   return fn ? fn->gimple_body : NULL;
1763 }
1764
1765 /* Return true when FNDECL has Gimple body either in unlowered
1766    or CFG form.  */
1767 bool
1768 gimple_has_body_p (tree fndecl)
1769 {
1770   struct function *fn = DECL_STRUCT_FUNCTION (fndecl);
1771   return (gimple_body (fndecl) || (fn && fn->cfg));
1772 }
1773
1774 /* Detect flags from a GIMPLE_CALL.  This is just like
1775    call_expr_flags, but for gimple tuples.  */
1776
1777 int
1778 gimple_call_flags (const_gimple stmt)
1779 {
1780   int flags;
1781   tree decl = gimple_call_fndecl (stmt);
1782   tree t;
1783
1784   if (decl)
1785     flags = flags_from_decl_or_type (decl);
1786   else
1787     {
1788       t = TREE_TYPE (gimple_call_fn (stmt));
1789       if (t && TREE_CODE (t) == POINTER_TYPE)
1790         flags = flags_from_decl_or_type (TREE_TYPE (t));
1791       else
1792         flags = 0;
1793     }
1794
1795   if (stmt->gsbase.subcode & GF_CALL_NOTHROW)
1796     flags |= ECF_NOTHROW;
1797
1798   return flags;
1799 }
1800
1801 /* Detects argument flags for argument number ARG on call STMT.  */
1802
1803 int
1804 gimple_call_arg_flags (const_gimple stmt, unsigned arg)
1805 {
1806   tree type = TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt)));
1807   tree attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
1808   if (!attr)
1809     return 0;
1810
1811   attr = TREE_VALUE (TREE_VALUE (attr));
1812   if (1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
1813     return 0;
1814
1815   switch (TREE_STRING_POINTER (attr)[1 + arg])
1816     {
1817     case 'x':
1818     case 'X':
1819       return EAF_UNUSED;
1820
1821     case 'R':
1822       return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
1823
1824     case 'r':
1825       return EAF_NOCLOBBER | EAF_NOESCAPE;
1826
1827     case 'W':
1828       return EAF_DIRECT | EAF_NOESCAPE;
1829
1830     case 'w':
1831       return EAF_NOESCAPE;
1832
1833     case '.':
1834     default:
1835       return 0;
1836     }
1837 }
1838
1839 /* Detects return flags for the call STMT.  */
1840
1841 int
1842 gimple_call_return_flags (const_gimple stmt)
1843 {
1844   tree type;
1845   tree attr = NULL_TREE;
1846
1847   if (gimple_call_flags (stmt) & ECF_MALLOC)
1848     return ERF_NOALIAS;
1849
1850   type = TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt)));
1851   attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
1852   if (!attr)
1853     return 0;
1854
1855   attr = TREE_VALUE (TREE_VALUE (attr));
1856   if (TREE_STRING_LENGTH (attr) < 1)
1857     return 0;
1858
1859   switch (TREE_STRING_POINTER (attr)[0])
1860     {
1861     case '1':
1862     case '2':
1863     case '3':
1864     case '4':
1865       return ERF_RETURNS_ARG | (TREE_STRING_POINTER (attr)[0] - '1');
1866
1867     case 'm':
1868       return ERF_NOALIAS;
1869
1870     case '.':
1871     default:
1872       return 0;
1873     }
1874 }
1875
1876 /* Return true if GS is a copy assignment.  */
1877
1878 bool
1879 gimple_assign_copy_p (gimple gs)
1880 {
1881   return gimple_code (gs) == GIMPLE_ASSIGN
1882          && get_gimple_rhs_class (gimple_assign_rhs_code (gs))
1883             == GIMPLE_SINGLE_RHS
1884          && is_gimple_val (gimple_op (gs, 1));
1885 }
1886
1887
1888 /* Return true if GS is a SSA_NAME copy assignment.  */
1889
1890 bool
1891 gimple_assign_ssa_name_copy_p (gimple gs)
1892 {
1893   return (gimple_code (gs) == GIMPLE_ASSIGN
1894           && (get_gimple_rhs_class (gimple_assign_rhs_code (gs))
1895               == GIMPLE_SINGLE_RHS)
1896           && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
1897           && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
1898 }
1899
1900
1901 /* Return true if GS is an assignment with a singleton RHS, i.e.,
1902    there is no operator associated with the assignment itself.
1903    Unlike gimple_assign_copy_p, this predicate returns true for
1904    any RHS operand, including those that perform an operation
1905    and do not have the semantics of a copy, such as COND_EXPR.  */
1906
1907 bool
1908 gimple_assign_single_p (gimple gs)
1909 {
1910   return (gimple_code (gs) == GIMPLE_ASSIGN
1911           && get_gimple_rhs_class (gimple_assign_rhs_code (gs))
1912              == GIMPLE_SINGLE_RHS);
1913 }
1914
1915 /* Return true if GS is an assignment with a unary RHS, but the
1916    operator has no effect on the assigned value.  The logic is adapted
1917    from STRIP_NOPS.  This predicate is intended to be used in tuplifying
1918    instances in which STRIP_NOPS was previously applied to the RHS of
1919    an assignment.
1920
1921    NOTE: In the use cases that led to the creation of this function
1922    and of gimple_assign_single_p, it is typical to test for either
1923    condition and to proceed in the same manner.  In each case, the
1924    assigned value is represented by the single RHS operand of the
1925    assignment.  I suspect there may be cases where gimple_assign_copy_p,
1926    gimple_assign_single_p, or equivalent logic is used where a similar
1927    treatment of unary NOPs is appropriate.  */
1928
1929 bool
1930 gimple_assign_unary_nop_p (gimple gs)
1931 {
1932   return (gimple_code (gs) == GIMPLE_ASSIGN
1933           && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
1934               || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
1935           && gimple_assign_rhs1 (gs) != error_mark_node
1936           && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
1937               == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
1938 }
1939
1940 /* Set BB to be the basic block holding G.  */
1941
1942 void
1943 gimple_set_bb (gimple stmt, basic_block bb)
1944 {
1945   stmt->gsbase.bb = bb;
1946
1947   /* If the statement is a label, add the label to block-to-labels map
1948      so that we can speed up edge creation for GIMPLE_GOTOs.  */
1949   if (cfun->cfg && gimple_code (stmt) == GIMPLE_LABEL)
1950     {
1951       tree t;
1952       int uid;
1953
1954       t = gimple_label_label (stmt);
1955       uid = LABEL_DECL_UID (t);
1956       if (uid == -1)
1957         {
1958           unsigned old_len = VEC_length (basic_block, label_to_block_map);
1959           LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
1960           if (old_len <= (unsigned) uid)
1961             {
1962               unsigned new_len = 3 * uid / 2 + 1;
1963
1964               VEC_safe_grow_cleared (basic_block, gc, label_to_block_map,
1965                                      new_len);
1966             }
1967         }
1968
1969       VEC_replace (basic_block, label_to_block_map, uid, bb);
1970     }
1971 }
1972
1973
1974 /* Modify the RHS of the assignment pointed-to by GSI using the
1975    operands in the expression tree EXPR.
1976
1977    NOTE: The statement pointed-to by GSI may be reallocated if it
1978    did not have enough operand slots.
1979
1980    This function is useful to convert an existing tree expression into
1981    the flat representation used for the RHS of a GIMPLE assignment.
1982    It will reallocate memory as needed to expand or shrink the number
1983    of operand slots needed to represent EXPR.
1984
1985    NOTE: If you find yourself building a tree and then calling this
1986    function, you are most certainly doing it the slow way.  It is much
1987    better to build a new assignment or to use the function
1988    gimple_assign_set_rhs_with_ops, which does not require an
1989    expression tree to be built.  */
1990
1991 void
1992 gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
1993 {
1994   enum tree_code subcode;
1995   tree op1, op2, op3;
1996
1997   extract_ops_from_tree_1 (expr, &subcode, &op1, &op2, &op3);
1998   gimple_assign_set_rhs_with_ops_1 (gsi, subcode, op1, op2, op3);
1999 }
2000
2001
2002 /* Set the RHS of assignment statement pointed-to by GSI to CODE with
2003    operands OP1, OP2 and OP3.
2004
2005    NOTE: The statement pointed-to by GSI may be reallocated if it
2006    did not have enough operand slots.  */
2007
2008 void
2009 gimple_assign_set_rhs_with_ops_1 (gimple_stmt_iterator *gsi, enum tree_code code,
2010                                   tree op1, tree op2, tree op3)
2011 {
2012   unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
2013   gimple stmt = gsi_stmt (*gsi);
2014
2015   /* If the new CODE needs more operands, allocate a new statement.  */
2016   if (gimple_num_ops (stmt) < new_rhs_ops + 1)
2017     {
2018       tree lhs = gimple_assign_lhs (stmt);
2019       gimple new_stmt = gimple_alloc (gimple_code (stmt), new_rhs_ops + 1);
2020       memcpy (new_stmt, stmt, gimple_size (gimple_code (stmt)));
2021       gsi_replace (gsi, new_stmt, true);
2022       stmt = new_stmt;
2023
2024       /* The LHS needs to be reset as this also changes the SSA name
2025          on the LHS.  */
2026       gimple_assign_set_lhs (stmt, lhs);
2027     }
2028
2029   gimple_set_num_ops (stmt, new_rhs_ops + 1);
2030   gimple_set_subcode (stmt, code);
2031   gimple_assign_set_rhs1 (stmt, op1);
2032   if (new_rhs_ops > 1)
2033     gimple_assign_set_rhs2 (stmt, op2);
2034   if (new_rhs_ops > 2)
2035     gimple_assign_set_rhs3 (stmt, op3);
2036 }
2037
2038
2039 /* Return the LHS of a statement that performs an assignment,
2040    either a GIMPLE_ASSIGN or a GIMPLE_CALL.  Returns NULL_TREE
2041    for a call to a function that returns no value, or for a
2042    statement other than an assignment or a call.  */
2043
2044 tree
2045 gimple_get_lhs (const_gimple stmt)
2046 {
2047   enum gimple_code code = gimple_code (stmt);
2048
2049   if (code == GIMPLE_ASSIGN)
2050     return gimple_assign_lhs (stmt);
2051   else if (code == GIMPLE_CALL)
2052     return gimple_call_lhs (stmt);
2053   else
2054     return NULL_TREE;
2055 }
2056
2057
2058 /* Set the LHS of a statement that performs an assignment,
2059    either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
2060
2061 void
2062 gimple_set_lhs (gimple stmt, tree lhs)
2063 {
2064   enum gimple_code code = gimple_code (stmt);
2065
2066   if (code == GIMPLE_ASSIGN)
2067     gimple_assign_set_lhs (stmt, lhs);
2068   else if (code == GIMPLE_CALL)
2069     gimple_call_set_lhs (stmt, lhs);
2070   else
2071     gcc_unreachable();
2072 }
2073
2074 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
2075    GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
2076    expression with a different value.
2077
2078    This will update any annotations (say debug bind stmts) referring
2079    to the original LHS, so that they use the RHS instead.  This is
2080    done even if NLHS and LHS are the same, for it is understood that
2081    the RHS will be modified afterwards, and NLHS will not be assigned
2082    an equivalent value.
2083
2084    Adjusting any non-annotation uses of the LHS, if needed, is a
2085    responsibility of the caller.
2086
2087    The effect of this call should be pretty much the same as that of
2088    inserting a copy of STMT before STMT, and then removing the
2089    original stmt, at which time gsi_remove() would have update
2090    annotations, but using this function saves all the inserting,
2091    copying and removing.  */
2092
2093 void
2094 gimple_replace_lhs (gimple stmt, tree nlhs)
2095 {
2096   if (MAY_HAVE_DEBUG_STMTS)
2097     {
2098       tree lhs = gimple_get_lhs (stmt);
2099
2100       gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
2101
2102       insert_debug_temp_for_var_def (NULL, lhs);
2103     }
2104
2105   gimple_set_lhs (stmt, nlhs);
2106 }
2107
2108 /* Return a deep copy of statement STMT.  All the operands from STMT
2109    are reallocated and copied using unshare_expr.  The DEF, USE, VDEF
2110    and VUSE operand arrays are set to empty in the new copy.  */
2111
2112 gimple
2113 gimple_copy (gimple stmt)
2114 {
2115   enum gimple_code code = gimple_code (stmt);
2116   unsigned num_ops = gimple_num_ops (stmt);
2117   gimple copy = gimple_alloc (code, num_ops);
2118   unsigned i;
2119
2120   /* Shallow copy all the fields from STMT.  */
2121   memcpy (copy, stmt, gimple_size (code));
2122
2123   /* If STMT has sub-statements, deep-copy them as well.  */
2124   if (gimple_has_substatements (stmt))
2125     {
2126       gimple_seq new_seq;
2127       tree t;
2128
2129       switch (gimple_code (stmt))
2130         {
2131         case GIMPLE_BIND:
2132           new_seq = gimple_seq_copy (gimple_bind_body (stmt));
2133           gimple_bind_set_body (copy, new_seq);
2134           gimple_bind_set_vars (copy, unshare_expr (gimple_bind_vars (stmt)));
2135           gimple_bind_set_block (copy, gimple_bind_block (stmt));
2136           break;
2137
2138         case GIMPLE_CATCH:
2139           new_seq = gimple_seq_copy (gimple_catch_handler (stmt));
2140           gimple_catch_set_handler (copy, new_seq);
2141           t = unshare_expr (gimple_catch_types (stmt));
2142           gimple_catch_set_types (copy, t);
2143           break;
2144
2145         case GIMPLE_EH_FILTER:
2146           new_seq = gimple_seq_copy (gimple_eh_filter_failure (stmt));
2147           gimple_eh_filter_set_failure (copy, new_seq);
2148           t = unshare_expr (gimple_eh_filter_types (stmt));
2149           gimple_eh_filter_set_types (copy, t);
2150           break;
2151
2152         case GIMPLE_TRY:
2153           new_seq = gimple_seq_copy (gimple_try_eval (stmt));
2154           gimple_try_set_eval (copy, new_seq);
2155           new_seq = gimple_seq_copy (gimple_try_cleanup (stmt));
2156           gimple_try_set_cleanup (copy, new_seq);
2157           break;
2158
2159         case GIMPLE_OMP_FOR:
2160           new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
2161           gimple_omp_for_set_pre_body (copy, new_seq);
2162           t = unshare_expr (gimple_omp_for_clauses (stmt));
2163           gimple_omp_for_set_clauses (copy, t);
2164           copy->gimple_omp_for.iter
2165             = ggc_alloc_vec_gimple_omp_for_iter
2166             (gimple_omp_for_collapse (stmt));
2167           for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
2168             {
2169               gimple_omp_for_set_cond (copy, i,
2170                                        gimple_omp_for_cond (stmt, i));
2171               gimple_omp_for_set_index (copy, i,
2172                                         gimple_omp_for_index (stmt, i));
2173               t = unshare_expr (gimple_omp_for_initial (stmt, i));
2174               gimple_omp_for_set_initial (copy, i, t);
2175               t = unshare_expr (gimple_omp_for_final (stmt, i));
2176               gimple_omp_for_set_final (copy, i, t);
2177               t = unshare_expr (gimple_omp_for_incr (stmt, i));
2178               gimple_omp_for_set_incr (copy, i, t);
2179             }
2180           goto copy_omp_body;
2181
2182         case GIMPLE_OMP_PARALLEL:
2183           t = unshare_expr (gimple_omp_parallel_clauses (stmt));
2184           gimple_omp_parallel_set_clauses (copy, t);
2185           t = unshare_expr (gimple_omp_parallel_child_fn (stmt));
2186           gimple_omp_parallel_set_child_fn (copy, t);
2187           t = unshare_expr (gimple_omp_parallel_data_arg (stmt));
2188           gimple_omp_parallel_set_data_arg (copy, t);
2189           goto copy_omp_body;
2190
2191         case GIMPLE_OMP_TASK:
2192           t = unshare_expr (gimple_omp_task_clauses (stmt));
2193           gimple_omp_task_set_clauses (copy, t);
2194           t = unshare_expr (gimple_omp_task_child_fn (stmt));
2195           gimple_omp_task_set_child_fn (copy, t);
2196           t = unshare_expr (gimple_omp_task_data_arg (stmt));
2197           gimple_omp_task_set_data_arg (copy, t);
2198           t = unshare_expr (gimple_omp_task_copy_fn (stmt));
2199           gimple_omp_task_set_copy_fn (copy, t);
2200           t = unshare_expr (gimple_omp_task_arg_size (stmt));
2201           gimple_omp_task_set_arg_size (copy, t);
2202           t = unshare_expr (gimple_omp_task_arg_align (stmt));
2203           gimple_omp_task_set_arg_align (copy, t);
2204           goto copy_omp_body;
2205
2206         case GIMPLE_OMP_CRITICAL:
2207           t = unshare_expr (gimple_omp_critical_name (stmt));
2208           gimple_omp_critical_set_name (copy, t);
2209           goto copy_omp_body;
2210
2211         case GIMPLE_OMP_SECTIONS:
2212           t = unshare_expr (gimple_omp_sections_clauses (stmt));
2213           gimple_omp_sections_set_clauses (copy, t);
2214           t = unshare_expr (gimple_omp_sections_control (stmt));
2215           gimple_omp_sections_set_control (copy, t);
2216           /* FALLTHRU  */
2217
2218         case GIMPLE_OMP_SINGLE:
2219         case GIMPLE_OMP_SECTION:
2220         case GIMPLE_OMP_MASTER:
2221         case GIMPLE_OMP_ORDERED:
2222         copy_omp_body:
2223           new_seq = gimple_seq_copy (gimple_omp_body (stmt));
2224           gimple_omp_set_body (copy, new_seq);
2225           break;
2226
2227         case GIMPLE_WITH_CLEANUP_EXPR:
2228           new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
2229           gimple_wce_set_cleanup (copy, new_seq);
2230           break;
2231
2232         default:
2233           gcc_unreachable ();
2234         }
2235     }
2236
2237   /* Make copy of operands.  */
2238   if (num_ops > 0)
2239     {
2240       for (i = 0; i < num_ops; i++)
2241         gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
2242
2243       /* Clear out SSA operand vectors on COPY.  */
2244       if (gimple_has_ops (stmt))
2245         {
2246           gimple_set_def_ops (copy, NULL);
2247           gimple_set_use_ops (copy, NULL);
2248         }
2249
2250       if (gimple_has_mem_ops (stmt))
2251         {
2252           gimple_set_vdef (copy, gimple_vdef (stmt));
2253           gimple_set_vuse (copy, gimple_vuse (stmt));
2254         }
2255
2256       /* SSA operands need to be updated.  */
2257       gimple_set_modified (copy, true);
2258     }
2259
2260   return copy;
2261 }
2262
2263
2264 /* Set the MODIFIED flag to MODIFIEDP, iff the gimple statement G has
2265    a MODIFIED field.  */
2266
2267 void
2268 gimple_set_modified (gimple s, bool modifiedp)
2269 {
2270   if (gimple_has_ops (s))
2271     {
2272       s->gsbase.modified = (unsigned) modifiedp;
2273
2274       if (modifiedp
2275           && cfun->gimple_df
2276           && is_gimple_call (s)
2277           && gimple_call_noreturn_p (s))
2278         VEC_safe_push (gimple, gc, MODIFIED_NORETURN_CALLS (cfun), s);
2279     }
2280 }
2281
2282
2283 /* Return true if statement S has side-effects.  We consider a
2284    statement to have side effects if:
2285
2286    - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
2287    - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS.  */
2288
2289 bool
2290 gimple_has_side_effects (const_gimple s)
2291 {
2292   unsigned i;
2293
2294   if (is_gimple_debug (s))
2295     return false;
2296
2297   /* We don't have to scan the arguments to check for
2298      volatile arguments, though, at present, we still
2299      do a scan to check for TREE_SIDE_EFFECTS.  */
2300   if (gimple_has_volatile_ops (s))
2301     return true;
2302
2303   if (is_gimple_call (s))
2304     {
2305       unsigned nargs = gimple_call_num_args (s);
2306
2307       if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE)))
2308         return true;
2309       else if (gimple_call_flags (s) & ECF_LOOPING_CONST_OR_PURE)
2310         /* An infinite loop is considered a side effect.  */
2311         return true;
2312
2313       if (gimple_call_lhs (s)
2314           && TREE_SIDE_EFFECTS (gimple_call_lhs (s)))
2315         {
2316           gcc_assert (gimple_has_volatile_ops (s));
2317           return true;
2318         }
2319
2320       if (TREE_SIDE_EFFECTS (gimple_call_fn (s)))
2321         return true;
2322
2323       for (i = 0; i < nargs; i++)
2324         if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i)))
2325           {
2326             gcc_assert (gimple_has_volatile_ops (s));
2327             return true;
2328           }
2329
2330       return false;
2331     }
2332   else
2333     {
2334       for (i = 0; i < gimple_num_ops (s); i++)
2335         if (TREE_SIDE_EFFECTS (gimple_op (s, i)))
2336           {
2337             gcc_assert (gimple_has_volatile_ops (s));
2338             return true;
2339           }
2340     }
2341
2342   return false;
2343 }
2344
2345 /* Return true if the RHS of statement S has side effects.
2346    We may use it to determine if it is admissable to replace
2347    an assignment or call with a copy of a previously-computed
2348    value.  In such cases, side-effects due the the LHS are
2349    preserved.  */
2350
2351 bool
2352 gimple_rhs_has_side_effects (const_gimple s)
2353 {
2354   unsigned i;
2355
2356   if (is_gimple_call (s))
2357     {
2358       unsigned nargs = gimple_call_num_args (s);
2359
2360       if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE)))
2361         return true;
2362
2363       /* We cannot use gimple_has_volatile_ops here,
2364          because we must ignore a volatile LHS.  */
2365       if (TREE_SIDE_EFFECTS (gimple_call_fn (s))
2366           || TREE_THIS_VOLATILE (gimple_call_fn (s)))
2367         {
2368           gcc_assert (gimple_has_volatile_ops (s));
2369           return true;
2370         }
2371
2372       for (i = 0; i < nargs; i++)
2373         if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i))
2374             || TREE_THIS_VOLATILE (gimple_call_arg (s, i)))
2375           return true;
2376
2377       return false;
2378     }
2379   else if (is_gimple_assign (s))
2380     {
2381       /* Skip the first operand, the LHS. */
2382       for (i = 1; i < gimple_num_ops (s); i++)
2383         if (TREE_SIDE_EFFECTS (gimple_op (s, i))
2384             || TREE_THIS_VOLATILE (gimple_op (s, i)))
2385           {
2386             gcc_assert (gimple_has_volatile_ops (s));
2387             return true;
2388           }
2389     }
2390   else if (is_gimple_debug (s))
2391     return false;
2392   else
2393     {
2394       /* For statements without an LHS, examine all arguments.  */
2395       for (i = 0; i < gimple_num_ops (s); i++)
2396         if (TREE_SIDE_EFFECTS (gimple_op (s, i))
2397             || TREE_THIS_VOLATILE (gimple_op (s, i)))
2398           {
2399             gcc_assert (gimple_has_volatile_ops (s));
2400             return true;
2401           }
2402     }
2403
2404   return false;
2405 }
2406
2407 /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
2408    Return true if S can trap.  When INCLUDE_MEM is true, check whether
2409    the memory operations could trap.  When INCLUDE_STORES is true and
2410    S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked.  */
2411
2412 bool
2413 gimple_could_trap_p_1 (gimple s, bool include_mem, bool include_stores)
2414 {
2415   tree t, div = NULL_TREE;
2416   enum tree_code op;
2417
2418   if (include_mem)
2419     {
2420       unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
2421
2422       for (i = start; i < gimple_num_ops (s); i++)
2423         if (tree_could_trap_p (gimple_op (s, i)))
2424           return true;
2425     }
2426
2427   switch (gimple_code (s))
2428     {
2429     case GIMPLE_ASM:
2430       return gimple_asm_volatile_p (s);
2431
2432     case GIMPLE_CALL:
2433       t = gimple_call_fndecl (s);
2434       /* Assume that calls to weak functions may trap.  */
2435       if (!t || !DECL_P (t) || DECL_WEAK (t))
2436         return true;
2437       return false;
2438
2439     case GIMPLE_ASSIGN:
2440       t = gimple_expr_type (s);
2441       op = gimple_assign_rhs_code (s);
2442       if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
2443         div = gimple_assign_rhs2 (s);
2444       return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
2445                                       (INTEGRAL_TYPE_P (t)
2446                                        && TYPE_OVERFLOW_TRAPS (t)),
2447                                       div));
2448
2449     default:
2450       break;
2451     }
2452
2453   return false;
2454 }
2455
2456 /* Return true if statement S can trap.  */
2457
2458 bool
2459 gimple_could_trap_p (gimple s)
2460 {
2461   return gimple_could_trap_p_1 (s, true, true);
2462 }
2463
2464 /* Return true if RHS of a GIMPLE_ASSIGN S can trap.  */
2465
2466 bool
2467 gimple_assign_rhs_could_trap_p (gimple s)
2468 {
2469   gcc_assert (is_gimple_assign (s));
2470   return gimple_could_trap_p_1 (s, true, false);
2471 }
2472
2473
2474 /* Print debugging information for gimple stmts generated.  */
2475
2476 void
2477 dump_gimple_statistics (void)
2478 {
2479 #ifdef GATHER_STATISTICS
2480   int i, total_tuples = 0, total_bytes = 0;
2481
2482   fprintf (stderr, "\nGIMPLE statements\n");
2483   fprintf (stderr, "Kind                   Stmts      Bytes\n");
2484   fprintf (stderr, "---------------------------------------\n");
2485   for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
2486     {
2487       fprintf (stderr, "%-20s %7d %10d\n", gimple_alloc_kind_names[i],
2488           gimple_alloc_counts[i], gimple_alloc_sizes[i]);
2489       total_tuples += gimple_alloc_counts[i];
2490       total_bytes += gimple_alloc_sizes[i];
2491     }
2492   fprintf (stderr, "---------------------------------------\n");
2493   fprintf (stderr, "%-20s %7d %10d\n", "Total", total_tuples, total_bytes);
2494   fprintf (stderr, "---------------------------------------\n");
2495 #else
2496   fprintf (stderr, "No gimple statistics\n");
2497 #endif
2498 }
2499
2500
2501 /* Return the number of operands needed on the RHS of a GIMPLE
2502    assignment for an expression with tree code CODE.  */
2503
2504 unsigned
2505 get_gimple_rhs_num_ops (enum tree_code code)
2506 {
2507   enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code);
2508
2509   if (rhs_class == GIMPLE_UNARY_RHS || rhs_class == GIMPLE_SINGLE_RHS)
2510     return 1;
2511   else if (rhs_class == GIMPLE_BINARY_RHS)
2512     return 2;
2513   else if (rhs_class == GIMPLE_TERNARY_RHS)
2514     return 3;
2515   else
2516     gcc_unreachable ();
2517 }
2518
2519 #define DEFTREECODE(SYM, STRING, TYPE, NARGS)                               \
2520   (unsigned char)                                                           \
2521   ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS                                   \
2522    : ((TYPE) == tcc_binary                                                  \
2523       || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS                      \
2524    : ((TYPE) == tcc_constant                                                \
2525       || (TYPE) == tcc_declaration                                          \
2526       || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS                       \
2527    : ((SYM) == TRUTH_AND_EXPR                                               \
2528       || (SYM) == TRUTH_OR_EXPR                                             \
2529       || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS                       \
2530    : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS                             \
2531    : ((SYM) == WIDEN_MULT_PLUS_EXPR                                         \
2532       || (SYM) == WIDEN_MULT_MINUS_EXPR                                     \
2533       || (SYM) == FMA_EXPR) ? GIMPLE_TERNARY_RHS                            \
2534    : ((SYM) == COND_EXPR                                                    \
2535       || (SYM) == CONSTRUCTOR                                               \
2536       || (SYM) == OBJ_TYPE_REF                                              \
2537       || (SYM) == ASSERT_EXPR                                               \
2538       || (SYM) == ADDR_EXPR                                                 \
2539       || (SYM) == WITH_SIZE_EXPR                                            \
2540       || (SYM) == SSA_NAME                                                  \
2541       || (SYM) == POLYNOMIAL_CHREC                                          \
2542       || (SYM) == DOT_PROD_EXPR                                             \
2543       || (SYM) == VEC_COND_EXPR                                             \
2544       || (SYM) == REALIGN_LOAD_EXPR) ? GIMPLE_SINGLE_RHS                    \
2545    : GIMPLE_INVALID_RHS),
2546 #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
2547
2548 const unsigned char gimple_rhs_class_table[] = {
2549 #include "all-tree.def"
2550 };
2551
2552 #undef DEFTREECODE
2553 #undef END_OF_BASE_TREE_CODES
2554
2555 /* For the definitive definition of GIMPLE, see doc/tree-ssa.texi.  */
2556
2557 /* Validation of GIMPLE expressions.  */
2558
2559 /* Returns true iff T is a valid RHS for an assignment to a renamed
2560    user -- or front-end generated artificial -- variable.  */
2561
2562 bool
2563 is_gimple_reg_rhs (tree t)
2564 {
2565   return get_gimple_rhs_class (TREE_CODE (t)) != GIMPLE_INVALID_RHS;
2566 }
2567
2568 /* Returns true iff T is a valid RHS for an assignment to an un-renamed
2569    LHS, or for a call argument.  */
2570
2571 bool
2572 is_gimple_mem_rhs (tree t)
2573 {
2574   /* If we're dealing with a renamable type, either source or dest must be
2575      a renamed variable.  */
2576   if (is_gimple_reg_type (TREE_TYPE (t)))
2577     return is_gimple_val (t);
2578   else
2579     return is_gimple_val (t) || is_gimple_lvalue (t);
2580 }
2581
2582 /*  Return true if T is a valid LHS for a GIMPLE assignment expression.  */
2583
2584 bool
2585 is_gimple_lvalue (tree t)
2586 {
2587   return (is_gimple_addressable (t)
2588           || TREE_CODE (t) == WITH_SIZE_EXPR
2589           /* These are complex lvalues, but don't have addresses, so they
2590              go here.  */
2591           || TREE_CODE (t) == BIT_FIELD_REF);
2592 }
2593
2594 /*  Return true if T is a GIMPLE condition.  */
2595
2596 bool
2597 is_gimple_condexpr (tree t)
2598 {
2599   return (is_gimple_val (t) || (COMPARISON_CLASS_P (t)
2600                                 && !tree_could_trap_p (t)
2601                                 && is_gimple_val (TREE_OPERAND (t, 0))
2602                                 && is_gimple_val (TREE_OPERAND (t, 1))));
2603 }
2604
2605 /*  Return true if T is something whose address can be taken.  */
2606
2607 bool
2608 is_gimple_addressable (tree t)
2609 {
2610   return (is_gimple_id (t) || handled_component_p (t)
2611           || TREE_CODE (t) == MEM_REF);
2612 }
2613
2614 /* Return true if T is a valid gimple constant.  */
2615
2616 bool
2617 is_gimple_constant (const_tree t)
2618 {
2619   switch (TREE_CODE (t))
2620     {
2621     case INTEGER_CST:
2622     case REAL_CST:
2623     case FIXED_CST:
2624     case STRING_CST:
2625     case COMPLEX_CST:
2626     case VECTOR_CST:
2627       return true;
2628
2629     /* Vector constant constructors are gimple invariant.  */
2630     case CONSTRUCTOR:
2631       if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2632         return TREE_CONSTANT (t);
2633       else
2634         return false;
2635
2636     default:
2637       return false;
2638     }
2639 }
2640
2641 /* Return true if T is a gimple address.  */
2642
2643 bool
2644 is_gimple_address (const_tree t)
2645 {
2646   tree op;
2647
2648   if (TREE_CODE (t) != ADDR_EXPR)
2649     return false;
2650
2651   op = TREE_OPERAND (t, 0);
2652   while (handled_component_p (op))
2653     {
2654       if ((TREE_CODE (op) == ARRAY_REF
2655            || TREE_CODE (op) == ARRAY_RANGE_REF)
2656           && !is_gimple_val (TREE_OPERAND (op, 1)))
2657             return false;
2658
2659       op = TREE_OPERAND (op, 0);
2660     }
2661
2662   if (CONSTANT_CLASS_P (op) || TREE_CODE (op) == MEM_REF)
2663     return true;
2664
2665   switch (TREE_CODE (op))
2666     {
2667     case PARM_DECL:
2668     case RESULT_DECL:
2669     case LABEL_DECL:
2670     case FUNCTION_DECL:
2671     case VAR_DECL:
2672     case CONST_DECL:
2673       return true;
2674
2675     default:
2676       return false;
2677     }
2678 }
2679
2680 /* Strip out all handled components that produce invariant
2681    offsets.  */
2682
2683 static const_tree
2684 strip_invariant_refs (const_tree op)
2685 {
2686   while (handled_component_p (op))
2687     {
2688       switch (TREE_CODE (op))
2689         {
2690         case ARRAY_REF:
2691         case ARRAY_RANGE_REF:
2692           if (!is_gimple_constant (TREE_OPERAND (op, 1))
2693               || TREE_OPERAND (op, 2) != NULL_TREE
2694               || TREE_OPERAND (op, 3) != NULL_TREE)
2695             return NULL;
2696           break;
2697
2698         case COMPONENT_REF:
2699           if (TREE_OPERAND (op, 2) != NULL_TREE)
2700             return NULL;
2701           break;
2702
2703         default:;
2704         }
2705       op = TREE_OPERAND (op, 0);
2706     }
2707
2708   return op;
2709 }
2710
2711 /* Return true if T is a gimple invariant address.  */
2712
2713 bool
2714 is_gimple_invariant_address (const_tree t)
2715 {
2716   const_tree op;
2717
2718   if (TREE_CODE (t) != ADDR_EXPR)
2719     return false;
2720
2721   op = strip_invariant_refs (TREE_OPERAND (t, 0));
2722   if (!op)
2723     return false;
2724
2725   if (TREE_CODE (op) == MEM_REF)
2726     {
2727       const_tree op0 = TREE_OPERAND (op, 0);
2728       return (TREE_CODE (op0) == ADDR_EXPR
2729               && (CONSTANT_CLASS_P (TREE_OPERAND (op0, 0))
2730                   || decl_address_invariant_p (TREE_OPERAND (op0, 0))));
2731     }
2732
2733   return CONSTANT_CLASS_P (op) || decl_address_invariant_p (op);
2734 }
2735
2736 /* Return true if T is a gimple invariant address at IPA level
2737    (so addresses of variables on stack are not allowed).  */
2738
2739 bool
2740 is_gimple_ip_invariant_address (const_tree t)
2741 {
2742   const_tree op;
2743
2744   if (TREE_CODE (t) != ADDR_EXPR)
2745     return false;
2746
2747   op = strip_invariant_refs (TREE_OPERAND (t, 0));
2748
2749   return op && (CONSTANT_CLASS_P (op) || decl_address_ip_invariant_p (op));
2750 }
2751
2752 /* Return true if T is a GIMPLE minimal invariant.  It's a restricted
2753    form of function invariant.  */
2754
2755 bool
2756 is_gimple_min_invariant (const_tree t)
2757 {
2758   if (TREE_CODE (t) == ADDR_EXPR)
2759     return is_gimple_invariant_address (t);
2760
2761   return is_gimple_constant (t);
2762 }
2763
2764 /* Return true if T is a GIMPLE interprocedural invariant.  It's a restricted
2765    form of gimple minimal invariant.  */
2766
2767 bool
2768 is_gimple_ip_invariant (const_tree t)
2769 {
2770   if (TREE_CODE (t) == ADDR_EXPR)
2771     return is_gimple_ip_invariant_address (t);
2772
2773   return is_gimple_constant (t);
2774 }
2775
2776 /* Return true if T looks like a valid GIMPLE statement.  */
2777
2778 bool
2779 is_gimple_stmt (tree t)
2780 {
2781   const enum tree_code code = TREE_CODE (t);
2782
2783   switch (code)
2784     {
2785     case NOP_EXPR:
2786       /* The only valid NOP_EXPR is the empty statement.  */
2787       return IS_EMPTY_STMT (t);
2788
2789     case BIND_EXPR:
2790     case COND_EXPR:
2791       /* These are only valid if they're void.  */
2792       return TREE_TYPE (t) == NULL || VOID_TYPE_P (TREE_TYPE (t));
2793
2794     case SWITCH_EXPR:
2795     case GOTO_EXPR:
2796     case RETURN_EXPR:
2797     case LABEL_EXPR:
2798     case CASE_LABEL_EXPR:
2799     case TRY_CATCH_EXPR:
2800     case TRY_FINALLY_EXPR:
2801     case EH_FILTER_EXPR:
2802     case CATCH_EXPR:
2803     case ASM_EXPR:
2804     case STATEMENT_LIST:
2805     case OMP_PARALLEL:
2806     case OMP_FOR:
2807     case OMP_SECTIONS:
2808     case OMP_SECTION:
2809     case OMP_SINGLE:
2810     case OMP_MASTER:
2811     case OMP_ORDERED:
2812     case OMP_CRITICAL:
2813     case OMP_TASK:
2814       /* These are always void.  */
2815       return true;
2816
2817     case CALL_EXPR:
2818     case MODIFY_EXPR:
2819     case PREDICT_EXPR:
2820       /* These are valid regardless of their type.  */
2821       return true;
2822
2823     default:
2824       return false;
2825     }
2826 }
2827
2828 /* Return true if T is a variable.  */
2829
2830 bool
2831 is_gimple_variable (tree t)
2832 {
2833   return (TREE_CODE (t) == VAR_DECL
2834           || TREE_CODE (t) == PARM_DECL
2835           || TREE_CODE (t) == RESULT_DECL
2836           || TREE_CODE (t) == SSA_NAME);
2837 }
2838
2839 /*  Return true if T is a GIMPLE identifier (something with an address).  */
2840
2841 bool
2842 is_gimple_id (tree t)
2843 {
2844   return (is_gimple_variable (t)
2845           || TREE_CODE (t) == FUNCTION_DECL
2846           || TREE_CODE (t) == LABEL_DECL
2847           || TREE_CODE (t) == CONST_DECL
2848           /* Allow string constants, since they are addressable.  */
2849           || TREE_CODE (t) == STRING_CST);
2850 }
2851
2852 /* Return true if TYPE is a suitable type for a scalar register variable.  */
2853
2854 bool
2855 is_gimple_reg_type (tree type)
2856 {
2857   return !AGGREGATE_TYPE_P (type);
2858 }
2859
2860 /* Return true if T is a non-aggregate register variable.  */
2861
2862 bool
2863 is_gimple_reg (tree t)
2864 {
2865   if (TREE_CODE (t) == SSA_NAME)
2866     t = SSA_NAME_VAR (t);
2867
2868   if (!is_gimple_variable (t))
2869     return false;
2870
2871   if (!is_gimple_reg_type (TREE_TYPE (t)))
2872     return false;
2873
2874   /* A volatile decl is not acceptable because we can't reuse it as
2875      needed.  We need to copy it into a temp first.  */
2876   if (TREE_THIS_VOLATILE (t))
2877     return false;
2878
2879   /* We define "registers" as things that can be renamed as needed,
2880      which with our infrastructure does not apply to memory.  */
2881   if (needs_to_live_in_memory (t))
2882     return false;
2883
2884   /* Hard register variables are an interesting case.  For those that
2885      are call-clobbered, we don't know where all the calls are, since
2886      we don't (want to) take into account which operations will turn
2887      into libcalls at the rtl level.  For those that are call-saved,
2888      we don't currently model the fact that calls may in fact change
2889      global hard registers, nor do we examine ASM_CLOBBERS at the tree
2890      level, and so miss variable changes that might imply.  All around,
2891      it seems safest to not do too much optimization with these at the
2892      tree level at all.  We'll have to rely on the rtl optimizers to
2893      clean this up, as there we've got all the appropriate bits exposed.  */
2894   if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2895     return false;
2896
2897   /* Complex and vector values must have been put into SSA-like form.
2898      That is, no assignments to the individual components.  */
2899   if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
2900       || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2901     return DECL_GIMPLE_REG_P (t);
2902
2903   return true;
2904 }
2905
2906
2907 /* Return true if T is a GIMPLE variable whose address is not needed.  */
2908
2909 bool
2910 is_gimple_non_addressable (tree t)
2911 {
2912   if (TREE_CODE (t) == SSA_NAME)
2913     t = SSA_NAME_VAR (t);
2914
2915   return (is_gimple_variable (t) && ! needs_to_live_in_memory (t));
2916 }
2917
2918 /* Return true if T is a GIMPLE rvalue, i.e. an identifier or a constant.  */
2919
2920 bool
2921 is_gimple_val (tree t)
2922 {
2923   /* Make loads from volatiles and memory vars explicit.  */
2924   if (is_gimple_variable (t)
2925       && is_gimple_reg_type (TREE_TYPE (t))
2926       && !is_gimple_reg (t))
2927     return false;
2928
2929   return (is_gimple_variable (t) || is_gimple_min_invariant (t));
2930 }
2931
2932 /* Similarly, but accept hard registers as inputs to asm statements.  */
2933
2934 bool
2935 is_gimple_asm_val (tree t)
2936 {
2937   if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2938     return true;
2939
2940   return is_gimple_val (t);
2941 }
2942
2943 /* Return true if T is a GIMPLE minimal lvalue.  */
2944
2945 bool
2946 is_gimple_min_lval (tree t)
2947 {
2948   if (!(t = CONST_CAST_TREE (strip_invariant_refs (t))))
2949     return false;
2950   return (is_gimple_id (t) || TREE_CODE (t) == MEM_REF);
2951 }
2952
2953 /* Return true if T is a typecast operation.  */
2954
2955 bool
2956 is_gimple_cast (tree t)
2957 {
2958   return (CONVERT_EXPR_P (t)
2959           || TREE_CODE (t) == FIX_TRUNC_EXPR);
2960 }
2961
2962 /* Return true if T is a valid function operand of a CALL_EXPR.  */
2963
2964 bool
2965 is_gimple_call_addr (tree t)
2966 {
2967   return (TREE_CODE (t) == OBJ_TYPE_REF || is_gimple_val (t));
2968 }
2969
2970 /* Return true if T is a valid address operand of a MEM_REF.  */
2971
2972 bool
2973 is_gimple_mem_ref_addr (tree t)
2974 {
2975   return (is_gimple_reg (t)
2976           || TREE_CODE (t) == INTEGER_CST
2977           || (TREE_CODE (t) == ADDR_EXPR
2978               && (CONSTANT_CLASS_P (TREE_OPERAND (t, 0))
2979                   || decl_address_invariant_p (TREE_OPERAND (t, 0)))));
2980 }
2981
2982 /* If T makes a function call, return the corresponding CALL_EXPR operand.
2983    Otherwise, return NULL_TREE.  */
2984
2985 tree
2986 get_call_expr_in (tree t)
2987 {
2988   if (TREE_CODE (t) == MODIFY_EXPR)
2989     t = TREE_OPERAND (t, 1);
2990   if (TREE_CODE (t) == WITH_SIZE_EXPR)
2991     t = TREE_OPERAND (t, 0);
2992   if (TREE_CODE (t) == CALL_EXPR)
2993     return t;
2994   return NULL_TREE;
2995 }
2996
2997
2998 /* Given a memory reference expression T, return its base address.
2999    The base address of a memory reference expression is the main
3000    object being referenced.  For instance, the base address for
3001    'array[i].fld[j]' is 'array'.  You can think of this as stripping
3002    away the offset part from a memory address.
3003
3004    This function calls handled_component_p to strip away all the inner
3005    parts of the memory reference until it reaches the base object.  */
3006
3007 tree
3008 get_base_address (tree t)
3009 {
3010   while (handled_component_p (t))
3011     t = TREE_OPERAND (t, 0);
3012
3013   if ((TREE_CODE (t) == MEM_REF
3014        || TREE_CODE (t) == TARGET_MEM_REF)
3015       && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
3016     t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
3017
3018   if (TREE_CODE (t) == SSA_NAME
3019       || DECL_P (t)
3020       || TREE_CODE (t) == STRING_CST
3021       || TREE_CODE (t) == CONSTRUCTOR
3022       || INDIRECT_REF_P (t)
3023       || TREE_CODE (t) == MEM_REF
3024       || TREE_CODE (t) == TARGET_MEM_REF)
3025     return t;
3026   else
3027     return NULL_TREE;
3028 }
3029
3030 void
3031 recalculate_side_effects (tree t)
3032 {
3033   enum tree_code code = TREE_CODE (t);
3034   int len = TREE_OPERAND_LENGTH (t);
3035   int i;
3036
3037   switch (TREE_CODE_CLASS (code))
3038     {
3039     case tcc_expression:
3040       switch (code)
3041         {
3042         case INIT_EXPR:
3043         case MODIFY_EXPR:
3044         case VA_ARG_EXPR:
3045         case PREDECREMENT_EXPR:
3046         case PREINCREMENT_EXPR:
3047         case POSTDECREMENT_EXPR:
3048         case POSTINCREMENT_EXPR:
3049           /* All of these have side-effects, no matter what their
3050              operands are.  */
3051           return;
3052
3053         default:
3054           break;
3055         }
3056       /* Fall through.  */
3057
3058     case tcc_comparison:  /* a comparison expression */
3059     case tcc_unary:       /* a unary arithmetic expression */
3060     case tcc_binary:      /* a binary arithmetic expression */
3061     case tcc_reference:   /* a reference */
3062     case tcc_vl_exp:        /* a function call */
3063       TREE_SIDE_EFFECTS (t) = TREE_THIS_VOLATILE (t);
3064       for (i = 0; i < len; ++i)
3065         {
3066           tree op = TREE_OPERAND (t, i);
3067           if (op && TREE_SIDE_EFFECTS (op))
3068             TREE_SIDE_EFFECTS (t) = 1;
3069         }
3070       break;
3071
3072     case tcc_constant:
3073       /* No side-effects.  */
3074       return;
3075
3076     default:
3077       gcc_unreachable ();
3078    }
3079 }
3080
3081 /* Canonicalize a tree T for use in a COND_EXPR as conditional.  Returns
3082    a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if
3083    we failed to create one.  */
3084
3085 tree
3086 canonicalize_cond_expr_cond (tree t)
3087 {
3088   /* Strip conversions around boolean operations.  */
3089   if (CONVERT_EXPR_P (t)
3090       && truth_value_p (TREE_CODE (TREE_OPERAND (t, 0))))
3091     t = TREE_OPERAND (t, 0);
3092
3093   /* For (bool)x use x != 0.  */
3094   if (CONVERT_EXPR_P (t)
3095       && TREE_CODE (TREE_TYPE (t)) == BOOLEAN_TYPE)
3096     {
3097       tree top0 = TREE_OPERAND (t, 0);
3098       t = build2 (NE_EXPR, TREE_TYPE (t),
3099                   top0, build_int_cst (TREE_TYPE (top0), 0));
3100     }
3101   /* For !x use x == 0.  */
3102   else if (TREE_CODE (t) == TRUTH_NOT_EXPR)
3103     {
3104       tree top0 = TREE_OPERAND (t, 0);
3105       t = build2 (EQ_EXPR, TREE_TYPE (t),
3106                   top0, build_int_cst (TREE_TYPE (top0), 0));
3107     }
3108   /* For cmp ? 1 : 0 use cmp.  */
3109   else if (TREE_CODE (t) == COND_EXPR
3110            && COMPARISON_CLASS_P (TREE_OPERAND (t, 0))
3111            && integer_onep (TREE_OPERAND (t, 1))
3112            && integer_zerop (TREE_OPERAND (t, 2)))
3113     {
3114       tree top0 = TREE_OPERAND (t, 0);
3115       t = build2 (TREE_CODE (top0), TREE_TYPE (t),
3116                   TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
3117     }
3118
3119   if (is_gimple_condexpr (t))
3120     return t;
3121
3122   return NULL_TREE;
3123 }
3124
3125 /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
3126    the positions marked by the set ARGS_TO_SKIP.  */
3127
3128 gimple
3129 gimple_call_copy_skip_args (gimple stmt, bitmap args_to_skip)
3130 {
3131   int i;
3132   tree fn = gimple_call_fn (stmt);
3133   int nargs = gimple_call_num_args (stmt);
3134   VEC(tree, heap) *vargs = VEC_alloc (tree, heap, nargs);
3135   gimple new_stmt;
3136
3137   for (i = 0; i < nargs; i++)
3138     if (!bitmap_bit_p (args_to_skip, i))
3139       VEC_quick_push (tree, vargs, gimple_call_arg (stmt, i));
3140
3141   new_stmt = gimple_build_call_vec (fn, vargs);
3142   VEC_free (tree, heap, vargs);
3143   if (gimple_call_lhs (stmt))
3144     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
3145
3146   gimple_set_vuse (new_stmt, gimple_vuse (stmt));
3147   gimple_set_vdef (new_stmt, gimple_vdef (stmt));
3148
3149   gimple_set_block (new_stmt, gimple_block (stmt));
3150   if (gimple_has_location (stmt))
3151     gimple_set_location (new_stmt, gimple_location (stmt));
3152   gimple_call_copy_flags (new_stmt, stmt);
3153   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
3154
3155   gimple_set_modified (new_stmt, true);
3156
3157   return new_stmt;
3158 }
3159
3160
3161 static hashval_t gimple_type_hash (const void *);
3162
3163 /* Structure used to maintain a cache of some type pairs compared by
3164    gimple_types_compatible_p when comparing aggregate types.  There are
3165    three possible values for SAME_P:
3166
3167         -2: The pair (T1, T2) has just been inserted in the table.
3168          0: T1 and T2 are different types.
3169          1: T1 and T2 are the same type.
3170
3171    The two elements in the SAME_P array are indexed by the comparison
3172    mode gtc_mode.  */
3173
3174 struct type_pair_d
3175 {
3176   unsigned int uid1;
3177   unsigned int uid2;
3178   signed char same_p[2];
3179 };
3180 typedef struct type_pair_d *type_pair_t;
3181
3182 DEF_VEC_P(type_pair_t);
3183 DEF_VEC_ALLOC_P(type_pair_t,heap);
3184
3185 /* Return a hash value for the type pair pointed-to by P.  */
3186
3187 static hashval_t
3188 type_pair_hash (const void *p)
3189 {
3190   const struct type_pair_d *pair = (const struct type_pair_d *) p;
3191   hashval_t val1 = pair->uid1;
3192   hashval_t val2 = pair->uid2;
3193   return (iterative_hash_hashval_t (val2, val1)
3194           ^ iterative_hash_hashval_t (val1, val2));
3195 }
3196
3197 /* Compare two type pairs pointed-to by P1 and P2.  */
3198
3199 static int
3200 type_pair_eq (const void *p1, const void *p2)
3201 {
3202   const struct type_pair_d *pair1 = (const struct type_pair_d *) p1;
3203   const struct type_pair_d *pair2 = (const struct type_pair_d *) p2;
3204   return ((pair1->uid1 == pair2->uid1 && pair1->uid2 == pair2->uid2)
3205           || (pair1->uid1 == pair2->uid2 && pair1->uid2 == pair2->uid1));
3206 }
3207
3208 /* Lookup the pair of types T1 and T2 in *VISITED_P.  Insert a new
3209    entry if none existed.  */
3210
3211 static type_pair_t
3212 lookup_type_pair (tree t1, tree t2, htab_t *visited_p, struct obstack *ob_p)
3213 {
3214   struct type_pair_d pair;
3215   type_pair_t p;
3216   void **slot;
3217
3218   if (*visited_p == NULL)
3219     {
3220       *visited_p = htab_create (251, type_pair_hash, type_pair_eq, NULL);
3221       gcc_obstack_init (ob_p);
3222     }
3223
3224   pair.uid1 = TYPE_UID (t1);
3225   pair.uid2 = TYPE_UID (t2);
3226   slot = htab_find_slot (*visited_p, &pair, INSERT);
3227
3228   if (*slot)
3229     p = *((type_pair_t *) slot);
3230   else
3231     {
3232       p = XOBNEW (ob_p, struct type_pair_d);
3233       p->uid1 = TYPE_UID (t1);
3234       p->uid2 = TYPE_UID (t2);
3235       p->same_p[0] = -2;
3236       p->same_p[1] = -2;
3237       *slot = (void *) p;
3238     }
3239
3240   return p;
3241 }
3242
3243 /* Per pointer state for the SCC finding.  The on_sccstack flag
3244    is not strictly required, it is true when there is no hash value
3245    recorded for the type and false otherwise.  But querying that
3246    is slower.  */
3247
3248 struct sccs
3249 {
3250   unsigned int dfsnum;
3251   unsigned int low;
3252   bool on_sccstack;
3253   union {
3254     hashval_t hash;
3255     signed char same_p;
3256   } u;
3257 };
3258
3259 static unsigned int next_dfs_num;
3260 static unsigned int gtc_next_dfs_num;
3261
3262
3263 /* GIMPLE type merging cache.  A direct-mapped cache based on TYPE_UID.  */
3264
3265 typedef struct GTY(()) gimple_type_leader_entry_s {
3266   tree type;
3267   tree leader;
3268 } gimple_type_leader_entry;
3269
3270 #define GIMPLE_TYPE_LEADER_SIZE 16381
3271 static GTY((length("GIMPLE_TYPE_LEADER_SIZE"))) gimple_type_leader_entry
3272   *gimple_type_leader;
3273
3274 /* Lookup an existing leader for T and return it or NULL_TREE, if
3275    there is none in the cache.  */
3276
3277 static tree
3278 gimple_lookup_type_leader (tree t)
3279 {
3280   gimple_type_leader_entry *leader;
3281
3282   if (!gimple_type_leader)
3283     return NULL_TREE;
3284
3285   leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
3286   if (leader->type != t)
3287     return NULL_TREE;
3288
3289   return leader->leader;
3290 }
3291
3292 /* Return true if T1 and T2 have the same name.  If FOR_COMPLETION_P is
3293    true then if any type has no name return false, otherwise return
3294    true if both types have no names.  */
3295
3296 static bool
3297 compare_type_names_p (tree t1, tree t2, bool for_completion_p)
3298 {
3299   tree name1 = TYPE_NAME (t1);
3300   tree name2 = TYPE_NAME (t2);
3301
3302   /* Consider anonymous types all unique for completion.  */
3303   if (for_completion_p
3304       && (!name1 || !name2))
3305     return false;
3306
3307   if (name1 && TREE_CODE (name1) == TYPE_DECL)
3308     {
3309       name1 = DECL_NAME (name1);
3310       if (for_completion_p
3311           && !name1)
3312         return false;
3313     }
3314   gcc_assert (!name1 || TREE_CODE (name1) == IDENTIFIER_NODE);
3315
3316   if (name2 && TREE_CODE (name2) == TYPE_DECL)
3317     {
3318       name2 = DECL_NAME (name2);
3319       if (for_completion_p
3320           && !name2)
3321         return false;
3322     }
3323   gcc_assert (!name2 || TREE_CODE (name2) == IDENTIFIER_NODE);
3324
3325   /* Identifiers can be compared with pointer equality rather
3326      than a string comparison.  */
3327   if (name1 == name2)
3328     return true;
3329
3330   return false;
3331 }
3332
3333 /* Return true if the field decls F1 and F2 are at the same offset.
3334
3335    This is intended to be used on GIMPLE types only.  In order to
3336    compare GENERIC types, use fields_compatible_p instead.  */
3337
3338 bool
3339 gimple_compare_field_offset (tree f1, tree f2)
3340 {
3341   if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
3342     {
3343       tree offset1 = DECL_FIELD_OFFSET (f1);
3344       tree offset2 = DECL_FIELD_OFFSET (f2);
3345       return ((offset1 == offset2
3346                /* Once gimplification is done, self-referential offsets are
3347                   instantiated as operand #2 of the COMPONENT_REF built for
3348                   each access and reset.  Therefore, they are not relevant
3349                   anymore and fields are interchangeable provided that they
3350                   represent the same access.  */
3351                || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
3352                    && TREE_CODE (offset2) == PLACEHOLDER_EXPR
3353                    && (DECL_SIZE (f1) == DECL_SIZE (f2)
3354                        || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
3355                            && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
3356                        || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
3357                    && DECL_ALIGN (f1) == DECL_ALIGN (f2))
3358                || operand_equal_p (offset1, offset2, 0))
3359               && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
3360                                      DECL_FIELD_BIT_OFFSET (f2)));
3361     }
3362
3363   /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
3364      should be, so handle differing ones specially by decomposing
3365      the offset into a byte and bit offset manually.  */
3366   if (host_integerp (DECL_FIELD_OFFSET (f1), 0)
3367       && host_integerp (DECL_FIELD_OFFSET (f2), 0))
3368     {
3369       unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
3370       unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
3371       bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
3372       byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
3373                       + bit_offset1 / BITS_PER_UNIT);
3374       bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
3375       byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
3376                       + bit_offset2 / BITS_PER_UNIT);
3377       if (byte_offset1 != byte_offset2)
3378         return false;
3379       return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
3380     }
3381
3382   return false;
3383 }
3384
3385 /* If the type T1 and the type T2 are a complete and an incomplete
3386    variant of the same type return true.  */
3387
3388 static bool
3389 gimple_compatible_complete_and_incomplete_subtype_p (tree t1, tree t2)
3390 {
3391   /* If one pointer points to an incomplete type variant of
3392      the other pointed-to type they are the same.  */
3393   if (TREE_CODE (t1) == TREE_CODE (t2)
3394       && RECORD_OR_UNION_TYPE_P (t1)
3395       && (!COMPLETE_TYPE_P (t1)
3396           || !COMPLETE_TYPE_P (t2))
3397       && TYPE_QUALS (t1) == TYPE_QUALS (t2)
3398       && compare_type_names_p (TYPE_MAIN_VARIANT (t1),
3399                                TYPE_MAIN_VARIANT (t2), true))
3400     return true;
3401   return false;
3402 }
3403
3404 static bool
3405 gimple_types_compatible_p_1 (tree, tree, enum gtc_mode, type_pair_t,
3406                              VEC(type_pair_t, heap) **,
3407                              struct pointer_map_t *, struct obstack *);
3408
3409 /* DFS visit the edge from the callers type pair with state *STATE to
3410    the pair T1, T2 while operating in FOR_MERGING_P mode.
3411    Update the merging status if it is not part of the SCC containing the
3412    callers pair and return it.
3413    SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.  */
3414
3415 static bool
3416 gtc_visit (tree t1, tree t2, enum gtc_mode mode,
3417            struct sccs *state,
3418            VEC(type_pair_t, heap) **sccstack,
3419            struct pointer_map_t *sccstate,
3420            struct obstack *sccstate_obstack)
3421 {
3422   struct sccs *cstate = NULL;
3423   type_pair_t p;
3424   void **slot;
3425
3426   /* Check first for the obvious case of pointer identity.  */
3427   if (t1 == t2)
3428     return true;
3429
3430   /* Check that we have two types to compare.  */
3431   if (t1 == NULL_TREE || t2 == NULL_TREE)
3432     return false;
3433
3434   /* If the types have been previously registered and found equal
3435      they still are.  */
3436   if (mode == GTC_MERGE)
3437     {
3438       tree leader1 = gimple_lookup_type_leader (t1);
3439       tree leader2 = gimple_lookup_type_leader (t2);
3440       if (leader1 == t2
3441           || t1 == leader2
3442           || (leader1 && leader1 == leader2))
3443         return true;
3444     }
3445   else if (mode == GTC_DIAG)
3446     {
3447       if (TYPE_CANONICAL (t1)
3448           && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
3449         return true;
3450     }
3451
3452   /* Can't be the same type if the types don't have the same code.  */
3453   if (TREE_CODE (t1) != TREE_CODE (t2))
3454     return false;
3455
3456   /* Can't be the same type if they have different CV qualifiers.  */
3457   if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
3458     return false;
3459
3460   /* Void types are always the same.  */
3461   if (TREE_CODE (t1) == VOID_TYPE)
3462     return true;
3463
3464   /* Do some simple checks before doing three hashtable queries.  */
3465   if (INTEGRAL_TYPE_P (t1)
3466       || SCALAR_FLOAT_TYPE_P (t1)
3467       || FIXED_POINT_TYPE_P (t1)
3468       || TREE_CODE (t1) == VECTOR_TYPE
3469       || TREE_CODE (t1) == COMPLEX_TYPE
3470       || TREE_CODE (t1) == OFFSET_TYPE)
3471     {
3472       /* Can't be the same type if they have different alignment,
3473          sign, precision or mode.  */
3474       if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
3475           || TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
3476           || TYPE_MODE (t1) != TYPE_MODE (t2)
3477           || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
3478         return false;
3479
3480       if (TREE_CODE (t1) == INTEGER_TYPE
3481           && (TYPE_IS_SIZETYPE (t1) != TYPE_IS_SIZETYPE (t2)
3482               || TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)))
3483         return false;
3484
3485       /* That's all we need to check for float and fixed-point types.  */
3486       if (SCALAR_FLOAT_TYPE_P (t1)
3487           || FIXED_POINT_TYPE_P (t1))
3488         return true;
3489
3490       /* For integral types fall thru to more complex checks.  */
3491     }
3492
3493   else if (AGGREGATE_TYPE_P (t1) || POINTER_TYPE_P (t1))
3494     {
3495       /* Can't be the same type if they have different alignment or mode.  */
3496       if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
3497           || TYPE_MODE (t1) != TYPE_MODE (t2))
3498         return false;
3499     }
3500
3501   /* If the hash values of t1 and t2 are different the types can't
3502      possibly be the same.  This helps keeping the type-pair hashtable
3503      small, only tracking comparisons for hash collisions.  */
3504   if (gimple_type_hash (t1) != gimple_type_hash (t2))
3505     return false;
3506
3507   /* Allocate a new cache entry for this comparison.  */
3508   p = lookup_type_pair (t1, t2, &gtc_visited, &gtc_ob);
3509   if (p->same_p[mode] == 0 || p->same_p[mode] == 1)
3510     {
3511       /* We have already decided whether T1 and T2 are the
3512          same, return the cached result.  */
3513       return p->same_p[mode] == 1;
3514     }
3515
3516   if ((slot = pointer_map_contains (sccstate, p)) != NULL)
3517     cstate = (struct sccs *)*slot;
3518   if (!cstate)
3519     {
3520       bool res;
3521       /* Not yet visited.  DFS recurse.  */
3522       res = gimple_types_compatible_p_1 (t1, t2, mode, p,
3523                                          sccstack, sccstate, sccstate_obstack);
3524       if (!cstate)
3525         cstate = (struct sccs *)* pointer_map_contains (sccstate, p);
3526       state->low = MIN (state->low, cstate->low);
3527       /* If the type is no longer on the SCC stack and thus is not part
3528          of the parents SCC, return its state.  Otherwise we will
3529          ignore this pair and assume equality.  */
3530       if (!cstate->on_sccstack)
3531         return res;
3532     }
3533   if (cstate->dfsnum < state->dfsnum
3534       && cstate->on_sccstack)
3535     state->low = MIN (cstate->dfsnum, state->low);
3536
3537   /* We are part of our parents SCC, skip this entry and return true.  */
3538   return true;
3539 }
3540
3541 /* Worker for gimple_types_compatible.
3542    SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.  */
3543
3544 static bool
3545 gimple_types_compatible_p_1 (tree t1, tree t2, enum gtc_mode mode,
3546                              type_pair_t p,
3547                              VEC(type_pair_t, heap) **sccstack,
3548                              struct pointer_map_t *sccstate,
3549                              struct obstack *sccstate_obstack)
3550 {
3551   struct sccs *state;
3552
3553   gcc_assert (p->same_p[mode] == -2);
3554
3555   state = XOBNEW (sccstate_obstack, struct sccs);
3556   *pointer_map_insert (sccstate, p) = state;
3557
3558   VEC_safe_push (type_pair_t, heap, *sccstack, p);
3559   state->dfsnum = gtc_next_dfs_num++;
3560   state->low = state->dfsnum;
3561   state->on_sccstack = true;
3562
3563   /* If their attributes are not the same they can't be the same type.  */
3564   if (!attribute_list_equal (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2)))
3565     goto different_types;
3566
3567   /* Do type-specific comparisons.  */
3568   switch (TREE_CODE (t1))
3569     {
3570     case VECTOR_TYPE:
3571     case COMPLEX_TYPE:
3572       if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2), mode,
3573                       state, sccstack, sccstate, sccstate_obstack))
3574         goto different_types;
3575       goto same_types;
3576
3577     case ARRAY_TYPE:
3578       /* Array types are the same if the element types are the same and
3579          the number of elements are the same.  */
3580       if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2), mode,
3581                       state, sccstack, sccstate, sccstate_obstack)
3582           || TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)
3583           || TYPE_NONALIASED_COMPONENT (t1) != TYPE_NONALIASED_COMPONENT (t2))
3584         goto different_types;
3585       else
3586         {
3587           tree i1 = TYPE_DOMAIN (t1);
3588           tree i2 = TYPE_DOMAIN (t2);
3589
3590           /* For an incomplete external array, the type domain can be
3591              NULL_TREE.  Check this condition also.  */
3592           if (i1 == NULL_TREE && i2 == NULL_TREE)
3593             goto same_types;
3594           else if (i1 == NULL_TREE || i2 == NULL_TREE)
3595             goto different_types;
3596           /* If for a complete array type the possibly gimplified sizes
3597              are different the types are different.  */
3598           else if (((TYPE_SIZE (i1) != NULL) ^ (TYPE_SIZE (i2) != NULL))
3599                    || (TYPE_SIZE (i1)
3600                        && TYPE_SIZE (i2)
3601                        && !operand_equal_p (TYPE_SIZE (i1), TYPE_SIZE (i2), 0)))
3602             goto different_types;
3603           else
3604             {
3605               tree min1 = TYPE_MIN_VALUE (i1);
3606               tree min2 = TYPE_MIN_VALUE (i2);
3607               tree max1 = TYPE_MAX_VALUE (i1);
3608               tree max2 = TYPE_MAX_VALUE (i2);
3609
3610               /* The minimum/maximum values have to be the same.  */
3611               if ((min1 == min2
3612                    || (min1 && min2
3613                        && ((TREE_CODE (min1) == PLACEHOLDER_EXPR
3614                             && TREE_CODE (min2) == PLACEHOLDER_EXPR)
3615                            || operand_equal_p (min1, min2, 0))))
3616                   && (max1 == max2
3617                       || (max1 && max2
3618                           && ((TREE_CODE (max1) == PLACEHOLDER_EXPR
3619                                && TREE_CODE (max2) == PLACEHOLDER_EXPR)
3620                               || operand_equal_p (max1, max2, 0)))))
3621                 goto same_types;
3622               else
3623                 goto different_types;
3624             }
3625         }
3626
3627     case METHOD_TYPE:
3628       /* Method types should belong to the same class.  */
3629       if (!gtc_visit (TYPE_METHOD_BASETYPE (t1), TYPE_METHOD_BASETYPE (t2),
3630                       mode, state, sccstack, sccstate, sccstate_obstack))
3631         goto different_types;
3632
3633       /* Fallthru  */
3634
3635     case FUNCTION_TYPE:
3636       /* Function types are the same if the return type and arguments types
3637          are the same.  */
3638       if ((mode != GTC_DIAG
3639            || !gimple_compatible_complete_and_incomplete_subtype_p
3640                  (TREE_TYPE (t1), TREE_TYPE (t2)))
3641           && !gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2), mode,
3642                          state, sccstack, sccstate, sccstate_obstack))
3643         goto different_types;
3644
3645       if (!targetm.comp_type_attributes (t1, t2))
3646         goto different_types;
3647
3648       if (TYPE_ARG_TYPES (t1) == TYPE_ARG_TYPES (t2))
3649         goto same_types;
3650       else
3651         {
3652           tree parms1, parms2;
3653
3654           for (parms1 = TYPE_ARG_TYPES (t1), parms2 = TYPE_ARG_TYPES (t2);
3655                parms1 && parms2;
3656                parms1 = TREE_CHAIN (parms1), parms2 = TREE_CHAIN (parms2))
3657             {
3658               if ((mode == GTC_MERGE
3659                    || !gimple_compatible_complete_and_incomplete_subtype_p
3660                          (TREE_VALUE (parms1), TREE_VALUE (parms2)))
3661                   && !gtc_visit (TREE_VALUE (parms1), TREE_VALUE (parms2), mode,
3662                                  state, sccstack, sccstate, sccstate_obstack))
3663                 goto different_types;
3664             }
3665
3666           if (parms1 || parms2)
3667             goto different_types;
3668
3669           goto same_types;
3670         }
3671
3672     case OFFSET_TYPE:
3673       {
3674         if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2), mode,
3675                         state, sccstack, sccstate, sccstate_obstack)
3676             || !gtc_visit (TYPE_OFFSET_BASETYPE (t1),
3677                            TYPE_OFFSET_BASETYPE (t2), mode,
3678                            state, sccstack, sccstate, sccstate_obstack))
3679           goto different_types;
3680
3681         goto same_types;
3682       }
3683
3684     case POINTER_TYPE:
3685     case REFERENCE_TYPE:
3686       {
3687         /* If the two pointers have different ref-all attributes,
3688            they can't be the same type.  */
3689         if (TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2))
3690           goto different_types;
3691
3692         /* If one pointer points to an incomplete type variant of
3693            the other pointed-to type they are the same.  */
3694         if (mode == GTC_DIAG
3695             && gimple_compatible_complete_and_incomplete_subtype_p
3696                  (TREE_TYPE (t1), TREE_TYPE (t2)))
3697           goto same_types;
3698
3699         /* Otherwise, pointer and reference types are the same if the
3700            pointed-to types are the same.  */
3701         if (gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2), mode,
3702                        state, sccstack, sccstate, sccstate_obstack))
3703           goto same_types;
3704
3705         goto different_types;
3706       }
3707
3708     case NULLPTR_TYPE:
3709       /* There is only one decltype(nullptr).  */
3710       goto same_types;
3711
3712     case INTEGER_TYPE:
3713     case BOOLEAN_TYPE:
3714       {
3715         tree min1 = TYPE_MIN_VALUE (t1);
3716         tree max1 = TYPE_MAX_VALUE (t1);
3717         tree min2 = TYPE_MIN_VALUE (t2);
3718         tree max2 = TYPE_MAX_VALUE (t2);
3719         bool min_equal_p = false;
3720         bool max_equal_p = false;
3721
3722         /* If either type has a minimum value, the other type must
3723            have the same.  */
3724         if (min1 == NULL_TREE && min2 == NULL_TREE)
3725           min_equal_p = true;
3726         else if (min1 && min2 && operand_equal_p (min1, min2, 0))
3727           min_equal_p = true;
3728
3729         /* Likewise, if either type has a maximum value, the other
3730            type must have the same.  */
3731         if (max1 == NULL_TREE && max2 == NULL_TREE)
3732           max_equal_p = true;
3733         else if (max1 && max2 && operand_equal_p (max1, max2, 0))
3734           max_equal_p = true;
3735
3736         if (!min_equal_p || !max_equal_p)
3737           goto different_types;
3738
3739         goto same_types;
3740       }
3741
3742     case ENUMERAL_TYPE:
3743       {
3744         /* FIXME lto, we cannot check bounds on enumeral types because
3745            different front ends will produce different values.
3746            In C, enumeral types are integers, while in C++ each element
3747            will have its own symbolic value.  We should decide how enums
3748            are to be represented in GIMPLE and have each front end lower
3749            to that.  */
3750         tree v1, v2;
3751
3752         /* For enumeral types, all the values must be the same.  */
3753         if (TYPE_VALUES (t1) == TYPE_VALUES (t2))
3754           goto same_types;
3755
3756         for (v1 = TYPE_VALUES (t1), v2 = TYPE_VALUES (t2);
3757              v1 && v2;
3758              v1 = TREE_CHAIN (v1), v2 = TREE_CHAIN (v2))
3759           {
3760             tree c1 = TREE_VALUE (v1);
3761             tree c2 = TREE_VALUE (v2);
3762
3763             if (TREE_CODE (c1) == CONST_DECL)
3764               c1 = DECL_INITIAL (c1);
3765
3766             if (TREE_CODE (c2) == CONST_DECL)
3767               c2 = DECL_INITIAL (c2);
3768
3769             if (tree_int_cst_equal (c1, c2) != 1)
3770               goto different_types;
3771           }
3772
3773         /* If one enumeration has more values than the other, they
3774            are not the same.  */
3775         if (v1 || v2)
3776           goto different_types;
3777
3778         goto same_types;
3779       }
3780
3781     case RECORD_TYPE:
3782     case UNION_TYPE:
3783     case QUAL_UNION_TYPE:
3784       {
3785         tree f1, f2;
3786
3787         /* The struct tags shall compare equal.  */
3788         if (!compare_type_names_p (TYPE_MAIN_VARIANT (t1),
3789                                    TYPE_MAIN_VARIANT (t2), false))
3790           goto different_types;
3791
3792         /* For aggregate types, all the fields must be the same.  */
3793         for (f1 = TYPE_FIELDS (t1), f2 = TYPE_FIELDS (t2);
3794              f1 && f2;
3795              f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
3796           {
3797             /* The fields must have the same name, offset and type.  */
3798             if (DECL_NAME (f1) != DECL_NAME (f2)
3799                 || DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
3800                 || !gimple_compare_field_offset (f1, f2)
3801                 || !gtc_visit (TREE_TYPE (f1), TREE_TYPE (f2), mode,
3802                                state, sccstack, sccstate, sccstate_obstack))
3803               goto different_types;
3804           }
3805
3806         /* If one aggregate has more fields than the other, they
3807            are not the same.  */
3808         if (f1 || f2)
3809           goto different_types;
3810
3811         goto same_types;
3812       }
3813
3814     default:
3815       gcc_unreachable ();
3816     }
3817
3818   /* Common exit path for types that are not compatible.  */
3819 different_types:
3820   state->u.same_p = 0;
3821   goto pop;
3822
3823   /* Common exit path for types that are compatible.  */
3824 same_types:
3825   state->u.same_p = 1;
3826   goto pop;
3827
3828 pop:
3829   if (state->low == state->dfsnum)
3830     {
3831       type_pair_t x;
3832
3833       /* Pop off the SCC and set its cache values.  */
3834       do
3835         {
3836           struct sccs *cstate;
3837           x = VEC_pop (type_pair_t, *sccstack);
3838           cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
3839           cstate->on_sccstack = false;
3840           x->same_p[mode] = cstate->u.same_p;
3841         }
3842       while (x != p);
3843     }
3844
3845   return state->u.same_p;
3846 }
3847
3848 /* Return true iff T1 and T2 are structurally identical.  When
3849    FOR_MERGING_P is true the an incomplete type and a complete type
3850    are considered different, otherwise they are considered compatible.  */
3851
3852 bool
3853 gimple_types_compatible_p (tree t1, tree t2, enum gtc_mode mode)
3854 {
3855   VEC(type_pair_t, heap) *sccstack = NULL;
3856   struct pointer_map_t *sccstate;
3857   struct obstack sccstate_obstack;
3858   type_pair_t p = NULL;
3859   bool res;
3860
3861   /* Before starting to set up the SCC machinery handle simple cases.  */
3862
3863   /* Check first for the obvious case of pointer identity.  */
3864   if (t1 == t2)
3865     return true;
3866
3867   /* Check that we have two types to compare.  */
3868   if (t1 == NULL_TREE || t2 == NULL_TREE)
3869     return false;
3870
3871   /* If the types have been previously registered and found equal
3872      they still are.  */
3873   if (mode == GTC_MERGE)
3874     {
3875       tree leader1 = gimple_lookup_type_leader (t1);
3876       tree leader2 = gimple_lookup_type_leader (t2);
3877       if (leader1 == t2
3878           || t1 == leader2
3879           || (leader1 && leader1 == leader2))
3880         return true;
3881     }
3882   else if (mode == GTC_DIAG)
3883     {
3884       if (TYPE_CANONICAL (t1)
3885           && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
3886         return true;
3887     }
3888
3889   /* Can't be the same type if the types don't have the same code.  */
3890   if (TREE_CODE (t1) != TREE_CODE (t2))
3891     return false;
3892
3893   /* Can't be the same type if they have different CV qualifiers.  */
3894   if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
3895     return false;
3896
3897   /* Void types are always the same.  */
3898   if (TREE_CODE (t1) == VOID_TYPE)
3899     return true;
3900
3901   /* Do some simple checks before doing three hashtable queries.  */
3902   if (INTEGRAL_TYPE_P (t1)
3903       || SCALAR_FLOAT_TYPE_P (t1)
3904       || FIXED_POINT_TYPE_P (t1)
3905       || TREE_CODE (t1) == VECTOR_TYPE
3906       || TREE_CODE (t1) == COMPLEX_TYPE
3907       || TREE_CODE (t1) == OFFSET_TYPE)
3908     {
3909       /* Can't be the same type if they have different alignment,
3910          sign, precision or mode.  */
3911       if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
3912           || TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
3913           || TYPE_MODE (t1) != TYPE_MODE (t2)
3914           || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
3915         return false;
3916
3917       if (TREE_CODE (t1) == INTEGER_TYPE
3918           && (TYPE_IS_SIZETYPE (t1) != TYPE_IS_SIZETYPE (t2)
3919               || TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)))
3920         return false;
3921
3922       /* That's all we need to check for float and fixed-point types.  */
3923       if (SCALAR_FLOAT_TYPE_P (t1)
3924           || FIXED_POINT_TYPE_P (t1))
3925         return true;
3926
3927       /* For integral types fall thru to more complex checks.  */
3928     }
3929
3930   else if (AGGREGATE_TYPE_P (t1) || POINTER_TYPE_P (t1))
3931     {
3932       /* Can't be the same type if they have different alignment or mode.  */
3933       if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
3934           || TYPE_MODE (t1) != TYPE_MODE (t2))
3935         return false;
3936     }
3937
3938   /* If the hash values of t1 and t2 are different the types can't
3939      possibly be the same.  This helps keeping the type-pair hashtable
3940      small, only tracking comparisons for hash collisions.  */
3941   if (gimple_type_hash (t1) != gimple_type_hash (t2))
3942     return false;
3943
3944   /* If we've visited this type pair before (in the case of aggregates
3945      with self-referential types), and we made a decision, return it.  */
3946   p = lookup_type_pair (t1, t2, &gtc_visited, &gtc_ob);
3947   if (p->same_p[mode] == 0 || p->same_p[mode] == 1)
3948     {
3949       /* We have already decided whether T1 and T2 are the
3950          same, return the cached result.  */
3951       return p->same_p[mode] == 1;
3952     }
3953
3954   /* Now set up the SCC machinery for the comparison.  */
3955   gtc_next_dfs_num = 1;
3956   sccstate = pointer_map_create ();
3957   gcc_obstack_init (&sccstate_obstack);
3958   res = gimple_types_compatible_p_1 (t1, t2, mode, p,
3959                                      &sccstack, sccstate, &sccstate_obstack);
3960   VEC_free (type_pair_t, heap, sccstack);
3961   pointer_map_destroy (sccstate);
3962   obstack_free (&sccstate_obstack, NULL);
3963
3964   return res;
3965 }
3966
3967
3968 static hashval_t
3969 iterative_hash_gimple_type (tree, hashval_t, VEC(tree, heap) **,
3970                             struct pointer_map_t *, struct obstack *);
3971
3972 /* DFS visit the edge from the callers type with state *STATE to T.
3973    Update the callers type hash V with the hash for T if it is not part
3974    of the SCC containing the callers type and return it.
3975    SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.  */
3976
3977 static hashval_t
3978 visit (tree t, struct sccs *state, hashval_t v,
3979        VEC (tree, heap) **sccstack,
3980        struct pointer_map_t *sccstate,
3981        struct obstack *sccstate_obstack)
3982 {
3983   struct sccs *cstate = NULL;
3984   struct tree_int_map m;
3985   void **slot;
3986
3987   /* If there is a hash value recorded for this type then it can't
3988      possibly be part of our parent SCC.  Simply mix in its hash.  */
3989   m.base.from = t;
3990   if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
3991       && *slot)
3992     return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, v);
3993
3994   if ((slot = pointer_map_contains (sccstate, t)) != NULL)
3995     cstate = (struct sccs *)*slot;
3996   if (!cstate)
3997     {
3998       hashval_t tem;
3999       /* Not yet visited.  DFS recurse.  */
4000       tem = iterative_hash_gimple_type (t, v,
4001                                         sccstack, sccstate, sccstate_obstack);
4002       if (!cstate)
4003         cstate = (struct sccs *)* pointer_map_contains (sccstate, t);
4004       state->low = MIN (state->low, cstate->low);
4005       /* If the type is no longer on the SCC stack and thus is not part
4006          of the parents SCC mix in its hash value.  Otherwise we will
4007          ignore the type for hashing purposes and return the unaltered
4008          hash value.  */
4009       if (!cstate->on_sccstack)
4010         return tem;
4011     }
4012   if (cstate->dfsnum < state->dfsnum
4013       && cstate->on_sccstack)
4014     state->low = MIN (cstate->dfsnum, state->low);
4015
4016   /* We are part of our parents SCC, skip this type during hashing
4017      and return the unaltered hash value.  */
4018   return v;
4019 }
4020
4021 /* Hash NAME with the previous hash value V and return it.  */
4022
4023 static hashval_t
4024 iterative_hash_name (tree name, hashval_t v)
4025 {
4026   if (!name)
4027     return v;
4028   if (TREE_CODE (name) == TYPE_DECL)
4029     name = DECL_NAME (name);
4030   if (!name)
4031     return v;
4032   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
4033   return iterative_hash_object (IDENTIFIER_HASH_VALUE (name), v);
4034 }
4035
4036 /* Returning a hash value for gimple type TYPE combined with VAL.
4037    SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.
4038
4039    To hash a type we end up hashing in types that are reachable.
4040    Through pointers we can end up with cycles which messes up the
4041    required property that we need to compute the same hash value
4042    for structurally equivalent types.  To avoid this we have to
4043    hash all types in a cycle (the SCC) in a commutative way.  The
4044    easiest way is to not mix in the hashes of the SCC members at
4045    all.  To make this work we have to delay setting the hash
4046    values of the SCC until it is complete.  */
4047
4048 static hashval_t
4049 iterative_hash_gimple_type (tree type, hashval_t val,
4050                             VEC(tree, heap) **sccstack,
4051                             struct pointer_map_t *sccstate,
4052                             struct obstack *sccstate_obstack)
4053 {
4054   hashval_t v;
4055   void **slot;
4056   struct sccs *state;
4057
4058   /* Not visited during this DFS walk.  */
4059   gcc_checking_assert (!pointer_map_contains (sccstate, type));
4060   state = XOBNEW (sccstate_obstack, struct sccs);
4061   *pointer_map_insert (sccstate, type) = state;
4062
4063   VEC_safe_push (tree, heap, *sccstack, type);
4064   state->dfsnum = next_dfs_num++;
4065   state->low = state->dfsnum;
4066   state->on_sccstack = true;
4067
4068   /* Combine a few common features of types so that types are grouped into
4069      smaller sets; when searching for existing matching types to merge,
4070      only existing types having the same features as the new type will be
4071      checked.  */
4072   v = iterative_hash_hashval_t (TREE_CODE (type), 0);
4073   v = iterative_hash_hashval_t (TYPE_QUALS (type), v);
4074   v = iterative_hash_hashval_t (TREE_ADDRESSABLE (type), v);
4075
4076   /* Do not hash the types size as this will cause differences in
4077      hash values for the complete vs. the incomplete type variant.  */
4078
4079   /* Incorporate common features of numerical types.  */
4080   if (INTEGRAL_TYPE_P (type)
4081       || SCALAR_FLOAT_TYPE_P (type)
4082       || FIXED_POINT_TYPE_P (type))
4083     {
4084       v = iterative_hash_hashval_t (TYPE_PRECISION (type), v);
4085       v = iterative_hash_hashval_t (TYPE_MODE (type), v);
4086       v = iterative_hash_hashval_t (TYPE_UNSIGNED (type), v);
4087     }
4088
4089   /* For pointer and reference types, fold in information about the type
4090      pointed to but do not recurse into possibly incomplete types to
4091      avoid hash differences for complete vs. incomplete types.  */
4092   if (POINTER_TYPE_P (type))
4093     {
4094       if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (type)))
4095         {
4096           v = iterative_hash_hashval_t (TREE_CODE (TREE_TYPE (type)), v);
4097           v = iterative_hash_name
4098               (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (type))), v);
4099         }
4100       else
4101         v = visit (TREE_TYPE (type), state, v,
4102                    sccstack, sccstate, sccstate_obstack);
4103     }
4104
4105   /* For integer types hash the types min/max values and the string flag.  */
4106   if (TREE_CODE (type) == INTEGER_TYPE)
4107     {
4108       /* OMP lowering can introduce error_mark_node in place of
4109          random local decls in types.  */
4110       if (TYPE_MIN_VALUE (type) != error_mark_node)
4111         v = iterative_hash_expr (TYPE_MIN_VALUE (type), v);
4112       if (TYPE_MAX_VALUE (type) != error_mark_node)
4113         v = iterative_hash_expr (TYPE_MAX_VALUE (type), v);
4114       v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
4115     }
4116
4117   /* For array types hash their domain and the string flag.  */
4118   if (TREE_CODE (type) == ARRAY_TYPE
4119       && TYPE_DOMAIN (type))
4120     {
4121       v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
4122       v = visit (TYPE_DOMAIN (type), state, v,
4123                  sccstack, sccstate, sccstate_obstack);
4124     }
4125
4126   /* Recurse for aggregates with a single element type.  */
4127   if (TREE_CODE (type) == ARRAY_TYPE
4128       || TREE_CODE (type) == COMPLEX_TYPE
4129       || TREE_CODE (type) == VECTOR_TYPE)
4130     v = visit (TREE_TYPE (type), state, v,
4131                sccstack, sccstate, sccstate_obstack);
4132
4133   /* Incorporate function return and argument types.  */
4134   if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
4135     {
4136       unsigned na;
4137       tree p;
4138
4139       /* For method types also incorporate their parent class.  */
4140       if (TREE_CODE (type) == METHOD_TYPE)
4141         v = visit (TYPE_METHOD_BASETYPE (type), state, v,
4142                    sccstack, sccstate, sccstate_obstack);
4143
4144       /* For result types allow mismatch in completeness.  */
4145       if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (type)))
4146         {
4147           v = iterative_hash_hashval_t (TREE_CODE (TREE_TYPE (type)), v);
4148           v = iterative_hash_name
4149               (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (type))), v);
4150         }
4151       else
4152         v = visit (TREE_TYPE (type), state, v,
4153                    sccstack, sccstate, sccstate_obstack);
4154
4155       for (p = TYPE_ARG_TYPES (type), na = 0; p; p = TREE_CHAIN (p))
4156         {
4157           /* For argument types allow mismatch in completeness.  */
4158           if (RECORD_OR_UNION_TYPE_P (TREE_VALUE (p)))
4159             {
4160               v = iterative_hash_hashval_t (TREE_CODE (TREE_VALUE (p)), v);
4161               v = iterative_hash_name
4162                   (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_VALUE (p))), v);
4163             }
4164           else
4165             v = visit (TREE_VALUE (p), state, v,
4166                        sccstack, sccstate, sccstate_obstack);
4167           na++;
4168         }
4169
4170       v = iterative_hash_hashval_t (na, v);
4171     }
4172
4173   if (TREE_CODE (type) == RECORD_TYPE
4174       || TREE_CODE (type) == UNION_TYPE
4175       || TREE_CODE (type) == QUAL_UNION_TYPE)
4176     {
4177       unsigned nf;
4178       tree f;
4179
4180       v = iterative_hash_name (TYPE_NAME (TYPE_MAIN_VARIANT (type)), v);
4181
4182       for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
4183         {
4184           v = iterative_hash_name (DECL_NAME (f), v);
4185           v = visit (TREE_TYPE (f), state, v,
4186                      sccstack, sccstate, sccstate_obstack);
4187           nf++;
4188         }
4189
4190       v = iterative_hash_hashval_t (nf, v);
4191     }
4192
4193   /* Record hash for us.  */
4194   state->u.hash = v;
4195
4196   /* See if we found an SCC.  */
4197   if (state->low == state->dfsnum)
4198     {
4199       tree x;
4200
4201       /* Pop off the SCC and set its hash values.  */
4202       do
4203         {
4204           struct sccs *cstate;
4205           struct tree_int_map *m = ggc_alloc_cleared_tree_int_map ();
4206           x = VEC_pop (tree, *sccstack);
4207           cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
4208           cstate->on_sccstack = false;
4209           m->base.from = x;
4210           m->to = cstate->u.hash;
4211           slot = htab_find_slot (type_hash_cache, m, INSERT);
4212           gcc_assert (!*slot);
4213           *slot = (void *) m;
4214         }
4215       while (x != type);
4216     }
4217
4218   return iterative_hash_hashval_t (v, val);
4219 }
4220
4221
4222 /* Returns a hash value for P (assumed to be a type).  The hash value
4223    is computed using some distinguishing features of the type.  Note
4224    that we cannot use pointer hashing here as we may be dealing with
4225    two distinct instances of the same type.
4226
4227    This function should produce the same hash value for two compatible
4228    types according to gimple_types_compatible_p.  */
4229
4230 static hashval_t
4231 gimple_type_hash (const void *p)
4232 {
4233   const_tree t = (const_tree) p;
4234   VEC(tree, heap) *sccstack = NULL;
4235   struct pointer_map_t *sccstate;
4236   struct obstack sccstate_obstack;
4237   hashval_t val;
4238   void **slot;
4239   struct tree_int_map m;
4240
4241   if (type_hash_cache == NULL)
4242     type_hash_cache = htab_create_ggc (512, tree_int_map_hash,
4243                                        tree_int_map_eq, NULL);
4244
4245   m.base.from = CONST_CAST_TREE (t);
4246   if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
4247       && *slot)
4248     return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, 0);
4249
4250   /* Perform a DFS walk and pre-hash all reachable types.  */
4251   next_dfs_num = 1;
4252   sccstate = pointer_map_create ();
4253   gcc_obstack_init (&sccstate_obstack);
4254   val = iterative_hash_gimple_type (CONST_CAST_TREE (t), 0,
4255                                     &sccstack, sccstate, &sccstate_obstack);
4256   VEC_free (tree, heap, sccstack);
4257   pointer_map_destroy (sccstate);
4258   obstack_free (&sccstate_obstack, NULL);
4259
4260   return val;
4261 }
4262
4263
4264 /* Returns nonzero if P1 and P2 are equal.  */
4265
4266 static int
4267 gimple_type_eq (const void *p1, const void *p2)
4268 {
4269   const_tree t1 = (const_tree) p1;
4270   const_tree t2 = (const_tree) p2;
4271   return gimple_types_compatible_p (CONST_CAST_TREE (t1),
4272                                     CONST_CAST_TREE (t2), GTC_MERGE);
4273 }
4274
4275
4276 /* Register type T in the global type table gimple_types.
4277    If another type T', compatible with T, already existed in
4278    gimple_types then return T', otherwise return T.  This is used by
4279    LTO to merge identical types read from different TUs.  */
4280
4281 tree
4282 gimple_register_type (tree t)
4283 {
4284   void **slot;
4285   gimple_type_leader_entry *leader;
4286   tree mv_leader = NULL_TREE;
4287
4288   gcc_assert (TYPE_P (t));
4289
4290   if (!gimple_type_leader)
4291     gimple_type_leader = ggc_alloc_cleared_vec_gimple_type_leader_entry_s
4292                                 (GIMPLE_TYPE_LEADER_SIZE);
4293   /* If we registered this type before return the cached result.  */
4294   leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
4295   if (leader->type == t)
4296     return leader->leader;
4297
4298   /* Always register the main variant first.  This is important so we
4299      pick up the non-typedef variants as canonical, otherwise we'll end
4300      up taking typedef ids for structure tags during comparison.  */
4301   if (TYPE_MAIN_VARIANT (t) != t)
4302     mv_leader = gimple_register_type (TYPE_MAIN_VARIANT (t));
4303
4304   if (gimple_types == NULL)
4305     gimple_types = htab_create_ggc (16381, gimple_type_hash, gimple_type_eq, 0);
4306
4307   slot = htab_find_slot (gimple_types, t, INSERT);
4308   if (*slot
4309       && *(tree *)slot != t)
4310     {
4311       tree new_type = (tree) *((tree *) slot);
4312
4313       /* Do not merge types with different addressability.  */
4314       gcc_assert (TREE_ADDRESSABLE (t) == TREE_ADDRESSABLE (new_type));
4315
4316       /* If t is not its main variant then make t unreachable from its
4317          main variant list.  Otherwise we'd queue up a lot of duplicates
4318          there.  */
4319       if (t != TYPE_MAIN_VARIANT (t))
4320         {
4321           tree tem = TYPE_MAIN_VARIANT (t);
4322           while (tem && TYPE_NEXT_VARIANT (tem) != t)
4323             tem = TYPE_NEXT_VARIANT (tem);
4324           if (tem)
4325             TYPE_NEXT_VARIANT (tem) = TYPE_NEXT_VARIANT (t);
4326           TYPE_NEXT_VARIANT (t) = NULL_TREE;
4327         }
4328
4329       /* If we are a pointer then remove us from the pointer-to or
4330          reference-to chain.  Otherwise we'd queue up a lot of duplicates
4331          there.  */
4332       if (TREE_CODE (t) == POINTER_TYPE)
4333         {
4334           if (TYPE_POINTER_TO (TREE_TYPE (t)) == t)
4335             TYPE_POINTER_TO (TREE_TYPE (t)) = TYPE_NEXT_PTR_TO (t);
4336           else
4337             {
4338               tree tem = TYPE_POINTER_TO (TREE_TYPE (t));
4339               while (tem && TYPE_NEXT_PTR_TO (tem) != t)
4340                 tem = TYPE_NEXT_PTR_TO (tem);
4341               if (tem)
4342                 TYPE_NEXT_PTR_TO (tem) = TYPE_NEXT_PTR_TO (t);
4343             }
4344           TYPE_NEXT_PTR_TO (t) = NULL_TREE;
4345         }
4346       else if (TREE_CODE (t) == REFERENCE_TYPE)
4347         {
4348           if (TYPE_REFERENCE_TO (TREE_TYPE (t)) == t)
4349             TYPE_REFERENCE_TO (TREE_TYPE (t)) = TYPE_NEXT_REF_TO (t);
4350           else
4351             {
4352               tree tem = TYPE_REFERENCE_TO (TREE_TYPE (t));
4353               while (tem && TYPE_NEXT_REF_TO (tem) != t)
4354                 tem = TYPE_NEXT_REF_TO (tem);
4355               if (tem)
4356                 TYPE_NEXT_REF_TO (tem) = TYPE_NEXT_REF_TO (t);
4357             }
4358           TYPE_NEXT_REF_TO (t) = NULL_TREE;
4359         }
4360
4361       leader->type = t;
4362       leader->leader = new_type;
4363       t = new_type;
4364     }
4365   else
4366     {
4367       leader->type = t;
4368       leader->leader = t;
4369       /* We're the type leader.  Make our TYPE_MAIN_VARIANT valid.  */
4370       if (TYPE_MAIN_VARIANT (t) != t
4371           && TYPE_MAIN_VARIANT (t) != mv_leader)
4372         {
4373           /* Remove us from our main variant list as we are not the variant
4374              leader and the variant leader will change.  */
4375           tree tem = TYPE_MAIN_VARIANT (t);
4376           while (tem && TYPE_NEXT_VARIANT (tem) != t)
4377             tem = TYPE_NEXT_VARIANT (tem);
4378           if (tem)
4379             TYPE_NEXT_VARIANT (tem) = TYPE_NEXT_VARIANT (t);
4380           TYPE_NEXT_VARIANT (t) = NULL_TREE;
4381           /* Adjust our main variant.  Linking us into its variant list
4382              will happen at fixup time.  */
4383           TYPE_MAIN_VARIANT (t) = mv_leader;
4384         }
4385       *slot = (void *) t;
4386     }
4387
4388   return t;
4389 }
4390
4391
4392 /* Returns nonzero if P1 and P2 are equal.  */
4393
4394 static int
4395 gimple_canonical_type_eq (const void *p1, const void *p2)
4396 {
4397   const_tree t1 = (const_tree) p1;
4398   const_tree t2 = (const_tree) p2;
4399   return gimple_types_compatible_p (CONST_CAST_TREE (t1),
4400                                     CONST_CAST_TREE (t2), GTC_DIAG);
4401 }
4402
4403 /* Register type T in the global type table gimple_types.
4404    If another type T', compatible with T, already existed in
4405    gimple_types then return T', otherwise return T.  This is used by
4406    LTO to merge identical types read from different TUs.  */
4407
4408 tree
4409 gimple_register_canonical_type (tree t)
4410 {
4411   void **slot;
4412   tree orig_t = t;
4413
4414   gcc_assert (TYPE_P (t));
4415
4416   if (TYPE_CANONICAL (t))
4417     return TYPE_CANONICAL (t);
4418
4419   /* Always register the type itself first so that if it turns out
4420      to be the canonical type it will be the one we merge to as well.  */
4421   t = gimple_register_type (t);
4422
4423   /* Always register the main variant first.  This is important so we
4424      pick up the non-typedef variants as canonical, otherwise we'll end
4425      up taking typedef ids for structure tags during comparison.  */
4426   if (TYPE_MAIN_VARIANT (t) != t)
4427     gimple_register_canonical_type (TYPE_MAIN_VARIANT (t));
4428
4429   if (gimple_canonical_types == NULL)
4430     gimple_canonical_types = htab_create_ggc (16381, gimple_type_hash,
4431                                               gimple_canonical_type_eq, 0);
4432
4433   slot = htab_find_slot (gimple_canonical_types, t, INSERT);
4434   if (*slot
4435       && *(tree *)slot != t)
4436     {
4437       tree new_type = (tree) *((tree *) slot);
4438
4439       TYPE_CANONICAL (t) = new_type;
4440       t = new_type;
4441     }
4442   else
4443     {
4444       TYPE_CANONICAL (t) = t;
4445       *slot = (void *) t;
4446     }
4447
4448   /* Also cache the canonical type in the non-leaders.  */
4449   TYPE_CANONICAL (orig_t) = t;
4450
4451   return t;
4452 }
4453
4454
4455 /* Show statistics on references to the global type table gimple_types.  */
4456
4457 void
4458 print_gimple_types_stats (void)
4459 {
4460   if (gimple_types)
4461     fprintf (stderr, "GIMPLE type table: size %ld, %ld elements, "
4462              "%ld searches, %ld collisions (ratio: %f)\n",
4463              (long) htab_size (gimple_types),
4464              (long) htab_elements (gimple_types),
4465              (long) gimple_types->searches,
4466              (long) gimple_types->collisions,
4467              htab_collisions (gimple_types));
4468   else
4469     fprintf (stderr, "GIMPLE type table is empty\n");
4470   if (gimple_canonical_types)
4471     fprintf (stderr, "GIMPLE canonical type table: size %ld, %ld elements, "
4472              "%ld searches, %ld collisions (ratio: %f)\n",
4473              (long) htab_size (gimple_canonical_types),
4474              (long) htab_elements (gimple_canonical_types),
4475              (long) gimple_canonical_types->searches,
4476              (long) gimple_canonical_types->collisions,
4477              htab_collisions (gimple_canonical_types));
4478   else
4479     fprintf (stderr, "GIMPLE canonical type table is empty\n");
4480   if (type_hash_cache)
4481     fprintf (stderr, "GIMPLE type hash table: size %ld, %ld elements, "
4482              "%ld searches, %ld collisions (ratio: %f)\n",
4483              (long) htab_size (type_hash_cache),
4484              (long) htab_elements (type_hash_cache),
4485              (long) type_hash_cache->searches,
4486              (long) type_hash_cache->collisions,
4487              htab_collisions (type_hash_cache));
4488   else
4489     fprintf (stderr, "GIMPLE type hash table is empty\n");
4490   if (gtc_visited)
4491     fprintf (stderr, "GIMPLE type comparison table: size %ld, %ld "
4492              "elements, %ld searches, %ld collisions (ratio: %f)\n",
4493              (long) htab_size (gtc_visited),
4494              (long) htab_elements (gtc_visited),
4495              (long) gtc_visited->searches,
4496              (long) gtc_visited->collisions,
4497              htab_collisions (gtc_visited));
4498   else
4499     fprintf (stderr, "GIMPLE type comparison table is empty\n");
4500 }
4501
4502 /* Free the gimple type hashtables used for LTO type merging.  */
4503
4504 void
4505 free_gimple_type_tables (void)
4506 {
4507   /* Last chance to print stats for the tables.  */
4508   if (flag_lto_report)
4509     print_gimple_types_stats ();
4510
4511   if (gimple_types)
4512     {
4513       htab_delete (gimple_types);
4514       gimple_types = NULL;
4515     }
4516   if (gimple_canonical_types)
4517     {
4518       htab_delete (gimple_canonical_types);
4519       gimple_canonical_types = NULL;
4520     }
4521   if (type_hash_cache)
4522     {
4523       htab_delete (type_hash_cache);
4524       type_hash_cache = NULL;
4525     }
4526   if (gtc_visited)
4527     {
4528       htab_delete (gtc_visited);
4529       obstack_free (&gtc_ob, NULL);
4530       gtc_visited = NULL;
4531     }
4532   gimple_type_leader = NULL;
4533 }
4534
4535
4536 /* Return a type the same as TYPE except unsigned or
4537    signed according to UNSIGNEDP.  */
4538
4539 static tree
4540 gimple_signed_or_unsigned_type (bool unsignedp, tree type)
4541 {
4542   tree type1;
4543
4544   type1 = TYPE_MAIN_VARIANT (type);
4545   if (type1 == signed_char_type_node
4546       || type1 == char_type_node
4547       || type1 == unsigned_char_type_node)
4548     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
4549   if (type1 == integer_type_node || type1 == unsigned_type_node)
4550     return unsignedp ? unsigned_type_node : integer_type_node;
4551   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
4552     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
4553   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
4554     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
4555   if (type1 == long_long_integer_type_node
4556       || type1 == long_long_unsigned_type_node)
4557     return unsignedp
4558            ? long_long_unsigned_type_node
4559            : long_long_integer_type_node;
4560   if (int128_integer_type_node && (type1 == int128_integer_type_node || type1 == int128_unsigned_type_node))
4561     return unsignedp
4562            ? int128_unsigned_type_node
4563            : int128_integer_type_node;
4564 #if HOST_BITS_PER_WIDE_INT >= 64
4565   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
4566     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
4567 #endif
4568   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
4569     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
4570   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
4571     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
4572   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
4573     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
4574   if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
4575     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
4576
4577 #define GIMPLE_FIXED_TYPES(NAME)            \
4578   if (type1 == short_ ## NAME ## _type_node \
4579       || type1 == unsigned_short_ ## NAME ## _type_node) \
4580     return unsignedp ? unsigned_short_ ## NAME ## _type_node \
4581                      : short_ ## NAME ## _type_node; \
4582   if (type1 == NAME ## _type_node \
4583       || type1 == unsigned_ ## NAME ## _type_node) \
4584     return unsignedp ? unsigned_ ## NAME ## _type_node \
4585                      : NAME ## _type_node; \
4586   if (type1 == long_ ## NAME ## _type_node \
4587       || type1 == unsigned_long_ ## NAME ## _type_node) \
4588     return unsignedp ? unsigned_long_ ## NAME ## _type_node \
4589                      : long_ ## NAME ## _type_node; \
4590   if (type1 == long_long_ ## NAME ## _type_node \
4591       || type1 == unsigned_long_long_ ## NAME ## _type_node) \
4592     return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
4593                      : long_long_ ## NAME ## _type_node;
4594
4595 #define GIMPLE_FIXED_MODE_TYPES(NAME) \
4596   if (type1 == NAME ## _type_node \
4597       || type1 == u ## NAME ## _type_node) \
4598     return unsignedp ? u ## NAME ## _type_node \
4599                      : NAME ## _type_node;
4600
4601 #define GIMPLE_FIXED_TYPES_SAT(NAME) \
4602   if (type1 == sat_ ## short_ ## NAME ## _type_node \
4603       || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
4604     return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
4605                      : sat_ ## short_ ## NAME ## _type_node; \
4606   if (type1 == sat_ ## NAME ## _type_node \
4607       || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
4608     return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
4609                      : sat_ ## NAME ## _type_node; \
4610   if (type1 == sat_ ## long_ ## NAME ## _type_node \
4611       || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
4612     return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
4613                      : sat_ ## long_ ## NAME ## _type_node; \
4614   if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
4615       || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
4616     return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
4617                      : sat_ ## long_long_ ## NAME ## _type_node;
4618
4619 #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME)       \
4620   if (type1 == sat_ ## NAME ## _type_node \
4621       || type1 == sat_ ## u ## NAME ## _type_node) \
4622     return unsignedp ? sat_ ## u ## NAME ## _type_node \
4623                      : sat_ ## NAME ## _type_node;
4624
4625   GIMPLE_FIXED_TYPES (fract);
4626   GIMPLE_FIXED_TYPES_SAT (fract);
4627   GIMPLE_FIXED_TYPES (accum);
4628   GIMPLE_FIXED_TYPES_SAT (accum);
4629
4630   GIMPLE_FIXED_MODE_TYPES (qq);
4631   GIMPLE_FIXED_MODE_TYPES (hq);
4632   GIMPLE_FIXED_MODE_TYPES (sq);
4633   GIMPLE_FIXED_MODE_TYPES (dq);
4634   GIMPLE_FIXED_MODE_TYPES (tq);
4635   GIMPLE_FIXED_MODE_TYPES_SAT (qq);
4636   GIMPLE_FIXED_MODE_TYPES_SAT (hq);
4637   GIMPLE_FIXED_MODE_TYPES_SAT (sq);
4638   GIMPLE_FIXED_MODE_TYPES_SAT (dq);
4639   GIMPLE_FIXED_MODE_TYPES_SAT (tq);
4640   GIMPLE_FIXED_MODE_TYPES (ha);
4641   GIMPLE_FIXED_MODE_TYPES (sa);
4642   GIMPLE_FIXED_MODE_TYPES (da);
4643   GIMPLE_FIXED_MODE_TYPES (ta);
4644   GIMPLE_FIXED_MODE_TYPES_SAT (ha);
4645   GIMPLE_FIXED_MODE_TYPES_SAT (sa);
4646   GIMPLE_FIXED_MODE_TYPES_SAT (da);
4647   GIMPLE_FIXED_MODE_TYPES_SAT (ta);
4648
4649   /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
4650      the precision; they have precision set to match their range, but
4651      may use a wider mode to match an ABI.  If we change modes, we may
4652      wind up with bad conversions.  For INTEGER_TYPEs in C, must check
4653      the precision as well, so as to yield correct results for
4654      bit-field types.  C++ does not have these separate bit-field
4655      types, and producing a signed or unsigned variant of an
4656      ENUMERAL_TYPE may cause other problems as well.  */
4657   if (!INTEGRAL_TYPE_P (type)
4658       || TYPE_UNSIGNED (type) == unsignedp)
4659     return type;
4660
4661 #define TYPE_OK(node)                                                       \
4662   (TYPE_MODE (type) == TYPE_MODE (node)                                     \
4663    && TYPE_PRECISION (type) == TYPE_PRECISION (node))
4664   if (TYPE_OK (signed_char_type_node))
4665     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
4666   if (TYPE_OK (integer_type_node))
4667     return unsignedp ? unsigned_type_node : integer_type_node;
4668   if (TYPE_OK (short_integer_type_node))
4669     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
4670   if (TYPE_OK (long_integer_type_node))
4671     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
4672   if (TYPE_OK (long_long_integer_type_node))
4673     return (unsignedp
4674             ? long_long_unsigned_type_node
4675             : long_long_integer_type_node);
4676   if (int128_integer_type_node && TYPE_OK (int128_integer_type_node))
4677     return (unsignedp
4678             ? int128_unsigned_type_node
4679             : int128_integer_type_node);
4680
4681 #if HOST_BITS_PER_WIDE_INT >= 64
4682   if (TYPE_OK (intTI_type_node))
4683     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
4684 #endif
4685   if (TYPE_OK (intDI_type_node))
4686     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
4687   if (TYPE_OK (intSI_type_node))
4688     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
4689   if (TYPE_OK (intHI_type_node))
4690     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
4691   if (TYPE_OK (intQI_type_node))
4692     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
4693
4694 #undef GIMPLE_FIXED_TYPES
4695 #undef GIMPLE_FIXED_MODE_TYPES
4696 #undef GIMPLE_FIXED_TYPES_SAT
4697 #undef GIMPLE_FIXED_MODE_TYPES_SAT
4698 #undef TYPE_OK
4699
4700   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
4701 }
4702
4703
4704 /* Return an unsigned type the same as TYPE in other respects.  */
4705
4706 tree
4707 gimple_unsigned_type (tree type)
4708 {
4709   return gimple_signed_or_unsigned_type (true, type);
4710 }
4711
4712
4713 /* Return a signed type the same as TYPE in other respects.  */
4714
4715 tree
4716 gimple_signed_type (tree type)
4717 {
4718   return gimple_signed_or_unsigned_type (false, type);
4719 }
4720
4721
4722 /* Return the typed-based alias set for T, which may be an expression
4723    or a type.  Return -1 if we don't do anything special.  */
4724
4725 alias_set_type
4726 gimple_get_alias_set (tree t)
4727 {
4728   tree u;
4729
4730   /* Permit type-punning when accessing a union, provided the access
4731      is directly through the union.  For example, this code does not
4732      permit taking the address of a union member and then storing
4733      through it.  Even the type-punning allowed here is a GCC
4734      extension, albeit a common and useful one; the C standard says
4735      that such accesses have implementation-defined behavior.  */
4736   for (u = t;
4737        TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
4738        u = TREE_OPERAND (u, 0))
4739     if (TREE_CODE (u) == COMPONENT_REF
4740         && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
4741       return 0;
4742
4743   /* That's all the expressions we handle specially.  */
4744   if (!TYPE_P (t))
4745     return -1;
4746
4747   /* For convenience, follow the C standard when dealing with
4748      character types.  Any object may be accessed via an lvalue that
4749      has character type.  */
4750   if (t == char_type_node
4751       || t == signed_char_type_node
4752       || t == unsigned_char_type_node)
4753     return 0;
4754
4755   /* Allow aliasing between signed and unsigned variants of the same
4756      type.  We treat the signed variant as canonical.  */
4757   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
4758     {
4759       tree t1 = gimple_signed_type (t);
4760
4761       /* t1 == t can happen for boolean nodes which are always unsigned.  */
4762       if (t1 != t)
4763         return get_alias_set (t1);
4764     }
4765
4766   return -1;
4767 }
4768
4769
4770 /* Data structure used to count the number of dereferences to PTR
4771    inside an expression.  */
4772 struct count_ptr_d
4773 {
4774   tree ptr;
4775   unsigned num_stores;
4776   unsigned num_loads;
4777 };
4778
4779 /* Helper for count_uses_and_derefs.  Called by walk_tree to look for
4780    (ALIGN/MISALIGNED_)INDIRECT_REF nodes for the pointer passed in DATA.  */
4781
4782 static tree
4783 count_ptr_derefs (tree *tp, int *walk_subtrees, void *data)
4784 {
4785   struct walk_stmt_info *wi_p = (struct walk_stmt_info *) data;
4786   struct count_ptr_d *count_p = (struct count_ptr_d *) wi_p->info;
4787
4788   /* Do not walk inside ADDR_EXPR nodes.  In the expression &ptr->fld,
4789      pointer 'ptr' is *not* dereferenced, it is simply used to compute
4790      the address of 'fld' as 'ptr + offsetof(fld)'.  */
4791   if (TREE_CODE (*tp) == ADDR_EXPR)
4792     {
4793       *walk_subtrees = 0;
4794       return NULL_TREE;
4795     }
4796
4797   if (TREE_CODE (*tp) == MEM_REF && TREE_OPERAND (*tp, 0) == count_p->ptr)
4798     {
4799       if (wi_p->is_lhs)
4800         count_p->num_stores++;
4801       else
4802         count_p->num_loads++;
4803     }
4804
4805   return NULL_TREE;
4806 }
4807
4808 /* Count the number of direct and indirect uses for pointer PTR in
4809    statement STMT.  The number of direct uses is stored in
4810    *NUM_USES_P.  Indirect references are counted separately depending
4811    on whether they are store or load operations.  The counts are
4812    stored in *NUM_STORES_P and *NUM_LOADS_P.  */
4813
4814 void
4815 count_uses_and_derefs (tree ptr, gimple stmt, unsigned *num_uses_p,
4816                        unsigned *num_loads_p, unsigned *num_stores_p)
4817 {
4818   ssa_op_iter i;
4819   tree use;
4820
4821   *num_uses_p = 0;
4822   *num_loads_p = 0;
4823   *num_stores_p = 0;
4824
4825   /* Find out the total number of uses of PTR in STMT.  */
4826   FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
4827     if (use == ptr)
4828       (*num_uses_p)++;
4829
4830   /* Now count the number of indirect references to PTR.  This is
4831      truly awful, but we don't have much choice.  There are no parent
4832      pointers inside INDIRECT_REFs, so an expression like
4833      '*x_1 = foo (x_1, *x_1)' needs to be traversed piece by piece to
4834      find all the indirect and direct uses of x_1 inside.  The only
4835      shortcut we can take is the fact that GIMPLE only allows
4836      INDIRECT_REFs inside the expressions below.  */
4837   if (is_gimple_assign (stmt)
4838       || gimple_code (stmt) == GIMPLE_RETURN
4839       || gimple_code (stmt) == GIMPLE_ASM
4840       || is_gimple_call (stmt))
4841     {
4842       struct walk_stmt_info wi;
4843       struct count_ptr_d count;
4844
4845       count.ptr = ptr;
4846       count.num_stores = 0;
4847       count.num_loads = 0;
4848
4849       memset (&wi, 0, sizeof (wi));
4850       wi.info = &count;
4851       walk_gimple_op (stmt, count_ptr_derefs, &wi);
4852
4853       *num_stores_p = count.num_stores;
4854       *num_loads_p = count.num_loads;
4855     }
4856
4857   gcc_assert (*num_uses_p >= *num_loads_p + *num_stores_p);
4858 }
4859
4860 /* From a tree operand OP return the base of a load or store operation
4861    or NULL_TREE if OP is not a load or a store.  */
4862
4863 static tree
4864 get_base_loadstore (tree op)
4865 {
4866   while (handled_component_p (op))
4867     op = TREE_OPERAND (op, 0);
4868   if (DECL_P (op)
4869       || INDIRECT_REF_P (op)
4870       || TREE_CODE (op) == MEM_REF
4871       || TREE_CODE (op) == TARGET_MEM_REF)
4872     return op;
4873   return NULL_TREE;
4874 }
4875
4876 /* For the statement STMT call the callbacks VISIT_LOAD, VISIT_STORE and
4877    VISIT_ADDR if non-NULL on loads, store and address-taken operands
4878    passing the STMT, the base of the operand and DATA to it.  The base
4879    will be either a decl, an indirect reference (including TARGET_MEM_REF)
4880    or the argument of an address expression.
4881    Returns the results of these callbacks or'ed.  */
4882
4883 bool
4884 walk_stmt_load_store_addr_ops (gimple stmt, void *data,
4885                                bool (*visit_load)(gimple, tree, void *),
4886                                bool (*visit_store)(gimple, tree, void *),
4887                                bool (*visit_addr)(gimple, tree, void *))
4888 {
4889   bool ret = false;
4890   unsigned i;
4891   if (gimple_assign_single_p (stmt))
4892     {
4893       tree lhs, rhs;
4894       if (visit_store)
4895         {
4896           lhs = get_base_loadstore (gimple_assign_lhs (stmt));
4897           if (lhs)
4898             ret |= visit_store (stmt, lhs, data);
4899         }
4900       rhs = gimple_assign_rhs1 (stmt);
4901       while (handled_component_p (rhs))
4902         rhs = TREE_OPERAND (rhs, 0);
4903       if (visit_addr)
4904         {
4905           if (TREE_CODE (rhs) == ADDR_EXPR)
4906             ret |= visit_addr (stmt, TREE_OPERAND (rhs, 0), data);
4907           else if (TREE_CODE (rhs) == TARGET_MEM_REF
4908                    && TREE_CODE (TMR_BASE (rhs)) == ADDR_EXPR)
4909             ret |= visit_addr (stmt, TREE_OPERAND (TMR_BASE (rhs), 0), data);
4910           else if (TREE_CODE (rhs) == OBJ_TYPE_REF
4911                    && TREE_CODE (OBJ_TYPE_REF_OBJECT (rhs)) == ADDR_EXPR)
4912             ret |= visit_addr (stmt, TREE_OPERAND (OBJ_TYPE_REF_OBJECT (rhs),
4913                                                    0), data);
4914           lhs = gimple_assign_lhs (stmt);
4915           if (TREE_CODE (lhs) == TARGET_MEM_REF
4916               && TREE_CODE (TMR_BASE (lhs)) == ADDR_EXPR)
4917             ret |= visit_addr (stmt, TREE_OPERAND (TMR_BASE (lhs), 0), data);
4918         }
4919       if (visit_load)
4920         {
4921           rhs = get_base_loadstore (rhs);
4922           if (rhs)
4923             ret |= visit_load (stmt, rhs, data);
4924         }
4925     }
4926   else if (visit_addr
4927            && (is_gimple_assign (stmt)
4928                || gimple_code (stmt) == GIMPLE_COND))
4929     {
4930       for (i = 0; i < gimple_num_ops (stmt); ++i)
4931         if (gimple_op (stmt, i)
4932             && TREE_CODE (gimple_op (stmt, i)) == ADDR_EXPR)
4933           ret |= visit_addr (stmt, TREE_OPERAND (gimple_op (stmt, i), 0), data);
4934     }
4935   else if (is_gimple_call (stmt))
4936     {
4937       if (visit_store)
4938         {
4939           tree lhs = gimple_call_lhs (stmt);
4940           if (lhs)
4941             {
4942               lhs = get_base_loadstore (lhs);
4943               if (lhs)
4944                 ret |= visit_store (stmt, lhs, data);
4945             }
4946         }
4947       if (visit_load || visit_addr)
4948         for (i = 0; i < gimple_call_num_args (stmt); ++i)
4949           {
4950             tree rhs = gimple_call_arg (stmt, i);
4951             if (visit_addr
4952                 && TREE_CODE (rhs) == ADDR_EXPR)
4953               ret |= visit_addr (stmt, TREE_OPERAND (rhs, 0), data);
4954             else if (visit_load)
4955               {
4956                 rhs = get_base_loadstore (rhs);
4957                 if (rhs)
4958                   ret |= visit_load (stmt, rhs, data);
4959               }
4960           }
4961       if (visit_addr
4962           && gimple_call_chain (stmt)
4963           && TREE_CODE (gimple_call_chain (stmt)) == ADDR_EXPR)
4964         ret |= visit_addr (stmt, TREE_OPERAND (gimple_call_chain (stmt), 0),
4965                            data);
4966       if (visit_addr
4967           && gimple_call_return_slot_opt_p (stmt)
4968           && gimple_call_lhs (stmt) != NULL_TREE
4969           && TREE_ADDRESSABLE (TREE_TYPE (gimple_call_lhs (stmt))))
4970         ret |= visit_addr (stmt, gimple_call_lhs (stmt), data);
4971     }
4972   else if (gimple_code (stmt) == GIMPLE_ASM)
4973     {
4974       unsigned noutputs;
4975       const char *constraint;
4976       const char **oconstraints;
4977       bool allows_mem, allows_reg, is_inout;
4978       noutputs = gimple_asm_noutputs (stmt);
4979       oconstraints = XALLOCAVEC (const char *, noutputs);
4980       if (visit_store || visit_addr)
4981         for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
4982           {
4983             tree link = gimple_asm_output_op (stmt, i);
4984             tree op = get_base_loadstore (TREE_VALUE (link));
4985             if (op && visit_store)
4986               ret |= visit_store (stmt, op, data);
4987             if (visit_addr)
4988               {
4989                 constraint = TREE_STRING_POINTER
4990                     (TREE_VALUE (TREE_PURPOSE (link)));
4991                 oconstraints[i] = constraint;
4992                 parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
4993                                          &allows_reg, &is_inout);
4994                 if (op && !allows_reg && allows_mem)
4995                   ret |= visit_addr (stmt, op, data);
4996               }
4997           }
4998       if (visit_load || visit_addr)
4999         for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
5000           {
5001             tree link = gimple_asm_input_op (stmt, i);
5002             tree op = TREE_VALUE (link);
5003             if (visit_addr
5004                 && TREE_CODE (op) == ADDR_EXPR)
5005               ret |= visit_addr (stmt, TREE_OPERAND (op, 0), data);
5006             else if (visit_load || visit_addr)
5007               {
5008                 op = get_base_loadstore (op);
5009                 if (op)
5010                   {
5011                     if (visit_load)
5012                       ret |= visit_load (stmt, op, data);
5013                     if (visit_addr)
5014                       {
5015                         constraint = TREE_STRING_POINTER
5016                             (TREE_VALUE (TREE_PURPOSE (link)));
5017                         parse_input_constraint (&constraint, 0, 0, noutputs,
5018                                                 0, oconstraints,
5019                                                 &allows_mem, &allows_reg);
5020                         if (!allows_reg && allows_mem)
5021                           ret |= visit_addr (stmt, op, data);
5022                       }
5023                   }
5024               }
5025           }
5026     }
5027   else if (gimple_code (stmt) == GIMPLE_RETURN)
5028     {
5029       tree op = gimple_return_retval (stmt);
5030       if (op)
5031         {
5032           if (visit_addr
5033               && TREE_CODE (op) == ADDR_EXPR)
5034             ret |= visit_addr (stmt, TREE_OPERAND (op, 0), data);
5035           else if (visit_load)
5036             {
5037               op = get_base_loadstore (op);
5038               if (op)
5039                 ret |= visit_load (stmt, op, data);
5040             }
5041         }
5042     }
5043   else if (visit_addr
5044            && gimple_code (stmt) == GIMPLE_PHI)
5045     {
5046       for (i = 0; i < gimple_phi_num_args (stmt); ++i)
5047         {
5048           tree op = PHI_ARG_DEF (stmt, i);
5049           if (TREE_CODE (op) == ADDR_EXPR)
5050             ret |= visit_addr (stmt, TREE_OPERAND (op, 0), data);
5051         }
5052     }
5053
5054   return ret;
5055 }
5056
5057 /* Like walk_stmt_load_store_addr_ops but with NULL visit_addr.  IPA-CP
5058    should make a faster clone for this case.  */
5059
5060 bool
5061 walk_stmt_load_store_ops (gimple stmt, void *data,
5062                           bool (*visit_load)(gimple, tree, void *),
5063                           bool (*visit_store)(gimple, tree, void *))
5064 {
5065   return walk_stmt_load_store_addr_ops (stmt, data,
5066                                         visit_load, visit_store, NULL);
5067 }
5068
5069 /* Helper for gimple_ior_addresses_taken_1.  */
5070
5071 static bool
5072 gimple_ior_addresses_taken_1 (gimple stmt ATTRIBUTE_UNUSED,
5073                               tree addr, void *data)
5074 {
5075   bitmap addresses_taken = (bitmap)data;
5076   addr = get_base_address (addr);
5077   if (addr
5078       && DECL_P (addr))
5079     {
5080       bitmap_set_bit (addresses_taken, DECL_UID (addr));
5081       return true;
5082     }
5083   return false;
5084 }
5085
5086 /* Set the bit for the uid of all decls that have their address taken
5087    in STMT in the ADDRESSES_TAKEN bitmap.  Returns true if there
5088    were any in this stmt.  */
5089
5090 bool
5091 gimple_ior_addresses_taken (bitmap addresses_taken, gimple stmt)
5092 {
5093   return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
5094                                         gimple_ior_addresses_taken_1);
5095 }
5096
5097
5098 /* Return a printable name for symbol DECL.  */
5099
5100 const char *
5101 gimple_decl_printable_name (tree decl, int verbosity)
5102 {
5103   if (!DECL_NAME (decl))
5104     return NULL;
5105
5106   if (DECL_ASSEMBLER_NAME_SET_P (decl))
5107     {
5108       const char *str, *mangled_str;
5109       int dmgl_opts = DMGL_NO_OPTS;
5110
5111       if (verbosity >= 2)
5112         {
5113           dmgl_opts = DMGL_VERBOSE
5114                       | DMGL_ANSI
5115                       | DMGL_GNU_V3
5116                       | DMGL_RET_POSTFIX;
5117           if (TREE_CODE (decl) == FUNCTION_DECL)
5118             dmgl_opts |= DMGL_PARAMS;
5119         }
5120
5121       mangled_str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5122       str = cplus_demangle_v3 (mangled_str, dmgl_opts);
5123       return (str) ? str : mangled_str;
5124     }
5125
5126   return IDENTIFIER_POINTER (DECL_NAME (decl));
5127 }
5128
5129 /* Return true when STMT is builtins call to CODE.  */
5130
5131 bool
5132 gimple_call_builtin_p (gimple stmt, enum built_in_function code)
5133 {
5134   tree fndecl;
5135   return (is_gimple_call (stmt)
5136           && (fndecl = gimple_call_fndecl (stmt)) != NULL
5137           && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
5138           && DECL_FUNCTION_CODE (fndecl) == code);
5139 }
5140
5141 #include "gt-gimple.h"