2008-10-14 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / tree-ssa-sccvn.c
blob082a2785ff7a5a30f69f05f716d8a3bc7825fff1
1 /* SCC value numbering for trees
2 Copyright (C) 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Daniel Berlin <dan@dberlin.org>
6 This file is part of GCC.
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.
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.
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/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "tree.h"
28 #include "basic-block.h"
29 #include "diagnostic.h"
30 #include "tree-inline.h"
31 #include "tree-flow.h"
32 #include "gimple.h"
33 #include "tree-dump.h"
34 #include "timevar.h"
35 #include "fibheap.h"
36 #include "hashtab.h"
37 #include "tree-iterator.h"
38 #include "real.h"
39 #include "alloc-pool.h"
40 #include "tree-pass.h"
41 #include "flags.h"
42 #include "bitmap.h"
43 #include "langhooks.h"
44 #include "cfgloop.h"
45 #include "params.h"
46 #include "tree-ssa-propagate.h"
47 #include "tree-ssa-sccvn.h"
49 /* This algorithm is based on the SCC algorithm presented by Keith
50 Cooper and L. Taylor Simpson in "SCC-Based Value numbering"
51 (http://citeseer.ist.psu.edu/41805.html). In
52 straight line code, it is equivalent to a regular hash based value
53 numbering that is performed in reverse postorder.
55 For code with cycles, there are two alternatives, both of which
56 require keeping the hashtables separate from the actual list of
57 value numbers for SSA names.
59 1. Iterate value numbering in an RPO walk of the blocks, removing
60 all the entries from the hashtable after each iteration (but
61 keeping the SSA name->value number mapping between iterations).
62 Iterate until it does not change.
64 2. Perform value numbering as part of an SCC walk on the SSA graph,
65 iterating only the cycles in the SSA graph until they do not change
66 (using a separate, optimistic hashtable for value numbering the SCC
67 operands).
69 The second is not just faster in practice (because most SSA graph
70 cycles do not involve all the variables in the graph), it also has
71 some nice properties.
73 One of these nice properties is that when we pop an SCC off the
74 stack, we are guaranteed to have processed all the operands coming from
75 *outside of that SCC*, so we do not need to do anything special to
76 ensure they have value numbers.
78 Another nice property is that the SCC walk is done as part of a DFS
79 of the SSA graph, which makes it easy to perform combining and
80 simplifying operations at the same time.
82 The code below is deliberately written in a way that makes it easy
83 to separate the SCC walk from the other work it does.
85 In order to propagate constants through the code, we track which
86 expressions contain constants, and use those while folding. In
87 theory, we could also track expressions whose value numbers are
88 replaced, in case we end up folding based on expression
89 identities.
91 In order to value number memory, we assign value numbers to vuses.
92 This enables us to note that, for example, stores to the same
93 address of the same value from the same starting memory states are
94 equivalent.
95 TODO:
97 1. We can iterate only the changing portions of the SCC's, but
98 I have not seen an SCC big enough for this to be a win.
99 2. If you differentiate between phi nodes for loops and phi nodes
100 for if-then-else, you can properly consider phi nodes in different
101 blocks for equivalence.
102 3. We could value number vuses in more cases, particularly, whole
103 structure copies.
106 /* The set of hashtables and alloc_pool's for their items. */
108 typedef struct vn_tables_s
110 htab_t nary;
111 htab_t phis;
112 htab_t references;
113 struct obstack nary_obstack;
114 alloc_pool phis_pool;
115 alloc_pool references_pool;
116 } *vn_tables_t;
118 static htab_t constant_to_value_id;
119 static bitmap constant_value_ids;
122 /* Valid hashtables storing information we have proven to be
123 correct. */
125 static vn_tables_t valid_info;
127 /* Optimistic hashtables storing information we are making assumptions about
128 during iterations. */
130 static vn_tables_t optimistic_info;
132 /* Pointer to the set of hashtables that is currently being used.
133 Should always point to either the optimistic_info, or the
134 valid_info. */
136 static vn_tables_t current_info;
139 /* Reverse post order index for each basic block. */
141 static int *rpo_numbers;
143 #define SSA_VAL(x) (VN_INFO ((x))->valnum)
145 /* This represents the top of the VN lattice, which is the universal
146 value. */
148 tree VN_TOP;
150 /* Unique counter for our value ids. */
152 static unsigned int next_value_id;
154 /* Next DFS number and the stack for strongly connected component
155 detection. */
157 static unsigned int next_dfs_num;
158 static VEC (tree, heap) *sccstack;
160 static bool may_insert;
163 DEF_VEC_P(vn_ssa_aux_t);
164 DEF_VEC_ALLOC_P(vn_ssa_aux_t, heap);
166 /* Table of vn_ssa_aux_t's, one per ssa_name. The vn_ssa_aux_t objects
167 are allocated on an obstack for locality reasons, and to free them
168 without looping over the VEC. */
170 static VEC (vn_ssa_aux_t, heap) *vn_ssa_aux_table;
171 static struct obstack vn_ssa_aux_obstack;
173 /* Return the value numbering information for a given SSA name. */
175 vn_ssa_aux_t
176 VN_INFO (tree name)
178 vn_ssa_aux_t res = VEC_index (vn_ssa_aux_t, vn_ssa_aux_table,
179 SSA_NAME_VERSION (name));
180 gcc_assert (res);
181 return res;
184 /* Set the value numbering info for a given SSA name to a given
185 value. */
187 static inline void
188 VN_INFO_SET (tree name, vn_ssa_aux_t value)
190 VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
191 SSA_NAME_VERSION (name), value);
194 /* Initialize the value numbering info for a given SSA name.
195 This should be called just once for every SSA name. */
197 vn_ssa_aux_t
198 VN_INFO_GET (tree name)
200 vn_ssa_aux_t newinfo;
202 newinfo = XOBNEW (&vn_ssa_aux_obstack, struct vn_ssa_aux);
203 memset (newinfo, 0, sizeof (struct vn_ssa_aux));
204 if (SSA_NAME_VERSION (name) >= VEC_length (vn_ssa_aux_t, vn_ssa_aux_table))
205 VEC_safe_grow (vn_ssa_aux_t, heap, vn_ssa_aux_table,
206 SSA_NAME_VERSION (name) + 1);
207 VEC_replace (vn_ssa_aux_t, vn_ssa_aux_table,
208 SSA_NAME_VERSION (name), newinfo);
209 return newinfo;
213 /* Get the representative expression for the SSA_NAME NAME. Returns
214 the representative SSA_NAME if there is no expression associated with it. */
216 tree
217 vn_get_expr_for (tree name)
219 vn_ssa_aux_t vn = VN_INFO (name);
220 gimple def_stmt;
221 tree expr = NULL_TREE;
223 if (vn->valnum == VN_TOP)
224 return name;
226 /* If the value-number is a constant it is the representative
227 expression. */
228 if (TREE_CODE (vn->valnum) != SSA_NAME)
229 return vn->valnum;
231 /* Get to the information of the value of this SSA_NAME. */
232 vn = VN_INFO (vn->valnum);
234 /* If the value-number is a constant it is the representative
235 expression. */
236 if (TREE_CODE (vn->valnum) != SSA_NAME)
237 return vn->valnum;
239 /* Else if we have an expression, return it. */
240 if (vn->expr != NULL_TREE)
241 return vn->expr;
243 /* Otherwise use the defining statement to build the expression. */
244 def_stmt = SSA_NAME_DEF_STMT (vn->valnum);
246 /* If the value number is a default-definition or a PHI result
247 use it directly. */
248 if (gimple_nop_p (def_stmt)
249 || gimple_code (def_stmt) == GIMPLE_PHI)
250 return vn->valnum;
252 if (!is_gimple_assign (def_stmt))
253 return vn->valnum;
255 /* FIXME tuples. This is incomplete and likely will miss some
256 simplifications. */
257 switch (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)))
259 case tcc_reference:
260 if (gimple_assign_rhs_code (def_stmt) == VIEW_CONVERT_EXPR
261 && gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
262 && gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR)
263 expr = fold_build1 (gimple_assign_rhs_code (def_stmt),
264 gimple_expr_type (def_stmt),
265 TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0));
266 break;
268 case tcc_unary:
269 expr = fold_build1 (gimple_assign_rhs_code (def_stmt),
270 gimple_expr_type (def_stmt),
271 gimple_assign_rhs1 (def_stmt));
272 break;
274 case tcc_binary:
275 expr = fold_build2 (gimple_assign_rhs_code (def_stmt),
276 gimple_expr_type (def_stmt),
277 gimple_assign_rhs1 (def_stmt),
278 gimple_assign_rhs2 (def_stmt));
279 break;
281 default:;
283 if (expr == NULL_TREE)
284 return vn->valnum;
286 /* Cache the expression. */
287 vn->expr = expr;
289 return expr;
293 /* Free a phi operation structure VP. */
295 static void
296 free_phi (void *vp)
298 vn_phi_t phi = (vn_phi_t) vp;
299 VEC_free (tree, heap, phi->phiargs);
302 /* Free a reference operation structure VP. */
304 static void
305 free_reference (void *vp)
307 vn_reference_t vr = (vn_reference_t) vp;
308 VEC_free (vn_reference_op_s, heap, vr->operands);
311 /* Hash table equality function for vn_constant_t. */
313 static int
314 vn_constant_eq (const void *p1, const void *p2)
316 const struct vn_constant_s *vc1 = (const struct vn_constant_s *) p1;
317 const struct vn_constant_s *vc2 = (const struct vn_constant_s *) p2;
319 return vn_constant_eq_with_type (vc1->constant, vc2->constant);
322 /* Hash table hash function for vn_constant_t. */
324 static hashval_t
325 vn_constant_hash (const void *p1)
327 const struct vn_constant_s *vc1 = (const struct vn_constant_s *) p1;
328 return vc1->hashcode;
331 /* Lookup a value id for CONSTANT and return it. If it does not
332 exist returns 0. */
334 unsigned int
335 get_constant_value_id (tree constant)
337 void **slot;
338 struct vn_constant_s vc;
340 vc.hashcode = vn_hash_constant_with_type (constant);
341 vc.constant = constant;
342 slot = htab_find_slot_with_hash (constant_to_value_id, &vc,
343 vc.hashcode, NO_INSERT);
344 if (slot)
345 return ((vn_constant_t)*slot)->value_id;
346 return 0;
349 /* Lookup a value id for CONSTANT, and if it does not exist, create a
350 new one and return it. If it does exist, return it. */
352 unsigned int
353 get_or_alloc_constant_value_id (tree constant)
355 void **slot;
356 vn_constant_t vc = XNEW (struct vn_constant_s);
358 vc->hashcode = vn_hash_constant_with_type (constant);
359 vc->constant = constant;
360 slot = htab_find_slot_with_hash (constant_to_value_id, vc,
361 vc->hashcode, INSERT);
362 if (*slot)
364 free (vc);
365 return ((vn_constant_t)*slot)->value_id;
367 vc->value_id = get_next_value_id ();
368 *slot = vc;
369 bitmap_set_bit (constant_value_ids, vc->value_id);
370 return vc->value_id;
373 /* Return true if V is a value id for a constant. */
375 bool
376 value_id_constant_p (unsigned int v)
378 return bitmap_bit_p (constant_value_ids, v);
381 /* Compare two reference operands P1 and P2 for equality. Return true if
382 they are equal, and false otherwise. */
384 static int
385 vn_reference_op_eq (const void *p1, const void *p2)
387 const_vn_reference_op_t const vro1 = (const_vn_reference_op_t) p1;
388 const_vn_reference_op_t const vro2 = (const_vn_reference_op_t) p2;
389 return vro1->opcode == vro2->opcode
390 && types_compatible_p (vro1->type, vro2->type)
391 && expressions_equal_p (vro1->op0, vro2->op0)
392 && expressions_equal_p (vro1->op1, vro2->op1)
393 && expressions_equal_p (vro1->op2, vro2->op2);
396 /* Compute the hash for a reference operand VRO1. */
398 static hashval_t
399 vn_reference_op_compute_hash (const vn_reference_op_t vro1)
401 return iterative_hash_expr (vro1->op0, vro1->opcode)
402 + iterative_hash_expr (vro1->op1, vro1->opcode)
403 + iterative_hash_expr (vro1->op2, vro1->opcode);
406 /* Return the hashcode for a given reference operation P1. */
408 static hashval_t
409 vn_reference_hash (const void *p1)
411 const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
412 return vr1->hashcode;
415 /* Compute a hash for the reference operation VR1 and return it. */
417 hashval_t
418 vn_reference_compute_hash (const vn_reference_t vr1)
420 hashval_t result = 0;
421 tree v;
422 int i;
423 vn_reference_op_t vro;
425 for (i = 0; VEC_iterate (tree, vr1->vuses, i, v); i++)
426 result += iterative_hash_expr (v, 0);
427 for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
428 result += vn_reference_op_compute_hash (vro);
430 return result;
433 /* Return true if reference operations P1 and P2 are equivalent. This
434 means they have the same set of operands and vuses. */
437 vn_reference_eq (const void *p1, const void *p2)
439 tree v;
440 int i;
441 vn_reference_op_t vro;
443 const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
444 const_vn_reference_t const vr2 = (const_vn_reference_t) p2;
446 if (vr1->vuses == vr2->vuses
447 && vr1->operands == vr2->operands)
448 return true;
450 /* Impossible for them to be equivalent if they have different
451 number of vuses. */
452 if (VEC_length (tree, vr1->vuses) != VEC_length (tree, vr2->vuses))
453 return false;
455 /* We require that address operands be canonicalized in a way that
456 two memory references will have the same operands if they are
457 equivalent. */
458 if (VEC_length (vn_reference_op_s, vr1->operands)
459 != VEC_length (vn_reference_op_s, vr2->operands))
460 return false;
462 /* The memory state is more often different than the address of the
463 store/load, so check it first. */
464 for (i = 0; VEC_iterate (tree, vr1->vuses, i, v); i++)
466 if (VEC_index (tree, vr2->vuses, i) != v)
467 return false;
470 for (i = 0; VEC_iterate (vn_reference_op_s, vr1->operands, i, vro); i++)
472 if (!vn_reference_op_eq (VEC_index (vn_reference_op_s, vr2->operands, i),
473 vro))
474 return false;
476 return true;
479 /* Place the vuses from STMT into *result. */
481 static inline void
482 vuses_to_vec (gimple stmt, VEC (tree, gc) **result)
484 ssa_op_iter iter;
485 tree vuse;
487 if (!stmt)
488 return;
490 VEC_reserve_exact (tree, gc, *result,
491 num_ssa_operands (stmt, SSA_OP_VIRTUAL_USES));
493 FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VIRTUAL_USES)
494 VEC_quick_push (tree, *result, vuse);
498 /* Copy the VUSE names in STMT into a vector, and return
499 the vector. */
501 VEC (tree, gc) *
502 copy_vuses_from_stmt (gimple stmt)
504 VEC (tree, gc) *vuses = NULL;
506 vuses_to_vec (stmt, &vuses);
508 return vuses;
511 /* Place the vdefs from STMT into *result. */
513 static inline void
514 vdefs_to_vec (gimple stmt, VEC (tree, gc) **result)
516 ssa_op_iter iter;
517 tree vdef;
519 if (!stmt)
520 return;
522 *result = VEC_alloc (tree, gc, num_ssa_operands (stmt, SSA_OP_VIRTUAL_DEFS));
524 FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, iter, SSA_OP_VIRTUAL_DEFS)
525 VEC_quick_push (tree, *result, vdef);
528 /* Copy the names of vdef results in STMT into a vector, and return
529 the vector. */
531 static VEC (tree, gc) *
532 copy_vdefs_from_stmt (gimple stmt)
534 VEC (tree, gc) *vdefs = NULL;
536 vdefs_to_vec (stmt, &vdefs);
538 return vdefs;
541 /* Place for shared_v{uses/defs}_from_stmt to shove vuses/vdefs. */
542 static VEC (tree, gc) *shared_lookup_vops;
544 /* Copy the virtual uses from STMT into SHARED_LOOKUP_VOPS.
545 This function will overwrite the current SHARED_LOOKUP_VOPS
546 variable. */
548 VEC (tree, gc) *
549 shared_vuses_from_stmt (gimple stmt)
551 VEC_truncate (tree, shared_lookup_vops, 0);
552 vuses_to_vec (stmt, &shared_lookup_vops);
554 return shared_lookup_vops;
557 /* Copy the operations present in load/store REF into RESULT, a vector of
558 vn_reference_op_s's. */
560 void
561 copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
563 if (TREE_CODE (ref) == TARGET_MEM_REF)
565 vn_reference_op_s temp;
567 memset (&temp, 0, sizeof (temp));
568 /* We do not care for spurious type qualifications. */
569 temp.type = TYPE_MAIN_VARIANT (TREE_TYPE (ref));
570 temp.opcode = TREE_CODE (ref);
571 temp.op0 = TMR_SYMBOL (ref) ? TMR_SYMBOL (ref) : TMR_BASE (ref);
572 temp.op1 = TMR_INDEX (ref);
573 VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
575 memset (&temp, 0, sizeof (temp));
576 temp.type = NULL_TREE;
577 temp.opcode = TREE_CODE (ref);
578 temp.op0 = TMR_STEP (ref);
579 temp.op1 = TMR_OFFSET (ref);
580 VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
581 return;
584 /* For non-calls, store the information that makes up the address. */
586 while (ref)
588 vn_reference_op_s temp;
590 memset (&temp, 0, sizeof (temp));
591 /* We do not care for spurious type qualifications. */
592 temp.type = TYPE_MAIN_VARIANT (TREE_TYPE (ref));
593 temp.opcode = TREE_CODE (ref);
595 switch (temp.opcode)
597 case ALIGN_INDIRECT_REF:
598 case INDIRECT_REF:
599 /* The only operand is the address, which gets its own
600 vn_reference_op_s structure. */
601 break;
602 case MISALIGNED_INDIRECT_REF:
603 temp.op0 = TREE_OPERAND (ref, 1);
604 break;
605 case BIT_FIELD_REF:
606 /* Record bits and position. */
607 temp.op0 = TREE_OPERAND (ref, 1);
608 temp.op1 = TREE_OPERAND (ref, 2);
609 break;
610 case COMPONENT_REF:
611 /* The field decl is enough to unambiguously specify the field,
612 a matching type is not necessary and a mismatching type
613 is always a spurious difference. */
614 temp.type = NULL_TREE;
615 /* If this is a reference to a union member, record the union
616 member size as operand. Do so only if we are doing
617 expression insertion (during FRE), as PRE currently gets
618 confused with this. */
619 if (may_insert
620 && TREE_OPERAND (ref, 2) == NULL_TREE
621 && TREE_CODE (DECL_CONTEXT (TREE_OPERAND (ref, 1))) == UNION_TYPE
622 && integer_zerop (DECL_FIELD_OFFSET (TREE_OPERAND (ref, 1)))
623 && integer_zerop (DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1))))
624 temp.op0 = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 1)));
625 else
627 /* Record field as operand. */
628 temp.op0 = TREE_OPERAND (ref, 1);
629 temp.op1 = TREE_OPERAND (ref, 2);
631 break;
632 case ARRAY_RANGE_REF:
633 case ARRAY_REF:
634 /* Record index as operand. */
635 temp.op0 = TREE_OPERAND (ref, 1);
636 temp.op1 = TREE_OPERAND (ref, 2);
637 temp.op2 = TREE_OPERAND (ref, 3);
638 break;
639 case STRING_CST:
640 case INTEGER_CST:
641 case COMPLEX_CST:
642 case VECTOR_CST:
643 case REAL_CST:
644 case CONSTRUCTOR:
645 case VAR_DECL:
646 case PARM_DECL:
647 case CONST_DECL:
648 case RESULT_DECL:
649 case SSA_NAME:
650 temp.op0 = ref;
651 break;
652 case ADDR_EXPR:
653 if (is_gimple_min_invariant (ref))
655 temp.op0 = ref;
656 break;
658 /* Fallthrough. */
659 /* These are only interesting for their operands, their
660 existence, and their type. They will never be the last
661 ref in the chain of references (IE they require an
662 operand), so we don't have to put anything
663 for op* as it will be handled by the iteration */
664 case IMAGPART_EXPR:
665 case REALPART_EXPR:
666 case VIEW_CONVERT_EXPR:
667 break;
668 default:
669 gcc_unreachable ();
671 VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
673 if (REFERENCE_CLASS_P (ref)
674 || (TREE_CODE (ref) == ADDR_EXPR
675 && !is_gimple_min_invariant (ref)))
676 ref = TREE_OPERAND (ref, 0);
677 else
678 ref = NULL_TREE;
682 /* Re-create a reference tree from the reference ops OPS.
683 Returns NULL_TREE if the ops were not handled.
684 This routine needs to be kept in sync with copy_reference_ops_from_ref. */
686 static tree
687 get_ref_from_reference_ops (VEC(vn_reference_op_s, heap) *ops)
689 vn_reference_op_t op;
690 unsigned i;
691 tree ref, *op0_p = &ref;
693 for (i = 0; VEC_iterate (vn_reference_op_s, ops, i, op); ++i)
695 switch (op->opcode)
697 case CALL_EXPR:
698 return NULL_TREE;
700 case ALIGN_INDIRECT_REF:
701 case INDIRECT_REF:
702 *op0_p = build1 (op->opcode, op->type, NULL_TREE);
703 op0_p = &TREE_OPERAND (*op0_p, 0);
704 break;
706 case MISALIGNED_INDIRECT_REF:
707 *op0_p = build2 (MISALIGNED_INDIRECT_REF, op->type,
708 NULL_TREE, op->op0);
709 op0_p = &TREE_OPERAND (*op0_p, 0);
710 break;
712 case BIT_FIELD_REF:
713 *op0_p = build3 (BIT_FIELD_REF, op->type, NULL_TREE,
714 op->op0, op->op1);
715 op0_p = &TREE_OPERAND (*op0_p, 0);
716 break;
718 case COMPONENT_REF:
719 *op0_p = build3 (COMPONENT_REF, TREE_TYPE (op->op0), NULL_TREE,
720 op->op0, op->op1);
721 op0_p = &TREE_OPERAND (*op0_p, 0);
722 break;
724 case ARRAY_RANGE_REF:
725 case ARRAY_REF:
726 *op0_p = build4 (op->opcode, op->type, NULL_TREE,
727 op->op0, op->op1, op->op2);
728 op0_p = &TREE_OPERAND (*op0_p, 0);
729 break;
731 case STRING_CST:
732 case INTEGER_CST:
733 case COMPLEX_CST:
734 case VECTOR_CST:
735 case REAL_CST:
736 case CONSTRUCTOR:
737 case VAR_DECL:
738 case PARM_DECL:
739 case CONST_DECL:
740 case RESULT_DECL:
741 case SSA_NAME:
742 *op0_p = op->op0;
743 break;
745 case ADDR_EXPR:
746 if (op->op0 != NULL_TREE)
748 gcc_assert (is_gimple_min_invariant (op->op0));
749 *op0_p = op->op0;
750 break;
752 /* Fallthrough. */
753 case IMAGPART_EXPR:
754 case REALPART_EXPR:
755 case VIEW_CONVERT_EXPR:
756 *op0_p = build1 (op->opcode, op->type, NULL_TREE);
757 op0_p = &TREE_OPERAND (*op0_p, 0);
758 break;
760 default:
761 return NULL_TREE;
765 return ref;
768 /* Copy the operations present in load/store/call REF into RESULT, a vector of
769 vn_reference_op_s's. */
771 void
772 copy_reference_ops_from_call (gimple call,
773 VEC(vn_reference_op_s, heap) **result)
775 vn_reference_op_s temp;
776 unsigned i;
778 /* Copy the type, opcode, function being called and static chain. */
779 memset (&temp, 0, sizeof (temp));
780 temp.type = gimple_call_return_type (call);
781 temp.opcode = CALL_EXPR;
782 temp.op0 = gimple_call_fn (call);
783 temp.op1 = gimple_call_chain (call);
784 VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
786 /* Copy the call arguments. As they can be references as well,
787 just chain them together. */
788 for (i = 0; i < gimple_call_num_args (call); ++i)
790 tree callarg = gimple_call_arg (call, i);
791 copy_reference_ops_from_ref (callarg, result);
795 /* Create a vector of vn_reference_op_s structures from REF, a
796 REFERENCE_CLASS_P tree. The vector is not shared. */
798 static VEC(vn_reference_op_s, heap) *
799 create_reference_ops_from_ref (tree ref)
801 VEC (vn_reference_op_s, heap) *result = NULL;
803 copy_reference_ops_from_ref (ref, &result);
804 return result;
807 /* Create a vector of vn_reference_op_s structures from CALL, a
808 call statement. The vector is not shared. */
810 static VEC(vn_reference_op_s, heap) *
811 create_reference_ops_from_call (gimple call)
813 VEC (vn_reference_op_s, heap) *result = NULL;
815 copy_reference_ops_from_call (call, &result);
816 return result;
819 static VEC(vn_reference_op_s, heap) *shared_lookup_references;
821 /* Create a vector of vn_reference_op_s structures from REF, a
822 REFERENCE_CLASS_P tree. The vector is shared among all callers of
823 this function. */
825 static VEC(vn_reference_op_s, heap) *
826 shared_reference_ops_from_ref (tree ref)
828 if (!ref)
829 return NULL;
830 VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
831 copy_reference_ops_from_ref (ref, &shared_lookup_references);
832 return shared_lookup_references;
835 /* Create a vector of vn_reference_op_s structures from CALL, a
836 call statement. The vector is shared among all callers of
837 this function. */
839 static VEC(vn_reference_op_s, heap) *
840 shared_reference_ops_from_call (gimple call)
842 if (!call)
843 return NULL;
844 VEC_truncate (vn_reference_op_s, shared_lookup_references, 0);
845 copy_reference_ops_from_call (call, &shared_lookup_references);
846 return shared_lookup_references;
850 /* Transform any SSA_NAME's in a vector of vn_reference_op_s
851 structures into their value numbers. This is done in-place, and
852 the vector passed in is returned. */
854 static VEC (vn_reference_op_s, heap) *
855 valueize_refs (VEC (vn_reference_op_s, heap) *orig)
857 vn_reference_op_t vro;
858 int i;
860 for (i = 0; VEC_iterate (vn_reference_op_s, orig, i, vro); i++)
862 if (vro->opcode == SSA_NAME
863 || (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME))
865 vro->op0 = SSA_VAL (vro->op0);
866 /* If it transforms from an SSA_NAME to a constant, update
867 the opcode. */
868 if (TREE_CODE (vro->op0) != SSA_NAME && vro->opcode == SSA_NAME)
869 vro->opcode = TREE_CODE (vro->op0);
871 /* TODO: Do we want to valueize op2 and op1 of
872 ARRAY_REF/COMPONENT_REF for Ada */
876 return orig;
879 /* Transform any SSA_NAME's in ORIG, a vector of vuse trees, into
880 their value numbers. This is done in-place, and the vector passed
881 in is returned. */
883 static VEC (tree, gc) *
884 valueize_vuses (VEC (tree, gc) *orig)
886 bool made_replacement = false;
887 tree vuse;
888 int i;
890 for (i = 0; VEC_iterate (tree, orig, i, vuse); i++)
892 if (vuse != SSA_VAL (vuse))
894 made_replacement = true;
895 VEC_replace (tree, orig, i, SSA_VAL (vuse));
899 if (made_replacement && VEC_length (tree, orig) > 1)
900 sort_vuses (orig);
902 return orig;
905 /* Return the single reference statement defining all virtual uses
906 in VUSES or NULL_TREE, if there are multiple defining statements.
907 Take into account only definitions that alias REF if following
908 back-edges. */
910 static gimple
911 get_def_ref_stmt_vuses (tree ref, VEC (tree, gc) *vuses)
913 gimple def_stmt;
914 tree vuse;
915 unsigned int i;
917 gcc_assert (VEC_length (tree, vuses) >= 1);
919 def_stmt = SSA_NAME_DEF_STMT (VEC_index (tree, vuses, 0));
920 if (gimple_code (def_stmt) == GIMPLE_PHI)
922 /* We can only handle lookups over PHI nodes for a single
923 virtual operand. */
924 if (VEC_length (tree, vuses) == 1)
926 def_stmt = get_single_def_stmt_from_phi (ref, def_stmt);
927 goto cont;
929 else
930 return NULL;
933 /* Verify each VUSE reaches the same defining stmt. */
934 for (i = 1; VEC_iterate (tree, vuses, i, vuse); ++i)
936 gimple tmp = SSA_NAME_DEF_STMT (vuse);
937 if (tmp != def_stmt)
938 return NULL;
941 /* Now see if the definition aliases ref, and loop until it does. */
942 cont:
943 while (def_stmt
944 && is_gimple_assign (def_stmt)
945 && !refs_may_alias_p (ref, gimple_get_lhs (def_stmt)))
946 def_stmt = get_single_def_stmt_with_phi (ref, def_stmt);
948 return def_stmt;
951 /* Lookup a SCCVN reference operation VR in the current hash table.
952 Returns the resulting value number if it exists in the hash table,
953 NULL_TREE otherwise. VNRESULT will be filled in with the actual
954 vn_reference_t stored in the hashtable if something is found. */
956 static tree
957 vn_reference_lookup_1 (vn_reference_t vr, vn_reference_t *vnresult)
959 void **slot;
960 hashval_t hash;
962 hash = vr->hashcode;
963 slot = htab_find_slot_with_hash (current_info->references, vr,
964 hash, NO_INSERT);
965 if (!slot && current_info == optimistic_info)
966 slot = htab_find_slot_with_hash (valid_info->references, vr,
967 hash, NO_INSERT);
968 if (slot)
970 if (vnresult)
971 *vnresult = (vn_reference_t)*slot;
972 return ((vn_reference_t)*slot)->result;
975 return NULL_TREE;
979 /* Lookup a reference operation by it's parts, in the current hash table.
980 Returns the resulting value number if it exists in the hash table,
981 NULL_TREE otherwise. VNRESULT will be filled in with the actual
982 vn_reference_t stored in the hashtable if something is found. */
984 tree
985 vn_reference_lookup_pieces (VEC (tree, gc) *vuses,
986 VEC (vn_reference_op_s, heap) *operands,
987 vn_reference_t *vnresult, bool maywalk)
989 struct vn_reference_s vr1;
990 tree result;
991 if (vnresult)
992 *vnresult = NULL;
994 vr1.vuses = valueize_vuses (vuses);
995 vr1.operands = valueize_refs (operands);
996 vr1.hashcode = vn_reference_compute_hash (&vr1);
997 result = vn_reference_lookup_1 (&vr1, vnresult);
999 /* If there is a single defining statement for all virtual uses, we can
1000 use that, following virtual use-def chains. */
1001 if (!result
1002 && maywalk
1003 && vr1.vuses
1004 && VEC_length (tree, vr1.vuses) >= 1)
1006 tree ref = get_ref_from_reference_ops (operands);
1007 gimple def_stmt;
1008 if (ref
1009 && (def_stmt = get_def_ref_stmt_vuses (ref, vr1.vuses))
1010 && is_gimple_assign (def_stmt))
1012 /* We are now at an aliasing definition for the vuses we want to
1013 look up. Re-do the lookup with the vdefs for this stmt. */
1014 vdefs_to_vec (def_stmt, &vuses);
1015 vr1.vuses = valueize_vuses (vuses);
1016 vr1.hashcode = vn_reference_compute_hash (&vr1);
1017 result = vn_reference_lookup_1 (&vr1, vnresult);
1021 return result;
1024 /* Lookup OP in the current hash table, and return the resulting value
1025 number if it exists in the hash table. Return NULL_TREE if it does
1026 not exist in the hash table or if the result field of the structure
1027 was NULL.. VNRESULT will be filled in with the vn_reference_t
1028 stored in the hashtable if one exists. */
1030 tree
1031 vn_reference_lookup (tree op, VEC (tree, gc) *vuses, bool maywalk,
1032 vn_reference_t *vnresult)
1034 struct vn_reference_s vr1;
1035 tree result;
1036 gimple def_stmt;
1037 if (vnresult)
1038 *vnresult = NULL;
1040 vr1.vuses = valueize_vuses (vuses);
1041 vr1.operands = valueize_refs (shared_reference_ops_from_ref (op));
1042 vr1.hashcode = vn_reference_compute_hash (&vr1);
1043 result = vn_reference_lookup_1 (&vr1, vnresult);
1045 /* If there is a single defining statement for all virtual uses, we can
1046 use that, following virtual use-def chains. */
1047 if (!result
1048 && maywalk
1049 && vr1.vuses
1050 && VEC_length (tree, vr1.vuses) >= 1
1051 && (def_stmt = get_def_ref_stmt_vuses (op, vr1.vuses))
1052 && is_gimple_assign (def_stmt))
1054 /* We are now at an aliasing definition for the vuses we want to
1055 look up. Re-do the lookup with the vdefs for this stmt. */
1056 vdefs_to_vec (def_stmt, &vuses);
1057 vr1.vuses = valueize_vuses (vuses);
1058 vr1.hashcode = vn_reference_compute_hash (&vr1);
1059 result = vn_reference_lookup_1 (&vr1, vnresult);
1062 return result;
1066 /* Insert OP into the current hash table with a value number of
1067 RESULT, and return the resulting reference structure we created. */
1069 vn_reference_t
1070 vn_reference_insert (tree op, tree result, VEC (tree, gc) *vuses)
1072 void **slot;
1073 vn_reference_t vr1;
1075 vr1 = (vn_reference_t) pool_alloc (current_info->references_pool);
1076 if (TREE_CODE (result) == SSA_NAME)
1077 vr1->value_id = VN_INFO (result)->value_id;
1078 else
1079 vr1->value_id = get_or_alloc_constant_value_id (result);
1080 vr1->vuses = valueize_vuses (vuses);
1081 vr1->operands = valueize_refs (create_reference_ops_from_ref (op));
1082 vr1->hashcode = vn_reference_compute_hash (vr1);
1083 vr1->result = TREE_CODE (result) == SSA_NAME ? SSA_VAL (result) : result;
1085 slot = htab_find_slot_with_hash (current_info->references, vr1, vr1->hashcode,
1086 INSERT);
1088 /* Because we lookup stores using vuses, and value number failures
1089 using the vdefs (see visit_reference_op_store for how and why),
1090 it's possible that on failure we may try to insert an already
1091 inserted store. This is not wrong, there is no ssa name for a
1092 store that we could use as a differentiator anyway. Thus, unlike
1093 the other lookup functions, you cannot gcc_assert (!*slot)
1094 here. */
1096 /* But free the old slot in case of a collision. */
1097 if (*slot)
1098 free_reference (*slot);
1100 *slot = vr1;
1101 return vr1;
1104 /* Insert a reference by it's pieces into the current hash table with
1105 a value number of RESULT. Return the resulting reference
1106 structure we created. */
1108 vn_reference_t
1109 vn_reference_insert_pieces (VEC (tree, gc) *vuses,
1110 VEC (vn_reference_op_s, heap) *operands,
1111 tree result, unsigned int value_id)
1114 void **slot;
1115 vn_reference_t vr1;
1117 vr1 = (vn_reference_t) pool_alloc (current_info->references_pool);
1118 vr1->value_id = value_id;
1119 vr1->vuses = valueize_vuses (vuses);
1120 vr1->operands = valueize_refs (operands);
1121 vr1->hashcode = vn_reference_compute_hash (vr1);
1122 if (result && TREE_CODE (result) == SSA_NAME)
1123 result = SSA_VAL (result);
1124 vr1->result = result;
1126 slot = htab_find_slot_with_hash (current_info->references, vr1, vr1->hashcode,
1127 INSERT);
1129 /* At this point we should have all the things inserted that we have
1130 seen before, and we should never try inserting something that
1131 already exists. */
1132 gcc_assert (!*slot);
1133 if (*slot)
1134 free_reference (*slot);
1136 *slot = vr1;
1137 return vr1;
1140 /* Compute and return the hash value for nary operation VBO1. */
1142 inline hashval_t
1143 vn_nary_op_compute_hash (const vn_nary_op_t vno1)
1145 hashval_t hash = 0;
1146 unsigned i;
1148 for (i = 0; i < vno1->length; ++i)
1149 if (TREE_CODE (vno1->op[i]) == SSA_NAME)
1150 vno1->op[i] = SSA_VAL (vno1->op[i]);
1152 if (vno1->length == 2
1153 && commutative_tree_code (vno1->opcode)
1154 && tree_swap_operands_p (vno1->op[0], vno1->op[1], false))
1156 tree temp = vno1->op[0];
1157 vno1->op[0] = vno1->op[1];
1158 vno1->op[1] = temp;
1161 for (i = 0; i < vno1->length; ++i)
1162 hash += iterative_hash_expr (vno1->op[i], vno1->opcode);
1164 return hash;
1167 /* Return the computed hashcode for nary operation P1. */
1169 static hashval_t
1170 vn_nary_op_hash (const void *p1)
1172 const_vn_nary_op_t const vno1 = (const_vn_nary_op_t) p1;
1173 return vno1->hashcode;
1176 /* Compare nary operations P1 and P2 and return true if they are
1177 equivalent. */
1180 vn_nary_op_eq (const void *p1, const void *p2)
1182 const_vn_nary_op_t const vno1 = (const_vn_nary_op_t) p1;
1183 const_vn_nary_op_t const vno2 = (const_vn_nary_op_t) p2;
1184 unsigned i;
1186 if (vno1->opcode != vno2->opcode
1187 || !types_compatible_p (vno1->type, vno2->type))
1188 return false;
1190 for (i = 0; i < vno1->length; ++i)
1191 if (!expressions_equal_p (vno1->op[i], vno2->op[i]))
1192 return false;
1194 return true;
1197 /* Lookup a n-ary operation by its pieces and return the resulting value
1198 number if it exists in the hash table. Return NULL_TREE if it does
1199 not exist in the hash table or if the result field of the operation
1200 is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
1201 if it exists. */
1203 tree
1204 vn_nary_op_lookup_pieces (unsigned int length, enum tree_code code,
1205 tree type, tree op0, tree op1, tree op2,
1206 tree op3, vn_nary_op_t *vnresult)
1208 void **slot;
1209 struct vn_nary_op_s vno1;
1210 if (vnresult)
1211 *vnresult = NULL;
1212 vno1.opcode = code;
1213 vno1.length = length;
1214 vno1.type = type;
1215 vno1.op[0] = op0;
1216 vno1.op[1] = op1;
1217 vno1.op[2] = op2;
1218 vno1.op[3] = op3;
1219 vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1220 slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1221 NO_INSERT);
1222 if (!slot && current_info == optimistic_info)
1223 slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1224 NO_INSERT);
1225 if (!slot)
1226 return NULL_TREE;
1227 if (vnresult)
1228 *vnresult = (vn_nary_op_t)*slot;
1229 return ((vn_nary_op_t)*slot)->result;
1232 /* Lookup OP in the current hash table, and return the resulting value
1233 number if it exists in the hash table. Return NULL_TREE if it does
1234 not exist in the hash table or if the result field of the operation
1235 is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
1236 if it exists. */
1238 tree
1239 vn_nary_op_lookup (tree op, vn_nary_op_t *vnresult)
1241 void **slot;
1242 struct vn_nary_op_s vno1;
1243 unsigned i;
1245 if (vnresult)
1246 *vnresult = NULL;
1247 vno1.opcode = TREE_CODE (op);
1248 vno1.length = TREE_CODE_LENGTH (TREE_CODE (op));
1249 vno1.type = TREE_TYPE (op);
1250 for (i = 0; i < vno1.length; ++i)
1251 vno1.op[i] = TREE_OPERAND (op, i);
1252 vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1253 slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1254 NO_INSERT);
1255 if (!slot && current_info == optimistic_info)
1256 slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1257 NO_INSERT);
1258 if (!slot)
1259 return NULL_TREE;
1260 if (vnresult)
1261 *vnresult = (vn_nary_op_t)*slot;
1262 return ((vn_nary_op_t)*slot)->result;
1265 /* Lookup the rhs of STMT in the current hash table, and return the resulting
1266 value number if it exists in the hash table. Return NULL_TREE if
1267 it does not exist in the hash table. VNRESULT will contain the
1268 vn_nary_op_t from the hashtable if it exists. */
1270 tree
1271 vn_nary_op_lookup_stmt (gimple stmt, vn_nary_op_t *vnresult)
1273 void **slot;
1274 struct vn_nary_op_s vno1;
1275 unsigned i;
1277 if (vnresult)
1278 *vnresult = NULL;
1279 vno1.opcode = gimple_assign_rhs_code (stmt);
1280 vno1.length = gimple_num_ops (stmt) - 1;
1281 vno1.type = TREE_TYPE (gimple_assign_lhs (stmt));
1282 for (i = 0; i < vno1.length; ++i)
1283 vno1.op[i] = gimple_op (stmt, i + 1);
1284 vno1.hashcode = vn_nary_op_compute_hash (&vno1);
1285 slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode,
1286 NO_INSERT);
1287 if (!slot && current_info == optimistic_info)
1288 slot = htab_find_slot_with_hash (valid_info->nary, &vno1, vno1.hashcode,
1289 NO_INSERT);
1290 if (!slot)
1291 return NULL_TREE;
1292 if (vnresult)
1293 *vnresult = (vn_nary_op_t)*slot;
1294 return ((vn_nary_op_t)*slot)->result;
1297 /* Insert a n-ary operation into the current hash table using it's
1298 pieces. Return the vn_nary_op_t structure we created and put in
1299 the hashtable. */
1301 vn_nary_op_t
1302 vn_nary_op_insert_pieces (unsigned int length, enum tree_code code,
1303 tree type, tree op0,
1304 tree op1, tree op2, tree op3,
1305 tree result,
1306 unsigned int value_id)
1308 void **slot;
1309 vn_nary_op_t vno1;
1311 vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1312 (sizeof (struct vn_nary_op_s)
1313 - sizeof (tree) * (4 - length)));
1314 vno1->value_id = value_id;
1315 vno1->opcode = code;
1316 vno1->length = length;
1317 vno1->type = type;
1318 if (length >= 1)
1319 vno1->op[0] = op0;
1320 if (length >= 2)
1321 vno1->op[1] = op1;
1322 if (length >= 3)
1323 vno1->op[2] = op2;
1324 if (length >= 4)
1325 vno1->op[3] = op3;
1326 vno1->result = result;
1327 vno1->hashcode = vn_nary_op_compute_hash (vno1);
1328 slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1329 INSERT);
1330 gcc_assert (!*slot);
1332 *slot = vno1;
1333 return vno1;
1337 /* Insert OP into the current hash table with a value number of
1338 RESULT. Return the vn_nary_op_t structure we created and put in
1339 the hashtable. */
1341 vn_nary_op_t
1342 vn_nary_op_insert (tree op, tree result)
1344 unsigned length = TREE_CODE_LENGTH (TREE_CODE (op));
1345 void **slot;
1346 vn_nary_op_t vno1;
1347 unsigned i;
1349 vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1350 (sizeof (struct vn_nary_op_s)
1351 - sizeof (tree) * (4 - length)));
1352 vno1->value_id = VN_INFO (result)->value_id;
1353 vno1->opcode = TREE_CODE (op);
1354 vno1->length = length;
1355 vno1->type = TREE_TYPE (op);
1356 for (i = 0; i < vno1->length; ++i)
1357 vno1->op[i] = TREE_OPERAND (op, i);
1358 vno1->result = result;
1359 vno1->hashcode = vn_nary_op_compute_hash (vno1);
1360 slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1361 INSERT);
1362 gcc_assert (!*slot);
1364 *slot = vno1;
1365 return vno1;
1368 /* Insert the rhs of STMT into the current hash table with a value number of
1369 RESULT. */
1371 vn_nary_op_t
1372 vn_nary_op_insert_stmt (gimple stmt, tree result)
1374 unsigned length = gimple_num_ops (stmt) - 1;
1375 void **slot;
1376 vn_nary_op_t vno1;
1377 unsigned i;
1379 vno1 = (vn_nary_op_t) obstack_alloc (&current_info->nary_obstack,
1380 (sizeof (struct vn_nary_op_s)
1381 - sizeof (tree) * (4 - length)));
1382 vno1->value_id = VN_INFO (result)->value_id;
1383 vno1->opcode = gimple_assign_rhs_code (stmt);
1384 vno1->length = length;
1385 vno1->type = TREE_TYPE (gimple_assign_lhs (stmt));
1386 for (i = 0; i < vno1->length; ++i)
1387 vno1->op[i] = gimple_op (stmt, i + 1);
1388 vno1->result = result;
1389 vno1->hashcode = vn_nary_op_compute_hash (vno1);
1390 slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode,
1391 INSERT);
1392 gcc_assert (!*slot);
1394 *slot = vno1;
1395 return vno1;
1398 /* Compute a hashcode for PHI operation VP1 and return it. */
1400 static inline hashval_t
1401 vn_phi_compute_hash (vn_phi_t vp1)
1403 hashval_t result = 0;
1404 int i;
1405 tree phi1op;
1406 tree type;
1408 result = vp1->block->index;
1410 /* If all PHI arguments are constants we need to distinguish
1411 the PHI node via its type. */
1412 type = TREE_TYPE (VEC_index (tree, vp1->phiargs, 0));
1413 result += (INTEGRAL_TYPE_P (type)
1414 + (INTEGRAL_TYPE_P (type)
1415 ? TYPE_PRECISION (type) + TYPE_UNSIGNED (type) : 0));
1417 for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
1419 if (phi1op == VN_TOP)
1420 continue;
1421 result += iterative_hash_expr (phi1op, result);
1424 return result;
1427 /* Return the computed hashcode for phi operation P1. */
1429 static hashval_t
1430 vn_phi_hash (const void *p1)
1432 const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
1433 return vp1->hashcode;
1436 /* Compare two phi entries for equality, ignoring VN_TOP arguments. */
1438 static int
1439 vn_phi_eq (const void *p1, const void *p2)
1441 const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
1442 const_vn_phi_t const vp2 = (const_vn_phi_t) p2;
1444 if (vp1->block == vp2->block)
1446 int i;
1447 tree phi1op;
1449 /* If the PHI nodes do not have compatible types
1450 they are not the same. */
1451 if (!types_compatible_p (TREE_TYPE (VEC_index (tree, vp1->phiargs, 0)),
1452 TREE_TYPE (VEC_index (tree, vp2->phiargs, 0))))
1453 return false;
1455 /* Any phi in the same block will have it's arguments in the
1456 same edge order, because of how we store phi nodes. */
1457 for (i = 0; VEC_iterate (tree, vp1->phiargs, i, phi1op); i++)
1459 tree phi2op = VEC_index (tree, vp2->phiargs, i);
1460 if (phi1op == VN_TOP || phi2op == VN_TOP)
1461 continue;
1462 if (!expressions_equal_p (phi1op, phi2op))
1463 return false;
1465 return true;
1467 return false;
1470 static VEC(tree, heap) *shared_lookup_phiargs;
1472 /* Lookup PHI in the current hash table, and return the resulting
1473 value number if it exists in the hash table. Return NULL_TREE if
1474 it does not exist in the hash table. */
1476 tree
1477 vn_phi_lookup (gimple phi)
1479 void **slot;
1480 struct vn_phi_s vp1;
1481 unsigned i;
1483 VEC_truncate (tree, shared_lookup_phiargs, 0);
1485 /* Canonicalize the SSA_NAME's to their value number. */
1486 for (i = 0; i < gimple_phi_num_args (phi); i++)
1488 tree def = PHI_ARG_DEF (phi, i);
1489 def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
1490 VEC_safe_push (tree, heap, shared_lookup_phiargs, def);
1492 vp1.phiargs = shared_lookup_phiargs;
1493 vp1.block = gimple_bb (phi);
1494 vp1.hashcode = vn_phi_compute_hash (&vp1);
1495 slot = htab_find_slot_with_hash (current_info->phis, &vp1, vp1.hashcode,
1496 NO_INSERT);
1497 if (!slot && current_info == optimistic_info)
1498 slot = htab_find_slot_with_hash (valid_info->phis, &vp1, vp1.hashcode,
1499 NO_INSERT);
1500 if (!slot)
1501 return NULL_TREE;
1502 return ((vn_phi_t)*slot)->result;
1505 /* Insert PHI into the current hash table with a value number of
1506 RESULT. */
1508 static vn_phi_t
1509 vn_phi_insert (gimple phi, tree result)
1511 void **slot;
1512 vn_phi_t vp1 = (vn_phi_t) pool_alloc (current_info->phis_pool);
1513 unsigned i;
1514 VEC (tree, heap) *args = NULL;
1516 /* Canonicalize the SSA_NAME's to their value number. */
1517 for (i = 0; i < gimple_phi_num_args (phi); i++)
1519 tree def = PHI_ARG_DEF (phi, i);
1520 def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def;
1521 VEC_safe_push (tree, heap, args, def);
1523 vp1->value_id = VN_INFO (result)->value_id;
1524 vp1->phiargs = args;
1525 vp1->block = gimple_bb (phi);
1526 vp1->result = result;
1527 vp1->hashcode = vn_phi_compute_hash (vp1);
1529 slot = htab_find_slot_with_hash (current_info->phis, vp1, vp1->hashcode,
1530 INSERT);
1532 /* Because we iterate over phi operations more than once, it's
1533 possible the slot might already exist here, hence no assert.*/
1534 *slot = vp1;
1535 return vp1;
1539 /* Print set of components in strongly connected component SCC to OUT. */
1541 static void
1542 print_scc (FILE *out, VEC (tree, heap) *scc)
1544 tree var;
1545 unsigned int i;
1547 fprintf (out, "SCC consists of: ");
1548 for (i = 0; VEC_iterate (tree, scc, i, var); i++)
1550 print_generic_expr (out, var, 0);
1551 fprintf (out, " ");
1553 fprintf (out, "\n");
1556 /* Set the value number of FROM to TO, return true if it has changed
1557 as a result. */
1559 static inline bool
1560 set_ssa_val_to (tree from, tree to)
1562 tree currval;
1564 if (from != to
1565 && TREE_CODE (to) == SSA_NAME
1566 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
1567 to = from;
1569 /* The only thing we allow as value numbers are VN_TOP, ssa_names
1570 and invariants. So assert that here. */
1571 gcc_assert (to != NULL_TREE
1572 && (to == VN_TOP
1573 || TREE_CODE (to) == SSA_NAME
1574 || is_gimple_min_invariant (to)));
1576 if (dump_file && (dump_flags & TDF_DETAILS))
1578 fprintf (dump_file, "Setting value number of ");
1579 print_generic_expr (dump_file, from, 0);
1580 fprintf (dump_file, " to ");
1581 print_generic_expr (dump_file, to, 0);
1582 fprintf (dump_file, "\n");
1585 currval = SSA_VAL (from);
1587 if (currval != to && !operand_equal_p (currval, to, OEP_PURE_SAME))
1589 SSA_VAL (from) = to;
1590 return true;
1592 return false;
1595 /* Set all definitions in STMT to value number to themselves.
1596 Return true if a value number changed. */
1598 static bool
1599 defs_to_varying (gimple stmt)
1601 bool changed = false;
1602 ssa_op_iter iter;
1603 def_operand_p defp;
1605 FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_ALL_DEFS)
1607 tree def = DEF_FROM_PTR (defp);
1609 VN_INFO (def)->use_processed = true;
1610 changed |= set_ssa_val_to (def, def);
1612 return changed;
1615 static bool expr_has_constants (tree expr);
1616 static tree valueize_expr (tree expr);
1618 /* Visit a copy between LHS and RHS, return true if the value number
1619 changed. */
1621 static bool
1622 visit_copy (tree lhs, tree rhs)
1624 /* Follow chains of copies to their destination. */
1625 while (TREE_CODE (rhs) == SSA_NAME
1626 && SSA_VAL (rhs) != rhs)
1627 rhs = SSA_VAL (rhs);
1629 /* The copy may have a more interesting constant filled expression
1630 (we don't, since we know our RHS is just an SSA name). */
1631 if (TREE_CODE (rhs) == SSA_NAME)
1633 VN_INFO (lhs)->has_constants = VN_INFO (rhs)->has_constants;
1634 VN_INFO (lhs)->expr = VN_INFO (rhs)->expr;
1637 return set_ssa_val_to (lhs, rhs);
1640 /* Visit a unary operator RHS, value number it, and return true if the
1641 value number of LHS has changed as a result. */
1643 static bool
1644 visit_unary_op (tree lhs, gimple stmt)
1646 bool changed = false;
1647 tree result = vn_nary_op_lookup_stmt (stmt, NULL);
1649 if (result)
1651 changed = set_ssa_val_to (lhs, result);
1653 else
1655 changed = set_ssa_val_to (lhs, lhs);
1656 vn_nary_op_insert_stmt (stmt, lhs);
1659 return changed;
1662 /* Visit a binary operator RHS, value number it, and return true if the
1663 value number of LHS has changed as a result. */
1665 static bool
1666 visit_binary_op (tree lhs, gimple stmt)
1668 bool changed = false;
1669 tree result = vn_nary_op_lookup_stmt (stmt, NULL);
1671 if (result)
1673 changed = set_ssa_val_to (lhs, result);
1675 else
1677 changed = set_ssa_val_to (lhs, lhs);
1678 vn_nary_op_insert_stmt (stmt, lhs);
1681 return changed;
1684 /* Visit a call STMT storing into LHS. Return true if the value number
1685 of the LHS has changed as a result. */
1687 static bool
1688 visit_reference_op_call (tree lhs, gimple stmt)
1690 bool changed = false;
1691 struct vn_reference_s vr1;
1692 tree result;
1694 vr1.vuses = valueize_vuses (shared_vuses_from_stmt (stmt));
1695 vr1.operands = valueize_refs (shared_reference_ops_from_call (stmt));
1696 vr1.hashcode = vn_reference_compute_hash (&vr1);
1697 result = vn_reference_lookup_1 (&vr1, NULL);
1698 if (result)
1700 changed = set_ssa_val_to (lhs, result);
1701 if (TREE_CODE (result) == SSA_NAME
1702 && VN_INFO (result)->has_constants)
1703 VN_INFO (lhs)->has_constants = true;
1705 else
1707 void **slot;
1708 vn_reference_t vr2;
1709 changed = set_ssa_val_to (lhs, lhs);
1710 vr2 = (vn_reference_t) pool_alloc (current_info->references_pool);
1711 vr2->vuses = valueize_vuses (copy_vuses_from_stmt (stmt));
1712 vr2->operands = valueize_refs (create_reference_ops_from_call (stmt));
1713 vr2->hashcode = vr1.hashcode;
1714 vr2->result = lhs;
1715 slot = htab_find_slot_with_hash (current_info->references,
1716 vr2, vr2->hashcode, INSERT);
1717 if (*slot)
1718 free_reference (*slot);
1719 *slot = vr2;
1722 return changed;
1725 /* Visit a load from a reference operator RHS, part of STMT, value number it,
1726 and return true if the value number of the LHS has changed as a result. */
1728 static bool
1729 visit_reference_op_load (tree lhs, tree op, gimple stmt)
1731 bool changed = false;
1732 tree result = vn_reference_lookup (op, shared_vuses_from_stmt (stmt), true,
1733 NULL);
1735 /* We handle type-punning through unions by value-numbering based
1736 on offset and size of the access. Be prepared to handle a
1737 type-mismatch here via creating a VIEW_CONVERT_EXPR. */
1738 if (result
1739 && !useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (op)))
1741 /* We will be setting the value number of lhs to the value number
1742 of VIEW_CONVERT_EXPR <TREE_TYPE (result)> (result).
1743 So first simplify and lookup this expression to see if it
1744 is already available. */
1745 tree val = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (op), result);
1746 if ((CONVERT_EXPR_P (val)
1747 || TREE_CODE (val) == VIEW_CONVERT_EXPR)
1748 && TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME)
1750 tree tem = valueize_expr (vn_get_expr_for (TREE_OPERAND (val, 0)));
1751 if ((CONVERT_EXPR_P (tem)
1752 || TREE_CODE (tem) == VIEW_CONVERT_EXPR)
1753 && (tem = fold_unary (TREE_CODE (val), TREE_TYPE (val), tem)))
1754 val = tem;
1756 result = val;
1757 if (!is_gimple_min_invariant (val)
1758 && TREE_CODE (val) != SSA_NAME)
1759 result = vn_nary_op_lookup (val, NULL);
1760 /* If the expression is not yet available, value-number lhs to
1761 a new SSA_NAME we create. */
1762 if (!result && may_insert)
1764 result = make_ssa_name (SSA_NAME_VAR (lhs), NULL);
1765 /* Initialize value-number information properly. */
1766 VN_INFO_GET (result)->valnum = result;
1767 VN_INFO (result)->value_id = get_next_value_id ();
1768 VN_INFO (result)->expr = val;
1769 VN_INFO (result)->has_constants = expr_has_constants (val);
1770 VN_INFO (result)->needs_insertion = true;
1771 /* As all "inserted" statements are singleton SCCs, insert
1772 to the valid table. This is strictly needed to
1773 avoid re-generating new value SSA_NAMEs for the same
1774 expression during SCC iteration over and over (the
1775 optimistic table gets cleared after each iteration).
1776 We do not need to insert into the optimistic table, as
1777 lookups there will fall back to the valid table. */
1778 if (current_info == optimistic_info)
1780 current_info = valid_info;
1781 vn_nary_op_insert (val, result);
1782 current_info = optimistic_info;
1784 else
1785 vn_nary_op_insert (val, result);
1786 if (dump_file && (dump_flags & TDF_DETAILS))
1788 fprintf (dump_file, "Inserting name ");
1789 print_generic_expr (dump_file, result, 0);
1790 fprintf (dump_file, " for expression ");
1791 print_generic_expr (dump_file, val, 0);
1792 fprintf (dump_file, "\n");
1797 if (result)
1799 changed = set_ssa_val_to (lhs, result);
1800 if (TREE_CODE (result) == SSA_NAME
1801 && VN_INFO (result)->has_constants)
1803 VN_INFO (lhs)->expr = VN_INFO (result)->expr;
1804 VN_INFO (lhs)->has_constants = true;
1807 else
1809 changed = set_ssa_val_to (lhs, lhs);
1810 vn_reference_insert (op, lhs, copy_vuses_from_stmt (stmt));
1813 return changed;
1817 /* Visit a store to a reference operator LHS, part of STMT, value number it,
1818 and return true if the value number of the LHS has changed as a result. */
1820 static bool
1821 visit_reference_op_store (tree lhs, tree op, gimple stmt)
1823 bool changed = false;
1824 tree result;
1825 bool resultsame = false;
1827 /* First we want to lookup using the *vuses* from the store and see
1828 if there the last store to this location with the same address
1829 had the same value.
1831 The vuses represent the memory state before the store. If the
1832 memory state, address, and value of the store is the same as the
1833 last store to this location, then this store will produce the
1834 same memory state as that store.
1836 In this case the vdef versions for this store are value numbered to those
1837 vuse versions, since they represent the same memory state after
1838 this store.
1840 Otherwise, the vdefs for the store are used when inserting into
1841 the table, since the store generates a new memory state. */
1843 result = vn_reference_lookup (lhs, shared_vuses_from_stmt (stmt), false,
1844 NULL);
1846 if (result)
1848 if (TREE_CODE (result) == SSA_NAME)
1849 result = SSA_VAL (result);
1850 if (TREE_CODE (op) == SSA_NAME)
1851 op = SSA_VAL (op);
1852 resultsame = expressions_equal_p (result, op);
1855 if (!result || !resultsame)
1857 VEC(tree, gc) *vdefs = copy_vdefs_from_stmt (stmt);
1858 int i;
1859 tree vdef;
1861 if (dump_file && (dump_flags & TDF_DETAILS))
1863 fprintf (dump_file, "No store match\n");
1864 fprintf (dump_file, "Value numbering store ");
1865 print_generic_expr (dump_file, lhs, 0);
1866 fprintf (dump_file, " to ");
1867 print_generic_expr (dump_file, op, 0);
1868 fprintf (dump_file, "\n");
1870 /* Have to set value numbers before insert, since insert is
1871 going to valueize the references in-place. */
1872 for (i = 0; VEC_iterate (tree, vdefs, i, vdef); i++)
1874 VN_INFO (vdef)->use_processed = true;
1875 changed |= set_ssa_val_to (vdef, vdef);
1878 /* Do not insert structure copies into the tables. */
1879 if (is_gimple_min_invariant (op)
1880 || is_gimple_reg (op))
1881 vn_reference_insert (lhs, op, vdefs);
1883 else
1885 /* We had a match, so value number the vdefs to have the value
1886 number of the vuses they came from. */
1887 ssa_op_iter op_iter;
1888 def_operand_p var;
1889 vuse_vec_p vv;
1891 if (dump_file && (dump_flags & TDF_DETAILS))
1892 fprintf (dump_file, "Store matched earlier value,"
1893 "value numbering store vdefs to matching vuses.\n");
1895 FOR_EACH_SSA_VDEF_OPERAND (var, vv, stmt, op_iter)
1897 tree def = DEF_FROM_PTR (var);
1898 tree use;
1900 /* Uh, if the vuse is a multiuse, we can't really do much
1901 here, sadly, since we don't know which value number of
1902 which vuse to use. */
1903 if (VUSE_VECT_NUM_ELEM (*vv) != 1)
1904 use = def;
1905 else
1906 use = VUSE_ELEMENT_VAR (*vv, 0);
1908 VN_INFO (def)->use_processed = true;
1909 changed |= set_ssa_val_to (def, SSA_VAL (use));
1913 return changed;
1916 /* Visit and value number PHI, return true if the value number
1917 changed. */
1919 static bool
1920 visit_phi (gimple phi)
1922 bool changed = false;
1923 tree result;
1924 tree sameval = VN_TOP;
1925 bool allsame = true;
1926 unsigned i;
1928 /* TODO: We could check for this in init_sccvn, and replace this
1929 with a gcc_assert. */
1930 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)))
1931 return set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
1933 /* See if all non-TOP arguments have the same value. TOP is
1934 equivalent to everything, so we can ignore it. */
1935 for (i = 0; i < gimple_phi_num_args (phi); i++)
1937 tree def = PHI_ARG_DEF (phi, i);
1939 if (TREE_CODE (def) == SSA_NAME)
1940 def = SSA_VAL (def);
1941 if (def == VN_TOP)
1942 continue;
1943 if (sameval == VN_TOP)
1945 sameval = def;
1947 else
1949 if (!expressions_equal_p (def, sameval))
1951 allsame = false;
1952 break;
1957 /* If all value numbered to the same value, the phi node has that
1958 value. */
1959 if (allsame)
1961 if (is_gimple_min_invariant (sameval))
1963 VN_INFO (PHI_RESULT (phi))->has_constants = true;
1964 VN_INFO (PHI_RESULT (phi))->expr = sameval;
1966 else
1968 VN_INFO (PHI_RESULT (phi))->has_constants = false;
1969 VN_INFO (PHI_RESULT (phi))->expr = sameval;
1972 if (TREE_CODE (sameval) == SSA_NAME)
1973 return visit_copy (PHI_RESULT (phi), sameval);
1975 return set_ssa_val_to (PHI_RESULT (phi), sameval);
1978 /* Otherwise, see if it is equivalent to a phi node in this block. */
1979 result = vn_phi_lookup (phi);
1980 if (result)
1982 if (TREE_CODE (result) == SSA_NAME)
1983 changed = visit_copy (PHI_RESULT (phi), result);
1984 else
1985 changed = set_ssa_val_to (PHI_RESULT (phi), result);
1987 else
1989 vn_phi_insert (phi, PHI_RESULT (phi));
1990 VN_INFO (PHI_RESULT (phi))->has_constants = false;
1991 VN_INFO (PHI_RESULT (phi))->expr = PHI_RESULT (phi);
1992 changed = set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
1995 return changed;
1998 /* Return true if EXPR contains constants. */
2000 static bool
2001 expr_has_constants (tree expr)
2003 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
2005 case tcc_unary:
2006 return is_gimple_min_invariant (TREE_OPERAND (expr, 0));
2008 case tcc_binary:
2009 return is_gimple_min_invariant (TREE_OPERAND (expr, 0))
2010 || is_gimple_min_invariant (TREE_OPERAND (expr, 1));
2011 /* Constants inside reference ops are rarely interesting, but
2012 it can take a lot of looking to find them. */
2013 case tcc_reference:
2014 case tcc_declaration:
2015 return false;
2016 default:
2017 return is_gimple_min_invariant (expr);
2019 return false;
2022 /* Return true if STMT contains constants. */
2024 static bool
2025 stmt_has_constants (gimple stmt)
2027 if (gimple_code (stmt) != GIMPLE_ASSIGN)
2028 return false;
2030 switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
2032 case GIMPLE_UNARY_RHS:
2033 return is_gimple_min_invariant (gimple_assign_rhs1 (stmt));
2035 case GIMPLE_BINARY_RHS:
2036 return (is_gimple_min_invariant (gimple_assign_rhs1 (stmt))
2037 || is_gimple_min_invariant (gimple_assign_rhs2 (stmt)));
2038 case GIMPLE_SINGLE_RHS:
2039 /* Constants inside reference ops are rarely interesting, but
2040 it can take a lot of looking to find them. */
2041 return is_gimple_min_invariant (gimple_assign_rhs1 (stmt));
2042 default:
2043 gcc_unreachable ();
2045 return false;
2048 /* Replace SSA_NAMES in expr with their value numbers, and return the
2049 result.
2050 This is performed in place. */
2052 static tree
2053 valueize_expr (tree expr)
2055 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
2057 case tcc_unary:
2058 if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
2059 && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
2060 TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
2061 break;
2062 case tcc_binary:
2063 if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
2064 && SSA_VAL (TREE_OPERAND (expr, 0)) != VN_TOP)
2065 TREE_OPERAND (expr, 0) = SSA_VAL (TREE_OPERAND (expr, 0));
2066 if (TREE_CODE (TREE_OPERAND (expr, 1)) == SSA_NAME
2067 && SSA_VAL (TREE_OPERAND (expr, 1)) != VN_TOP)
2068 TREE_OPERAND (expr, 1) = SSA_VAL (TREE_OPERAND (expr, 1));
2069 break;
2070 default:
2071 break;
2073 return expr;
2076 /* Simplify the binary expression RHS, and return the result if
2077 simplified. */
2079 static tree
2080 simplify_binary_expression (gimple stmt)
2082 tree result = NULL_TREE;
2083 tree op0 = gimple_assign_rhs1 (stmt);
2084 tree op1 = gimple_assign_rhs2 (stmt);
2086 /* This will not catch every single case we could combine, but will
2087 catch those with constants. The goal here is to simultaneously
2088 combine constants between expressions, but avoid infinite
2089 expansion of expressions during simplification. */
2090 if (TREE_CODE (op0) == SSA_NAME)
2092 if (VN_INFO (op0)->has_constants
2093 || TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
2094 op0 = valueize_expr (vn_get_expr_for (op0));
2095 else if (SSA_VAL (op0) != VN_TOP && SSA_VAL (op0) != op0)
2096 op0 = SSA_VAL (op0);
2099 if (TREE_CODE (op1) == SSA_NAME)
2101 if (VN_INFO (op1)->has_constants)
2102 op1 = valueize_expr (vn_get_expr_for (op1));
2103 else if (SSA_VAL (op1) != VN_TOP && SSA_VAL (op1) != op1)
2104 op1 = SSA_VAL (op1);
2107 /* Avoid folding if nothing changed. */
2108 if (op0 == gimple_assign_rhs1 (stmt)
2109 && op1 == gimple_assign_rhs2 (stmt))
2110 return NULL_TREE;
2112 fold_defer_overflow_warnings ();
2114 result = fold_binary (gimple_assign_rhs_code (stmt),
2115 TREE_TYPE (gimple_get_lhs (stmt)), op0, op1);
2117 fold_undefer_overflow_warnings (result && valid_gimple_rhs_p (result),
2118 stmt, 0);
2120 /* Make sure result is not a complex expression consisting
2121 of operators of operators (IE (a + b) + (a + c))
2122 Otherwise, we will end up with unbounded expressions if
2123 fold does anything at all. */
2124 if (result && valid_gimple_rhs_p (result))
2125 return result;
2127 return NULL_TREE;
2130 /* Simplify the unary expression RHS, and return the result if
2131 simplified. */
2133 static tree
2134 simplify_unary_expression (gimple stmt)
2136 tree result = NULL_TREE;
2137 tree orig_op0, op0 = gimple_assign_rhs1 (stmt);
2139 /* We handle some tcc_reference codes here that are all
2140 GIMPLE_ASSIGN_SINGLE codes. */
2141 if (gimple_assign_rhs_code (stmt) == REALPART_EXPR
2142 || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
2143 || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR)
2144 op0 = TREE_OPERAND (op0, 0);
2146 if (TREE_CODE (op0) != SSA_NAME)
2147 return NULL_TREE;
2149 orig_op0 = op0;
2150 if (VN_INFO (op0)->has_constants)
2151 op0 = valueize_expr (vn_get_expr_for (op0));
2152 else if (gimple_assign_cast_p (stmt)
2153 || gimple_assign_rhs_code (stmt) == REALPART_EXPR
2154 || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
2155 || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR)
2157 /* We want to do tree-combining on conversion-like expressions.
2158 Make sure we feed only SSA_NAMEs or constants to fold though. */
2159 tree tem = valueize_expr (vn_get_expr_for (op0));
2160 if (UNARY_CLASS_P (tem)
2161 || BINARY_CLASS_P (tem)
2162 || TREE_CODE (tem) == VIEW_CONVERT_EXPR
2163 || TREE_CODE (tem) == SSA_NAME
2164 || is_gimple_min_invariant (tem))
2165 op0 = tem;
2168 /* Avoid folding if nothing changed, but remember the expression. */
2169 if (op0 == orig_op0)
2170 return NULL_TREE;
2172 result = fold_unary (gimple_assign_rhs_code (stmt),
2173 gimple_expr_type (stmt), op0);
2174 if (result)
2176 STRIP_USELESS_TYPE_CONVERSION (result);
2177 if (valid_gimple_rhs_p (result))
2178 return result;
2181 return NULL_TREE;
2184 /* Try to simplify RHS using equivalences and constant folding. */
2186 static tree
2187 try_to_simplify (gimple stmt)
2189 tree tem;
2191 /* For stores we can end up simplifying a SSA_NAME rhs. Just return
2192 in this case, there is no point in doing extra work. */
2193 if (gimple_assign_copy_p (stmt)
2194 && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
2195 return NULL_TREE;
2197 switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
2199 case tcc_declaration:
2200 tem = get_symbol_constant_value (gimple_assign_rhs1 (stmt));
2201 if (tem)
2202 return tem;
2203 break;
2205 case tcc_reference:
2206 /* Do not do full-blown reference lookup here, but simplify
2207 reads from constant aggregates. */
2208 tem = fold_const_aggregate_ref (gimple_assign_rhs1 (stmt));
2209 if (tem)
2210 return tem;
2212 /* Fallthrough for some codes that can operate on registers. */
2213 if (!(TREE_CODE (gimple_assign_rhs1 (stmt)) == REALPART_EXPR
2214 || TREE_CODE (gimple_assign_rhs1 (stmt)) == IMAGPART_EXPR
2215 || TREE_CODE (gimple_assign_rhs1 (stmt)) == VIEW_CONVERT_EXPR))
2216 break;
2217 /* We could do a little more with unary ops, if they expand
2218 into binary ops, but it's debatable whether it is worth it. */
2219 case tcc_unary:
2220 return simplify_unary_expression (stmt);
2221 break;
2222 case tcc_comparison:
2223 case tcc_binary:
2224 return simplify_binary_expression (stmt);
2225 break;
2226 default:
2227 break;
2230 return NULL_TREE;
2233 /* Visit and value number USE, return true if the value number
2234 changed. */
2236 static bool
2237 visit_use (tree use)
2239 bool changed = false;
2240 gimple stmt = SSA_NAME_DEF_STMT (use);
2242 VN_INFO (use)->use_processed = true;
2244 gcc_assert (!SSA_NAME_IN_FREE_LIST (use));
2245 if (dump_file && (dump_flags & TDF_DETAILS)
2246 && !SSA_NAME_IS_DEFAULT_DEF (use))
2248 fprintf (dump_file, "Value numbering ");
2249 print_generic_expr (dump_file, use, 0);
2250 fprintf (dump_file, " stmt = ");
2251 print_gimple_stmt (dump_file, stmt, 0, 0);
2254 /* Handle uninitialized uses. */
2255 if (SSA_NAME_IS_DEFAULT_DEF (use))
2256 changed = set_ssa_val_to (use, use);
2257 else
2259 if (gimple_code (stmt) == GIMPLE_PHI)
2260 changed = visit_phi (stmt);
2261 else if (!gimple_has_lhs (stmt)
2262 || gimple_has_volatile_ops (stmt)
2263 || stmt_could_throw_p (stmt))
2264 changed = defs_to_varying (stmt);
2265 else if (is_gimple_assign (stmt))
2267 tree lhs = gimple_assign_lhs (stmt);
2268 tree simplified;
2270 /* Shortcut for copies. Simplifying copies is pointless,
2271 since we copy the expression and value they represent. */
2272 if (gimple_assign_copy_p (stmt)
2273 && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2274 && TREE_CODE (lhs) == SSA_NAME)
2276 changed = visit_copy (lhs, gimple_assign_rhs1 (stmt));
2277 goto done;
2279 simplified = try_to_simplify (stmt);
2280 if (simplified)
2282 if (dump_file && (dump_flags & TDF_DETAILS))
2284 fprintf (dump_file, "RHS ");
2285 print_gimple_expr (dump_file, stmt, 0, 0);
2286 fprintf (dump_file, " simplified to ");
2287 print_generic_expr (dump_file, simplified, 0);
2288 if (TREE_CODE (lhs) == SSA_NAME)
2289 fprintf (dump_file, " has constants %d\n",
2290 expr_has_constants (simplified));
2291 else
2292 fprintf (dump_file, "\n");
2295 /* Setting value numbers to constants will occasionally
2296 screw up phi congruence because constants are not
2297 uniquely associated with a single ssa name that can be
2298 looked up. */
2299 if (simplified
2300 && is_gimple_min_invariant (simplified)
2301 && TREE_CODE (lhs) == SSA_NAME)
2303 VN_INFO (lhs)->expr = simplified;
2304 VN_INFO (lhs)->has_constants = true;
2305 changed = set_ssa_val_to (lhs, simplified);
2306 goto done;
2308 else if (simplified
2309 && TREE_CODE (simplified) == SSA_NAME
2310 && TREE_CODE (lhs) == SSA_NAME)
2312 changed = visit_copy (lhs, simplified);
2313 goto done;
2315 else if (simplified)
2317 if (TREE_CODE (lhs) == SSA_NAME)
2319 VN_INFO (lhs)->has_constants = expr_has_constants (simplified);
2320 /* We have to unshare the expression or else
2321 valuizing may change the IL stream. */
2322 VN_INFO (lhs)->expr = unshare_expr (simplified);
2325 else if (stmt_has_constants (stmt)
2326 && TREE_CODE (lhs) == SSA_NAME)
2327 VN_INFO (lhs)->has_constants = true;
2328 else if (TREE_CODE (lhs) == SSA_NAME)
2330 /* We reset expr and constantness here because we may
2331 have been value numbering optimistically, and
2332 iterating. They may become non-constant in this case,
2333 even if they were optimistically constant. */
2335 VN_INFO (lhs)->has_constants = false;
2336 VN_INFO (lhs)->expr = NULL_TREE;
2339 if (TREE_CODE (lhs) == SSA_NAME
2340 /* We can substitute SSA_NAMEs that are live over
2341 abnormal edges with their constant value. */
2342 && !(gimple_assign_copy_p (stmt)
2343 && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2344 && !(simplified
2345 && is_gimple_min_invariant (simplified))
2346 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
2347 changed = defs_to_varying (stmt);
2348 else if (REFERENCE_CLASS_P (lhs) || DECL_P (lhs))
2350 changed = visit_reference_op_store (lhs, gimple_assign_rhs1 (stmt), stmt);
2352 else if (TREE_CODE (lhs) == SSA_NAME)
2354 if ((gimple_assign_copy_p (stmt)
2355 && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2356 || (simplified
2357 && is_gimple_min_invariant (simplified)))
2359 VN_INFO (lhs)->has_constants = true;
2360 if (simplified)
2361 changed = set_ssa_val_to (lhs, simplified);
2362 else
2363 changed = set_ssa_val_to (lhs, gimple_assign_rhs1 (stmt));
2365 else
2367 switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
2369 case GIMPLE_UNARY_RHS:
2370 changed = visit_unary_op (lhs, stmt);
2371 break;
2372 case GIMPLE_BINARY_RHS:
2373 changed = visit_binary_op (lhs, stmt);
2374 break;
2375 case GIMPLE_SINGLE_RHS:
2376 switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
2378 case tcc_declaration:
2379 case tcc_reference:
2380 changed = visit_reference_op_load
2381 (lhs, gimple_assign_rhs1 (stmt), stmt);
2382 break;
2383 case tcc_expression:
2384 if (gimple_assign_rhs_code (stmt) == ADDR_EXPR)
2386 changed = visit_unary_op (lhs, stmt);
2387 break;
2389 /* Fallthrough. */
2390 default:
2391 changed = defs_to_varying (stmt);
2393 break;
2394 default:
2395 changed = defs_to_varying (stmt);
2396 break;
2400 else
2401 changed = defs_to_varying (stmt);
2403 else if (is_gimple_call (stmt))
2405 tree lhs = gimple_call_lhs (stmt);
2407 /* ??? We could try to simplify calls. */
2409 if (stmt_has_constants (stmt)
2410 && TREE_CODE (lhs) == SSA_NAME)
2411 VN_INFO (lhs)->has_constants = true;
2412 else if (TREE_CODE (lhs) == SSA_NAME)
2414 /* We reset expr and constantness here because we may
2415 have been value numbering optimistically, and
2416 iterating. They may become non-constant in this case,
2417 even if they were optimistically constant. */
2418 VN_INFO (lhs)->has_constants = false;
2419 VN_INFO (lhs)->expr = NULL_TREE;
2422 if (TREE_CODE (lhs) == SSA_NAME
2423 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
2424 changed = defs_to_varying (stmt);
2425 /* ??? We should handle stores from calls. */
2426 else if (TREE_CODE (lhs) == SSA_NAME)
2428 if (gimple_call_flags (stmt) & (ECF_PURE | ECF_CONST))
2429 changed = visit_reference_op_call (lhs, stmt);
2430 else
2431 changed = defs_to_varying (stmt);
2433 else
2434 changed = defs_to_varying (stmt);
2437 done:
2438 return changed;
2441 /* Compare two operands by reverse postorder index */
2443 static int
2444 compare_ops (const void *pa, const void *pb)
2446 const tree opa = *((const tree *)pa);
2447 const tree opb = *((const tree *)pb);
2448 gimple opstmta = SSA_NAME_DEF_STMT (opa);
2449 gimple opstmtb = SSA_NAME_DEF_STMT (opb);
2450 basic_block bba;
2451 basic_block bbb;
2453 if (gimple_nop_p (opstmta) && gimple_nop_p (opstmtb))
2454 return 0;
2455 else if (gimple_nop_p (opstmta))
2456 return -1;
2457 else if (gimple_nop_p (opstmtb))
2458 return 1;
2460 bba = gimple_bb (opstmta);
2461 bbb = gimple_bb (opstmtb);
2463 if (!bba && !bbb)
2464 return 0;
2465 else if (!bba)
2466 return -1;
2467 else if (!bbb)
2468 return 1;
2470 if (bba == bbb)
2472 if (gimple_code (opstmta) == GIMPLE_PHI
2473 && gimple_code (opstmtb) == GIMPLE_PHI)
2474 return 0;
2475 else if (gimple_code (opstmta) == GIMPLE_PHI)
2476 return -1;
2477 else if (gimple_code (opstmtb) == GIMPLE_PHI)
2478 return 1;
2479 return gimple_uid (opstmta) - gimple_uid (opstmtb);
2481 return rpo_numbers[bba->index] - rpo_numbers[bbb->index];
2484 /* Sort an array containing members of a strongly connected component
2485 SCC so that the members are ordered by RPO number.
2486 This means that when the sort is complete, iterating through the
2487 array will give you the members in RPO order. */
2489 static void
2490 sort_scc (VEC (tree, heap) *scc)
2492 qsort (VEC_address (tree, scc),
2493 VEC_length (tree, scc),
2494 sizeof (tree),
2495 compare_ops);
2498 /* Process a strongly connected component in the SSA graph. */
2500 static void
2501 process_scc (VEC (tree, heap) *scc)
2503 /* If the SCC has a single member, just visit it. */
2505 if (VEC_length (tree, scc) == 1)
2507 tree use = VEC_index (tree, scc, 0);
2508 if (!VN_INFO (use)->use_processed)
2509 visit_use (use);
2511 else
2513 tree var;
2514 unsigned int i;
2515 unsigned int iterations = 0;
2516 bool changed = true;
2518 /* Iterate over the SCC with the optimistic table until it stops
2519 changing. */
2520 current_info = optimistic_info;
2521 while (changed)
2523 changed = false;
2524 iterations++;
2525 /* As we are value-numbering optimistically we have to
2526 clear the expression tables and the simplified expressions
2527 in each iteration until we converge. */
2528 htab_empty (optimistic_info->nary);
2529 htab_empty (optimistic_info->phis);
2530 htab_empty (optimistic_info->references);
2531 obstack_free (&optimistic_info->nary_obstack, NULL);
2532 gcc_obstack_init (&optimistic_info->nary_obstack);
2533 empty_alloc_pool (optimistic_info->phis_pool);
2534 empty_alloc_pool (optimistic_info->references_pool);
2535 for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2536 VN_INFO (var)->expr = NULL_TREE;
2537 for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2538 changed |= visit_use (var);
2541 statistics_histogram_event (cfun, "SCC iterations", iterations);
2543 /* Finally, visit the SCC once using the valid table. */
2544 current_info = valid_info;
2545 for (i = 0; VEC_iterate (tree, scc, i, var); i++)
2546 visit_use (var);
2550 DEF_VEC_O(ssa_op_iter);
2551 DEF_VEC_ALLOC_O(ssa_op_iter,heap);
2553 /* Pop the components of the found SCC for NAME off the SCC stack
2554 and process them. Returns true if all went well, false if
2555 we run into resource limits. */
2557 static bool
2558 extract_and_process_scc_for_name (tree name)
2560 VEC (tree, heap) *scc = NULL;
2561 tree x;
2563 /* Found an SCC, pop the components off the SCC stack and
2564 process them. */
2567 x = VEC_pop (tree, sccstack);
2569 VN_INFO (x)->on_sccstack = false;
2570 VEC_safe_push (tree, heap, scc, x);
2571 } while (x != name);
2573 /* Bail out of SCCVN in case a SCC turns out to be incredibly large. */
2574 if (VEC_length (tree, scc)
2575 > (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE))
2577 if (dump_file)
2578 fprintf (dump_file, "WARNING: Giving up with SCCVN due to "
2579 "SCC size %u exceeding %u\n", VEC_length (tree, scc),
2580 (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE));
2581 return false;
2584 if (VEC_length (tree, scc) > 1)
2585 sort_scc (scc);
2587 if (dump_file && (dump_flags & TDF_DETAILS))
2588 print_scc (dump_file, scc);
2590 process_scc (scc);
2592 VEC_free (tree, heap, scc);
2594 return true;
2597 /* Depth first search on NAME to discover and process SCC's in the SSA
2598 graph.
2599 Execution of this algorithm relies on the fact that the SCC's are
2600 popped off the stack in topological order.
2601 Returns true if successful, false if we stopped processing SCC's due
2602 to resource constraints. */
2604 static bool
2605 DFS (tree name)
2607 VEC(ssa_op_iter, heap) *itervec = NULL;
2608 VEC(tree, heap) *namevec = NULL;
2609 use_operand_p usep = NULL;
2610 gimple defstmt;
2611 tree use;
2612 ssa_op_iter iter;
2614 start_over:
2615 /* SCC info */
2616 VN_INFO (name)->dfsnum = next_dfs_num++;
2617 VN_INFO (name)->visited = true;
2618 VN_INFO (name)->low = VN_INFO (name)->dfsnum;
2620 VEC_safe_push (tree, heap, sccstack, name);
2621 VN_INFO (name)->on_sccstack = true;
2622 defstmt = SSA_NAME_DEF_STMT (name);
2624 /* Recursively DFS on our operands, looking for SCC's. */
2625 if (!gimple_nop_p (defstmt))
2627 /* Push a new iterator. */
2628 if (gimple_code (defstmt) == GIMPLE_PHI)
2629 usep = op_iter_init_phiuse (&iter, defstmt, SSA_OP_ALL_USES);
2630 else
2631 usep = op_iter_init_use (&iter, defstmt, SSA_OP_ALL_USES);
2633 else
2634 iter.done = true;
2636 while (1)
2638 /* If we are done processing uses of a name, go up the stack
2639 of iterators and process SCCs as we found them. */
2640 if (op_iter_done (&iter))
2642 /* See if we found an SCC. */
2643 if (VN_INFO (name)->low == VN_INFO (name)->dfsnum)
2644 if (!extract_and_process_scc_for_name (name))
2646 VEC_free (tree, heap, namevec);
2647 VEC_free (ssa_op_iter, heap, itervec);
2648 return false;
2651 /* Check if we are done. */
2652 if (VEC_empty (tree, namevec))
2654 VEC_free (tree, heap, namevec);
2655 VEC_free (ssa_op_iter, heap, itervec);
2656 return true;
2659 /* Restore the last use walker and continue walking there. */
2660 use = name;
2661 name = VEC_pop (tree, namevec);
2662 memcpy (&iter, VEC_last (ssa_op_iter, itervec),
2663 sizeof (ssa_op_iter));
2664 VEC_pop (ssa_op_iter, itervec);
2665 goto continue_walking;
2668 use = USE_FROM_PTR (usep);
2670 /* Since we handle phi nodes, we will sometimes get
2671 invariants in the use expression. */
2672 if (TREE_CODE (use) == SSA_NAME)
2674 if (! (VN_INFO (use)->visited))
2676 /* Recurse by pushing the current use walking state on
2677 the stack and starting over. */
2678 VEC_safe_push(ssa_op_iter, heap, itervec, &iter);
2679 VEC_safe_push(tree, heap, namevec, name);
2680 name = use;
2681 goto start_over;
2683 continue_walking:
2684 VN_INFO (name)->low = MIN (VN_INFO (name)->low,
2685 VN_INFO (use)->low);
2687 if (VN_INFO (use)->dfsnum < VN_INFO (name)->dfsnum
2688 && VN_INFO (use)->on_sccstack)
2690 VN_INFO (name)->low = MIN (VN_INFO (use)->dfsnum,
2691 VN_INFO (name)->low);
2695 usep = op_iter_next_use (&iter);
2699 /* Allocate a value number table. */
2701 static void
2702 allocate_vn_table (vn_tables_t table)
2704 table->phis = htab_create (23, vn_phi_hash, vn_phi_eq, free_phi);
2705 table->nary = htab_create (23, vn_nary_op_hash, vn_nary_op_eq, NULL);
2706 table->references = htab_create (23, vn_reference_hash, vn_reference_eq,
2707 free_reference);
2709 gcc_obstack_init (&table->nary_obstack);
2710 table->phis_pool = create_alloc_pool ("VN phis",
2711 sizeof (struct vn_phi_s),
2712 30);
2713 table->references_pool = create_alloc_pool ("VN references",
2714 sizeof (struct vn_reference_s),
2715 30);
2718 /* Free a value number table. */
2720 static void
2721 free_vn_table (vn_tables_t table)
2723 htab_delete (table->phis);
2724 htab_delete (table->nary);
2725 htab_delete (table->references);
2726 obstack_free (&table->nary_obstack, NULL);
2727 free_alloc_pool (table->phis_pool);
2728 free_alloc_pool (table->references_pool);
2731 static void
2732 init_scc_vn (void)
2734 size_t i;
2735 int j;
2736 int *rpo_numbers_temp;
2738 calculate_dominance_info (CDI_DOMINATORS);
2739 sccstack = NULL;
2740 constant_to_value_id = htab_create (23, vn_constant_hash, vn_constant_eq,
2741 free);
2743 constant_value_ids = BITMAP_ALLOC (NULL);
2745 next_dfs_num = 1;
2746 next_value_id = 1;
2748 vn_ssa_aux_table = VEC_alloc (vn_ssa_aux_t, heap, num_ssa_names + 1);
2749 /* VEC_alloc doesn't actually grow it to the right size, it just
2750 preallocates the space to do so. */
2751 VEC_safe_grow_cleared (vn_ssa_aux_t, heap, vn_ssa_aux_table, num_ssa_names + 1);
2752 gcc_obstack_init (&vn_ssa_aux_obstack);
2754 shared_lookup_phiargs = NULL;
2755 shared_lookup_vops = NULL;
2756 shared_lookup_references = NULL;
2757 rpo_numbers = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
2758 rpo_numbers_temp = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
2759 pre_and_rev_post_order_compute (NULL, rpo_numbers_temp, false);
2761 /* RPO numbers is an array of rpo ordering, rpo[i] = bb means that
2762 the i'th block in RPO order is bb. We want to map bb's to RPO
2763 numbers, so we need to rearrange this array. */
2764 for (j = 0; j < n_basic_blocks - NUM_FIXED_BLOCKS; j++)
2765 rpo_numbers[rpo_numbers_temp[j]] = j;
2767 XDELETE (rpo_numbers_temp);
2769 VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
2771 /* Create the VN_INFO structures, and initialize value numbers to
2772 TOP. */
2773 for (i = 0; i < num_ssa_names; i++)
2775 tree name = ssa_name (i);
2776 if (name)
2778 VN_INFO_GET (name)->valnum = VN_TOP;
2779 VN_INFO (name)->expr = NULL_TREE;
2780 VN_INFO (name)->value_id = 0;
2784 renumber_gimple_stmt_uids ();
2786 /* Create the valid and optimistic value numbering tables. */
2787 valid_info = XCNEW (struct vn_tables_s);
2788 allocate_vn_table (valid_info);
2789 optimistic_info = XCNEW (struct vn_tables_s);
2790 allocate_vn_table (optimistic_info);
2793 void
2794 free_scc_vn (void)
2796 size_t i;
2798 htab_delete (constant_to_value_id);
2799 BITMAP_FREE (constant_value_ids);
2800 VEC_free (tree, heap, shared_lookup_phiargs);
2801 VEC_free (tree, gc, shared_lookup_vops);
2802 VEC_free (vn_reference_op_s, heap, shared_lookup_references);
2803 XDELETEVEC (rpo_numbers);
2805 for (i = 0; i < num_ssa_names; i++)
2807 tree name = ssa_name (i);
2808 if (name
2809 && VN_INFO (name)->needs_insertion)
2810 release_ssa_name (name);
2812 obstack_free (&vn_ssa_aux_obstack, NULL);
2813 VEC_free (vn_ssa_aux_t, heap, vn_ssa_aux_table);
2815 VEC_free (tree, heap, sccstack);
2816 free_vn_table (valid_info);
2817 XDELETE (valid_info);
2818 free_vn_table (optimistic_info);
2819 XDELETE (optimistic_info);
2822 /* Set the value ids in the valid hash tables. */
2824 static void
2825 set_hashtable_value_ids (void)
2827 htab_iterator hi;
2828 vn_nary_op_t vno;
2829 vn_reference_t vr;
2830 vn_phi_t vp;
2832 /* Now set the value ids of the things we had put in the hash
2833 table. */
2835 FOR_EACH_HTAB_ELEMENT (valid_info->nary,
2836 vno, vn_nary_op_t, hi)
2838 if (vno->result)
2840 if (TREE_CODE (vno->result) == SSA_NAME)
2841 vno->value_id = VN_INFO (vno->result)->value_id;
2842 else if (is_gimple_min_invariant (vno->result))
2843 vno->value_id = get_or_alloc_constant_value_id (vno->result);
2847 FOR_EACH_HTAB_ELEMENT (valid_info->phis,
2848 vp, vn_phi_t, hi)
2850 if (vp->result)
2852 if (TREE_CODE (vp->result) == SSA_NAME)
2853 vp->value_id = VN_INFO (vp->result)->value_id;
2854 else if (is_gimple_min_invariant (vp->result))
2855 vp->value_id = get_or_alloc_constant_value_id (vp->result);
2859 FOR_EACH_HTAB_ELEMENT (valid_info->references,
2860 vr, vn_reference_t, hi)
2862 if (vr->result)
2864 if (TREE_CODE (vr->result) == SSA_NAME)
2865 vr->value_id = VN_INFO (vr->result)->value_id;
2866 else if (is_gimple_min_invariant (vr->result))
2867 vr->value_id = get_or_alloc_constant_value_id (vr->result);
2872 /* Do SCCVN. Returns true if it finished, false if we bailed out
2873 due to resource constraints. */
2875 bool
2876 run_scc_vn (bool may_insert_arg)
2878 size_t i;
2879 tree param;
2880 bool changed = true;
2882 may_insert = may_insert_arg;
2884 init_scc_vn ();
2885 current_info = valid_info;
2887 for (param = DECL_ARGUMENTS (current_function_decl);
2888 param;
2889 param = TREE_CHAIN (param))
2891 if (gimple_default_def (cfun, param) != NULL)
2893 tree def = gimple_default_def (cfun, param);
2894 SSA_VAL (def) = def;
2898 for (i = 1; i < num_ssa_names; ++i)
2900 tree name = ssa_name (i);
2901 if (name
2902 && VN_INFO (name)->visited == false
2903 && !has_zero_uses (name))
2904 if (!DFS (name))
2906 free_scc_vn ();
2907 may_insert = false;
2908 return false;
2912 /* Initialize the value ids. */
2914 for (i = 1; i < num_ssa_names; ++i)
2916 tree name = ssa_name (i);
2917 vn_ssa_aux_t info;
2918 if (!name)
2919 continue;
2920 info = VN_INFO (name);
2921 if (info->valnum == name)
2922 info->value_id = get_next_value_id ();
2923 else if (is_gimple_min_invariant (info->valnum))
2924 info->value_id = get_or_alloc_constant_value_id (info->valnum);
2927 /* Propagate until they stop changing. */
2928 while (changed)
2930 changed = false;
2931 for (i = 1; i < num_ssa_names; ++i)
2933 tree name = ssa_name (i);
2934 vn_ssa_aux_t info;
2935 if (!name)
2936 continue;
2937 info = VN_INFO (name);
2938 if (TREE_CODE (info->valnum) == SSA_NAME
2939 && info->valnum != name
2940 && info->value_id != VN_INFO (info->valnum)->value_id)
2942 changed = true;
2943 info->value_id = VN_INFO (info->valnum)->value_id;
2948 set_hashtable_value_ids ();
2950 if (dump_file && (dump_flags & TDF_DETAILS))
2952 fprintf (dump_file, "Value numbers:\n");
2953 for (i = 0; i < num_ssa_names; i++)
2955 tree name = ssa_name (i);
2956 if (name
2957 && VN_INFO (name)->visited
2958 && SSA_VAL (name) != name)
2960 print_generic_expr (dump_file, name, 0);
2961 fprintf (dump_file, " = ");
2962 print_generic_expr (dump_file, SSA_VAL (name), 0);
2963 fprintf (dump_file, "\n");
2968 may_insert = false;
2969 return true;
2972 /* Return the maximum value id we have ever seen. */
2974 unsigned int
2975 get_max_value_id (void)
2977 return next_value_id;
2980 /* Return the next unique value id. */
2982 unsigned int
2983 get_next_value_id (void)
2985 return next_value_id++;
2989 /* Compare two expressions E1 and E2 and return true if they are equal. */
2991 bool
2992 expressions_equal_p (tree e1, tree e2)
2994 /* The obvious case. */
2995 if (e1 == e2)
2996 return true;
2998 /* If only one of them is null, they cannot be equal. */
2999 if (!e1 || !e2)
3000 return false;
3002 /* Recurse on elements of lists. */
3003 if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST)
3005 tree lop1 = e1;
3006 tree lop2 = e2;
3007 for (lop1 = e1, lop2 = e2;
3008 lop1 || lop2;
3009 lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2))
3011 if (!lop1 || !lop2)
3012 return false;
3013 if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2)))
3014 return false;
3016 return true;
3019 /* Now perform the actual comparison. */
3020 if (TREE_CODE (e1) == TREE_CODE (e2)
3021 && operand_equal_p (e1, e2, OEP_PURE_SAME))
3022 return true;
3024 return false;
3027 /* Sort the VUSE array so that we can do equality comparisons
3028 quicker on two vuse vecs. */
3030 void
3031 sort_vuses (VEC (tree,gc) *vuses)
3033 if (VEC_length (tree, vuses) > 1)
3034 qsort (VEC_address (tree, vuses),
3035 VEC_length (tree, vuses),
3036 sizeof (tree),
3037 operand_build_cmp);
3040 /* Sort the VUSE array so that we can do equality comparisons
3041 quicker on two vuse vecs. */
3043 void
3044 sort_vuses_heap (VEC (tree,heap) *vuses)
3046 if (VEC_length (tree, vuses) > 1)
3047 qsort (VEC_address (tree, vuses),
3048 VEC_length (tree, vuses),
3049 sizeof (tree),
3050 operand_build_cmp);