gcc/ChangeLog:
[official-gcc.git] / gcc / tree-ssa-sccvn.c
blob700aa1fadc5954fa95526e07970c1eae603dd2a8
1 /* SCC value numbering for trees
2 Copyright (C) 2006-2018 Free Software Foundation, Inc.
3 Contributed by Daniel Berlin <dan@dberlin.org>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "ssa.h"
29 #include "expmed.h"
30 #include "insn-config.h"
31 #include "memmodel.h"
32 #include "emit-rtl.h"
33 #include "cgraph.h"
34 #include "gimple-pretty-print.h"
35 #include "alias.h"
36 #include "fold-const.h"
37 #include "stor-layout.h"
38 #include "cfganal.h"
39 #include "tree-inline.h"
40 #include "internal-fn.h"
41 #include "gimple-fold.h"
42 #include "tree-eh.h"
43 #include "gimplify.h"
44 #include "flags.h"
45 #include "dojump.h"
46 #include "explow.h"
47 #include "calls.h"
48 #include "varasm.h"
49 #include "stmt.h"
50 #include "expr.h"
51 #include "tree-dfa.h"
52 #include "tree-ssa.h"
53 #include "dumpfile.h"
54 #include "cfgloop.h"
55 #include "params.h"
56 #include "tree-ssa-propagate.h"
57 #include "tree-cfg.h"
58 #include "domwalk.h"
59 #include "gimple-iterator.h"
60 #include "gimple-match.h"
61 #include "stringpool.h"
62 #include "attribs.h"
63 #include "tree-pass.h"
64 #include "statistics.h"
65 #include "langhooks.h"
66 #include "ipa-utils.h"
67 #include "dbgcnt.h"
68 #include "tree-cfgcleanup.h"
69 #include "tree-ssa-loop.h"
70 #include "tree-scalar-evolution.h"
71 #include "tree-ssa-loop-niter.h"
72 #include "tree-ssa-sccvn.h"
74 /* This algorithm is based on the SCC algorithm presented by Keith
75 Cooper and L. Taylor Simpson in "SCC-Based Value numbering"
76 (http://citeseer.ist.psu.edu/41805.html). In
77 straight line code, it is equivalent to a regular hash based value
78 numbering that is performed in reverse postorder.
80 For code with cycles, there are two alternatives, both of which
81 require keeping the hashtables separate from the actual list of
82 value numbers for SSA names.
84 1. Iterate value numbering in an RPO walk of the blocks, removing
85 all the entries from the hashtable after each iteration (but
86 keeping the SSA name->value number mapping between iterations).
87 Iterate until it does not change.
89 2. Perform value numbering as part of an SCC walk on the SSA graph,
90 iterating only the cycles in the SSA graph until they do not change
91 (using a separate, optimistic hashtable for value numbering the SCC
92 operands).
94 The second is not just faster in practice (because most SSA graph
95 cycles do not involve all the variables in the graph), it also has
96 some nice properties.
98 One of these nice properties is that when we pop an SCC off the
99 stack, we are guaranteed to have processed all the operands coming from
100 *outside of that SCC*, so we do not need to do anything special to
101 ensure they have value numbers.
103 Another nice property is that the SCC walk is done as part of a DFS
104 of the SSA graph, which makes it easy to perform combining and
105 simplifying operations at the same time.
107 The code below is deliberately written in a way that makes it easy
108 to separate the SCC walk from the other work it does.
110 In order to propagate constants through the code, we track which
111 expressions contain constants, and use those while folding. In
112 theory, we could also track expressions whose value numbers are
113 replaced, in case we end up folding based on expression
114 identities.
116 In order to value number memory, we assign value numbers to vuses.
117 This enables us to note that, for example, stores to the same
118 address of the same value from the same starting memory states are
119 equivalent.
120 TODO:
122 1. We can iterate only the changing portions of the SCC's, but
123 I have not seen an SCC big enough for this to be a win.
124 2. If you differentiate between phi nodes for loops and phi nodes
125 for if-then-else, you can properly consider phi nodes in different
126 blocks for equivalence.
127 3. We could value number vuses in more cases, particularly, whole
128 structure copies.
131 /* There's no BB_EXECUTABLE but we can use BB_VISITED. */
132 #define BB_EXECUTABLE BB_VISITED
134 static tree *last_vuse_ptr;
135 static vn_lookup_kind vn_walk_kind;
136 static vn_lookup_kind default_vn_walk_kind;
138 /* vn_nary_op hashtable helpers. */
140 struct vn_nary_op_hasher : nofree_ptr_hash <vn_nary_op_s>
142 typedef vn_nary_op_s *compare_type;
143 static inline hashval_t hash (const vn_nary_op_s *);
144 static inline bool equal (const vn_nary_op_s *, const vn_nary_op_s *);
147 /* Return the computed hashcode for nary operation P1. */
149 inline hashval_t
150 vn_nary_op_hasher::hash (const vn_nary_op_s *vno1)
152 return vno1->hashcode;
155 /* Compare nary operations P1 and P2 and return true if they are
156 equivalent. */
158 inline bool
159 vn_nary_op_hasher::equal (const vn_nary_op_s *vno1, const vn_nary_op_s *vno2)
161 return vno1 == vno2 || vn_nary_op_eq (vno1, vno2);
164 typedef hash_table<vn_nary_op_hasher> vn_nary_op_table_type;
165 typedef vn_nary_op_table_type::iterator vn_nary_op_iterator_type;
168 /* vn_phi hashtable helpers. */
170 static int
171 vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2);
173 struct vn_phi_hasher : nofree_ptr_hash <vn_phi_s>
175 static inline hashval_t hash (const vn_phi_s *);
176 static inline bool equal (const vn_phi_s *, const vn_phi_s *);
179 /* Return the computed hashcode for phi operation P1. */
181 inline hashval_t
182 vn_phi_hasher::hash (const vn_phi_s *vp1)
184 return vp1->hashcode;
187 /* Compare two phi entries for equality, ignoring VN_TOP arguments. */
189 inline bool
190 vn_phi_hasher::equal (const vn_phi_s *vp1, const vn_phi_s *vp2)
192 return vp1 == vp2 || vn_phi_eq (vp1, vp2);
195 typedef hash_table<vn_phi_hasher> vn_phi_table_type;
196 typedef vn_phi_table_type::iterator vn_phi_iterator_type;
199 /* Compare two reference operands P1 and P2 for equality. Return true if
200 they are equal, and false otherwise. */
202 static int
203 vn_reference_op_eq (const void *p1, const void *p2)
205 const_vn_reference_op_t const vro1 = (const_vn_reference_op_t) p1;
206 const_vn_reference_op_t const vro2 = (const_vn_reference_op_t) p2;
208 return (vro1->opcode == vro2->opcode
209 /* We do not care for differences in type qualification. */
210 && (vro1->type == vro2->type
211 || (vro1->type && vro2->type
212 && types_compatible_p (TYPE_MAIN_VARIANT (vro1->type),
213 TYPE_MAIN_VARIANT (vro2->type))))
214 && expressions_equal_p (vro1->op0, vro2->op0)
215 && expressions_equal_p (vro1->op1, vro2->op1)
216 && expressions_equal_p (vro1->op2, vro2->op2));
219 /* Free a reference operation structure VP. */
221 static inline void
222 free_reference (vn_reference_s *vr)
224 vr->operands.release ();
228 /* vn_reference hashtable helpers. */
230 struct vn_reference_hasher : nofree_ptr_hash <vn_reference_s>
232 static inline hashval_t hash (const vn_reference_s *);
233 static inline bool equal (const vn_reference_s *, const vn_reference_s *);
236 /* Return the hashcode for a given reference operation P1. */
238 inline hashval_t
239 vn_reference_hasher::hash (const vn_reference_s *vr1)
241 return vr1->hashcode;
244 inline bool
245 vn_reference_hasher::equal (const vn_reference_s *v, const vn_reference_s *c)
247 return v == c || vn_reference_eq (v, c);
250 typedef hash_table<vn_reference_hasher> vn_reference_table_type;
251 typedef vn_reference_table_type::iterator vn_reference_iterator_type;
254 /* The set of VN hashtables. */
256 typedef struct vn_tables_s
258 vn_nary_op_table_type *nary;
259 vn_phi_table_type *phis;
260 vn_reference_table_type *references;
261 } *vn_tables_t;
264 /* vn_constant hashtable helpers. */
266 struct vn_constant_hasher : free_ptr_hash <vn_constant_s>
268 static inline hashval_t hash (const vn_constant_s *);
269 static inline bool equal (const vn_constant_s *, const vn_constant_s *);
272 /* Hash table hash function for vn_constant_t. */
274 inline hashval_t
275 vn_constant_hasher::hash (const vn_constant_s *vc1)
277 return vc1->hashcode;
280 /* Hash table equality function for vn_constant_t. */
282 inline bool
283 vn_constant_hasher::equal (const vn_constant_s *vc1, const vn_constant_s *vc2)
285 if (vc1->hashcode != vc2->hashcode)
286 return false;
288 return vn_constant_eq_with_type (vc1->constant, vc2->constant);
291 static hash_table<vn_constant_hasher> *constant_to_value_id;
292 static bitmap constant_value_ids;
295 /* Obstack we allocate the vn-tables elements from. */
296 static obstack vn_tables_obstack;
297 /* Special obstack we never unwind. */
298 static obstack vn_tables_insert_obstack;
300 static vn_reference_t last_inserted_ref;
301 static vn_phi_t last_inserted_phi;
302 static vn_nary_op_t last_inserted_nary;
304 /* Valid hashtables storing information we have proven to be
305 correct. */
306 static vn_tables_t valid_info;
309 /* Valueization hook. Valueize NAME if it is an SSA name, otherwise
310 just return it. */
311 tree (*vn_valueize) (tree);
314 /* This represents the top of the VN lattice, which is the universal
315 value. */
317 tree VN_TOP;
319 /* Unique counter for our value ids. */
321 static unsigned int next_value_id;
324 /* Table of vn_ssa_aux_t's, one per ssa_name. The vn_ssa_aux_t objects
325 are allocated on an obstack for locality reasons, and to free them
326 without looping over the vec. */
328 struct vn_ssa_aux_hasher : typed_noop_remove <vn_ssa_aux_t>
330 typedef vn_ssa_aux_t value_type;
331 typedef tree compare_type;
332 static inline hashval_t hash (const value_type &);
333 static inline bool equal (const value_type &, const compare_type &);
334 static inline void mark_deleted (value_type &) {}
335 static inline void mark_empty (value_type &e) { e = NULL; }
336 static inline bool is_deleted (value_type &) { return false; }
337 static inline bool is_empty (value_type &e) { return e == NULL; }
340 hashval_t
341 vn_ssa_aux_hasher::hash (const value_type &entry)
343 return SSA_NAME_VERSION (entry->name);
346 bool
347 vn_ssa_aux_hasher::equal (const value_type &entry, const compare_type &name)
349 return name == entry->name;
352 static hash_table<vn_ssa_aux_hasher> *vn_ssa_aux_hash;
353 typedef hash_table<vn_ssa_aux_hasher>::iterator vn_ssa_aux_iterator_type;
354 static struct obstack vn_ssa_aux_obstack;
356 static vn_nary_op_t vn_nary_op_insert_stmt (gimple *, tree);
357 static unsigned int vn_nary_length_from_stmt (gimple *);
358 static vn_nary_op_t alloc_vn_nary_op_noinit (unsigned int, obstack *);
359 static vn_nary_op_t vn_nary_op_insert_into (vn_nary_op_t,
360 vn_nary_op_table_type *, bool);
361 static void init_vn_nary_op_from_stmt (vn_nary_op_t, gimple *);
362 static void init_vn_nary_op_from_pieces (vn_nary_op_t, unsigned int,
363 enum tree_code, tree, tree *);
364 static tree vn_lookup_simplify_result (gimple_match_op *);
366 /* Return whether there is value numbering information for a given SSA name. */
368 bool
369 has_VN_INFO (tree name)
371 return vn_ssa_aux_hash->find_with_hash (name, SSA_NAME_VERSION (name));
374 vn_ssa_aux_t
375 VN_INFO (tree name)
377 vn_ssa_aux_t *res
378 = vn_ssa_aux_hash->find_slot_with_hash (name, SSA_NAME_VERSION (name),
379 INSERT);
380 if (*res != NULL)
381 return *res;
383 vn_ssa_aux_t newinfo = *res = XOBNEW (&vn_ssa_aux_obstack, struct vn_ssa_aux);
384 memset (newinfo, 0, sizeof (struct vn_ssa_aux));
385 newinfo->name = name;
386 newinfo->valnum = VN_TOP;
387 /* We are using the visited flag to handle uses with defs not within the
388 region being value-numbered. */
389 newinfo->visited = false;
391 /* Given we create the VN_INFOs on-demand now we have to do initialization
392 different than VN_TOP here. */
393 if (SSA_NAME_IS_DEFAULT_DEF (name))
394 switch (TREE_CODE (SSA_NAME_VAR (name)))
396 case VAR_DECL:
397 /* All undefined vars are VARYING. */
398 newinfo->valnum = name;
399 newinfo->visited = true;
400 break;
402 case PARM_DECL:
403 /* Parameters are VARYING but we can record a condition
404 if we know it is a non-NULL pointer. */
405 newinfo->visited = true;
406 newinfo->valnum = name;
407 if (POINTER_TYPE_P (TREE_TYPE (name))
408 && nonnull_arg_p (SSA_NAME_VAR (name)))
410 tree ops[2];
411 ops[0] = name;
412 ops[1] = build_int_cst (TREE_TYPE (name), 0);
413 vn_nary_op_t nary;
414 /* Allocate from non-unwinding stack. */
415 nary = alloc_vn_nary_op_noinit (2, &vn_tables_insert_obstack);
416 init_vn_nary_op_from_pieces (nary, 2, NE_EXPR,
417 boolean_type_node, ops);
418 nary->predicated_values = 0;
419 nary->u.result = boolean_true_node;
420 vn_nary_op_insert_into (nary, valid_info->nary, true);
421 gcc_assert (nary->unwind_to == NULL);
422 /* Also do not link it into the undo chain. */
423 last_inserted_nary = nary->next;
424 nary->next = (vn_nary_op_t)(void *)-1;
425 nary = alloc_vn_nary_op_noinit (2, &vn_tables_insert_obstack);
426 init_vn_nary_op_from_pieces (nary, 2, EQ_EXPR,
427 boolean_type_node, ops);
428 nary->predicated_values = 0;
429 nary->u.result = boolean_false_node;
430 vn_nary_op_insert_into (nary, valid_info->nary, true);
431 gcc_assert (nary->unwind_to == NULL);
432 last_inserted_nary = nary->next;
433 nary->next = (vn_nary_op_t)(void *)-1;
434 if (dump_file && (dump_flags & TDF_DETAILS))
436 fprintf (dump_file, "Recording ");
437 print_generic_expr (dump_file, name, TDF_SLIM);
438 fprintf (dump_file, " != 0\n");
441 break;
443 case RESULT_DECL:
444 /* If the result is passed by invisible reference the default
445 def is initialized, otherwise it's uninitialized. Still
446 undefined is varying. */
447 newinfo->visited = true;
448 newinfo->valnum = name;
449 break;
451 default:
452 gcc_unreachable ();
454 return newinfo;
457 /* Return the SSA value of X. */
459 inline tree
460 SSA_VAL (tree x, bool *visited = NULL)
462 vn_ssa_aux_t tem = vn_ssa_aux_hash->find_with_hash (x, SSA_NAME_VERSION (x));
463 if (visited)
464 *visited = tem && tem->visited;
465 return tem && tem->visited ? tem->valnum : x;
468 /* Return the SSA value of the VUSE x, supporting released VDEFs
469 during elimination which will value-number the VDEF to the
470 associated VUSE (but not substitute in the whole lattice). */
472 static inline tree
473 vuse_ssa_val (tree x)
475 if (!x)
476 return NULL_TREE;
480 x = SSA_VAL (x);
481 gcc_assert (x != VN_TOP);
483 while (SSA_NAME_IN_FREE_LIST (x));
485 return x;
488 /* Similar to the above but used as callback for walk_non_aliases_vuses
489 and thus should stop at unvisited VUSE to not walk across region
490 boundaries. */
492 static tree
493 vuse_valueize (tree vuse)
497 bool visited;
498 vuse = SSA_VAL (vuse, &visited);
499 if (!visited)
500 return NULL_TREE;
501 gcc_assert (vuse != VN_TOP);
503 while (SSA_NAME_IN_FREE_LIST (vuse));
504 return vuse;
508 /* Return the vn_kind the expression computed by the stmt should be
509 associated with. */
511 enum vn_kind
512 vn_get_stmt_kind (gimple *stmt)
514 switch (gimple_code (stmt))
516 case GIMPLE_CALL:
517 return VN_REFERENCE;
518 case GIMPLE_PHI:
519 return VN_PHI;
520 case GIMPLE_ASSIGN:
522 enum tree_code code = gimple_assign_rhs_code (stmt);
523 tree rhs1 = gimple_assign_rhs1 (stmt);
524 switch (get_gimple_rhs_class (code))
526 case GIMPLE_UNARY_RHS:
527 case GIMPLE_BINARY_RHS:
528 case GIMPLE_TERNARY_RHS:
529 return VN_NARY;
530 case GIMPLE_SINGLE_RHS:
531 switch (TREE_CODE_CLASS (code))
533 case tcc_reference:
534 /* VOP-less references can go through unary case. */
535 if ((code == REALPART_EXPR
536 || code == IMAGPART_EXPR
537 || code == VIEW_CONVERT_EXPR
538 || code == BIT_FIELD_REF)
539 && TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
540 return VN_NARY;
542 /* Fallthrough. */
543 case tcc_declaration:
544 return VN_REFERENCE;
546 case tcc_constant:
547 return VN_CONSTANT;
549 default:
550 if (code == ADDR_EXPR)
551 return (is_gimple_min_invariant (rhs1)
552 ? VN_CONSTANT : VN_REFERENCE);
553 else if (code == CONSTRUCTOR)
554 return VN_NARY;
555 return VN_NONE;
557 default:
558 return VN_NONE;
561 default:
562 return VN_NONE;
566 /* Lookup a value id for CONSTANT and return it. If it does not
567 exist returns 0. */
569 unsigned int
570 get_constant_value_id (tree constant)
572 vn_constant_s **slot;
573 struct vn_constant_s vc;
575 vc.hashcode = vn_hash_constant_with_type (constant);
576 vc.constant = constant;
577 slot = constant_to_value_id->find_slot (&vc, NO_INSERT);
578 if (slot)
579 return (*slot)->value_id;
580 return 0;
583 /* Lookup a value id for CONSTANT, and if it does not exist, create a
584 new one and return it. If it does exist, return it. */
586 unsigned int
587 get_or_alloc_constant_value_id (tree constant)
589 vn_constant_s **slot;
590 struct vn_constant_s vc;
591 vn_constant_t vcp;
593 /* If the hashtable isn't initialized we're not running from PRE and thus
594 do not need value-ids. */
595 if (!constant_to_value_id)
596 return 0;
598 vc.hashcode = vn_hash_constant_with_type (constant);
599 vc.constant = constant;
600 slot = constant_to_value_id->find_slot (&vc, INSERT);
601 if (*slot)
602 return (*slot)->value_id;
604 vcp = XNEW (struct vn_constant_s);
605 vcp->hashcode = vc.hashcode;
606 vcp->constant = constant;
607 vcp->value_id = get_next_value_id ();
608 *slot = vcp;
609 bitmap_set_bit (constant_value_ids, vcp->value_id);
610 return vcp->value_id;
613 /* Return true if V is a value id for a constant. */
615 bool
616 value_id_constant_p (unsigned int v)
618 return bitmap_bit_p (constant_value_ids, v);
621 /* Compute the hash for a reference operand VRO1. */
623 static void
624 vn_reference_op_compute_hash (const vn_reference_op_t vro1, inchash::hash &hstate)
626 hstate.add_int (vro1->opcode);
627 if (vro1->op0)
628 inchash::add_expr (vro1->op0, hstate);
629 if (vro1->op1)
630 inchash::add_expr (vro1->op1, hstate);
631 if (vro1->op2)
632 inchash::add_expr (vro1->op2, hstate);
635 /* Compute a hash for the reference operation VR1 and return it. */
637 static hashval_t
638 vn_reference_compute_hash (const vn_reference_t vr1)
640 inchash::hash hstate;
641 hashval_t result;
642 int i;
643 vn_reference_op_t vro;
644 poly_int64 off = -1;
645 bool deref = false;
647 FOR_EACH_VEC_ELT (vr1->operands, i, vro)
649 if (vro->opcode == MEM_REF)
650 deref = true;
651 else if (vro->opcode != ADDR_EXPR)
652 deref = false;
653 if (maybe_ne (vro->off, -1))
655 if (known_eq (off, -1))
656 off = 0;
657 off += vro->off;
659 else
661 if (maybe_ne (off, -1)
662 && maybe_ne (off, 0))
663 hstate.add_poly_int (off);
664 off = -1;
665 if (deref
666 && vro->opcode == ADDR_EXPR)
668 if (vro->op0)
670 tree op = TREE_OPERAND (vro->op0, 0);
671 hstate.add_int (TREE_CODE (op));
672 inchash::add_expr (op, hstate);
675 else
676 vn_reference_op_compute_hash (vro, hstate);
679 result = hstate.end ();
680 /* ??? We would ICE later if we hash instead of adding that in. */
681 if (vr1->vuse)
682 result += SSA_NAME_VERSION (vr1->vuse);
684 return result;
687 /* Return true if reference operations VR1 and VR2 are equivalent. This
688 means they have the same set of operands and vuses. */
690 bool
691 vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2)
693 unsigned i, j;
695 /* Early out if this is not a hash collision. */
696 if (vr1->hashcode != vr2->hashcode)
697 return false;
699 /* The VOP needs to be the same. */
700 if (vr1->vuse != vr2->vuse)
701 return false;
703 /* If the operands are the same we are done. */
704 if (vr1->operands == vr2->operands)
705 return true;
707 if (!expressions_equal_p (TYPE_SIZE (vr1->type), TYPE_SIZE (vr2->type)))
708 return false;
710 if (INTEGRAL_TYPE_P (vr1->type)
711 && INTEGRAL_TYPE_P (vr2->type))
713 if (TYPE_PRECISION (vr1->type) != TYPE_PRECISION (vr2->type))
714 return false;
716 else if (INTEGRAL_TYPE_P (vr1->type)
717 && (TYPE_PRECISION (vr1->type)
718 != TREE_INT_CST_LOW (TYPE_SIZE (vr1->type))))
719 return false;
720 else if (INTEGRAL_TYPE_P (vr2->type)
721 && (TYPE_PRECISION (vr2->type)
722 != TREE_INT_CST_LOW (TYPE_SIZE (vr2->type))))
723 return false;
725 i = 0;
726 j = 0;
729 poly_int64 off1 = 0, off2 = 0;
730 vn_reference_op_t vro1, vro2;
731 vn_reference_op_s tem1, tem2;
732 bool deref1 = false, deref2 = false;
733 for (; vr1->operands.iterate (i, &vro1); i++)
735 if (vro1->opcode == MEM_REF)
736 deref1 = true;
737 /* Do not look through a storage order barrier. */
738 else if (vro1->opcode == VIEW_CONVERT_EXPR && vro1->reverse)
739 return false;
740 if (known_eq (vro1->off, -1))
741 break;
742 off1 += vro1->off;
744 for (; vr2->operands.iterate (j, &vro2); j++)
746 if (vro2->opcode == MEM_REF)
747 deref2 = true;
748 /* Do not look through a storage order barrier. */
749 else if (vro2->opcode == VIEW_CONVERT_EXPR && vro2->reverse)
750 return false;
751 if (known_eq (vro2->off, -1))
752 break;
753 off2 += vro2->off;
755 if (maybe_ne (off1, off2))
756 return false;
757 if (deref1 && vro1->opcode == ADDR_EXPR)
759 memset (&tem1, 0, sizeof (tem1));
760 tem1.op0 = TREE_OPERAND (vro1->op0, 0);
761 tem1.type = TREE_TYPE (tem1.op0);
762 tem1.opcode = TREE_CODE (tem1.op0);
763 vro1 = &tem1;
764 deref1 = false;
766 if (deref2 && vro2->opcode == ADDR_EXPR)
768 memset (&tem2, 0, sizeof (tem2));
769 tem2.op0 = TREE_OPERAND (vro2->op0, 0);
770 tem2.type = TREE_TYPE (tem2.op0);
771 tem2.opcode = TREE_CODE (tem2.op0);
772 vro2 = &tem2;
773 deref2 = false;
775 if (deref1 != deref2)
776 return false;
777 if (!vn_reference_op_eq (vro1, vro2))
778 return false;
779 ++j;
780 ++i;
782 while (vr1->operands.length () != i
783 || vr2->operands.length () != j);
785 return true;
788 /* Copy the operations present in load/store REF into RESULT, a vector of
789 vn_reference_op_s's. */
791 static void
792 copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result)
794 if (TREE_CODE (ref) == TARGET_MEM_REF)
796 vn_reference_op_s temp;
798 result->reserve (3);
800 memset (&temp, 0, sizeof (temp));
801 temp.type = TREE_TYPE (ref);
802 temp.opcode = TREE_CODE (ref);
803 temp.op0 = TMR_INDEX (ref);
804 temp.op1 = TMR_STEP (ref);
805 temp.op2 = TMR_OFFSET (ref);
806 temp.off = -1;
807 temp.clique = MR_DEPENDENCE_CLIQUE (ref);
808 temp.base = MR_DEPENDENCE_BASE (ref);
809 result->quick_push (temp);
811 memset (&temp, 0, sizeof (temp));
812 temp.type = NULL_TREE;
813 temp.opcode = ERROR_MARK;
814 temp.op0 = TMR_INDEX2 (ref);
815 temp.off = -1;
816 result->quick_push (temp);
818 memset (&temp, 0, sizeof (temp));
819 temp.type = NULL_TREE;
820 temp.opcode = TREE_CODE (TMR_BASE (ref));
821 temp.op0 = TMR_BASE (ref);
822 temp.off = -1;
823 result->quick_push (temp);
824 return;
827 /* For non-calls, store the information that makes up the address. */
828 tree orig = ref;
829 while (ref)
831 vn_reference_op_s temp;
833 memset (&temp, 0, sizeof (temp));
834 temp.type = TREE_TYPE (ref);
835 temp.opcode = TREE_CODE (ref);
836 temp.off = -1;
838 switch (temp.opcode)
840 case MODIFY_EXPR:
841 temp.op0 = TREE_OPERAND (ref, 1);
842 break;
843 case WITH_SIZE_EXPR:
844 temp.op0 = TREE_OPERAND (ref, 1);
845 temp.off = 0;
846 break;
847 case MEM_REF:
848 /* The base address gets its own vn_reference_op_s structure. */
849 temp.op0 = TREE_OPERAND (ref, 1);
850 if (!mem_ref_offset (ref).to_shwi (&temp.off))
851 temp.off = -1;
852 temp.clique = MR_DEPENDENCE_CLIQUE (ref);
853 temp.base = MR_DEPENDENCE_BASE (ref);
854 temp.reverse = REF_REVERSE_STORAGE_ORDER (ref);
855 break;
856 case BIT_FIELD_REF:
857 /* Record bits, position and storage order. */
858 temp.op0 = TREE_OPERAND (ref, 1);
859 temp.op1 = TREE_OPERAND (ref, 2);
860 if (!multiple_p (bit_field_offset (ref), BITS_PER_UNIT, &temp.off))
861 temp.off = -1;
862 temp.reverse = REF_REVERSE_STORAGE_ORDER (ref);
863 break;
864 case COMPONENT_REF:
865 /* The field decl is enough to unambiguously specify the field,
866 a matching type is not necessary and a mismatching type
867 is always a spurious difference. */
868 temp.type = NULL_TREE;
869 temp.op0 = TREE_OPERAND (ref, 1);
870 temp.op1 = TREE_OPERAND (ref, 2);
872 tree this_offset = component_ref_field_offset (ref);
873 if (this_offset
874 && poly_int_tree_p (this_offset))
876 tree bit_offset = DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1));
877 if (TREE_INT_CST_LOW (bit_offset) % BITS_PER_UNIT == 0)
879 poly_offset_int off
880 = (wi::to_poly_offset (this_offset)
881 + (wi::to_offset (bit_offset) >> LOG2_BITS_PER_UNIT));
882 /* Probibit value-numbering zero offset components
883 of addresses the same before the pass folding
884 __builtin_object_size had a chance to run
885 (checking cfun->after_inlining does the
886 trick here). */
887 if (TREE_CODE (orig) != ADDR_EXPR
888 || maybe_ne (off, 0)
889 || cfun->after_inlining)
890 off.to_shwi (&temp.off);
894 break;
895 case ARRAY_RANGE_REF:
896 case ARRAY_REF:
898 tree eltype = TREE_TYPE (TREE_TYPE (TREE_OPERAND (ref, 0)));
899 /* Record index as operand. */
900 temp.op0 = TREE_OPERAND (ref, 1);
901 /* Always record lower bounds and element size. */
902 temp.op1 = array_ref_low_bound (ref);
903 /* But record element size in units of the type alignment. */
904 temp.op2 = TREE_OPERAND (ref, 3);
905 temp.align = eltype->type_common.align;
906 if (! temp.op2)
907 temp.op2 = size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (eltype),
908 size_int (TYPE_ALIGN_UNIT (eltype)));
909 if (poly_int_tree_p (temp.op0)
910 && poly_int_tree_p (temp.op1)
911 && TREE_CODE (temp.op2) == INTEGER_CST)
913 poly_offset_int off = ((wi::to_poly_offset (temp.op0)
914 - wi::to_poly_offset (temp.op1))
915 * wi::to_offset (temp.op2)
916 * vn_ref_op_align_unit (&temp));
917 off.to_shwi (&temp.off);
920 break;
921 case VAR_DECL:
922 if (DECL_HARD_REGISTER (ref))
924 temp.op0 = ref;
925 break;
927 /* Fallthru. */
928 case PARM_DECL:
929 case CONST_DECL:
930 case RESULT_DECL:
931 /* Canonicalize decls to MEM[&decl] which is what we end up with
932 when valueizing MEM[ptr] with ptr = &decl. */
933 temp.opcode = MEM_REF;
934 temp.op0 = build_int_cst (build_pointer_type (TREE_TYPE (ref)), 0);
935 temp.off = 0;
936 result->safe_push (temp);
937 temp.opcode = ADDR_EXPR;
938 temp.op0 = build1 (ADDR_EXPR, TREE_TYPE (temp.op0), ref);
939 temp.type = TREE_TYPE (temp.op0);
940 temp.off = -1;
941 break;
942 case STRING_CST:
943 case INTEGER_CST:
944 case COMPLEX_CST:
945 case VECTOR_CST:
946 case REAL_CST:
947 case FIXED_CST:
948 case CONSTRUCTOR:
949 case SSA_NAME:
950 temp.op0 = ref;
951 break;
952 case ADDR_EXPR:
953 if (is_gimple_min_invariant (ref))
955 temp.op0 = ref;
956 break;
958 break;
959 /* These are only interesting for their operands, their
960 existence, and their type. They will never be the last
961 ref in the chain of references (IE they require an
962 operand), so we don't have to put anything
963 for op* as it will be handled by the iteration */
964 case REALPART_EXPR:
965 temp.off = 0;
966 break;
967 case VIEW_CONVERT_EXPR:
968 temp.off = 0;
969 temp.reverse = storage_order_barrier_p (ref);
970 break;
971 case IMAGPART_EXPR:
972 /* This is only interesting for its constant offset. */
973 temp.off = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (ref)));
974 break;
975 default:
976 gcc_unreachable ();
978 result->safe_push (temp);
980 if (REFERENCE_CLASS_P (ref)
981 || TREE_CODE (ref) == MODIFY_EXPR
982 || TREE_CODE (ref) == WITH_SIZE_EXPR
983 || (TREE_CODE (ref) == ADDR_EXPR
984 && !is_gimple_min_invariant (ref)))
985 ref = TREE_OPERAND (ref, 0);
986 else
987 ref = NULL_TREE;
991 /* Build a alias-oracle reference abstraction in *REF from the vn_reference
992 operands in *OPS, the reference alias set SET and the reference type TYPE.
993 Return true if something useful was produced. */
995 bool
996 ao_ref_init_from_vn_reference (ao_ref *ref,
997 alias_set_type set, tree type,
998 vec<vn_reference_op_s> ops)
1000 vn_reference_op_t op;
1001 unsigned i;
1002 tree base = NULL_TREE;
1003 tree *op0_p = &base;
1004 poly_offset_int offset = 0;
1005 poly_offset_int max_size;
1006 poly_offset_int size = -1;
1007 tree size_tree = NULL_TREE;
1008 alias_set_type base_alias_set = -1;
1010 /* First get the final access size from just the outermost expression. */
1011 op = &ops[0];
1012 if (op->opcode == COMPONENT_REF)
1013 size_tree = DECL_SIZE (op->op0);
1014 else if (op->opcode == BIT_FIELD_REF)
1015 size_tree = op->op0;
1016 else
1018 machine_mode mode = TYPE_MODE (type);
1019 if (mode == BLKmode)
1020 size_tree = TYPE_SIZE (type);
1021 else
1022 size = GET_MODE_BITSIZE (mode);
1024 if (size_tree != NULL_TREE
1025 && poly_int_tree_p (size_tree))
1026 size = wi::to_poly_offset (size_tree);
1028 /* Initially, maxsize is the same as the accessed element size.
1029 In the following it will only grow (or become -1). */
1030 max_size = size;
1032 /* Compute cumulative bit-offset for nested component-refs and array-refs,
1033 and find the ultimate containing object. */
1034 FOR_EACH_VEC_ELT (ops, i, op)
1036 switch (op->opcode)
1038 /* These may be in the reference ops, but we cannot do anything
1039 sensible with them here. */
1040 case ADDR_EXPR:
1041 /* Apart from ADDR_EXPR arguments to MEM_REF. */
1042 if (base != NULL_TREE
1043 && TREE_CODE (base) == MEM_REF
1044 && op->op0
1045 && DECL_P (TREE_OPERAND (op->op0, 0)))
1047 vn_reference_op_t pop = &ops[i-1];
1048 base = TREE_OPERAND (op->op0, 0);
1049 if (known_eq (pop->off, -1))
1051 max_size = -1;
1052 offset = 0;
1054 else
1055 offset += pop->off * BITS_PER_UNIT;
1056 op0_p = NULL;
1057 break;
1059 /* Fallthru. */
1060 case CALL_EXPR:
1061 return false;
1063 /* Record the base objects. */
1064 case MEM_REF:
1065 base_alias_set = get_deref_alias_set (op->op0);
1066 *op0_p = build2 (MEM_REF, op->type,
1067 NULL_TREE, op->op0);
1068 MR_DEPENDENCE_CLIQUE (*op0_p) = op->clique;
1069 MR_DEPENDENCE_BASE (*op0_p) = op->base;
1070 op0_p = &TREE_OPERAND (*op0_p, 0);
1071 break;
1073 case VAR_DECL:
1074 case PARM_DECL:
1075 case RESULT_DECL:
1076 case SSA_NAME:
1077 *op0_p = op->op0;
1078 op0_p = NULL;
1079 break;
1081 /* And now the usual component-reference style ops. */
1082 case BIT_FIELD_REF:
1083 offset += wi::to_poly_offset (op->op1);
1084 break;
1086 case COMPONENT_REF:
1088 tree field = op->op0;
1089 /* We do not have a complete COMPONENT_REF tree here so we
1090 cannot use component_ref_field_offset. Do the interesting
1091 parts manually. */
1092 tree this_offset = DECL_FIELD_OFFSET (field);
1094 if (op->op1 || !poly_int_tree_p (this_offset))
1095 max_size = -1;
1096 else
1098 poly_offset_int woffset = (wi::to_poly_offset (this_offset)
1099 << LOG2_BITS_PER_UNIT);
1100 woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
1101 offset += woffset;
1103 break;
1106 case ARRAY_RANGE_REF:
1107 case ARRAY_REF:
1108 /* We recorded the lower bound and the element size. */
1109 if (!poly_int_tree_p (op->op0)
1110 || !poly_int_tree_p (op->op1)
1111 || TREE_CODE (op->op2) != INTEGER_CST)
1112 max_size = -1;
1113 else
1115 poly_offset_int woffset
1116 = wi::sext (wi::to_poly_offset (op->op0)
1117 - wi::to_poly_offset (op->op1),
1118 TYPE_PRECISION (TREE_TYPE (op->op0)));
1119 woffset *= wi::to_offset (op->op2) * vn_ref_op_align_unit (op);
1120 woffset <<= LOG2_BITS_PER_UNIT;
1121 offset += woffset;
1123 break;
1125 case REALPART_EXPR:
1126 break;
1128 case IMAGPART_EXPR:
1129 offset += size;
1130 break;
1132 case VIEW_CONVERT_EXPR:
1133 break;
1135 case STRING_CST:
1136 case INTEGER_CST:
1137 case COMPLEX_CST:
1138 case VECTOR_CST:
1139 case REAL_CST:
1140 case CONSTRUCTOR:
1141 case CONST_DECL:
1142 return false;
1144 default:
1145 return false;
1149 if (base == NULL_TREE)
1150 return false;
1152 ref->ref = NULL_TREE;
1153 ref->base = base;
1154 ref->ref_alias_set = set;
1155 if (base_alias_set != -1)
1156 ref->base_alias_set = base_alias_set;
1157 else
1158 ref->base_alias_set = get_alias_set (base);
1159 /* We discount volatiles from value-numbering elsewhere. */
1160 ref->volatile_p = false;
1162 if (!size.to_shwi (&ref->size) || maybe_lt (ref->size, 0))
1164 ref->offset = 0;
1165 ref->size = -1;
1166 ref->max_size = -1;
1167 return true;
1170 if (!offset.to_shwi (&ref->offset))
1172 ref->offset = 0;
1173 ref->max_size = -1;
1174 return true;
1177 if (!max_size.to_shwi (&ref->max_size) || maybe_lt (ref->max_size, 0))
1178 ref->max_size = -1;
1180 return true;
1183 /* Copy the operations present in load/store/call REF into RESULT, a vector of
1184 vn_reference_op_s's. */
1186 static void
1187 copy_reference_ops_from_call (gcall *call,
1188 vec<vn_reference_op_s> *result)
1190 vn_reference_op_s temp;
1191 unsigned i;
1192 tree lhs = gimple_call_lhs (call);
1193 int lr;
1195 /* If 2 calls have a different non-ssa lhs, vdef value numbers should be
1196 different. By adding the lhs here in the vector, we ensure that the
1197 hashcode is different, guaranteeing a different value number. */
1198 if (lhs && TREE_CODE (lhs) != SSA_NAME)
1200 memset (&temp, 0, sizeof (temp));
1201 temp.opcode = MODIFY_EXPR;
1202 temp.type = TREE_TYPE (lhs);
1203 temp.op0 = lhs;
1204 temp.off = -1;
1205 result->safe_push (temp);
1208 /* Copy the type, opcode, function, static chain and EH region, if any. */
1209 memset (&temp, 0, sizeof (temp));
1210 temp.type = gimple_call_fntype (call);
1211 temp.opcode = CALL_EXPR;
1212 temp.op0 = gimple_call_fn (call);
1213 temp.op1 = gimple_call_chain (call);
1214 if (stmt_could_throw_p (cfun, call) && (lr = lookup_stmt_eh_lp (call)) > 0)
1215 temp.op2 = size_int (lr);
1216 temp.off = -1;
1217 result->safe_push (temp);
1219 /* Copy the call arguments. As they can be references as well,
1220 just chain them together. */
1221 for (i = 0; i < gimple_call_num_args (call); ++i)
1223 tree callarg = gimple_call_arg (call, i);
1224 copy_reference_ops_from_ref (callarg, result);
1228 /* Fold *& at position *I_P in a vn_reference_op_s vector *OPS. Updates
1229 *I_P to point to the last element of the replacement. */
1230 static bool
1231 vn_reference_fold_indirect (vec<vn_reference_op_s> *ops,
1232 unsigned int *i_p)
1234 unsigned int i = *i_p;
1235 vn_reference_op_t op = &(*ops)[i];
1236 vn_reference_op_t mem_op = &(*ops)[i - 1];
1237 tree addr_base;
1238 poly_int64 addr_offset = 0;
1240 /* The only thing we have to do is from &OBJ.foo.bar add the offset
1241 from .foo.bar to the preceding MEM_REF offset and replace the
1242 address with &OBJ. */
1243 addr_base = get_addr_base_and_unit_offset (TREE_OPERAND (op->op0, 0),
1244 &addr_offset);
1245 gcc_checking_assert (addr_base && TREE_CODE (addr_base) != MEM_REF);
1246 if (addr_base != TREE_OPERAND (op->op0, 0))
1248 poly_offset_int off
1249 = (poly_offset_int::from (wi::to_poly_wide (mem_op->op0),
1250 SIGNED)
1251 + addr_offset);
1252 mem_op->op0 = wide_int_to_tree (TREE_TYPE (mem_op->op0), off);
1253 op->op0 = build_fold_addr_expr (addr_base);
1254 if (tree_fits_shwi_p (mem_op->op0))
1255 mem_op->off = tree_to_shwi (mem_op->op0);
1256 else
1257 mem_op->off = -1;
1258 return true;
1260 return false;
1263 /* Fold *& at position *I_P in a vn_reference_op_s vector *OPS. Updates
1264 *I_P to point to the last element of the replacement. */
1265 static bool
1266 vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
1267 unsigned int *i_p)
1269 unsigned int i = *i_p;
1270 vn_reference_op_t op = &(*ops)[i];
1271 vn_reference_op_t mem_op = &(*ops)[i - 1];
1272 gimple *def_stmt;
1273 enum tree_code code;
1274 poly_offset_int off;
1276 def_stmt = SSA_NAME_DEF_STMT (op->op0);
1277 if (!is_gimple_assign (def_stmt))
1278 return false;
1280 code = gimple_assign_rhs_code (def_stmt);
1281 if (code != ADDR_EXPR
1282 && code != POINTER_PLUS_EXPR)
1283 return false;
1285 off = poly_offset_int::from (wi::to_poly_wide (mem_op->op0), SIGNED);
1287 /* The only thing we have to do is from &OBJ.foo.bar add the offset
1288 from .foo.bar to the preceding MEM_REF offset and replace the
1289 address with &OBJ. */
1290 if (code == ADDR_EXPR)
1292 tree addr, addr_base;
1293 poly_int64 addr_offset;
1295 addr = gimple_assign_rhs1 (def_stmt);
1296 addr_base = get_addr_base_and_unit_offset (TREE_OPERAND (addr, 0),
1297 &addr_offset);
1298 /* If that didn't work because the address isn't invariant propagate
1299 the reference tree from the address operation in case the current
1300 dereference isn't offsetted. */
1301 if (!addr_base
1302 && *i_p == ops->length () - 1
1303 && known_eq (off, 0)
1304 /* This makes us disable this transform for PRE where the
1305 reference ops might be also used for code insertion which
1306 is invalid. */
1307 && default_vn_walk_kind == VN_WALKREWRITE)
1309 auto_vec<vn_reference_op_s, 32> tem;
1310 copy_reference_ops_from_ref (TREE_OPERAND (addr, 0), &tem);
1311 /* Make sure to preserve TBAA info. The only objects not
1312 wrapped in MEM_REFs that can have their address taken are
1313 STRING_CSTs. */
1314 if (tem.length () >= 2
1315 && tem[tem.length () - 2].opcode == MEM_REF)
1317 vn_reference_op_t new_mem_op = &tem[tem.length () - 2];
1318 new_mem_op->op0
1319 = wide_int_to_tree (TREE_TYPE (mem_op->op0),
1320 wi::to_poly_wide (new_mem_op->op0));
1322 else
1323 gcc_assert (tem.last ().opcode == STRING_CST);
1324 ops->pop ();
1325 ops->pop ();
1326 ops->safe_splice (tem);
1327 --*i_p;
1328 return true;
1330 if (!addr_base
1331 || TREE_CODE (addr_base) != MEM_REF
1332 || (TREE_CODE (TREE_OPERAND (addr_base, 0)) == SSA_NAME
1333 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (addr_base, 0))))
1334 return false;
1336 off += addr_offset;
1337 off += mem_ref_offset (addr_base);
1338 op->op0 = TREE_OPERAND (addr_base, 0);
1340 else
1342 tree ptr, ptroff;
1343 ptr = gimple_assign_rhs1 (def_stmt);
1344 ptroff = gimple_assign_rhs2 (def_stmt);
1345 if (TREE_CODE (ptr) != SSA_NAME
1346 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ptr)
1347 /* Make sure to not endlessly recurse.
1348 See gcc.dg/tree-ssa/20040408-1.c for an example. Can easily
1349 happen when we value-number a PHI to its backedge value. */
1350 || SSA_VAL (ptr) == op->op0
1351 || !poly_int_tree_p (ptroff))
1352 return false;
1354 off += wi::to_poly_offset (ptroff);
1355 op->op0 = ptr;
1358 mem_op->op0 = wide_int_to_tree (TREE_TYPE (mem_op->op0), off);
1359 if (tree_fits_shwi_p (mem_op->op0))
1360 mem_op->off = tree_to_shwi (mem_op->op0);
1361 else
1362 mem_op->off = -1;
1363 /* ??? Can end up with endless recursion here!?
1364 gcc.c-torture/execute/strcmp-1.c */
1365 if (TREE_CODE (op->op0) == SSA_NAME)
1366 op->op0 = SSA_VAL (op->op0);
1367 if (TREE_CODE (op->op0) != SSA_NAME)
1368 op->opcode = TREE_CODE (op->op0);
1370 /* And recurse. */
1371 if (TREE_CODE (op->op0) == SSA_NAME)
1372 vn_reference_maybe_forwprop_address (ops, i_p);
1373 else if (TREE_CODE (op->op0) == ADDR_EXPR)
1374 vn_reference_fold_indirect (ops, i_p);
1375 return true;
1378 /* Optimize the reference REF to a constant if possible or return
1379 NULL_TREE if not. */
1381 tree
1382 fully_constant_vn_reference_p (vn_reference_t ref)
1384 vec<vn_reference_op_s> operands = ref->operands;
1385 vn_reference_op_t op;
1387 /* Try to simplify the translated expression if it is
1388 a call to a builtin function with at most two arguments. */
1389 op = &operands[0];
1390 if (op->opcode == CALL_EXPR
1391 && TREE_CODE (op->op0) == ADDR_EXPR
1392 && TREE_CODE (TREE_OPERAND (op->op0, 0)) == FUNCTION_DECL
1393 && fndecl_built_in_p (TREE_OPERAND (op->op0, 0))
1394 && operands.length () >= 2
1395 && operands.length () <= 3)
1397 vn_reference_op_t arg0, arg1 = NULL;
1398 bool anyconst = false;
1399 arg0 = &operands[1];
1400 if (operands.length () > 2)
1401 arg1 = &operands[2];
1402 if (TREE_CODE_CLASS (arg0->opcode) == tcc_constant
1403 || (arg0->opcode == ADDR_EXPR
1404 && is_gimple_min_invariant (arg0->op0)))
1405 anyconst = true;
1406 if (arg1
1407 && (TREE_CODE_CLASS (arg1->opcode) == tcc_constant
1408 || (arg1->opcode == ADDR_EXPR
1409 && is_gimple_min_invariant (arg1->op0))))
1410 anyconst = true;
1411 if (anyconst)
1413 tree folded = build_call_expr (TREE_OPERAND (op->op0, 0),
1414 arg1 ? 2 : 1,
1415 arg0->op0,
1416 arg1 ? arg1->op0 : NULL);
1417 if (folded
1418 && TREE_CODE (folded) == NOP_EXPR)
1419 folded = TREE_OPERAND (folded, 0);
1420 if (folded
1421 && is_gimple_min_invariant (folded))
1422 return folded;
1426 /* Simplify reads from constants or constant initializers. */
1427 else if (BITS_PER_UNIT == 8
1428 && COMPLETE_TYPE_P (ref->type)
1429 && is_gimple_reg_type (ref->type))
1431 poly_int64 off = 0;
1432 HOST_WIDE_INT size;
1433 if (INTEGRAL_TYPE_P (ref->type))
1434 size = TYPE_PRECISION (ref->type);
1435 else if (tree_fits_shwi_p (TYPE_SIZE (ref->type)))
1436 size = tree_to_shwi (TYPE_SIZE (ref->type));
1437 else
1438 return NULL_TREE;
1439 if (size % BITS_PER_UNIT != 0
1440 || size > MAX_BITSIZE_MODE_ANY_MODE)
1441 return NULL_TREE;
1442 size /= BITS_PER_UNIT;
1443 unsigned i;
1444 for (i = 0; i < operands.length (); ++i)
1446 if (TREE_CODE_CLASS (operands[i].opcode) == tcc_constant)
1448 ++i;
1449 break;
1451 if (known_eq (operands[i].off, -1))
1452 return NULL_TREE;
1453 off += operands[i].off;
1454 if (operands[i].opcode == MEM_REF)
1456 ++i;
1457 break;
1460 vn_reference_op_t base = &operands[--i];
1461 tree ctor = error_mark_node;
1462 tree decl = NULL_TREE;
1463 if (TREE_CODE_CLASS (base->opcode) == tcc_constant)
1464 ctor = base->op0;
1465 else if (base->opcode == MEM_REF
1466 && base[1].opcode == ADDR_EXPR
1467 && (TREE_CODE (TREE_OPERAND (base[1].op0, 0)) == VAR_DECL
1468 || TREE_CODE (TREE_OPERAND (base[1].op0, 0)) == CONST_DECL
1469 || TREE_CODE (TREE_OPERAND (base[1].op0, 0)) == STRING_CST))
1471 decl = TREE_OPERAND (base[1].op0, 0);
1472 if (TREE_CODE (decl) == STRING_CST)
1473 ctor = decl;
1474 else
1475 ctor = ctor_for_folding (decl);
1477 if (ctor == NULL_TREE)
1478 return build_zero_cst (ref->type);
1479 else if (ctor != error_mark_node)
1481 HOST_WIDE_INT const_off;
1482 if (decl)
1484 tree res = fold_ctor_reference (ref->type, ctor,
1485 off * BITS_PER_UNIT,
1486 size * BITS_PER_UNIT, decl);
1487 if (res)
1489 STRIP_USELESS_TYPE_CONVERSION (res);
1490 if (is_gimple_min_invariant (res))
1491 return res;
1494 else if (off.is_constant (&const_off))
1496 unsigned char buf[MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT];
1497 int len = native_encode_expr (ctor, buf, size, const_off);
1498 if (len > 0)
1499 return native_interpret_expr (ref->type, buf, len);
1504 return NULL_TREE;
1507 /* Return true if OPS contain a storage order barrier. */
1509 static bool
1510 contains_storage_order_barrier_p (vec<vn_reference_op_s> ops)
1512 vn_reference_op_t op;
1513 unsigned i;
1515 FOR_EACH_VEC_ELT (ops, i, op)
1516 if (op->opcode == VIEW_CONVERT_EXPR && op->reverse)
1517 return true;
1519 return false;
1522 /* Transform any SSA_NAME's in a vector of vn_reference_op_s
1523 structures into their value numbers. This is done in-place, and
1524 the vector passed in is returned. *VALUEIZED_ANYTHING will specify
1525 whether any operands were valueized. */
1527 static vec<vn_reference_op_s>
1528 valueize_refs_1 (vec<vn_reference_op_s> orig, bool *valueized_anything,
1529 bool with_avail = false)
1531 vn_reference_op_t vro;
1532 unsigned int i;
1534 *valueized_anything = false;
1536 FOR_EACH_VEC_ELT (orig, i, vro)
1538 if (vro->opcode == SSA_NAME
1539 || (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME))
1541 tree tem = with_avail ? vn_valueize (vro->op0) : SSA_VAL (vro->op0);
1542 if (tem != vro->op0)
1544 *valueized_anything = true;
1545 vro->op0 = tem;
1547 /* If it transforms from an SSA_NAME to a constant, update
1548 the opcode. */
1549 if (TREE_CODE (vro->op0) != SSA_NAME && vro->opcode == SSA_NAME)
1550 vro->opcode = TREE_CODE (vro->op0);
1552 if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
1554 tree tem = with_avail ? vn_valueize (vro->op1) : SSA_VAL (vro->op1);
1555 if (tem != vro->op1)
1557 *valueized_anything = true;
1558 vro->op1 = tem;
1561 if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
1563 tree tem = with_avail ? vn_valueize (vro->op2) : SSA_VAL (vro->op2);
1564 if (tem != vro->op2)
1566 *valueized_anything = true;
1567 vro->op2 = tem;
1570 /* If it transforms from an SSA_NAME to an address, fold with
1571 a preceding indirect reference. */
1572 if (i > 0
1573 && vro->op0
1574 && TREE_CODE (vro->op0) == ADDR_EXPR
1575 && orig[i - 1].opcode == MEM_REF)
1577 if (vn_reference_fold_indirect (&orig, &i))
1578 *valueized_anything = true;
1580 else if (i > 0
1581 && vro->opcode == SSA_NAME
1582 && orig[i - 1].opcode == MEM_REF)
1584 if (vn_reference_maybe_forwprop_address (&orig, &i))
1585 *valueized_anything = true;
1587 /* If it transforms a non-constant ARRAY_REF into a constant
1588 one, adjust the constant offset. */
1589 else if (vro->opcode == ARRAY_REF
1590 && known_eq (vro->off, -1)
1591 && poly_int_tree_p (vro->op0)
1592 && poly_int_tree_p (vro->op1)
1593 && TREE_CODE (vro->op2) == INTEGER_CST)
1595 poly_offset_int off = ((wi::to_poly_offset (vro->op0)
1596 - wi::to_poly_offset (vro->op1))
1597 * wi::to_offset (vro->op2)
1598 * vn_ref_op_align_unit (vro));
1599 off.to_shwi (&vro->off);
1603 return orig;
1606 static vec<vn_reference_op_s>
1607 valueize_refs (vec<vn_reference_op_s> orig)
1609 bool tem;
1610 return valueize_refs_1 (orig, &tem);
1613 static vec<vn_reference_op_s> shared_lookup_references;
1615 /* Create a vector of vn_reference_op_s structures from REF, a
1616 REFERENCE_CLASS_P tree. The vector is shared among all callers of
1617 this function. *VALUEIZED_ANYTHING will specify whether any
1618 operands were valueized. */
1620 static vec<vn_reference_op_s>
1621 valueize_shared_reference_ops_from_ref (tree ref, bool *valueized_anything)
1623 if (!ref)
1624 return vNULL;
1625 shared_lookup_references.truncate (0);
1626 copy_reference_ops_from_ref (ref, &shared_lookup_references);
1627 shared_lookup_references = valueize_refs_1 (shared_lookup_references,
1628 valueized_anything);
1629 return shared_lookup_references;
1632 /* Create a vector of vn_reference_op_s structures from CALL, a
1633 call statement. The vector is shared among all callers of
1634 this function. */
1636 static vec<vn_reference_op_s>
1637 valueize_shared_reference_ops_from_call (gcall *call)
1639 if (!call)
1640 return vNULL;
1641 shared_lookup_references.truncate (0);
1642 copy_reference_ops_from_call (call, &shared_lookup_references);
1643 shared_lookup_references = valueize_refs (shared_lookup_references);
1644 return shared_lookup_references;
1647 /* Lookup a SCCVN reference operation VR in the current hash table.
1648 Returns the resulting value number if it exists in the hash table,
1649 NULL_TREE otherwise. VNRESULT will be filled in with the actual
1650 vn_reference_t stored in the hashtable if something is found. */
1652 static tree
1653 vn_reference_lookup_1 (vn_reference_t vr, vn_reference_t *vnresult)
1655 vn_reference_s **slot;
1656 hashval_t hash;
1658 hash = vr->hashcode;
1659 slot = valid_info->references->find_slot_with_hash (vr, hash, NO_INSERT);
1660 if (slot)
1662 if (vnresult)
1663 *vnresult = (vn_reference_t)*slot;
1664 return ((vn_reference_t)*slot)->result;
1667 return NULL_TREE;
1670 /* Callback for walk_non_aliased_vuses. Adjusts the vn_reference_t VR_
1671 with the current VUSE and performs the expression lookup. */
1673 static void *
1674 vn_reference_lookup_2 (ao_ref *op ATTRIBUTE_UNUSED, tree vuse,
1675 unsigned int cnt, void *vr_)
1677 vn_reference_t vr = (vn_reference_t)vr_;
1678 vn_reference_s **slot;
1679 hashval_t hash;
1681 /* This bounds the stmt walks we perform on reference lookups
1682 to O(1) instead of O(N) where N is the number of dominating
1683 stores. */
1684 if (cnt > (unsigned) PARAM_VALUE (PARAM_SCCVN_MAX_ALIAS_QUERIES_PER_ACCESS))
1685 return (void *)-1;
1687 if (last_vuse_ptr)
1688 *last_vuse_ptr = vuse;
1690 /* Fixup vuse and hash. */
1691 if (vr->vuse)
1692 vr->hashcode = vr->hashcode - SSA_NAME_VERSION (vr->vuse);
1693 vr->vuse = vuse_ssa_val (vuse);
1694 if (vr->vuse)
1695 vr->hashcode = vr->hashcode + SSA_NAME_VERSION (vr->vuse);
1697 hash = vr->hashcode;
1698 slot = valid_info->references->find_slot_with_hash (vr, hash, NO_INSERT);
1699 if (slot)
1700 return *slot;
1702 return NULL;
1705 /* Lookup an existing or insert a new vn_reference entry into the
1706 value table for the VUSE, SET, TYPE, OPERANDS reference which
1707 has the value VALUE which is either a constant or an SSA name. */
1709 static vn_reference_t
1710 vn_reference_lookup_or_insert_for_pieces (tree vuse,
1711 alias_set_type set,
1712 tree type,
1713 vec<vn_reference_op_s,
1714 va_heap> operands,
1715 tree value)
1717 vn_reference_s vr1;
1718 vn_reference_t result;
1719 unsigned value_id;
1720 vr1.vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
1721 vr1.operands = operands;
1722 vr1.type = type;
1723 vr1.set = set;
1724 vr1.hashcode = vn_reference_compute_hash (&vr1);
1725 if (vn_reference_lookup_1 (&vr1, &result))
1726 return result;
1727 if (TREE_CODE (value) == SSA_NAME)
1728 value_id = VN_INFO (value)->value_id;
1729 else
1730 value_id = get_or_alloc_constant_value_id (value);
1731 return vn_reference_insert_pieces (vuse, set, type,
1732 operands.copy (), value, value_id);
1735 /* Return a value-number for RCODE OPS... either by looking up an existing
1736 value-number for the simplified result or by inserting the operation if
1737 INSERT is true. */
1739 static tree
1740 vn_nary_build_or_lookup_1 (gimple_match_op *res_op, bool insert)
1742 tree result = NULL_TREE;
1743 /* We will be creating a value number for
1744 RCODE (OPS...).
1745 So first simplify and lookup this expression to see if it
1746 is already available. */
1747 mprts_hook = vn_lookup_simplify_result;
1748 bool res = false;
1749 switch (TREE_CODE_LENGTH ((tree_code) res_op->code))
1751 case 1:
1752 res = gimple_resimplify1 (NULL, res_op, vn_valueize);
1753 break;
1754 case 2:
1755 res = gimple_resimplify2 (NULL, res_op, vn_valueize);
1756 break;
1757 case 3:
1758 res = gimple_resimplify3 (NULL, res_op, vn_valueize);
1759 break;
1761 mprts_hook = NULL;
1762 gimple *new_stmt = NULL;
1763 if (res
1764 && gimple_simplified_result_is_gimple_val (res_op))
1766 /* The expression is already available. */
1767 result = res_op->ops[0];
1768 /* Valueize it, simplification returns sth in AVAIL only. */
1769 if (TREE_CODE (result) == SSA_NAME)
1770 result = SSA_VAL (result);
1772 else
1774 tree val = vn_lookup_simplify_result (res_op);
1775 if (!val && insert)
1777 gimple_seq stmts = NULL;
1778 result = maybe_push_res_to_seq (res_op, &stmts);
1779 if (result)
1781 gcc_assert (gimple_seq_singleton_p (stmts));
1782 new_stmt = gimple_seq_first_stmt (stmts);
1785 else
1786 /* The expression is already available. */
1787 result = val;
1789 if (new_stmt)
1791 /* The expression is not yet available, value-number lhs to
1792 the new SSA_NAME we created. */
1793 /* Initialize value-number information properly. */
1794 vn_ssa_aux_t result_info = VN_INFO (result);
1795 result_info->valnum = result;
1796 result_info->value_id = get_next_value_id ();
1797 result_info->visited = 1;
1798 gimple_seq_add_stmt_without_update (&VN_INFO (result)->expr,
1799 new_stmt);
1800 result_info->needs_insertion = true;
1801 /* ??? PRE phi-translation inserts NARYs without corresponding
1802 SSA name result. Re-use those but set their result according
1803 to the stmt we just built. */
1804 vn_nary_op_t nary = NULL;
1805 vn_nary_op_lookup_stmt (new_stmt, &nary);
1806 if (nary)
1808 gcc_assert (! nary->predicated_values && nary->u.result == NULL_TREE);
1809 nary->u.result = gimple_assign_lhs (new_stmt);
1811 /* As all "inserted" statements are singleton SCCs, insert
1812 to the valid table. This is strictly needed to
1813 avoid re-generating new value SSA_NAMEs for the same
1814 expression during SCC iteration over and over (the
1815 optimistic table gets cleared after each iteration).
1816 We do not need to insert into the optimistic table, as
1817 lookups there will fall back to the valid table. */
1818 else
1820 unsigned int length = vn_nary_length_from_stmt (new_stmt);
1821 vn_nary_op_t vno1
1822 = alloc_vn_nary_op_noinit (length, &vn_tables_insert_obstack);
1823 vno1->value_id = result_info->value_id;
1824 vno1->length = length;
1825 vno1->predicated_values = 0;
1826 vno1->u.result = result;
1827 init_vn_nary_op_from_stmt (vno1, new_stmt);
1828 vn_nary_op_insert_into (vno1, valid_info->nary, true);
1829 /* Also do not link it into the undo chain. */
1830 last_inserted_nary = vno1->next;
1831 vno1->next = (vn_nary_op_t)(void *)-1;
1833 if (dump_file && (dump_flags & TDF_DETAILS))
1835 fprintf (dump_file, "Inserting name ");
1836 print_generic_expr (dump_file, result);
1837 fprintf (dump_file, " for expression ");
1838 print_gimple_expr (dump_file, new_stmt, 0, TDF_SLIM);
1839 fprintf (dump_file, "\n");
1842 return result;
1845 /* Return a value-number for RCODE OPS... either by looking up an existing
1846 value-number for the simplified result or by inserting the operation. */
1848 static tree
1849 vn_nary_build_or_lookup (gimple_match_op *res_op)
1851 return vn_nary_build_or_lookup_1 (res_op, true);
1854 /* Try to simplify the expression RCODE OPS... of type TYPE and return
1855 its value if present. */
1857 tree
1858 vn_nary_simplify (vn_nary_op_t nary)
1860 if (nary->length > gimple_match_op::MAX_NUM_OPS)
1861 return NULL_TREE;
1862 gimple_match_op op (gimple_match_cond::UNCOND, nary->opcode,
1863 nary->type, nary->length);
1864 memcpy (op.ops, nary->op, sizeof (tree) * nary->length);
1865 return vn_nary_build_or_lookup_1 (&op, false);
1868 basic_block vn_context_bb;
1870 /* Callback for walk_non_aliased_vuses. Tries to perform a lookup
1871 from the statement defining VUSE and if not successful tries to
1872 translate *REFP and VR_ through an aggregate copy at the definition
1873 of VUSE. If *DISAMBIGUATE_ONLY is true then do not perform translation
1874 of *REF and *VR. If only disambiguation was performed then
1875 *DISAMBIGUATE_ONLY is set to true. */
1877 static void *
1878 vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
1879 bool *disambiguate_only)
1881 vn_reference_t vr = (vn_reference_t)vr_;
1882 gimple *def_stmt = SSA_NAME_DEF_STMT (vuse);
1883 tree base = ao_ref_base (ref);
1884 HOST_WIDE_INT offseti, maxsizei;
1885 static vec<vn_reference_op_s> lhs_ops;
1886 ao_ref lhs_ref;
1887 bool lhs_ref_ok = false;
1888 poly_int64 copy_size;
1890 /* First try to disambiguate after value-replacing in the definitions LHS. */
1891 if (is_gimple_assign (def_stmt))
1893 tree lhs = gimple_assign_lhs (def_stmt);
1894 bool valueized_anything = false;
1895 /* Avoid re-allocation overhead. */
1896 lhs_ops.truncate (0);
1897 basic_block saved_rpo_bb = vn_context_bb;
1898 vn_context_bb = gimple_bb (def_stmt);
1899 copy_reference_ops_from_ref (lhs, &lhs_ops);
1900 lhs_ops = valueize_refs_1 (lhs_ops, &valueized_anything, true);
1901 vn_context_bb = saved_rpo_bb;
1902 if (valueized_anything)
1904 lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref,
1905 get_alias_set (lhs),
1906 TREE_TYPE (lhs), lhs_ops);
1907 if (lhs_ref_ok
1908 && !refs_may_alias_p_1 (ref, &lhs_ref, true))
1910 *disambiguate_only = true;
1911 return NULL;
1914 else
1916 ao_ref_init (&lhs_ref, lhs);
1917 lhs_ref_ok = true;
1920 /* If we reach a clobbering statement try to skip it and see if
1921 we find a VN result with exactly the same value as the
1922 possible clobber. In this case we can ignore the clobber
1923 and return the found value.
1924 Note that we don't need to worry about partial overlapping
1925 accesses as we then can use TBAA to disambiguate against the
1926 clobbering statement when looking up a load (thus the
1927 VN_WALKREWRITE guard). */
1928 if (vn_walk_kind == VN_WALKREWRITE
1929 && is_gimple_reg_type (TREE_TYPE (lhs))
1930 && types_compatible_p (TREE_TYPE (lhs), vr->type)
1931 /* The overlap restriction breaks down when either access
1932 alias-set is zero. Still for accesses of the size of
1933 an addressable unit there can be no overlaps. Overlaps
1934 between different union members are not an issue since
1935 activation of a union member via a store makes the
1936 values of untouched bytes unspecified. */
1937 && (known_eq (ref->size, BITS_PER_UNIT)
1938 || (get_alias_set (lhs) != 0
1939 && ao_ref_alias_set (ref) != 0)))
1941 tree *saved_last_vuse_ptr = last_vuse_ptr;
1942 /* Do not update last_vuse_ptr in vn_reference_lookup_2. */
1943 last_vuse_ptr = NULL;
1944 tree saved_vuse = vr->vuse;
1945 hashval_t saved_hashcode = vr->hashcode;
1946 void *res = vn_reference_lookup_2 (ref,
1947 gimple_vuse (def_stmt), 0, vr);
1948 /* Need to restore vr->vuse and vr->hashcode. */
1949 vr->vuse = saved_vuse;
1950 vr->hashcode = saved_hashcode;
1951 last_vuse_ptr = saved_last_vuse_ptr;
1952 if (res && res != (void *)-1)
1954 vn_reference_t vnresult = (vn_reference_t) res;
1955 if (vnresult->result
1956 && operand_equal_p (vnresult->result,
1957 gimple_assign_rhs1 (def_stmt), 0))
1958 return res;
1962 else if (gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL)
1963 && gimple_call_num_args (def_stmt) <= 4)
1965 /* For builtin calls valueize its arguments and call the
1966 alias oracle again. Valueization may improve points-to
1967 info of pointers and constify size and position arguments.
1968 Originally this was motivated by PR61034 which has
1969 conditional calls to free falsely clobbering ref because
1970 of imprecise points-to info of the argument. */
1971 tree oldargs[4];
1972 bool valueized_anything = false;
1973 for (unsigned i = 0; i < gimple_call_num_args (def_stmt); ++i)
1975 oldargs[i] = gimple_call_arg (def_stmt, i);
1976 tree val = vn_valueize (oldargs[i]);
1977 if (val != oldargs[i])
1979 gimple_call_set_arg (def_stmt, i, val);
1980 valueized_anything = true;
1983 if (valueized_anything)
1985 bool res = call_may_clobber_ref_p_1 (as_a <gcall *> (def_stmt),
1986 ref);
1987 for (unsigned i = 0; i < gimple_call_num_args (def_stmt); ++i)
1988 gimple_call_set_arg (def_stmt, i, oldargs[i]);
1989 if (!res)
1991 *disambiguate_only = true;
1992 return NULL;
1997 if (*disambiguate_only)
1998 return (void *)-1;
2000 /* If we cannot constrain the size of the reference we cannot
2001 test if anything kills it. */
2002 if (!ref->max_size_known_p ())
2003 return (void *)-1;
2005 poly_int64 offset = ref->offset;
2006 poly_int64 maxsize = ref->max_size;
2008 /* We can't deduce anything useful from clobbers. */
2009 if (gimple_clobber_p (def_stmt))
2010 return (void *)-1;
2012 /* def_stmt may-defs *ref. See if we can derive a value for *ref
2013 from that definition.
2014 1) Memset. */
2015 if (is_gimple_reg_type (vr->type)
2016 && gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET)
2017 && (integer_zerop (gimple_call_arg (def_stmt, 1))
2018 || ((TREE_CODE (gimple_call_arg (def_stmt, 1)) == INTEGER_CST
2019 || (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8)))
2020 && CHAR_BIT == 8 && BITS_PER_UNIT == 8
2021 && offset.is_constant (&offseti)
2022 && offseti % BITS_PER_UNIT == 0))
2023 && poly_int_tree_p (gimple_call_arg (def_stmt, 2))
2024 && (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
2025 || TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME))
2027 tree base2;
2028 poly_int64 offset2, size2, maxsize2;
2029 bool reverse;
2030 tree ref2 = gimple_call_arg (def_stmt, 0);
2031 if (TREE_CODE (ref2) == SSA_NAME)
2033 ref2 = SSA_VAL (ref2);
2034 if (TREE_CODE (ref2) == SSA_NAME
2035 && (TREE_CODE (base) != MEM_REF
2036 || TREE_OPERAND (base, 0) != ref2))
2038 gimple *def_stmt = SSA_NAME_DEF_STMT (ref2);
2039 if (gimple_assign_single_p (def_stmt)
2040 && gimple_assign_rhs_code (def_stmt) == ADDR_EXPR)
2041 ref2 = gimple_assign_rhs1 (def_stmt);
2044 if (TREE_CODE (ref2) == ADDR_EXPR)
2046 ref2 = TREE_OPERAND (ref2, 0);
2047 base2 = get_ref_base_and_extent (ref2, &offset2, &size2, &maxsize2,
2048 &reverse);
2049 if (!known_size_p (maxsize2)
2050 || !known_eq (maxsize2, size2)
2051 || !operand_equal_p (base, base2, OEP_ADDRESS_OF))
2052 return (void *)-1;
2054 else if (TREE_CODE (ref2) == SSA_NAME)
2056 poly_int64 soff;
2057 if (TREE_CODE (base) != MEM_REF
2058 || !(mem_ref_offset (base) << LOG2_BITS_PER_UNIT).to_shwi (&soff))
2059 return (void *)-1;
2060 offset += soff;
2061 offset2 = 0;
2062 if (TREE_OPERAND (base, 0) != ref2)
2064 gimple *def = SSA_NAME_DEF_STMT (ref2);
2065 if (is_gimple_assign (def)
2066 && gimple_assign_rhs_code (def) == POINTER_PLUS_EXPR
2067 && gimple_assign_rhs1 (def) == TREE_OPERAND (base, 0)
2068 && poly_int_tree_p (gimple_assign_rhs2 (def))
2069 && (wi::to_poly_offset (gimple_assign_rhs2 (def))
2070 << LOG2_BITS_PER_UNIT).to_shwi (&offset2))
2072 ref2 = gimple_assign_rhs1 (def);
2073 if (TREE_CODE (ref2) == SSA_NAME)
2074 ref2 = SSA_VAL (ref2);
2076 else
2077 return (void *)-1;
2080 else
2081 return (void *)-1;
2082 tree len = gimple_call_arg (def_stmt, 2);
2083 if (known_subrange_p (offset, maxsize, offset2,
2084 wi::to_poly_offset (len) << LOG2_BITS_PER_UNIT))
2086 tree val;
2087 if (integer_zerop (gimple_call_arg (def_stmt, 1)))
2088 val = build_zero_cst (vr->type);
2089 else if (INTEGRAL_TYPE_P (vr->type)
2090 && known_eq (ref->size, 8))
2092 gimple_match_op res_op (gimple_match_cond::UNCOND, NOP_EXPR,
2093 vr->type, gimple_call_arg (def_stmt, 1));
2094 val = vn_nary_build_or_lookup (&res_op);
2095 if (!val
2096 || (TREE_CODE (val) == SSA_NAME
2097 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)))
2098 return (void *)-1;
2100 else
2102 unsigned len = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (vr->type));
2103 unsigned char *buf = XALLOCAVEC (unsigned char, len);
2104 memset (buf, TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 1)),
2105 len);
2106 val = native_interpret_expr (vr->type, buf, len);
2107 if (!val)
2108 return (void *)-1;
2110 return vn_reference_lookup_or_insert_for_pieces
2111 (vuse, vr->set, vr->type, vr->operands, val);
2115 /* 2) Assignment from an empty CONSTRUCTOR. */
2116 else if (is_gimple_reg_type (vr->type)
2117 && gimple_assign_single_p (def_stmt)
2118 && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR
2119 && CONSTRUCTOR_NELTS (gimple_assign_rhs1 (def_stmt)) == 0)
2121 tree base2;
2122 poly_int64 offset2, size2, maxsize2;
2123 bool reverse;
2124 base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
2125 &offset2, &size2, &maxsize2, &reverse);
2126 if (known_size_p (maxsize2)
2127 && known_eq (maxsize2, size2)
2128 && operand_equal_p (base, base2, 0)
2129 && known_subrange_p (offset, maxsize, offset2, size2))
2131 tree val = build_zero_cst (vr->type);
2132 return vn_reference_lookup_or_insert_for_pieces
2133 (vuse, vr->set, vr->type, vr->operands, val);
2137 /* 3) Assignment from a constant. We can use folds native encode/interpret
2138 routines to extract the assigned bits. */
2139 else if (known_eq (ref->size, maxsize)
2140 && is_gimple_reg_type (vr->type)
2141 && !contains_storage_order_barrier_p (vr->operands)
2142 && gimple_assign_single_p (def_stmt)
2143 && CHAR_BIT == 8 && BITS_PER_UNIT == 8
2144 /* native_encode and native_decode operate on arrays of bytes
2145 and so fundamentally need a compile-time size and offset. */
2146 && maxsize.is_constant (&maxsizei)
2147 && maxsizei % BITS_PER_UNIT == 0
2148 && offset.is_constant (&offseti)
2149 && offseti % BITS_PER_UNIT == 0
2150 && (is_gimple_min_invariant (gimple_assign_rhs1 (def_stmt))
2151 || (TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
2152 && is_gimple_min_invariant (SSA_VAL (gimple_assign_rhs1 (def_stmt))))))
2154 tree base2;
2155 HOST_WIDE_INT offset2, size2;
2156 bool reverse;
2157 base2 = get_ref_base_and_extent_hwi (gimple_assign_lhs (def_stmt),
2158 &offset2, &size2, &reverse);
2159 if (base2
2160 && !reverse
2161 && size2 % BITS_PER_UNIT == 0
2162 && offset2 % BITS_PER_UNIT == 0
2163 && operand_equal_p (base, base2, 0)
2164 && known_subrange_p (offseti, maxsizei, offset2, size2))
2166 /* We support up to 512-bit values (for V8DFmode). */
2167 unsigned char buffer[64];
2168 int len;
2170 tree rhs = gimple_assign_rhs1 (def_stmt);
2171 if (TREE_CODE (rhs) == SSA_NAME)
2172 rhs = SSA_VAL (rhs);
2173 len = native_encode_expr (gimple_assign_rhs1 (def_stmt),
2174 buffer, sizeof (buffer),
2175 (offseti - offset2) / BITS_PER_UNIT);
2176 if (len > 0 && len * BITS_PER_UNIT >= maxsizei)
2178 tree type = vr->type;
2179 /* Make sure to interpret in a type that has a range
2180 covering the whole access size. */
2181 if (INTEGRAL_TYPE_P (vr->type)
2182 && maxsizei != TYPE_PRECISION (vr->type))
2183 type = build_nonstandard_integer_type (maxsizei,
2184 TYPE_UNSIGNED (type));
2185 tree val = native_interpret_expr (type, buffer,
2186 maxsizei / BITS_PER_UNIT);
2187 /* If we chop off bits because the types precision doesn't
2188 match the memory access size this is ok when optimizing
2189 reads but not when called from the DSE code during
2190 elimination. */
2191 if (val
2192 && type != vr->type)
2194 if (! int_fits_type_p (val, vr->type))
2195 val = NULL_TREE;
2196 else
2197 val = fold_convert (vr->type, val);
2200 if (val)
2201 return vn_reference_lookup_or_insert_for_pieces
2202 (vuse, vr->set, vr->type, vr->operands, val);
2207 /* 4) Assignment from an SSA name which definition we may be able
2208 to access pieces from. */
2209 else if (known_eq (ref->size, maxsize)
2210 && is_gimple_reg_type (vr->type)
2211 && !contains_storage_order_barrier_p (vr->operands)
2212 && gimple_assign_single_p (def_stmt)
2213 && TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME)
2215 tree base2;
2216 poly_int64 offset2, size2, maxsize2;
2217 bool reverse;
2218 base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
2219 &offset2, &size2, &maxsize2,
2220 &reverse);
2221 if (!reverse
2222 && known_size_p (maxsize2)
2223 && known_eq (maxsize2, size2)
2224 && operand_equal_p (base, base2, 0)
2225 && known_subrange_p (offset, maxsize, offset2, size2)
2226 /* ??? We can't handle bitfield precision extracts without
2227 either using an alternate type for the BIT_FIELD_REF and
2228 then doing a conversion or possibly adjusting the offset
2229 according to endianness. */
2230 && (! INTEGRAL_TYPE_P (vr->type)
2231 || known_eq (ref->size, TYPE_PRECISION (vr->type)))
2232 && multiple_p (ref->size, BITS_PER_UNIT))
2234 gimple_match_op op (gimple_match_cond::UNCOND,
2235 BIT_FIELD_REF, vr->type,
2236 vn_valueize (gimple_assign_rhs1 (def_stmt)),
2237 bitsize_int (ref->size),
2238 bitsize_int (offset - offset2));
2239 tree val = vn_nary_build_or_lookup (&op);
2240 if (val
2241 && (TREE_CODE (val) != SSA_NAME
2242 || ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)))
2244 vn_reference_t res = vn_reference_lookup_or_insert_for_pieces
2245 (vuse, vr->set, vr->type, vr->operands, val);
2246 return res;
2251 /* 5) For aggregate copies translate the reference through them if
2252 the copy kills ref. */
2253 else if (vn_walk_kind == VN_WALKREWRITE
2254 && gimple_assign_single_p (def_stmt)
2255 && (DECL_P (gimple_assign_rhs1 (def_stmt))
2256 || TREE_CODE (gimple_assign_rhs1 (def_stmt)) == MEM_REF
2257 || handled_component_p (gimple_assign_rhs1 (def_stmt))))
2259 tree base2;
2260 int i, j, k;
2261 auto_vec<vn_reference_op_s> rhs;
2262 vn_reference_op_t vro;
2263 ao_ref r;
2265 if (!lhs_ref_ok)
2266 return (void *)-1;
2268 /* See if the assignment kills REF. */
2269 base2 = ao_ref_base (&lhs_ref);
2270 if (!lhs_ref.max_size_known_p ()
2271 || (base != base2
2272 && (TREE_CODE (base) != MEM_REF
2273 || TREE_CODE (base2) != MEM_REF
2274 || TREE_OPERAND (base, 0) != TREE_OPERAND (base2, 0)
2275 || !tree_int_cst_equal (TREE_OPERAND (base, 1),
2276 TREE_OPERAND (base2, 1))))
2277 || !stmt_kills_ref_p (def_stmt, ref))
2278 return (void *)-1;
2280 /* Find the common base of ref and the lhs. lhs_ops already
2281 contains valueized operands for the lhs. */
2282 i = vr->operands.length () - 1;
2283 j = lhs_ops.length () - 1;
2284 while (j >= 0 && i >= 0
2285 && vn_reference_op_eq (&vr->operands[i], &lhs_ops[j]))
2287 i--;
2288 j--;
2291 /* ??? The innermost op should always be a MEM_REF and we already
2292 checked that the assignment to the lhs kills vr. Thus for
2293 aggregate copies using char[] types the vn_reference_op_eq
2294 may fail when comparing types for compatibility. But we really
2295 don't care here - further lookups with the rewritten operands
2296 will simply fail if we messed up types too badly. */
2297 poly_int64 extra_off = 0;
2298 if (j == 0 && i >= 0
2299 && lhs_ops[0].opcode == MEM_REF
2300 && maybe_ne (lhs_ops[0].off, -1))
2302 if (known_eq (lhs_ops[0].off, vr->operands[i].off))
2303 i--, j--;
2304 else if (vr->operands[i].opcode == MEM_REF
2305 && maybe_ne (vr->operands[i].off, -1))
2307 extra_off = vr->operands[i].off - lhs_ops[0].off;
2308 i--, j--;
2312 /* i now points to the first additional op.
2313 ??? LHS may not be completely contained in VR, one or more
2314 VIEW_CONVERT_EXPRs could be in its way. We could at least
2315 try handling outermost VIEW_CONVERT_EXPRs. */
2316 if (j != -1)
2317 return (void *)-1;
2319 /* Punt if the additional ops contain a storage order barrier. */
2320 for (k = i; k >= 0; k--)
2322 vro = &vr->operands[k];
2323 if (vro->opcode == VIEW_CONVERT_EXPR && vro->reverse)
2324 return (void *)-1;
2327 /* Now re-write REF to be based on the rhs of the assignment. */
2328 copy_reference_ops_from_ref (gimple_assign_rhs1 (def_stmt), &rhs);
2330 /* Apply an extra offset to the inner MEM_REF of the RHS. */
2331 if (maybe_ne (extra_off, 0))
2333 if (rhs.length () < 2)
2334 return (void *)-1;
2335 int ix = rhs.length () - 2;
2336 if (rhs[ix].opcode != MEM_REF
2337 || known_eq (rhs[ix].off, -1))
2338 return (void *)-1;
2339 rhs[ix].off += extra_off;
2340 rhs[ix].op0 = int_const_binop (PLUS_EXPR, rhs[ix].op0,
2341 build_int_cst (TREE_TYPE (rhs[ix].op0),
2342 extra_off));
2345 /* We need to pre-pend vr->operands[0..i] to rhs. */
2346 vec<vn_reference_op_s> old = vr->operands;
2347 if (i + 1 + rhs.length () > vr->operands.length ())
2348 vr->operands.safe_grow (i + 1 + rhs.length ());
2349 else
2350 vr->operands.truncate (i + 1 + rhs.length ());
2351 FOR_EACH_VEC_ELT (rhs, j, vro)
2352 vr->operands[i + 1 + j] = *vro;
2353 vr->operands = valueize_refs (vr->operands);
2354 if (old == shared_lookup_references)
2355 shared_lookup_references = vr->operands;
2356 vr->hashcode = vn_reference_compute_hash (vr);
2358 /* Try folding the new reference to a constant. */
2359 tree val = fully_constant_vn_reference_p (vr);
2360 if (val)
2361 return vn_reference_lookup_or_insert_for_pieces
2362 (vuse, vr->set, vr->type, vr->operands, val);
2364 /* Adjust *ref from the new operands. */
2365 if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))
2366 return (void *)-1;
2367 /* This can happen with bitfields. */
2368 if (maybe_ne (ref->size, r.size))
2369 return (void *)-1;
2370 *ref = r;
2372 /* Do not update last seen VUSE after translating. */
2373 last_vuse_ptr = NULL;
2375 /* Keep looking for the adjusted *REF / VR pair. */
2376 return NULL;
2379 /* 6) For memcpy copies translate the reference through them if
2380 the copy kills ref. */
2381 else if (vn_walk_kind == VN_WALKREWRITE
2382 && is_gimple_reg_type (vr->type)
2383 /* ??? Handle BCOPY as well. */
2384 && (gimple_call_builtin_p (def_stmt, BUILT_IN_MEMCPY)
2385 || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMPCPY)
2386 || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMMOVE))
2387 && (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
2388 || TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME)
2389 && (TREE_CODE (gimple_call_arg (def_stmt, 1)) == ADDR_EXPR
2390 || TREE_CODE (gimple_call_arg (def_stmt, 1)) == SSA_NAME)
2391 && poly_int_tree_p (gimple_call_arg (def_stmt, 2), &copy_size))
2393 tree lhs, rhs;
2394 ao_ref r;
2395 poly_int64 rhs_offset, lhs_offset;
2396 vn_reference_op_s op;
2397 poly_uint64 mem_offset;
2398 poly_int64 at, byte_maxsize;
2400 /* Only handle non-variable, addressable refs. */
2401 if (maybe_ne (ref->size, maxsize)
2402 || !multiple_p (offset, BITS_PER_UNIT, &at)
2403 || !multiple_p (maxsize, BITS_PER_UNIT, &byte_maxsize))
2404 return (void *)-1;
2406 /* Extract a pointer base and an offset for the destination. */
2407 lhs = gimple_call_arg (def_stmt, 0);
2408 lhs_offset = 0;
2409 if (TREE_CODE (lhs) == SSA_NAME)
2411 lhs = vn_valueize (lhs);
2412 if (TREE_CODE (lhs) == SSA_NAME)
2414 gimple *def_stmt = SSA_NAME_DEF_STMT (lhs);
2415 if (gimple_assign_single_p (def_stmt)
2416 && gimple_assign_rhs_code (def_stmt) == ADDR_EXPR)
2417 lhs = gimple_assign_rhs1 (def_stmt);
2420 if (TREE_CODE (lhs) == ADDR_EXPR)
2422 tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (lhs, 0),
2423 &lhs_offset);
2424 if (!tem)
2425 return (void *)-1;
2426 if (TREE_CODE (tem) == MEM_REF
2427 && poly_int_tree_p (TREE_OPERAND (tem, 1), &mem_offset))
2429 lhs = TREE_OPERAND (tem, 0);
2430 if (TREE_CODE (lhs) == SSA_NAME)
2431 lhs = vn_valueize (lhs);
2432 lhs_offset += mem_offset;
2434 else if (DECL_P (tem))
2435 lhs = build_fold_addr_expr (tem);
2436 else
2437 return (void *)-1;
2439 if (TREE_CODE (lhs) != SSA_NAME
2440 && TREE_CODE (lhs) != ADDR_EXPR)
2441 return (void *)-1;
2443 /* Extract a pointer base and an offset for the source. */
2444 rhs = gimple_call_arg (def_stmt, 1);
2445 rhs_offset = 0;
2446 if (TREE_CODE (rhs) == SSA_NAME)
2447 rhs = vn_valueize (rhs);
2448 if (TREE_CODE (rhs) == ADDR_EXPR)
2450 tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs, 0),
2451 &rhs_offset);
2452 if (!tem)
2453 return (void *)-1;
2454 if (TREE_CODE (tem) == MEM_REF
2455 && poly_int_tree_p (TREE_OPERAND (tem, 1), &mem_offset))
2457 rhs = TREE_OPERAND (tem, 0);
2458 rhs_offset += mem_offset;
2460 else if (DECL_P (tem)
2461 || TREE_CODE (tem) == STRING_CST)
2462 rhs = build_fold_addr_expr (tem);
2463 else
2464 return (void *)-1;
2466 if (TREE_CODE (rhs) != SSA_NAME
2467 && TREE_CODE (rhs) != ADDR_EXPR)
2468 return (void *)-1;
2470 /* The bases of the destination and the references have to agree. */
2471 if (TREE_CODE (base) == MEM_REF)
2473 if (TREE_OPERAND (base, 0) != lhs
2474 || !poly_int_tree_p (TREE_OPERAND (base, 1), &mem_offset))
2475 return (void *) -1;
2476 at += mem_offset;
2478 else if (!DECL_P (base)
2479 || TREE_CODE (lhs) != ADDR_EXPR
2480 || TREE_OPERAND (lhs, 0) != base)
2481 return (void *)-1;
2483 /* If the access is completely outside of the memcpy destination
2484 area there is no aliasing. */
2485 if (!ranges_maybe_overlap_p (lhs_offset, copy_size, at, byte_maxsize))
2486 return NULL;
2487 /* And the access has to be contained within the memcpy destination. */
2488 if (!known_subrange_p (at, byte_maxsize, lhs_offset, copy_size))
2489 return (void *)-1;
2491 /* Make room for 2 operands in the new reference. */
2492 if (vr->operands.length () < 2)
2494 vec<vn_reference_op_s> old = vr->operands;
2495 vr->operands.safe_grow_cleared (2);
2496 if (old == shared_lookup_references)
2497 shared_lookup_references = vr->operands;
2499 else
2500 vr->operands.truncate (2);
2502 /* The looked-through reference is a simple MEM_REF. */
2503 memset (&op, 0, sizeof (op));
2504 op.type = vr->type;
2505 op.opcode = MEM_REF;
2506 op.op0 = build_int_cst (ptr_type_node, at - lhs_offset + rhs_offset);
2507 op.off = at - lhs_offset + rhs_offset;
2508 vr->operands[0] = op;
2509 op.type = TREE_TYPE (rhs);
2510 op.opcode = TREE_CODE (rhs);
2511 op.op0 = rhs;
2512 op.off = -1;
2513 vr->operands[1] = op;
2514 vr->hashcode = vn_reference_compute_hash (vr);
2516 /* Try folding the new reference to a constant. */
2517 tree val = fully_constant_vn_reference_p (vr);
2518 if (val)
2519 return vn_reference_lookup_or_insert_for_pieces
2520 (vuse, vr->set, vr->type, vr->operands, val);
2522 /* Adjust *ref from the new operands. */
2523 if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))
2524 return (void *)-1;
2525 /* This can happen with bitfields. */
2526 if (maybe_ne (ref->size, r.size))
2527 return (void *)-1;
2528 *ref = r;
2530 /* Do not update last seen VUSE after translating. */
2531 last_vuse_ptr = NULL;
2533 /* Keep looking for the adjusted *REF / VR pair. */
2534 return NULL;
2537 /* Bail out and stop walking. */
2538 return (void *)-1;
2541 /* Return a reference op vector from OP that can be used for
2542 vn_reference_lookup_pieces. The caller is responsible for releasing
2543 the vector. */
2545 vec<vn_reference_op_s>
2546 vn_reference_operands_for_lookup (tree op)
2548 bool valueized;
2549 return valueize_shared_reference_ops_from_ref (op, &valueized).copy ();
2552 /* Lookup a reference operation by it's parts, in the current hash table.
2553 Returns the resulting value number if it exists in the hash table,
2554 NULL_TREE otherwise. VNRESULT will be filled in with the actual
2555 vn_reference_t stored in the hashtable if something is found. */
2557 tree
2558 vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type,
2559 vec<vn_reference_op_s> operands,
2560 vn_reference_t *vnresult, vn_lookup_kind kind)
2562 struct vn_reference_s vr1;
2563 vn_reference_t tmp;
2564 tree cst;
2566 if (!vnresult)
2567 vnresult = &tmp;
2568 *vnresult = NULL;
2570 vr1.vuse = vuse_ssa_val (vuse);
2571 shared_lookup_references.truncate (0);
2572 shared_lookup_references.safe_grow (operands.length ());
2573 memcpy (shared_lookup_references.address (),
2574 operands.address (),
2575 sizeof (vn_reference_op_s)
2576 * operands.length ());
2577 vr1.operands = operands = shared_lookup_references
2578 = valueize_refs (shared_lookup_references);
2579 vr1.type = type;
2580 vr1.set = set;
2581 vr1.hashcode = vn_reference_compute_hash (&vr1);
2582 if ((cst = fully_constant_vn_reference_p (&vr1)))
2583 return cst;
2585 vn_reference_lookup_1 (&vr1, vnresult);
2586 if (!*vnresult
2587 && kind != VN_NOWALK
2588 && vr1.vuse)
2590 ao_ref r;
2591 vn_walk_kind = kind;
2592 if (ao_ref_init_from_vn_reference (&r, set, type, vr1.operands))
2593 *vnresult =
2594 (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
2595 vn_reference_lookup_2,
2596 vn_reference_lookup_3,
2597 vuse_valueize, &vr1);
2598 gcc_checking_assert (vr1.operands == shared_lookup_references);
2601 if (*vnresult)
2602 return (*vnresult)->result;
2604 return NULL_TREE;
2607 /* Lookup OP in the current hash table, and return the resulting value
2608 number if it exists in the hash table. Return NULL_TREE if it does
2609 not exist in the hash table or if the result field of the structure
2610 was NULL.. VNRESULT will be filled in with the vn_reference_t
2611 stored in the hashtable if one exists. When TBAA_P is false assume
2612 we are looking up a store and treat it as having alias-set zero. */
2614 tree
2615 vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
2616 vn_reference_t *vnresult, bool tbaa_p)
2618 vec<vn_reference_op_s> operands;
2619 struct vn_reference_s vr1;
2620 tree cst;
2621 bool valuezied_anything;
2623 if (vnresult)
2624 *vnresult = NULL;
2626 vr1.vuse = vuse_ssa_val (vuse);
2627 vr1.operands = operands
2628 = valueize_shared_reference_ops_from_ref (op, &valuezied_anything);
2629 vr1.type = TREE_TYPE (op);
2630 vr1.set = tbaa_p ? get_alias_set (op) : 0;
2631 vr1.hashcode = vn_reference_compute_hash (&vr1);
2632 if ((cst = fully_constant_vn_reference_p (&vr1)))
2633 return cst;
2635 if (kind != VN_NOWALK
2636 && vr1.vuse)
2638 vn_reference_t wvnresult;
2639 ao_ref r;
2640 /* Make sure to use a valueized reference if we valueized anything.
2641 Otherwise preserve the full reference for advanced TBAA. */
2642 if (!valuezied_anything
2643 || !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type,
2644 vr1.operands))
2645 ao_ref_init (&r, op);
2646 if (! tbaa_p)
2647 r.ref_alias_set = r.base_alias_set = 0;
2648 vn_walk_kind = kind;
2649 wvnresult =
2650 (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
2651 vn_reference_lookup_2,
2652 vn_reference_lookup_3,
2653 vuse_valueize, &vr1);
2654 gcc_checking_assert (vr1.operands == shared_lookup_references);
2655 if (wvnresult)
2657 if (vnresult)
2658 *vnresult = wvnresult;
2659 return wvnresult->result;
2662 return NULL_TREE;
2665 return vn_reference_lookup_1 (&vr1, vnresult);
2668 /* Lookup CALL in the current hash table and return the entry in
2669 *VNRESULT if found. Populates *VR for the hashtable lookup. */
2671 void
2672 vn_reference_lookup_call (gcall *call, vn_reference_t *vnresult,
2673 vn_reference_t vr)
2675 if (vnresult)
2676 *vnresult = NULL;
2678 tree vuse = gimple_vuse (call);
2680 vr->vuse = vuse ? SSA_VAL (vuse) : NULL_TREE;
2681 vr->operands = valueize_shared_reference_ops_from_call (call);
2682 vr->type = gimple_expr_type (call);
2683 vr->set = 0;
2684 vr->hashcode = vn_reference_compute_hash (vr);
2685 vn_reference_lookup_1 (vr, vnresult);
2688 /* Insert OP into the current hash table with a value number of RESULT. */
2690 static void
2691 vn_reference_insert (tree op, tree result, tree vuse, tree vdef)
2693 vn_reference_s **slot;
2694 vn_reference_t vr1;
2695 bool tem;
2697 vr1 = XOBNEW (&vn_tables_obstack, vn_reference_s);
2698 if (TREE_CODE (result) == SSA_NAME)
2699 vr1->value_id = VN_INFO (result)->value_id;
2700 else
2701 vr1->value_id = get_or_alloc_constant_value_id (result);
2702 vr1->vuse = vuse_ssa_val (vuse);
2703 vr1->operands = valueize_shared_reference_ops_from_ref (op, &tem).copy ();
2704 vr1->type = TREE_TYPE (op);
2705 vr1->set = get_alias_set (op);
2706 vr1->hashcode = vn_reference_compute_hash (vr1);
2707 vr1->result = TREE_CODE (result) == SSA_NAME ? SSA_VAL (result) : result;
2708 vr1->result_vdef = vdef;
2710 slot = valid_info->references->find_slot_with_hash (vr1, vr1->hashcode,
2711 INSERT);
2713 /* Because IL walking on reference lookup can end up visiting
2714 a def that is only to be visited later in iteration order
2715 when we are about to make an irreducible region reducible
2716 the def can be effectively processed and its ref being inserted
2717 by vn_reference_lookup_3 already. So we cannot assert (!*slot)
2718 but save a lookup if we deal with already inserted refs here. */
2719 if (*slot)
2721 /* We cannot assert that we have the same value either because
2722 when disentangling an irreducible region we may end up visiting
2723 a use before the corresponding def. That's a missed optimization
2724 only though. See gcc.dg/tree-ssa/pr87126.c for example. */
2725 if (dump_file && (dump_flags & TDF_DETAILS)
2726 && !operand_equal_p ((*slot)->result, vr1->result, 0))
2728 fprintf (dump_file, "Keeping old value ");
2729 print_generic_expr (dump_file, (*slot)->result);
2730 fprintf (dump_file, " because of collision\n");
2732 free_reference (vr1);
2733 obstack_free (&vn_tables_obstack, vr1);
2734 return;
2737 *slot = vr1;
2738 vr1->next = last_inserted_ref;
2739 last_inserted_ref = vr1;
2742 /* Insert a reference by it's pieces into the current hash table with
2743 a value number of RESULT. Return the resulting reference
2744 structure we created. */
2746 vn_reference_t
2747 vn_reference_insert_pieces (tree vuse, alias_set_type set, tree type,
2748 vec<vn_reference_op_s> operands,
2749 tree result, unsigned int value_id)
2752 vn_reference_s **slot;
2753 vn_reference_t vr1;
2755 vr1 = XOBNEW (&vn_tables_obstack, vn_reference_s);
2756 vr1->value_id = value_id;
2757 vr1->vuse = vuse_ssa_val (vuse);
2758 vr1->operands = valueize_refs (operands);
2759 vr1->type = type;
2760 vr1->set = set;
2761 vr1->hashcode = vn_reference_compute_hash (vr1);
2762 if (result && TREE_CODE (result) == SSA_NAME)
2763 result = SSA_VAL (result);
2764 vr1->result = result;
2766 slot = valid_info->references->find_slot_with_hash (vr1, vr1->hashcode,
2767 INSERT);
2769 /* At this point we should have all the things inserted that we have
2770 seen before, and we should never try inserting something that
2771 already exists. */
2772 gcc_assert (!*slot);
2774 *slot = vr1;
2775 vr1->next = last_inserted_ref;
2776 last_inserted_ref = vr1;
2777 return vr1;
2780 /* Compute and return the hash value for nary operation VBO1. */
2782 static hashval_t
2783 vn_nary_op_compute_hash (const vn_nary_op_t vno1)
2785 inchash::hash hstate;
2786 unsigned i;
2788 for (i = 0; i < vno1->length; ++i)
2789 if (TREE_CODE (vno1->op[i]) == SSA_NAME)
2790 vno1->op[i] = SSA_VAL (vno1->op[i]);
2792 if (((vno1->length == 2
2793 && commutative_tree_code (vno1->opcode))
2794 || (vno1->length == 3
2795 && commutative_ternary_tree_code (vno1->opcode)))
2796 && tree_swap_operands_p (vno1->op[0], vno1->op[1]))
2797 std::swap (vno1->op[0], vno1->op[1]);
2798 else if (TREE_CODE_CLASS (vno1->opcode) == tcc_comparison
2799 && tree_swap_operands_p (vno1->op[0], vno1->op[1]))
2801 std::swap (vno1->op[0], vno1->op[1]);
2802 vno1->opcode = swap_tree_comparison (vno1->opcode);
2805 hstate.add_int (vno1->opcode);
2806 for (i = 0; i < vno1->length; ++i)
2807 inchash::add_expr (vno1->op[i], hstate);
2809 return hstate.end ();
2812 /* Compare nary operations VNO1 and VNO2 and return true if they are
2813 equivalent. */
2815 bool
2816 vn_nary_op_eq (const_vn_nary_op_t const vno1, const_vn_nary_op_t const vno2)
2818 unsigned i;
2820 if (vno1->hashcode != vno2->hashcode)
2821 return false;
2823 if (vno1->length != vno2->length)
2824 return false;
2826 if (vno1->opcode != vno2->opcode
2827 || !types_compatible_p (vno1->type, vno2->type))
2828 return false;
2830 for (i = 0; i < vno1->length; ++i)
2831 if (!expressions_equal_p (vno1->op[i], vno2->op[i]))
2832 return false;
2834 /* BIT_INSERT_EXPR has an implict operand as the type precision
2835 of op1. Need to check to make sure they are the same. */
2836 if (vno1->opcode == BIT_INSERT_EXPR
2837 && TREE_CODE (vno1->op[1]) == INTEGER_CST
2838 && TYPE_PRECISION (TREE_TYPE (vno1->op[1]))
2839 != TYPE_PRECISION (TREE_TYPE (vno2->op[1])))
2840 return false;
2842 return true;
2845 /* Initialize VNO from the pieces provided. */
2847 static void
2848 init_vn_nary_op_from_pieces (vn_nary_op_t vno, unsigned int length,
2849 enum tree_code code, tree type, tree *ops)
2851 vno->opcode = code;
2852 vno->length = length;
2853 vno->type = type;
2854 memcpy (&vno->op[0], ops, sizeof (tree) * length);
2857 /* Initialize VNO from OP. */
2859 static void
2860 init_vn_nary_op_from_op (vn_nary_op_t vno, tree op)
2862 unsigned i;
2864 vno->opcode = TREE_CODE (op);
2865 vno->length = TREE_CODE_LENGTH (TREE_CODE (op));
2866 vno->type = TREE_TYPE (op);
2867 for (i = 0; i < vno->length; ++i)
2868 vno->op[i] = TREE_OPERAND (op, i);
2871 /* Return the number of operands for a vn_nary ops structure from STMT. */
2873 static unsigned int
2874 vn_nary_length_from_stmt (gimple *stmt)
2876 switch (gimple_assign_rhs_code (stmt))
2878 case REALPART_EXPR:
2879 case IMAGPART_EXPR:
2880 case VIEW_CONVERT_EXPR:
2881 return 1;
2883 case BIT_FIELD_REF:
2884 return 3;
2886 case CONSTRUCTOR:
2887 return CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt));
2889 default:
2890 return gimple_num_ops (stmt) - 1;
2894 /* Initialize VNO from STMT. */
2896 static void
2897 init_vn_nary_op_from_stmt (vn_nary_op_t vno, gimple *stmt)
2899 unsigned i;
2901 vno->opcode = gimple_assign_rhs_code (stmt);
2902 vno->type = gimple_expr_type (stmt);
2903 switch (vno->opcode)
2905 case REALPART_EXPR:
2906 case IMAGPART_EXPR:
2907 case VIEW_CONVERT_EXPR:
2908 vno->length = 1;
2909 vno->op[0] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
2910 break;
2912 case BIT_FIELD_REF:
2913 vno->length = 3;
2914 vno->op[0] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
2915 vno->op[1] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 1);
2916 vno->op[2] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 2);
2917 break;
2919 case CONSTRUCTOR:
2920 vno->length = CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt));
2921 for (i = 0; i < vno->length; ++i)
2922 vno->op[i] = CONSTRUCTOR_ELT (gimple_assign_rhs1 (stmt), i)->value;
2923 break;
2925 default:
2926 gcc_checking_assert (!gimple_assign_single_p (stmt));
2927 vno->length = gimple_num_ops (stmt) - 1;
2928 for (i = 0; i < vno->length; ++i)
2929 vno->op[i] = gimple_op (stmt, i + 1);
2933 /* Compute the hashcode for VNO and look for it in the hash table;
2934 return the resulting value number if it exists in the hash table.
2935 Return NULL_TREE if it does not exist in the hash table or if the
2936 result field of the operation is NULL. VNRESULT will contain the
2937 vn_nary_op_t from the hashtable if it exists. */
2939 static tree
2940 vn_nary_op_lookup_1 (vn_nary_op_t vno, vn_nary_op_t *vnresult)
2942 vn_nary_op_s **slot;
2944 if (vnresult)
2945 *vnresult = NULL;
2947 vno->hashcode = vn_nary_op_compute_hash (vno);
2948 slot = valid_info->nary->find_slot_with_hash (vno, vno->hashcode, NO_INSERT);
2949 if (!slot)
2950 return NULL_TREE;
2951 if (vnresult)
2952 *vnresult = *slot;
2953 return (*slot)->predicated_values ? NULL_TREE : (*slot)->u.result;
2956 /* Lookup a n-ary operation by its pieces and return the resulting value
2957 number if it exists in the hash table. Return NULL_TREE if it does
2958 not exist in the hash table or if the result field of the operation
2959 is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
2960 if it exists. */
2962 tree
2963 vn_nary_op_lookup_pieces (unsigned int length, enum tree_code code,
2964 tree type, tree *ops, vn_nary_op_t *vnresult)
2966 vn_nary_op_t vno1 = XALLOCAVAR (struct vn_nary_op_s,
2967 sizeof_vn_nary_op (length));
2968 init_vn_nary_op_from_pieces (vno1, length, code, type, ops);
2969 return vn_nary_op_lookup_1 (vno1, vnresult);
2972 /* Lookup OP in the current hash table, and return the resulting value
2973 number if it exists in the hash table. Return NULL_TREE if it does
2974 not exist in the hash table or if the result field of the operation
2975 is NULL. VNRESULT will contain the vn_nary_op_t from the hashtable
2976 if it exists. */
2978 tree
2979 vn_nary_op_lookup (tree op, vn_nary_op_t *vnresult)
2981 vn_nary_op_t vno1
2982 = XALLOCAVAR (struct vn_nary_op_s,
2983 sizeof_vn_nary_op (TREE_CODE_LENGTH (TREE_CODE (op))));
2984 init_vn_nary_op_from_op (vno1, op);
2985 return vn_nary_op_lookup_1 (vno1, vnresult);
2988 /* Lookup the rhs of STMT in the current hash table, and return the resulting
2989 value number if it exists in the hash table. Return NULL_TREE if
2990 it does not exist in the hash table. VNRESULT will contain the
2991 vn_nary_op_t from the hashtable if it exists. */
2993 tree
2994 vn_nary_op_lookup_stmt (gimple *stmt, vn_nary_op_t *vnresult)
2996 vn_nary_op_t vno1
2997 = XALLOCAVAR (struct vn_nary_op_s,
2998 sizeof_vn_nary_op (vn_nary_length_from_stmt (stmt)));
2999 init_vn_nary_op_from_stmt (vno1, stmt);
3000 return vn_nary_op_lookup_1 (vno1, vnresult);
3003 /* Allocate a vn_nary_op_t with LENGTH operands on STACK. */
3005 static vn_nary_op_t
3006 alloc_vn_nary_op_noinit (unsigned int length, struct obstack *stack)
3008 return (vn_nary_op_t) obstack_alloc (stack, sizeof_vn_nary_op (length));
3011 /* Allocate and initialize a vn_nary_op_t on CURRENT_INFO's
3012 obstack. */
3014 static vn_nary_op_t
3015 alloc_vn_nary_op (unsigned int length, tree result, unsigned int value_id)
3017 vn_nary_op_t vno1 = alloc_vn_nary_op_noinit (length, &vn_tables_obstack);
3019 vno1->value_id = value_id;
3020 vno1->length = length;
3021 vno1->predicated_values = 0;
3022 vno1->u.result = result;
3024 return vno1;
3027 /* Insert VNO into TABLE. If COMPUTE_HASH is true, then compute
3028 VNO->HASHCODE first. */
3030 static vn_nary_op_t
3031 vn_nary_op_insert_into (vn_nary_op_t vno, vn_nary_op_table_type *table,
3032 bool compute_hash)
3034 vn_nary_op_s **slot;
3036 if (compute_hash)
3038 vno->hashcode = vn_nary_op_compute_hash (vno);
3039 gcc_assert (! vno->predicated_values
3040 || (! vno->u.values->next
3041 && vno->u.values->n == 1));
3044 slot = table->find_slot_with_hash (vno, vno->hashcode, INSERT);
3045 vno->unwind_to = *slot;
3046 if (*slot)
3048 /* Prefer non-predicated values.
3049 ??? Only if those are constant, otherwise, with constant predicated
3050 value, turn them into predicated values with entry-block validity
3051 (??? but we always find the first valid result currently). */
3052 if ((*slot)->predicated_values
3053 && ! vno->predicated_values)
3055 /* ??? We cannot remove *slot from the unwind stack list.
3056 For the moment we deal with this by skipping not found
3057 entries but this isn't ideal ... */
3058 *slot = vno;
3059 /* ??? Maintain a stack of states we can unwind in
3060 vn_nary_op_s? But how far do we unwind? In reality
3061 we need to push change records somewhere... Or not
3062 unwind vn_nary_op_s and linking them but instead
3063 unwind the results "list", linking that, which also
3064 doesn't move on hashtable resize. */
3065 /* We can also have a ->unwind_to recording *slot there.
3066 That way we can make u.values a fixed size array with
3067 recording the number of entries but of course we then
3068 have always N copies for each unwind_to-state. Or we
3069 make sure to only ever append and each unwinding will
3070 pop off one entry (but how to deal with predicated
3071 replaced with non-predicated here?) */
3072 vno->next = last_inserted_nary;
3073 last_inserted_nary = vno;
3074 return vno;
3076 else if (vno->predicated_values
3077 && ! (*slot)->predicated_values)
3078 return *slot;
3079 else if (vno->predicated_values
3080 && (*slot)->predicated_values)
3082 /* ??? Factor this all into a insert_single_predicated_value
3083 routine. */
3084 gcc_assert (!vno->u.values->next && vno->u.values->n == 1);
3085 basic_block vno_bb
3086 = BASIC_BLOCK_FOR_FN (cfun, vno->u.values->valid_dominated_by_p[0]);
3087 vn_pval *nval = vno->u.values;
3088 vn_pval **next = &vno->u.values;
3089 bool found = false;
3090 for (vn_pval *val = (*slot)->u.values; val; val = val->next)
3092 if (expressions_equal_p (val->result, vno->u.values->result))
3094 found = true;
3095 for (unsigned i = 0; i < val->n; ++i)
3097 basic_block val_bb
3098 = BASIC_BLOCK_FOR_FN (cfun,
3099 val->valid_dominated_by_p[i]);
3100 if (dominated_by_p (CDI_DOMINATORS, vno_bb, val_bb))
3101 /* Value registered with more generic predicate. */
3102 return *slot;
3103 else if (dominated_by_p (CDI_DOMINATORS, val_bb, vno_bb))
3104 /* Shouldn't happen, we insert in RPO order. */
3105 gcc_unreachable ();
3107 /* Append value. */
3108 *next = (vn_pval *) obstack_alloc (&vn_tables_obstack,
3109 sizeof (vn_pval)
3110 + val->n * sizeof (int));
3111 (*next)->next = NULL;
3112 (*next)->result = val->result;
3113 (*next)->n = val->n + 1;
3114 memcpy ((*next)->valid_dominated_by_p,
3115 val->valid_dominated_by_p,
3116 val->n * sizeof (int));
3117 (*next)->valid_dominated_by_p[val->n] = vno_bb->index;
3118 next = &(*next)->next;
3119 if (dump_file && (dump_flags & TDF_DETAILS))
3120 fprintf (dump_file, "Appending predicate to value.\n");
3121 continue;
3123 /* Copy other predicated values. */
3124 *next = (vn_pval *) obstack_alloc (&vn_tables_obstack,
3125 sizeof (vn_pval)
3126 + (val->n-1) * sizeof (int));
3127 memcpy (*next, val, sizeof (vn_pval) + (val->n-1) * sizeof (int));
3128 (*next)->next = NULL;
3129 next = &(*next)->next;
3131 if (!found)
3132 *next = nval;
3134 *slot = vno;
3135 vno->next = last_inserted_nary;
3136 last_inserted_nary = vno;
3137 return vno;
3140 /* While we do not want to insert things twice it's awkward to
3141 avoid it in the case where visit_nary_op pattern-matches stuff
3142 and ends up simplifying the replacement to itself. We then
3143 get two inserts, one from visit_nary_op and one from
3144 vn_nary_build_or_lookup.
3145 So allow inserts with the same value number. */
3146 if ((*slot)->u.result == vno->u.result)
3147 return *slot;
3150 /* ??? There's also optimistic vs. previous commited state merging
3151 that is problematic for the case of unwinding. */
3153 /* ??? We should return NULL if we do not use 'vno' and have the
3154 caller release it. */
3155 gcc_assert (!*slot);
3157 *slot = vno;
3158 vno->next = last_inserted_nary;
3159 last_inserted_nary = vno;
3160 return vno;
3163 /* Insert a n-ary operation into the current hash table using it's
3164 pieces. Return the vn_nary_op_t structure we created and put in
3165 the hashtable. */
3167 vn_nary_op_t
3168 vn_nary_op_insert_pieces (unsigned int length, enum tree_code code,
3169 tree type, tree *ops,
3170 tree result, unsigned int value_id)
3172 vn_nary_op_t vno1 = alloc_vn_nary_op (length, result, value_id);
3173 init_vn_nary_op_from_pieces (vno1, length, code, type, ops);
3174 return vn_nary_op_insert_into (vno1, valid_info->nary, true);
3177 static vn_nary_op_t
3178 vn_nary_op_insert_pieces_predicated (unsigned int length, enum tree_code code,
3179 tree type, tree *ops,
3180 tree result, unsigned int value_id,
3181 edge pred_e)
3183 /* ??? Currently tracking BBs. */
3184 if (! single_pred_p (pred_e->dest))
3186 /* Never record for backedges. */
3187 if (pred_e->flags & EDGE_DFS_BACK)
3188 return NULL;
3189 edge_iterator ei;
3190 edge e;
3191 int cnt = 0;
3192 /* Ignore backedges. */
3193 FOR_EACH_EDGE (e, ei, pred_e->dest->preds)
3194 if (! dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
3195 cnt++;
3196 if (cnt != 1)
3197 return NULL;
3199 if (dump_file && (dump_flags & TDF_DETAILS)
3200 /* ??? Fix dumping, but currently we only get comparisons. */
3201 && TREE_CODE_CLASS (code) == tcc_comparison)
3203 fprintf (dump_file, "Recording on edge %d->%d ", pred_e->src->index,
3204 pred_e->dest->index);
3205 print_generic_expr (dump_file, ops[0], TDF_SLIM);
3206 fprintf (dump_file, " %s ", get_tree_code_name (code));
3207 print_generic_expr (dump_file, ops[1], TDF_SLIM);
3208 fprintf (dump_file, " == %s\n",
3209 integer_zerop (result) ? "false" : "true");
3211 vn_nary_op_t vno1 = alloc_vn_nary_op (length, NULL_TREE, value_id);
3212 init_vn_nary_op_from_pieces (vno1, length, code, type, ops);
3213 vno1->predicated_values = 1;
3214 vno1->u.values = (vn_pval *) obstack_alloc (&vn_tables_obstack,
3215 sizeof (vn_pval));
3216 vno1->u.values->next = NULL;
3217 vno1->u.values->result = result;
3218 vno1->u.values->n = 1;
3219 vno1->u.values->valid_dominated_by_p[0] = pred_e->dest->index;
3220 return vn_nary_op_insert_into (vno1, valid_info->nary, true);
3223 static bool
3224 dominated_by_p_w_unex (basic_block bb1, basic_block bb2);
3226 static tree
3227 vn_nary_op_get_predicated_value (vn_nary_op_t vno, basic_block bb)
3229 if (! vno->predicated_values)
3230 return vno->u.result;
3231 for (vn_pval *val = vno->u.values; val; val = val->next)
3232 for (unsigned i = 0; i < val->n; ++i)
3233 if (dominated_by_p_w_unex (bb,
3234 BASIC_BLOCK_FOR_FN
3235 (cfun, val->valid_dominated_by_p[i])))
3236 return val->result;
3237 return NULL_TREE;
3240 /* Insert OP into the current hash table with a value number of
3241 RESULT. Return the vn_nary_op_t structure we created and put in
3242 the hashtable. */
3244 vn_nary_op_t
3245 vn_nary_op_insert (tree op, tree result)
3247 unsigned length = TREE_CODE_LENGTH (TREE_CODE (op));
3248 vn_nary_op_t vno1;
3250 vno1 = alloc_vn_nary_op (length, result, VN_INFO (result)->value_id);
3251 init_vn_nary_op_from_op (vno1, op);
3252 return vn_nary_op_insert_into (vno1, valid_info->nary, true);
3255 /* Insert the rhs of STMT into the current hash table with a value number of
3256 RESULT. */
3258 static vn_nary_op_t
3259 vn_nary_op_insert_stmt (gimple *stmt, tree result)
3261 vn_nary_op_t vno1
3262 = alloc_vn_nary_op (vn_nary_length_from_stmt (stmt),
3263 result, VN_INFO (result)->value_id);
3264 init_vn_nary_op_from_stmt (vno1, stmt);
3265 return vn_nary_op_insert_into (vno1, valid_info->nary, true);
3268 /* Compute a hashcode for PHI operation VP1 and return it. */
3270 static inline hashval_t
3271 vn_phi_compute_hash (vn_phi_t vp1)
3273 inchash::hash hstate (EDGE_COUNT (vp1->block->preds) > 2
3274 ? vp1->block->index : EDGE_COUNT (vp1->block->preds));
3275 tree phi1op;
3276 tree type;
3277 edge e;
3278 edge_iterator ei;
3280 /* If all PHI arguments are constants we need to distinguish
3281 the PHI node via its type. */
3282 type = vp1->type;
3283 hstate.merge_hash (vn_hash_type (type));
3285 FOR_EACH_EDGE (e, ei, vp1->block->preds)
3287 /* Don't hash backedge values they need to be handled as VN_TOP
3288 for optimistic value-numbering. */
3289 if (e->flags & EDGE_DFS_BACK)
3290 continue;
3292 phi1op = vp1->phiargs[e->dest_idx];
3293 if (phi1op == VN_TOP)
3294 continue;
3295 inchash::add_expr (phi1op, hstate);
3298 return hstate.end ();
3302 /* Return true if COND1 and COND2 represent the same condition, set
3303 *INVERTED_P if one needs to be inverted to make it the same as
3304 the other. */
3306 static bool
3307 cond_stmts_equal_p (gcond *cond1, tree lhs1, tree rhs1,
3308 gcond *cond2, tree lhs2, tree rhs2, bool *inverted_p)
3310 enum tree_code code1 = gimple_cond_code (cond1);
3311 enum tree_code code2 = gimple_cond_code (cond2);
3313 *inverted_p = false;
3314 if (code1 == code2)
3316 else if (code1 == swap_tree_comparison (code2))
3317 std::swap (lhs2, rhs2);
3318 else if (code1 == invert_tree_comparison (code2, HONOR_NANS (lhs2)))
3319 *inverted_p = true;
3320 else if (code1 == invert_tree_comparison
3321 (swap_tree_comparison (code2), HONOR_NANS (lhs2)))
3323 std::swap (lhs2, rhs2);
3324 *inverted_p = true;
3326 else
3327 return false;
3329 return ((expressions_equal_p (lhs1, lhs2)
3330 && expressions_equal_p (rhs1, rhs2))
3331 || (commutative_tree_code (code1)
3332 && expressions_equal_p (lhs1, rhs2)
3333 && expressions_equal_p (rhs1, lhs2)));
3336 /* Compare two phi entries for equality, ignoring VN_TOP arguments. */
3338 static int
3339 vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2)
3341 if (vp1->hashcode != vp2->hashcode)
3342 return false;
3344 if (vp1->block != vp2->block)
3346 if (EDGE_COUNT (vp1->block->preds) != EDGE_COUNT (vp2->block->preds))
3347 return false;
3349 switch (EDGE_COUNT (vp1->block->preds))
3351 case 1:
3352 /* Single-arg PHIs are just copies. */
3353 break;
3355 case 2:
3357 /* Rule out backedges into the PHI. */
3358 if (vp1->block->loop_father->header == vp1->block
3359 || vp2->block->loop_father->header == vp2->block)
3360 return false;
3362 /* If the PHI nodes do not have compatible types
3363 they are not the same. */
3364 if (!types_compatible_p (vp1->type, vp2->type))
3365 return false;
3367 basic_block idom1
3368 = get_immediate_dominator (CDI_DOMINATORS, vp1->block);
3369 basic_block idom2
3370 = get_immediate_dominator (CDI_DOMINATORS, vp2->block);
3371 /* If the immediate dominator end in switch stmts multiple
3372 values may end up in the same PHI arg via intermediate
3373 CFG merges. */
3374 if (EDGE_COUNT (idom1->succs) != 2
3375 || EDGE_COUNT (idom2->succs) != 2)
3376 return false;
3378 /* Verify the controlling stmt is the same. */
3379 gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1));
3380 gcond *last2 = safe_dyn_cast <gcond *> (last_stmt (idom2));
3381 if (! last1 || ! last2)
3382 return false;
3383 bool inverted_p;
3384 if (! cond_stmts_equal_p (last1, vp1->cclhs, vp1->ccrhs,
3385 last2, vp2->cclhs, vp2->ccrhs,
3386 &inverted_p))
3387 return false;
3389 /* Get at true/false controlled edges into the PHI. */
3390 edge te1, te2, fe1, fe2;
3391 if (! extract_true_false_controlled_edges (idom1, vp1->block,
3392 &te1, &fe1)
3393 || ! extract_true_false_controlled_edges (idom2, vp2->block,
3394 &te2, &fe2))
3395 return false;
3397 /* Swap edges if the second condition is the inverted of the
3398 first. */
3399 if (inverted_p)
3400 std::swap (te2, fe2);
3402 /* ??? Handle VN_TOP specially. */
3403 if (! expressions_equal_p (vp1->phiargs[te1->dest_idx],
3404 vp2->phiargs[te2->dest_idx])
3405 || ! expressions_equal_p (vp1->phiargs[fe1->dest_idx],
3406 vp2->phiargs[fe2->dest_idx]))
3407 return false;
3409 return true;
3412 default:
3413 return false;
3417 /* If the PHI nodes do not have compatible types
3418 they are not the same. */
3419 if (!types_compatible_p (vp1->type, vp2->type))
3420 return false;
3422 /* Any phi in the same block will have it's arguments in the
3423 same edge order, because of how we store phi nodes. */
3424 for (unsigned i = 0; i < EDGE_COUNT (vp1->block->preds); ++i)
3426 tree phi1op = vp1->phiargs[i];
3427 tree phi2op = vp2->phiargs[i];
3428 if (phi1op == VN_TOP || phi2op == VN_TOP)
3429 continue;
3430 if (!expressions_equal_p (phi1op, phi2op))
3431 return false;
3434 return true;
3437 /* Lookup PHI in the current hash table, and return the resulting
3438 value number if it exists in the hash table. Return NULL_TREE if
3439 it does not exist in the hash table. */
3441 static tree
3442 vn_phi_lookup (gimple *phi, bool backedges_varying_p)
3444 vn_phi_s **slot;
3445 struct vn_phi_s *vp1;
3446 edge e;
3447 edge_iterator ei;
3449 vp1 = XALLOCAVAR (struct vn_phi_s,
3450 sizeof (struct vn_phi_s)
3451 + (gimple_phi_num_args (phi) - 1) * sizeof (tree));
3453 /* Canonicalize the SSA_NAME's to their value number. */
3454 FOR_EACH_EDGE (e, ei, gimple_bb (phi)->preds)
3456 tree def = PHI_ARG_DEF_FROM_EDGE (phi, e);
3457 if (TREE_CODE (def) == SSA_NAME
3458 && (!backedges_varying_p || !(e->flags & EDGE_DFS_BACK)))
3459 def = SSA_VAL (def);
3460 vp1->phiargs[e->dest_idx] = def;
3462 vp1->type = TREE_TYPE (gimple_phi_result (phi));
3463 vp1->block = gimple_bb (phi);
3464 /* Extract values of the controlling condition. */
3465 vp1->cclhs = NULL_TREE;
3466 vp1->ccrhs = NULL_TREE;
3467 basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1->block);
3468 if (EDGE_COUNT (idom1->succs) == 2)
3469 if (gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1)))
3471 /* ??? We want to use SSA_VAL here. But possibly not
3472 allow VN_TOP. */
3473 vp1->cclhs = vn_valueize (gimple_cond_lhs (last1));
3474 vp1->ccrhs = vn_valueize (gimple_cond_rhs (last1));
3476 vp1->hashcode = vn_phi_compute_hash (vp1);
3477 slot = valid_info->phis->find_slot_with_hash (vp1, vp1->hashcode, NO_INSERT);
3478 if (!slot)
3479 return NULL_TREE;
3480 return (*slot)->result;
3483 /* Insert PHI into the current hash table with a value number of
3484 RESULT. */
3486 static vn_phi_t
3487 vn_phi_insert (gimple *phi, tree result, bool backedges_varying_p)
3489 vn_phi_s **slot;
3490 vn_phi_t vp1 = (vn_phi_t) obstack_alloc (&vn_tables_obstack,
3491 sizeof (vn_phi_s)
3492 + ((gimple_phi_num_args (phi) - 1)
3493 * sizeof (tree)));
3494 edge e;
3495 edge_iterator ei;
3497 /* Canonicalize the SSA_NAME's to their value number. */
3498 FOR_EACH_EDGE (e, ei, gimple_bb (phi)->preds)
3500 tree def = PHI_ARG_DEF_FROM_EDGE (phi, e);
3501 if (TREE_CODE (def) == SSA_NAME
3502 && (!backedges_varying_p || !(e->flags & EDGE_DFS_BACK)))
3503 def = SSA_VAL (def);
3504 vp1->phiargs[e->dest_idx] = def;
3506 vp1->value_id = VN_INFO (result)->value_id;
3507 vp1->type = TREE_TYPE (gimple_phi_result (phi));
3508 vp1->block = gimple_bb (phi);
3509 /* Extract values of the controlling condition. */
3510 vp1->cclhs = NULL_TREE;
3511 vp1->ccrhs = NULL_TREE;
3512 basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1->block);
3513 if (EDGE_COUNT (idom1->succs) == 2)
3514 if (gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1)))
3516 /* ??? We want to use SSA_VAL here. But possibly not
3517 allow VN_TOP. */
3518 vp1->cclhs = vn_valueize (gimple_cond_lhs (last1));
3519 vp1->ccrhs = vn_valueize (gimple_cond_rhs (last1));
3521 vp1->result = result;
3522 vp1->hashcode = vn_phi_compute_hash (vp1);
3524 slot = valid_info->phis->find_slot_with_hash (vp1, vp1->hashcode, INSERT);
3525 gcc_assert (!*slot);
3527 *slot = vp1;
3528 vp1->next = last_inserted_phi;
3529 last_inserted_phi = vp1;
3530 return vp1;
3534 /* Return true if BB1 is dominated by BB2 taking into account edges
3535 that are not executable. */
3537 static bool
3538 dominated_by_p_w_unex (basic_block bb1, basic_block bb2)
3540 edge_iterator ei;
3541 edge e;
3543 if (dominated_by_p (CDI_DOMINATORS, bb1, bb2))
3544 return true;
3546 /* Before iterating we'd like to know if there exists a
3547 (executable) path from bb2 to bb1 at all, if not we can
3548 directly return false. For now simply iterate once. */
3550 /* Iterate to the single executable bb1 predecessor. */
3551 if (EDGE_COUNT (bb1->preds) > 1)
3553 edge prede = NULL;
3554 FOR_EACH_EDGE (e, ei, bb1->preds)
3555 if (e->flags & EDGE_EXECUTABLE)
3557 if (prede)
3559 prede = NULL;
3560 break;
3562 prede = e;
3564 if (prede)
3566 bb1 = prede->src;
3568 /* Re-do the dominance check with changed bb1. */
3569 if (dominated_by_p (CDI_DOMINATORS, bb1, bb2))
3570 return true;
3574 /* Iterate to the single executable bb2 successor. */
3575 edge succe = NULL;
3576 FOR_EACH_EDGE (e, ei, bb2->succs)
3577 if (e->flags & EDGE_EXECUTABLE)
3579 if (succe)
3581 succe = NULL;
3582 break;
3584 succe = e;
3586 if (succe)
3588 /* Verify the reached block is only reached through succe.
3589 If there is only one edge we can spare us the dominator
3590 check and iterate directly. */
3591 if (EDGE_COUNT (succe->dest->preds) > 1)
3593 FOR_EACH_EDGE (e, ei, succe->dest->preds)
3594 if (e != succe
3595 && (e->flags & EDGE_EXECUTABLE))
3597 succe = NULL;
3598 break;
3601 if (succe)
3603 bb2 = succe->dest;
3605 /* Re-do the dominance check with changed bb2. */
3606 if (dominated_by_p (CDI_DOMINATORS, bb1, bb2))
3607 return true;
3611 /* We could now iterate updating bb1 / bb2. */
3612 return false;
3615 /* Set the value number of FROM to TO, return true if it has changed
3616 as a result. */
3618 static inline bool
3619 set_ssa_val_to (tree from, tree to)
3621 vn_ssa_aux_t from_info = VN_INFO (from);
3622 tree currval = from_info->valnum; // SSA_VAL (from)
3623 poly_int64 toff, coff;
3625 /* The only thing we allow as value numbers are ssa_names
3626 and invariants. So assert that here. We don't allow VN_TOP
3627 as visiting a stmt should produce a value-number other than
3628 that.
3629 ??? Still VN_TOP can happen for unreachable code, so force
3630 it to varying in that case. Not all code is prepared to
3631 get VN_TOP on valueization. */
3632 if (to == VN_TOP)
3634 /* ??? When iterating and visiting PHI <undef, backedge-value>
3635 for the first time we rightfully get VN_TOP and we need to
3636 preserve that to optimize for example gcc.dg/tree-ssa/ssa-sccvn-2.c.
3637 With SCCVN we were simply lucky we iterated the other PHI
3638 cycles first and thus visited the backedge-value DEF. */
3639 if (currval == VN_TOP)
3640 goto set_and_exit;
3641 if (dump_file && (dump_flags & TDF_DETAILS))
3642 fprintf (dump_file, "Forcing value number to varying on "
3643 "receiving VN_TOP\n");
3644 to = from;
3647 gcc_checking_assert (to != NULL_TREE
3648 && ((TREE_CODE (to) == SSA_NAME
3649 && (to == from || SSA_VAL (to) == to))
3650 || is_gimple_min_invariant (to)));
3652 if (from != to)
3654 if (currval == from)
3656 if (dump_file && (dump_flags & TDF_DETAILS))
3658 fprintf (dump_file, "Not changing value number of ");
3659 print_generic_expr (dump_file, from);
3660 fprintf (dump_file, " from VARYING to ");
3661 print_generic_expr (dump_file, to);
3662 fprintf (dump_file, "\n");
3664 return false;
3666 else if (currval != VN_TOP
3667 && ! is_gimple_min_invariant (currval)
3668 && ! ssa_undefined_value_p (currval, false)
3669 && is_gimple_min_invariant (to))
3671 if (dump_file && (dump_flags & TDF_DETAILS))
3673 fprintf (dump_file, "Forcing VARYING instead of changing "
3674 "value number of ");
3675 print_generic_expr (dump_file, from);
3676 fprintf (dump_file, " from ");
3677 print_generic_expr (dump_file, currval);
3678 fprintf (dump_file, " (non-constant) to ");
3679 print_generic_expr (dump_file, to);
3680 fprintf (dump_file, " (constant)\n");
3682 to = from;
3684 else if (TREE_CODE (to) == SSA_NAME
3685 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
3686 to = from;
3689 set_and_exit:
3690 if (dump_file && (dump_flags & TDF_DETAILS))
3692 fprintf (dump_file, "Setting value number of ");
3693 print_generic_expr (dump_file, from);
3694 fprintf (dump_file, " to ");
3695 print_generic_expr (dump_file, to);
3698 if (currval != to
3699 && !operand_equal_p (currval, to, 0)
3700 /* Different undefined SSA names are not actually different. See
3701 PR82320 for a testcase were we'd otherwise not terminate iteration. */
3702 && !(TREE_CODE (currval) == SSA_NAME
3703 && TREE_CODE (to) == SSA_NAME
3704 && ssa_undefined_value_p (currval, false)
3705 && ssa_undefined_value_p (to, false))
3706 /* ??? For addresses involving volatile objects or types operand_equal_p
3707 does not reliably detect ADDR_EXPRs as equal. We know we are only
3708 getting invariant gimple addresses here, so can use
3709 get_addr_base_and_unit_offset to do this comparison. */
3710 && !(TREE_CODE (currval) == ADDR_EXPR
3711 && TREE_CODE (to) == ADDR_EXPR
3712 && (get_addr_base_and_unit_offset (TREE_OPERAND (currval, 0), &coff)
3713 == get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff))
3714 && known_eq (coff, toff)))
3716 if (dump_file && (dump_flags & TDF_DETAILS))
3717 fprintf (dump_file, " (changed)\n");
3718 from_info->valnum = to;
3719 return true;
3721 if (dump_file && (dump_flags & TDF_DETAILS))
3722 fprintf (dump_file, "\n");
3723 return false;
3726 /* Set all definitions in STMT to value number to themselves.
3727 Return true if a value number changed. */
3729 static bool
3730 defs_to_varying (gimple *stmt)
3732 bool changed = false;
3733 ssa_op_iter iter;
3734 def_operand_p defp;
3736 FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_ALL_DEFS)
3738 tree def = DEF_FROM_PTR (defp);
3739 changed |= set_ssa_val_to (def, def);
3741 return changed;
3744 /* Visit a copy between LHS and RHS, return true if the value number
3745 changed. */
3747 static bool
3748 visit_copy (tree lhs, tree rhs)
3750 /* Valueize. */
3751 rhs = SSA_VAL (rhs);
3753 return set_ssa_val_to (lhs, rhs);
3756 /* Lookup a value for OP in type WIDE_TYPE where the value in type of OP
3757 is the same. */
3759 static tree
3760 valueized_wider_op (tree wide_type, tree op)
3762 if (TREE_CODE (op) == SSA_NAME)
3763 op = vn_valueize (op);
3765 /* Either we have the op widened available. */
3766 tree ops[3] = {};
3767 ops[0] = op;
3768 tree tem = vn_nary_op_lookup_pieces (1, NOP_EXPR,
3769 wide_type, ops, NULL);
3770 if (tem)
3771 return tem;
3773 /* Or the op is truncated from some existing value. */
3774 if (TREE_CODE (op) == SSA_NAME)
3776 gimple *def = SSA_NAME_DEF_STMT (op);
3777 if (is_gimple_assign (def)
3778 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
3780 tem = gimple_assign_rhs1 (def);
3781 if (useless_type_conversion_p (wide_type, TREE_TYPE (tem)))
3783 if (TREE_CODE (tem) == SSA_NAME)
3784 tem = vn_valueize (tem);
3785 return tem;
3790 /* For constants simply extend it. */
3791 if (TREE_CODE (op) == INTEGER_CST)
3792 return wide_int_to_tree (wide_type, wi::to_wide (op));
3794 return NULL_TREE;
3797 /* Visit a nary operator RHS, value number it, and return true if the
3798 value number of LHS has changed as a result. */
3800 static bool
3801 visit_nary_op (tree lhs, gassign *stmt)
3803 vn_nary_op_t vnresult;
3804 tree result = vn_nary_op_lookup_stmt (stmt, &vnresult);
3805 if (! result && vnresult)
3806 result = vn_nary_op_get_predicated_value (vnresult, gimple_bb (stmt));
3807 if (result)
3808 return set_ssa_val_to (lhs, result);
3810 /* Do some special pattern matching for redundancies of operations
3811 in different types. */
3812 enum tree_code code = gimple_assign_rhs_code (stmt);
3813 tree type = TREE_TYPE (lhs);
3814 tree rhs1 = gimple_assign_rhs1 (stmt);
3815 switch (code)
3817 CASE_CONVERT:
3818 /* Match arithmetic done in a different type where we can easily
3819 substitute the result from some earlier sign-changed or widened
3820 operation. */
3821 if (INTEGRAL_TYPE_P (type)
3822 && TREE_CODE (rhs1) == SSA_NAME
3823 /* We only handle sign-changes or zero-extension -> & mask. */
3824 && ((TYPE_UNSIGNED (TREE_TYPE (rhs1))
3825 && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (rhs1)))
3826 || TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (rhs1))))
3828 gassign *def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (rhs1));
3829 if (def
3830 && (gimple_assign_rhs_code (def) == PLUS_EXPR
3831 || gimple_assign_rhs_code (def) == MINUS_EXPR
3832 || gimple_assign_rhs_code (def) == MULT_EXPR))
3834 tree ops[3] = {};
3835 /* Either we have the op widened available. */
3836 ops[0] = valueized_wider_op (type,
3837 gimple_assign_rhs1 (def));
3838 if (ops[0])
3839 ops[1] = valueized_wider_op (type,
3840 gimple_assign_rhs2 (def));
3841 if (ops[0] && ops[1])
3843 ops[0] = vn_nary_op_lookup_pieces
3844 (2, gimple_assign_rhs_code (def), type, ops, NULL);
3845 /* We have wider operation available. */
3846 if (ops[0])
3848 unsigned lhs_prec = TYPE_PRECISION (type);
3849 unsigned rhs_prec = TYPE_PRECISION (TREE_TYPE (rhs1));
3850 if (lhs_prec == rhs_prec)
3852 gimple_match_op match_op (gimple_match_cond::UNCOND,
3853 NOP_EXPR, type, ops[0]);
3854 result = vn_nary_build_or_lookup (&match_op);
3855 if (result)
3857 bool changed = set_ssa_val_to (lhs, result);
3858 vn_nary_op_insert_stmt (stmt, result);
3859 return changed;
3862 else
3864 tree mask = wide_int_to_tree
3865 (type, wi::mask (rhs_prec, false, lhs_prec));
3866 gimple_match_op match_op (gimple_match_cond::UNCOND,
3867 BIT_AND_EXPR,
3868 TREE_TYPE (lhs),
3869 ops[0], mask);
3870 result = vn_nary_build_or_lookup (&match_op);
3871 if (result)
3873 bool changed = set_ssa_val_to (lhs, result);
3874 vn_nary_op_insert_stmt (stmt, result);
3875 return changed;
3882 default:;
3885 bool changed = set_ssa_val_to (lhs, lhs);
3886 vn_nary_op_insert_stmt (stmt, lhs);
3887 return changed;
3890 /* Visit a call STMT storing into LHS. Return true if the value number
3891 of the LHS has changed as a result. */
3893 static bool
3894 visit_reference_op_call (tree lhs, gcall *stmt)
3896 bool changed = false;
3897 struct vn_reference_s vr1;
3898 vn_reference_t vnresult = NULL;
3899 tree vdef = gimple_vdef (stmt);
3901 /* Non-ssa lhs is handled in copy_reference_ops_from_call. */
3902 if (lhs && TREE_CODE (lhs) != SSA_NAME)
3903 lhs = NULL_TREE;
3905 vn_reference_lookup_call (stmt, &vnresult, &vr1);
3906 if (vnresult)
3908 if (vnresult->result_vdef && vdef)
3909 changed |= set_ssa_val_to (vdef, vnresult->result_vdef);
3910 else if (vdef)
3911 /* If the call was discovered to be pure or const reflect
3912 that as far as possible. */
3913 changed |= set_ssa_val_to (vdef, vuse_ssa_val (gimple_vuse (stmt)));
3915 if (!vnresult->result && lhs)
3916 vnresult->result = lhs;
3918 if (vnresult->result && lhs)
3919 changed |= set_ssa_val_to (lhs, vnresult->result);
3921 else
3923 vn_reference_t vr2;
3924 vn_reference_s **slot;
3925 tree vdef_val = vdef;
3926 if (vdef)
3928 /* If we value numbered an indirect functions function to
3929 one not clobbering memory value number its VDEF to its
3930 VUSE. */
3931 tree fn = gimple_call_fn (stmt);
3932 if (fn && TREE_CODE (fn) == SSA_NAME)
3934 fn = SSA_VAL (fn);
3935 if (TREE_CODE (fn) == ADDR_EXPR
3936 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
3937 && (flags_from_decl_or_type (TREE_OPERAND (fn, 0))
3938 & (ECF_CONST | ECF_PURE)))
3939 vdef_val = vuse_ssa_val (gimple_vuse (stmt));
3941 changed |= set_ssa_val_to (vdef, vdef_val);
3943 if (lhs)
3944 changed |= set_ssa_val_to (lhs, lhs);
3945 vr2 = XOBNEW (&vn_tables_obstack, vn_reference_s);
3946 vr2->vuse = vr1.vuse;
3947 /* As we are not walking the virtual operand chain we know the
3948 shared_lookup_references are still original so we can re-use
3949 them here. */
3950 vr2->operands = vr1.operands.copy ();
3951 vr2->type = vr1.type;
3952 vr2->set = vr1.set;
3953 vr2->hashcode = vr1.hashcode;
3954 vr2->result = lhs;
3955 vr2->result_vdef = vdef_val;
3956 slot = valid_info->references->find_slot_with_hash (vr2, vr2->hashcode,
3957 INSERT);
3958 gcc_assert (!*slot);
3959 *slot = vr2;
3960 vr2->next = last_inserted_ref;
3961 last_inserted_ref = vr2;
3964 return changed;
3967 /* Visit a load from a reference operator RHS, part of STMT, value number it,
3968 and return true if the value number of the LHS has changed as a result. */
3970 static bool
3971 visit_reference_op_load (tree lhs, tree op, gimple *stmt)
3973 bool changed = false;
3974 tree last_vuse;
3975 tree result;
3977 last_vuse = gimple_vuse (stmt);
3978 last_vuse_ptr = &last_vuse;
3979 result = vn_reference_lookup (op, gimple_vuse (stmt),
3980 default_vn_walk_kind, NULL, true);
3981 last_vuse_ptr = NULL;
3983 /* We handle type-punning through unions by value-numbering based
3984 on offset and size of the access. Be prepared to handle a
3985 type-mismatch here via creating a VIEW_CONVERT_EXPR. */
3986 if (result
3987 && !useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (op)))
3989 /* We will be setting the value number of lhs to the value number
3990 of VIEW_CONVERT_EXPR <TREE_TYPE (result)> (result).
3991 So first simplify and lookup this expression to see if it
3992 is already available. */
3993 gimple_match_op res_op (gimple_match_cond::UNCOND,
3994 VIEW_CONVERT_EXPR, TREE_TYPE (op), result);
3995 result = vn_nary_build_or_lookup (&res_op);
3996 /* When building the conversion fails avoid inserting the reference
3997 again. */
3998 if (!result)
3999 return set_ssa_val_to (lhs, lhs);
4002 if (result)
4003 changed = set_ssa_val_to (lhs, result);
4004 else
4006 changed = set_ssa_val_to (lhs, lhs);
4007 vn_reference_insert (op, lhs, last_vuse, NULL_TREE);
4010 return changed;
4014 /* Visit a store to a reference operator LHS, part of STMT, value number it,
4015 and return true if the value number of the LHS has changed as a result. */
4017 static bool
4018 visit_reference_op_store (tree lhs, tree op, gimple *stmt)
4020 bool changed = false;
4021 vn_reference_t vnresult = NULL;
4022 tree assign;
4023 bool resultsame = false;
4024 tree vuse = gimple_vuse (stmt);
4025 tree vdef = gimple_vdef (stmt);
4027 if (TREE_CODE (op) == SSA_NAME)
4028 op = SSA_VAL (op);
4030 /* First we want to lookup using the *vuses* from the store and see
4031 if there the last store to this location with the same address
4032 had the same value.
4034 The vuses represent the memory state before the store. If the
4035 memory state, address, and value of the store is the same as the
4036 last store to this location, then this store will produce the
4037 same memory state as that store.
4039 In this case the vdef versions for this store are value numbered to those
4040 vuse versions, since they represent the same memory state after
4041 this store.
4043 Otherwise, the vdefs for the store are used when inserting into
4044 the table, since the store generates a new memory state. */
4046 vn_reference_lookup (lhs, vuse, VN_NOWALK, &vnresult, false);
4047 if (vnresult
4048 && vnresult->result)
4050 tree result = vnresult->result;
4051 gcc_checking_assert (TREE_CODE (result) != SSA_NAME
4052 || result == SSA_VAL (result));
4053 resultsame = expressions_equal_p (result, op);
4054 if (resultsame)
4056 /* If the TBAA state isn't compatible for downstream reads
4057 we cannot value-number the VDEFs the same. */
4058 alias_set_type set = get_alias_set (lhs);
4059 if (vnresult->set != set
4060 && ! alias_set_subset_of (set, vnresult->set))
4061 resultsame = false;
4065 if (!resultsame)
4067 /* Only perform the following when being called from PRE
4068 which embeds tail merging. */
4069 if (default_vn_walk_kind == VN_WALK)
4071 assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op);
4072 vn_reference_lookup (assign, vuse, VN_NOWALK, &vnresult, false);
4073 if (vnresult)
4075 VN_INFO (vdef)->visited = true;
4076 return set_ssa_val_to (vdef, vnresult->result_vdef);
4080 if (dump_file && (dump_flags & TDF_DETAILS))
4082 fprintf (dump_file, "No store match\n");
4083 fprintf (dump_file, "Value numbering store ");
4084 print_generic_expr (dump_file, lhs);
4085 fprintf (dump_file, " to ");
4086 print_generic_expr (dump_file, op);
4087 fprintf (dump_file, "\n");
4089 /* Have to set value numbers before insert, since insert is
4090 going to valueize the references in-place. */
4091 if (vdef)
4092 changed |= set_ssa_val_to (vdef, vdef);
4094 /* Do not insert structure copies into the tables. */
4095 if (is_gimple_min_invariant (op)
4096 || is_gimple_reg (op))
4097 vn_reference_insert (lhs, op, vdef, NULL);
4099 /* Only perform the following when being called from PRE
4100 which embeds tail merging. */
4101 if (default_vn_walk_kind == VN_WALK)
4103 assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op);
4104 vn_reference_insert (assign, lhs, vuse, vdef);
4107 else
4109 /* We had a match, so value number the vdef to have the value
4110 number of the vuse it came from. */
4112 if (dump_file && (dump_flags & TDF_DETAILS))
4113 fprintf (dump_file, "Store matched earlier value, "
4114 "value numbering store vdefs to matching vuses.\n");
4116 changed |= set_ssa_val_to (vdef, SSA_VAL (vuse));
4119 return changed;
4122 /* Visit and value number PHI, return true if the value number
4123 changed. When BACKEDGES_VARYING_P is true then assume all
4124 backedge values are varying. When INSERTED is not NULL then
4125 this is just a ahead query for a possible iteration, set INSERTED
4126 to true if we'd insert into the hashtable. */
4128 static bool
4129 visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
4131 tree result, sameval = VN_TOP, seen_undef = NULL_TREE;
4132 tree backedge_val = NULL_TREE;
4133 bool seen_non_backedge = false;
4134 tree sameval_base = NULL_TREE;
4135 poly_int64 soff, doff;
4136 unsigned n_executable = 0;
4137 edge_iterator ei;
4138 edge e;
4140 /* TODO: We could check for this in initialization, and replace this
4141 with a gcc_assert. */
4142 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)))
4143 return set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi));
4145 /* We track whether a PHI was CSEd to to avoid excessive iterations
4146 that would be necessary only because the PHI changed arguments
4147 but not value. */
4148 if (!inserted)
4149 gimple_set_plf (phi, GF_PLF_1, false);
4151 /* See if all non-TOP arguments have the same value. TOP is
4152 equivalent to everything, so we can ignore it. */
4153 FOR_EACH_EDGE (e, ei, gimple_bb (phi)->preds)
4154 if (e->flags & EDGE_EXECUTABLE)
4156 tree def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4158 ++n_executable;
4159 if (TREE_CODE (def) == SSA_NAME)
4161 if (!backedges_varying_p || !(e->flags & EDGE_DFS_BACK))
4162 def = SSA_VAL (def);
4163 if (e->flags & EDGE_DFS_BACK)
4164 backedge_val = def;
4166 if (!(e->flags & EDGE_DFS_BACK))
4167 seen_non_backedge = true;
4168 if (def == VN_TOP)
4170 /* Ignore undefined defs for sameval but record one. */
4171 else if (TREE_CODE (def) == SSA_NAME
4172 && ! virtual_operand_p (def)
4173 && ssa_undefined_value_p (def, false))
4174 seen_undef = def;
4175 else if (sameval == VN_TOP)
4176 sameval = def;
4177 else if (!expressions_equal_p (def, sameval))
4179 /* We know we're arriving only with invariant addresses here,
4180 try harder comparing them. We can do some caching here
4181 which we cannot do in expressions_equal_p. */
4182 if (TREE_CODE (def) == ADDR_EXPR
4183 && TREE_CODE (sameval) == ADDR_EXPR
4184 && sameval_base != (void *)-1)
4186 if (!sameval_base)
4187 sameval_base = get_addr_base_and_unit_offset
4188 (TREE_OPERAND (sameval, 0), &soff);
4189 if (!sameval_base)
4190 sameval_base = (tree)(void *)-1;
4191 else if ((get_addr_base_and_unit_offset
4192 (TREE_OPERAND (def, 0), &doff) == sameval_base)
4193 && known_eq (soff, doff))
4194 continue;
4196 sameval = NULL_TREE;
4197 break;
4201 /* If the value we want to use is flowing over the backedge and we
4202 should take it as VARYING but it has a non-VARYING value drop to
4203 VARYING.
4204 If we value-number a virtual operand never value-number to the
4205 value from the backedge as that confuses the alias-walking code.
4206 See gcc.dg/torture/pr87176.c. If the value is the same on a
4207 non-backedge everything is OK though. */
4208 bool visited_p;
4209 if ((backedge_val
4210 && !seen_non_backedge
4211 && TREE_CODE (backedge_val) == SSA_NAME
4212 && sameval == backedge_val
4213 && (SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val)
4214 || SSA_VAL (backedge_val) != backedge_val))
4215 /* Do not value-number a virtual operand to sth not visited though
4216 given that allows us to escape a region in alias walking. */
4217 || (sameval
4218 && TREE_CODE (sameval) == SSA_NAME
4219 && !SSA_NAME_IS_DEFAULT_DEF (sameval)
4220 && SSA_NAME_IS_VIRTUAL_OPERAND (sameval)
4221 && (SSA_VAL (sameval, &visited_p), !visited_p)))
4222 /* Note this just drops to VARYING without inserting the PHI into
4223 the hashes. */
4224 result = PHI_RESULT (phi);
4225 /* If none of the edges was executable keep the value-number at VN_TOP,
4226 if only a single edge is exectuable use its value. */
4227 else if (n_executable <= 1)
4228 result = seen_undef ? seen_undef : sameval;
4229 /* If we saw only undefined values and VN_TOP use one of the
4230 undefined values. */
4231 else if (sameval == VN_TOP)
4232 result = seen_undef ? seen_undef : sameval;
4233 /* First see if it is equivalent to a phi node in this block. We prefer
4234 this as it allows IV elimination - see PRs 66502 and 67167. */
4235 else if ((result = vn_phi_lookup (phi, backedges_varying_p)))
4237 if (!inserted
4238 && TREE_CODE (result) == SSA_NAME
4239 && gimple_code (SSA_NAME_DEF_STMT (result)) == GIMPLE_PHI)
4241 gimple_set_plf (SSA_NAME_DEF_STMT (result), GF_PLF_1, true);
4242 if (dump_file && (dump_flags & TDF_DETAILS))
4244 fprintf (dump_file, "Marking CSEd to PHI node ");
4245 print_gimple_expr (dump_file, SSA_NAME_DEF_STMT (result),
4246 0, TDF_SLIM);
4247 fprintf (dump_file, "\n");
4251 /* If all values are the same use that, unless we've seen undefined
4252 values as well and the value isn't constant.
4253 CCP/copyprop have the same restriction to not remove uninit warnings. */
4254 else if (sameval
4255 && (! seen_undef || is_gimple_min_invariant (sameval)))
4256 result = sameval;
4257 else
4259 result = PHI_RESULT (phi);
4260 /* Only insert PHIs that are varying, for constant value numbers
4261 we mess up equivalences otherwise as we are only comparing
4262 the immediate controlling predicates. */
4263 vn_phi_insert (phi, result, backedges_varying_p);
4264 if (inserted)
4265 *inserted = true;
4268 return set_ssa_val_to (PHI_RESULT (phi), result);
4271 /* Try to simplify RHS using equivalences and constant folding. */
4273 static tree
4274 try_to_simplify (gassign *stmt)
4276 enum tree_code code = gimple_assign_rhs_code (stmt);
4277 tree tem;
4279 /* For stores we can end up simplifying a SSA_NAME rhs. Just return
4280 in this case, there is no point in doing extra work. */
4281 if (code == SSA_NAME)
4282 return NULL_TREE;
4284 /* First try constant folding based on our current lattice. */
4285 mprts_hook = vn_lookup_simplify_result;
4286 tem = gimple_fold_stmt_to_constant_1 (stmt, vn_valueize, vn_valueize);
4287 mprts_hook = NULL;
4288 if (tem
4289 && (TREE_CODE (tem) == SSA_NAME
4290 || is_gimple_min_invariant (tem)))
4291 return tem;
4293 return NULL_TREE;
4296 /* Visit and value number STMT, return true if the value number
4297 changed. */
4299 static bool
4300 visit_stmt (gimple *stmt, bool backedges_varying_p = false)
4302 bool changed = false;
4304 if (dump_file && (dump_flags & TDF_DETAILS))
4306 fprintf (dump_file, "Value numbering stmt = ");
4307 print_gimple_stmt (dump_file, stmt, 0);
4310 if (gimple_code (stmt) == GIMPLE_PHI)
4311 changed = visit_phi (stmt, NULL, backedges_varying_p);
4312 else if (gimple_has_volatile_ops (stmt))
4313 changed = defs_to_varying (stmt);
4314 else if (gassign *ass = dyn_cast <gassign *> (stmt))
4316 enum tree_code code = gimple_assign_rhs_code (ass);
4317 tree lhs = gimple_assign_lhs (ass);
4318 tree rhs1 = gimple_assign_rhs1 (ass);
4319 tree simplified;
4321 /* Shortcut for copies. Simplifying copies is pointless,
4322 since we copy the expression and value they represent. */
4323 if (code == SSA_NAME
4324 && TREE_CODE (lhs) == SSA_NAME)
4326 changed = visit_copy (lhs, rhs1);
4327 goto done;
4329 simplified = try_to_simplify (ass);
4330 if (simplified)
4332 if (dump_file && (dump_flags & TDF_DETAILS))
4334 fprintf (dump_file, "RHS ");
4335 print_gimple_expr (dump_file, ass, 0);
4336 fprintf (dump_file, " simplified to ");
4337 print_generic_expr (dump_file, simplified);
4338 fprintf (dump_file, "\n");
4341 /* Setting value numbers to constants will occasionally
4342 screw up phi congruence because constants are not
4343 uniquely associated with a single ssa name that can be
4344 looked up. */
4345 if (simplified
4346 && is_gimple_min_invariant (simplified)
4347 && TREE_CODE (lhs) == SSA_NAME)
4349 changed = set_ssa_val_to (lhs, simplified);
4350 goto done;
4352 else if (simplified
4353 && TREE_CODE (simplified) == SSA_NAME
4354 && TREE_CODE (lhs) == SSA_NAME)
4356 changed = visit_copy (lhs, simplified);
4357 goto done;
4360 if ((TREE_CODE (lhs) == SSA_NAME
4361 /* We can substitute SSA_NAMEs that are live over
4362 abnormal edges with their constant value. */
4363 && !(gimple_assign_copy_p (ass)
4364 && is_gimple_min_invariant (rhs1))
4365 && !(simplified
4366 && is_gimple_min_invariant (simplified))
4367 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
4368 /* Stores or copies from SSA_NAMEs that are live over
4369 abnormal edges are a problem. */
4370 || (code == SSA_NAME
4371 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1)))
4372 changed = defs_to_varying (ass);
4373 else if (REFERENCE_CLASS_P (lhs)
4374 || DECL_P (lhs))
4375 changed = visit_reference_op_store (lhs, rhs1, ass);
4376 else if (TREE_CODE (lhs) == SSA_NAME)
4378 if ((gimple_assign_copy_p (ass)
4379 && is_gimple_min_invariant (rhs1))
4380 || (simplified
4381 && is_gimple_min_invariant (simplified)))
4383 if (simplified)
4384 changed = set_ssa_val_to (lhs, simplified);
4385 else
4386 changed = set_ssa_val_to (lhs, rhs1);
4388 else
4390 /* Visit the original statement. */
4391 switch (vn_get_stmt_kind (ass))
4393 case VN_NARY:
4394 changed = visit_nary_op (lhs, ass);
4395 break;
4396 case VN_REFERENCE:
4397 changed = visit_reference_op_load (lhs, rhs1, ass);
4398 break;
4399 default:
4400 changed = defs_to_varying (ass);
4401 break;
4405 else
4406 changed = defs_to_varying (ass);
4408 else if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
4410 tree lhs = gimple_call_lhs (call_stmt);
4411 if (lhs && TREE_CODE (lhs) == SSA_NAME)
4413 /* Try constant folding based on our current lattice. */
4414 tree simplified = gimple_fold_stmt_to_constant_1 (call_stmt,
4415 vn_valueize);
4416 if (simplified)
4418 if (dump_file && (dump_flags & TDF_DETAILS))
4420 fprintf (dump_file, "call ");
4421 print_gimple_expr (dump_file, call_stmt, 0);
4422 fprintf (dump_file, " simplified to ");
4423 print_generic_expr (dump_file, simplified);
4424 fprintf (dump_file, "\n");
4427 /* Setting value numbers to constants will occasionally
4428 screw up phi congruence because constants are not
4429 uniquely associated with a single ssa name that can be
4430 looked up. */
4431 if (simplified
4432 && is_gimple_min_invariant (simplified))
4434 changed = set_ssa_val_to (lhs, simplified);
4435 if (gimple_vdef (call_stmt))
4436 changed |= set_ssa_val_to (gimple_vdef (call_stmt),
4437 SSA_VAL (gimple_vuse (call_stmt)));
4438 goto done;
4440 else if (simplified
4441 && TREE_CODE (simplified) == SSA_NAME)
4443 changed = visit_copy (lhs, simplified);
4444 if (gimple_vdef (call_stmt))
4445 changed |= set_ssa_val_to (gimple_vdef (call_stmt),
4446 SSA_VAL (gimple_vuse (call_stmt)));
4447 goto done;
4449 else if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
4451 changed = defs_to_varying (call_stmt);
4452 goto done;
4456 /* Pick up flags from a devirtualization target. */
4457 tree fn = gimple_call_fn (stmt);
4458 int extra_fnflags = 0;
4459 if (fn && TREE_CODE (fn) == SSA_NAME)
4461 fn = SSA_VAL (fn);
4462 if (TREE_CODE (fn) == ADDR_EXPR
4463 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL)
4464 extra_fnflags = flags_from_decl_or_type (TREE_OPERAND (fn, 0));
4466 if (!gimple_call_internal_p (call_stmt)
4467 && (/* Calls to the same function with the same vuse
4468 and the same operands do not necessarily return the same
4469 value, unless they're pure or const. */
4470 ((gimple_call_flags (call_stmt) | extra_fnflags)
4471 & (ECF_PURE | ECF_CONST))
4472 /* If calls have a vdef, subsequent calls won't have
4473 the same incoming vuse. So, if 2 calls with vdef have the
4474 same vuse, we know they're not subsequent.
4475 We can value number 2 calls to the same function with the
4476 same vuse and the same operands which are not subsequent
4477 the same, because there is no code in the program that can
4478 compare the 2 values... */
4479 || (gimple_vdef (call_stmt)
4480 /* ... unless the call returns a pointer which does
4481 not alias with anything else. In which case the
4482 information that the values are distinct are encoded
4483 in the IL. */
4484 && !(gimple_call_return_flags (call_stmt) & ERF_NOALIAS)
4485 /* Only perform the following when being called from PRE
4486 which embeds tail merging. */
4487 && default_vn_walk_kind == VN_WALK)))
4488 changed = visit_reference_op_call (lhs, call_stmt);
4489 else
4490 changed = defs_to_varying (call_stmt);
4492 else
4493 changed = defs_to_varying (stmt);
4494 done:
4495 return changed;
4499 /* Allocate a value number table. */
4501 static void
4502 allocate_vn_table (vn_tables_t table, unsigned size)
4504 table->phis = new vn_phi_table_type (size);
4505 table->nary = new vn_nary_op_table_type (size);
4506 table->references = new vn_reference_table_type (size);
4509 /* Free a value number table. */
4511 static void
4512 free_vn_table (vn_tables_t table)
4514 /* Walk over elements and release vectors. */
4515 vn_reference_iterator_type hir;
4516 vn_reference_t vr;
4517 FOR_EACH_HASH_TABLE_ELEMENT (*table->references, vr, vn_reference_t, hir)
4518 vr->operands.release ();
4519 delete table->phis;
4520 table->phis = NULL;
4521 delete table->nary;
4522 table->nary = NULL;
4523 delete table->references;
4524 table->references = NULL;
4527 /* Set *ID according to RESULT. */
4529 static void
4530 set_value_id_for_result (tree result, unsigned int *id)
4532 if (result && TREE_CODE (result) == SSA_NAME)
4533 *id = VN_INFO (result)->value_id;
4534 else if (result && is_gimple_min_invariant (result))
4535 *id = get_or_alloc_constant_value_id (result);
4536 else
4537 *id = get_next_value_id ();
4540 /* Set the value ids in the valid hash tables. */
4542 static void
4543 set_hashtable_value_ids (void)
4545 vn_nary_op_iterator_type hin;
4546 vn_phi_iterator_type hip;
4547 vn_reference_iterator_type hir;
4548 vn_nary_op_t vno;
4549 vn_reference_t vr;
4550 vn_phi_t vp;
4552 /* Now set the value ids of the things we had put in the hash
4553 table. */
4555 FOR_EACH_HASH_TABLE_ELEMENT (*valid_info->nary, vno, vn_nary_op_t, hin)
4556 if (! vno->predicated_values)
4557 set_value_id_for_result (vno->u.result, &vno->value_id);
4559 FOR_EACH_HASH_TABLE_ELEMENT (*valid_info->phis, vp, vn_phi_t, hip)
4560 set_value_id_for_result (vp->result, &vp->value_id);
4562 FOR_EACH_HASH_TABLE_ELEMENT (*valid_info->references, vr, vn_reference_t,
4563 hir)
4564 set_value_id_for_result (vr->result, &vr->value_id);
4567 /* Return the maximum value id we have ever seen. */
4569 unsigned int
4570 get_max_value_id (void)
4572 return next_value_id;
4575 /* Return the next unique value id. */
4577 unsigned int
4578 get_next_value_id (void)
4580 return next_value_id++;
4584 /* Compare two expressions E1 and E2 and return true if they are equal. */
4586 bool
4587 expressions_equal_p (tree e1, tree e2)
4589 /* The obvious case. */
4590 if (e1 == e2)
4591 return true;
4593 /* If either one is VN_TOP consider them equal. */
4594 if (e1 == VN_TOP || e2 == VN_TOP)
4595 return true;
4597 /* If only one of them is null, they cannot be equal. */
4598 if (!e1 || !e2)
4599 return false;
4601 /* Now perform the actual comparison. */
4602 if (TREE_CODE (e1) == TREE_CODE (e2)
4603 && operand_equal_p (e1, e2, OEP_PURE_SAME))
4604 return true;
4606 return false;
4610 /* Return true if the nary operation NARY may trap. This is a copy
4611 of stmt_could_throw_1_p adjusted to the SCCVN IL. */
4613 bool
4614 vn_nary_may_trap (vn_nary_op_t nary)
4616 tree type;
4617 tree rhs2 = NULL_TREE;
4618 bool honor_nans = false;
4619 bool honor_snans = false;
4620 bool fp_operation = false;
4621 bool honor_trapv = false;
4622 bool handled, ret;
4623 unsigned i;
4625 if (TREE_CODE_CLASS (nary->opcode) == tcc_comparison
4626 || TREE_CODE_CLASS (nary->opcode) == tcc_unary
4627 || TREE_CODE_CLASS (nary->opcode) == tcc_binary)
4629 type = nary->type;
4630 fp_operation = FLOAT_TYPE_P (type);
4631 if (fp_operation)
4633 honor_nans = flag_trapping_math && !flag_finite_math_only;
4634 honor_snans = flag_signaling_nans != 0;
4636 else if (INTEGRAL_TYPE_P (type)
4637 && TYPE_OVERFLOW_TRAPS (type))
4638 honor_trapv = true;
4640 if (nary->length >= 2)
4641 rhs2 = nary->op[1];
4642 ret = operation_could_trap_helper_p (nary->opcode, fp_operation,
4643 honor_trapv,
4644 honor_nans, honor_snans, rhs2,
4645 &handled);
4646 if (handled
4647 && ret)
4648 return true;
4650 for (i = 0; i < nary->length; ++i)
4651 if (tree_could_trap_p (nary->op[i]))
4652 return true;
4654 return false;
4658 class eliminate_dom_walker : public dom_walker
4660 public:
4661 eliminate_dom_walker (cdi_direction, bitmap);
4662 ~eliminate_dom_walker ();
4664 virtual edge before_dom_children (basic_block);
4665 virtual void after_dom_children (basic_block);
4667 virtual tree eliminate_avail (basic_block, tree op);
4668 virtual void eliminate_push_avail (basic_block, tree op);
4669 tree eliminate_insert (basic_block, gimple_stmt_iterator *gsi, tree val);
4671 void eliminate_stmt (basic_block, gimple_stmt_iterator *);
4673 unsigned eliminate_cleanup (bool region_p = false);
4675 bool do_pre;
4676 unsigned int el_todo;
4677 unsigned int eliminations;
4678 unsigned int insertions;
4680 /* SSA names that had their defs inserted by PRE if do_pre. */
4681 bitmap inserted_exprs;
4683 /* Blocks with statements that have had their EH properties changed. */
4684 bitmap need_eh_cleanup;
4686 /* Blocks with statements that have had their AB properties changed. */
4687 bitmap need_ab_cleanup;
4689 /* Local state for the eliminate domwalk. */
4690 auto_vec<gimple *> to_remove;
4691 auto_vec<gimple *> to_fixup;
4692 auto_vec<tree> avail;
4693 auto_vec<tree> avail_stack;
4696 eliminate_dom_walker::eliminate_dom_walker (cdi_direction direction,
4697 bitmap inserted_exprs_)
4698 : dom_walker (direction), do_pre (inserted_exprs_ != NULL),
4699 el_todo (0), eliminations (0), insertions (0),
4700 inserted_exprs (inserted_exprs_)
4702 need_eh_cleanup = BITMAP_ALLOC (NULL);
4703 need_ab_cleanup = BITMAP_ALLOC (NULL);
4706 eliminate_dom_walker::~eliminate_dom_walker ()
4708 BITMAP_FREE (need_eh_cleanup);
4709 BITMAP_FREE (need_ab_cleanup);
4712 /* Return a leader for OP that is available at the current point of the
4713 eliminate domwalk. */
4715 tree
4716 eliminate_dom_walker::eliminate_avail (basic_block, tree op)
4718 tree valnum = VN_INFO (op)->valnum;
4719 if (TREE_CODE (valnum) == SSA_NAME)
4721 if (SSA_NAME_IS_DEFAULT_DEF (valnum))
4722 return valnum;
4723 if (avail.length () > SSA_NAME_VERSION (valnum))
4724 return avail[SSA_NAME_VERSION (valnum)];
4726 else if (is_gimple_min_invariant (valnum))
4727 return valnum;
4728 return NULL_TREE;
4731 /* At the current point of the eliminate domwalk make OP available. */
4733 void
4734 eliminate_dom_walker::eliminate_push_avail (basic_block, tree op)
4736 tree valnum = VN_INFO (op)->valnum;
4737 if (TREE_CODE (valnum) == SSA_NAME)
4739 if (avail.length () <= SSA_NAME_VERSION (valnum))
4740 avail.safe_grow_cleared (SSA_NAME_VERSION (valnum) + 1);
4741 tree pushop = op;
4742 if (avail[SSA_NAME_VERSION (valnum)])
4743 pushop = avail[SSA_NAME_VERSION (valnum)];
4744 avail_stack.safe_push (pushop);
4745 avail[SSA_NAME_VERSION (valnum)] = op;
4749 /* Insert the expression recorded by SCCVN for VAL at *GSI. Returns
4750 the leader for the expression if insertion was successful. */
4752 tree
4753 eliminate_dom_walker::eliminate_insert (basic_block bb,
4754 gimple_stmt_iterator *gsi, tree val)
4756 /* We can insert a sequence with a single assignment only. */
4757 gimple_seq stmts = VN_INFO (val)->expr;
4758 if (!gimple_seq_singleton_p (stmts))
4759 return NULL_TREE;
4760 gassign *stmt = dyn_cast <gassign *> (gimple_seq_first_stmt (stmts));
4761 if (!stmt
4762 || (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt))
4763 && gimple_assign_rhs_code (stmt) != VIEW_CONVERT_EXPR
4764 && gimple_assign_rhs_code (stmt) != BIT_FIELD_REF
4765 && (gimple_assign_rhs_code (stmt) != BIT_AND_EXPR
4766 || TREE_CODE (gimple_assign_rhs2 (stmt)) != INTEGER_CST)))
4767 return NULL_TREE;
4769 tree op = gimple_assign_rhs1 (stmt);
4770 if (gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
4771 || gimple_assign_rhs_code (stmt) == BIT_FIELD_REF)
4772 op = TREE_OPERAND (op, 0);
4773 tree leader = TREE_CODE (op) == SSA_NAME ? eliminate_avail (bb, op) : op;
4774 if (!leader)
4775 return NULL_TREE;
4777 tree res;
4778 stmts = NULL;
4779 if (gimple_assign_rhs_code (stmt) == BIT_FIELD_REF)
4780 res = gimple_build (&stmts, BIT_FIELD_REF,
4781 TREE_TYPE (val), leader,
4782 TREE_OPERAND (gimple_assign_rhs1 (stmt), 1),
4783 TREE_OPERAND (gimple_assign_rhs1 (stmt), 2));
4784 else if (gimple_assign_rhs_code (stmt) == BIT_AND_EXPR)
4785 res = gimple_build (&stmts, BIT_AND_EXPR,
4786 TREE_TYPE (val), leader, gimple_assign_rhs2 (stmt));
4787 else
4788 res = gimple_build (&stmts, gimple_assign_rhs_code (stmt),
4789 TREE_TYPE (val), leader);
4790 if (TREE_CODE (res) != SSA_NAME
4791 || SSA_NAME_IS_DEFAULT_DEF (res)
4792 || gimple_bb (SSA_NAME_DEF_STMT (res)))
4794 gimple_seq_discard (stmts);
4796 /* During propagation we have to treat SSA info conservatively
4797 and thus we can end up simplifying the inserted expression
4798 at elimination time to sth not defined in stmts. */
4799 /* But then this is a redundancy we failed to detect. Which means
4800 res now has two values. That doesn't play well with how
4801 we track availability here, so give up. */
4802 if (dump_file && (dump_flags & TDF_DETAILS))
4804 if (TREE_CODE (res) == SSA_NAME)
4805 res = eliminate_avail (bb, res);
4806 if (res)
4808 fprintf (dump_file, "Failed to insert expression for value ");
4809 print_generic_expr (dump_file, val);
4810 fprintf (dump_file, " which is really fully redundant to ");
4811 print_generic_expr (dump_file, res);
4812 fprintf (dump_file, "\n");
4816 return NULL_TREE;
4818 else
4820 gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
4821 VN_INFO (res)->valnum = val;
4822 VN_INFO (res)->visited = true;
4825 insertions++;
4826 if (dump_file && (dump_flags & TDF_DETAILS))
4828 fprintf (dump_file, "Inserted ");
4829 print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (res), 0);
4832 return res;
4835 void
4836 eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
4838 tree sprime = NULL_TREE;
4839 gimple *stmt = gsi_stmt (*gsi);
4840 tree lhs = gimple_get_lhs (stmt);
4841 if (lhs && TREE_CODE (lhs) == SSA_NAME
4842 && !gimple_has_volatile_ops (stmt)
4843 /* See PR43491. Do not replace a global register variable when
4844 it is a the RHS of an assignment. Do replace local register
4845 variables since gcc does not guarantee a local variable will
4846 be allocated in register.
4847 ??? The fix isn't effective here. This should instead
4848 be ensured by not value-numbering them the same but treating
4849 them like volatiles? */
4850 && !(gimple_assign_single_p (stmt)
4851 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == VAR_DECL
4852 && DECL_HARD_REGISTER (gimple_assign_rhs1 (stmt))
4853 && is_global_var (gimple_assign_rhs1 (stmt)))))
4855 sprime = eliminate_avail (b, lhs);
4856 if (!sprime)
4858 /* If there is no existing usable leader but SCCVN thinks
4859 it has an expression it wants to use as replacement,
4860 insert that. */
4861 tree val = VN_INFO (lhs)->valnum;
4862 if (val != VN_TOP
4863 && TREE_CODE (val) == SSA_NAME
4864 && VN_INFO (val)->needs_insertion
4865 && VN_INFO (val)->expr != NULL
4866 && (sprime = eliminate_insert (b, gsi, val)) != NULL_TREE)
4867 eliminate_push_avail (b, sprime);
4870 /* If this now constitutes a copy duplicate points-to
4871 and range info appropriately. This is especially
4872 important for inserted code. See tree-ssa-copy.c
4873 for similar code. */
4874 if (sprime
4875 && TREE_CODE (sprime) == SSA_NAME)
4877 basic_block sprime_b = gimple_bb (SSA_NAME_DEF_STMT (sprime));
4878 if (POINTER_TYPE_P (TREE_TYPE (lhs))
4879 && SSA_NAME_PTR_INFO (lhs)
4880 && ! SSA_NAME_PTR_INFO (sprime))
4882 duplicate_ssa_name_ptr_info (sprime,
4883 SSA_NAME_PTR_INFO (lhs));
4884 if (b != sprime_b)
4885 mark_ptr_info_alignment_unknown
4886 (SSA_NAME_PTR_INFO (sprime));
4888 else if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4889 && SSA_NAME_RANGE_INFO (lhs)
4890 && ! SSA_NAME_RANGE_INFO (sprime)
4891 && b == sprime_b)
4892 duplicate_ssa_name_range_info (sprime,
4893 SSA_NAME_RANGE_TYPE (lhs),
4894 SSA_NAME_RANGE_INFO (lhs));
4897 /* Inhibit the use of an inserted PHI on a loop header when
4898 the address of the memory reference is a simple induction
4899 variable. In other cases the vectorizer won't do anything
4900 anyway (either it's loop invariant or a complicated
4901 expression). */
4902 if (sprime
4903 && TREE_CODE (sprime) == SSA_NAME
4904 && do_pre
4905 && (flag_tree_loop_vectorize || flag_tree_parallelize_loops > 1)
4906 && loop_outer (b->loop_father)
4907 && has_zero_uses (sprime)
4908 && bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (sprime))
4909 && gimple_assign_load_p (stmt))
4911 gimple *def_stmt = SSA_NAME_DEF_STMT (sprime);
4912 basic_block def_bb = gimple_bb (def_stmt);
4913 if (gimple_code (def_stmt) == GIMPLE_PHI
4914 && def_bb->loop_father->header == def_bb)
4916 loop_p loop = def_bb->loop_father;
4917 ssa_op_iter iter;
4918 tree op;
4919 bool found = false;
4920 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
4922 affine_iv iv;
4923 def_bb = gimple_bb (SSA_NAME_DEF_STMT (op));
4924 if (def_bb
4925 && flow_bb_inside_loop_p (loop, def_bb)
4926 && simple_iv (loop, loop, op, &iv, true))
4928 found = true;
4929 break;
4932 if (found)
4934 if (dump_file && (dump_flags & TDF_DETAILS))
4936 fprintf (dump_file, "Not replacing ");
4937 print_gimple_expr (dump_file, stmt, 0);
4938 fprintf (dump_file, " with ");
4939 print_generic_expr (dump_file, sprime);
4940 fprintf (dump_file, " which would add a loop"
4941 " carried dependence to loop %d\n",
4942 loop->num);
4944 /* Don't keep sprime available. */
4945 sprime = NULL_TREE;
4950 if (sprime)
4952 /* If we can propagate the value computed for LHS into
4953 all uses don't bother doing anything with this stmt. */
4954 if (may_propagate_copy (lhs, sprime))
4956 /* Mark it for removal. */
4957 to_remove.safe_push (stmt);
4959 /* ??? Don't count copy/constant propagations. */
4960 if (gimple_assign_single_p (stmt)
4961 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
4962 || gimple_assign_rhs1 (stmt) == sprime))
4963 return;
4965 if (dump_file && (dump_flags & TDF_DETAILS))
4967 fprintf (dump_file, "Replaced ");
4968 print_gimple_expr (dump_file, stmt, 0);
4969 fprintf (dump_file, " with ");
4970 print_generic_expr (dump_file, sprime);
4971 fprintf (dump_file, " in all uses of ");
4972 print_gimple_stmt (dump_file, stmt, 0);
4975 eliminations++;
4976 return;
4979 /* If this is an assignment from our leader (which
4980 happens in the case the value-number is a constant)
4981 then there is nothing to do. */
4982 if (gimple_assign_single_p (stmt)
4983 && sprime == gimple_assign_rhs1 (stmt))
4984 return;
4986 /* Else replace its RHS. */
4987 if (dump_file && (dump_flags & TDF_DETAILS))
4989 fprintf (dump_file, "Replaced ");
4990 print_gimple_expr (dump_file, stmt, 0);
4991 fprintf (dump_file, " with ");
4992 print_generic_expr (dump_file, sprime);
4993 fprintf (dump_file, " in ");
4994 print_gimple_stmt (dump_file, stmt, 0);
4996 eliminations++;
4998 bool can_make_abnormal_goto = (is_gimple_call (stmt)
4999 && stmt_can_make_abnormal_goto (stmt));
5000 gimple *orig_stmt = stmt;
5001 if (!useless_type_conversion_p (TREE_TYPE (lhs),
5002 TREE_TYPE (sprime)))
5004 /* We preserve conversions to but not from function or method
5005 types. This asymmetry makes it necessary to re-instantiate
5006 conversions here. */
5007 if (POINTER_TYPE_P (TREE_TYPE (lhs))
5008 && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (lhs))))
5009 sprime = fold_convert (TREE_TYPE (lhs), sprime);
5010 else
5011 gcc_unreachable ();
5013 tree vdef = gimple_vdef (stmt);
5014 tree vuse = gimple_vuse (stmt);
5015 propagate_tree_value_into_stmt (gsi, sprime);
5016 stmt = gsi_stmt (*gsi);
5017 update_stmt (stmt);
5018 /* In case the VDEF on the original stmt was released, value-number
5019 it to the VUSE. This is to make vuse_ssa_val able to skip
5020 released virtual operands. */
5021 if (vdef != gimple_vdef (stmt))
5023 gcc_assert (SSA_NAME_IN_FREE_LIST (vdef));
5024 VN_INFO (vdef)->valnum = vuse;
5027 /* If we removed EH side-effects from the statement, clean
5028 its EH information. */
5029 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
5031 bitmap_set_bit (need_eh_cleanup,
5032 gimple_bb (stmt)->index);
5033 if (dump_file && (dump_flags & TDF_DETAILS))
5034 fprintf (dump_file, " Removed EH side-effects.\n");
5037 /* Likewise for AB side-effects. */
5038 if (can_make_abnormal_goto
5039 && !stmt_can_make_abnormal_goto (stmt))
5041 bitmap_set_bit (need_ab_cleanup,
5042 gimple_bb (stmt)->index);
5043 if (dump_file && (dump_flags & TDF_DETAILS))
5044 fprintf (dump_file, " Removed AB side-effects.\n");
5047 return;
5051 /* If the statement is a scalar store, see if the expression
5052 has the same value number as its rhs. If so, the store is
5053 dead. */
5054 if (gimple_assign_single_p (stmt)
5055 && !gimple_has_volatile_ops (stmt)
5056 && !is_gimple_reg (gimple_assign_lhs (stmt))
5057 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
5058 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
5060 tree val;
5061 tree rhs = gimple_assign_rhs1 (stmt);
5062 vn_reference_t vnresult;
5063 val = vn_reference_lookup (lhs, gimple_vuse (stmt), VN_WALKREWRITE,
5064 &vnresult, false);
5065 if (TREE_CODE (rhs) == SSA_NAME)
5066 rhs = VN_INFO (rhs)->valnum;
5067 if (val
5068 && operand_equal_p (val, rhs, 0))
5070 /* We can only remove the later store if the former aliases
5071 at least all accesses the later one does or if the store
5072 was to readonly memory storing the same value. */
5073 alias_set_type set = get_alias_set (lhs);
5074 if (! vnresult
5075 || vnresult->set == set
5076 || alias_set_subset_of (set, vnresult->set))
5078 if (dump_file && (dump_flags & TDF_DETAILS))
5080 fprintf (dump_file, "Deleted redundant store ");
5081 print_gimple_stmt (dump_file, stmt, 0);
5084 /* Queue stmt for removal. */
5085 to_remove.safe_push (stmt);
5086 return;
5091 /* If this is a control statement value numbering left edges
5092 unexecuted on force the condition in a way consistent with
5093 that. */
5094 if (gcond *cond = dyn_cast <gcond *> (stmt))
5096 if ((EDGE_SUCC (b, 0)->flags & EDGE_EXECUTABLE)
5097 ^ (EDGE_SUCC (b, 1)->flags & EDGE_EXECUTABLE))
5099 if (dump_file && (dump_flags & TDF_DETAILS))
5101 fprintf (dump_file, "Removing unexecutable edge from ");
5102 print_gimple_stmt (dump_file, stmt, 0);
5104 if (((EDGE_SUCC (b, 0)->flags & EDGE_TRUE_VALUE) != 0)
5105 == ((EDGE_SUCC (b, 0)->flags & EDGE_EXECUTABLE) != 0))
5106 gimple_cond_make_true (cond);
5107 else
5108 gimple_cond_make_false (cond);
5109 update_stmt (cond);
5110 el_todo |= TODO_cleanup_cfg;
5111 return;
5115 bool can_make_abnormal_goto = stmt_can_make_abnormal_goto (stmt);
5116 bool was_noreturn = (is_gimple_call (stmt)
5117 && gimple_call_noreturn_p (stmt));
5118 tree vdef = gimple_vdef (stmt);
5119 tree vuse = gimple_vuse (stmt);
5121 /* If we didn't replace the whole stmt (or propagate the result
5122 into all uses), replace all uses on this stmt with their
5123 leaders. */
5124 bool modified = false;
5125 use_operand_p use_p;
5126 ssa_op_iter iter;
5127 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
5129 tree use = USE_FROM_PTR (use_p);
5130 /* ??? The call code above leaves stmt operands un-updated. */
5131 if (TREE_CODE (use) != SSA_NAME)
5132 continue;
5133 tree sprime;
5134 if (SSA_NAME_IS_DEFAULT_DEF (use))
5135 /* ??? For default defs BB shouldn't matter, but we have to
5136 solve the inconsistency between rpo eliminate and
5137 dom eliminate avail valueization first. */
5138 sprime = eliminate_avail (b, use);
5139 else
5140 /* Look for sth available at the definition block of the argument.
5141 This avoids inconsistencies between availability there which
5142 decides if the stmt can be removed and availability at the
5143 use site. The SSA property ensures that things available
5144 at the definition are also available at uses. */
5145 sprime = eliminate_avail (gimple_bb (SSA_NAME_DEF_STMT (use)), use);
5146 if (sprime && sprime != use
5147 && may_propagate_copy (use, sprime)
5148 /* We substitute into debug stmts to avoid excessive
5149 debug temporaries created by removed stmts, but we need
5150 to avoid doing so for inserted sprimes as we never want
5151 to create debug temporaries for them. */
5152 && (!inserted_exprs
5153 || TREE_CODE (sprime) != SSA_NAME
5154 || !is_gimple_debug (stmt)
5155 || !bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (sprime))))
5157 propagate_value (use_p, sprime);
5158 modified = true;
5162 /* Fold the stmt if modified, this canonicalizes MEM_REFs we propagated
5163 into which is a requirement for the IPA devirt machinery. */
5164 gimple *old_stmt = stmt;
5165 if (modified)
5167 /* If a formerly non-invariant ADDR_EXPR is turned into an
5168 invariant one it was on a separate stmt. */
5169 if (gimple_assign_single_p (stmt)
5170 && TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR)
5171 recompute_tree_invariant_for_addr_expr (gimple_assign_rhs1 (stmt));
5172 gimple_stmt_iterator prev = *gsi;
5173 gsi_prev (&prev);
5174 if (fold_stmt (gsi))
5176 /* fold_stmt may have created new stmts inbetween
5177 the previous stmt and the folded stmt. Mark
5178 all defs created there as varying to not confuse
5179 the SCCVN machinery as we're using that even during
5180 elimination. */
5181 if (gsi_end_p (prev))
5182 prev = gsi_start_bb (b);
5183 else
5184 gsi_next (&prev);
5185 if (gsi_stmt (prev) != gsi_stmt (*gsi))
5188 tree def;
5189 ssa_op_iter dit;
5190 FOR_EACH_SSA_TREE_OPERAND (def, gsi_stmt (prev),
5191 dit, SSA_OP_ALL_DEFS)
5192 /* As existing DEFs may move between stmts
5193 only process new ones. */
5194 if (! has_VN_INFO (def))
5196 VN_INFO (def)->valnum = def;
5197 VN_INFO (def)->visited = true;
5199 if (gsi_stmt (prev) == gsi_stmt (*gsi))
5200 break;
5201 gsi_next (&prev);
5203 while (1);
5205 stmt = gsi_stmt (*gsi);
5206 /* In case we folded the stmt away schedule the NOP for removal. */
5207 if (gimple_nop_p (stmt))
5208 to_remove.safe_push (stmt);
5211 /* Visit indirect calls and turn them into direct calls if
5212 possible using the devirtualization machinery. Do this before
5213 checking for required EH/abnormal/noreturn cleanup as devird
5214 may expose more of those. */
5215 if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
5217 tree fn = gimple_call_fn (call_stmt);
5218 if (fn
5219 && flag_devirtualize
5220 && virtual_method_call_p (fn))
5222 tree otr_type = obj_type_ref_class (fn);
5223 unsigned HOST_WIDE_INT otr_tok
5224 = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (fn));
5225 tree instance;
5226 ipa_polymorphic_call_context context (current_function_decl,
5227 fn, stmt, &instance);
5228 context.get_dynamic_type (instance, OBJ_TYPE_REF_OBJECT (fn),
5229 otr_type, stmt);
5230 bool final;
5231 vec <cgraph_node *> targets
5232 = possible_polymorphic_call_targets (obj_type_ref_class (fn),
5233 otr_tok, context, &final);
5234 if (dump_file)
5235 dump_possible_polymorphic_call_targets (dump_file,
5236 obj_type_ref_class (fn),
5237 otr_tok, context);
5238 if (final && targets.length () <= 1 && dbg_cnt (devirt))
5240 tree fn;
5241 if (targets.length () == 1)
5242 fn = targets[0]->decl;
5243 else
5244 fn = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
5245 if (dump_enabled_p ())
5247 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
5248 "converting indirect call to "
5249 "function %s\n",
5250 lang_hooks.decl_printable_name (fn, 2));
5252 gimple_call_set_fndecl (call_stmt, fn);
5253 /* If changing the call to __builtin_unreachable
5254 or similar noreturn function, adjust gimple_call_fntype
5255 too. */
5256 if (gimple_call_noreturn_p (call_stmt)
5257 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))
5258 && TYPE_ARG_TYPES (TREE_TYPE (fn))
5259 && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fn)))
5260 == void_type_node))
5261 gimple_call_set_fntype (call_stmt, TREE_TYPE (fn));
5262 maybe_remove_unused_call_args (cfun, call_stmt);
5263 modified = true;
5268 if (modified)
5270 /* When changing a call into a noreturn call, cfg cleanup
5271 is needed to fix up the noreturn call. */
5272 if (!was_noreturn
5273 && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
5274 to_fixup.safe_push (stmt);
5275 /* When changing a condition or switch into one we know what
5276 edge will be executed, schedule a cfg cleanup. */
5277 if ((gimple_code (stmt) == GIMPLE_COND
5278 && (gimple_cond_true_p (as_a <gcond *> (stmt))
5279 || gimple_cond_false_p (as_a <gcond *> (stmt))))
5280 || (gimple_code (stmt) == GIMPLE_SWITCH
5281 && TREE_CODE (gimple_switch_index
5282 (as_a <gswitch *> (stmt))) == INTEGER_CST))
5283 el_todo |= TODO_cleanup_cfg;
5284 /* If we removed EH side-effects from the statement, clean
5285 its EH information. */
5286 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
5288 bitmap_set_bit (need_eh_cleanup,
5289 gimple_bb (stmt)->index);
5290 if (dump_file && (dump_flags & TDF_DETAILS))
5291 fprintf (dump_file, " Removed EH side-effects.\n");
5293 /* Likewise for AB side-effects. */
5294 if (can_make_abnormal_goto
5295 && !stmt_can_make_abnormal_goto (stmt))
5297 bitmap_set_bit (need_ab_cleanup,
5298 gimple_bb (stmt)->index);
5299 if (dump_file && (dump_flags & TDF_DETAILS))
5300 fprintf (dump_file, " Removed AB side-effects.\n");
5302 update_stmt (stmt);
5303 /* In case the VDEF on the original stmt was released, value-number
5304 it to the VUSE. This is to make vuse_ssa_val able to skip
5305 released virtual operands. */
5306 if (vdef && SSA_NAME_IN_FREE_LIST (vdef))
5307 VN_INFO (vdef)->valnum = vuse;
5310 /* Make new values available - for fully redundant LHS we
5311 continue with the next stmt above and skip this. */
5312 def_operand_p defp;
5313 FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
5314 eliminate_push_avail (b, DEF_FROM_PTR (defp));
5317 /* Perform elimination for the basic-block B during the domwalk. */
5319 edge
5320 eliminate_dom_walker::before_dom_children (basic_block b)
5322 /* Mark new bb. */
5323 avail_stack.safe_push (NULL_TREE);
5325 /* Skip unreachable blocks marked unreachable during the SCCVN domwalk. */
5326 if (!(b->flags & BB_EXECUTABLE))
5327 return NULL;
5329 vn_context_bb = b;
5331 for (gphi_iterator gsi = gsi_start_phis (b); !gsi_end_p (gsi);)
5333 gphi *phi = gsi.phi ();
5334 tree res = PHI_RESULT (phi);
5336 if (virtual_operand_p (res))
5338 gsi_next (&gsi);
5339 continue;
5342 tree sprime = eliminate_avail (b, res);
5343 if (sprime
5344 && sprime != res)
5346 if (dump_file && (dump_flags & TDF_DETAILS))
5348 fprintf (dump_file, "Replaced redundant PHI node defining ");
5349 print_generic_expr (dump_file, res);
5350 fprintf (dump_file, " with ");
5351 print_generic_expr (dump_file, sprime);
5352 fprintf (dump_file, "\n");
5355 /* If we inserted this PHI node ourself, it's not an elimination. */
5356 if (! inserted_exprs
5357 || ! bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (res)))
5358 eliminations++;
5360 /* If we will propagate into all uses don't bother to do
5361 anything. */
5362 if (may_propagate_copy (res, sprime))
5364 /* Mark the PHI for removal. */
5365 to_remove.safe_push (phi);
5366 gsi_next (&gsi);
5367 continue;
5370 remove_phi_node (&gsi, false);
5372 if (!useless_type_conversion_p (TREE_TYPE (res), TREE_TYPE (sprime)))
5373 sprime = fold_convert (TREE_TYPE (res), sprime);
5374 gimple *stmt = gimple_build_assign (res, sprime);
5375 gimple_stmt_iterator gsi2 = gsi_after_labels (b);
5376 gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
5377 continue;
5380 eliminate_push_avail (b, res);
5381 gsi_next (&gsi);
5384 for (gimple_stmt_iterator gsi = gsi_start_bb (b);
5385 !gsi_end_p (gsi);
5386 gsi_next (&gsi))
5387 eliminate_stmt (b, &gsi);
5389 /* Replace destination PHI arguments. */
5390 edge_iterator ei;
5391 edge e;
5392 FOR_EACH_EDGE (e, ei, b->succs)
5393 if (e->flags & EDGE_EXECUTABLE)
5394 for (gphi_iterator gsi = gsi_start_phis (e->dest);
5395 !gsi_end_p (gsi);
5396 gsi_next (&gsi))
5398 gphi *phi = gsi.phi ();
5399 use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
5400 tree arg = USE_FROM_PTR (use_p);
5401 if (TREE_CODE (arg) != SSA_NAME
5402 || virtual_operand_p (arg))
5403 continue;
5404 tree sprime = eliminate_avail (b, arg);
5405 if (sprime && may_propagate_copy (arg, sprime))
5406 propagate_value (use_p, sprime);
5409 vn_context_bb = NULL;
5411 return NULL;
5414 /* Make no longer available leaders no longer available. */
5416 void
5417 eliminate_dom_walker::after_dom_children (basic_block)
5419 tree entry;
5420 while ((entry = avail_stack.pop ()) != NULL_TREE)
5422 tree valnum = VN_INFO (entry)->valnum;
5423 tree old = avail[SSA_NAME_VERSION (valnum)];
5424 if (old == entry)
5425 avail[SSA_NAME_VERSION (valnum)] = NULL_TREE;
5426 else
5427 avail[SSA_NAME_VERSION (valnum)] = entry;
5431 /* Remove queued stmts and perform delayed cleanups. */
5433 unsigned
5434 eliminate_dom_walker::eliminate_cleanup (bool region_p)
5436 statistics_counter_event (cfun, "Eliminated", eliminations);
5437 statistics_counter_event (cfun, "Insertions", insertions);
5439 /* We cannot remove stmts during BB walk, especially not release SSA
5440 names there as this confuses the VN machinery. The stmts ending
5441 up in to_remove are either stores or simple copies.
5442 Remove stmts in reverse order to make debug stmt creation possible. */
5443 while (!to_remove.is_empty ())
5445 bool do_release_defs = true;
5446 gimple *stmt = to_remove.pop ();
5448 /* When we are value-numbering a region we do not require exit PHIs to
5449 be present so we have to make sure to deal with uses outside of the
5450 region of stmts that we thought are eliminated.
5451 ??? Note we may be confused by uses in dead regions we didn't run
5452 elimination on. Rather than checking individual uses we accept
5453 dead copies to be generated here (gcc.c-torture/execute/20060905-1.c
5454 contains such example). */
5455 if (region_p)
5457 if (gphi *phi = dyn_cast <gphi *> (stmt))
5459 tree lhs = gimple_phi_result (phi);
5460 if (!has_zero_uses (lhs))
5462 if (dump_file && (dump_flags & TDF_DETAILS))
5463 fprintf (dump_file, "Keeping eliminated stmt live "
5464 "as copy because of out-of-region uses\n");
5465 tree sprime = eliminate_avail (gimple_bb (stmt), lhs);
5466 gimple *copy = gimple_build_assign (lhs, sprime);
5467 gimple_stmt_iterator gsi
5468 = gsi_after_labels (gimple_bb (stmt));
5469 gsi_insert_before (&gsi, copy, GSI_SAME_STMT);
5470 do_release_defs = false;
5473 else if (tree lhs = gimple_get_lhs (stmt))
5474 if (TREE_CODE (lhs) == SSA_NAME
5475 && !has_zero_uses (lhs))
5477 if (dump_file && (dump_flags & TDF_DETAILS))
5478 fprintf (dump_file, "Keeping eliminated stmt live "
5479 "as copy because of out-of-region uses\n");
5480 tree sprime = eliminate_avail (gimple_bb (stmt), lhs);
5481 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
5482 if (is_gimple_assign (stmt))
5484 gimple_assign_set_rhs_from_tree (&gsi, sprime);
5485 stmt = gsi_stmt (gsi);
5486 update_stmt (stmt);
5487 if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
5488 bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
5489 continue;
5491 else
5493 gimple *copy = gimple_build_assign (lhs, sprime);
5494 gsi_insert_before (&gsi, copy, GSI_SAME_STMT);
5495 do_release_defs = false;
5500 if (dump_file && (dump_flags & TDF_DETAILS))
5502 fprintf (dump_file, "Removing dead stmt ");
5503 print_gimple_stmt (dump_file, stmt, 0, TDF_NONE);
5506 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
5507 if (gimple_code (stmt) == GIMPLE_PHI)
5508 remove_phi_node (&gsi, do_release_defs);
5509 else
5511 basic_block bb = gimple_bb (stmt);
5512 unlink_stmt_vdef (stmt);
5513 if (gsi_remove (&gsi, true))
5514 bitmap_set_bit (need_eh_cleanup, bb->index);
5515 if (is_gimple_call (stmt) && stmt_can_make_abnormal_goto (stmt))
5516 bitmap_set_bit (need_ab_cleanup, bb->index);
5517 if (do_release_defs)
5518 release_defs (stmt);
5521 /* Removing a stmt may expose a forwarder block. */
5522 el_todo |= TODO_cleanup_cfg;
5525 /* Fixup stmts that became noreturn calls. This may require splitting
5526 blocks and thus isn't possible during the dominator walk. Do this
5527 in reverse order so we don't inadvertedly remove a stmt we want to
5528 fixup by visiting a dominating now noreturn call first. */
5529 while (!to_fixup.is_empty ())
5531 gimple *stmt = to_fixup.pop ();
5533 if (dump_file && (dump_flags & TDF_DETAILS))
5535 fprintf (dump_file, "Fixing up noreturn call ");
5536 print_gimple_stmt (dump_file, stmt, 0);
5539 if (fixup_noreturn_call (stmt))
5540 el_todo |= TODO_cleanup_cfg;
5543 bool do_eh_cleanup = !bitmap_empty_p (need_eh_cleanup);
5544 bool do_ab_cleanup = !bitmap_empty_p (need_ab_cleanup);
5546 if (do_eh_cleanup)
5547 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
5549 if (do_ab_cleanup)
5550 gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
5552 if (do_eh_cleanup || do_ab_cleanup)
5553 el_todo |= TODO_cleanup_cfg;
5555 return el_todo;
5558 /* Eliminate fully redundant computations. */
5560 unsigned
5561 eliminate_with_rpo_vn (bitmap inserted_exprs)
5563 eliminate_dom_walker walker (CDI_DOMINATORS, inserted_exprs);
5565 walker.walk (cfun->cfg->x_entry_block_ptr);
5566 return walker.eliminate_cleanup ();
5569 static unsigned
5570 do_rpo_vn (function *fn, edge entry, bitmap exit_bbs,
5571 bool iterate, bool eliminate);
5573 void
5574 run_rpo_vn (vn_lookup_kind kind)
5576 default_vn_walk_kind = kind;
5577 do_rpo_vn (cfun, NULL, NULL, true, false);
5579 /* ??? Prune requirement of these. */
5580 constant_to_value_id = new hash_table<vn_constant_hasher> (23);
5581 constant_value_ids = BITMAP_ALLOC (NULL);
5583 /* Initialize the value ids and prune out remaining VN_TOPs
5584 from dead code. */
5585 tree name;
5586 unsigned i;
5587 FOR_EACH_SSA_NAME (i, name, cfun)
5589 vn_ssa_aux_t info = VN_INFO (name);
5590 if (!info->visited
5591 || info->valnum == VN_TOP)
5592 info->valnum = name;
5593 if (info->valnum == name)
5594 info->value_id = get_next_value_id ();
5595 else if (is_gimple_min_invariant (info->valnum))
5596 info->value_id = get_or_alloc_constant_value_id (info->valnum);
5599 /* Propagate. */
5600 FOR_EACH_SSA_NAME (i, name, cfun)
5602 vn_ssa_aux_t info = VN_INFO (name);
5603 if (TREE_CODE (info->valnum) == SSA_NAME
5604 && info->valnum != name
5605 && info->value_id != VN_INFO (info->valnum)->value_id)
5606 info->value_id = VN_INFO (info->valnum)->value_id;
5609 set_hashtable_value_ids ();
5611 if (dump_file && (dump_flags & TDF_DETAILS))
5613 fprintf (dump_file, "Value numbers:\n");
5614 FOR_EACH_SSA_NAME (i, name, cfun)
5616 if (VN_INFO (name)->visited
5617 && SSA_VAL (name) != name)
5619 print_generic_expr (dump_file, name);
5620 fprintf (dump_file, " = ");
5621 print_generic_expr (dump_file, SSA_VAL (name));
5622 fprintf (dump_file, " (%04d)\n", VN_INFO (name)->value_id);
5628 /* Free VN associated data structures. */
5630 void
5631 free_rpo_vn (void)
5633 free_vn_table (valid_info);
5634 XDELETE (valid_info);
5635 obstack_free (&vn_tables_obstack, NULL);
5636 obstack_free (&vn_tables_insert_obstack, NULL);
5638 vn_ssa_aux_iterator_type it;
5639 vn_ssa_aux_t info;
5640 FOR_EACH_HASH_TABLE_ELEMENT (*vn_ssa_aux_hash, info, vn_ssa_aux_t, it)
5641 if (info->needs_insertion)
5642 release_ssa_name (info->name);
5643 obstack_free (&vn_ssa_aux_obstack, NULL);
5644 delete vn_ssa_aux_hash;
5646 delete constant_to_value_id;
5647 constant_to_value_id = NULL;
5648 BITMAP_FREE (constant_value_ids);
5651 /* Adaptor to the elimination engine using RPO availability. */
5653 class rpo_elim : public eliminate_dom_walker
5655 public:
5656 rpo_elim(basic_block entry_)
5657 : eliminate_dom_walker (CDI_DOMINATORS, NULL), entry (entry_) {}
5658 ~rpo_elim();
5660 virtual tree eliminate_avail (basic_block, tree op);
5662 virtual void eliminate_push_avail (basic_block, tree);
5664 basic_block entry;
5665 /* Instead of having a local availability lattice for each
5666 basic-block and availability at X defined as union of
5667 the local availabilities at X and its dominators we're
5668 turning this upside down and track availability per
5669 value given values are usually made available at very
5670 few points (at least one).
5671 So we have a value -> vec<location, leader> map where
5672 LOCATION is specifying the basic-block LEADER is made
5673 available for VALUE. We push to this vector in RPO
5674 order thus for iteration we can simply pop the last
5675 entries.
5676 LOCATION is the basic-block index and LEADER is its
5677 SSA name version. */
5678 /* ??? We'd like to use auto_vec here with embedded storage
5679 but that doesn't play well until we can provide move
5680 constructors and use std::move on hash-table expansion.
5681 So for now this is a bit more expensive than necessary.
5682 We eventually want to switch to a chaining scheme like
5683 for hashtable entries for unwinding which would make
5684 making the vector part of the vn_ssa_aux structure possible. */
5685 typedef hash_map<tree, vec<std::pair<int, int> > > rpo_avail_t;
5686 rpo_avail_t m_rpo_avail;
5689 /* Global RPO state for access from hooks. */
5690 static rpo_elim *rpo_avail;
5692 /* Hook for maybe_push_res_to_seq, lookup the expression in the VN tables. */
5694 static tree
5695 vn_lookup_simplify_result (gimple_match_op *res_op)
5697 if (!res_op->code.is_tree_code ())
5698 return NULL_TREE;
5699 tree *ops = res_op->ops;
5700 unsigned int length = res_op->num_ops;
5701 if (res_op->code == CONSTRUCTOR
5702 /* ??? We're arriving here with SCCVNs view, decomposed CONSTRUCTOR
5703 and GIMPLEs / match-and-simplifies, CONSTRUCTOR as GENERIC tree. */
5704 && TREE_CODE (res_op->ops[0]) == CONSTRUCTOR)
5706 length = CONSTRUCTOR_NELTS (res_op->ops[0]);
5707 ops = XALLOCAVEC (tree, length);
5708 for (unsigned i = 0; i < length; ++i)
5709 ops[i] = CONSTRUCTOR_ELT (res_op->ops[0], i)->value;
5711 vn_nary_op_t vnresult = NULL;
5712 tree res = vn_nary_op_lookup_pieces (length, (tree_code) res_op->code,
5713 res_op->type, ops, &vnresult);
5714 /* If this is used from expression simplification make sure to
5715 return an available expression. */
5716 if (res && TREE_CODE (res) == SSA_NAME && mprts_hook && rpo_avail)
5717 res = rpo_avail->eliminate_avail (vn_context_bb, res);
5718 return res;
5721 rpo_elim::~rpo_elim ()
5723 /* Release the avail vectors. */
5724 for (rpo_avail_t::iterator i = m_rpo_avail.begin ();
5725 i != m_rpo_avail.end (); ++i)
5726 (*i).second.release ();
5729 /* Return a leader for OPs value that is valid at BB. */
5731 tree
5732 rpo_elim::eliminate_avail (basic_block bb, tree op)
5734 bool visited;
5735 tree valnum = SSA_VAL (op, &visited);
5736 /* If we didn't visit OP then it must be defined outside of the
5737 region we process and also dominate it. So it is available. */
5738 if (!visited)
5739 return op;
5740 if (TREE_CODE (valnum) == SSA_NAME)
5742 if (SSA_NAME_IS_DEFAULT_DEF (valnum))
5743 return valnum;
5744 vec<std::pair<int, int> > *av = m_rpo_avail.get (valnum);
5745 if (!av || av->is_empty ())
5746 return NULL_TREE;
5747 int i = av->length () - 1;
5748 if ((*av)[i].first == bb->index)
5749 /* On tramp3d 90% of the cases are here. */
5750 return ssa_name ((*av)[i].second);
5753 basic_block abb = BASIC_BLOCK_FOR_FN (cfun, (*av)[i].first);
5754 /* ??? During elimination we have to use availability at the
5755 definition site of a use we try to replace. This
5756 is required to not run into inconsistencies because
5757 of dominated_by_p_w_unex behavior and removing a definition
5758 while not replacing all uses.
5759 ??? We could try to consistently walk dominators
5760 ignoring non-executable regions. The nearest common
5761 dominator of bb and abb is where we can stop walking. We
5762 may also be able to "pre-compute" (bits of) the next immediate
5763 (non-)dominator during the RPO walk when marking edges as
5764 executable. */
5765 if (dominated_by_p_w_unex (bb, abb))
5767 tree leader = ssa_name ((*av)[i].second);
5768 /* Prevent eliminations that break loop-closed SSA. */
5769 if (loops_state_satisfies_p (LOOP_CLOSED_SSA)
5770 && ! SSA_NAME_IS_DEFAULT_DEF (leader)
5771 && ! flow_bb_inside_loop_p (gimple_bb (SSA_NAME_DEF_STMT
5772 (leader))->loop_father,
5773 bb))
5774 return NULL_TREE;
5775 if (dump_file && (dump_flags & TDF_DETAILS))
5777 print_generic_expr (dump_file, leader);
5778 fprintf (dump_file, " is available for ");
5779 print_generic_expr (dump_file, valnum);
5780 fprintf (dump_file, "\n");
5782 /* On tramp3d 99% of the _remaining_ cases succeed at
5783 the first enty. */
5784 return leader;
5786 /* ??? Can we somehow skip to the immediate dominator
5787 RPO index (bb_to_rpo)? Again, maybe not worth, on
5788 tramp3d the worst number of elements in the vector is 9. */
5790 while (--i >= 0);
5792 else if (valnum != VN_TOP)
5793 /* valnum is is_gimple_min_invariant. */
5794 return valnum;
5795 return NULL_TREE;
5798 /* Make LEADER a leader for its value at BB. */
5800 void
5801 rpo_elim::eliminate_push_avail (basic_block bb, tree leader)
5803 tree valnum = VN_INFO (leader)->valnum;
5804 if (valnum == VN_TOP)
5805 return;
5806 if (dump_file && (dump_flags & TDF_DETAILS))
5808 fprintf (dump_file, "Making available beyond BB%d ", bb->index);
5809 print_generic_expr (dump_file, leader);
5810 fprintf (dump_file, " for value ");
5811 print_generic_expr (dump_file, valnum);
5812 fprintf (dump_file, "\n");
5814 bool existed;
5815 vec<std::pair<int, int> > &av = m_rpo_avail.get_or_insert (valnum, &existed);
5816 if (!existed)
5818 new (&av) vec<std::pair<int, int> >;
5819 av = vNULL;
5820 av.reserve_exact (2);
5822 av.safe_push (std::make_pair (bb->index, SSA_NAME_VERSION (leader)));
5825 /* Valueization hook for RPO VN plus required state. */
5827 tree
5828 rpo_vn_valueize (tree name)
5830 if (TREE_CODE (name) == SSA_NAME)
5832 vn_ssa_aux_t val = VN_INFO (name);
5833 if (val)
5835 tree tem = val->valnum;
5836 if (tem != VN_TOP && tem != name)
5838 if (TREE_CODE (tem) != SSA_NAME)
5839 return tem;
5840 /* For all values we only valueize to an available leader
5841 which means we can use SSA name info without restriction. */
5842 tem = rpo_avail->eliminate_avail (vn_context_bb, tem);
5843 if (tem)
5844 return tem;
5848 return name;
5851 /* Insert on PRED_E predicates derived from CODE OPS being true besides the
5852 inverted condition. */
5854 static void
5855 insert_related_predicates_on_edge (enum tree_code code, tree *ops, edge pred_e)
5857 switch (code)
5859 case LT_EXPR:
5860 /* a < b -> a {!,<}= b */
5861 vn_nary_op_insert_pieces_predicated (2, NE_EXPR, boolean_type_node,
5862 ops, boolean_true_node, 0, pred_e);
5863 vn_nary_op_insert_pieces_predicated (2, LE_EXPR, boolean_type_node,
5864 ops, boolean_true_node, 0, pred_e);
5865 /* a < b -> ! a {>,=} b */
5866 vn_nary_op_insert_pieces_predicated (2, GT_EXPR, boolean_type_node,
5867 ops, boolean_false_node, 0, pred_e);
5868 vn_nary_op_insert_pieces_predicated (2, EQ_EXPR, boolean_type_node,
5869 ops, boolean_false_node, 0, pred_e);
5870 break;
5871 case GT_EXPR:
5872 /* a > b -> a {!,>}= b */
5873 vn_nary_op_insert_pieces_predicated (2, NE_EXPR, boolean_type_node,
5874 ops, boolean_true_node, 0, pred_e);
5875 vn_nary_op_insert_pieces_predicated (2, GE_EXPR, boolean_type_node,
5876 ops, boolean_true_node, 0, pred_e);
5877 /* a > b -> ! a {<,=} b */
5878 vn_nary_op_insert_pieces_predicated (2, LT_EXPR, boolean_type_node,
5879 ops, boolean_false_node, 0, pred_e);
5880 vn_nary_op_insert_pieces_predicated (2, EQ_EXPR, boolean_type_node,
5881 ops, boolean_false_node, 0, pred_e);
5882 break;
5883 case EQ_EXPR:
5884 /* a == b -> ! a {<,>} b */
5885 vn_nary_op_insert_pieces_predicated (2, LT_EXPR, boolean_type_node,
5886 ops, boolean_false_node, 0, pred_e);
5887 vn_nary_op_insert_pieces_predicated (2, GT_EXPR, boolean_type_node,
5888 ops, boolean_false_node, 0, pred_e);
5889 break;
5890 case LE_EXPR:
5891 case GE_EXPR:
5892 case NE_EXPR:
5893 /* Nothing besides inverted condition. */
5894 break;
5895 default:;
5899 /* Main stmt worker for RPO VN, process BB. */
5901 static unsigned
5902 process_bb (rpo_elim &avail, basic_block bb,
5903 bool bb_visited, bool iterate_phis, bool iterate, bool eliminate,
5904 bool do_region, bitmap exit_bbs)
5906 unsigned todo = 0;
5907 edge_iterator ei;
5908 edge e;
5910 vn_context_bb = bb;
5912 /* If we are in loop-closed SSA preserve this state. This is
5913 relevant when called on regions from outside of FRE/PRE. */
5914 bool lc_phi_nodes = false;
5915 if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
5916 FOR_EACH_EDGE (e, ei, bb->preds)
5917 if (e->src->loop_father != e->dest->loop_father
5918 && flow_loop_nested_p (e->dest->loop_father,
5919 e->src->loop_father))
5921 lc_phi_nodes = true;
5922 break;
5925 /* When we visit a loop header substitute into loop info. */
5926 if (!iterate && eliminate && bb->loop_father->header == bb)
5928 /* Keep fields in sync with substitute_in_loop_info. */
5929 if (bb->loop_father->nb_iterations)
5930 bb->loop_father->nb_iterations
5931 = simplify_replace_tree (bb->loop_father->nb_iterations,
5932 NULL_TREE, NULL_TREE, vn_valueize);
5935 /* Value-number all defs in the basic-block. */
5936 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
5937 gsi_next (&gsi))
5939 gphi *phi = gsi.phi ();
5940 tree res = PHI_RESULT (phi);
5941 vn_ssa_aux_t res_info = VN_INFO (res);
5942 if (!bb_visited)
5944 gcc_assert (!res_info->visited);
5945 res_info->valnum = VN_TOP;
5946 res_info->visited = true;
5949 /* When not iterating force backedge values to varying. */
5950 visit_stmt (phi, !iterate_phis);
5951 if (virtual_operand_p (res))
5952 continue;
5954 /* Eliminate */
5955 /* The interesting case is gcc.dg/tree-ssa/pr22230.c for correctness
5956 how we handle backedges and availability.
5957 And gcc.dg/tree-ssa/ssa-sccvn-2.c for optimization. */
5958 tree val = res_info->valnum;
5959 if (res != val && !iterate && eliminate)
5961 if (tree leader = avail.eliminate_avail (bb, res))
5963 if (leader != res
5964 /* Preserve loop-closed SSA form. */
5965 && (! lc_phi_nodes
5966 || is_gimple_min_invariant (leader)))
5968 if (dump_file && (dump_flags & TDF_DETAILS))
5970 fprintf (dump_file, "Replaced redundant PHI node "
5971 "defining ");
5972 print_generic_expr (dump_file, res);
5973 fprintf (dump_file, " with ");
5974 print_generic_expr (dump_file, leader);
5975 fprintf (dump_file, "\n");
5977 avail.eliminations++;
5979 if (may_propagate_copy (res, leader))
5981 /* Schedule for removal. */
5982 avail.to_remove.safe_push (phi);
5983 continue;
5985 /* ??? Else generate a copy stmt. */
5989 /* Only make defs available that not already are. But make
5990 sure loop-closed SSA PHI node defs are picked up for
5991 downstream uses. */
5992 if (lc_phi_nodes
5993 || res == val
5994 || ! avail.eliminate_avail (bb, res))
5995 avail.eliminate_push_avail (bb, res);
5998 /* For empty BBs mark outgoing edges executable. For non-empty BBs
5999 we do this when processing the last stmt as we have to do this
6000 before elimination which otherwise forces GIMPLE_CONDs to
6001 if (1 != 0) style when seeing non-executable edges. */
6002 if (gsi_end_p (gsi_start_bb (bb)))
6004 FOR_EACH_EDGE (e, ei, bb->succs)
6006 if (!(e->flags & EDGE_EXECUTABLE))
6008 if (dump_file && (dump_flags & TDF_DETAILS))
6009 fprintf (dump_file,
6010 "marking outgoing edge %d -> %d executable\n",
6011 e->src->index, e->dest->index);
6012 e->flags |= EDGE_EXECUTABLE;
6013 e->dest->flags |= BB_EXECUTABLE;
6015 else if (!(e->dest->flags & BB_EXECUTABLE))
6017 if (dump_file && (dump_flags & TDF_DETAILS))
6018 fprintf (dump_file,
6019 "marking destination block %d reachable\n",
6020 e->dest->index);
6021 e->dest->flags |= BB_EXECUTABLE;
6025 for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
6026 !gsi_end_p (gsi); gsi_next (&gsi))
6028 ssa_op_iter i;
6029 tree op;
6030 if (!bb_visited)
6032 FOR_EACH_SSA_TREE_OPERAND (op, gsi_stmt (gsi), i, SSA_OP_ALL_DEFS)
6034 vn_ssa_aux_t op_info = VN_INFO (op);
6035 gcc_assert (!op_info->visited);
6036 op_info->valnum = VN_TOP;
6037 op_info->visited = true;
6040 /* We somehow have to deal with uses that are not defined
6041 in the processed region. Forcing unvisited uses to
6042 varying here doesn't play well with def-use following during
6043 expression simplification, so we deal with this by checking
6044 the visited flag in SSA_VAL. */
6047 visit_stmt (gsi_stmt (gsi));
6049 gimple *last = gsi_stmt (gsi);
6050 e = NULL;
6051 switch (gimple_code (last))
6053 case GIMPLE_SWITCH:
6054 e = find_taken_edge (bb, vn_valueize (gimple_switch_index
6055 (as_a <gswitch *> (last))));
6056 break;
6057 case GIMPLE_COND:
6059 tree lhs = vn_valueize (gimple_cond_lhs (last));
6060 tree rhs = vn_valueize (gimple_cond_rhs (last));
6061 tree val = gimple_simplify (gimple_cond_code (last),
6062 boolean_type_node, lhs, rhs,
6063 NULL, vn_valueize);
6064 /* If the condition didn't simplfy see if we have recorded
6065 an expression from sofar taken edges. */
6066 if (! val || TREE_CODE (val) != INTEGER_CST)
6068 vn_nary_op_t vnresult;
6069 tree ops[2];
6070 ops[0] = lhs;
6071 ops[1] = rhs;
6072 val = vn_nary_op_lookup_pieces (2, gimple_cond_code (last),
6073 boolean_type_node, ops,
6074 &vnresult);
6075 /* Did we get a predicated value? */
6076 if (! val && vnresult && vnresult->predicated_values)
6078 val = vn_nary_op_get_predicated_value (vnresult, bb);
6079 if (val && dump_file && (dump_flags & TDF_DETAILS))
6081 fprintf (dump_file, "Got predicated value ");
6082 print_generic_expr (dump_file, val, TDF_NONE);
6083 fprintf (dump_file, " for ");
6084 print_gimple_stmt (dump_file, last, TDF_SLIM);
6088 if (val)
6089 e = find_taken_edge (bb, val);
6090 if (! e)
6092 /* If we didn't manage to compute the taken edge then
6093 push predicated expressions for the condition itself
6094 and related conditions to the hashtables. This allows
6095 simplification of redundant conditions which is
6096 important as early cleanup. */
6097 edge true_e, false_e;
6098 extract_true_false_edges_from_block (bb, &true_e, &false_e);
6099 enum tree_code code = gimple_cond_code (last);
6100 enum tree_code icode
6101 = invert_tree_comparison (code, HONOR_NANS (lhs));
6102 tree ops[2];
6103 ops[0] = lhs;
6104 ops[1] = rhs;
6105 if (do_region
6106 && bitmap_bit_p (exit_bbs, true_e->dest->index))
6107 true_e = NULL;
6108 if (do_region
6109 && bitmap_bit_p (exit_bbs, false_e->dest->index))
6110 false_e = NULL;
6111 if (true_e)
6112 vn_nary_op_insert_pieces_predicated
6113 (2, code, boolean_type_node, ops,
6114 boolean_true_node, 0, true_e);
6115 if (false_e)
6116 vn_nary_op_insert_pieces_predicated
6117 (2, code, boolean_type_node, ops,
6118 boolean_false_node, 0, false_e);
6119 if (icode != ERROR_MARK)
6121 if (true_e)
6122 vn_nary_op_insert_pieces_predicated
6123 (2, icode, boolean_type_node, ops,
6124 boolean_false_node, 0, true_e);
6125 if (false_e)
6126 vn_nary_op_insert_pieces_predicated
6127 (2, icode, boolean_type_node, ops,
6128 boolean_true_node, 0, false_e);
6130 /* Relax for non-integers, inverted condition handled
6131 above. */
6132 if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
6134 if (true_e)
6135 insert_related_predicates_on_edge (code, ops, true_e);
6136 if (false_e)
6137 insert_related_predicates_on_edge (icode, ops, false_e);
6140 break;
6142 case GIMPLE_GOTO:
6143 e = find_taken_edge (bb, vn_valueize (gimple_goto_dest (last)));
6144 break;
6145 default:
6146 e = NULL;
6148 if (e)
6150 todo = TODO_cleanup_cfg;
6151 if (!(e->flags & EDGE_EXECUTABLE))
6153 if (dump_file && (dump_flags & TDF_DETAILS))
6154 fprintf (dump_file,
6155 "marking known outgoing %sedge %d -> %d executable\n",
6156 e->flags & EDGE_DFS_BACK ? "back-" : "",
6157 e->src->index, e->dest->index);
6158 e->flags |= EDGE_EXECUTABLE;
6159 e->dest->flags |= BB_EXECUTABLE;
6161 else if (!(e->dest->flags & BB_EXECUTABLE))
6163 if (dump_file && (dump_flags & TDF_DETAILS))
6164 fprintf (dump_file,
6165 "marking destination block %d reachable\n",
6166 e->dest->index);
6167 e->dest->flags |= BB_EXECUTABLE;
6170 else if (gsi_one_before_end_p (gsi))
6172 FOR_EACH_EDGE (e, ei, bb->succs)
6174 if (!(e->flags & EDGE_EXECUTABLE))
6176 if (dump_file && (dump_flags & TDF_DETAILS))
6177 fprintf (dump_file,
6178 "marking outgoing edge %d -> %d executable\n",
6179 e->src->index, e->dest->index);
6180 e->flags |= EDGE_EXECUTABLE;
6181 e->dest->flags |= BB_EXECUTABLE;
6183 else if (!(e->dest->flags & BB_EXECUTABLE))
6185 if (dump_file && (dump_flags & TDF_DETAILS))
6186 fprintf (dump_file,
6187 "marking destination block %d reachable\n",
6188 e->dest->index);
6189 e->dest->flags |= BB_EXECUTABLE;
6194 /* Eliminate. That also pushes to avail. */
6195 if (eliminate && ! iterate)
6196 avail.eliminate_stmt (bb, &gsi);
6197 else
6198 /* If not eliminating, make all not already available defs
6199 available. */
6200 FOR_EACH_SSA_TREE_OPERAND (op, gsi_stmt (gsi), i, SSA_OP_DEF)
6201 if (! avail.eliminate_avail (bb, op))
6202 avail.eliminate_push_avail (bb, op);
6205 /* Eliminate in destination PHI arguments. Always substitute in dest
6206 PHIs, even for non-executable edges. This handles region
6207 exits PHIs. */
6208 if (!iterate && eliminate)
6209 FOR_EACH_EDGE (e, ei, bb->succs)
6210 for (gphi_iterator gsi = gsi_start_phis (e->dest);
6211 !gsi_end_p (gsi); gsi_next (&gsi))
6213 gphi *phi = gsi.phi ();
6214 use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
6215 tree arg = USE_FROM_PTR (use_p);
6216 if (TREE_CODE (arg) != SSA_NAME
6217 || virtual_operand_p (arg))
6218 continue;
6219 tree sprime;
6220 if (SSA_NAME_IS_DEFAULT_DEF (arg))
6222 sprime = SSA_VAL (arg);
6223 gcc_assert (TREE_CODE (sprime) != SSA_NAME
6224 || SSA_NAME_IS_DEFAULT_DEF (sprime));
6226 else
6227 /* Look for sth available at the definition block of the argument.
6228 This avoids inconsistencies between availability there which
6229 decides if the stmt can be removed and availability at the
6230 use site. The SSA property ensures that things available
6231 at the definition are also available at uses. */
6232 sprime = avail.eliminate_avail (gimple_bb (SSA_NAME_DEF_STMT (arg)),
6233 arg);
6234 if (sprime
6235 && sprime != arg
6236 && may_propagate_copy (arg, sprime))
6237 propagate_value (use_p, sprime);
6240 vn_context_bb = NULL;
6241 return todo;
6244 /* Unwind state per basic-block. */
6246 struct unwind_state
6248 /* Times this block has been visited. */
6249 unsigned visited;
6250 /* Whether to handle this as iteration point or whether to treat
6251 incoming backedge PHI values as varying. */
6252 bool iterate;
6253 /* Maximum RPO index this block is reachable from. */
6254 int max_rpo;
6255 /* Unwind state. */
6256 void *ob_top;
6257 vn_reference_t ref_top;
6258 vn_phi_t phi_top;
6259 vn_nary_op_t nary_top;
6262 /* Unwind the RPO VN state for iteration. */
6264 static void
6265 do_unwind (unwind_state *to, int rpo_idx, rpo_elim &avail, int *bb_to_rpo)
6267 gcc_assert (to->iterate);
6268 for (; last_inserted_nary != to->nary_top;
6269 last_inserted_nary = last_inserted_nary->next)
6271 vn_nary_op_t *slot;
6272 slot = valid_info->nary->find_slot_with_hash
6273 (last_inserted_nary, last_inserted_nary->hashcode, NO_INSERT);
6274 /* Predication causes the need to restore previous state. */
6275 if ((*slot)->unwind_to)
6276 *slot = (*slot)->unwind_to;
6277 else
6278 valid_info->nary->clear_slot (slot);
6280 for (; last_inserted_phi != to->phi_top;
6281 last_inserted_phi = last_inserted_phi->next)
6283 vn_phi_t *slot;
6284 slot = valid_info->phis->find_slot_with_hash
6285 (last_inserted_phi, last_inserted_phi->hashcode, NO_INSERT);
6286 valid_info->phis->clear_slot (slot);
6288 for (; last_inserted_ref != to->ref_top;
6289 last_inserted_ref = last_inserted_ref->next)
6291 vn_reference_t *slot;
6292 slot = valid_info->references->find_slot_with_hash
6293 (last_inserted_ref, last_inserted_ref->hashcode, NO_INSERT);
6294 (*slot)->operands.release ();
6295 valid_info->references->clear_slot (slot);
6297 obstack_free (&vn_tables_obstack, to->ob_top);
6299 /* Prune [rpo_idx, ] from avail. */
6300 /* ??? This is O(number-of-values-in-region) which is
6301 O(region-size) rather than O(iteration-piece). */
6302 for (rpo_elim::rpo_avail_t::iterator i
6303 = avail.m_rpo_avail.begin ();
6304 i != avail.m_rpo_avail.end (); ++i)
6306 while (! (*i).second.is_empty ())
6308 if (bb_to_rpo[(*i).second.last ().first] < rpo_idx)
6309 break;
6310 (*i).second.pop ();
6315 /* Do VN on a SEME region specified by ENTRY and EXIT_BBS in FN.
6316 If ITERATE is true then treat backedges optimistically as not
6317 executed and iterate. If ELIMINATE is true then perform
6318 elimination, otherwise leave that to the caller. */
6320 static unsigned
6321 do_rpo_vn (function *fn, edge entry, bitmap exit_bbs,
6322 bool iterate, bool eliminate)
6324 unsigned todo = 0;
6326 /* We currently do not support region-based iteration when
6327 elimination is requested. */
6328 gcc_assert (!entry || !iterate || !eliminate);
6329 /* When iterating we need loop info up-to-date. */
6330 gcc_assert (!iterate || !loops_state_satisfies_p (LOOPS_NEED_FIXUP));
6332 bool do_region = entry != NULL;
6333 if (!do_region)
6335 entry = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fn));
6336 exit_bbs = BITMAP_ALLOC (NULL);
6337 bitmap_set_bit (exit_bbs, EXIT_BLOCK);
6340 int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (fn) - NUM_FIXED_BLOCKS);
6341 int n = rev_post_order_and_mark_dfs_back_seme
6342 (fn, entry, exit_bbs, !loops_state_satisfies_p (LOOPS_NEED_FIXUP), rpo);
6343 /* rev_post_order_and_mark_dfs_back_seme fills RPO in reverse order. */
6344 for (int i = 0; i < n / 2; ++i)
6345 std::swap (rpo[i], rpo[n-i-1]);
6347 if (!do_region)
6348 BITMAP_FREE (exit_bbs);
6350 int *bb_to_rpo = XNEWVEC (int, last_basic_block_for_fn (fn));
6351 for (int i = 0; i < n; ++i)
6352 bb_to_rpo[rpo[i]] = i;
6354 unwind_state *rpo_state = XNEWVEC (unwind_state, n);
6356 rpo_elim avail (entry->dest);
6357 rpo_avail = &avail;
6359 /* Verify we have no extra entries into the region. */
6360 if (flag_checking && do_region)
6362 auto_bb_flag bb_in_region (fn);
6363 for (int i = 0; i < n; ++i)
6365 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6366 bb->flags |= bb_in_region;
6368 /* We can't merge the first two loops because we cannot rely
6369 on EDGE_DFS_BACK for edges not within the region. But if
6370 we decide to always have the bb_in_region flag we can
6371 do the checking during the RPO walk itself (but then it's
6372 also easy to handle MEME conservatively). */
6373 for (int i = 0; i < n; ++i)
6375 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6376 edge e;
6377 edge_iterator ei;
6378 FOR_EACH_EDGE (e, ei, bb->preds)
6379 gcc_assert (e == entry || (e->src->flags & bb_in_region));
6381 for (int i = 0; i < n; ++i)
6383 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6384 bb->flags &= ~bb_in_region;
6388 /* Create the VN state. For the initial size of the various hashtables
6389 use a heuristic based on region size and number of SSA names. */
6390 unsigned region_size = (((unsigned HOST_WIDE_INT)n * num_ssa_names)
6391 / (n_basic_blocks_for_fn (fn) - NUM_FIXED_BLOCKS));
6392 VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
6394 vn_ssa_aux_hash = new hash_table <vn_ssa_aux_hasher> (region_size * 2);
6395 gcc_obstack_init (&vn_ssa_aux_obstack);
6397 gcc_obstack_init (&vn_tables_obstack);
6398 gcc_obstack_init (&vn_tables_insert_obstack);
6399 valid_info = XCNEW (struct vn_tables_s);
6400 allocate_vn_table (valid_info, region_size);
6401 last_inserted_ref = NULL;
6402 last_inserted_phi = NULL;
6403 last_inserted_nary = NULL;
6405 vn_valueize = rpo_vn_valueize;
6407 /* Initialize the unwind state and edge/BB executable state. */
6408 bool need_max_rpo_iterate = false;
6409 for (int i = 0; i < n; ++i)
6411 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6412 rpo_state[i].visited = 0;
6413 rpo_state[i].max_rpo = i;
6414 bb->flags &= ~BB_EXECUTABLE;
6415 bool has_backedges = false;
6416 edge e;
6417 edge_iterator ei;
6418 FOR_EACH_EDGE (e, ei, bb->preds)
6420 if (e->flags & EDGE_DFS_BACK)
6421 has_backedges = true;
6422 e->flags &= ~EDGE_EXECUTABLE;
6423 if (iterate || e == entry)
6424 continue;
6425 if (bb_to_rpo[e->src->index] > i)
6427 rpo_state[i].max_rpo = MAX (rpo_state[i].max_rpo,
6428 bb_to_rpo[e->src->index]);
6429 need_max_rpo_iterate = true;
6431 else
6432 rpo_state[i].max_rpo
6433 = MAX (rpo_state[i].max_rpo,
6434 rpo_state[bb_to_rpo[e->src->index]].max_rpo);
6436 rpo_state[i].iterate = iterate && has_backedges;
6438 entry->flags |= EDGE_EXECUTABLE;
6439 entry->dest->flags |= BB_EXECUTABLE;
6441 /* When there are irreducible regions the simplistic max_rpo computation
6442 above for the case of backedges doesn't work and we need to iterate
6443 until there are no more changes. */
6444 unsigned nit = 0;
6445 while (need_max_rpo_iterate)
6447 nit++;
6448 need_max_rpo_iterate = false;
6449 for (int i = 0; i < n; ++i)
6451 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6452 edge e;
6453 edge_iterator ei;
6454 FOR_EACH_EDGE (e, ei, bb->preds)
6456 if (e == entry)
6457 continue;
6458 int max_rpo = MAX (rpo_state[i].max_rpo,
6459 rpo_state[bb_to_rpo[e->src->index]].max_rpo);
6460 if (rpo_state[i].max_rpo != max_rpo)
6462 rpo_state[i].max_rpo = max_rpo;
6463 need_max_rpo_iterate = true;
6468 statistics_histogram_event (cfun, "RPO max_rpo iterations", nit);
6470 /* As heuristic to improve compile-time we handle only the N innermost
6471 loops and the outermost one optimistically. */
6472 if (iterate)
6474 loop_p loop;
6475 unsigned max_depth = PARAM_VALUE (PARAM_RPO_VN_MAX_LOOP_DEPTH);
6476 FOR_EACH_LOOP (loop, LI_ONLY_INNERMOST)
6477 if (loop_depth (loop) > max_depth)
6478 for (unsigned i = 2;
6479 i < loop_depth (loop) - max_depth; ++i)
6481 basic_block header = superloop_at_depth (loop, i)->header;
6482 bool non_latch_backedge = false;
6483 edge e;
6484 edge_iterator ei;
6485 FOR_EACH_EDGE (e, ei, header->preds)
6486 if (e->flags & EDGE_DFS_BACK)
6488 /* There can be a non-latch backedge into the header
6489 which is part of an outer irreducible region. We
6490 cannot avoid iterating this block then. */
6491 if (!dominated_by_p (CDI_DOMINATORS,
6492 e->src, e->dest))
6494 if (dump_file && (dump_flags & TDF_DETAILS))
6495 fprintf (dump_file, "non-latch backedge %d -> %d "
6496 "forces iteration of loop %d\n",
6497 e->src->index, e->dest->index, loop->num);
6498 non_latch_backedge = true;
6500 else
6501 e->flags |= EDGE_EXECUTABLE;
6503 rpo_state[bb_to_rpo[header->index]].iterate = non_latch_backedge;
6507 uint64_t nblk = 0;
6508 int idx = 0;
6509 if (iterate)
6510 /* Go and process all blocks, iterating as necessary. */
6513 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[idx]);
6515 /* If the block has incoming backedges remember unwind state. This
6516 is required even for non-executable blocks since in irreducible
6517 regions we might reach them via the backedge and re-start iterating
6518 from there.
6519 Note we can individually mark blocks with incoming backedges to
6520 not iterate where we then handle PHIs conservatively. We do that
6521 heuristically to reduce compile-time for degenerate cases. */
6522 if (rpo_state[idx].iterate)
6524 rpo_state[idx].ob_top = obstack_alloc (&vn_tables_obstack, 0);
6525 rpo_state[idx].ref_top = last_inserted_ref;
6526 rpo_state[idx].phi_top = last_inserted_phi;
6527 rpo_state[idx].nary_top = last_inserted_nary;
6530 if (!(bb->flags & BB_EXECUTABLE))
6532 if (dump_file && (dump_flags & TDF_DETAILS))
6533 fprintf (dump_file, "Block %d: BB%d found not executable\n",
6534 idx, bb->index);
6535 idx++;
6536 continue;
6539 if (dump_file && (dump_flags & TDF_DETAILS))
6540 fprintf (dump_file, "Processing block %d: BB%d\n", idx, bb->index);
6541 nblk++;
6542 todo |= process_bb (avail, bb,
6543 rpo_state[idx].visited != 0,
6544 rpo_state[idx].iterate,
6545 iterate, eliminate, do_region, exit_bbs);
6546 rpo_state[idx].visited++;
6548 /* Verify if changed values flow over executable outgoing backedges
6549 and those change destination PHI values (that's the thing we
6550 can easily verify). Reduce over all such edges to the farthest
6551 away PHI. */
6552 int iterate_to = -1;
6553 edge_iterator ei;
6554 edge e;
6555 FOR_EACH_EDGE (e, ei, bb->succs)
6556 if ((e->flags & (EDGE_DFS_BACK|EDGE_EXECUTABLE))
6557 == (EDGE_DFS_BACK|EDGE_EXECUTABLE)
6558 && rpo_state[bb_to_rpo[e->dest->index]].iterate)
6560 int destidx = bb_to_rpo[e->dest->index];
6561 if (!rpo_state[destidx].visited)
6563 if (dump_file && (dump_flags & TDF_DETAILS))
6564 fprintf (dump_file, "Unvisited destination %d\n",
6565 e->dest->index);
6566 if (iterate_to == -1 || destidx < iterate_to)
6567 iterate_to = destidx;
6568 continue;
6570 if (dump_file && (dump_flags & TDF_DETAILS))
6571 fprintf (dump_file, "Looking for changed values of backedge"
6572 " %d->%d destination PHIs\n",
6573 e->src->index, e->dest->index);
6574 vn_context_bb = e->dest;
6575 gphi_iterator gsi;
6576 for (gsi = gsi_start_phis (e->dest);
6577 !gsi_end_p (gsi); gsi_next (&gsi))
6579 bool inserted = false;
6580 /* While we'd ideally just iterate on value changes
6581 we CSE PHIs and do that even across basic-block
6582 boundaries. So even hashtable state changes can
6583 be important (which is roughly equivalent to
6584 PHI argument value changes). To not excessively
6585 iterate because of that we track whether a PHI
6586 was CSEd to with GF_PLF_1. */
6587 bool phival_changed;
6588 if ((phival_changed = visit_phi (gsi.phi (),
6589 &inserted, false))
6590 || (inserted && gimple_plf (gsi.phi (), GF_PLF_1)))
6592 if (!phival_changed
6593 && dump_file && (dump_flags & TDF_DETAILS))
6594 fprintf (dump_file, "PHI was CSEd and hashtable "
6595 "state (changed)\n");
6596 if (iterate_to == -1 || destidx < iterate_to)
6597 iterate_to = destidx;
6598 break;
6601 vn_context_bb = NULL;
6603 if (iterate_to != -1)
6605 do_unwind (&rpo_state[iterate_to], iterate_to, avail, bb_to_rpo);
6606 idx = iterate_to;
6607 if (dump_file && (dump_flags & TDF_DETAILS))
6608 fprintf (dump_file, "Iterating to %d BB%d\n",
6609 iterate_to, rpo[iterate_to]);
6610 continue;
6613 idx++;
6615 while (idx < n);
6617 else /* !iterate */
6619 /* Process all blocks greedily with a worklist that enforces RPO
6620 processing of reachable blocks. */
6621 auto_bitmap worklist;
6622 bitmap_set_bit (worklist, 0);
6623 while (!bitmap_empty_p (worklist))
6625 int idx = bitmap_first_set_bit (worklist);
6626 bitmap_clear_bit (worklist, idx);
6627 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[idx]);
6628 gcc_assert ((bb->flags & BB_EXECUTABLE)
6629 && !rpo_state[idx].visited);
6631 if (dump_file && (dump_flags & TDF_DETAILS))
6632 fprintf (dump_file, "Processing block %d: BB%d\n", idx, bb->index);
6634 /* When we run into predecessor edges where we cannot trust its
6635 executable state mark them executable so PHI processing will
6636 be conservative.
6637 ??? Do we need to force arguments flowing over that edge
6638 to be varying or will they even always be? */
6639 edge_iterator ei;
6640 edge e;
6641 FOR_EACH_EDGE (e, ei, bb->preds)
6642 if (!(e->flags & EDGE_EXECUTABLE)
6643 && !rpo_state[bb_to_rpo[e->src->index]].visited
6644 && rpo_state[bb_to_rpo[e->src->index]].max_rpo >= (int)idx)
6646 if (dump_file && (dump_flags & TDF_DETAILS))
6647 fprintf (dump_file, "Cannot trust state of predecessor "
6648 "edge %d -> %d, marking executable\n",
6649 e->src->index, e->dest->index);
6650 e->flags |= EDGE_EXECUTABLE;
6653 nblk++;
6654 todo |= process_bb (avail, bb, false, false, false, eliminate,
6655 do_region, exit_bbs);
6656 rpo_state[idx].visited++;
6658 FOR_EACH_EDGE (e, ei, bb->succs)
6659 if ((e->flags & EDGE_EXECUTABLE)
6660 && e->dest->index != EXIT_BLOCK
6661 && (!do_region || !bitmap_bit_p (exit_bbs, e->dest->index))
6662 && !rpo_state[bb_to_rpo[e->dest->index]].visited)
6663 bitmap_set_bit (worklist, bb_to_rpo[e->dest->index]);
6667 /* If statistics or dump file active. */
6668 int nex = 0;
6669 unsigned max_visited = 1;
6670 for (int i = 0; i < n; ++i)
6672 basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
6673 if (bb->flags & BB_EXECUTABLE)
6674 nex++;
6675 statistics_histogram_event (cfun, "RPO block visited times",
6676 rpo_state[i].visited);
6677 if (rpo_state[i].visited > max_visited)
6678 max_visited = rpo_state[i].visited;
6680 unsigned nvalues = 0, navail = 0;
6681 for (rpo_elim::rpo_avail_t::iterator i = avail.m_rpo_avail.begin ();
6682 i != avail.m_rpo_avail.end (); ++i)
6684 nvalues++;
6685 navail += (*i).second.length ();
6687 statistics_counter_event (cfun, "RPO blocks", n);
6688 statistics_counter_event (cfun, "RPO blocks visited", nblk);
6689 statistics_counter_event (cfun, "RPO blocks executable", nex);
6690 statistics_histogram_event (cfun, "RPO iterations", 10*nblk / nex);
6691 statistics_histogram_event (cfun, "RPO num values", nvalues);
6692 statistics_histogram_event (cfun, "RPO num avail", navail);
6693 statistics_histogram_event (cfun, "RPO num lattice",
6694 vn_ssa_aux_hash->elements ());
6695 if (dump_file && (dump_flags & (TDF_DETAILS|TDF_STATS)))
6697 fprintf (dump_file, "RPO iteration over %d blocks visited %" PRIu64
6698 " blocks in total discovering %d executable blocks iterating "
6699 "%d.%d times, a block was visited max. %u times\n",
6700 n, nblk, nex,
6701 (int)((10*nblk / nex)/10), (int)((10*nblk / nex)%10),
6702 max_visited);
6703 fprintf (dump_file, "RPO tracked %d values available at %d locations "
6704 "and %" PRIu64 " lattice elements\n",
6705 nvalues, navail, (uint64_t) vn_ssa_aux_hash->elements ());
6708 if (eliminate)
6710 /* When !iterate we already performed elimination during the RPO
6711 walk. */
6712 if (iterate)
6714 /* Elimination for region-based VN needs to be done within the
6715 RPO walk. */
6716 gcc_assert (! do_region);
6717 /* Note we can't use avail.walk here because that gets confused
6718 by the existing availability and it will be less efficient
6719 as well. */
6720 todo |= eliminate_with_rpo_vn (NULL);
6722 else
6723 todo |= avail.eliminate_cleanup (do_region);
6726 vn_valueize = NULL;
6727 rpo_avail = NULL;
6729 XDELETEVEC (bb_to_rpo);
6730 XDELETEVEC (rpo);
6731 XDELETEVEC (rpo_state);
6733 return todo;
6736 /* Region-based entry for RPO VN. Performs value-numbering and elimination
6737 on the SEME region specified by ENTRY and EXIT_BBS. */
6739 unsigned
6740 do_rpo_vn (function *fn, edge entry, bitmap exit_bbs)
6742 default_vn_walk_kind = VN_WALKREWRITE;
6743 unsigned todo = do_rpo_vn (fn, entry, exit_bbs, false, true);
6744 free_rpo_vn ();
6745 return todo;
6749 namespace {
6751 const pass_data pass_data_fre =
6753 GIMPLE_PASS, /* type */
6754 "fre", /* name */
6755 OPTGROUP_NONE, /* optinfo_flags */
6756 TV_TREE_FRE, /* tv_id */
6757 ( PROP_cfg | PROP_ssa ), /* properties_required */
6758 0, /* properties_provided */
6759 0, /* properties_destroyed */
6760 0, /* todo_flags_start */
6761 0, /* todo_flags_finish */
6764 class pass_fre : public gimple_opt_pass
6766 public:
6767 pass_fre (gcc::context *ctxt)
6768 : gimple_opt_pass (pass_data_fre, ctxt)
6771 /* opt_pass methods: */
6772 opt_pass * clone () { return new pass_fre (m_ctxt); }
6773 virtual bool gate (function *) { return flag_tree_fre != 0; }
6774 virtual unsigned int execute (function *);
6776 }; // class pass_fre
6778 unsigned int
6779 pass_fre::execute (function *fun)
6781 unsigned todo = 0;
6783 /* At -O[1g] use the cheap non-iterating mode. */
6784 calculate_dominance_info (CDI_DOMINATORS);
6785 if (optimize > 1)
6786 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
6788 default_vn_walk_kind = VN_WALKREWRITE;
6789 todo = do_rpo_vn (fun, NULL, NULL, optimize > 1, true);
6790 free_rpo_vn ();
6792 if (optimize > 1)
6793 loop_optimizer_finalize ();
6795 return todo;
6798 } // anon namespace
6800 gimple_opt_pass *
6801 make_pass_fre (gcc::context *ctxt)
6803 return new pass_fre (ctxt);
6806 #undef BB_EXECUTABLE