OSDN Git Service

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