OSDN Git Service

PR testsuite/33082
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-sccvn.c
1 /* SCC value numbering for trees
2    Copyright (C) 2006, 2007
3    Free Software Foundation, Inc.
4    Contributed by Daniel Berlin <dan@dberlin.org>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "tree.h"
28 #include "basic-block.h"
29 #include "diagnostic.h"
30 #include "tree-inline.h"
31 #include "tree-flow.h"
32 #include "tree-gimple.h"
33 #include "tree-dump.h"
34 #include "timevar.h"
35 #include "fibheap.h"
36 #include "hashtab.h"
37 #include "tree-iterator.h"
38 #include "real.h"
39 #include "alloc-pool.h"
40 #include "tree-pass.h"
41 #include "flags.h"
42 #include "bitmap.h"
43 #include "langhooks.h"
44 #include "cfgloop.h"
45 #include "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 unary;
110   htab_t binary;
111   htab_t phis;
112   htab_t references;
113   alloc_pool unary_op_pool;
114   alloc_pool binary_op_pool;
115   alloc_pool phis_pool;
116   alloc_pool references_pool;
117 } *vn_tables_t;
118
119 /* Binary operations in the hashtable consist of two operands, an
120    opcode, and a type.  Result is the value number of the operation,
121    and hashcode is stored to avoid having to calculate it
122    repeatedly.  */
123
124 typedef struct vn_binary_op_s
125 {
126   enum tree_code opcode;
127   tree type;
128   tree op0;
129   tree op1;
130   hashval_t hashcode;
131   tree result;
132 } *vn_binary_op_t;
133 typedef const struct vn_binary_op_s *const_vn_binary_op_t;
134
135 /* Unary operations in the hashtable consist of a single operand, an
136    opcode, and a type.  Result is the value number of the operation,
137    and hashcode is stored to avoid having to calculate it repeatedly. */
138
139 typedef struct vn_unary_op_s
140 {
141   enum tree_code opcode;
142   tree type;
143   tree op0;
144   hashval_t hashcode;
145   tree result;
146 } *vn_unary_op_t;
147 typedef const struct vn_unary_op_s *const_vn_unary_op_t;
148
149 /* Phi nodes in the hashtable consist of their non-VN_TOP phi
150    arguments, and the basic block the phi is in. Result is the value
151    number of the operation, and hashcode is stored to avoid having to
152    calculate it repeatedly.  Phi nodes not in the same block are never
153    considered equivalent.  */
154
155 typedef struct vn_phi_s
156 {
157   VEC (tree, heap) *phiargs;
158   basic_block block;
159   hashval_t hashcode;
160   tree result;
161 } *vn_phi_t;
162 typedef const struct vn_phi_s *const_vn_phi_t;
163
164 /* Reference operands only exist in reference operations structures.
165    They consist of an opcode, type, and some number of operands.  For
166    a given opcode, some, all, or none of the operands may be used.
167    The operands are there to store the information that makes up the
168    portion of the addressing calculation that opcode performs.  */
169
170 typedef struct vn_reference_op_struct
171 {
172   enum tree_code opcode;
173   tree type;
174   tree op0;
175   tree op1;
176   tree op2;
177 } vn_reference_op_s;
178 typedef vn_reference_op_s *vn_reference_op_t;
179 typedef const vn_reference_op_s *const_vn_reference_op_t;
180
181 DEF_VEC_O(vn_reference_op_s);
182 DEF_VEC_ALLOC_O(vn_reference_op_s, heap);
183
184 /* A reference operation in the hashtable is representation as a
185    collection of vuses, representing the memory state at the time of
186    the operation, and a collection of operands that make up the
187    addressing calculation.  If two vn_reference_t's have the same set
188    of operands, they access the same memory location. We also store
189    the resulting value number, and the hashcode.  The vuses are
190    always stored in order sorted by ssa name version.  */
191
192 typedef struct vn_reference_s
193 {
194   VEC (tree, gc) *vuses;
195   VEC (vn_reference_op_s, heap) *operands;
196   hashval_t hashcode;
197   tree result;
198 } *vn_reference_t;
199 typedef const struct vn_reference_s *const_vn_reference_t;
200
201 /* Valid hashtables storing information we have proven to be
202    correct.  */
203
204 static vn_tables_t valid_info;
205
206 /* Optimistic hashtables storing information we are making assumptions about
207    during iterations.  */
208
209 static vn_tables_t optimistic_info;
210
211 /* PRE hashtables storing information about mapping from expressions to
212    value handles.  */
213
214 static vn_tables_t pre_info;
215
216 /* Pointer to the set of hashtables that is currently being used.
217    Should always point to either the optimistic_info, or the
218    valid_info.  */
219
220 static vn_tables_t current_info;
221
222
223 /* Reverse post order index for each basic block.  */
224
225 static int *rpo_numbers;
226
227 #define SSA_VAL(x) (VN_INFO ((x))->valnum)
228
229 /* This represents the top of the VN lattice, which is the universal
230    value.  */
231
232 tree VN_TOP;
233
234 /* Next DFS number and the stack for strongly connected component
235    detection. */
236
237 static unsigned int next_dfs_num;
238 static VEC (tree, heap) *sccstack;
239
240 DEF_VEC_P(vn_ssa_aux_t);
241 DEF_VEC_ALLOC_P(vn_ssa_aux_t, heap);
242
243 /* Table of vn_ssa_aux_t's, one per ssa_name.  */
244
245 static VEC (vn_ssa_aux_t, heap) *vn_ssa_aux_table;
246
247 /* Return the value numbering information for a given SSA name.  */
248
249 vn_ssa_aux_t
250 VN_INFO (tree name)
251 {
252   return VEC_index (vn_ssa_aux_t, vn_ssa_aux_table,
253                     SSA_NAME_VERSION (name));
254 }
255
256 /* Set the value numbering info for a given SSA name to a given
257    value.  */
258
259 static inline void
260 VN_INFO_SET (tree name, vn_ssa_aux_t value)
261 {
262   VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
263                SSA_NAME_VERSION (name), value);
264 }
265
266 /* Get the value numbering info for a given SSA name, creating it if
267    it does not exist.  */ 
268
269 vn_ssa_aux_t
270 VN_INFO_GET (tree name)
271 {
272   vn_ssa_aux_t newinfo = XCNEW (struct vn_ssa_aux);
273   if (SSA_NAME_VERSION (name) >= VEC_length (vn_ssa_aux_t, vn_ssa_aux_table))
274     VEC_safe_grow (vn_ssa_aux_t, heap, vn_ssa_aux_table,
275                    SSA_NAME_VERSION (name) + 1);
276   VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
277                SSA_NAME_VERSION (name), newinfo);
278   return newinfo;
279 }
280
281
282 /* Compare two reference operands P1 and P2 for equality.  return true if
283    they are equal, and false otherwise.  */
284
285 static int
286 vn_reference_op_eq (const void *p1, const void *p2)
287 {
288   const_vn_reference_op_t const vro1 = (const_vn_reference_op_t) p1;
289   const_vn_reference_op_t const vro2 = (const_vn_reference_op_t) p2;
290   return vro1->opcode == vro2->opcode
291     && vro1->type == vro2->type
292     && expressions_equal_p (vro1->op0, vro2->op0)
293     && expressions_equal_p (vro1->op1, vro2->op1)
294     && expressions_equal_p (vro1->op2, vro2->op2);
295 }
296
297 /* Compute the hash for a reference operand VRO1  */
298
299 static hashval_t
300 vn_reference_op_compute_hash (const vn_reference_op_t vro1)
301 {
302   return iterative_hash_expr (vro1->op0, vro1->opcode)
303     + iterative_hash_expr (vro1->op1, vro1->opcode)
304     + iterative_hash_expr (vro1->op2, vro1->opcode);
305 }
306
307 /* Return the hashcode for a given reference operation P1.  */
308
309 static hashval_t
310 vn_reference_hash (const void *p1)
311 {
312   const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
313   return vr1->hashcode;
314 }
315
316 /* Compute a hash for the reference operation VR1 and return it.  */
317
318 static inline hashval_t
319 vn_reference_compute_hash (const vn_reference_t vr1)
320 {
321   hashval_t result = 0;
322   tree v;
323   int i;
324   vn_reference_op_t vro;
325
326   for (i = 0; VEC_iterate (tree, vr1->vuses, i, v); i++)
327     result += iterative_hash_expr (v, 0);
328   for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
329     result += vn_reference_op_compute_hash (vro);
330
331   return result;
332 }
333
334 /* Return true if reference operations P1 and P2 are equivalent.  This
335    means they have the same set of operands and vuses.  */
336
337 static int
338 vn_reference_eq (const void *p1, const void *p2)
339 {
340   tree v;
341   int i;
342   vn_reference_op_t vro;
343
344   const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
345   const_vn_reference_t const vr2 = (const_vn_reference_t) p2;
346
347   if (vr1->vuses == vr2->vuses
348       && vr1->operands == vr2->operands)
349     return true;
350
351   /* Impossible for them to be equivalent if they have different
352      number of vuses.  */
353   if (VEC_length (tree, vr1->vuses) != VEC_length (tree, vr2->vuses))
354     return false;
355
356   /* We require that address operands be canonicalized in a way that
357      two memory references will have the same operands if they are
358      equivalent.  */
359   if (VEC_length (vn_reference_op_s, vr1->operands)
360       != VEC_length (vn_reference_op_s, vr2->operands))
361     return false;
362
363   /* The memory state is more often different than the address of the
364      store/load, so check it first.  */
365   for (i = 0; VEC_iterate (tree, vr1->vuses, i, v); i++)
366     {
367       if (VEC_index (tree, vr2->vuses, i) != v)
368         return false;
369     }
370   
371   for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
372     {
373       if (!vn_reference_op_eq (VEC_index (vn_reference_op_s, vr2->operands, i),
374                                vro))
375         return false;
376     }
377   return true;
378 }
379
380 /* Place the vuses from STMT into *result */
381
382 static inline void
383 vuses_to_vec (tree stmt, VEC (tree, gc) **result)
384 {
385   ssa_op_iter iter;
386   tree vuse;
387
388   if (!stmt)
389     return;
390
391   FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VIRTUAL_USES)
392     VEC_safe_push (tree, gc, *result, vuse);
393
394   if (VEC_length (tree, *result) > 1)
395     sort_vuses (*result);
396 }
397
398
399 /* Copy the VUSE names in STMT into a vector, and return
400    the vector.  */
401
402 VEC (tree, gc) *
403 copy_vuses_from_stmt (tree stmt)
404 {
405   VEC (tree, gc) *vuses = NULL;
406
407   vuses_to_vec (stmt, &vuses);
408
409   return vuses;
410 }
411
412 /* Place the vdefs from STMT into *result */
413
414 static inline void
415 vdefs_to_vec (tree stmt, VEC (tree, gc) **result)
416 {
417   ssa_op_iter iter;
418   tree vdef;
419
420   if (!stmt)
421     return;
422
423   FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, iter, SSA_OP_VIRTUAL_DEFS)
424     VEC_safe_push (tree, gc, *result, vdef);
425
426   if (VEC_length (tree, *result) > 1)
427     sort_vuses (*result);
428 }
429
430 /* Copy the names of vdef results in STMT into a vector, and return
431    the vector.  */
432
433 static VEC (tree, gc) *
434 copy_vdefs_from_stmt (tree stmt)
435 {
436   VEC (tree, gc) *vdefs = NULL;
437
438   vdefs_to_vec (stmt, &vdefs);
439
440   return vdefs;
441 }
442
443 /* Place for shared_v{uses/defs}_from_stmt to shove vuses/vdefs.  */
444 static VEC (tree, gc) *shared_lookup_vops;
445
446 /* Copy the virtual uses from STMT into SHARED_LOOKUP_VOPS.
447    This function will overwrite the current SHARED_LOOKUP_VOPS
448    variable.  */
449
450 VEC (tree, gc) *
451 shared_vuses_from_stmt (tree stmt)
452 {
453   VEC_truncate (tree, shared_lookup_vops, 0);
454   vuses_to_vec (stmt, &shared_lookup_vops);
455
456   return shared_lookup_vops;
457 }
458
459 /* Copy the operations present in load/store/call REF into RESULT, a vector of
460    vn_reference_op_s's.  */
461
462 static void
463 copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
464 {
465   /* Calls are different from all other reference operations.  */
466   if (TREE_CODE (ref) == CALL_EXPR)
467     {
468       vn_reference_op_s temp;
469       tree callfn;
470       call_expr_arg_iterator iter;
471       tree callarg;
472
473       /* Copy the call_expr opcode, type, function being called, and
474          arguments.  */
475       memset (&temp, 0, sizeof (temp));
476       temp.type = TREE_TYPE (ref);
477       temp.opcode = CALL_EXPR;
478       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
479
480       callfn = get_callee_fndecl (ref);
481       if (!callfn)
482         callfn = CALL_EXPR_FN (ref);
483       temp.type = TREE_TYPE (callfn);
484       temp.opcode = TREE_CODE (callfn);
485       temp.op0 = callfn;
486       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
487
488       FOR_EACH_CALL_EXPR_ARG (callarg, iter, ref)
489         {
490           memset (&temp, 0, sizeof (temp));
491           temp.type = TREE_TYPE (callarg);
492           temp.opcode = TREE_CODE (callarg);
493           temp.op0 = callarg;
494           VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
495         }
496       return;
497     }
498
499   /* For non-calls, store the information that makes up the address.  */
500
501   while (ref)
502     {
503       vn_reference_op_s temp;
504
505       memset (&temp, 0, sizeof (temp));
506       temp.type = TREE_TYPE (ref);
507       temp.opcode = TREE_CODE (ref);
508
509       switch (temp.opcode)
510         {
511         case ALIGN_INDIRECT_REF:
512         case MISALIGNED_INDIRECT_REF:
513         case INDIRECT_REF:
514           /* The only operand is the address, which gets its own
515              vn_reference_op_s structure.  */
516           break;
517         case BIT_FIELD_REF:
518           /* Record bits and position.  */
519           temp.op0 = TREE_OPERAND (ref, 1);
520           temp.op1 = TREE_OPERAND (ref, 2);
521           break;
522         case COMPONENT_REF:
523           /* Record field as operand.  */
524           temp.op0 = TREE_OPERAND (ref, 1);
525           break;
526         case ARRAY_RANGE_REF:
527         case ARRAY_REF:
528           /* Record index as operand.  */
529           temp.op0 = TREE_OPERAND (ref, 1);
530           temp.op1 = TREE_OPERAND (ref, 3);
531           break;
532         case STRING_CST:
533         case INTEGER_CST:
534         case COMPLEX_CST:
535         case VECTOR_CST:
536         case REAL_CST:
537         case VALUE_HANDLE:
538         case VAR_DECL:
539         case PARM_DECL:
540         case CONST_DECL:
541         case RESULT_DECL:
542         case SSA_NAME:
543           temp.op0 = ref;
544           break;
545           /* These are only interesting for their operands, their
546              existence, and their type.  They will never be the last
547              ref in the chain of references (IE they require an
548              operand), so we don't have to put anything
549              for op* as it will be handled by the iteration  */
550         case IMAGPART_EXPR:
551         case REALPART_EXPR:
552         case VIEW_CONVERT_EXPR:
553         case ADDR_EXPR:
554           break;
555         default:
556           gcc_unreachable ();
557           
558         }
559       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
560
561       if (REFERENCE_CLASS_P (ref) || TREE_CODE (ref) == ADDR_EXPR)
562         ref = TREE_OPERAND (ref, 0);
563       else
564         ref = NULL_TREE;
565     }
566 }
567
568 /* Create a vector of vn_reference_op_s structures from REF, a
569    REFERENCE_CLASS_P tree.  The vector is not shared. */
570
571 static VEC(vn_reference_op_s, heap) *
572 create_reference_ops_from_ref (tree ref)
573 {
574   VEC (vn_reference_op_s, heap) *result = NULL;
575
576   copy_reference_ops_from_ref (ref, &result);
577   return result;
578 }
579
580 static VEC(vn_reference_op_s, heap) *shared_lookup_references;
581
582 /* Create a vector of vn_reference_op_s structures from REF, a
583    REFERENCE_CLASS_P tree.  The vector is shared among all callers of
584    this function.  */
585
586 static VEC(vn_reference_op_s, heap) *
587 shared_reference_ops_from_ref (tree ref)
588 {
589   if (!ref)
590     return NULL;
591   VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
592   copy_reference_ops_from_ref (ref, &shared_lookup_references);
593   return shared_lookup_references;
594 }
595
596
597 /* Transform any SSA_NAME's in a vector of vn_reference_op_s
598    structures into their value numbers.  This is done in-place, and
599    the vector passed in is returned.  */
600
601 static VEC (vn_reference_op_s, heap) *
602 valueize_refs (VEC (vn_reference_op_s, heap) *orig)
603 {
604   vn_reference_op_t vro;
605   int i;
606
607   for (i = 0; VEC_iterate (vn_reference_op_s, orig, i, vro); i++)
608     {
609       if (vro->opcode == SSA_NAME
610           || (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME))
611         vro->op0 = SSA_VAL (vro->op0);
612     }
613
614   return orig;
615 }
616
617 /* Transform any SSA_NAME's in ORIG, a vector of vuse trees, into
618    their value numbers. This is done in-place, and the vector passed
619    in is returned.  */
620
621 static VEC (tree, gc) *
622 valueize_vuses (VEC (tree, gc) *orig)
623 {
624   bool made_replacement = false;
625   tree vuse;
626   int i;
627
628   for (i = 0; VEC_iterate (tree, orig, i, vuse); i++)
629     {
630       if (vuse != SSA_VAL (vuse))
631         {
632           made_replacement = true;
633           VEC_replace (tree, orig, i, SSA_VAL (vuse));
634         }
635     }
636
637   if (made_replacement && VEC_length (tree, orig) > 1)
638     sort_vuses (orig);
639
640   return orig;
641 }
642
643 /* Lookup OP in the current hash table, and return the resulting
644    value number if it exists in the hash table.  Return NULL_TREE if
645    it does not exist in the hash table. */
646
647 tree
648 vn_reference_lookup (tree op, VEC (tree, gc) *vuses)
649 {
650   void **slot;
651   struct vn_reference_s vr1;
652
653   vr1.vuses = valueize_vuses (vuses);
654   vr1.operands = valueize_refs (shared_reference_ops_from_ref (op));
655   vr1.hashcode = vn_reference_compute_hash (&vr1);
656   slot = htab_find_slot_with_hash (current_info->references, &vr1, vr1.hashcode,
657                                    NO_INSERT);
658   if (!slot)
659     return NULL_TREE;
660
661   return ((vn_reference_t)*slot)->result;
662 }
663
664 /* Insert OP into the current hash table with a value number of
665    RESULT.  */
666
667 void
668 vn_reference_insert (tree op, tree result, VEC (tree, gc) *vuses)
669 {
670   void **slot;
671   vn_reference_t vr1;
672
673   vr1 = (vn_reference_t) pool_alloc (current_info->references_pool);
674
675   vr1->vuses = valueize_vuses (vuses);
676   vr1->operands = valueize_refs (create_reference_ops_from_ref (op));
677   vr1->hashcode = vn_reference_compute_hash (vr1);
678   vr1->result = TREE_CODE (result) == SSA_NAME ? SSA_VAL (result) : result;
679
680   slot = htab_find_slot_with_hash (current_info->references, vr1, vr1->hashcode,
681                                    INSERT);
682
683   /* Because we lookup stores using vuses, and value number failures
684      using the vdefs (see visit_reference_op_store for how and why),
685      it's possible that on failure we may try to insert an already
686      inserted store.  This is not wrong, there is no ssa name for a
687      store that we could use as a differentiator anyway.  Thus, unlike
688      the other lookup functions, you cannot gcc_assert (!*slot)
689      here.  */
690
691
692   *slot = vr1;
693 }
694
695
696 /* Return the stored hashcode for a unary operation.  */
697
698 static hashval_t
699 vn_unary_op_hash (const void *p1)
700 {
701   const_vn_unary_op_t const vuo1 = (const_vn_unary_op_t) p1;
702   return vuo1->hashcode;
703 }
704
705 /* Hash a unary operation P1 and return the result.  */
706
707 static inline hashval_t
708 vn_unary_op_compute_hash (const vn_unary_op_t vuo1)
709 {
710   return iterative_hash_expr (vuo1->op0, vuo1->opcode);
711 }
712
713 /* Return true if P1 and P2, two unary operations, are equivalent.  */
714
715 static int
716 vn_unary_op_eq (const void *p1, const void *p2)
717 {
718   const_vn_unary_op_t const vuo1 = (const_vn_unary_op_t) p1;
719   const_vn_unary_op_t const vuo2 = (const_vn_unary_op_t) p2;
720   return vuo1->opcode == vuo2->opcode
721     && vuo1->type == vuo2->type
722     && expressions_equal_p (vuo1->op0, vuo2->op0);
723 }
724
725 /* Lookup OP in the current hash table, and return the resulting
726    value number if it exists in the hash table.  Return NULL_TREE if
727    it does not exist in the hash table. */
728
729 tree
730 vn_unary_op_lookup (tree op)
731 {
732   void **slot;
733   struct vn_unary_op_s vuo1;
734
735   vuo1.opcode = TREE_CODE (op);
736   vuo1.type = TREE_TYPE (op);
737   vuo1.op0 = TREE_OPERAND (op, 0);
738
739   if (TREE_CODE (vuo1.op0) == SSA_NAME)
740     vuo1.op0 = SSA_VAL (vuo1.op0);
741
742   vuo1.hashcode = vn_unary_op_compute_hash (&vuo1);
743   slot = htab_find_slot_with_hash (current_info->unary, &vuo1, vuo1.hashcode,
744                                    NO_INSERT);
745   if (!slot)
746     return NULL_TREE;
747   return ((vn_unary_op_t)*slot)->result;
748 }
749
750 /* Insert OP into the current hash table with a value number of
751    RESULT.  */
752
753 void
754 vn_unary_op_insert (tree op, tree result)
755 {
756   void **slot;
757   vn_unary_op_t vuo1 = (vn_unary_op_t) pool_alloc (current_info->unary_op_pool);
758
759   vuo1->opcode = TREE_CODE (op);
760   vuo1->type = TREE_TYPE (op);
761   vuo1->op0 = TREE_OPERAND (op, 0);
762   vuo1->result = result;
763
764   if (TREE_CODE (vuo1->op0) == SSA_NAME)
765     vuo1->op0 = SSA_VAL (vuo1->op0);
766
767   vuo1->hashcode = vn_unary_op_compute_hash (vuo1);
768   slot = htab_find_slot_with_hash (current_info->unary, vuo1, vuo1->hashcode,
769                                    INSERT);
770   gcc_assert (!*slot);
771   *slot = vuo1;
772 }
773
774 /* Compute and return the hash value for binary operation VBO1.  */
775
776 static inline hashval_t
777 vn_binary_op_compute_hash (const vn_binary_op_t vbo1)
778 {
779   return iterative_hash_expr (vbo1->op0, vbo1->opcode)
780     + iterative_hash_expr (vbo1->op1, vbo1->opcode);
781 }
782
783 /* Return the computed hashcode for binary operation P1.  */
784
785 static hashval_t
786 vn_binary_op_hash (const void *p1)
787 {
788   const_vn_binary_op_t const vbo1 = (const_vn_binary_op_t) p1;
789   return vbo1->hashcode;
790 }
791
792 /* Compare binary operations P1 and P2 and return true if they are
793    equivalent.  */
794
795 static int
796 vn_binary_op_eq (const void *p1, const void *p2)
797 {
798   const_vn_binary_op_t const vbo1 = (const_vn_binary_op_t) p1;
799   const_vn_binary_op_t const vbo2 = (const_vn_binary_op_t) p2;
800   return vbo1->opcode == vbo2->opcode
801     && vbo1->type == vbo2->type
802     && expressions_equal_p (vbo1->op0, vbo2->op0)
803     && expressions_equal_p (vbo1->op1, vbo2->op1);
804 }
805
806 /* Lookup OP in the current hash table, and return the resulting
807    value number if it exists in the hash table.  Return NULL_TREE if
808    it does not exist in the hash table. */
809
810 tree
811 vn_binary_op_lookup (tree op)
812 {
813   void **slot;
814   struct vn_binary_op_s vbo1;
815
816   vbo1.opcode = TREE_CODE (op);
817   vbo1.type = TREE_TYPE (op);
818   vbo1.op0 = TREE_OPERAND (op, 0);
819   vbo1.op1 = TREE_OPERAND (op, 1);
820
821   if (TREE_CODE (vbo1.op0) == SSA_NAME)
822     vbo1.op0 = SSA_VAL (vbo1.op0);
823   if (TREE_CODE (vbo1.op1) == SSA_NAME)
824     vbo1.op1 = SSA_VAL (vbo1.op1);
825
826   if (tree_swap_operands_p (vbo1.op0, vbo1.op1, false)
827       && commutative_tree_code (vbo1.opcode))
828     {
829       tree temp = vbo1.op0;
830       vbo1.op0 = vbo1.op1;
831       vbo1.op1 = temp;
832     }
833
834   vbo1.hashcode = vn_binary_op_compute_hash (&vbo1);
835   slot = htab_find_slot_with_hash (current_info->binary, &vbo1, vbo1.hashcode,
836                                    NO_INSERT);
837   if (!slot)
838     return NULL_TREE;
839   return ((vn_binary_op_t)*slot)->result;
840 }
841
842 /* Insert OP into the current hash table with a value number of
843    RESULT.  */
844
845 void
846 vn_binary_op_insert (tree op, tree result)
847 {
848   void **slot;
849   vn_binary_op_t vbo1;
850   vbo1 = (vn_binary_op_t) pool_alloc (current_info->binary_op_pool);
851
852   vbo1->opcode = TREE_CODE (op);
853   vbo1->type = TREE_TYPE (op);
854   vbo1->op0 = TREE_OPERAND (op, 0);
855   vbo1->op1 = TREE_OPERAND (op, 1);
856   vbo1->result = result;
857
858   if (TREE_CODE (vbo1->op0) == SSA_NAME)
859     vbo1->op0 = SSA_VAL (vbo1->op0);
860   if (TREE_CODE (vbo1->op1) == SSA_NAME)
861     vbo1->op1 = SSA_VAL (vbo1->op1);
862
863   if (tree_swap_operands_p (vbo1->op0, vbo1->op1, false)
864       && commutative_tree_code (vbo1->opcode))
865     {
866       tree temp = vbo1->op0;
867       vbo1->op0 = vbo1->op1;
868       vbo1->op1 = temp;
869     }
870   vbo1->hashcode = vn_binary_op_compute_hash (vbo1);
871   slot = htab_find_slot_with_hash (current_info->binary, vbo1, vbo1->hashcode,
872                                    INSERT);
873   gcc_assert (!*slot);
874
875   *slot = vbo1;
876 }
877
878 /* Compute a hashcode for PHI operation VP1 and return it.  */
879
880 static inline hashval_t
881 vn_phi_compute_hash (vn_phi_t vp1)
882 {
883   hashval_t result = 0;
884   int i;
885   tree phi1op;
886
887   result = vp1->block->index;
888
889   for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
890     {
891       if (phi1op == VN_TOP)
892         continue;
893       result += iterative_hash_expr (phi1op, result);
894     }
895
896   return result;
897 }
898
899 /* Return the computed hashcode for phi operation P1.  */
900
901 static hashval_t
902 vn_phi_hash (const void *p1)
903 {
904   const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
905   return vp1->hashcode;
906 }
907
908 /* Compare two phi entries for equality, ignoring VN_TOP arguments.  */
909
910 static int
911 vn_phi_eq (const void *p1, const void *p2)
912 {
913   const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
914   const_vn_phi_t const vp2 = (const_vn_phi_t) p2;
915
916   if (vp1->block == vp2->block)
917     {
918       int i;
919       tree phi1op;
920
921       /* Any phi in the same block will have it's arguments in the
922          same edge order, because of how we store phi nodes.  */
923       for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
924         {
925           tree phi2op = VEC_index (tree, vp2->phiargs, i);
926           if (phi1op == VN_TOP || phi2op == VN_TOP)
927             continue;
928           if (!expressions_equal_p (phi1op, phi2op))
929             return false;
930         }
931       return true;
932     }
933   return false;
934 }
935
936 static VEC(tree, heap) *shared_lookup_phiargs;
937
938 /* Lookup PHI in the current hash table, and return the resulting
939    value number if it exists in the hash table.  Return NULL_TREE if
940    it does not exist in the hash table. */
941
942 static tree
943 vn_phi_lookup (tree phi)
944 {
945   void **slot;
946   struct vn_phi_s vp1;
947   int i;
948
949   VEC_truncate (tree, shared_lookup_phiargs, 0);
950
951   /* Canonicalize the SSA_NAME's to their value number.  */
952   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
953     {
954       tree def = PHI_ARG_DEF (phi, i);
955       def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
956       VEC_safe_push (tree, heap, shared_lookup_phiargs, def);
957     }
958   vp1.phiargs = shared_lookup_phiargs;
959   vp1.block = bb_for_stmt (phi);
960   vp1.hashcode = vn_phi_compute_hash (&vp1);
961   slot = htab_find_slot_with_hash (current_info->phis, &vp1, vp1.hashcode,
962                                    NO_INSERT);
963   if (!slot)
964     return NULL_TREE;
965   return ((vn_phi_t)*slot)->result;
966 }
967
968 /* Insert PHI into the current hash table with a value number of
969    RESULT.  */
970
971 static void
972 vn_phi_insert (tree phi, tree result)
973 {
974   void **slot;
975   vn_phi_t vp1 = (vn_phi_t) pool_alloc (current_info->phis_pool);
976   int i;
977   VEC (tree, heap) *args = NULL;
978
979   /* Canonicalize the SSA_NAME's to their value number.  */
980   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
981     {
982       tree def = PHI_ARG_DEF (phi, i);
983       def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
984       VEC_safe_push (tree, heap, args, def);
985     }
986   vp1->phiargs = args;
987   vp1->block = bb_for_stmt (phi);
988   vp1->result = result;
989   vp1->hashcode = vn_phi_compute_hash (vp1);
990
991   slot = htab_find_slot_with_hash (current_info->phis, vp1, vp1->hashcode,
992                                    INSERT);
993
994   /* Because we iterate over phi operations more than once, it's
995      possible the slot might already exist here, hence no assert.*/
996   *slot = vp1;
997 }
998
999
1000 /* Print set of components in strongly connected component SCC to OUT. */
1001
1002 static void
1003 print_scc (FILE *out, VEC (tree, heap) *scc)
1004 {
1005   tree var;
1006   unsigned int i;
1007
1008   fprintf (out, "SCC consists of: ");
1009   for (i = 0; VEC_iterate (tree, scc, i, var); i++)
1010     {
1011       print_generic_expr (out, var, 0);
1012       fprintf (out, " ");
1013     }
1014   fprintf (out, "\n");
1015 }
1016
1017 /* Set the value number of FROM to TO, return true if it has changed
1018    as a result.  */
1019
1020 static inline bool
1021 set_ssa_val_to (tree from, tree to)
1022 {
1023   tree currval;
1024
1025   /* The only thing we allow as value numbers are VN_TOP, ssa_names
1026      and invariants.  So assert that here.  */
1027   gcc_assert (to != NULL_TREE
1028               && (to == VN_TOP
1029                   || TREE_CODE (to) == SSA_NAME
1030                   || is_gimple_min_invariant (to)));
1031
1032   if (dump_file && (dump_flags & TDF_DETAILS))
1033     {
1034       fprintf (dump_file, "Setting value number of ");
1035       print_generic_expr (dump_file, from, 0);
1036       fprintf (dump_file, " to ");
1037       print_generic_expr (dump_file, to, 0);
1038       fprintf (dump_file, "\n");
1039     }
1040
1041   currval = SSA_VAL (from);
1042
1043   if (currval != to  && !operand_equal_p (currval, to, OEP_PURE_SAME))
1044     {
1045       SSA_VAL (from) = to;
1046       return true;
1047     }
1048   return false;
1049 }
1050
1051 /* Set all definitions in STMT to value number to themselves.
1052    Return true if a value number changed. */
1053
1054 static bool
1055 defs_to_varying (tree stmt)
1056 {
1057   bool changed = false;
1058   ssa_op_iter iter;
1059   def_operand_p defp;
1060
1061   FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_ALL_DEFS)
1062     {
1063       tree def = DEF_FROM_PTR (defp);
1064
1065       VN_INFO (def)->use_processed = true;
1066       changed |= set_ssa_val_to (def, def);
1067     }
1068   return changed;
1069 }
1070
1071 /* Visit a copy between LHS and RHS, return true if the value number
1072    changed.  */
1073
1074 static bool
1075 visit_copy (tree lhs, tree rhs)
1076 {
1077
1078   /* Follow chains of copies to their destination.  */
1079   while (SSA_VAL (rhs) != rhs && TREE_CODE (SSA_VAL (rhs)) == SSA_NAME)
1080     rhs = SSA_VAL (rhs);
1081   
1082   /* The copy may have a more interesting constant filled expression
1083      (we don't, since we know our RHS is just an SSA name).  */
1084   VN_INFO (lhs)->has_constants = VN_INFO (rhs)->has_constants;
1085   VN_INFO (lhs)->expr = VN_INFO (rhs)->expr;
1086
1087   return set_ssa_val_to (lhs, rhs);
1088 }
1089
1090 /* Visit a unary operator RHS, value number it, and return true if the
1091    value number of LHS has changed as a result.  */
1092
1093 static bool
1094 visit_unary_op (tree lhs, tree op)
1095 {
1096   bool changed = false;
1097   tree result = vn_unary_op_lookup (op);
1098
1099   if (result)
1100     {
1101       changed = set_ssa_val_to (lhs, result);
1102     }
1103   else
1104     {
1105       changed = set_ssa_val_to (lhs, lhs);
1106       vn_unary_op_insert (op, lhs);
1107     }
1108
1109   return changed;
1110 }
1111
1112 /* Visit a binary operator RHS, value number it, and return true if the
1113    value number of LHS has changed as a result.  */
1114
1115 static bool
1116 visit_binary_op (tree lhs, tree op)
1117 {
1118   bool changed = false;
1119   tree result = vn_binary_op_lookup (op);
1120
1121   if (result)
1122     {
1123       changed = set_ssa_val_to (lhs, result);
1124     }
1125   else
1126     {
1127       changed = set_ssa_val_to (lhs, lhs);
1128       vn_binary_op_insert (op, lhs);
1129     }
1130
1131   return changed;
1132 }
1133
1134 /* Visit a load from a reference operator RHS, part of STMT, value number it,
1135    and return true if the value number of the LHS has changed as a result.  */
1136
1137 static bool
1138 visit_reference_op_load (tree lhs, tree op, tree stmt)
1139 {
1140   bool changed = false;
1141   tree result = vn_reference_lookup (op, shared_vuses_from_stmt (stmt));
1142
1143   if (result)
1144     {
1145       changed = set_ssa_val_to (lhs, result);
1146     }
1147   else
1148     {
1149       changed = set_ssa_val_to (lhs, lhs);
1150       vn_reference_insert (op, lhs, copy_vuses_from_stmt (stmt));
1151     }
1152
1153   return changed;
1154 }
1155
1156
1157 /* Visit a store to a reference operator LHS, part of STMT, value number it,
1158    and return true if the value number of the LHS has changed as a result.  */
1159
1160 static bool
1161 visit_reference_op_store (tree lhs, tree op, tree stmt)
1162 {
1163   bool changed = false;
1164   tree result;
1165   bool resultsame = false;
1166
1167   /* First we want to lookup using the *vuses* from the store and see
1168      if there the last store to this location with the same address
1169      had the same value.
1170
1171      The vuses represent the memory state before the store.  If the
1172      memory state, address, and value of the store is the same as the
1173      last store to this location, then this store will produce the
1174      same memory state as that store.
1175
1176      In this case the vdef versions for this store are value numbered to those
1177      vuse versions, since they represent the same memory state after
1178      this store.
1179
1180      Otherwise, the vdefs for the store are used when inserting into
1181      the table, since the store generates a new memory state.  */
1182
1183   result = vn_reference_lookup (lhs, shared_vuses_from_stmt (stmt));
1184
1185   if (result)
1186     {
1187       if (TREE_CODE (result) == SSA_NAME)
1188         result = SSA_VAL (result);
1189       resultsame = expressions_equal_p (result, op);
1190     }
1191
1192   if (!result || !resultsame)
1193     {
1194       VEC(tree, gc) *vdefs = copy_vdefs_from_stmt (stmt);
1195       int i;
1196       tree vdef;
1197
1198       if (dump_file && (dump_flags & TDF_DETAILS))
1199         {
1200           fprintf (dump_file, "No store match\n");
1201           fprintf (dump_file, "Value numbering store ");
1202           print_generic_expr (dump_file, lhs, 0);
1203           fprintf (dump_file, " to ");
1204           print_generic_expr (dump_file, op, 0);
1205           fprintf (dump_file, "\n");
1206         }
1207       /* Have to set value numbers before insert, since insert is
1208          going to valueize the references in-place.  */
1209       for (i = 0; VEC_iterate (tree, vdefs, i, vdef); i++)
1210         {
1211           VN_INFO (vdef)->use_processed = true;
1212           changed |= set_ssa_val_to (vdef, vdef);
1213         }
1214
1215       vn_reference_insert (lhs, op, vdefs);
1216     }
1217   else
1218     {
1219       /* We had a match, so value number the vdefs to have the value
1220          number of the vuses they came from.  */
1221       ssa_op_iter op_iter;
1222       def_operand_p var;
1223       vuse_vec_p vv;
1224
1225       if (dump_file && (dump_flags & TDF_DETAILS))
1226         fprintf (dump_file, "Store matched earlier value,"
1227                  "value numbering store vdefs to matching vuses.\n");
1228
1229       FOR_EACH_SSA_VDEF_OPERAND (var, vv, stmt, op_iter)
1230         {
1231           tree def = DEF_FROM_PTR (var);
1232           tree use;
1233
1234           /* Uh, if the vuse is a multiuse, we can't really do much
1235              here, sadly, since we don't know which value number of
1236              which vuse to use.  */
1237           if (VUSE_VECT_NUM_ELEM (*vv) != 1)
1238             use = def;
1239           else
1240             use = VUSE_ELEMENT_VAR (*vv, 0);
1241
1242           VN_INFO (def)->use_processed = true;
1243           changed |= set_ssa_val_to (def, SSA_VAL (use));
1244         }
1245     }
1246
1247   return changed;
1248 }
1249
1250 /* Visit and value number PHI, return true if the value number
1251    changed.  */
1252
1253 static bool
1254 visit_phi (tree phi)
1255 {
1256   bool changed = false;
1257   tree result;
1258   tree sameval = VN_TOP;
1259   bool allsame = true;
1260   int i;
1261
1262   /* TODO: We could check for this in init_sccvn, and replace this
1263      with a gcc_assert.  */
1264   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)))
1265     return set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
1266
1267   /* See if all non-TOP arguments have the same value.  TOP is
1268      equivalent to everything, so we can ignore it.  */
1269   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1270     {
1271       tree def = PHI_ARG_DEF (phi, i);
1272
1273       if (TREE_CODE (def) == SSA_NAME)
1274         def = SSA_VAL (def);
1275       if (def == VN_TOP)
1276         continue;
1277       if (sameval == VN_TOP)
1278         {
1279           sameval = def;
1280         }
1281       else
1282         {
1283           if (!expressions_equal_p (def, sameval))
1284             {
1285               allsame = false;
1286               break;
1287             }
1288         }
1289     }
1290
1291   /* If all value numbered to the same value, the phi node has that
1292      value.  */
1293   if (allsame)
1294     {
1295       if (is_gimple_min_invariant (sameval))
1296         {
1297           VN_INFO (PHI_RESULT (phi))->has_constants = true;
1298           VN_INFO (PHI_RESULT (phi))->expr = sameval;
1299         }
1300       else
1301         {
1302           VN_INFO (PHI_RESULT (phi))->has_constants = false;
1303           VN_INFO (PHI_RESULT (phi))->expr = sameval;
1304         }
1305       
1306       if (TREE_CODE (sameval) == SSA_NAME)
1307         return visit_copy (PHI_RESULT (phi), sameval);
1308       
1309       return set_ssa_val_to (PHI_RESULT (phi), sameval);
1310     }
1311
1312   /* Otherwise, see if it is equivalent to a phi node in this block.  */
1313   result = vn_phi_lookup (phi);
1314   if (result)
1315     {
1316       if (TREE_CODE (result) == SSA_NAME)
1317         changed = visit_copy (PHI_RESULT (phi), result);
1318       else
1319         changed = set_ssa_val_to (PHI_RESULT (phi), result);
1320     }
1321   else
1322     {
1323       vn_phi_insert (phi, PHI_RESULT (phi));
1324       VN_INFO (PHI_RESULT (phi))->has_constants = false;
1325       VN_INFO (PHI_RESULT (phi))->expr = PHI_RESULT (phi);
1326       changed = set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
1327     }
1328
1329   return changed;
1330 }
1331
1332 /* Return true if EXPR contains constants.  */
1333
1334 static bool
1335 expr_has_constants (tree expr)
1336 {
1337   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
1338     {
1339     case tcc_unary:
1340       return is_gimple_min_invariant (TREE_OPERAND (expr, 0));
1341
1342     case tcc_binary:
1343       return is_gimple_min_invariant (TREE_OPERAND (expr, 0))
1344         || is_gimple_min_invariant (TREE_OPERAND (expr, 1));
1345       /* Constants inside reference ops are rarely interesting, but
1346          it can take a lot of looking to find them.  */
1347     case tcc_reference:
1348     case tcc_declaration:
1349       return false;
1350     default:
1351       return is_gimple_min_invariant (expr);
1352     }
1353   return false;
1354 }
1355
1356 /* Replace SSA_NAMES in expr with their value numbers, and return the
1357    result.
1358    This is performed in place. */
1359
1360 static tree
1361 valueize_expr (tree expr)
1362 {
1363   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
1364     {
1365     case tcc_unary:
1366       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
1367           && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
1368         TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
1369       break;
1370     case tcc_binary:
1371       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
1372           && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
1373         TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
1374       if (TREE_CODE (TREE_OPERAND (expr, 1)) == SSA_NAME
1375           && SSA_VAL (TREE_OPERAND (expr, 1)) != VN_TOP)
1376         TREE_OPERAND (expr, 1) = SSA_VAL (TREE_OPERAND (expr, 1));
1377       break;
1378     default:
1379       break;
1380     }
1381   return expr;
1382 }
1383
1384 /* Simplify the binary expression RHS, and return the result if
1385    simplified. */
1386
1387 static tree
1388 simplify_binary_expression (tree rhs)
1389 {
1390   tree result = NULL_TREE;
1391   tree op0 = TREE_OPERAND (rhs, 0);
1392   tree op1 = TREE_OPERAND (rhs, 1);
1393
1394   /* This will not catch every single case we could combine, but will
1395      catch those with constants.  The goal here is to simultaneously
1396      combine constants between expressions, but avoid infinite
1397      expansion of expressions during simplification.  */
1398   if (TREE_CODE (op0) == SSA_NAME)
1399     {
1400       if (VN_INFO (op0)->has_constants)
1401         op0 = valueize_expr (VN_INFO (op0)->expr);
1402       else if (SSA_VAL (op0) != VN_TOP && SSA_VAL (op0) != op0)
1403         op0 = SSA_VAL (op0);
1404     }
1405
1406   if (TREE_CODE (op1) == SSA_NAME)
1407     {
1408       if (VN_INFO (op1)->has_constants)
1409         op1 = valueize_expr (VN_INFO (op1)->expr);
1410       else if (SSA_VAL (op1) != VN_TOP && SSA_VAL (op1) != op1)
1411         op1 = SSA_VAL (op1);
1412     }
1413
1414   result = fold_binary (TREE_CODE (rhs), TREE_TYPE (rhs), op0, op1);
1415
1416   /* Make sure result is not a complex expression consisting
1417      of operators of operators (IE (a + b) + (a + c))
1418      Otherwise, we will end up with unbounded expressions if
1419      fold does anything at all.  */
1420   if (result && valid_gimple_expression_p (result))
1421     return result;
1422
1423   return NULL_TREE;
1424 }
1425
1426 /* Try to simplify RHS using equivalences and constant folding.  */
1427
1428 static tree
1429 try_to_simplify (tree stmt, tree rhs)
1430 {
1431   if (TREE_CODE (rhs) == SSA_NAME)
1432     {
1433       if (is_gimple_min_invariant (SSA_VAL (rhs)))
1434         return SSA_VAL (rhs);
1435       else if (VN_INFO (rhs)->has_constants)
1436         return VN_INFO (rhs)->expr;
1437     }
1438   else
1439     {
1440       switch (TREE_CODE_CLASS (TREE_CODE (rhs)))
1441         {
1442           /* For references, see if we find a result for the lookup,
1443              and use it if we do.  */
1444         case tcc_declaration:
1445           /* Pull out any truly constant values.  */
1446           if (TREE_READONLY (rhs)
1447               && TREE_STATIC (rhs)
1448               && DECL_INITIAL (rhs)
1449               && valid_gimple_expression_p (DECL_INITIAL (rhs)))
1450             return DECL_INITIAL (rhs);
1451
1452             /* Fallthrough. */
1453         case tcc_reference:
1454           {
1455             tree result = vn_reference_lookup (rhs,
1456                                                shared_vuses_from_stmt (stmt));
1457             if (result)
1458               return result;
1459           }
1460           break;
1461           /* We could do a little more with unary ops, if they expand
1462              into binary ops, but it's debatable whether it is worth it. */
1463         case tcc_unary:
1464           {
1465             tree result = NULL_TREE;
1466             tree op0 = TREE_OPERAND (rhs, 0);
1467             if (TREE_CODE (op0) == SSA_NAME && VN_INFO (op0)->has_constants)
1468               op0 = VN_INFO (op0)->expr;
1469             else if (TREE_CODE (op0) == SSA_NAME && SSA_VAL (op0) != op0)
1470               op0 = SSA_VAL (op0);
1471             result = fold_unary (TREE_CODE (rhs), TREE_TYPE (rhs), op0);
1472             if (result)
1473               return result;
1474           }
1475           break;
1476         case tcc_comparison:
1477         case tcc_binary:
1478           return simplify_binary_expression (rhs);
1479           break;
1480         default:
1481           break;
1482         }
1483     }
1484   return rhs;
1485 }
1486
1487 /* Visit and value number USE, return true if the value number
1488    changed. */
1489
1490 static bool
1491 visit_use (tree use)
1492 {
1493   bool changed = false;
1494   tree stmt = SSA_NAME_DEF_STMT (use);
1495   stmt_ann_t ann;
1496
1497   VN_INFO (use)->use_processed = true;
1498
1499   gcc_assert (!SSA_NAME_IN_FREE_LIST (use));
1500   if (dump_file && (dump_flags & TDF_DETAILS))
1501     {
1502       fprintf (dump_file, "Value numbering ");
1503       print_generic_expr (dump_file, use, 0);
1504       fprintf (dump_file, " stmt = ");
1505       print_generic_stmt (dump_file, stmt, 0);
1506     }
1507
1508   /* RETURN_EXPR may have an embedded MODIFY_STMT.  */
1509   if (TREE_CODE (stmt) == RETURN_EXPR
1510       && TREE_CODE (TREE_OPERAND (stmt, 0)) == GIMPLE_MODIFY_STMT)
1511     stmt = TREE_OPERAND (stmt, 0);
1512
1513   ann = stmt_ann (stmt);
1514
1515   /* Handle uninitialized uses.  */
1516   if (IS_EMPTY_STMT (stmt))
1517     {
1518       changed = set_ssa_val_to (use, use);
1519     }
1520   else
1521     {
1522       if (TREE_CODE (stmt) == PHI_NODE)
1523         {
1524           changed = visit_phi (stmt);
1525         }
1526       else if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT
1527                || (ann && ann->has_volatile_ops))
1528         {
1529           changed = defs_to_varying (stmt);
1530         }
1531       else
1532         {
1533           tree lhs = GIMPLE_STMT_OPERAND (stmt, 0);
1534           tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
1535           tree simplified;
1536
1537           STRIP_USELESS_TYPE_CONVERSION (rhs);
1538
1539           /* Shortcut for copies. Simplifying copies is pointless,
1540              since we copy the expression and value they represent.  */
1541           if (TREE_CODE (rhs) == SSA_NAME && TREE_CODE (lhs) == SSA_NAME)
1542             {
1543               changed = visit_copy (lhs, rhs);
1544               goto done;
1545             }
1546           simplified = try_to_simplify (stmt, rhs);
1547           if (simplified && simplified != rhs)
1548             {
1549               if (dump_file && (dump_flags & TDF_DETAILS))
1550                 {
1551                   fprintf (dump_file, "RHS ");
1552                   print_generic_expr (dump_file, rhs, 0);
1553                   fprintf (dump_file, " simplified to ");
1554                   print_generic_expr (dump_file, simplified, 0);
1555                   if (TREE_CODE (lhs) == SSA_NAME)
1556                     fprintf (dump_file, " has constants %d\n",
1557                              VN_INFO (lhs)->has_constants);
1558                   else
1559                     fprintf (dump_file, "\n");
1560
1561                 }
1562             }
1563           /* Setting value numbers to constants will occasionally
1564              screw up phi congruence because constants are not
1565              uniquely associated with a single ssa name that can be
1566              looked up.  */
1567           if (simplified && is_gimple_min_invariant (simplified)
1568               && TREE_CODE (lhs) == SSA_NAME
1569               && simplified != rhs)
1570             {
1571               VN_INFO (lhs)->expr = simplified;
1572               VN_INFO (lhs)->has_constants = true;
1573               changed = set_ssa_val_to (lhs, simplified);
1574               goto done;
1575             }
1576           else if (simplified && TREE_CODE (simplified) == SSA_NAME
1577                    && TREE_CODE (lhs) == SSA_NAME)
1578             {
1579               changed = visit_copy (lhs, simplified);
1580               goto done;
1581             }
1582           else if (simplified)
1583             {
1584               if (TREE_CODE (lhs) == SSA_NAME)
1585                 {
1586                   VN_INFO (lhs)->has_constants = expr_has_constants (simplified);
1587                   /* We have to unshare the expression or else
1588                      valuizing may change the IL stream.  */
1589                   VN_INFO (lhs)->expr = unshare_expr (simplified);
1590                 }
1591               rhs = simplified;
1592             }
1593           else if (expr_has_constants (rhs) && TREE_CODE (lhs) == SSA_NAME)
1594             {
1595               VN_INFO (lhs)->has_constants = true;
1596               VN_INFO (lhs)->expr = unshare_expr (rhs);
1597             }
1598           else if (TREE_CODE (lhs) == SSA_NAME)
1599             {
1600               /* We reset expr and constantness here because we may
1601                  have been value numbering optimistically, and
1602                  iterating. They may become non-constant in this case,
1603                  even if they were optimistically constant. */
1604                  
1605               VN_INFO (lhs)->has_constants = false;
1606               VN_INFO (lhs)->expr = lhs;
1607             }
1608
1609           if (TREE_CODE (lhs) == SSA_NAME
1610               && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
1611             changed = defs_to_varying (stmt);
1612           else if (REFERENCE_CLASS_P (lhs) || DECL_P (lhs))
1613             {
1614               changed = visit_reference_op_store (lhs, rhs, stmt);
1615             }
1616           else if (TREE_CODE (lhs) == SSA_NAME)
1617             {
1618               if (is_gimple_min_invariant (rhs))
1619                 {
1620                   VN_INFO (lhs)->has_constants = true;
1621                   VN_INFO (lhs)->expr = rhs;
1622                   changed = set_ssa_val_to (lhs, rhs);
1623                 }
1624               else
1625                 {
1626                   switch (TREE_CODE_CLASS (TREE_CODE (rhs)))
1627                     {
1628                     case tcc_unary:
1629                       changed = visit_unary_op (lhs, rhs);
1630                       break;
1631                     case tcc_binary:
1632                       changed = visit_binary_op (lhs, rhs);
1633                       break;
1634                       /* If tcc_vl_expr ever encompasses more than
1635                          CALL_EXPR, this will need to be changed.  */
1636                     case tcc_vl_exp:
1637                       if (call_expr_flags (rhs)  & (ECF_PURE | ECF_CONST))
1638                         changed = visit_reference_op_load (lhs, rhs, stmt);
1639                       else
1640                         changed = defs_to_varying (stmt);
1641                       break;
1642                     case tcc_declaration:
1643                     case tcc_reference:
1644                       changed = visit_reference_op_load (lhs, rhs, stmt);
1645                       break;
1646                     case tcc_expression:
1647                       if (TREE_CODE (rhs) == ADDR_EXPR)
1648                         {
1649                           changed = visit_unary_op (lhs, rhs);
1650                           goto done;
1651                         }
1652                       /* Fallthrough.  */
1653                     default:
1654                       changed = defs_to_varying (stmt);
1655                       break;
1656                     }
1657                 }
1658             }
1659           else
1660             changed = defs_to_varying (stmt);
1661         }
1662     }
1663  done:
1664   return changed;
1665 }
1666
1667 /* Compare two operands by reverse postorder index */
1668
1669 static int
1670 compare_ops (const void *pa, const void *pb)
1671 {
1672   const tree opa = *((const tree *)pa);
1673   const tree opb = *((const tree *)pb);
1674   tree opstmta = SSA_NAME_DEF_STMT (opa);
1675   tree opstmtb = SSA_NAME_DEF_STMT (opb);
1676   basic_block bba;
1677   basic_block bbb;
1678
1679   if (IS_EMPTY_STMT (opstmta) && IS_EMPTY_STMT (opstmtb))
1680     return 0;
1681   else if (IS_EMPTY_STMT (opstmta))
1682     return -1;
1683   else if (IS_EMPTY_STMT (opstmtb))
1684     return 1;
1685
1686   bba = bb_for_stmt (opstmta);
1687   bbb = bb_for_stmt (opstmtb);
1688
1689   if (!bba && !bbb)
1690     return 0;
1691   else if (!bba)
1692     return -1;
1693   else if (!bbb)
1694     return 1;
1695
1696   if (bba == bbb)
1697     {
1698       if (TREE_CODE (opstmta) == PHI_NODE && TREE_CODE (opstmtb) == PHI_NODE)
1699         return 0;
1700       else if (TREE_CODE (opstmta) == PHI_NODE)
1701         return -1;
1702       else if (TREE_CODE (opstmtb) == PHI_NODE)
1703         return 1;
1704       return stmt_ann (opstmta)->uid - stmt_ann (opstmtb)->uid;
1705     }
1706   return rpo_numbers[bba->index] - rpo_numbers[bbb->index];
1707 }
1708
1709 /* Sort an array containing members of a strongly connected component
1710    SCC so that the members are ordered by RPO number.
1711    This means that when the sort is complete, iterating through the
1712    array will give you the members in RPO order.  */
1713
1714 static void
1715 sort_scc (VEC (tree, heap) *scc)
1716 {
1717   qsort (VEC_address (tree, scc),
1718          VEC_length (tree, scc),
1719          sizeof (tree),
1720          compare_ops);
1721 }
1722
1723 /* Process a strongly connected component in the SSA graph.  */
1724
1725 static void
1726 process_scc (VEC (tree, heap) *scc)
1727 {
1728   /* If the SCC has a single member, just visit it.  */
1729
1730   if (VEC_length (tree, scc) == 1)
1731     {
1732       tree use = VEC_index (tree, scc, 0);
1733       if (!VN_INFO (use)->use_processed) 
1734         visit_use (use);
1735     }
1736   else
1737     {
1738       tree var;
1739       unsigned int i;
1740       unsigned int iterations = 0;
1741       bool changed = true;
1742
1743       /* Iterate over the SCC with the optimistic table until it stops
1744          changing.  */
1745       current_info = optimistic_info;
1746       while (changed)
1747         {
1748           changed = false;
1749           iterations++;
1750           for (i = 0; VEC_iterate (tree, scc, i, var); i++)
1751             changed |= visit_use (var);
1752         }
1753
1754       if (dump_file && (dump_flags & TDF_STATS))
1755         fprintf (dump_file, "Processing SCC required %d iterations\n",
1756                  iterations);
1757
1758       /* Finally, visit the SCC once using the valid table.  */
1759       current_info = valid_info;
1760       for (i = 0; VEC_iterate (tree, scc, i, var); i++)
1761         visit_use (var);
1762     }
1763 }
1764
1765 /* Depth first search on NAME to discover and process SCC's in the SSA
1766    graph.
1767    Execution of this algorithm relies on the fact that the SCC's are
1768    popped off the stack in topological order.  */
1769
1770 static void
1771 DFS (tree name)
1772 {
1773   ssa_op_iter iter;
1774   use_operand_p usep;
1775   tree defstmt;
1776
1777   /* SCC info */
1778   VN_INFO (name)->dfsnum = next_dfs_num++;
1779   VN_INFO (name)->visited = true;
1780   VN_INFO (name)->low = VN_INFO (name)->dfsnum;
1781
1782   VEC_safe_push (tree, heap, sccstack, name);
1783   VN_INFO (name)->on_sccstack = true;
1784   defstmt = SSA_NAME_DEF_STMT (name);
1785
1786   /* Recursively DFS on our operands, looking for SCC's.  */
1787   if (!IS_EMPTY_STMT (defstmt))
1788     {
1789       FOR_EACH_PHI_OR_STMT_USE (usep, SSA_NAME_DEF_STMT (name), iter,
1790                                 SSA_OP_ALL_USES)
1791         {
1792           tree use = USE_FROM_PTR (usep);
1793
1794           /* Since we handle phi nodes, we will sometimes get
1795              invariants in the use expression.  */
1796           if (TREE_CODE (use) != SSA_NAME)
1797             continue;
1798
1799           if (! (VN_INFO (use)->visited))
1800             {
1801               DFS (use);
1802               VN_INFO (name)->low = MIN (VN_INFO (name)->low,
1803                                          VN_INFO (use)->low);
1804             }
1805           if (VN_INFO (use)->dfsnum < VN_INFO (name)->dfsnum
1806               && VN_INFO (use)->on_sccstack)
1807             {
1808               VN_INFO (name)->low = MIN (VN_INFO (use)->dfsnum,
1809                                          VN_INFO (name)->low);
1810             }
1811         }
1812     }
1813
1814   /* See if we found an SCC.  */
1815   if (VN_INFO (name)->low == VN_INFO (name)->dfsnum)
1816     {
1817       VEC (tree, heap) *scc = NULL;
1818       tree x;
1819
1820       /* Found an SCC, pop the components off the SCC stack and
1821          process them.  */
1822       do
1823         {
1824           x = VEC_pop (tree, sccstack);
1825
1826           VN_INFO (x)->on_sccstack = false;
1827           VEC_safe_push (tree, heap, scc, x);
1828         } while (x != name);
1829
1830       if (VEC_length (tree, scc) > 1)
1831         sort_scc (scc);
1832
1833       if (dump_file && (dump_flags & TDF_DETAILS))
1834         print_scc (dump_file, scc);
1835
1836       process_scc (scc);
1837
1838       VEC_free (tree, heap, scc);
1839     }
1840 }
1841
1842 static void
1843 free_phi (void *vp)
1844 {
1845   vn_phi_t phi = vp;
1846   VEC_free (tree, heap, phi->phiargs);
1847 }
1848
1849
1850 /* Free a reference operation structure VP.  */
1851
1852 static void
1853 free_reference (void *vp)
1854 {
1855   vn_reference_t vr = vp;
1856   VEC_free (vn_reference_op_s, heap, vr->operands);
1857 }
1858
1859 /* Allocate a value number table.  */
1860
1861 static void
1862 allocate_vn_table (vn_tables_t table)
1863 {
1864   table->phis = htab_create (23, vn_phi_hash, vn_phi_eq, free_phi);
1865   table->unary = htab_create (23, vn_unary_op_hash, vn_unary_op_eq, NULL);
1866   table->binary = htab_create (23, vn_binary_op_hash, vn_binary_op_eq, NULL);
1867   table->references = htab_create (23, vn_reference_hash, vn_reference_eq,
1868                                    free_reference);
1869
1870   table->unary_op_pool = create_alloc_pool ("VN unary operations",
1871                                             sizeof (struct vn_unary_op_s),
1872                                             30);
1873   table->binary_op_pool = create_alloc_pool ("VN binary operations",
1874                                              sizeof (struct vn_binary_op_s),
1875                                              30);
1876   table->phis_pool = create_alloc_pool ("VN phis",
1877                                         sizeof (struct vn_phi_s),
1878                                         30);
1879   table->references_pool = create_alloc_pool ("VN references",
1880                                               sizeof (struct vn_reference_s),
1881                                               30);
1882 }
1883
1884 /* Free a value number table.  */
1885
1886 static void
1887 free_vn_table (vn_tables_t table)
1888 {
1889   htab_delete (table->phis);
1890   htab_delete (table->unary);
1891   htab_delete (table->binary);
1892   htab_delete (table->references);
1893   free_alloc_pool (table->unary_op_pool);
1894   free_alloc_pool (table->binary_op_pool);
1895   free_alloc_pool (table->phis_pool);
1896   free_alloc_pool (table->references_pool);
1897 }
1898
1899 static void
1900 init_scc_vn (void)
1901 {
1902   size_t i;
1903   int j;
1904   int *rpo_numbers_temp;
1905   basic_block bb;
1906   size_t id = 0;
1907
1908   calculate_dominance_info (CDI_DOMINATORS);
1909   sccstack = NULL;
1910   next_dfs_num = 1;
1911
1912   vn_ssa_aux_table = VEC_alloc (vn_ssa_aux_t, heap, num_ssa_names + 1);
1913   /* VEC_alloc doesn't actually grow it to the right size, it just
1914      preallocates the space to do so.  */
1915   VEC_safe_grow (vn_ssa_aux_t, heap, vn_ssa_aux_table, num_ssa_names + 1);
1916   shared_lookup_phiargs = NULL;
1917   shared_lookup_vops = NULL;
1918   shared_lookup_references = NULL;
1919   rpo_numbers = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
1920   rpo_numbers_temp = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
1921   pre_and_rev_post_order_compute (NULL, rpo_numbers_temp, false);
1922
1923   /* RPO numbers is an array of rpo ordering, rpo[i] = bb means that
1924      the i'th block in RPO order is bb.  We want to map bb's to RPO
1925      numbers, so we need to rearrange this array.  */
1926   for (j = 0; j < n_basic_blocks - NUM_FIXED_BLOCKS; j++)
1927     rpo_numbers[rpo_numbers_temp[j]] = j;
1928
1929   free (rpo_numbers_temp);
1930
1931   VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
1932
1933   /* Create the VN_INFO structures, and initialize value numbers to
1934      TOP.  */
1935   for (i = 0; i < num_ssa_names; i++)
1936     {
1937       tree name = ssa_name (i);
1938       if (name)
1939         {
1940           VN_INFO_GET (name)->valnum = VN_TOP;
1941           VN_INFO (name)->expr = name;
1942         }
1943     }
1944
1945   FOR_ALL_BB (bb)
1946     {
1947       block_stmt_iterator bsi;
1948       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1949         {
1950           tree stmt = bsi_stmt (bsi);
1951           stmt_ann (stmt)->uid = id++;
1952         }
1953     }
1954
1955   /* Create the valid and optimistic value numbering tables.  */
1956   valid_info = XCNEW (struct vn_tables_s);
1957   allocate_vn_table (valid_info);
1958   optimistic_info = XCNEW (struct vn_tables_s);
1959   allocate_vn_table (optimistic_info);
1960   pre_info = NULL;
1961 }
1962
1963 void
1964 switch_to_PRE_table (void)
1965 {
1966   pre_info = XCNEW (struct vn_tables_s);
1967   allocate_vn_table (pre_info);
1968   current_info = pre_info;
1969 }
1970
1971 void
1972 free_scc_vn (void)
1973 {
1974   size_t i;
1975
1976   VEC_free (tree, heap, shared_lookup_phiargs);
1977   VEC_free (tree, gc, shared_lookup_vops);
1978   VEC_free (vn_reference_op_s, heap, shared_lookup_references);
1979   XDELETEVEC (rpo_numbers);
1980   for (i = 0; i < num_ssa_names; i++)
1981     {
1982       tree name = ssa_name (i);
1983       if (name)
1984         {
1985           XDELETE (VN_INFO (name));
1986           if (SSA_NAME_VALUE (name) &&
1987               TREE_CODE (SSA_NAME_VALUE (name)) == VALUE_HANDLE)
1988             SSA_NAME_VALUE (name) = NULL;
1989         }
1990     }
1991       
1992   VEC_free (vn_ssa_aux_t, heap, vn_ssa_aux_table);
1993   VEC_free (tree, heap, sccstack);
1994   free_vn_table (valid_info);
1995   XDELETE (valid_info);
1996   free_vn_table (optimistic_info);
1997   XDELETE (optimistic_info);
1998   if (pre_info)
1999     {
2000       free_vn_table (pre_info);
2001       XDELETE (pre_info);
2002     }
2003 }
2004
2005 void
2006 run_scc_vn (void)
2007 {
2008   size_t i;
2009   tree param;
2010
2011   init_scc_vn ();
2012   current_info = valid_info;
2013
2014   for (param = DECL_ARGUMENTS (current_function_decl);
2015        param;
2016        param = TREE_CHAIN (param))
2017     {
2018       if (gimple_default_def (cfun, param) != NULL)
2019         {
2020           tree def = gimple_default_def (cfun, param);
2021           SSA_VAL (def) = def;
2022         }
2023     }
2024
2025   for (i = num_ssa_names - 1; i > 0; i--)
2026     {
2027       tree name = ssa_name (i);
2028       if (name
2029           && VN_INFO (name)->visited == false
2030           && !has_zero_uses (name))
2031         DFS (name);
2032     }
2033
2034   if (dump_file && (dump_flags & TDF_DETAILS))
2035     {
2036       fprintf (dump_file, "Value numbers:\n");
2037       for (i = 0; i < num_ssa_names; i++)
2038         {
2039           tree name = ssa_name (i);
2040           if (name && VN_INFO (name)->visited
2041               && (SSA_VAL (name) != name
2042                   || is_gimple_min_invariant (VN_INFO (name)->expr)))
2043             {
2044               print_generic_expr (dump_file, name, 0);
2045               fprintf (dump_file, " = ");
2046               if (is_gimple_min_invariant (VN_INFO (name)->expr))
2047                 print_generic_expr (dump_file, VN_INFO (name)->expr, 0);
2048               else
2049                 print_generic_expr (dump_file, SSA_VAL (name), 0);
2050               fprintf (dump_file, "\n");
2051             }
2052         }
2053     }
2054 }