OSDN Git Service

Replace tabs with spaces in .texi files.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-sccvn.c
1 /* SCC value numbering for trees
2    Copyright (C) 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Daniel Berlin <dan@dberlin.org>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License 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 "ggc.h"
27 #include "tree.h"
28 #include "basic-block.h"
29 #include "diagnostic.h"
30 #include "tree-inline.h"
31 #include "tree-flow.h"
32 #include "gimple.h"
33 #include "tree-dump.h"
34 #include "timevar.h"
35 #include "fibheap.h"
36 #include "hashtab.h"
37 #include "tree-iterator.h"
38 #include "real.h"
39 #include "alloc-pool.h"
40 #include "tree-pass.h"
41 #include "flags.h"
42 #include "bitmap.h"
43 #include "langhooks.h"
44 #include "cfgloop.h"
45 #include "params.h"
46 #include "tree-ssa-propagate.h"
47 #include "tree-ssa-sccvn.h"
48
49 /* This algorithm is based on the SCC algorithm presented by Keith
50    Cooper and L. Taylor Simpson in "SCC-Based Value numbering"
51    (http://citeseer.ist.psu.edu/41805.html).  In
52    straight line code, it is equivalent to a regular hash based value
53    numbering that is performed in reverse postorder.
54
55    For code with cycles, there are two alternatives, both of which
56    require keeping the hashtables separate from the actual list of
57    value numbers for SSA names.
58
59    1. Iterate value numbering in an RPO walk of the blocks, removing
60    all the entries from the hashtable after each iteration (but
61    keeping the SSA name->value number mapping between iterations).
62    Iterate until it does not change.
63
64    2. Perform value numbering as part of an SCC walk on the SSA graph,
65    iterating only the cycles in the SSA graph until they do not change
66    (using a separate, optimistic hashtable for value numbering the SCC
67    operands).
68
69    The second is not just faster in practice (because most SSA graph
70    cycles do not involve all the variables in the graph), it also has
71    some nice properties.
72
73    One of these nice properties is that when we pop an SCC off the
74    stack, we are guaranteed to have processed all the operands coming from
75    *outside of that SCC*, so we do not need to do anything special to
76    ensure they have value numbers.
77
78    Another nice property is that the SCC walk is done as part of a DFS
79    of the SSA graph, which makes it easy to perform combining and
80    simplifying operations at the same time.
81
82    The code below is deliberately written in a way that makes it easy
83    to separate the SCC walk from the other work it does.
84
85    In order to propagate constants through the code, we track which
86    expressions contain constants, and use those while folding.  In
87    theory, we could also track expressions whose value numbers are
88    replaced, in case we end up folding based on expression
89    identities.
90
91    In order to value number memory, we assign value numbers to vuses.
92    This enables us to note that, for example, stores to the same
93    address of the same value from the same starting memory states are
94    equivalent.
95    TODO:
96
97    1. We can iterate only the changing portions of the SCC's, but
98    I have not seen an SCC big enough for this to be a win.
99    2. If you differentiate between phi nodes for loops and phi nodes
100    for if-then-else, you can properly consider phi nodes in different
101    blocks for equivalence.
102    3. We could value number vuses in more cases, particularly, whole
103    structure copies.
104 */
105
106 /* The set of hashtables and alloc_pool's for their items.  */
107
108 typedef struct vn_tables_s
109 {
110   htab_t nary;
111   htab_t phis;
112   htab_t references;
113   struct obstack nary_obstack;
114   alloc_pool phis_pool;
115   alloc_pool references_pool;
116 } *vn_tables_t;
117
118 static htab_t constant_to_value_id;
119 static bitmap constant_value_ids;
120
121
122 /* Valid hashtables storing information we have proven to be
123    correct.  */
124
125 static vn_tables_t valid_info;
126
127 /* Optimistic hashtables storing information we are making assumptions about
128    during iterations.  */
129
130 static vn_tables_t optimistic_info;
131
132 /* Pointer to the set of hashtables that is currently being used.
133    Should always point to either the optimistic_info, or the
134    valid_info.  */
135
136 static vn_tables_t current_info;
137
138
139 /* Reverse post order index for each basic block.  */
140
141 static int *rpo_numbers;
142
143 #define SSA_VAL(x) (VN_INFO ((x))->valnum)
144
145 /* This represents the top of the VN lattice, which is the universal
146    value.  */
147
148 tree VN_TOP;
149
150 /* Unique counter for our value ids.  */
151
152 static unsigned int next_value_id;
153
154 /* Next DFS number and the stack for strongly connected component
155    detection. */
156
157 static unsigned int next_dfs_num;
158 static VEC (tree, heap) *sccstack;
159
160 static bool may_insert;
161
162
163 DEF_VEC_P(vn_ssa_aux_t);
164 DEF_VEC_ALLOC_P(vn_ssa_aux_t, heap);
165
166 /* Table of vn_ssa_aux_t's, one per ssa_name.  The vn_ssa_aux_t objects
167    are allocated on an obstack for locality reasons, and to free them
168    without looping over the VEC.  */
169
170 static VEC (vn_ssa_aux_t, heap) *vn_ssa_aux_table;
171 static struct obstack vn_ssa_aux_obstack;
172
173 /* Return the value numbering information for a given SSA name.  */
174
175 vn_ssa_aux_t
176 VN_INFO (tree name)
177 {
178   vn_ssa_aux_t res = VEC_index (vn_ssa_aux_t, vn_ssa_aux_table,
179                                 SSA_NAME_VERSION (name));
180   gcc_assert (res);
181   return res;
182 }
183
184 /* Set the value numbering info for a given SSA name to a given
185    value.  */
186
187 static inline void
188 VN_INFO_SET (tree name, vn_ssa_aux_t value)
189 {
190   VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
191                SSA_NAME_VERSION (name), value);
192 }
193
194 /* Initialize the value numbering info for a given SSA name.
195    This should be called just once for every SSA name.  */
196
197 vn_ssa_aux_t
198 VN_INFO_GET (tree name)
199 {
200   vn_ssa_aux_t newinfo;
201
202   newinfo = XOBNEW (&vn_ssa_aux_obstack, struct vn_ssa_aux);
203   memset (newinfo, 0, sizeof (struct vn_ssa_aux));
204   if (SSA_NAME_VERSION (name) >= VEC_length (vn_ssa_aux_t, vn_ssa_aux_table))
205     VEC_safe_grow (vn_ssa_aux_t, heap, vn_ssa_aux_table,
206                    SSA_NAME_VERSION (name) + 1);
207   VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
208                SSA_NAME_VERSION (name), newinfo);
209   return newinfo;
210 }
211
212
213 /* Get the representative expression for the SSA_NAME NAME.  Returns
214    the representative SSA_NAME if there is no expression associated with it.  */
215
216 tree
217 vn_get_expr_for (tree name)
218 {
219   vn_ssa_aux_t vn = VN_INFO (name);
220   gimple def_stmt;
221   tree expr = NULL_TREE;
222
223   if (vn->valnum == VN_TOP)
224     return name;
225
226   /* If the value-number is a constant it is the representative
227      expression.  */
228   if (TREE_CODE (vn->valnum) != SSA_NAME)
229     return vn->valnum;
230
231   /* Get to the information of the value of this SSA_NAME.  */
232   vn = VN_INFO (vn->valnum);
233
234   /* If the value-number is a constant it is the representative
235      expression.  */
236   if (TREE_CODE (vn->valnum) != SSA_NAME)
237     return vn->valnum;
238
239   /* Else if we have an expression, return it.  */
240   if (vn->expr != NULL_TREE)
241     return vn->expr;
242
243   /* Otherwise use the defining statement to build the expression.  */
244   def_stmt = SSA_NAME_DEF_STMT (vn->valnum);
245
246   /* If the value number is a default-definition or a PHI result
247      use it directly.  */
248   if (gimple_nop_p (def_stmt)
249       || gimple_code (def_stmt) == GIMPLE_PHI)
250     return vn->valnum;
251
252   if (!is_gimple_assign (def_stmt))
253     return vn->valnum;
254
255   /* FIXME tuples.  This is incomplete and likely will miss some
256      simplifications.  */
257   switch (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)))
258     {
259     case tcc_reference:
260       if ((gimple_assign_rhs_code (def_stmt) == VIEW_CONVERT_EXPR
261            || gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
262            || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR)
263           && TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME)
264         expr = fold_build1 (gimple_assign_rhs_code (def_stmt),
265                             gimple_expr_type (def_stmt),
266                             TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0));
267       break;
268
269     case tcc_unary:
270       expr = fold_build1 (gimple_assign_rhs_code (def_stmt),
271                           gimple_expr_type (def_stmt),
272                           gimple_assign_rhs1 (def_stmt));
273       break;
274
275     case tcc_binary:
276       expr = fold_build2 (gimple_assign_rhs_code (def_stmt),
277                           gimple_expr_type (def_stmt),
278                           gimple_assign_rhs1 (def_stmt),
279                           gimple_assign_rhs2 (def_stmt));
280       break;
281
282     default:;
283     }
284   if (expr == NULL_TREE)
285     return vn->valnum;
286
287   /* Cache the expression.  */
288   vn->expr = expr;
289
290   return expr;
291 }
292
293
294 /* Free a phi operation structure VP.  */
295
296 static void
297 free_phi (void *vp)
298 {
299   vn_phi_t phi = (vn_phi_t) vp;
300   VEC_free (tree, heap, phi->phiargs);
301 }
302
303 /* Free a reference operation structure VP.  */
304
305 static void
306 free_reference (void *vp)
307 {
308   vn_reference_t vr = (vn_reference_t) vp;
309   VEC_free (vn_reference_op_s, heap, vr->operands);
310 }
311
312 /* Hash table equality function for vn_constant_t.  */
313
314 static int
315 vn_constant_eq (const void *p1, const void *p2)
316 {
317   const struct vn_constant_s *vc1 = (const struct vn_constant_s *) p1;
318   const struct vn_constant_s *vc2 = (const struct vn_constant_s *) p2;
319
320   if (vc1->hashcode != vc2->hashcode)
321     return false;
322
323   return vn_constant_eq_with_type (vc1->constant, vc2->constant);
324 }
325
326 /* Hash table hash function for vn_constant_t.  */
327
328 static hashval_t
329 vn_constant_hash (const void *p1)
330 {
331   const struct vn_constant_s *vc1 = (const struct vn_constant_s *) p1;
332   return vc1->hashcode;
333 }
334
335 /* Lookup a value id for CONSTANT and return it.  If it does not
336    exist returns 0.  */
337
338 unsigned int
339 get_constant_value_id (tree constant)
340 {
341   void **slot;
342   struct vn_constant_s vc;
343
344   vc.hashcode = vn_hash_constant_with_type (constant);
345   vc.constant = constant;
346   slot = htab_find_slot_with_hash (constant_to_value_id, &vc,
347                                    vc.hashcode, NO_INSERT);
348   if (slot)
349     return ((vn_constant_t)*slot)->value_id;
350   return 0;
351 }
352
353 /* Lookup a value id for CONSTANT, and if it does not exist, create a
354    new one and return it.  If it does exist, return it.  */
355
356 unsigned int
357 get_or_alloc_constant_value_id (tree constant)
358 {
359   void **slot;
360   vn_constant_t vc = XNEW (struct vn_constant_s);
361
362   vc->hashcode = vn_hash_constant_with_type (constant);
363   vc->constant = constant;
364   slot = htab_find_slot_with_hash (constant_to_value_id, vc,
365                                    vc->hashcode, INSERT);
366   if (*slot)
367     {
368       free (vc);
369       return ((vn_constant_t)*slot)->value_id;
370     }
371   vc->value_id = get_next_value_id ();
372   *slot = vc;
373   bitmap_set_bit (constant_value_ids, vc->value_id);
374   return vc->value_id;
375 }
376
377 /* Return true if V is a value id for a constant.  */
378
379 bool
380 value_id_constant_p (unsigned int v)
381 {
382   return bitmap_bit_p (constant_value_ids, v);
383 }
384
385 /* Compare two reference operands P1 and P2 for equality.  Return true if
386    they are equal, and false otherwise.  */
387
388 static int
389 vn_reference_op_eq (const void *p1, const void *p2)
390 {
391   const_vn_reference_op_t const vro1 = (const_vn_reference_op_t) p1;
392   const_vn_reference_op_t const vro2 = (const_vn_reference_op_t) p2;
393
394   return vro1->opcode == vro2->opcode
395     && types_compatible_p (vro1->type, vro2->type)
396     && expressions_equal_p (vro1->op0, vro2->op0)
397     && expressions_equal_p (vro1->op1, vro2->op1)
398     && expressions_equal_p (vro1->op2, vro2->op2);
399 }
400
401 /* Compute the hash for a reference operand VRO1.  */
402
403 static hashval_t
404 vn_reference_op_compute_hash (const vn_reference_op_t vro1)
405 {
406   hashval_t result = 0;
407   if (vro1->op0)
408     result += iterative_hash_expr (vro1->op0, vro1->opcode);
409   if (vro1->op1)
410     result += iterative_hash_expr (vro1->op1, vro1->opcode);
411   if (vro1->op2)
412     result += iterative_hash_expr (vro1->op2, vro1->opcode);
413   return result;
414 }
415
416 /* Return the hashcode for a given reference operation P1.  */
417
418 static hashval_t
419 vn_reference_hash (const void *p1)
420 {
421   const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
422   return vr1->hashcode;
423 }
424
425 /* Compute a hash for the reference operation VR1 and return it.  */
426
427 hashval_t
428 vn_reference_compute_hash (const vn_reference_t vr1)
429 {
430   hashval_t result;
431   int i;
432   vn_reference_op_t vro;
433
434   result = iterative_hash_expr (vr1->vuse, 0);
435   for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
436     result += vn_reference_op_compute_hash (vro);
437
438   return result;
439 }
440
441 /* Return true if reference operations P1 and P2 are equivalent.  This
442    means they have the same set of operands and vuses.  */
443
444 int
445 vn_reference_eq (const void *p1, const void *p2)
446 {
447   int i;
448   vn_reference_op_t vro;
449
450   const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
451   const_vn_reference_t const vr2 = (const_vn_reference_t) p2;
452   if (vr1->hashcode != vr2->hashcode)
453     return false;
454
455   /* Early out if this is not a hash collision.  */
456   if (vr1->hashcode != vr2->hashcode)
457     return false;
458
459   /* The VOP needs to be the same.  */
460   if (vr1->vuse != vr2->vuse)
461     return false;
462
463   /* If the operands are the same we are done.  */
464   if (vr1->operands == vr2->operands)
465     return true;
466
467   /* We require that address operands be canonicalized in a way that
468      two memory references will have the same operands if they are
469      equivalent.  */
470   if (VEC_length (vn_reference_op_s, vr1->operands)
471       != VEC_length (vn_reference_op_s, vr2->operands))
472     return false;
473
474   for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
475     if (!vn_reference_op_eq (VEC_index (vn_reference_op_s, vr2->operands, i),
476                              vro))
477       return false;
478
479   return true;
480 }
481
482 /* Copy the operations present in load/store REF into RESULT, a vector of
483    vn_reference_op_s's.  */
484
485 void
486 copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
487 {
488   if (TREE_CODE (ref) == TARGET_MEM_REF)
489     {
490       vn_reference_op_s temp;
491       tree base;
492
493       base = TMR_SYMBOL (ref) ? TMR_SYMBOL (ref) : TMR_BASE (ref);
494       if (!base)
495         base = build_int_cst (ptr_type_node, 0);
496
497       memset (&temp, 0, sizeof (temp));
498       /* We do not care for spurious type qualifications.  */
499       temp.type = TYPE_MAIN_VARIANT (TREE_TYPE (ref));
500       temp.opcode = TREE_CODE (ref);
501       temp.op0 = TMR_INDEX (ref);
502       temp.op1 = TMR_STEP (ref);
503       temp.op2 = TMR_OFFSET (ref);
504       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
505
506       memset (&temp, 0, sizeof (temp));
507       temp.type = NULL_TREE;
508       temp.opcode = TREE_CODE (base);
509       temp.op0 = base;
510       temp.op1 = TMR_ORIGINAL (ref);
511       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
512       return;
513     }
514
515   /* For non-calls, store the information that makes up the address.  */
516
517   while (ref)
518     {
519       vn_reference_op_s temp;
520
521       memset (&temp, 0, sizeof (temp));
522       /* We do not care for spurious type qualifications.  */
523       temp.type = TYPE_MAIN_VARIANT (TREE_TYPE (ref));
524       temp.opcode = TREE_CODE (ref);
525
526       switch (temp.opcode)
527         {
528         case ALIGN_INDIRECT_REF:
529         case INDIRECT_REF:
530           /* The only operand is the address, which gets its own
531              vn_reference_op_s structure.  */
532           break;
533         case MISALIGNED_INDIRECT_REF:
534           temp.op0 = TREE_OPERAND (ref, 1);
535           break;
536         case BIT_FIELD_REF:
537           /* Record bits and position.  */
538           temp.op0 = TREE_OPERAND (ref, 1);
539           temp.op1 = TREE_OPERAND (ref, 2);
540           break;
541         case COMPONENT_REF:
542           /* The field decl is enough to unambiguously specify the field,
543              a matching type is not necessary and a mismatching type
544              is always a spurious difference.  */
545           temp.type = NULL_TREE;
546           temp.op0 = TREE_OPERAND (ref, 1);
547           temp.op1 = TREE_OPERAND (ref, 2);
548           /* If this is a reference to a union member, record the union
549              member size as operand.  Do so only if we are doing
550              expression insertion (during FRE), as PRE currently gets
551              confused with this.  */
552           if (may_insert
553               && temp.op1 == NULL_TREE
554               && TREE_CODE (DECL_CONTEXT (temp.op0)) == UNION_TYPE
555               && integer_zerop (DECL_FIELD_OFFSET (temp.op0))
556               && integer_zerop (DECL_FIELD_BIT_OFFSET (temp.op0))
557               && host_integerp (DECL_SIZE (temp.op0), 0))
558             temp.op0 = DECL_SIZE (temp.op0);
559           break;
560         case ARRAY_RANGE_REF:
561         case ARRAY_REF:
562           /* Record index as operand.  */
563           temp.op0 = TREE_OPERAND (ref, 1);
564           /* Always record lower bounds and element size.  */
565           temp.op1 = array_ref_low_bound (ref);
566           temp.op2 = array_ref_element_size (ref);
567           break;
568         case STRING_CST:
569         case INTEGER_CST:
570         case COMPLEX_CST:
571         case VECTOR_CST:
572         case REAL_CST:
573         case CONSTRUCTOR:
574         case VAR_DECL:
575         case PARM_DECL:
576         case CONST_DECL:
577         case RESULT_DECL:
578         case SSA_NAME:
579           temp.op0 = ref;
580           break;
581         case ADDR_EXPR:
582           if (is_gimple_min_invariant (ref))
583             {
584               temp.op0 = ref;
585               break;
586             }
587           /* Fallthrough.  */
588           /* These are only interesting for their operands, their
589              existence, and their type.  They will never be the last
590              ref in the chain of references (IE they require an
591              operand), so we don't have to put anything
592              for op* as it will be handled by the iteration  */
593         case IMAGPART_EXPR:
594         case REALPART_EXPR:
595         case VIEW_CONVERT_EXPR:
596           break;
597         default:
598           gcc_unreachable ();
599         }
600       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
601
602       if (REFERENCE_CLASS_P (ref)
603           || (TREE_CODE (ref) == ADDR_EXPR
604               && !is_gimple_min_invariant (ref)))
605         ref = TREE_OPERAND (ref, 0);
606       else
607         ref = NULL_TREE;
608     }
609 }
610
611 /* Build a alias-oracle reference abstraction in *REF from the vn_reference
612    operands in *OPS, the reference alias set SET and the reference type TYPE.
613    Return true if something useful was produced.  */
614
615 bool
616 ao_ref_init_from_vn_reference (ao_ref *ref,
617                                alias_set_type set, tree type,
618                                VEC (vn_reference_op_s, heap) *ops)
619 {
620   vn_reference_op_t op;
621   unsigned i;
622   tree base = NULL_TREE;
623   tree *op0_p = &base;
624   HOST_WIDE_INT offset = 0;
625   HOST_WIDE_INT max_size;
626   HOST_WIDE_INT size = -1;
627   tree size_tree = NULL_TREE;
628
629   /* First get the final access size from just the outermost expression.  */
630   op = VEC_index (vn_reference_op_s, ops, 0);
631   if (op->opcode == COMPONENT_REF)
632     {
633       if (TREE_CODE (op->op0) == INTEGER_CST)
634         size_tree = op->op0;
635       else
636         size_tree = DECL_SIZE (op->op0);
637     }
638   else if (op->opcode == BIT_FIELD_REF)
639     size_tree = op->op0;
640   else
641     {
642       enum machine_mode mode = TYPE_MODE (type);
643       if (mode == BLKmode)
644         size_tree = TYPE_SIZE (type);
645       else
646         size = GET_MODE_BITSIZE (mode);
647     }
648   if (size_tree != NULL_TREE)
649     {
650       if (!host_integerp (size_tree, 1))
651         size = -1;
652       else
653         size = TREE_INT_CST_LOW (size_tree);
654     }
655
656   /* Initially, maxsize is the same as the accessed element size.
657      In the following it will only grow (or become -1).  */
658   max_size = size;
659
660   /* Compute cumulative bit-offset for nested component-refs and array-refs,
661      and find the ultimate containing object.  */
662   for (i = 0; VEC_iterate (vn_reference_op_s, ops, i, op); ++i)
663     {
664       switch (op->opcode)
665         {
666         /* These may be in the reference ops, but we cannot do anything
667            sensible with them here.  */
668         case CALL_EXPR:
669         case ADDR_EXPR:
670           return false;
671
672         /* Record the base objects.  */
673         case ALIGN_INDIRECT_REF:
674         case INDIRECT_REF:
675           *op0_p = build1 (op->opcode, op->type, NULL_TREE);
676           op0_p = &TREE_OPERAND (*op0_p, 0);
677           break;
678
679         case MISALIGNED_INDIRECT_REF:
680           *op0_p = build2 (MISALIGNED_INDIRECT_REF, op->type,
681                            NULL_TREE, op->op0);
682           op0_p = &TREE_OPERAND (*op0_p, 0);
683           break;
684
685         case VAR_DECL:
686         case PARM_DECL:
687         case RESULT_DECL:
688         case SSA_NAME:
689           *op0_p = op->op0;
690           break;
691
692         /* And now the usual component-reference style ops.  */
693         case BIT_FIELD_REF:
694           offset += tree_low_cst (op->op1, 0);
695           break;
696
697         case COMPONENT_REF:
698           {
699             tree field = op->op0;
700             /* We do not have a complete COMPONENT_REF tree here so we
701                cannot use component_ref_field_offset.  Do the interesting
702                parts manually.  */
703
704             /* Our union trick, done for offset zero only.  */
705             if (TREE_CODE (field) == INTEGER_CST)
706               ;
707             else if (op->op1
708                      || !host_integerp (DECL_FIELD_OFFSET (field), 1))
709               max_size = -1;
710             else
711               {
712                 offset += (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (field))
713                            * BITS_PER_UNIT);
714                 offset += TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field));
715               }
716             break;
717           }
718
719         case ARRAY_RANGE_REF:
720         case ARRAY_REF:
721           /* We recorded the lower bound and the element size.  */
722           if (!host_integerp (op->op0, 0)
723               || !host_integerp (op->op1, 0)
724               || !host_integerp (op->op2, 0))
725             max_size = -1;
726           else
727             {
728               HOST_WIDE_INT hindex = TREE_INT_CST_LOW (op->op0);
729               hindex -= TREE_INT_CST_LOW (op->op1);
730               hindex *= TREE_INT_CST_LOW (op->op2);
731               hindex *= BITS_PER_UNIT;
732               offset += hindex;
733             }
734           break;
735
736         case REALPART_EXPR:
737           break;
738
739         case IMAGPART_EXPR:
740           offset += size;
741           break;
742
743         case VIEW_CONVERT_EXPR:
744           break;
745
746         case STRING_CST:
747         case INTEGER_CST:
748         case COMPLEX_CST:
749         case VECTOR_CST:
750         case REAL_CST:
751         case CONSTRUCTOR:
752         case CONST_DECL:
753           return false;
754
755         default:
756           return false;
757         }
758     }
759
760   if (base == NULL_TREE)
761     return false;
762
763   ref->ref = NULL_TREE;
764   ref->base = base;
765   ref->offset = offset;
766   ref->size = size;
767   ref->max_size = max_size;
768   ref->ref_alias_set = set;
769   ref->base_alias_set = -1;
770
771   return true;
772 }
773
774 /* Copy the operations present in load/store/call REF into RESULT, a vector of
775    vn_reference_op_s's.  */
776
777 void
778 copy_reference_ops_from_call (gimple call,
779                               VEC(vn_reference_op_s, heap) **result)
780 {
781   vn_reference_op_s temp;
782   unsigned i;
783
784   /* Copy the type, opcode, function being called and static chain.  */
785   memset (&temp, 0, sizeof (temp));
786   temp.type = gimple_call_return_type (call);
787   temp.opcode = CALL_EXPR;
788   temp.op0 = gimple_call_fn (call);
789   temp.op1 = gimple_call_chain (call);
790   VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
791
792   /* Copy the call arguments.  As they can be references as well,
793      just chain them together.  */
794   for (i = 0; i < gimple_call_num_args (call); ++i)
795     {
796       tree callarg = gimple_call_arg (call, i);
797       copy_reference_ops_from_ref (callarg, result);
798     }
799 }
800
801 /* Create a vector of vn_reference_op_s structures from REF, a
802    REFERENCE_CLASS_P tree.  The vector is not shared. */
803
804 static VEC(vn_reference_op_s, heap) *
805 create_reference_ops_from_ref (tree ref)
806 {
807   VEC (vn_reference_op_s, heap) *result = NULL;
808
809   copy_reference_ops_from_ref (ref, &result);
810   return result;
811 }
812
813 /* Create a vector of vn_reference_op_s structures from CALL, a
814    call statement.  The vector is not shared.  */
815
816 static VEC(vn_reference_op_s, heap) *
817 create_reference_ops_from_call (gimple call)
818 {
819   VEC (vn_reference_op_s, heap) *result = NULL;
820
821   copy_reference_ops_from_call (call, &result);
822   return result;
823 }
824
825 /* Fold *& at position *I_P in a vn_reference_op_s vector *OPS.  Updates
826    *I_P to point to the last element of the replacement.  */
827 void
828 vn_reference_fold_indirect (VEC (vn_reference_op_s, heap) **ops,
829                             unsigned int *i_p)
830 {
831   VEC(vn_reference_op_s, heap) *mem = NULL;
832   vn_reference_op_t op;
833   unsigned int i = *i_p;
834   unsigned int j;
835
836   /* Get ops for the addressed object.  */
837   op = VEC_index (vn_reference_op_s, *ops, i);
838   /* ???  If this is our usual typeof &ARRAY vs. &ARRAY[0] problem, work
839      around it to avoid later ICEs.  */
840   if (TREE_CODE (TREE_TYPE (TREE_OPERAND (op->op0, 0))) == ARRAY_TYPE
841       && TREE_CODE (TREE_TYPE (TREE_TYPE (op->op0))) != ARRAY_TYPE)
842     {
843       vn_reference_op_s aref;
844       tree dom;
845       aref.type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (op->op0)));
846       aref.opcode = ARRAY_REF;
847       aref.op0 = integer_zero_node;
848       if ((dom = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (op->op0, 0))))
849           && TYPE_MIN_VALUE (dom))
850         aref.op0 = TYPE_MIN_VALUE (dom);
851       aref.op1 = aref.op0;
852       aref.op2 = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (op->op0)));
853       VEC_safe_push (vn_reference_op_s, heap, mem, &aref);
854     }
855   copy_reference_ops_from_ref (TREE_OPERAND (op->op0, 0), &mem);
856
857   /* Do the replacement - we should have at least one op in mem now.  */
858   if (VEC_length (vn_reference_op_s, mem) == 1)
859     {
860       VEC_replace (vn_reference_op_s, *ops, i - 1,
861                    VEC_index (vn_reference_op_s, mem, 0));
862       VEC_ordered_remove (vn_reference_op_s, *ops, i);
863       i--;
864     }
865   else if (VEC_length (vn_reference_op_s, mem) == 2)
866     {
867       VEC_replace (vn_reference_op_s, *ops, i - 1,
868                    VEC_index (vn_reference_op_s, mem, 0));
869       VEC_replace (vn_reference_op_s, *ops, i,
870                    VEC_index (vn_reference_op_s, mem, 1));
871     }
872   else if (VEC_length (vn_reference_op_s, mem) > 2)
873     {
874       VEC_replace (vn_reference_op_s, *ops, i - 1,
875                    VEC_index (vn_reference_op_s, mem, 0));
876       VEC_replace (vn_reference_op_s, *ops, i,
877                    VEC_index (vn_reference_op_s, mem, 1));
878       /* ???  There is no VEC_splice.  */
879       for (j = 2; VEC_iterate (vn_reference_op_s, mem, j, op); j++)
880         VEC_safe_insert (vn_reference_op_s, heap, *ops, ++i, op);
881     }
882   else
883     gcc_unreachable ();
884
885   VEC_free (vn_reference_op_s, heap, mem);
886   *i_p = i;
887 }
888
889 /* Transform any SSA_NAME's in a vector of vn_reference_op_s
890    structures into their value numbers.  This is done in-place, and
891    the vector passed in is returned.  */
892
893 static VEC (vn_reference_op_s, heap) *
894 valueize_refs (VEC (vn_reference_op_s, heap) *orig)
895 {
896   vn_reference_op_t vro;
897   unsigned int i;
898
899   for (i = 0; VEC_iterate (vn_reference_op_s, orig, i, vro); i++)
900     {
901       if (vro->opcode == SSA_NAME
902           || (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME))
903         {
904           vro->op0 = SSA_VAL (vro->op0);
905           /* If it transforms from an SSA_NAME to a constant, update
906              the opcode.  */
907           if (TREE_CODE (vro->op0) != SSA_NAME && vro->opcode == SSA_NAME)
908             vro->opcode = TREE_CODE (vro->op0);
909           /* If it transforms from an SSA_NAME to an address, fold with
910              a preceding indirect reference.  */
911           if (i > 0 && TREE_CODE (vro->op0) == ADDR_EXPR
912               && VEC_index (vn_reference_op_s,
913                             orig, i - 1)->opcode == INDIRECT_REF)
914             {
915               vn_reference_fold_indirect (&orig, &i);
916               continue;
917             }
918         }
919       if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
920         vro->op1 = SSA_VAL (vro->op1);
921       if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
922         vro->op2 = SSA_VAL (vro->op2);
923     }
924
925   return orig;
926 }
927
928 static VEC(vn_reference_op_s, heap) *shared_lookup_references;
929
930 /* Create a vector of vn_reference_op_s structures from REF, a
931    REFERENCE_CLASS_P tree.  The vector is shared among all callers of
932    this function.  */
933
934 static VEC(vn_reference_op_s, heap) *
935 valueize_shared_reference_ops_from_ref (tree ref)
936 {
937   if (!ref)
938     return NULL;
939   VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
940   copy_reference_ops_from_ref (ref, &shared_lookup_references);
941   shared_lookup_references = valueize_refs (shared_lookup_references);
942   return shared_lookup_references;
943 }
944
945 /* Create a vector of vn_reference_op_s structures from CALL, a
946    call statement.  The vector is shared among all callers of
947    this function.  */
948
949 static VEC(vn_reference_op_s, heap) *
950 valueize_shared_reference_ops_from_call (gimple call)
951 {
952   if (!call)
953     return NULL;
954   VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
955   copy_reference_ops_from_call (call, &shared_lookup_references);
956   shared_lookup_references = valueize_refs (shared_lookup_references);
957   return shared_lookup_references;
958 }
959
960 /* Lookup a SCCVN reference operation VR in the current hash table.
961    Returns the resulting value number if it exists in the hash table,
962    NULL_TREE otherwise.  VNRESULT will be filled in with the actual
963    vn_reference_t stored in the hashtable if something is found.  */
964
965 static tree
966 vn_reference_lookup_1 (vn_reference_t vr, vn_reference_t *vnresult)
967 {
968   void **slot;
969   hashval_t hash;
970
971   hash = vr->hashcode;
972   slot = htab_find_slot_with_hash (current_info->references, vr,
973                                    hash, NO_INSERT);
974   if (!slot && current_info == optimistic_info)
975     slot = htab_find_slot_with_hash (valid_info->references, vr,
976                                      hash, NO_INSERT);
977   if (slot)
978     {
979       if (vnresult)
980         *vnresult = (vn_reference_t)*slot;
981       return ((vn_reference_t)*slot)->result;
982     }
983
984   return NULL_TREE;
985 }
986
987 /* Callback for walk_non_aliased_vuses.  Adjusts the vn_reference_t VR_
988    with the current VUSE and performs the expression lookup.  */
989
990 static void *
991 vn_reference_lookup_2 (ao_ref *op ATTRIBUTE_UNUSED, tree vuse, void *vr_)
992 {
993   vn_reference_t vr = (vn_reference_t)vr_;
994   void **slot;
995   hashval_t hash;
996
997   /* Fixup vuse and hash.  */
998   vr->hashcode = vr->hashcode - iterative_hash_expr (vr->vuse, 0);
999   vr->vuse = SSA_VAL (vuse);
1000   vr->hashcode = vr->hashcode + iterative_hash_expr (vr->vuse, 0);
1001
1002   hash = vr->hashcode;
1003   slot = htab_find_slot_with_hash (current_info->references, vr,
1004                                    hash, NO_INSERT);
1005   if (!slot && current_info == optimistic_info)
1006     slot = htab_find_slot_with_hash (valid_info->references, vr,
1007                                      hash, NO_INSERT);
1008   if (slot)
1009     return *slot;
1010
1011   return NULL;
1012 }
1013
1014 /* Callback for walk_non_aliased_vuses.  Tries to perform a lookup
1015    from the statement defining VUSE and if not successful tries to
1016    translate *REFP and VR_ through an aggregate copy at the defintion
1017    of VUSE.  */
1018
1019 static void *
1020 vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
1021 {
1022   vn_reference_t vr = (vn_reference_t)vr_;
1023   gimple def_stmt = SSA_NAME_DEF_STMT (vuse);
1024   tree fndecl;
1025   tree base;
1026   HOST_WIDE_INT offset, maxsize;
1027
1028   base = ao_ref_base (ref);
1029   offset = ref->offset;
1030   maxsize = ref->max_size;
1031
1032   /* If we cannot constrain the size of the reference we cannot
1033      test if anything kills it.  */
1034   if (maxsize == -1)
1035     return (void *)-1;
1036
1037   /* def_stmt may-defs *ref.  See if we can derive a value for *ref
1038      from that defintion.
1039      1) Memset.  */
1040   if (is_gimple_reg_type (vr->type)
1041       && is_gimple_call (def_stmt)
1042       && (fndecl = gimple_call_fndecl (def_stmt))
1043       && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
1044       && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET
1045       && integer_zerop (gimple_call_arg (def_stmt, 1))
1046       && host_integerp (gimple_call_arg (def_stmt, 2), 1)
1047       && TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR)
1048     {
1049       tree ref2 = TREE_OPERAND (gimple_call_arg (def_stmt, 0), 0);
1050       tree base2;
1051       HOST_WIDE_INT offset2, size2, maxsize2;
1052       base2 = get_ref_base_and_extent (ref2, &offset2, &size2, &maxsize2);
1053       size2 = TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) * 8;
1054       if ((unsigned HOST_WIDE_INT)size2 / 8
1055           == TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2))
1056           && operand_equal_p (base, base2, 0)
1057           && offset2 <= offset
1058           && offset2 + size2 >= offset + maxsize)
1059         {
1060           tree val = fold_convert (vr->type, integer_zero_node);
1061           unsigned int value_id = get_or_alloc_constant_value_id (val);
1062           return vn_reference_insert_pieces (vuse, vr->set, vr->type,
1063                                              VEC_copy (vn_reference_op_s,
1064                                                        heap, vr->operands),
1065                                              val, value_id);
1066         }
1067     }
1068
1069   /* 2) Assignment from an empty CONSTRUCTOR.  */
1070   else if (is_gimple_reg_type (vr->type)
1071            && gimple_assign_single_p (def_stmt)
1072            && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR
1073            && CONSTRUCTOR_NELTS (gimple_assign_rhs1 (def_stmt)) == 0)
1074     {
1075       tree base2;
1076       HOST_WIDE_INT offset2, size2, maxsize2;
1077       base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
1078                                        &offset2, &size2, &maxsize2);
1079       if (operand_equal_p (base, base2, 0)
1080           && offset2 <= offset
1081           && offset2 + size2 >= offset + maxsize)
1082         {
1083           tree val = fold_convert (vr->type, integer_zero_node);
1084           unsigned int value_id = get_or_alloc_constant_value_id (val);
1085           return vn_reference_insert_pieces (vuse, vr->set, vr->type,
1086                                              VEC_copy (vn_reference_op_s,
1087                                                        heap, vr->operands),
1088                                              val, value_id);
1089         }
1090     }
1091
1092   /* For aggregate copies translate the reference through them if
1093      the copy kills ref.  */
1094   else if (gimple_assign_single_p (def_stmt)
1095            && (DECL_P (gimple_assign_rhs1 (def_stmt))
1096                || INDIRECT_REF_P (gimple_assign_rhs1 (def_stmt))
1097                || handled_component_p (gimple_assign_rhs1 (def_stmt))))
1098     {
1099       tree base2;
1100       HOST_WIDE_INT offset2, size2, maxsize2;
1101       int i, j;
1102       VEC (vn_reference_op_s, heap) *lhs = NULL, *rhs = NULL;
1103       vn_reference_op_t vro;
1104       ao_ref r;
1105
1106       /* See if the assignment kills REF.  */
1107       base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
1108                                        &offset2, &size2, &maxsize2);
1109       if (!operand_equal_p (base, base2, 0)
1110           || offset2 > offset
1111           || offset2 + size2 < offset + maxsize)
1112         return (void *)-1;
1113
1114       /* Find the common base of ref and the lhs.  */
1115       copy_reference_ops_from_ref (gimple_assign_lhs (def_stmt), &lhs);
1116       i = VEC_length (vn_reference_op_s, vr->operands) - 1;
1117       j = VEC_length (vn_reference_op_s, lhs) - 1;
1118       while (j >= 0 && i >= 0
1119              && vn_reference_op_eq (VEC_index (vn_reference_op_s,
1120                                                vr->operands, i),
1121                                     VEC_index (vn_reference_op_s, lhs, j)))
1122         {
1123           i--;
1124           j--;
1125         }
1126
1127       VEC_free (vn_reference_op_s, heap, lhs);
1128       /* i now points to the first additional op.
1129          ???  LHS may not be completely contained in VR, one or more
1130          VIEW_CONVERT_EXPRs could be in its way.  We could at least
1131          try handling outermost VIEW_CONVERT_EXPRs.  */
1132       if (j != -1)
1133         return (void *)-1;
1134
1135       /* Now re-write REF to be based on the rhs of the assignment.  */
1136       copy_reference_ops_from_ref (gimple_assign_rhs1 (def_stmt), &rhs);
1137       /* We need to pre-pend vr->operands[0..i] to rhs.  */
1138       if (i + 1 + VEC_length (vn_reference_op_s, rhs)
1139           > VEC_length (vn_reference_op_s, vr->operands))
1140         {
1141           VEC (vn_reference_op_s, heap) *old = vr->operands;
1142           VEC_safe_grow (vn_reference_op_s, heap, vr->operands,
1143                          i + 1 + VEC_length (vn_reference_op_s, rhs));
1144           if (old == shared_lookup_references
1145               && vr->operands != old)
1146             shared_lookup_references = NULL;
1147         }
1148       else
1149         VEC_truncate (vn_reference_op_s, vr->operands,
1150                       i + 1 + VEC_length (vn_reference_op_s, rhs));
1151       for (j = 0; VEC_iterate (vn_reference_op_s, rhs, j, vro); ++j)
1152         VEC_replace (vn_reference_op_s, vr->operands, i + 1 + j, vro);
1153       VEC_free (vn_reference_op_s, heap, rhs);
1154       vr->hashcode = vn_reference_compute_hash (vr);
1155
1156       /* Adjust *ref from the new operands.  */
1157       if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))
1158         return (void *)-1;
1159       /* This can happen with bitfields.  */
1160       if (ref->size != r.size)
1161         return (void *)-1;
1162       *ref = r;
1163
1164       /* Keep looking for the adjusted *REF / VR pair.  */
1165       return NULL;
1166     }
1167
1168   /* Bail out and stop walking.  */
1169   return (void *)-1;
1170 }
1171
1172 /* Lookup a reference operation by it's parts, in the current hash table.
1173    Returns the resulting value number if it exists in the hash table,
1174    NULL_TREE otherwise.  VNRESULT will be filled in with the actual
1175    vn_reference_t stored in the hashtable if something is found.  */
1176
1177 tree
1178 vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type,
1179                             VEC (vn_reference_op_s, heap) *operands,
1180                             vn_reference_t *vnresult, bool maywalk)
1181 {
1182   struct vn_reference_s vr1;
1183   vn_reference_t tmp;
1184
1185   if (!vnresult)
1186     vnresult = &tmp;
1187   *vnresult = NULL;
1188
1189   vr1.vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1190   VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
1191   VEC_safe_grow (vn_reference_op_s, heap, shared_lookup_references,
1192                  VEC_length (vn_reference_op_s, operands));
1193   memcpy (VEC_address (vn_reference_op_s, shared_lookup_references),
1194           VEC_address (vn_reference_op_s, operands),
1195           sizeof (vn_reference_op_s)
1196           * VEC_length (vn_reference_op_s, operands));
1197   vr1.operands = operands = shared_lookup_references
1198     = valueize_refs (shared_lookup_references);
1199   vr1.type = type;
1200   vr1.set = set;
1201   vr1.hashcode = vn_reference_compute_hash (&vr1);
1202   vn_reference_lookup_1 (&vr1, vnresult);
1203
1204   if (!*vnresult
1205       && maywalk
1206       && vr1.vuse)
1207     {
1208       ao_ref r;
1209       if (ao_ref_init_from_vn_reference (&r, set, type, vr1.operands))
1210         *vnresult =
1211           (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
1212                                                   vn_reference_lookup_2,
1213                                                   vn_reference_lookup_3, &vr1);
1214       if (vr1.operands != operands)
1215         VEC_free (vn_reference_op_s, heap, vr1.operands);
1216     }
1217
1218   if (*vnresult)
1219      return (*vnresult)->result;
1220
1221   return NULL_TREE;
1222 }
1223
1224 /* Lookup OP in the current hash table, and return the resulting value
1225    number if it exists in the hash table.  Return NULL_TREE if it does
1226    not exist in the hash table or if the result field of the structure
1227    was NULL..  VNRESULT will be filled in with the vn_reference_t
1228    stored in the hashtable if one exists.  */
1229
1230 tree
1231 vn_reference_lookup (tree op, tree vuse, bool maywalk,
1232                      vn_reference_t *vnresult)
1233 {
1234   VEC (vn_reference_op_s, heap) *operands;
1235   struct vn_reference_s vr1;
1236
1237   if (vnresult)
1238     *vnresult = NULL;
1239
1240   vr1.vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1241   vr1.operands = operands = valueize_shared_reference_ops_from_ref (op);
1242   vr1.type = TREE_TYPE (op);
1243   vr1.set = get_alias_set (op);
1244   vr1.hashcode = vn_reference_compute_hash (&vr1);
1245
1246   if (maywalk
1247       && vr1.vuse)
1248     {
1249       vn_reference_t wvnresult;
1250       ao_ref r;
1251       ao_ref_init (&r, op);
1252       wvnresult =
1253         (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
1254                                                 vn_reference_lookup_2,
1255                                                 vn_reference_lookup_3, &vr1);
1256       if (vr1.operands != operands)
1257         VEC_free (vn_reference_op_s, heap, vr1.operands);
1258       if (wvnresult)
1259         {
1260           if (vnresult)
1261             *vnresult = wvnresult;
1262           return wvnresult->result;
1263         }
1264
1265       return NULL_TREE;
1266     }
1267
1268   return vn_reference_lookup_1 (&vr1, vnresult);
1269 }
1270
1271
1272 /* Insert OP into the current hash table with a value number of
1273    RESULT, and return the resulting reference structure we created.  */
1274
1275 vn_reference_t
1276 vn_reference_insert (tree op, tree result, tree vuse)
1277 {
1278   void **slot;
1279   vn_reference_t vr1;
1280
1281   vr1 = (vn_reference_t) pool_alloc (current_info->references_pool);
1282   if (TREE_CODE (result) == SSA_NAME)
1283     vr1->value_id = VN_INFO (result)->value_id;
1284   else
1285     vr1->value_id = get_or_alloc_constant_value_id (result);
1286   vr1->vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1287   vr1->operands = valueize_refs (create_reference_ops_from_ref (op));
1288   vr1->type = TREE_TYPE (op);
1289   vr1->set = get_alias_set (op);
1290   vr1->hashcode = vn_reference_compute_hash (vr1);
1291   vr1->result = TREE_CODE (result) == SSA_NAME ? SSA_VAL (result) : result;
1292
1293   slot = htab_find_slot_with_hash (current_info->references, vr1, vr1->hashcode,
1294                                    INSERT);
1295
1296   /* Because we lookup stores using vuses, and value number failures
1297      using the vdefs (see visit_reference_op_store for how and why),
1298      it's possible that on failure we may try to insert an already
1299      inserted store.  This is not wrong, there is no ssa name for a
1300      store that we could use as a differentiator anyway.  Thus, unlike
1301      the other lookup functions, you cannot gcc_assert (!*slot)
1302      here.  */
1303
1304   /* But free the old slot in case of a collision.  */
1305   if (*slot)
1306     free_reference (*slot);
1307
1308   *slot = vr1;
1309   return vr1;
1310 }
1311
1312 /* Insert a reference by it's pieces into the current hash table with
1313    a value number of RESULT.  Return the resulting reference
1314    structure we created.  */
1315
1316 vn_reference_t
1317 vn_reference_insert_pieces (tree vuse, alias_set_type set, tree type,
1318                             VEC (vn_reference_op_s, heap) *operands,
1319                             tree result, unsigned int value_id)
1320
1321 {
1322   void **slot;
1323   vn_reference_t vr1;
1324
1325   vr1 = (vn_reference_t) pool_alloc (current_info->references_pool);
1326   vr1->value_id = value_id;
1327   vr1->vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1328   vr1->operands = valueize_refs (operands);
1329   vr1->type = type;
1330   vr1->set = set;
1331   vr1->hashcode = vn_reference_compute_hash (vr1);
1332   if (result && TREE_CODE (result) == SSA_NAME)
1333     result = SSA_VAL (result);
1334   vr1->result = result;
1335
1336   slot = htab_find_slot_with_hash (current_info->references, vr1, vr1->hashcode,
1337                                    INSERT);
1338
1339   /* At this point we should have all the things inserted that we have
1340      seen before, and we should never try inserting something that
1341      already exists.  */
1342   gcc_assert (!*slot);
1343   if (*slot)
1344     free_reference (*slot);
1345
1346   *slot = vr1;
1347   return vr1;
1348 }
1349
1350 /* Compute and return the hash value for nary operation VBO1.  */
1351
1352 hashval_t
1353 vn_nary_op_compute_hash (const vn_nary_op_t vno1)
1354 {
1355   hashval_t hash = 0;
1356   unsigned i;
1357
1358   for (i = 0; i < vno1->length; ++i)
1359     if (TREE_CODE (vno1->op[i]) == SSA_NAME)
1360       vno1->op[i] = SSA_VAL (vno1->op[i]);
1361
1362   if (vno1->length == 2
1363       && commutative_tree_code (vno1->opcode)
1364       && tree_swap_operands_p (vno1->op[0], vno1->op[1], false))
1365     {
1366       tree temp = vno1->op[0];
1367       vno1->op[0] = vno1->op[1];
1368       vno1->op[1] = temp;
1369     }
1370
1371   for (i = 0; i < vno1->length; ++i)
1372     hash += iterative_hash_expr (vno1->op[i], vno1->opcode);
1373
1374   return hash;
1375 }
1376
1377 /* Return the computed hashcode for nary operation P1.  */
1378
1379 static hashval_t
1380 vn_nary_op_hash (const void *p1)
1381 {
1382   const_vn_nary_op_t const vno1 = (const_vn_nary_op_t) p1;
1383   return vno1->hashcode;
1384 }
1385
1386 /* Compare nary operations P1 and P2 and return true if they are
1387    equivalent.  */
1388
1389 int
1390 vn_nary_op_eq (const void *p1, const void *p2)
1391 {
1392   const_vn_nary_op_t const vno1 = (const_vn_nary_op_t) p1;
1393   const_vn_nary_op_t const vno2 = (const_vn_nary_op_t) p2;
1394   unsigned i;
1395
1396   if (vno1->hashcode != vno2->hashcode)
1397     return false;
1398
1399   if (vno1->opcode != vno2->opcode
1400       || !types_compatible_p (vno1->type, vno2->type))
1401     return false;
1402
1403   for (i = 0; i < vno1->length; ++i)
1404     if (!expressions_equal_p (vno1->op[i], vno2->op[i]))
1405       return false;
1406
1407   return true;
1408 }
1409
1410 /* Lookup a n-ary operation by its pieces and return the resulting value
1411    number if it exists in the hash table.  Return NULL_TREE if it does
1412    not exist in the hash table or if the result field of the operation
1413    is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
1414    if it exists.  */
1415
1416 tree
1417 vn_nary_op_lookup_pieces (unsigned int length, enum tree_code code,
1418                           tree type, tree op0, tree op1, tree op2,
1419                           tree op3, vn_nary_op_t *vnresult)
1420 {
1421   void **slot;
1422   struct vn_nary_op_s vno1;
1423   if (vnresult)
1424     *vnresult = NULL;
1425   vno1.opcode = code;
1426   vno1.length = length;
1427   vno1.type = type;
1428   vno1.op[0] = op0;
1429   vno1.op[1] = op1;
1430   vno1.op[2] = op2;
1431   vno1.op[3] = op3;
1432   vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1433   slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1434                                    NO_INSERT);
1435   if (!slot && current_info == optimistic_info)
1436     slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1437                                      NO_INSERT);
1438   if (!slot)
1439     return NULL_TREE;
1440   if (vnresult)
1441     *vnresult = (vn_nary_op_t)*slot;
1442   return ((vn_nary_op_t)*slot)->result;
1443 }
1444
1445 /* Lookup OP in the current hash table, and return the resulting value
1446    number if it exists in the hash table.  Return NULL_TREE if it does
1447    not exist in the hash table or if the result field of the operation
1448    is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
1449    if it exists.  */
1450
1451 tree
1452 vn_nary_op_lookup (tree op, vn_nary_op_t *vnresult)
1453 {
1454   void **slot;
1455   struct vn_nary_op_s vno1;
1456   unsigned i;
1457
1458   if (vnresult)
1459     *vnresult = NULL;
1460   vno1.opcode = TREE_CODE (op);
1461   vno1.length = TREE_CODE_LENGTH (TREE_CODE (op));
1462   vno1.type = TREE_TYPE (op);
1463   for (i = 0; i < vno1.length; ++i)
1464     vno1.op[i] = TREE_OPERAND (op, i);
1465   vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1466   slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1467                                    NO_INSERT);
1468   if (!slot && current_info == optimistic_info)
1469     slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1470                                      NO_INSERT);
1471   if (!slot)
1472     return NULL_TREE;
1473   if (vnresult)
1474     *vnresult = (vn_nary_op_t)*slot;
1475   return ((vn_nary_op_t)*slot)->result;
1476 }
1477
1478 /* Lookup the rhs of STMT in the current hash table, and return the resulting
1479    value number if it exists in the hash table.  Return NULL_TREE if
1480    it does not exist in the hash table.  VNRESULT will contain the
1481    vn_nary_op_t from the hashtable if it exists.  */
1482
1483 tree
1484 vn_nary_op_lookup_stmt (gimple stmt, vn_nary_op_t *vnresult)
1485 {
1486   void **slot;
1487   struct vn_nary_op_s vno1;
1488   unsigned i;
1489
1490   if (vnresult)
1491     *vnresult = NULL;
1492   vno1.opcode = gimple_assign_rhs_code (stmt);
1493   vno1.length = gimple_num_ops (stmt) - 1;
1494   vno1.type = gimple_expr_type (stmt);
1495   for (i = 0; i < vno1.length; ++i)
1496     vno1.op[i] = gimple_op (stmt, i + 1);
1497   if (vno1.opcode == REALPART_EXPR
1498       || vno1.opcode == IMAGPART_EXPR
1499       || vno1.opcode == VIEW_CONVERT_EXPR)
1500     vno1.op[0] = TREE_OPERAND (vno1.op[0], 0);
1501   vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1502   slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1503                                    NO_INSERT);
1504   if (!slot && current_info == optimistic_info)
1505     slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1506                                      NO_INSERT);
1507   if (!slot)
1508     return NULL_TREE;
1509   if (vnresult)
1510     *vnresult = (vn_nary_op_t)*slot;
1511   return ((vn_nary_op_t)*slot)->result;
1512 }
1513
1514 /* Insert a n-ary operation into the current hash table using it's
1515    pieces.  Return the vn_nary_op_t structure we created and put in
1516    the hashtable.  */
1517
1518 vn_nary_op_t
1519 vn_nary_op_insert_pieces (unsigned int length, enum tree_code code,
1520                           tree type, tree op0,
1521                           tree op1, tree op2, tree op3,
1522                           tree result,
1523                           unsigned int value_id)
1524 {
1525   void **slot;
1526   vn_nary_op_t vno1;
1527
1528   vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1529                                        (sizeof (struct vn_nary_op_s)
1530                                         - sizeof (tree) * (4 - length)));
1531   vno1->value_id = value_id;
1532   vno1->opcode = code;
1533   vno1->length = length;
1534   vno1->type = type;
1535   if (length >= 1)
1536     vno1->op[0] = op0;
1537   if (length >= 2)
1538     vno1->op[1] = op1;
1539   if (length >= 3)
1540     vno1->op[2] = op2;
1541   if (length >= 4)
1542     vno1->op[3] = op3;
1543   vno1->result = result;
1544   vno1->hashcode = vn_nary_op_compute_hash (vno1);
1545   slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1546                                    INSERT);
1547   gcc_assert (!*slot);
1548
1549   *slot = vno1;
1550   return vno1;
1551
1552 }
1553
1554 /* Insert OP into the current hash table with a value number of
1555    RESULT.  Return the vn_nary_op_t structure we created and put in
1556    the hashtable.  */
1557
1558 vn_nary_op_t
1559 vn_nary_op_insert (tree op, tree result)
1560 {
1561   unsigned length = TREE_CODE_LENGTH (TREE_CODE (op));
1562   void **slot;
1563   vn_nary_op_t vno1;
1564   unsigned i;
1565
1566   vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1567                         (sizeof (struct vn_nary_op_s)
1568                          - sizeof (tree) * (4 - length)));
1569   vno1->value_id = VN_INFO (result)->value_id;
1570   vno1->opcode = TREE_CODE (op);
1571   vno1->length = length;
1572   vno1->type = TREE_TYPE (op);
1573   for (i = 0; i < vno1->length; ++i)
1574     vno1->op[i] = TREE_OPERAND (op, i);
1575   vno1->result = result;
1576   vno1->hashcode = vn_nary_op_compute_hash (vno1);
1577   slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1578                                    INSERT);
1579   gcc_assert (!*slot);
1580
1581   *slot = vno1;
1582   return vno1;
1583 }
1584
1585 /* Insert the rhs of STMT into the current hash table with a value number of
1586    RESULT.  */
1587
1588 vn_nary_op_t
1589 vn_nary_op_insert_stmt (gimple stmt, tree result)
1590 {
1591   unsigned length = gimple_num_ops (stmt) - 1;
1592   void **slot;
1593   vn_nary_op_t vno1;
1594   unsigned i;
1595
1596   vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1597                                        (sizeof (struct vn_nary_op_s)
1598                                         - sizeof (tree) * (4 - length)));
1599   vno1->value_id = VN_INFO (result)->value_id;
1600   vno1->opcode = gimple_assign_rhs_code (stmt);
1601   vno1->length = length;
1602   vno1->type = gimple_expr_type (stmt);
1603   for (i = 0; i < vno1->length; ++i)
1604     vno1->op[i] = gimple_op (stmt, i + 1);
1605   if (vno1->opcode == REALPART_EXPR
1606       || vno1->opcode == IMAGPART_EXPR
1607       || vno1->opcode == VIEW_CONVERT_EXPR)
1608     vno1->op[0] = TREE_OPERAND (vno1->op[0], 0);
1609   vno1->result = result;
1610   vno1->hashcode = vn_nary_op_compute_hash (vno1);
1611   slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1612                                    INSERT);
1613   gcc_assert (!*slot);
1614
1615   *slot = vno1;
1616   return vno1;
1617 }
1618
1619 /* Compute a hashcode for PHI operation VP1 and return it.  */
1620
1621 static inline hashval_t
1622 vn_phi_compute_hash (vn_phi_t vp1)
1623 {
1624   hashval_t result = 0;
1625   int i;
1626   tree phi1op;
1627   tree type;
1628
1629   result = vp1->block->index;
1630
1631   /* If all PHI arguments are constants we need to distinguish
1632      the PHI node via its type.  */
1633   type = TREE_TYPE (VEC_index (tree, vp1->phiargs, 0));
1634   result += (INTEGRAL_TYPE_P (type)
1635              + (INTEGRAL_TYPE_P (type)
1636                 ? TYPE_PRECISION (type) + TYPE_UNSIGNED (type) : 0));
1637
1638   for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
1639     {
1640       if (phi1op == VN_TOP)
1641         continue;
1642       result += iterative_hash_expr (phi1op, result);
1643     }
1644
1645   return result;
1646 }
1647
1648 /* Return the computed hashcode for phi operation P1.  */
1649
1650 static hashval_t
1651 vn_phi_hash (const void *p1)
1652 {
1653   const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
1654   return vp1->hashcode;
1655 }
1656
1657 /* Compare two phi entries for equality, ignoring VN_TOP arguments.  */
1658
1659 static int
1660 vn_phi_eq (const void *p1, const void *p2)
1661 {
1662   const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
1663   const_vn_phi_t const vp2 = (const_vn_phi_t) p2;
1664
1665   if (vp1->hashcode != vp2->hashcode)
1666     return false;
1667
1668   if (vp1->block == vp2->block)
1669     {
1670       int i;
1671       tree phi1op;
1672
1673       /* If the PHI nodes do not have compatible types
1674          they are not the same.  */
1675       if (!types_compatible_p (TREE_TYPE (VEC_index (tree, vp1->phiargs, 0)),
1676                                TREE_TYPE (VEC_index (tree, vp2->phiargs, 0))))
1677         return false;
1678
1679       /* Any phi in the same block will have it's arguments in the
1680          same edge order, because of how we store phi nodes.  */
1681       for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
1682         {
1683           tree phi2op = VEC_index (tree, vp2->phiargs, i);
1684           if (phi1op == VN_TOP || phi2op == VN_TOP)
1685             continue;
1686           if (!expressions_equal_p (phi1op, phi2op))
1687             return false;
1688         }
1689       return true;
1690     }
1691   return false;
1692 }
1693
1694 static VEC(tree, heap) *shared_lookup_phiargs;
1695
1696 /* Lookup PHI in the current hash table, and return the resulting
1697    value number if it exists in the hash table.  Return NULL_TREE if
1698    it does not exist in the hash table. */
1699
1700 static tree
1701 vn_phi_lookup (gimple phi)
1702 {
1703   void **slot;
1704   struct vn_phi_s vp1;
1705   unsigned i;
1706
1707   VEC_truncate (tree, shared_lookup_phiargs, 0);
1708
1709   /* Canonicalize the SSA_NAME's to their value number.  */
1710   for (i = 0; i < gimple_phi_num_args (phi); i++)
1711     {
1712       tree def = PHI_ARG_DEF (phi, i);
1713       def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
1714       VEC_safe_push (tree, heap, shared_lookup_phiargs, def);
1715     }
1716   vp1.phiargs = shared_lookup_phiargs;
1717   vp1.block = gimple_bb (phi);
1718   vp1.hashcode = vn_phi_compute_hash (&vp1);
1719   slot = htab_find_slot_with_hash (current_info->phis, &vp1, vp1.hashcode,
1720                                    NO_INSERT);
1721   if (!slot && current_info == optimistic_info)
1722     slot = htab_find_slot_with_hash (valid_info->phis, &vp1, vp1.hashcode,
1723                                      NO_INSERT);
1724   if (!slot)
1725     return NULL_TREE;
1726   return ((vn_phi_t)*slot)->result;
1727 }
1728
1729 /* Insert PHI into the current hash table with a value number of
1730    RESULT.  */
1731
1732 static vn_phi_t
1733 vn_phi_insert (gimple phi, tree result)
1734 {
1735   void **slot;
1736   vn_phi_t vp1 = (vn_phi_t) pool_alloc (current_info->phis_pool);
1737   unsigned i;
1738   VEC (tree, heap) *args = NULL;
1739
1740   /* Canonicalize the SSA_NAME's to their value number.  */
1741   for (i = 0; i < gimple_phi_num_args (phi); i++)
1742     {
1743       tree def = PHI_ARG_DEF (phi, i);
1744       def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
1745       VEC_safe_push (tree, heap, args, def);
1746     }
1747   vp1->value_id = VN_INFO (result)->value_id;
1748   vp1->phiargs = args;
1749   vp1->block = gimple_bb (phi);
1750   vp1->result = result;
1751   vp1->hashcode = vn_phi_compute_hash (vp1);
1752
1753   slot = htab_find_slot_with_hash (current_info->phis, vp1, vp1->hashcode,
1754                                    INSERT);
1755
1756   /* Because we iterate over phi operations more than once, it's
1757      possible the slot might already exist here, hence no assert.*/
1758   *slot = vp1;
1759   return vp1;
1760 }
1761
1762
1763 /* Print set of components in strongly connected component SCC to OUT. */
1764
1765 static void
1766 print_scc (FILE *out, VEC (tree, heap) *scc)
1767 {
1768   tree var;
1769   unsigned int i;
1770
1771   fprintf (out, "SCC consists of: ");
1772   for (i = 0; VEC_iterate (tree, scc, i, var); i++)
1773     {
1774       print_generic_expr (out, var, 0);
1775       fprintf (out, " ");
1776     }
1777   fprintf (out, "\n");
1778 }
1779
1780 /* Set the value number of FROM to TO, return true if it has changed
1781    as a result.  */
1782
1783 static inline bool
1784 set_ssa_val_to (tree from, tree to)
1785 {
1786   tree currval;
1787
1788   if (from != to
1789       && TREE_CODE (to) == SSA_NAME
1790       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
1791     to = from;
1792
1793   /* The only thing we allow as value numbers are VN_TOP, ssa_names
1794      and invariants.  So assert that here.  */
1795   gcc_assert (to != NULL_TREE
1796               && (to == VN_TOP
1797                   || TREE_CODE (to) == SSA_NAME
1798                   || is_gimple_min_invariant (to)));
1799
1800   if (dump_file && (dump_flags & TDF_DETAILS))
1801     {
1802       fprintf (dump_file, "Setting value number of ");
1803       print_generic_expr (dump_file, from, 0);
1804       fprintf (dump_file, " to ");
1805       print_generic_expr (dump_file, to, 0);
1806     }
1807
1808   currval = SSA_VAL (from);
1809
1810   if (currval != to  && !operand_equal_p (currval, to, OEP_PURE_SAME))
1811     {
1812       VN_INFO (from)->valnum = to;
1813       if (dump_file && (dump_flags & TDF_DETAILS))
1814         fprintf (dump_file, " (changed)\n");
1815       return true;
1816     }
1817   if (dump_file && (dump_flags & TDF_DETAILS))
1818     fprintf (dump_file, "\n");
1819   return false;
1820 }
1821
1822 /* Set all definitions in STMT to value number to themselves.
1823    Return true if a value number changed. */
1824
1825 static bool
1826 defs_to_varying (gimple stmt)
1827 {
1828   bool changed = false;
1829   ssa_op_iter iter;
1830   def_operand_p defp;
1831
1832   FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_ALL_DEFS)
1833     {
1834       tree def = DEF_FROM_PTR (defp);
1835
1836       VN_INFO (def)->use_processed = true;
1837       changed |= set_ssa_val_to (def, def);
1838     }
1839   return changed;
1840 }
1841
1842 static bool expr_has_constants (tree expr);
1843 static tree valueize_expr (tree expr);
1844
1845 /* Visit a copy between LHS and RHS, return true if the value number
1846    changed.  */
1847
1848 static bool
1849 visit_copy (tree lhs, tree rhs)
1850 {
1851   /* Follow chains of copies to their destination.  */
1852   while (TREE_CODE (rhs) == SSA_NAME
1853          && SSA_VAL (rhs) != rhs)
1854     rhs = SSA_VAL (rhs);
1855
1856   /* The copy may have a more interesting constant filled expression
1857      (we don't, since we know our RHS is just an SSA name).  */
1858   if (TREE_CODE (rhs) == SSA_NAME)
1859     {
1860       VN_INFO (lhs)->has_constants = VN_INFO (rhs)->has_constants;
1861       VN_INFO (lhs)->expr = VN_INFO (rhs)->expr;
1862     }
1863
1864   return set_ssa_val_to (lhs, rhs);
1865 }
1866
1867 /* Visit a unary operator RHS, value number it, and return true if the
1868    value number of LHS has changed as a result.  */
1869
1870 static bool
1871 visit_unary_op (tree lhs, gimple stmt)
1872 {
1873   bool changed = false;
1874   tree result = vn_nary_op_lookup_stmt (stmt, NULL);
1875
1876   if (result)
1877     {
1878       changed = set_ssa_val_to (lhs, result);
1879     }
1880   else
1881     {
1882       changed = set_ssa_val_to (lhs, lhs);
1883       vn_nary_op_insert_stmt (stmt, lhs);
1884     }
1885
1886   return changed;
1887 }
1888
1889 /* Visit a binary operator RHS, value number it, and return true if the
1890    value number of LHS has changed as a result.  */
1891
1892 static bool
1893 visit_binary_op (tree lhs, gimple stmt)
1894 {
1895   bool changed = false;
1896   tree result = vn_nary_op_lookup_stmt (stmt, NULL);
1897
1898   if (result)
1899     {
1900       changed = set_ssa_val_to (lhs, result);
1901     }
1902   else
1903     {
1904       changed = set_ssa_val_to (lhs, lhs);
1905       vn_nary_op_insert_stmt (stmt, lhs);
1906     }
1907
1908   return changed;
1909 }
1910
1911 /* Visit a call STMT storing into LHS.  Return true if the value number
1912    of the LHS has changed as a result.  */
1913
1914 static bool
1915 visit_reference_op_call (tree lhs, gimple stmt)
1916 {
1917   bool changed = false;
1918   struct vn_reference_s vr1;
1919   tree result;
1920   tree vuse = gimple_vuse (stmt);
1921
1922   vr1.vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1923   vr1.operands = valueize_shared_reference_ops_from_call (stmt);
1924   vr1.type = gimple_expr_type (stmt);
1925   vr1.set = 0;
1926   vr1.hashcode = vn_reference_compute_hash (&vr1);
1927   result = vn_reference_lookup_1 (&vr1, NULL);
1928   if (result)
1929     {
1930       changed = set_ssa_val_to (lhs, result);
1931       if (TREE_CODE (result) == SSA_NAME
1932           && VN_INFO (result)->has_constants)
1933         VN_INFO (lhs)->has_constants = true;
1934     }
1935   else
1936     {
1937       void **slot;
1938       vn_reference_t vr2;
1939       changed = set_ssa_val_to (lhs, lhs);
1940       vr2 = (vn_reference_t) pool_alloc (current_info->references_pool);
1941       vr2->vuse = vr1.vuse;
1942       vr2->operands = valueize_refs (create_reference_ops_from_call (stmt));
1943       vr2->type = vr1.type;
1944       vr2->set = vr1.set;
1945       vr2->hashcode = vr1.hashcode;
1946       vr2->result = lhs;
1947       slot = htab_find_slot_with_hash (current_info->references,
1948                                        vr2, vr2->hashcode, INSERT);
1949       if (*slot)
1950         free_reference (*slot);
1951       *slot = vr2;
1952     }
1953
1954   return changed;
1955 }
1956
1957 /* Visit a load from a reference operator RHS, part of STMT, value number it,
1958    and return true if the value number of the LHS has changed as a result.  */
1959
1960 static bool
1961 visit_reference_op_load (tree lhs, tree op, gimple stmt)
1962 {
1963   bool changed = false;
1964   tree result = vn_reference_lookup (op, gimple_vuse (stmt), true, NULL);
1965
1966   /* If we have a VCE, try looking up its operand as it might be stored in
1967      a different type.  */
1968   if (!result && TREE_CODE (op) == VIEW_CONVERT_EXPR)
1969     result = vn_reference_lookup (TREE_OPERAND (op, 0), gimple_vuse (stmt),
1970                                   true, NULL);
1971
1972   /* We handle type-punning through unions by value-numbering based
1973      on offset and size of the access.  Be prepared to handle a
1974      type-mismatch here via creating a VIEW_CONVERT_EXPR.  */
1975   if (result
1976       && !useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (op)))
1977     {
1978       /* We will be setting the value number of lhs to the value number
1979          of VIEW_CONVERT_EXPR <TREE_TYPE (result)> (result).
1980          So first simplify and lookup this expression to see if it
1981          is already available.  */
1982       tree val = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (op), result);
1983       if ((CONVERT_EXPR_P (val)
1984            || TREE_CODE (val) == VIEW_CONVERT_EXPR)
1985           && TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME)
1986         {
1987           tree tem = valueize_expr (vn_get_expr_for (TREE_OPERAND (val, 0)));
1988           if ((CONVERT_EXPR_P (tem)
1989                || TREE_CODE (tem) == VIEW_CONVERT_EXPR)
1990               && (tem = fold_unary_ignore_overflow (TREE_CODE (val),
1991                                                     TREE_TYPE (val), tem)))
1992             val = tem;
1993         }
1994       result = val;
1995       if (!is_gimple_min_invariant (val)
1996           && TREE_CODE (val) != SSA_NAME)
1997         result = vn_nary_op_lookup (val, NULL);
1998       /* If the expression is not yet available, value-number lhs to
1999          a new SSA_NAME we create.  */
2000       if (!result && may_insert)
2001         {
2002           result = make_ssa_name (SSA_NAME_VAR (lhs), NULL);
2003           /* Initialize value-number information properly.  */
2004           VN_INFO_GET (result)->valnum = result;
2005           VN_INFO (result)->value_id = get_next_value_id ();
2006           VN_INFO (result)->expr = val;
2007           VN_INFO (result)->has_constants = expr_has_constants (val);
2008           VN_INFO (result)->needs_insertion = true;
2009           /* As all "inserted" statements are singleton SCCs, insert
2010              to the valid table.  This is strictly needed to
2011              avoid re-generating new value SSA_NAMEs for the same
2012              expression during SCC iteration over and over (the
2013              optimistic table gets cleared after each iteration).
2014              We do not need to insert into the optimistic table, as
2015              lookups there will fall back to the valid table.  */
2016           if (current_info == optimistic_info)
2017             {
2018               current_info = valid_info;
2019               vn_nary_op_insert (val, result);
2020               current_info = optimistic_info;
2021             }
2022           else
2023             vn_nary_op_insert (val, result);
2024           if (dump_file && (dump_flags & TDF_DETAILS))
2025             {
2026               fprintf (dump_file, "Inserting name ");
2027               print_generic_expr (dump_file, result, 0);
2028               fprintf (dump_file, " for expression ");
2029               print_generic_expr (dump_file, val, 0);
2030               fprintf (dump_file, "\n");
2031             }
2032         }
2033     }
2034
2035   if (result)
2036     {
2037       changed = set_ssa_val_to (lhs, result);
2038       if (TREE_CODE (result) == SSA_NAME
2039           && VN_INFO (result)->has_constants)
2040         {
2041           VN_INFO (lhs)->expr = VN_INFO (result)->expr;
2042           VN_INFO (lhs)->has_constants = true;
2043         }
2044     }
2045   else
2046     {
2047       changed = set_ssa_val_to (lhs, lhs);
2048       vn_reference_insert (op, lhs, gimple_vuse (stmt));
2049     }
2050
2051   return changed;
2052 }
2053
2054
2055 /* Visit a store to a reference operator LHS, part of STMT, value number it,
2056    and return true if the value number of the LHS has changed as a result.  */
2057
2058 static bool
2059 visit_reference_op_store (tree lhs, tree op, gimple stmt)
2060 {
2061   bool changed = false;
2062   tree result;
2063   bool resultsame = false;
2064
2065   /* First we want to lookup using the *vuses* from the store and see
2066      if there the last store to this location with the same address
2067      had the same value.
2068
2069      The vuses represent the memory state before the store.  If the
2070      memory state, address, and value of the store is the same as the
2071      last store to this location, then this store will produce the
2072      same memory state as that store.
2073
2074      In this case the vdef versions for this store are value numbered to those
2075      vuse versions, since they represent the same memory state after
2076      this store.
2077
2078      Otherwise, the vdefs for the store are used when inserting into
2079      the table, since the store generates a new memory state.  */
2080
2081   result = vn_reference_lookup (lhs, gimple_vuse (stmt), false, NULL);
2082
2083   if (result)
2084     {
2085       if (TREE_CODE (result) == SSA_NAME)
2086         result = SSA_VAL (result);
2087       if (TREE_CODE (op) == SSA_NAME)
2088         op = SSA_VAL (op);
2089       resultsame = expressions_equal_p (result, op);
2090     }
2091
2092   if (!result || !resultsame)
2093     {
2094       tree vdef;
2095
2096       if (dump_file && (dump_flags & TDF_DETAILS))
2097         {
2098           fprintf (dump_file, "No store match\n");
2099           fprintf (dump_file, "Value numbering store ");
2100           print_generic_expr (dump_file, lhs, 0);
2101           fprintf (dump_file, " to ");
2102           print_generic_expr (dump_file, op, 0);
2103           fprintf (dump_file, "\n");
2104         }
2105       /* Have to set value numbers before insert, since insert is
2106          going to valueize the references in-place.  */
2107       if ((vdef = gimple_vdef (stmt)))
2108         {
2109           VN_INFO (vdef)->use_processed = true;
2110           changed |= set_ssa_val_to (vdef, vdef);
2111         }
2112
2113       /* Do not insert structure copies into the tables.  */
2114       if (is_gimple_min_invariant (op)
2115           || is_gimple_reg (op))
2116         vn_reference_insert (lhs, op, vdef);
2117     }
2118   else
2119     {
2120       /* We had a match, so value number the vdef to have the value
2121          number of the vuse it came from.  */
2122       tree def, use;
2123
2124       if (dump_file && (dump_flags & TDF_DETAILS))
2125         fprintf (dump_file, "Store matched earlier value,"
2126                  "value numbering store vdefs to matching vuses.\n");
2127
2128       def = gimple_vdef (stmt);
2129       use = gimple_vuse (stmt);
2130
2131       VN_INFO (def)->use_processed = true;
2132       changed |= set_ssa_val_to (def, SSA_VAL (use));
2133     }
2134
2135   return changed;
2136 }
2137
2138 /* Visit and value number PHI, return true if the value number
2139    changed.  */
2140
2141 static bool
2142 visit_phi (gimple phi)
2143 {
2144   bool changed = false;
2145   tree result;
2146   tree sameval = VN_TOP;
2147   bool allsame = true;
2148   unsigned i;
2149
2150   /* TODO: We could check for this in init_sccvn, and replace this
2151      with a gcc_assert.  */
2152   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)))
2153     return set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
2154
2155   /* See if all non-TOP arguments have the same value.  TOP is
2156      equivalent to everything, so we can ignore it.  */
2157   for (i = 0; i < gimple_phi_num_args (phi); i++)
2158     {
2159       tree def = PHI_ARG_DEF (phi, i);
2160
2161       if (TREE_CODE (def) == SSA_NAME)
2162         def = SSA_VAL (def);
2163       if (def == VN_TOP)
2164         continue;
2165       if (sameval == VN_TOP)
2166         {
2167           sameval = def;
2168         }
2169       else
2170         {
2171           if (!expressions_equal_p (def, sameval))
2172             {
2173               allsame = false;
2174               break;
2175             }
2176         }
2177     }
2178
2179   /* If all value numbered to the same value, the phi node has that
2180      value.  */
2181   if (allsame)
2182     {
2183       if (is_gimple_min_invariant (sameval))
2184         {
2185           VN_INFO (PHI_RESULT (phi))->has_constants = true;
2186           VN_INFO (PHI_RESULT (phi))->expr = sameval;
2187         }
2188       else
2189         {
2190           VN_INFO (PHI_RESULT (phi))->has_constants = false;
2191           VN_INFO (PHI_RESULT (phi))->expr = sameval;
2192         }
2193
2194       if (TREE_CODE (sameval) == SSA_NAME)
2195         return visit_copy (PHI_RESULT (phi), sameval);
2196
2197       return set_ssa_val_to (PHI_RESULT (phi), sameval);
2198     }
2199
2200   /* Otherwise, see if it is equivalent to a phi node in this block.  */
2201   result = vn_phi_lookup (phi);
2202   if (result)
2203     {
2204       if (TREE_CODE (result) == SSA_NAME)
2205         changed = visit_copy (PHI_RESULT (phi), result);
2206       else
2207         changed = set_ssa_val_to (PHI_RESULT (phi), result);
2208     }
2209   else
2210     {
2211       vn_phi_insert (phi, PHI_RESULT (phi));
2212       VN_INFO (PHI_RESULT (phi))->has_constants = false;
2213       VN_INFO (PHI_RESULT (phi))->expr = PHI_RESULT (phi);
2214       changed = set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
2215     }
2216
2217   return changed;
2218 }
2219
2220 /* Return true if EXPR contains constants.  */
2221
2222 static bool
2223 expr_has_constants (tree expr)
2224 {
2225   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
2226     {
2227     case tcc_unary:
2228       return is_gimple_min_invariant (TREE_OPERAND (expr, 0));
2229
2230     case tcc_binary:
2231       return is_gimple_min_invariant (TREE_OPERAND (expr, 0))
2232         || is_gimple_min_invariant (TREE_OPERAND (expr, 1));
2233       /* Constants inside reference ops are rarely interesting, but
2234          it can take a lot of looking to find them.  */
2235     case tcc_reference:
2236     case tcc_declaration:
2237       return false;
2238     default:
2239       return is_gimple_min_invariant (expr);
2240     }
2241   return false;
2242 }
2243
2244 /* Return true if STMT contains constants.  */
2245
2246 static bool
2247 stmt_has_constants (gimple stmt)
2248 {
2249   if (gimple_code (stmt) != GIMPLE_ASSIGN)
2250     return false;
2251
2252   switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
2253     {
2254     case GIMPLE_UNARY_RHS:
2255       return is_gimple_min_invariant (gimple_assign_rhs1 (stmt));
2256
2257     case GIMPLE_BINARY_RHS:
2258       return (is_gimple_min_invariant (gimple_assign_rhs1 (stmt))
2259               || is_gimple_min_invariant (gimple_assign_rhs2 (stmt)));
2260     case GIMPLE_SINGLE_RHS:
2261       /* Constants inside reference ops are rarely interesting, but
2262          it can take a lot of looking to find them.  */
2263       return is_gimple_min_invariant (gimple_assign_rhs1 (stmt));
2264     default:
2265       gcc_unreachable ();
2266     }
2267   return false;
2268 }
2269
2270 /* Replace SSA_NAMES in expr with their value numbers, and return the
2271    result.
2272    This is performed in place. */
2273
2274 static tree
2275 valueize_expr (tree expr)
2276 {
2277   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
2278     {
2279     case tcc_unary:
2280       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
2281           && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
2282         TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
2283       break;
2284     case tcc_binary:
2285       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
2286           && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
2287         TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
2288       if (TREE_CODE (TREE_OPERAND (expr, 1)) == SSA_NAME
2289           && SSA_VAL (TREE_OPERAND (expr, 1)) != VN_TOP)
2290         TREE_OPERAND (expr, 1) = SSA_VAL (TREE_OPERAND (expr, 1));
2291       break;
2292     default:
2293       break;
2294     }
2295   return expr;
2296 }
2297
2298 /* Simplify the binary expression RHS, and return the result if
2299    simplified. */
2300
2301 static tree
2302 simplify_binary_expression (gimple stmt)
2303 {
2304   tree result = NULL_TREE;
2305   tree op0 = gimple_assign_rhs1 (stmt);
2306   tree op1 = gimple_assign_rhs2 (stmt);
2307
2308   /* This will not catch every single case we could combine, but will
2309      catch those with constants.  The goal here is to simultaneously
2310      combine constants between expressions, but avoid infinite
2311      expansion of expressions during simplification.  */
2312   if (TREE_CODE (op0) == SSA_NAME)
2313     {
2314       if (VN_INFO (op0)->has_constants
2315           || TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
2316         op0 = valueize_expr (vn_get_expr_for (op0));
2317       else if (SSA_VAL (op0) != VN_TOP && SSA_VAL (op0) != op0)
2318         op0 = SSA_VAL (op0);
2319     }
2320
2321   if (TREE_CODE (op1) == SSA_NAME)
2322     {
2323       if (VN_INFO (op1)->has_constants)
2324         op1 = valueize_expr (vn_get_expr_for (op1));
2325       else if (SSA_VAL (op1) != VN_TOP && SSA_VAL (op1) != op1)
2326         op1 = SSA_VAL (op1);
2327     }
2328
2329   /* Avoid folding if nothing changed.  */
2330   if (op0 == gimple_assign_rhs1 (stmt)
2331       && op1 == gimple_assign_rhs2 (stmt))
2332     return NULL_TREE;
2333
2334   fold_defer_overflow_warnings ();
2335
2336   result = fold_binary (gimple_assign_rhs_code (stmt),
2337                         gimple_expr_type (stmt), op0, op1);
2338   if (result)
2339     STRIP_USELESS_TYPE_CONVERSION (result);
2340
2341   fold_undefer_overflow_warnings (result && valid_gimple_rhs_p (result),
2342                                   stmt, 0);
2343
2344   /* Make sure result is not a complex expression consisting
2345      of operators of operators (IE (a + b) + (a + c))
2346      Otherwise, we will end up with unbounded expressions if
2347      fold does anything at all.  */
2348   if (result && valid_gimple_rhs_p (result))
2349     return result;
2350
2351   return NULL_TREE;
2352 }
2353
2354 /* Simplify the unary expression RHS, and return the result if
2355    simplified. */
2356
2357 static tree
2358 simplify_unary_expression (gimple stmt)
2359 {
2360   tree result = NULL_TREE;
2361   tree orig_op0, op0 = gimple_assign_rhs1 (stmt);
2362
2363   /* We handle some tcc_reference codes here that are all
2364      GIMPLE_ASSIGN_SINGLE codes.  */
2365   if (gimple_assign_rhs_code (stmt) == REALPART_EXPR
2366       || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
2367       || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR)
2368     op0 = TREE_OPERAND (op0, 0);
2369
2370   if (TREE_CODE (op0) != SSA_NAME)
2371     return NULL_TREE;
2372
2373   orig_op0 = op0;
2374   if (VN_INFO (op0)->has_constants)
2375     op0 = valueize_expr (vn_get_expr_for (op0));
2376   else if (gimple_assign_cast_p (stmt)
2377            || gimple_assign_rhs_code (stmt) == REALPART_EXPR
2378            || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
2379            || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR)
2380     {
2381       /* We want to do tree-combining on conversion-like expressions.
2382          Make sure we feed only SSA_NAMEs or constants to fold though.  */
2383       tree tem = valueize_expr (vn_get_expr_for (op0));
2384       if (UNARY_CLASS_P (tem)
2385           || BINARY_CLASS_P (tem)
2386           || TREE_CODE (tem) == VIEW_CONVERT_EXPR
2387           || TREE_CODE (tem) == SSA_NAME
2388           || is_gimple_min_invariant (tem))
2389         op0 = tem;
2390     }
2391
2392   /* Avoid folding if nothing changed, but remember the expression.  */
2393   if (op0 == orig_op0)
2394     return NULL_TREE;
2395
2396   result = fold_unary_ignore_overflow (gimple_assign_rhs_code (stmt),
2397                                        gimple_expr_type (stmt), op0);
2398   if (result)
2399     {
2400       STRIP_USELESS_TYPE_CONVERSION (result);
2401       if (valid_gimple_rhs_p (result))
2402         return result;
2403     }
2404
2405   return NULL_TREE;
2406 }
2407
2408 /* Try to simplify RHS using equivalences and constant folding.  */
2409
2410 static tree
2411 try_to_simplify (gimple stmt)
2412 {
2413   tree tem;
2414
2415   /* For stores we can end up simplifying a SSA_NAME rhs.  Just return
2416      in this case, there is no point in doing extra work.  */
2417   if (gimple_assign_copy_p (stmt)
2418       && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
2419     return NULL_TREE;
2420
2421   switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
2422     {
2423     case tcc_declaration:
2424       tem = get_symbol_constant_value (gimple_assign_rhs1 (stmt));
2425       if (tem)
2426         return tem;
2427       break;
2428
2429     case tcc_reference:
2430       /* Do not do full-blown reference lookup here, but simplify
2431          reads from constant aggregates.  */
2432       tem = fold_const_aggregate_ref (gimple_assign_rhs1 (stmt));
2433       if (tem)
2434         return tem;
2435
2436       /* Fallthrough for some codes that can operate on registers.  */
2437       if (!(TREE_CODE (gimple_assign_rhs1 (stmt)) == REALPART_EXPR
2438             || TREE_CODE (gimple_assign_rhs1 (stmt)) == IMAGPART_EXPR
2439             || TREE_CODE (gimple_assign_rhs1 (stmt)) == VIEW_CONVERT_EXPR))
2440         break;
2441       /* We could do a little more with unary ops, if they expand
2442          into binary ops, but it's debatable whether it is worth it. */
2443     case tcc_unary:
2444       return simplify_unary_expression (stmt);
2445       break;
2446     case tcc_comparison:
2447     case tcc_binary:
2448       return simplify_binary_expression (stmt);
2449       break;
2450     default:
2451       break;
2452     }
2453
2454   return NULL_TREE;
2455 }
2456
2457 /* Visit and value number USE, return true if the value number
2458    changed. */
2459
2460 static bool
2461 visit_use (tree use)
2462 {
2463   bool changed = false;
2464   gimple stmt = SSA_NAME_DEF_STMT (use);
2465
2466   VN_INFO (use)->use_processed = true;
2467
2468   gcc_assert (!SSA_NAME_IN_FREE_LIST (use));
2469   if (dump_file && (dump_flags & TDF_DETAILS)
2470       && !SSA_NAME_IS_DEFAULT_DEF (use))
2471     {
2472       fprintf (dump_file, "Value numbering ");
2473       print_generic_expr (dump_file, use, 0);
2474       fprintf (dump_file, " stmt = ");
2475       print_gimple_stmt (dump_file, stmt, 0, 0);
2476     }
2477
2478   /* Handle uninitialized uses.  */
2479   if (SSA_NAME_IS_DEFAULT_DEF (use))
2480     changed = set_ssa_val_to (use, use);
2481   else
2482     {
2483       if (gimple_code (stmt) == GIMPLE_PHI)
2484         changed = visit_phi (stmt);
2485       else if (!gimple_has_lhs (stmt)
2486                || gimple_has_volatile_ops (stmt)
2487                || stmt_could_throw_p (stmt))
2488         changed = defs_to_varying (stmt);
2489       else if (is_gimple_assign (stmt))
2490         {
2491           tree lhs = gimple_assign_lhs (stmt);
2492           tree simplified;
2493
2494           /* Shortcut for copies. Simplifying copies is pointless,
2495              since we copy the expression and value they represent.  */
2496           if (gimple_assign_copy_p (stmt)
2497               && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2498               && TREE_CODE (lhs) == SSA_NAME)
2499             {
2500               changed = visit_copy (lhs, gimple_assign_rhs1 (stmt));
2501               goto done;
2502             }
2503           simplified = try_to_simplify (stmt);
2504           if (simplified)
2505             {
2506               if (dump_file && (dump_flags & TDF_DETAILS))
2507                 {
2508                   fprintf (dump_file, "RHS ");
2509                   print_gimple_expr (dump_file, stmt, 0, 0);
2510                   fprintf (dump_file, " simplified to ");
2511                   print_generic_expr (dump_file, simplified, 0);
2512                   if (TREE_CODE (lhs) == SSA_NAME)
2513                     fprintf (dump_file, " has constants %d\n",
2514                              expr_has_constants (simplified));
2515                   else
2516                     fprintf (dump_file, "\n");
2517                 }
2518             }
2519           /* Setting value numbers to constants will occasionally
2520              screw up phi congruence because constants are not
2521              uniquely associated with a single ssa name that can be
2522              looked up.  */
2523           if (simplified
2524               && is_gimple_min_invariant (simplified)
2525               && TREE_CODE (lhs) == SSA_NAME)
2526             {
2527               VN_INFO (lhs)->expr = simplified;
2528               VN_INFO (lhs)->has_constants = true;
2529               changed = set_ssa_val_to (lhs, simplified);
2530               goto done;
2531             }
2532           else if (simplified
2533                    && TREE_CODE (simplified) == SSA_NAME
2534                    && TREE_CODE (lhs) == SSA_NAME)
2535             {
2536               changed = visit_copy (lhs, simplified);
2537               goto done;
2538             }
2539           else if (simplified)
2540             {
2541               if (TREE_CODE (lhs) == SSA_NAME)
2542                 {
2543                   VN_INFO (lhs)->has_constants = expr_has_constants (simplified);
2544                   /* We have to unshare the expression or else
2545                      valuizing may change the IL stream.  */
2546                   VN_INFO (lhs)->expr = unshare_expr (simplified);
2547                 }
2548             }
2549           else if (stmt_has_constants (stmt)
2550                    && TREE_CODE (lhs) == SSA_NAME)
2551             VN_INFO (lhs)->has_constants = true;
2552           else if (TREE_CODE (lhs) == SSA_NAME)
2553             {
2554               /* We reset expr and constantness here because we may
2555                  have been value numbering optimistically, and
2556                  iterating. They may become non-constant in this case,
2557                  even if they were optimistically constant. */
2558
2559               VN_INFO (lhs)->has_constants = false;
2560               VN_INFO (lhs)->expr = NULL_TREE;
2561             }
2562
2563           if ((TREE_CODE (lhs) == SSA_NAME
2564                /* We can substitute SSA_NAMEs that are live over
2565                   abnormal edges with their constant value.  */
2566                && !(gimple_assign_copy_p (stmt)
2567                     && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2568                && !(simplified
2569                     && is_gimple_min_invariant (simplified))
2570                && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
2571               /* Stores or copies from SSA_NAMEs that are live over
2572                  abnormal edges are a problem.  */
2573               || (gimple_assign_single_p (stmt)
2574                   && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2575                   && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (stmt))))
2576             changed = defs_to_varying (stmt);
2577           else if (REFERENCE_CLASS_P (lhs) || DECL_P (lhs))
2578             {
2579               changed = visit_reference_op_store (lhs, gimple_assign_rhs1 (stmt), stmt);
2580             }
2581           else if (TREE_CODE (lhs) == SSA_NAME)
2582             {
2583               if ((gimple_assign_copy_p (stmt)
2584                    && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2585                   || (simplified
2586                       && is_gimple_min_invariant (simplified)))
2587                 {
2588                   VN_INFO (lhs)->has_constants = true;
2589                   if (simplified)
2590                     changed = set_ssa_val_to (lhs, simplified);
2591                   else
2592                     changed = set_ssa_val_to (lhs, gimple_assign_rhs1 (stmt));
2593                 }
2594               else
2595                 {
2596                   switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
2597                     {
2598                     case GIMPLE_UNARY_RHS:
2599                       changed = visit_unary_op (lhs, stmt);
2600                       break;
2601                     case GIMPLE_BINARY_RHS:
2602                       changed = visit_binary_op (lhs, stmt);
2603                       break;
2604                     case GIMPLE_SINGLE_RHS:
2605                       switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
2606                         {
2607                         case tcc_reference:
2608                           /* VOP-less references can go through unary case.  */
2609                           if ((gimple_assign_rhs_code (stmt) == REALPART_EXPR
2610                                || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
2611                                || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR )
2612                               && TREE_CODE (TREE_OPERAND (gimple_assign_rhs1 (stmt), 0)) == SSA_NAME)
2613                             {
2614                               changed = visit_unary_op (lhs, stmt);
2615                               break;
2616                             }
2617                           /* Fallthrough.  */
2618                         case tcc_declaration:
2619                           changed = visit_reference_op_load
2620                               (lhs, gimple_assign_rhs1 (stmt), stmt);
2621                           break;
2622                         case tcc_expression:
2623                           if (gimple_assign_rhs_code (stmt) == ADDR_EXPR)
2624                             {
2625                               changed = visit_unary_op (lhs, stmt);
2626                               break;
2627                             }
2628                           /* Fallthrough.  */
2629                         default:
2630                           changed = defs_to_varying (stmt);
2631                         }
2632                       break;
2633                     default:
2634                       changed = defs_to_varying (stmt);
2635                       break;
2636                     }
2637                 }
2638             }
2639           else
2640             changed = defs_to_varying (stmt);
2641         }
2642       else if (is_gimple_call (stmt))
2643         {
2644           tree lhs = gimple_call_lhs (stmt);
2645
2646           /* ???  We could try to simplify calls.  */
2647
2648           if (stmt_has_constants (stmt)
2649               && TREE_CODE (lhs) == SSA_NAME)
2650             VN_INFO (lhs)->has_constants = true;
2651           else if (TREE_CODE (lhs) == SSA_NAME)
2652             {
2653               /* We reset expr and constantness here because we may
2654                  have been value numbering optimistically, and
2655                  iterating. They may become non-constant in this case,
2656                  even if they were optimistically constant. */
2657               VN_INFO (lhs)->has_constants = false;
2658               VN_INFO (lhs)->expr = NULL_TREE;
2659             }
2660
2661           if (TREE_CODE (lhs) == SSA_NAME
2662               && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
2663             changed = defs_to_varying (stmt);
2664           /* ???  We should handle stores from calls.  */
2665           else if (TREE_CODE (lhs) == SSA_NAME)
2666             {
2667               if (gimple_call_flags (stmt) & (ECF_PURE | ECF_CONST))
2668                 changed = visit_reference_op_call (lhs, stmt);
2669               else
2670                 changed = defs_to_varying (stmt);
2671             }
2672           else
2673             changed = defs_to_varying (stmt);
2674         }
2675     }
2676  done:
2677   return changed;
2678 }
2679
2680 /* Compare two operands by reverse postorder index */
2681
2682 static int
2683 compare_ops (const void *pa, const void *pb)
2684 {
2685   const tree opa = *((const tree *)pa);
2686   const tree opb = *((const tree *)pb);
2687   gimple opstmta = SSA_NAME_DEF_STMT (opa);
2688   gimple opstmtb = SSA_NAME_DEF_STMT (opb);
2689   basic_block bba;
2690   basic_block bbb;
2691
2692   if (gimple_nop_p (opstmta) && gimple_nop_p (opstmtb))
2693     return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
2694   else if (gimple_nop_p (opstmta))
2695     return -1;
2696   else if (gimple_nop_p (opstmtb))
2697     return 1;
2698
2699   bba = gimple_bb (opstmta);
2700   bbb = gimple_bb (opstmtb);
2701
2702   if (!bba && !bbb)
2703     return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
2704   else if (!bba)
2705     return -1;
2706   else if (!bbb)
2707     return 1;
2708
2709   if (bba == bbb)
2710     {
2711       if (gimple_code (opstmta) == GIMPLE_PHI
2712           && gimple_code (opstmtb) == GIMPLE_PHI)
2713         return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
2714       else if (gimple_code (opstmta) == GIMPLE_PHI)
2715         return -1;
2716       else if (gimple_code (opstmtb) == GIMPLE_PHI)
2717         return 1;
2718       else if (gimple_uid (opstmta) != gimple_uid (opstmtb))
2719         return gimple_uid (opstmta) - gimple_uid (opstmtb);
2720       else
2721         return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
2722     }
2723   return rpo_numbers[bba->index] - rpo_numbers[bbb->index];
2724 }
2725
2726 /* Sort an array containing members of a strongly connected component
2727    SCC so that the members are ordered by RPO number.
2728    This means that when the sort is complete, iterating through the
2729    array will give you the members in RPO order.  */
2730
2731 static void
2732 sort_scc (VEC (tree, heap) *scc)
2733 {
2734   qsort (VEC_address (tree, scc),
2735          VEC_length (tree, scc),
2736          sizeof (tree),
2737          compare_ops);
2738 }
2739
2740 /* Process a strongly connected component in the SSA graph.  */
2741
2742 static void
2743 process_scc (VEC (tree, heap) *scc)
2744 {
2745   /* If the SCC has a single member, just visit it.  */
2746
2747   if (VEC_length (tree, scc) == 1)
2748     {
2749       tree use = VEC_index (tree, scc, 0);
2750       if (!VN_INFO (use)->use_processed)
2751         visit_use (use);
2752     }
2753   else
2754     {
2755       tree var;
2756       unsigned int i;
2757       unsigned int iterations = 0;
2758       bool changed = true;
2759
2760       /* Iterate over the SCC with the optimistic table until it stops
2761          changing.  */
2762       current_info = optimistic_info;
2763       while (changed)
2764         {
2765           changed = false;
2766           iterations++;
2767           /* As we are value-numbering optimistically we have to
2768              clear the expression tables and the simplified expressions
2769              in each iteration until we converge.  */
2770           htab_empty (optimistic_info->nary);
2771           htab_empty (optimistic_info->phis);
2772           htab_empty (optimistic_info->references);
2773           obstack_free (&optimistic_info->nary_obstack, NULL);
2774           gcc_obstack_init (&optimistic_info->nary_obstack);
2775           empty_alloc_pool (optimistic_info->phis_pool);
2776           empty_alloc_pool (optimistic_info->references_pool);
2777           for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2778             VN_INFO (var)->expr = NULL_TREE;
2779           for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2780             changed |= visit_use (var);
2781         }
2782
2783       statistics_histogram_event (cfun, "SCC iterations", iterations);
2784
2785       /* Finally, visit the SCC once using the valid table.  */
2786       current_info = valid_info;
2787       for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2788         visit_use (var);
2789     }
2790 }
2791
2792 DEF_VEC_O(ssa_op_iter);
2793 DEF_VEC_ALLOC_O(ssa_op_iter,heap);
2794
2795 /* Pop the components of the found SCC for NAME off the SCC stack
2796    and process them.  Returns true if all went well, false if
2797    we run into resource limits.  */
2798
2799 static bool
2800 extract_and_process_scc_for_name (tree name)
2801 {
2802   VEC (tree, heap) *scc = NULL;
2803   tree x;
2804
2805   /* Found an SCC, pop the components off the SCC stack and
2806      process them.  */
2807   do
2808     {
2809       x = VEC_pop (tree, sccstack);
2810
2811       VN_INFO (x)->on_sccstack = false;
2812       VEC_safe_push (tree, heap, scc, x);
2813     } while (x != name);
2814
2815   /* Bail out of SCCVN in case a SCC turns out to be incredibly large.  */
2816   if (VEC_length (tree, scc)
2817       > (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE))
2818     {
2819       if (dump_file)
2820         fprintf (dump_file, "WARNING: Giving up with SCCVN due to "
2821                  "SCC size %u exceeding %u\n", VEC_length (tree, scc),
2822                  (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE));
2823       return false;
2824     }
2825
2826   if (VEC_length (tree, scc) > 1)
2827     sort_scc (scc);
2828
2829   if (dump_file && (dump_flags & TDF_DETAILS))
2830     print_scc (dump_file, scc);
2831
2832   process_scc (scc);
2833
2834   VEC_free (tree, heap, scc);
2835
2836   return true;
2837 }
2838
2839 /* Depth first search on NAME to discover and process SCC's in the SSA
2840    graph.
2841    Execution of this algorithm relies on the fact that the SCC's are
2842    popped off the stack in topological order.
2843    Returns true if successful, false if we stopped processing SCC's due
2844    to resource constraints.  */
2845
2846 static bool
2847 DFS (tree name)
2848 {
2849   VEC(ssa_op_iter, heap) *itervec = NULL;
2850   VEC(tree, heap) *namevec = NULL;
2851   use_operand_p usep = NULL;
2852   gimple defstmt;
2853   tree use;
2854   ssa_op_iter iter;
2855
2856 start_over:
2857   /* SCC info */
2858   VN_INFO (name)->dfsnum = next_dfs_num++;
2859   VN_INFO (name)->visited = true;
2860   VN_INFO (name)->low = VN_INFO (name)->dfsnum;
2861
2862   VEC_safe_push (tree, heap, sccstack, name);
2863   VN_INFO (name)->on_sccstack = true;
2864   defstmt = SSA_NAME_DEF_STMT (name);
2865
2866   /* Recursively DFS on our operands, looking for SCC's.  */
2867   if (!gimple_nop_p (defstmt))
2868     {
2869       /* Push a new iterator.  */
2870       if (gimple_code (defstmt) == GIMPLE_PHI)
2871         usep = op_iter_init_phiuse (&iter, defstmt, SSA_OP_ALL_USES);
2872       else
2873         usep = op_iter_init_use (&iter, defstmt, SSA_OP_ALL_USES);
2874     }
2875   else
2876     clear_and_done_ssa_iter (&iter);
2877
2878   while (1)
2879     {
2880       /* If we are done processing uses of a name, go up the stack
2881          of iterators and process SCCs as we found them.  */
2882       if (op_iter_done (&iter))
2883         {
2884           /* See if we found an SCC.  */
2885           if (VN_INFO (name)->low == VN_INFO (name)->dfsnum)
2886             if (!extract_and_process_scc_for_name (name))
2887               {
2888                 VEC_free (tree, heap, namevec);
2889                 VEC_free (ssa_op_iter, heap, itervec);
2890                 return false;
2891               }
2892
2893           /* Check if we are done.  */
2894           if (VEC_empty (tree, namevec))
2895             {
2896               VEC_free (tree, heap, namevec);
2897               VEC_free (ssa_op_iter, heap, itervec);
2898               return true;
2899             }
2900
2901           /* Restore the last use walker and continue walking there.  */
2902           use = name;
2903           name = VEC_pop (tree, namevec);
2904           memcpy (&iter, VEC_last (ssa_op_iter, itervec),
2905                   sizeof (ssa_op_iter));
2906           VEC_pop (ssa_op_iter, itervec);
2907           goto continue_walking;
2908         }
2909
2910       use = USE_FROM_PTR (usep);
2911
2912       /* Since we handle phi nodes, we will sometimes get
2913          invariants in the use expression.  */
2914       if (TREE_CODE (use) == SSA_NAME)
2915         {
2916           if (! (VN_INFO (use)->visited))
2917             {
2918               /* Recurse by pushing the current use walking state on
2919                  the stack and starting over.  */
2920               VEC_safe_push(ssa_op_iter, heap, itervec, &iter);
2921               VEC_safe_push(tree, heap, namevec, name);
2922               name = use;
2923               goto start_over;
2924
2925 continue_walking:
2926               VN_INFO (name)->low = MIN (VN_INFO (name)->low,
2927                                          VN_INFO (use)->low);
2928             }
2929           if (VN_INFO (use)->dfsnum < VN_INFO (name)->dfsnum
2930               && VN_INFO (use)->on_sccstack)
2931             {
2932               VN_INFO (name)->low = MIN (VN_INFO (use)->dfsnum,
2933                                          VN_INFO (name)->low);
2934             }
2935         }
2936
2937       usep = op_iter_next_use (&iter);
2938     }
2939 }
2940
2941 /* Allocate a value number table.  */
2942
2943 static void
2944 allocate_vn_table (vn_tables_t table)
2945 {
2946   table->phis = htab_create (23, vn_phi_hash, vn_phi_eq, free_phi);
2947   table->nary = htab_create (23, vn_nary_op_hash, vn_nary_op_eq, NULL);
2948   table->references = htab_create (23, vn_reference_hash, vn_reference_eq,
2949                                    free_reference);
2950
2951   gcc_obstack_init (&table->nary_obstack);
2952   table->phis_pool = create_alloc_pool ("VN phis",
2953                                         sizeof (struct vn_phi_s),
2954                                         30);
2955   table->references_pool = create_alloc_pool ("VN references",
2956                                               sizeof (struct vn_reference_s),
2957                                               30);
2958 }
2959
2960 /* Free a value number table.  */
2961
2962 static void
2963 free_vn_table (vn_tables_t table)
2964 {
2965   htab_delete (table->phis);
2966   htab_delete (table->nary);
2967   htab_delete (table->references);
2968   obstack_free (&table->nary_obstack, NULL);
2969   free_alloc_pool (table->phis_pool);
2970   free_alloc_pool (table->references_pool);
2971 }
2972
2973 static void
2974 init_scc_vn (void)
2975 {
2976   size_t i;
2977   int j;
2978   int *rpo_numbers_temp;
2979
2980   calculate_dominance_info (CDI_DOMINATORS);
2981   sccstack = NULL;
2982   constant_to_value_id = htab_create (23, vn_constant_hash, vn_constant_eq,
2983                                   free);
2984
2985   constant_value_ids = BITMAP_ALLOC (NULL);
2986
2987   next_dfs_num = 1;
2988   next_value_id = 1;
2989
2990   vn_ssa_aux_table = VEC_alloc (vn_ssa_aux_t, heap, num_ssa_names + 1);
2991   /* VEC_alloc doesn't actually grow it to the right size, it just
2992      preallocates the space to do so.  */
2993   VEC_safe_grow_cleared (vn_ssa_aux_t, heap, vn_ssa_aux_table, num_ssa_names + 1);
2994   gcc_obstack_init (&vn_ssa_aux_obstack);
2995
2996   shared_lookup_phiargs = NULL;
2997   shared_lookup_references = NULL;
2998   rpo_numbers = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
2999   rpo_numbers_temp = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
3000   pre_and_rev_post_order_compute (NULL, rpo_numbers_temp, false);
3001
3002   /* RPO numbers is an array of rpo ordering, rpo[i] = bb means that
3003      the i'th block in RPO order is bb.  We want to map bb's to RPO
3004      numbers, so we need to rearrange this array.  */
3005   for (j = 0; j < n_basic_blocks - NUM_FIXED_BLOCKS; j++)
3006     rpo_numbers[rpo_numbers_temp[j]] = j;
3007
3008   XDELETE (rpo_numbers_temp);
3009
3010   VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
3011
3012   /* Create the VN_INFO structures, and initialize value numbers to
3013      TOP.  */
3014   for (i = 0; i < num_ssa_names; i++)
3015     {
3016       tree name = ssa_name (i);
3017       if (name)
3018         {
3019           VN_INFO_GET (name)->valnum = VN_TOP;
3020           VN_INFO (name)->expr = NULL_TREE;
3021           VN_INFO (name)->value_id = 0;
3022         }
3023     }
3024
3025   renumber_gimple_stmt_uids ();
3026
3027   /* Create the valid and optimistic value numbering tables.  */
3028   valid_info = XCNEW (struct vn_tables_s);
3029   allocate_vn_table (valid_info);
3030   optimistic_info = XCNEW (struct vn_tables_s);
3031   allocate_vn_table (optimistic_info);
3032 }
3033
3034 void
3035 free_scc_vn (void)
3036 {
3037   size_t i;
3038
3039   htab_delete (constant_to_value_id);
3040   BITMAP_FREE (constant_value_ids);
3041   VEC_free (tree, heap, shared_lookup_phiargs);
3042   VEC_free (vn_reference_op_s, heap, shared_lookup_references);
3043   XDELETEVEC (rpo_numbers);
3044
3045   for (i = 0; i < num_ssa_names; i++)
3046     {
3047       tree name = ssa_name (i);
3048       if (name
3049           && VN_INFO (name)->needs_insertion)
3050         release_ssa_name (name);
3051     }
3052   obstack_free (&vn_ssa_aux_obstack, NULL);
3053   VEC_free (vn_ssa_aux_t, heap, vn_ssa_aux_table);
3054
3055   VEC_free (tree, heap, sccstack);
3056   free_vn_table (valid_info);
3057   XDELETE (valid_info);
3058   free_vn_table (optimistic_info);
3059   XDELETE (optimistic_info);
3060 }
3061
3062 /* Set the value ids in the valid hash tables.  */
3063
3064 static void
3065 set_hashtable_value_ids (void)
3066 {
3067   htab_iterator hi;
3068   vn_nary_op_t vno;
3069   vn_reference_t vr;
3070   vn_phi_t vp;
3071
3072   /* Now set the value ids of the things we had put in the hash
3073      table.  */
3074
3075   FOR_EACH_HTAB_ELEMENT (valid_info->nary,
3076                          vno, vn_nary_op_t, hi)
3077     {
3078       if (vno->result)
3079         {
3080           if (TREE_CODE (vno->result) == SSA_NAME)
3081             vno->value_id = VN_INFO (vno->result)->value_id;
3082           else if (is_gimple_min_invariant (vno->result))
3083             vno->value_id = get_or_alloc_constant_value_id (vno->result);
3084         }
3085     }
3086
3087   FOR_EACH_HTAB_ELEMENT (valid_info->phis,
3088                          vp, vn_phi_t, hi)
3089     {
3090       if (vp->result)
3091         {
3092           if (TREE_CODE (vp->result) == SSA_NAME)
3093             vp->value_id = VN_INFO (vp->result)->value_id;
3094           else if (is_gimple_min_invariant (vp->result))
3095             vp->value_id = get_or_alloc_constant_value_id (vp->result);
3096         }
3097     }
3098
3099   FOR_EACH_HTAB_ELEMENT (valid_info->references,
3100                          vr, vn_reference_t, hi)
3101     {
3102       if (vr->result)
3103         {
3104           if (TREE_CODE (vr->result) == SSA_NAME)
3105             vr->value_id = VN_INFO (vr->result)->value_id;
3106           else if (is_gimple_min_invariant (vr->result))
3107             vr->value_id = get_or_alloc_constant_value_id (vr->result);
3108         }
3109     }
3110 }
3111
3112 /* Do SCCVN.  Returns true if it finished, false if we bailed out
3113    due to resource constraints.  */
3114
3115 bool
3116 run_scc_vn (bool may_insert_arg)
3117 {
3118   size_t i;
3119   tree param;
3120   bool changed = true;
3121
3122   may_insert = may_insert_arg;
3123
3124   init_scc_vn ();
3125   current_info = valid_info;
3126
3127   for (param = DECL_ARGUMENTS (current_function_decl);
3128        param;
3129        param = TREE_CHAIN (param))
3130     {
3131       if (gimple_default_def (cfun, param) != NULL)
3132         {
3133           tree def = gimple_default_def (cfun, param);
3134           VN_INFO (def)->valnum = def;
3135         }
3136     }
3137
3138   for (i = 1; i < num_ssa_names; ++i)
3139     {
3140       tree name = ssa_name (i);
3141       if (name
3142           && VN_INFO (name)->visited == false
3143           && !has_zero_uses (name))
3144         if (!DFS (name))
3145           {
3146             free_scc_vn ();
3147             may_insert = false;
3148             return false;
3149           }
3150     }
3151
3152   /* Initialize the value ids.  */
3153
3154   for (i = 1; i < num_ssa_names; ++i)
3155     {
3156       tree name = ssa_name (i);
3157       vn_ssa_aux_t info;
3158       if (!name)
3159         continue;
3160       info = VN_INFO (name);
3161       if (info->valnum == name
3162           || info->valnum == VN_TOP)
3163         info->value_id = get_next_value_id ();
3164       else if (is_gimple_min_invariant (info->valnum))
3165         info->value_id = get_or_alloc_constant_value_id (info->valnum);
3166     }
3167
3168   /* Propagate until they stop changing.  */
3169   while (changed)
3170     {
3171       changed = false;
3172       for (i = 1; i < num_ssa_names; ++i)
3173         {
3174           tree name = ssa_name (i);
3175           vn_ssa_aux_t info;
3176           if (!name)
3177             continue;
3178           info = VN_INFO (name);
3179           if (TREE_CODE (info->valnum) == SSA_NAME
3180               && info->valnum != name
3181               && info->value_id != VN_INFO (info->valnum)->value_id)
3182             {
3183               changed = true;
3184               info->value_id = VN_INFO (info->valnum)->value_id;
3185             }
3186         }
3187     }
3188
3189   set_hashtable_value_ids ();
3190
3191   if (dump_file && (dump_flags & TDF_DETAILS))
3192     {
3193       fprintf (dump_file, "Value numbers:\n");
3194       for (i = 0; i < num_ssa_names; i++)
3195         {
3196           tree name = ssa_name (i);
3197           if (name
3198               && VN_INFO (name)->visited
3199               && SSA_VAL (name) != name)
3200             {
3201               print_generic_expr (dump_file, name, 0);
3202               fprintf (dump_file, " = ");
3203               print_generic_expr (dump_file, SSA_VAL (name), 0);
3204               fprintf (dump_file, "\n");
3205             }
3206         }
3207     }
3208
3209   may_insert = false;
3210   return true;
3211 }
3212
3213 /* Return the maximum value id we have ever seen.  */
3214
3215 unsigned int
3216 get_max_value_id (void)
3217 {
3218   return next_value_id;
3219 }
3220
3221 /* Return the next unique value id.  */
3222
3223 unsigned int
3224 get_next_value_id (void)
3225 {
3226   return next_value_id++;
3227 }
3228
3229
3230 /* Compare two expressions E1 and E2 and return true if they are equal.  */
3231
3232 bool
3233 expressions_equal_p (tree e1, tree e2)
3234 {
3235   /* The obvious case.  */
3236   if (e1 == e2)
3237     return true;
3238
3239   /* If only one of them is null, they cannot be equal.  */
3240   if (!e1 || !e2)
3241     return false;
3242
3243   /* Recurse on elements of lists.  */
3244   if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST)
3245     {
3246       tree lop1 = e1;
3247       tree lop2 = e2;
3248       for (lop1 = e1, lop2 = e2;
3249            lop1 || lop2;
3250            lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2))
3251         {
3252           if (!lop1 || !lop2)
3253             return false;
3254           if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2)))
3255             return false;
3256         }
3257       return true;
3258     }
3259
3260   /* Now perform the actual comparison.  */
3261   if (TREE_CODE (e1) == TREE_CODE (e2)
3262       && operand_equal_p (e1, e2, OEP_PURE_SAME))
3263     return true;
3264
3265   return false;
3266 }
3267
3268
3269 /* Return true if the nary operation NARY may trap.  This is a copy
3270    of stmt_could_throw_1_p adjusted to the SCCVN IL.  */
3271
3272 bool
3273 vn_nary_may_trap (vn_nary_op_t nary)
3274 {
3275   tree type;
3276   tree rhs2;
3277   bool honor_nans = false;
3278   bool honor_snans = false;
3279   bool fp_operation = false;
3280   bool honor_trapv = false;
3281   bool handled, ret;
3282   unsigned i;
3283
3284   if (TREE_CODE_CLASS (nary->opcode) == tcc_comparison
3285       || TREE_CODE_CLASS (nary->opcode) == tcc_unary
3286       || TREE_CODE_CLASS (nary->opcode) == tcc_binary)
3287     {
3288       type = nary->type;
3289       fp_operation = FLOAT_TYPE_P (type);
3290       if (fp_operation)
3291         {
3292           honor_nans = flag_trapping_math && !flag_finite_math_only;
3293           honor_snans = flag_signaling_nans != 0;
3294         }
3295       else if (INTEGRAL_TYPE_P (type)
3296                && TYPE_OVERFLOW_TRAPS (type))
3297         honor_trapv = true;
3298     }
3299   rhs2 = nary->op[1];
3300   ret = operation_could_trap_helper_p (nary->opcode, fp_operation,
3301                                        honor_trapv,
3302                                        honor_nans, honor_snans, rhs2,
3303                                        &handled);
3304   if (handled
3305       && ret)
3306     return true;
3307
3308   for (i = 0; i < nary->length; ++i)
3309     if (tree_could_trap_p (nary->op[i]))
3310       return true;
3311
3312   return false;
3313 }