c++: Adjust pushdecl/duplicate_decls API
[gcc.git] / gcc / tree-ssa-pre.c
1 /* Full and partial redundancy elimination and code hoisting on SSA GIMPLE.
2 Copyright (C) 2001-2020 Free Software Foundation, Inc.
3 Contributed by Daniel Berlin <dan@dberlin.org> and Steven Bosscher
4 <stevenb@suse.de>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "gimple.h"
29 #include "predict.h"
30 #include "alloc-pool.h"
31 #include "tree-pass.h"
32 #include "ssa.h"
33 #include "cgraph.h"
34 #include "gimple-pretty-print.h"
35 #include "fold-const.h"
36 #include "cfganal.h"
37 #include "gimple-fold.h"
38 #include "tree-eh.h"
39 #include "gimplify.h"
40 #include "gimple-iterator.h"
41 #include "tree-cfg.h"
42 #include "tree-into-ssa.h"
43 #include "tree-dfa.h"
44 #include "tree-ssa.h"
45 #include "cfgloop.h"
46 #include "tree-ssa-sccvn.h"
47 #include "tree-scalar-evolution.h"
48 #include "dbgcnt.h"
49 #include "domwalk.h"
50 #include "tree-ssa-propagate.h"
51 #include "tree-ssa-dce.h"
52 #include "tree-cfgcleanup.h"
53 #include "alias.h"
54
55 /* Even though this file is called tree-ssa-pre.c, we actually
56 implement a bit more than just PRE here. All of them piggy-back
57 on GVN which is implemented in tree-ssa-sccvn.c.
58
59 1. Full Redundancy Elimination (FRE)
60 This is the elimination phase of GVN.
61
62 2. Partial Redundancy Elimination (PRE)
63 This is adds computation of AVAIL_OUT and ANTIC_IN and
64 doing expression insertion to form GVN-PRE.
65
66 3. Code hoisting
67 This optimization uses the ANTIC_IN sets computed for PRE
68 to move expressions further up than PRE would do, to make
69 multiple computations of the same value fully redundant.
70 This pass is explained below (after the explanation of the
71 basic algorithm for PRE).
72 */
73
74 /* TODO:
75
76 1. Avail sets can be shared by making an avail_find_leader that
77 walks up the dominator tree and looks in those avail sets.
78 This might affect code optimality, it's unclear right now.
79 Currently the AVAIL_OUT sets are the remaining quadraticness in
80 memory of GVN-PRE.
81 2. Strength reduction can be performed by anticipating expressions
82 we can repair later on.
83 3. We can do back-substitution or smarter value numbering to catch
84 commutative expressions split up over multiple statements.
85 */
86
87 /* For ease of terminology, "expression node" in the below refers to
88 every expression node but GIMPLE_ASSIGN, because GIMPLE_ASSIGNs
89 represent the actual statement containing the expressions we care about,
90 and we cache the value number by putting it in the expression. */
91
92 /* Basic algorithm for Partial Redundancy Elimination:
93
94 First we walk the statements to generate the AVAIL sets, the
95 EXP_GEN sets, and the tmp_gen sets. EXP_GEN sets represent the
96 generation of values/expressions by a given block. We use them
97 when computing the ANTIC sets. The AVAIL sets consist of
98 SSA_NAME's that represent values, so we know what values are
99 available in what blocks. AVAIL is a forward dataflow problem. In
100 SSA, values are never killed, so we don't need a kill set, or a
101 fixpoint iteration, in order to calculate the AVAIL sets. In
102 traditional parlance, AVAIL sets tell us the downsafety of the
103 expressions/values.
104
105 Next, we generate the ANTIC sets. These sets represent the
106 anticipatable expressions. ANTIC is a backwards dataflow
107 problem. An expression is anticipatable in a given block if it could
108 be generated in that block. This means that if we had to perform
109 an insertion in that block, of the value of that expression, we
110 could. Calculating the ANTIC sets requires phi translation of
111 expressions, because the flow goes backwards through phis. We must
112 iterate to a fixpoint of the ANTIC sets, because we have a kill
113 set. Even in SSA form, values are not live over the entire
114 function, only from their definition point onwards. So we have to
115 remove values from the ANTIC set once we go past the definition
116 point of the leaders that make them up.
117 compute_antic/compute_antic_aux performs this computation.
118
119 Third, we perform insertions to make partially redundant
120 expressions fully redundant.
121
122 An expression is partially redundant (excluding partial
123 anticipation) if:
124
125 1. It is AVAIL in some, but not all, of the predecessors of a
126 given block.
127 2. It is ANTIC in all the predecessors.
128
129 In order to make it fully redundant, we insert the expression into
130 the predecessors where it is not available, but is ANTIC.
131
132 When optimizing for size, we only eliminate the partial redundancy
133 if we need to insert in only one predecessor. This avoids almost
134 completely the code size increase that PRE usually causes.
135
136 For the partial anticipation case, we only perform insertion if it
137 is partially anticipated in some block, and fully available in all
138 of the predecessors.
139
140 do_pre_regular_insertion/do_pre_partial_partial_insertion
141 performs these steps, driven by insert/insert_aux.
142
143 Fourth, we eliminate fully redundant expressions.
144 This is a simple statement walk that replaces redundant
145 calculations with the now available values. */
146
147 /* Basic algorithm for Code Hoisting:
148
149 Code hoisting is: Moving value computations up in the control flow
150 graph to make multiple copies redundant. Typically this is a size
151 optimization, but there are cases where it also is helpful for speed.
152
153 A simple code hoisting algorithm is implemented that piggy-backs on
154 the PRE infrastructure. For code hoisting, we have to know ANTIC_OUT
155 which is effectively ANTIC_IN - AVAIL_OUT. The latter two have to be
156 computed for PRE, and we can use them to perform a limited version of
157 code hoisting, too.
158
159 For the purpose of this implementation, a value is hoistable to a basic
160 block B if the following properties are met:
161
162 1. The value is in ANTIC_IN(B) -- the value will be computed on all
163 paths from B to function exit and it can be computed in B);
164
165 2. The value is not in AVAIL_OUT(B) -- there would be no need to
166 compute the value again and make it available twice;
167
168 3. All successors of B are dominated by B -- makes sure that inserting
169 a computation of the value in B will make the remaining
170 computations fully redundant;
171
172 4. At least one successor has the value in AVAIL_OUT -- to avoid
173 hoisting values up too far;
174
175 5. There are at least two successors of B -- hoisting in straight
176 line code is pointless.
177
178 The third condition is not strictly necessary, but it would complicate
179 the hoisting pass a lot. In fact, I don't know of any code hoisting
180 algorithm that does not have this requirement. Fortunately, experiments
181 have show that most candidate hoistable values are in regions that meet
182 this condition (e.g. diamond-shape regions).
183
184 The forth condition is necessary to avoid hoisting things up too far
185 away from the uses of the value. Nothing else limits the algorithm
186 from hoisting everything up as far as ANTIC_IN allows. Experiments
187 with SPEC and CSiBE have shown that hoisting up too far results in more
188 spilling, less benefits for code size, and worse benchmark scores.
189 Fortunately, in practice most of the interesting hoisting opportunities
190 are caught despite this limitation.
191
192 For hoistable values that meet all conditions, expressions are inserted
193 to make the calculation of the hoistable value fully redundant. We
194 perform code hoisting insertions after each round of PRE insertions,
195 because code hoisting never exposes new PRE opportunities, but PRE can
196 create new code hoisting opportunities.
197
198 The code hoisting algorithm is implemented in do_hoist_insert, driven
199 by insert/insert_aux. */
200
201 /* Representations of value numbers:
202
203 Value numbers are represented by a representative SSA_NAME. We
204 will create fake SSA_NAME's in situations where we need a
205 representative but do not have one (because it is a complex
206 expression). In order to facilitate storing the value numbers in
207 bitmaps, and keep the number of wasted SSA_NAME's down, we also
208 associate a value_id with each value number, and create full blown
209 ssa_name's only where we actually need them (IE in operands of
210 existing expressions).
211
212 Theoretically you could replace all the value_id's with
213 SSA_NAME_VERSION, but this would allocate a large number of
214 SSA_NAME's (which are each > 30 bytes) just to get a 4 byte number.
215 It would also require an additional indirection at each point we
216 use the value id. */
217
218 /* Representation of expressions on value numbers:
219
220 Expressions consisting of value numbers are represented the same
221 way as our VN internally represents them, with an additional
222 "pre_expr" wrapping around them in order to facilitate storing all
223 of the expressions in the same sets. */
224
225 /* Representation of sets:
226
227 The dataflow sets do not need to be sorted in any particular order
228 for the majority of their lifetime, are simply represented as two
229 bitmaps, one that keeps track of values present in the set, and one
230 that keeps track of expressions present in the set.
231
232 When we need them in topological order, we produce it on demand by
233 transforming the bitmap into an array and sorting it into topo
234 order. */
235
236 /* Type of expression, used to know which member of the PRE_EXPR union
237 is valid. */
238
239 enum pre_expr_kind
240 {
241 NAME,
242 NARY,
243 REFERENCE,
244 CONSTANT
245 };
246
247 union pre_expr_union
248 {
249 tree name;
250 tree constant;
251 vn_nary_op_t nary;
252 vn_reference_t reference;
253 };
254
255 typedef struct pre_expr_d : nofree_ptr_hash <pre_expr_d>
256 {
257 enum pre_expr_kind kind;
258 unsigned int id;
259 location_t loc;
260 pre_expr_union u;
261
262 /* hash_table support. */
263 static inline hashval_t hash (const pre_expr_d *);
264 static inline int equal (const pre_expr_d *, const pre_expr_d *);
265 } *pre_expr;
266
267 #define PRE_EXPR_NAME(e) (e)->u.name
268 #define PRE_EXPR_NARY(e) (e)->u.nary
269 #define PRE_EXPR_REFERENCE(e) (e)->u.reference
270 #define PRE_EXPR_CONSTANT(e) (e)->u.constant
271
272 /* Compare E1 and E1 for equality. */
273
274 inline int
275 pre_expr_d::equal (const pre_expr_d *e1, const pre_expr_d *e2)
276 {
277 if (e1->kind != e2->kind)
278 return false;
279
280 switch (e1->kind)
281 {
282 case CONSTANT:
283 return vn_constant_eq_with_type (PRE_EXPR_CONSTANT (e1),
284 PRE_EXPR_CONSTANT (e2));
285 case NAME:
286 return PRE_EXPR_NAME (e1) == PRE_EXPR_NAME (e2);
287 case NARY:
288 return vn_nary_op_eq (PRE_EXPR_NARY (e1), PRE_EXPR_NARY (e2));
289 case REFERENCE:
290 return vn_reference_eq (PRE_EXPR_REFERENCE (e1),
291 PRE_EXPR_REFERENCE (e2));
292 default:
293 gcc_unreachable ();
294 }
295 }
296
297 /* Hash E. */
298
299 inline hashval_t
300 pre_expr_d::hash (const pre_expr_d *e)
301 {
302 switch (e->kind)
303 {
304 case CONSTANT:
305 return vn_hash_constant_with_type (PRE_EXPR_CONSTANT (e));
306 case NAME:
307 return SSA_NAME_VERSION (PRE_EXPR_NAME (e));
308 case NARY:
309 return PRE_EXPR_NARY (e)->hashcode;
310 case REFERENCE:
311 return PRE_EXPR_REFERENCE (e)->hashcode;
312 default:
313 gcc_unreachable ();
314 }
315 }
316
317 /* Next global expression id number. */
318 static unsigned int next_expression_id;
319
320 /* Mapping from expression to id number we can use in bitmap sets. */
321 static vec<pre_expr> expressions;
322 static hash_table<pre_expr_d> *expression_to_id;
323 static vec<unsigned> name_to_id;
324
325 /* Allocate an expression id for EXPR. */
326
327 static inline unsigned int
328 alloc_expression_id (pre_expr expr)
329 {
330 struct pre_expr_d **slot;
331 /* Make sure we won't overflow. */
332 gcc_assert (next_expression_id + 1 > next_expression_id);
333 expr->id = next_expression_id++;
334 expressions.safe_push (expr);
335 if (expr->kind == NAME)
336 {
337 unsigned version = SSA_NAME_VERSION (PRE_EXPR_NAME (expr));
338 /* vec::safe_grow_cleared allocates no headroom. Avoid frequent
339 re-allocations by using vec::reserve upfront. */
340 unsigned old_len = name_to_id.length ();
341 name_to_id.reserve (num_ssa_names - old_len);
342 name_to_id.quick_grow_cleared (num_ssa_names);
343 gcc_assert (name_to_id[version] == 0);
344 name_to_id[version] = expr->id;
345 }
346 else
347 {
348 slot = expression_to_id->find_slot (expr, INSERT);
349 gcc_assert (!*slot);
350 *slot = expr;
351 }
352 return next_expression_id - 1;
353 }
354
355 /* Return the expression id for tree EXPR. */
356
357 static inline unsigned int
358 get_expression_id (const pre_expr expr)
359 {
360 return expr->id;
361 }
362
363 static inline unsigned int
364 lookup_expression_id (const pre_expr expr)
365 {
366 struct pre_expr_d **slot;
367
368 if (expr->kind == NAME)
369 {
370 unsigned version = SSA_NAME_VERSION (PRE_EXPR_NAME (expr));
371 if (name_to_id.length () <= version)
372 return 0;
373 return name_to_id[version];
374 }
375 else
376 {
377 slot = expression_to_id->find_slot (expr, NO_INSERT);
378 if (!slot)
379 return 0;
380 return ((pre_expr)*slot)->id;
381 }
382 }
383
384 /* Return the existing expression id for EXPR, or create one if one
385 does not exist yet. */
386
387 static inline unsigned int
388 get_or_alloc_expression_id (pre_expr expr)
389 {
390 unsigned int id = lookup_expression_id (expr);
391 if (id == 0)
392 return alloc_expression_id (expr);
393 return expr->id = id;
394 }
395
396 /* Return the expression that has expression id ID */
397
398 static inline pre_expr
399 expression_for_id (unsigned int id)
400 {
401 return expressions[id];
402 }
403
404 static object_allocator<pre_expr_d> pre_expr_pool ("pre_expr nodes");
405
406 /* Given an SSA_NAME NAME, get or create a pre_expr to represent it. */
407
408 static pre_expr
409 get_or_alloc_expr_for_name (tree name)
410 {
411 struct pre_expr_d expr;
412 pre_expr result;
413 unsigned int result_id;
414
415 expr.kind = NAME;
416 expr.id = 0;
417 PRE_EXPR_NAME (&expr) = name;
418 result_id = lookup_expression_id (&expr);
419 if (result_id != 0)
420 return expression_for_id (result_id);
421
422 result = pre_expr_pool.allocate ();
423 result->kind = NAME;
424 result->loc = UNKNOWN_LOCATION;
425 PRE_EXPR_NAME (result) = name;
426 alloc_expression_id (result);
427 return result;
428 }
429
430 /* An unordered bitmap set. One bitmap tracks values, the other,
431 expressions. */
432 typedef class bitmap_set
433 {
434 public:
435 bitmap_head expressions;
436 bitmap_head values;
437 } *bitmap_set_t;
438
439 #define FOR_EACH_EXPR_ID_IN_SET(set, id, bi) \
440 EXECUTE_IF_SET_IN_BITMAP (&(set)->expressions, 0, (id), (bi))
441
442 #define FOR_EACH_VALUE_ID_IN_SET(set, id, bi) \
443 EXECUTE_IF_SET_IN_BITMAP (&(set)->values, 0, (id), (bi))
444
445 /* Mapping from value id to expressions with that value_id. */
446 static vec<bitmap> value_expressions;
447
448 /* Sets that we need to keep track of. */
449 typedef struct bb_bitmap_sets
450 {
451 /* The EXP_GEN set, which represents expressions/values generated in
452 a basic block. */
453 bitmap_set_t exp_gen;
454
455 /* The PHI_GEN set, which represents PHI results generated in a
456 basic block. */
457 bitmap_set_t phi_gen;
458
459 /* The TMP_GEN set, which represents results/temporaries generated
460 in a basic block. IE the LHS of an expression. */
461 bitmap_set_t tmp_gen;
462
463 /* The AVAIL_OUT set, which represents which values are available in
464 a given basic block. */
465 bitmap_set_t avail_out;
466
467 /* The ANTIC_IN set, which represents which values are anticipatable
468 in a given basic block. */
469 bitmap_set_t antic_in;
470
471 /* The PA_IN set, which represents which values are
472 partially anticipatable in a given basic block. */
473 bitmap_set_t pa_in;
474
475 /* The NEW_SETS set, which is used during insertion to augment the
476 AVAIL_OUT set of blocks with the new insertions performed during
477 the current iteration. */
478 bitmap_set_t new_sets;
479
480 /* A cache for value_dies_in_block_x. */
481 bitmap expr_dies;
482
483 /* The live virtual operand on successor edges. */
484 tree vop_on_exit;
485
486 /* True if we have visited this block during ANTIC calculation. */
487 unsigned int visited : 1;
488
489 /* True when the block contains a call that might not return. */
490 unsigned int contains_may_not_return_call : 1;
491 } *bb_value_sets_t;
492
493 #define EXP_GEN(BB) ((bb_value_sets_t) ((BB)->aux))->exp_gen
494 #define PHI_GEN(BB) ((bb_value_sets_t) ((BB)->aux))->phi_gen
495 #define TMP_GEN(BB) ((bb_value_sets_t) ((BB)->aux))->tmp_gen
496 #define AVAIL_OUT(BB) ((bb_value_sets_t) ((BB)->aux))->avail_out
497 #define ANTIC_IN(BB) ((bb_value_sets_t) ((BB)->aux))->antic_in
498 #define PA_IN(BB) ((bb_value_sets_t) ((BB)->aux))->pa_in
499 #define NEW_SETS(BB) ((bb_value_sets_t) ((BB)->aux))->new_sets
500 #define EXPR_DIES(BB) ((bb_value_sets_t) ((BB)->aux))->expr_dies
501 #define BB_VISITED(BB) ((bb_value_sets_t) ((BB)->aux))->visited
502 #define BB_MAY_NOTRETURN(BB) ((bb_value_sets_t) ((BB)->aux))->contains_may_not_return_call
503 #define BB_LIVE_VOP_ON_EXIT(BB) ((bb_value_sets_t) ((BB)->aux))->vop_on_exit
504
505
506 /* This structure is used to keep track of statistics on what
507 optimization PRE was able to perform. */
508 static struct
509 {
510 /* The number of new expressions/temporaries generated by PRE. */
511 int insertions;
512
513 /* The number of inserts found due to partial anticipation */
514 int pa_insert;
515
516 /* The number of inserts made for code hoisting. */
517 int hoist_insert;
518
519 /* The number of new PHI nodes added by PRE. */
520 int phis;
521 } pre_stats;
522
523 static bool do_partial_partial;
524 static pre_expr bitmap_find_leader (bitmap_set_t, unsigned int);
525 static void bitmap_value_insert_into_set (bitmap_set_t, pre_expr);
526 static void bitmap_value_replace_in_set (bitmap_set_t, pre_expr);
527 static void bitmap_set_copy (bitmap_set_t, bitmap_set_t);
528 static bool bitmap_set_contains_value (bitmap_set_t, unsigned int);
529 static void bitmap_insert_into_set (bitmap_set_t, pre_expr);
530 static bitmap_set_t bitmap_set_new (void);
531 static tree create_expression_by_pieces (basic_block, pre_expr, gimple_seq *,
532 tree);
533 static tree find_or_generate_expression (basic_block, tree, gimple_seq *);
534 static unsigned int get_expr_value_id (pre_expr);
535
536 /* We can add and remove elements and entries to and from sets
537 and hash tables, so we use alloc pools for them. */
538
539 static object_allocator<bitmap_set> bitmap_set_pool ("Bitmap sets");
540 static bitmap_obstack grand_bitmap_obstack;
541
542 /* A three tuple {e, pred, v} used to cache phi translations in the
543 phi_translate_table. */
544
545 typedef struct expr_pred_trans_d : free_ptr_hash<expr_pred_trans_d>
546 {
547 /* The expression. */
548 pre_expr e;
549
550 /* The predecessor block along which we translated the expression. */
551 basic_block pred;
552
553 /* The value that resulted from the translation. */
554 pre_expr v;
555
556 /* The hashcode for the expression, pred pair. This is cached for
557 speed reasons. */
558 hashval_t hashcode;
559
560 /* hash_table support. */
561 static inline hashval_t hash (const expr_pred_trans_d *);
562 static inline int equal (const expr_pred_trans_d *, const expr_pred_trans_d *);
563 } *expr_pred_trans_t;
564 typedef const struct expr_pred_trans_d *const_expr_pred_trans_t;
565
566 inline hashval_t
567 expr_pred_trans_d::hash (const expr_pred_trans_d *e)
568 {
569 return e->hashcode;
570 }
571
572 inline int
573 expr_pred_trans_d::equal (const expr_pred_trans_d *ve1,
574 const expr_pred_trans_d *ve2)
575 {
576 basic_block b1 = ve1->pred;
577 basic_block b2 = ve2->pred;
578
579 /* If they are not translations for the same basic block, they can't
580 be equal. */
581 if (b1 != b2)
582 return false;
583 return pre_expr_d::equal (ve1->e, ve2->e);
584 }
585
586 /* The phi_translate_table caches phi translations for a given
587 expression and predecessor. */
588 static hash_table<expr_pred_trans_d> *phi_translate_table;
589
590 /* Add the tuple mapping from {expression E, basic block PRED} to
591 the phi translation table and return whether it pre-existed. */
592
593 static inline bool
594 phi_trans_add (expr_pred_trans_t *entry, pre_expr e, basic_block pred)
595 {
596 expr_pred_trans_t *slot;
597 expr_pred_trans_d tem;
598 hashval_t hash = iterative_hash_hashval_t (pre_expr_d::hash (e),
599 pred->index);
600 tem.e = e;
601 tem.pred = pred;
602 tem.hashcode = hash;
603 slot = phi_translate_table->find_slot_with_hash (&tem, hash, INSERT);
604 if (*slot)
605 {
606 *entry = *slot;
607 return true;
608 }
609
610 *entry = *slot = XNEW (struct expr_pred_trans_d);
611 (*entry)->e = e;
612 (*entry)->pred = pred;
613 (*entry)->hashcode = hash;
614 return false;
615 }
616
617
618 /* Add expression E to the expression set of value id V. */
619
620 static void
621 add_to_value (unsigned int v, pre_expr e)
622 {
623 bitmap set;
624
625 gcc_checking_assert (get_expr_value_id (e) == v);
626
627 if (v >= value_expressions.length ())
628 {
629 value_expressions.safe_grow_cleared (v + 1, true);
630 }
631
632 set = value_expressions[v];
633 if (!set)
634 {
635 set = BITMAP_ALLOC (&grand_bitmap_obstack);
636 value_expressions[v] = set;
637 }
638
639 bitmap_set_bit (set, get_or_alloc_expression_id (e));
640 }
641
642 /* Create a new bitmap set and return it. */
643
644 static bitmap_set_t
645 bitmap_set_new (void)
646 {
647 bitmap_set_t ret = bitmap_set_pool.allocate ();
648 bitmap_initialize (&ret->expressions, &grand_bitmap_obstack);
649 bitmap_initialize (&ret->values, &grand_bitmap_obstack);
650 return ret;
651 }
652
653 /* Return the value id for a PRE expression EXPR. */
654
655 static unsigned int
656 get_expr_value_id (pre_expr expr)
657 {
658 unsigned int id;
659 switch (expr->kind)
660 {
661 case CONSTANT:
662 id = get_constant_value_id (PRE_EXPR_CONSTANT (expr));
663 break;
664 case NAME:
665 id = VN_INFO (PRE_EXPR_NAME (expr))->value_id;
666 break;
667 case NARY:
668 gcc_assert (!PRE_EXPR_NARY (expr)->predicated_values);
669 id = PRE_EXPR_NARY (expr)->value_id;
670 break;
671 case REFERENCE:
672 id = PRE_EXPR_REFERENCE (expr)->value_id;
673 break;
674 default:
675 gcc_unreachable ();
676 }
677 /* ??? We cannot assert that expr has a value-id (it can be 0), because
678 we assign value-ids only to expressions that have a result
679 in set_hashtable_value_ids. */
680 return id;
681 }
682
683 /* Return a VN valnum (SSA name or constant) for the PRE value-id VAL. */
684
685 static tree
686 vn_valnum_from_value_id (unsigned int val)
687 {
688 bitmap_iterator bi;
689 unsigned int i;
690 bitmap exprset = value_expressions[val];
691 EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
692 {
693 pre_expr vexpr = expression_for_id (i);
694 if (vexpr->kind == NAME)
695 return VN_INFO (PRE_EXPR_NAME (vexpr))->valnum;
696 else if (vexpr->kind == CONSTANT)
697 return PRE_EXPR_CONSTANT (vexpr);
698 }
699 return NULL_TREE;
700 }
701
702 /* Insert an expression EXPR into a bitmapped set. */
703
704 static void
705 bitmap_insert_into_set (bitmap_set_t set, pre_expr expr)
706 {
707 unsigned int val = get_expr_value_id (expr);
708 if (! value_id_constant_p (val))
709 {
710 /* Note this is the only function causing multiple expressions
711 for the same value to appear in a set. This is needed for
712 TMP_GEN, PHI_GEN and NEW_SETs. */
713 bitmap_set_bit (&set->values, val);
714 bitmap_set_bit (&set->expressions, get_or_alloc_expression_id (expr));
715 }
716 }
717
718 /* Copy a bitmapped set ORIG, into bitmapped set DEST. */
719
720 static void
721 bitmap_set_copy (bitmap_set_t dest, bitmap_set_t orig)
722 {
723 bitmap_copy (&dest->expressions, &orig->expressions);
724 bitmap_copy (&dest->values, &orig->values);
725 }
726
727
728 /* Free memory used up by SET. */
729 static void
730 bitmap_set_free (bitmap_set_t set)
731 {
732 bitmap_clear (&set->expressions);
733 bitmap_clear (&set->values);
734 }
735
736
737 /* Generate an topological-ordered array of bitmap set SET. */
738
739 static vec<pre_expr>
740 sorted_array_from_bitmap_set (bitmap_set_t set)
741 {
742 unsigned int i, j;
743 bitmap_iterator bi, bj;
744 vec<pre_expr> result;
745
746 /* Pre-allocate enough space for the array. */
747 result.create (bitmap_count_bits (&set->expressions));
748
749 FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
750 {
751 /* The number of expressions having a given value is usually
752 relatively small. Thus, rather than making a vector of all
753 the expressions and sorting it by value-id, we walk the values
754 and check in the reverse mapping that tells us what expressions
755 have a given value, to filter those in our set. As a result,
756 the expressions are inserted in value-id order, which means
757 topological order.
758
759 If this is somehow a significant lose for some cases, we can
760 choose which set to walk based on the set size. */
761 bitmap exprset = value_expressions[i];
762 EXECUTE_IF_SET_IN_BITMAP (exprset, 0, j, bj)
763 {
764 if (bitmap_bit_p (&set->expressions, j))
765 result.quick_push (expression_for_id (j));
766 }
767 }
768
769 return result;
770 }
771
772 /* Subtract all expressions contained in ORIG from DEST. */
773
774 static bitmap_set_t
775 bitmap_set_subtract_expressions (bitmap_set_t dest, bitmap_set_t orig)
776 {
777 bitmap_set_t result = bitmap_set_new ();
778 bitmap_iterator bi;
779 unsigned int i;
780
781 bitmap_and_compl (&result->expressions, &dest->expressions,
782 &orig->expressions);
783
784 FOR_EACH_EXPR_ID_IN_SET (result, i, bi)
785 {
786 pre_expr expr = expression_for_id (i);
787 unsigned int value_id = get_expr_value_id (expr);
788 bitmap_set_bit (&result->values, value_id);
789 }
790
791 return result;
792 }
793
794 /* Subtract all values in bitmap set B from bitmap set A. */
795
796 static void
797 bitmap_set_subtract_values (bitmap_set_t a, bitmap_set_t b)
798 {
799 unsigned int i;
800 bitmap_iterator bi;
801 unsigned to_remove = -1U;
802 bitmap_and_compl_into (&a->values, &b->values);
803 FOR_EACH_EXPR_ID_IN_SET (a, i, bi)
804 {
805 if (to_remove != -1U)
806 {
807 bitmap_clear_bit (&a->expressions, to_remove);
808 to_remove = -1U;
809 }
810 pre_expr expr = expression_for_id (i);
811 if (! bitmap_bit_p (&a->values, get_expr_value_id (expr)))
812 to_remove = i;
813 }
814 if (to_remove != -1U)
815 bitmap_clear_bit (&a->expressions, to_remove);
816 }
817
818
819 /* Return true if bitmapped set SET contains the value VALUE_ID. */
820
821 static bool
822 bitmap_set_contains_value (bitmap_set_t set, unsigned int value_id)
823 {
824 if (value_id_constant_p (value_id))
825 return true;
826
827 return bitmap_bit_p (&set->values, value_id);
828 }
829
830 /* Return true if two bitmap sets are equal. */
831
832 static bool
833 bitmap_set_equal (bitmap_set_t a, bitmap_set_t b)
834 {
835 return bitmap_equal_p (&a->values, &b->values);
836 }
837
838 /* Replace an instance of EXPR's VALUE with EXPR in SET if it exists,
839 and add it otherwise. */
840
841 static void
842 bitmap_value_replace_in_set (bitmap_set_t set, pre_expr expr)
843 {
844 unsigned int val = get_expr_value_id (expr);
845 if (value_id_constant_p (val))
846 return;
847
848 if (bitmap_set_contains_value (set, val))
849 {
850 /* The number of expressions having a given value is usually
851 significantly less than the total number of expressions in SET.
852 Thus, rather than check, for each expression in SET, whether it
853 has the value LOOKFOR, we walk the reverse mapping that tells us
854 what expressions have a given value, and see if any of those
855 expressions are in our set. For large testcases, this is about
856 5-10x faster than walking the bitmap. If this is somehow a
857 significant lose for some cases, we can choose which set to walk
858 based on the set size. */
859 unsigned int i;
860 bitmap_iterator bi;
861 bitmap exprset = value_expressions[val];
862 EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
863 {
864 if (bitmap_clear_bit (&set->expressions, i))
865 {
866 bitmap_set_bit (&set->expressions, get_expression_id (expr));
867 return;
868 }
869 }
870 gcc_unreachable ();
871 }
872 else
873 bitmap_insert_into_set (set, expr);
874 }
875
876 /* Insert EXPR into SET if EXPR's value is not already present in
877 SET. */
878
879 static void
880 bitmap_value_insert_into_set (bitmap_set_t set, pre_expr expr)
881 {
882 unsigned int val = get_expr_value_id (expr);
883
884 gcc_checking_assert (expr->id == get_or_alloc_expression_id (expr));
885
886 /* Constant values are always considered to be part of the set. */
887 if (value_id_constant_p (val))
888 return;
889
890 /* If the value membership changed, add the expression. */
891 if (bitmap_set_bit (&set->values, val))
892 bitmap_set_bit (&set->expressions, expr->id);
893 }
894
895 /* Print out EXPR to outfile. */
896
897 static void
898 print_pre_expr (FILE *outfile, const pre_expr expr)
899 {
900 if (! expr)
901 {
902 fprintf (outfile, "NULL");
903 return;
904 }
905 switch (expr->kind)
906 {
907 case CONSTANT:
908 print_generic_expr (outfile, PRE_EXPR_CONSTANT (expr));
909 break;
910 case NAME:
911 print_generic_expr (outfile, PRE_EXPR_NAME (expr));
912 break;
913 case NARY:
914 {
915 unsigned int i;
916 vn_nary_op_t nary = PRE_EXPR_NARY (expr);
917 fprintf (outfile, "{%s,", get_tree_code_name (nary->opcode));
918 for (i = 0; i < nary->length; i++)
919 {
920 print_generic_expr (outfile, nary->op[i]);
921 if (i != (unsigned) nary->length - 1)
922 fprintf (outfile, ",");
923 }
924 fprintf (outfile, "}");
925 }
926 break;
927
928 case REFERENCE:
929 {
930 vn_reference_op_t vro;
931 unsigned int i;
932 vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
933 fprintf (outfile, "{");
934 for (i = 0;
935 ref->operands.iterate (i, &vro);
936 i++)
937 {
938 bool closebrace = false;
939 if (vro->opcode != SSA_NAME
940 && TREE_CODE_CLASS (vro->opcode) != tcc_declaration)
941 {
942 fprintf (outfile, "%s", get_tree_code_name (vro->opcode));
943 if (vro->op0)
944 {
945 fprintf (outfile, "<");
946 closebrace = true;
947 }
948 }
949 if (vro->op0)
950 {
951 print_generic_expr (outfile, vro->op0);
952 if (vro->op1)
953 {
954 fprintf (outfile, ",");
955 print_generic_expr (outfile, vro->op1);
956 }
957 if (vro->op2)
958 {
959 fprintf (outfile, ",");
960 print_generic_expr (outfile, vro->op2);
961 }
962 }
963 if (closebrace)
964 fprintf (outfile, ">");
965 if (i != ref->operands.length () - 1)
966 fprintf (outfile, ",");
967 }
968 fprintf (outfile, "}");
969 if (ref->vuse)
970 {
971 fprintf (outfile, "@");
972 print_generic_expr (outfile, ref->vuse);
973 }
974 }
975 break;
976 }
977 }
978 void debug_pre_expr (pre_expr);
979
980 /* Like print_pre_expr but always prints to stderr. */
981 DEBUG_FUNCTION void
982 debug_pre_expr (pre_expr e)
983 {
984 print_pre_expr (stderr, e);
985 fprintf (stderr, "\n");
986 }
987
988 /* Print out SET to OUTFILE. */
989
990 static void
991 print_bitmap_set (FILE *outfile, bitmap_set_t set,
992 const char *setname, int blockindex)
993 {
994 fprintf (outfile, "%s[%d] := { ", setname, blockindex);
995 if (set)
996 {
997 bool first = true;
998 unsigned i;
999 bitmap_iterator bi;
1000
1001 FOR_EACH_EXPR_ID_IN_SET (set, i, bi)
1002 {
1003 const pre_expr expr = expression_for_id (i);
1004
1005 if (!first)
1006 fprintf (outfile, ", ");
1007 first = false;
1008 print_pre_expr (outfile, expr);
1009
1010 fprintf (outfile, " (%04d)", get_expr_value_id (expr));
1011 }
1012 }
1013 fprintf (outfile, " }\n");
1014 }
1015
1016 void debug_bitmap_set (bitmap_set_t);
1017
1018 DEBUG_FUNCTION void
1019 debug_bitmap_set (bitmap_set_t set)
1020 {
1021 print_bitmap_set (stderr, set, "debug", 0);
1022 }
1023
1024 void debug_bitmap_sets_for (basic_block);
1025
1026 DEBUG_FUNCTION void
1027 debug_bitmap_sets_for (basic_block bb)
1028 {
1029 print_bitmap_set (stderr, AVAIL_OUT (bb), "avail_out", bb->index);
1030 print_bitmap_set (stderr, EXP_GEN (bb), "exp_gen", bb->index);
1031 print_bitmap_set (stderr, PHI_GEN (bb), "phi_gen", bb->index);
1032 print_bitmap_set (stderr, TMP_GEN (bb), "tmp_gen", bb->index);
1033 print_bitmap_set (stderr, ANTIC_IN (bb), "antic_in", bb->index);
1034 if (do_partial_partial)
1035 print_bitmap_set (stderr, PA_IN (bb), "pa_in", bb->index);
1036 print_bitmap_set (stderr, NEW_SETS (bb), "new_sets", bb->index);
1037 }
1038
1039 /* Print out the expressions that have VAL to OUTFILE. */
1040
1041 static void
1042 print_value_expressions (FILE *outfile, unsigned int val)
1043 {
1044 bitmap set = value_expressions[val];
1045 if (set)
1046 {
1047 bitmap_set x;
1048 char s[10];
1049 sprintf (s, "%04d", val);
1050 x.expressions = *set;
1051 print_bitmap_set (outfile, &x, s, 0);
1052 }
1053 }
1054
1055
1056 DEBUG_FUNCTION void
1057 debug_value_expressions (unsigned int val)
1058 {
1059 print_value_expressions (stderr, val);
1060 }
1061
1062 /* Given a CONSTANT, allocate a new CONSTANT type PRE_EXPR to
1063 represent it. */
1064
1065 static pre_expr
1066 get_or_alloc_expr_for_constant (tree constant)
1067 {
1068 unsigned int result_id;
1069 unsigned int value_id;
1070 struct pre_expr_d expr;
1071 pre_expr newexpr;
1072
1073 expr.kind = CONSTANT;
1074 PRE_EXPR_CONSTANT (&expr) = constant;
1075 result_id = lookup_expression_id (&expr);
1076 if (result_id != 0)
1077 return expression_for_id (result_id);
1078
1079 newexpr = pre_expr_pool.allocate ();
1080 newexpr->kind = CONSTANT;
1081 newexpr->loc = UNKNOWN_LOCATION;
1082 PRE_EXPR_CONSTANT (newexpr) = constant;
1083 alloc_expression_id (newexpr);
1084 value_id = get_or_alloc_constant_value_id (constant);
1085 add_to_value (value_id, newexpr);
1086 return newexpr;
1087 }
1088
1089 /* Get or allocate a pre_expr for a piece of GIMPLE, and return it.
1090 Currently only supports constants and SSA_NAMES. */
1091 static pre_expr
1092 get_or_alloc_expr_for (tree t)
1093 {
1094 if (TREE_CODE (t) == SSA_NAME)
1095 return get_or_alloc_expr_for_name (t);
1096 else if (is_gimple_min_invariant (t))
1097 return get_or_alloc_expr_for_constant (t);
1098 gcc_unreachable ();
1099 }
1100
1101 /* Return the folded version of T if T, when folded, is a gimple
1102 min_invariant or an SSA name. Otherwise, return T. */
1103
1104 static pre_expr
1105 fully_constant_expression (pre_expr e)
1106 {
1107 switch (e->kind)
1108 {
1109 case CONSTANT:
1110 return e;
1111 case NARY:
1112 {
1113 vn_nary_op_t nary = PRE_EXPR_NARY (e);
1114 tree res = vn_nary_simplify (nary);
1115 if (!res)
1116 return e;
1117 if (is_gimple_min_invariant (res))
1118 return get_or_alloc_expr_for_constant (res);
1119 if (TREE_CODE (res) == SSA_NAME)
1120 return get_or_alloc_expr_for_name (res);
1121 return e;
1122 }
1123 case REFERENCE:
1124 {
1125 vn_reference_t ref = PRE_EXPR_REFERENCE (e);
1126 tree folded;
1127 if ((folded = fully_constant_vn_reference_p (ref)))
1128 return get_or_alloc_expr_for_constant (folded);
1129 return e;
1130 }
1131 default:
1132 return e;
1133 }
1134 return e;
1135 }
1136
1137 /* Translate the VUSE backwards through phi nodes in PHIBLOCK, so that
1138 it has the value it would have in BLOCK. Set *SAME_VALID to true
1139 in case the new vuse doesn't change the value id of the OPERANDS. */
1140
1141 static tree
1142 translate_vuse_through_block (vec<vn_reference_op_s> operands,
1143 alias_set_type set, alias_set_type base_set,
1144 tree type, tree vuse,
1145 basic_block phiblock,
1146 basic_block block, bool *same_valid)
1147 {
1148 gimple *phi = SSA_NAME_DEF_STMT (vuse);
1149 ao_ref ref;
1150 edge e = NULL;
1151 bool use_oracle;
1152
1153 if (same_valid)
1154 *same_valid = true;
1155
1156 if (gimple_bb (phi) != phiblock)
1157 return vuse;
1158
1159 unsigned int cnt = param_sccvn_max_alias_queries_per_access;
1160 use_oracle = ao_ref_init_from_vn_reference (&ref, set, base_set,
1161 type, operands);
1162
1163 /* Use the alias-oracle to find either the PHI node in this block,
1164 the first VUSE used in this block that is equivalent to vuse or
1165 the first VUSE which definition in this block kills the value. */
1166 if (gimple_code (phi) == GIMPLE_PHI)
1167 e = find_edge (block, phiblock);
1168 else if (use_oracle)
1169 while (cnt > 0
1170 && !stmt_may_clobber_ref_p_1 (phi, &ref))
1171 {
1172 --cnt;
1173 vuse = gimple_vuse (phi);
1174 phi = SSA_NAME_DEF_STMT (vuse);
1175 if (gimple_bb (phi) != phiblock)
1176 return vuse;
1177 if (gimple_code (phi) == GIMPLE_PHI)
1178 {
1179 e = find_edge (block, phiblock);
1180 break;
1181 }
1182 }
1183 else
1184 return NULL_TREE;
1185
1186 if (e)
1187 {
1188 if (use_oracle && same_valid)
1189 {
1190 bitmap visited = NULL;
1191 /* Try to find a vuse that dominates this phi node by skipping
1192 non-clobbering statements. */
1193 vuse = get_continuation_for_phi (phi, &ref, true,
1194 cnt, &visited, false, NULL, NULL);
1195 if (visited)
1196 BITMAP_FREE (visited);
1197 }
1198 else
1199 vuse = NULL_TREE;
1200 /* If we didn't find any, the value ID can't stay the same. */
1201 if (!vuse && same_valid)
1202 *same_valid = false;
1203 /* ??? We would like to return vuse here as this is the canonical
1204 upmost vdef that this reference is associated with. But during
1205 insertion of the references into the hash tables we only ever
1206 directly insert with their direct gimple_vuse, hence returning
1207 something else would make us not find the other expression. */
1208 return PHI_ARG_DEF (phi, e->dest_idx);
1209 }
1210
1211 return NULL_TREE;
1212 }
1213
1214 /* Like bitmap_find_leader, but checks for the value existing in SET1 *or*
1215 SET2 *or* SET3. This is used to avoid making a set consisting of the union
1216 of PA_IN and ANTIC_IN during insert and phi-translation. */
1217
1218 static inline pre_expr
1219 find_leader_in_sets (unsigned int val, bitmap_set_t set1, bitmap_set_t set2,
1220 bitmap_set_t set3 = NULL)
1221 {
1222 pre_expr result = NULL;
1223
1224 if (set1)
1225 result = bitmap_find_leader (set1, val);
1226 if (!result && set2)
1227 result = bitmap_find_leader (set2, val);
1228 if (!result && set3)
1229 result = bitmap_find_leader (set3, val);
1230 return result;
1231 }
1232
1233 /* Get the tree type for our PRE expression e. */
1234
1235 static tree
1236 get_expr_type (const pre_expr e)
1237 {
1238 switch (e->kind)
1239 {
1240 case NAME:
1241 return TREE_TYPE (PRE_EXPR_NAME (e));
1242 case CONSTANT:
1243 return TREE_TYPE (PRE_EXPR_CONSTANT (e));
1244 case REFERENCE:
1245 return PRE_EXPR_REFERENCE (e)->type;
1246 case NARY:
1247 return PRE_EXPR_NARY (e)->type;
1248 }
1249 gcc_unreachable ();
1250 }
1251
1252 /* Get a representative SSA_NAME for a given expression that is available in B.
1253 Since all of our sub-expressions are treated as values, we require
1254 them to be SSA_NAME's for simplicity.
1255 Prior versions of GVNPRE used to use "value handles" here, so that
1256 an expression would be VH.11 + VH.10 instead of d_3 + e_6. In
1257 either case, the operands are really values (IE we do not expect
1258 them to be usable without finding leaders). */
1259
1260 static tree
1261 get_representative_for (const pre_expr e, basic_block b = NULL)
1262 {
1263 tree name, valnum = NULL_TREE;
1264 unsigned int value_id = get_expr_value_id (e);
1265
1266 switch (e->kind)
1267 {
1268 case NAME:
1269 return PRE_EXPR_NAME (e);
1270 case CONSTANT:
1271 return PRE_EXPR_CONSTANT (e);
1272 case NARY:
1273 case REFERENCE:
1274 {
1275 /* Go through all of the expressions representing this value
1276 and pick out an SSA_NAME. */
1277 unsigned int i;
1278 bitmap_iterator bi;
1279 bitmap exprs = value_expressions[value_id];
1280 EXECUTE_IF_SET_IN_BITMAP (exprs, 0, i, bi)
1281 {
1282 pre_expr rep = expression_for_id (i);
1283 if (rep->kind == NAME)
1284 {
1285 tree name = PRE_EXPR_NAME (rep);
1286 valnum = VN_INFO (name)->valnum;
1287 gimple *def = SSA_NAME_DEF_STMT (name);
1288 /* We have to return either a new representative or one
1289 that can be used for expression simplification and thus
1290 is available in B. */
1291 if (! b
1292 || gimple_nop_p (def)
1293 || dominated_by_p (CDI_DOMINATORS, b, gimple_bb (def)))
1294 return name;
1295 }
1296 else if (rep->kind == CONSTANT)
1297 return PRE_EXPR_CONSTANT (rep);
1298 }
1299 }
1300 break;
1301 }
1302
1303 /* If we reached here we couldn't find an SSA_NAME. This can
1304 happen when we've discovered a value that has never appeared in
1305 the program as set to an SSA_NAME, as the result of phi translation.
1306 Create one here.
1307 ??? We should be able to re-use this when we insert the statement
1308 to compute it. */
1309 name = make_temp_ssa_name (get_expr_type (e), gimple_build_nop (), "pretmp");
1310 VN_INFO (name)->value_id = value_id;
1311 VN_INFO (name)->valnum = valnum ? valnum : name;
1312 /* ??? For now mark this SSA name for release by VN. */
1313 VN_INFO (name)->needs_insertion = true;
1314 add_to_value (value_id, get_or_alloc_expr_for_name (name));
1315 if (dump_file && (dump_flags & TDF_DETAILS))
1316 {
1317 fprintf (dump_file, "Created SSA_NAME representative ");
1318 print_generic_expr (dump_file, name);
1319 fprintf (dump_file, " for expression:");
1320 print_pre_expr (dump_file, e);
1321 fprintf (dump_file, " (%04d)\n", value_id);
1322 }
1323
1324 return name;
1325 }
1326
1327
1328 static pre_expr
1329 phi_translate (bitmap_set_t, pre_expr, bitmap_set_t, bitmap_set_t, edge);
1330
1331 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
1332 the phis in PRED. Return NULL if we can't find a leader for each part
1333 of the translated expression. */
1334
1335 static pre_expr
1336 phi_translate_1 (bitmap_set_t dest,
1337 pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, edge e)
1338 {
1339 basic_block pred = e->src;
1340 basic_block phiblock = e->dest;
1341 location_t expr_loc = expr->loc;
1342 switch (expr->kind)
1343 {
1344 case NARY:
1345 {
1346 unsigned int i;
1347 bool changed = false;
1348 vn_nary_op_t nary = PRE_EXPR_NARY (expr);
1349 vn_nary_op_t newnary = XALLOCAVAR (struct vn_nary_op_s,
1350 sizeof_vn_nary_op (nary->length));
1351 memcpy (newnary, nary, sizeof_vn_nary_op (nary->length));
1352
1353 for (i = 0; i < newnary->length; i++)
1354 {
1355 if (TREE_CODE (newnary->op[i]) != SSA_NAME)
1356 continue;
1357 else
1358 {
1359 pre_expr leader, result;
1360 unsigned int op_val_id = VN_INFO (newnary->op[i])->value_id;
1361 leader = find_leader_in_sets (op_val_id, set1, set2);
1362 result = phi_translate (dest, leader, set1, set2, e);
1363 if (result && result != leader)
1364 /* If op has a leader in the sets we translate make
1365 sure to use the value of the translated expression.
1366 We might need a new representative for that. */
1367 newnary->op[i] = get_representative_for (result, pred);
1368 else if (!result)
1369 return NULL;
1370
1371 changed |= newnary->op[i] != nary->op[i];
1372 }
1373 }
1374 if (changed)
1375 {
1376 pre_expr constant;
1377 unsigned int new_val_id;
1378
1379 PRE_EXPR_NARY (expr) = newnary;
1380 constant = fully_constant_expression (expr);
1381 PRE_EXPR_NARY (expr) = nary;
1382 if (constant != expr)
1383 {
1384 /* For non-CONSTANTs we have to make sure we can eventually
1385 insert the expression. Which means we need to have a
1386 leader for it. */
1387 if (constant->kind != CONSTANT)
1388 {
1389 /* Do not allow simplifications to non-constants over
1390 backedges as this will likely result in a loop PHI node
1391 to be inserted and increased register pressure.
1392 See PR77498 - this avoids doing predcoms work in
1393 a less efficient way. */
1394 if (e->flags & EDGE_DFS_BACK)
1395 ;
1396 else
1397 {
1398 unsigned value_id = get_expr_value_id (constant);
1399 /* We want a leader in ANTIC_OUT or AVAIL_OUT here.
1400 dest has what we computed into ANTIC_OUT sofar
1401 so pick from that - since topological sorting
1402 by sorted_array_from_bitmap_set isn't perfect
1403 we may lose some cases here. */
1404 constant = find_leader_in_sets (value_id, dest,
1405 AVAIL_OUT (pred));
1406 if (constant)
1407 {
1408 if (dump_file && (dump_flags & TDF_DETAILS))
1409 {
1410 fprintf (dump_file, "simplifying ");
1411 print_pre_expr (dump_file, expr);
1412 fprintf (dump_file, " translated %d -> %d to ",
1413 phiblock->index, pred->index);
1414 PRE_EXPR_NARY (expr) = newnary;
1415 print_pre_expr (dump_file, expr);
1416 PRE_EXPR_NARY (expr) = nary;
1417 fprintf (dump_file, " to ");
1418 print_pre_expr (dump_file, constant);
1419 fprintf (dump_file, "\n");
1420 }
1421 return constant;
1422 }
1423 }
1424 }
1425 else
1426 return constant;
1427 }
1428
1429 /* vn_nary_* do not valueize operands. */
1430 for (i = 0; i < newnary->length; ++i)
1431 if (TREE_CODE (newnary->op[i]) == SSA_NAME)
1432 newnary->op[i] = VN_INFO (newnary->op[i])->valnum;
1433 tree result = vn_nary_op_lookup_pieces (newnary->length,
1434 newnary->opcode,
1435 newnary->type,
1436 &newnary->op[0],
1437 &nary);
1438 if (result && is_gimple_min_invariant (result))
1439 return get_or_alloc_expr_for_constant (result);
1440
1441 expr = pre_expr_pool.allocate ();
1442 expr->kind = NARY;
1443 expr->id = 0;
1444 expr->loc = expr_loc;
1445 if (nary && !nary->predicated_values)
1446 {
1447 PRE_EXPR_NARY (expr) = nary;
1448 new_val_id = nary->value_id;
1449 get_or_alloc_expression_id (expr);
1450 }
1451 else
1452 {
1453 new_val_id = get_next_value_id ();
1454 value_expressions.safe_grow_cleared (get_max_value_id () + 1,
1455 true);
1456 nary = vn_nary_op_insert_pieces (newnary->length,
1457 newnary->opcode,
1458 newnary->type,
1459 &newnary->op[0],
1460 result, new_val_id);
1461 PRE_EXPR_NARY (expr) = nary;
1462 get_or_alloc_expression_id (expr);
1463 }
1464 add_to_value (new_val_id, expr);
1465 }
1466 return expr;
1467 }
1468 break;
1469
1470 case REFERENCE:
1471 {
1472 vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
1473 vec<vn_reference_op_s> operands = ref->operands;
1474 tree vuse = ref->vuse;
1475 tree newvuse = vuse;
1476 vec<vn_reference_op_s> newoperands = vNULL;
1477 bool changed = false, same_valid = true;
1478 unsigned int i, n;
1479 vn_reference_op_t operand;
1480 vn_reference_t newref;
1481
1482 for (i = 0; operands.iterate (i, &operand); i++)
1483 {
1484 pre_expr opresult;
1485 pre_expr leader;
1486 tree op[3];
1487 tree type = operand->type;
1488 vn_reference_op_s newop = *operand;
1489 op[0] = operand->op0;
1490 op[1] = operand->op1;
1491 op[2] = operand->op2;
1492 for (n = 0; n < 3; ++n)
1493 {
1494 unsigned int op_val_id;
1495 if (!op[n])
1496 continue;
1497 if (TREE_CODE (op[n]) != SSA_NAME)
1498 {
1499 /* We can't possibly insert these. */
1500 if (n != 0
1501 && !is_gimple_min_invariant (op[n]))
1502 break;
1503 continue;
1504 }
1505 op_val_id = VN_INFO (op[n])->value_id;
1506 leader = find_leader_in_sets (op_val_id, set1, set2);
1507 opresult = phi_translate (dest, leader, set1, set2, e);
1508 if (opresult && opresult != leader)
1509 {
1510 tree name = get_representative_for (opresult);
1511 changed |= name != op[n];
1512 op[n] = name;
1513 }
1514 else if (!opresult)
1515 break;
1516 }
1517 if (n != 3)
1518 {
1519 newoperands.release ();
1520 return NULL;
1521 }
1522 if (!changed)
1523 continue;
1524 if (!newoperands.exists ())
1525 newoperands = operands.copy ();
1526 /* We may have changed from an SSA_NAME to a constant */
1527 if (newop.opcode == SSA_NAME && TREE_CODE (op[0]) != SSA_NAME)
1528 newop.opcode = TREE_CODE (op[0]);
1529 newop.type = type;
1530 newop.op0 = op[0];
1531 newop.op1 = op[1];
1532 newop.op2 = op[2];
1533 newoperands[i] = newop;
1534 }
1535 gcc_checking_assert (i == operands.length ());
1536
1537 if (vuse)
1538 {
1539 newvuse = translate_vuse_through_block (newoperands.exists ()
1540 ? newoperands : operands,
1541 ref->set, ref->base_set,
1542 ref->type,
1543 vuse, phiblock, pred,
1544 changed
1545 ? NULL : &same_valid);
1546 if (newvuse == NULL_TREE)
1547 {
1548 newoperands.release ();
1549 return NULL;
1550 }
1551 }
1552
1553 if (changed || newvuse != vuse)
1554 {
1555 unsigned int new_val_id;
1556
1557 tree result = vn_reference_lookup_pieces (newvuse, ref->set,
1558 ref->base_set,
1559 ref->type,
1560 newoperands.exists ()
1561 ? newoperands : operands,
1562 &newref, VN_WALK);
1563 if (result)
1564 newoperands.release ();
1565
1566 /* We can always insert constants, so if we have a partial
1567 redundant constant load of another type try to translate it
1568 to a constant of appropriate type. */
1569 if (result && is_gimple_min_invariant (result))
1570 {
1571 tree tem = result;
1572 if (!useless_type_conversion_p (ref->type, TREE_TYPE (result)))
1573 {
1574 tem = fold_unary (VIEW_CONVERT_EXPR, ref->type, result);
1575 if (tem && !is_gimple_min_invariant (tem))
1576 tem = NULL_TREE;
1577 }
1578 if (tem)
1579 return get_or_alloc_expr_for_constant (tem);
1580 }
1581
1582 /* If we'd have to convert things we would need to validate
1583 if we can insert the translated expression. So fail
1584 here for now - we cannot insert an alias with a different
1585 type in the VN tables either, as that would assert. */
1586 if (result
1587 && !useless_type_conversion_p (ref->type, TREE_TYPE (result)))
1588 return NULL;
1589 else if (!result && newref
1590 && !useless_type_conversion_p (ref->type, newref->type))
1591 {
1592 newoperands.release ();
1593 return NULL;
1594 }
1595
1596 expr = pre_expr_pool.allocate ();
1597 expr->kind = REFERENCE;
1598 expr->id = 0;
1599 expr->loc = expr_loc;
1600
1601 if (newref)
1602 new_val_id = newref->value_id;
1603 else
1604 {
1605 if (changed || !same_valid)
1606 {
1607 new_val_id = get_next_value_id ();
1608 value_expressions.safe_grow_cleared
1609 (get_max_value_id () + 1, true);
1610 }
1611 else
1612 new_val_id = ref->value_id;
1613 if (!newoperands.exists ())
1614 newoperands = operands.copy ();
1615 newref = vn_reference_insert_pieces (newvuse, ref->set,
1616 ref->base_set, ref->type,
1617 newoperands,
1618 result, new_val_id);
1619 newoperands = vNULL;
1620 }
1621 PRE_EXPR_REFERENCE (expr) = newref;
1622 get_or_alloc_expression_id (expr);
1623 add_to_value (new_val_id, expr);
1624 }
1625 newoperands.release ();
1626 return expr;
1627 }
1628 break;
1629
1630 case NAME:
1631 {
1632 tree name = PRE_EXPR_NAME (expr);
1633 gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1634 /* If the SSA name is defined by a PHI node in this block,
1635 translate it. */
1636 if (gimple_code (def_stmt) == GIMPLE_PHI
1637 && gimple_bb (def_stmt) == phiblock)
1638 {
1639 tree def = PHI_ARG_DEF (def_stmt, e->dest_idx);
1640
1641 /* Handle constant. */
1642 if (is_gimple_min_invariant (def))
1643 return get_or_alloc_expr_for_constant (def);
1644
1645 return get_or_alloc_expr_for_name (def);
1646 }
1647 /* Otherwise return it unchanged - it will get removed if its
1648 value is not available in PREDs AVAIL_OUT set of expressions
1649 by the subtraction of TMP_GEN. */
1650 return expr;
1651 }
1652
1653 default:
1654 gcc_unreachable ();
1655 }
1656 }
1657
1658 /* Wrapper around phi_translate_1 providing caching functionality. */
1659
1660 static pre_expr
1661 phi_translate (bitmap_set_t dest, pre_expr expr,
1662 bitmap_set_t set1, bitmap_set_t set2, edge e)
1663 {
1664 expr_pred_trans_t slot = NULL;
1665 pre_expr phitrans;
1666
1667 if (!expr)
1668 return NULL;
1669
1670 /* Constants contain no values that need translation. */
1671 if (expr->kind == CONSTANT)
1672 return expr;
1673
1674 if (value_id_constant_p (get_expr_value_id (expr)))
1675 return expr;
1676
1677 /* Don't add translations of NAMEs as those are cheap to translate. */
1678 if (expr->kind != NAME)
1679 {
1680 if (phi_trans_add (&slot, expr, e->src))
1681 return slot->v;
1682 /* Store NULL for the value we want to return in the case of
1683 recursing. */
1684 slot->v = NULL;
1685 }
1686
1687 /* Translate. */
1688 basic_block saved_valueize_bb = vn_context_bb;
1689 vn_context_bb = e->src;
1690 phitrans = phi_translate_1 (dest, expr, set1, set2, e);
1691 vn_context_bb = saved_valueize_bb;
1692
1693 if (slot)
1694 {
1695 if (phitrans)
1696 slot->v = phitrans;
1697 else
1698 /* Remove failed translations again, they cause insert
1699 iteration to not pick up new opportunities reliably. */
1700 phi_translate_table->remove_elt_with_hash (slot, slot->hashcode);
1701 }
1702
1703 return phitrans;
1704 }
1705
1706
1707 /* For each expression in SET, translate the values through phi nodes
1708 in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting
1709 expressions in DEST. */
1710
1711 static void
1712 phi_translate_set (bitmap_set_t dest, bitmap_set_t set, edge e)
1713 {
1714 vec<pre_expr> exprs;
1715 pre_expr expr;
1716 int i;
1717
1718 if (gimple_seq_empty_p (phi_nodes (e->dest)))
1719 {
1720 bitmap_set_copy (dest, set);
1721 return;
1722 }
1723
1724 exprs = sorted_array_from_bitmap_set (set);
1725 FOR_EACH_VEC_ELT (exprs, i, expr)
1726 {
1727 pre_expr translated;
1728 translated = phi_translate (dest, expr, set, NULL, e);
1729 if (!translated)
1730 continue;
1731
1732 bitmap_insert_into_set (dest, translated);
1733 }
1734 exprs.release ();
1735 }
1736
1737 /* Find the leader for a value (i.e., the name representing that
1738 value) in a given set, and return it. Return NULL if no leader
1739 is found. */
1740
1741 static pre_expr
1742 bitmap_find_leader (bitmap_set_t set, unsigned int val)
1743 {
1744 if (value_id_constant_p (val))
1745 {
1746 unsigned int i;
1747 bitmap_iterator bi;
1748 bitmap exprset = value_expressions[val];
1749
1750 EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
1751 {
1752 pre_expr expr = expression_for_id (i);
1753 if (expr->kind == CONSTANT)
1754 return expr;
1755 }
1756 }
1757 if (bitmap_set_contains_value (set, val))
1758 {
1759 /* Rather than walk the entire bitmap of expressions, and see
1760 whether any of them has the value we are looking for, we look
1761 at the reverse mapping, which tells us the set of expressions
1762 that have a given value (IE value->expressions with that
1763 value) and see if any of those expressions are in our set.
1764 The number of expressions per value is usually significantly
1765 less than the number of expressions in the set. In fact, for
1766 large testcases, doing it this way is roughly 5-10x faster
1767 than walking the bitmap.
1768 If this is somehow a significant lose for some cases, we can
1769 choose which set to walk based on which set is smaller. */
1770 unsigned int i;
1771 bitmap_iterator bi;
1772 bitmap exprset = value_expressions[val];
1773
1774 EXECUTE_IF_AND_IN_BITMAP (exprset, &set->expressions, 0, i, bi)
1775 return expression_for_id (i);
1776 }
1777 return NULL;
1778 }
1779
1780 /* Determine if EXPR, a memory expression, is ANTIC_IN at the top of
1781 BLOCK by seeing if it is not killed in the block. Note that we are
1782 only determining whether there is a store that kills it. Because
1783 of the order in which clean iterates over values, we are guaranteed
1784 that altered operands will have caused us to be eliminated from the
1785 ANTIC_IN set already. */
1786
1787 static bool
1788 value_dies_in_block_x (pre_expr expr, basic_block block)
1789 {
1790 tree vuse = PRE_EXPR_REFERENCE (expr)->vuse;
1791 vn_reference_t refx = PRE_EXPR_REFERENCE (expr);
1792 gimple *def;
1793 gimple_stmt_iterator gsi;
1794 unsigned id = get_expression_id (expr);
1795 bool res = false;
1796 ao_ref ref;
1797
1798 if (!vuse)
1799 return false;
1800
1801 /* Lookup a previously calculated result. */
1802 if (EXPR_DIES (block)
1803 && bitmap_bit_p (EXPR_DIES (block), id * 2))
1804 return bitmap_bit_p (EXPR_DIES (block), id * 2 + 1);
1805
1806 /* A memory expression {e, VUSE} dies in the block if there is a
1807 statement that may clobber e. If, starting statement walk from the
1808 top of the basic block, a statement uses VUSE there can be no kill
1809 inbetween that use and the original statement that loaded {e, VUSE},
1810 so we can stop walking. */
1811 ref.base = NULL_TREE;
1812 for (gsi = gsi_start_bb (block); !gsi_end_p (gsi); gsi_next (&gsi))
1813 {
1814 tree def_vuse, def_vdef;
1815 def = gsi_stmt (gsi);
1816 def_vuse = gimple_vuse (def);
1817 def_vdef = gimple_vdef (def);
1818
1819 /* Not a memory statement. */
1820 if (!def_vuse)
1821 continue;
1822
1823 /* Not a may-def. */
1824 if (!def_vdef)
1825 {
1826 /* A load with the same VUSE, we're done. */
1827 if (def_vuse == vuse)
1828 break;
1829
1830 continue;
1831 }
1832
1833 /* Init ref only if we really need it. */
1834 if (ref.base == NULL_TREE
1835 && !ao_ref_init_from_vn_reference (&ref, refx->set, refx->base_set,
1836 refx->type, refx->operands))
1837 {
1838 res = true;
1839 break;
1840 }
1841 /* If the statement may clobber expr, it dies. */
1842 if (stmt_may_clobber_ref_p_1 (def, &ref))
1843 {
1844 res = true;
1845 break;
1846 }
1847 }
1848
1849 /* Remember the result. */
1850 if (!EXPR_DIES (block))
1851 EXPR_DIES (block) = BITMAP_ALLOC (&grand_bitmap_obstack);
1852 bitmap_set_bit (EXPR_DIES (block), id * 2);
1853 if (res)
1854 bitmap_set_bit (EXPR_DIES (block), id * 2 + 1);
1855
1856 return res;
1857 }
1858
1859
1860 /* Determine if OP is valid in SET1 U SET2, which it is when the union
1861 contains its value-id. */
1862
1863 static bool
1864 op_valid_in_sets (bitmap_set_t set1, bitmap_set_t set2, tree op)
1865 {
1866 if (op && TREE_CODE (op) == SSA_NAME)
1867 {
1868 unsigned int value_id = VN_INFO (op)->value_id;
1869 if (!(bitmap_set_contains_value (set1, value_id)
1870 || (set2 && bitmap_set_contains_value (set2, value_id))))
1871 return false;
1872 }
1873 return true;
1874 }
1875
1876 /* Determine if the expression EXPR is valid in SET1 U SET2.
1877 ONLY SET2 CAN BE NULL.
1878 This means that we have a leader for each part of the expression
1879 (if it consists of values), or the expression is an SSA_NAME.
1880 For loads/calls, we also see if the vuse is killed in this block. */
1881
1882 static bool
1883 valid_in_sets (bitmap_set_t set1, bitmap_set_t set2, pre_expr expr)
1884 {
1885 switch (expr->kind)
1886 {
1887 case NAME:
1888 /* By construction all NAMEs are available. Non-available
1889 NAMEs are removed by subtracting TMP_GEN from the sets. */
1890 return true;
1891 case NARY:
1892 {
1893 unsigned int i;
1894 vn_nary_op_t nary = PRE_EXPR_NARY (expr);
1895 for (i = 0; i < nary->length; i++)
1896 if (!op_valid_in_sets (set1, set2, nary->op[i]))
1897 return false;
1898 return true;
1899 }
1900 break;
1901 case REFERENCE:
1902 {
1903 vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
1904 vn_reference_op_t vro;
1905 unsigned int i;
1906
1907 FOR_EACH_VEC_ELT (ref->operands, i, vro)
1908 {
1909 if (!op_valid_in_sets (set1, set2, vro->op0)
1910 || !op_valid_in_sets (set1, set2, vro->op1)
1911 || !op_valid_in_sets (set1, set2, vro->op2))
1912 return false;
1913 }
1914 return true;
1915 }
1916 default:
1917 gcc_unreachable ();
1918 }
1919 }
1920
1921 /* Clean the set of expressions SET1 that are no longer valid in SET1 or SET2.
1922 This means expressions that are made up of values we have no leaders for
1923 in SET1 or SET2. */
1924
1925 static void
1926 clean (bitmap_set_t set1, bitmap_set_t set2 = NULL)
1927 {
1928 vec<pre_expr> exprs = sorted_array_from_bitmap_set (set1);
1929 pre_expr expr;
1930 int i;
1931
1932 FOR_EACH_VEC_ELT (exprs, i, expr)
1933 {
1934 if (!valid_in_sets (set1, set2, expr))
1935 {
1936 unsigned int val = get_expr_value_id (expr);
1937 bitmap_clear_bit (&set1->expressions, get_expression_id (expr));
1938 /* We are entered with possibly multiple expressions for a value
1939 so before removing a value from the set see if there's an
1940 expression for it left. */
1941 if (! bitmap_find_leader (set1, val))
1942 bitmap_clear_bit (&set1->values, val);
1943 }
1944 }
1945 exprs.release ();
1946 }
1947
1948 /* Clean the set of expressions that are no longer valid in SET because
1949 they are clobbered in BLOCK or because they trap and may not be executed. */
1950
1951 static void
1952 prune_clobbered_mems (bitmap_set_t set, basic_block block)
1953 {
1954 bitmap_iterator bi;
1955 unsigned i;
1956 unsigned to_remove = -1U;
1957 bool any_removed = false;
1958
1959 FOR_EACH_EXPR_ID_IN_SET (set, i, bi)
1960 {
1961 /* Remove queued expr. */
1962 if (to_remove != -1U)
1963 {
1964 bitmap_clear_bit (&set->expressions, to_remove);
1965 any_removed = true;
1966 to_remove = -1U;
1967 }
1968
1969 pre_expr expr = expression_for_id (i);
1970 if (expr->kind == REFERENCE)
1971 {
1972 vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
1973 if (ref->vuse)
1974 {
1975 gimple *def_stmt = SSA_NAME_DEF_STMT (ref->vuse);
1976 if (!gimple_nop_p (def_stmt)
1977 && ((gimple_bb (def_stmt) != block
1978 && !dominated_by_p (CDI_DOMINATORS,
1979 block, gimple_bb (def_stmt)))
1980 || (gimple_bb (def_stmt) == block
1981 && value_dies_in_block_x (expr, block))))
1982 to_remove = i;
1983 }
1984 }
1985 else if (expr->kind == NARY)
1986 {
1987 vn_nary_op_t nary = PRE_EXPR_NARY (expr);
1988 /* If the NARY may trap make sure the block does not contain
1989 a possible exit point.
1990 ??? This is overly conservative if we translate AVAIL_OUT
1991 as the available expression might be after the exit point. */
1992 if (BB_MAY_NOTRETURN (block)
1993 && vn_nary_may_trap (nary))
1994 to_remove = i;
1995 }
1996 }
1997
1998 /* Remove queued expr. */
1999 if (to_remove != -1U)
2000 {
2001 bitmap_clear_bit (&set->expressions, to_remove);
2002 any_removed = true;
2003 }
2004
2005 /* Above we only removed expressions, now clean the set of values
2006 which no longer have any corresponding expression. We cannot
2007 clear the value at the time we remove an expression since there
2008 may be multiple expressions per value.
2009 If we'd queue possibly to be removed values we could use
2010 the bitmap_find_leader way to see if there's still an expression
2011 for it. For some ratio of to be removed values and number of
2012 values/expressions in the set this might be faster than rebuilding
2013 the value-set. */
2014 if (any_removed)
2015 {
2016 bitmap_clear (&set->values);
2017 FOR_EACH_EXPR_ID_IN_SET (set, i, bi)
2018 {
2019 pre_expr expr = expression_for_id (i);
2020 unsigned int value_id = get_expr_value_id (expr);
2021 bitmap_set_bit (&set->values, value_id);
2022 }
2023 }
2024 }
2025
2026 /* Compute the ANTIC set for BLOCK.
2027
2028 If succs(BLOCK) > 1 then
2029 ANTIC_OUT[BLOCK] = intersection of ANTIC_IN[b] for all succ(BLOCK)
2030 else if succs(BLOCK) == 1 then
2031 ANTIC_OUT[BLOCK] = phi_translate (ANTIC_IN[succ(BLOCK)])
2032
2033 ANTIC_IN[BLOCK] = clean(ANTIC_OUT[BLOCK] U EXP_GEN[BLOCK] - TMP_GEN[BLOCK])
2034
2035 Note that clean() is deferred until after the iteration. */
2036
2037 static bool
2038 compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
2039 {
2040 bitmap_set_t S, old, ANTIC_OUT;
2041 edge e;
2042 edge_iterator ei;
2043
2044 bool was_visited = BB_VISITED (block);
2045 bool changed = ! BB_VISITED (block);
2046 BB_VISITED (block) = 1;
2047 old = ANTIC_OUT = S = NULL;
2048
2049 /* If any edges from predecessors are abnormal, antic_in is empty,
2050 so do nothing. */
2051 if (block_has_abnormal_pred_edge)
2052 goto maybe_dump_sets;
2053
2054 old = ANTIC_IN (block);
2055 ANTIC_OUT = bitmap_set_new ();
2056
2057 /* If the block has no successors, ANTIC_OUT is empty. */
2058 if (EDGE_COUNT (block->succs) == 0)
2059 ;
2060 /* If we have one successor, we could have some phi nodes to
2061 translate through. */
2062 else if (single_succ_p (block))
2063 {
2064 e = single_succ_edge (block);
2065 gcc_assert (BB_VISITED (e->dest));
2066 phi_translate_set (ANTIC_OUT, ANTIC_IN (e->dest), e);
2067 }
2068 /* If we have multiple successors, we take the intersection of all of
2069 them. Note that in the case of loop exit phi nodes, we may have
2070 phis to translate through. */
2071 else
2072 {
2073 size_t i;
2074 edge first = NULL;
2075
2076 auto_vec<edge> worklist (EDGE_COUNT (block->succs));
2077 FOR_EACH_EDGE (e, ei, block->succs)
2078 {
2079 if (!first
2080 && BB_VISITED (e->dest))
2081 first = e;
2082 else if (BB_VISITED (e->dest))
2083 worklist.quick_push (e);
2084 else
2085 {
2086 /* Unvisited successors get their ANTIC_IN replaced by the
2087 maximal set to arrive at a maximum ANTIC_IN solution.
2088 We can ignore them in the intersection operation and thus
2089 need not explicitely represent that maximum solution. */
2090 if (dump_file && (dump_flags & TDF_DETAILS))
2091 fprintf (dump_file, "ANTIC_IN is MAX on %d->%d\n",
2092 e->src->index, e->dest->index);
2093 }
2094 }
2095
2096 /* Of multiple successors we have to have visited one already
2097 which is guaranteed by iteration order. */
2098 gcc_assert (first != NULL);
2099
2100 phi_translate_set (ANTIC_OUT, ANTIC_IN (first->dest), first);
2101
2102 /* If we have multiple successors we need to intersect the ANTIC_OUT
2103 sets. For values that's a simple intersection but for
2104 expressions it is a union. Given we want to have a single
2105 expression per value in our sets we have to canonicalize.
2106 Avoid randomness and running into cycles like for PR82129 and
2107 canonicalize the expression we choose to the one with the
2108 lowest id. This requires we actually compute the union first. */
2109 FOR_EACH_VEC_ELT (worklist, i, e)
2110 {
2111 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
2112 {
2113 bitmap_set_t tmp = bitmap_set_new ();
2114 phi_translate_set (tmp, ANTIC_IN (e->dest), e);
2115 bitmap_and_into (&ANTIC_OUT->values, &tmp->values);
2116 bitmap_ior_into (&ANTIC_OUT->expressions, &tmp->expressions);
2117 bitmap_set_free (tmp);
2118 }
2119 else
2120 {
2121 bitmap_and_into (&ANTIC_OUT->values, &ANTIC_IN (e->dest)->values);
2122 bitmap_ior_into (&ANTIC_OUT->expressions,
2123 &ANTIC_IN (e->dest)->expressions);
2124 }
2125 }
2126 if (! worklist.is_empty ())
2127 {
2128 /* Prune expressions not in the value set. */
2129 bitmap_iterator bi;
2130 unsigned int i;
2131 unsigned int to_clear = -1U;
2132 FOR_EACH_EXPR_ID_IN_SET (ANTIC_OUT, i, bi)
2133 {
2134 if (to_clear != -1U)
2135 {
2136 bitmap_clear_bit (&ANTIC_OUT->expressions, to_clear);
2137 to_clear = -1U;
2138 }
2139 pre_expr expr = expression_for_id (i);
2140 unsigned int value_id = get_expr_value_id (expr);
2141 if (!bitmap_bit_p (&ANTIC_OUT->values, value_id))
2142 to_clear = i;
2143 }
2144 if (to_clear != -1U)
2145 bitmap_clear_bit (&ANTIC_OUT->expressions, to_clear);
2146 }
2147 }
2148
2149 /* Prune expressions that are clobbered in block and thus become
2150 invalid if translated from ANTIC_OUT to ANTIC_IN. */
2151 prune_clobbered_mems (ANTIC_OUT, block);
2152
2153 /* Generate ANTIC_OUT - TMP_GEN. */
2154 S = bitmap_set_subtract_expressions (ANTIC_OUT, TMP_GEN (block));
2155
2156 /* Start ANTIC_IN with EXP_GEN - TMP_GEN. */
2157 ANTIC_IN (block) = bitmap_set_subtract_expressions (EXP_GEN (block),
2158 TMP_GEN (block));
2159
2160 /* Then union in the ANTIC_OUT - TMP_GEN values,
2161 to get ANTIC_OUT U EXP_GEN - TMP_GEN */
2162 bitmap_ior_into (&ANTIC_IN (block)->values, &S->values);
2163 bitmap_ior_into (&ANTIC_IN (block)->expressions, &S->expressions);
2164
2165 /* clean (ANTIC_IN (block)) is defered to after the iteration converged
2166 because it can cause non-convergence, see for example PR81181. */
2167
2168 /* Intersect ANTIC_IN with the old ANTIC_IN. This is required until
2169 we properly represent the maximum expression set, thus not prune
2170 values without expressions during the iteration. */
2171 if (was_visited
2172 && bitmap_and_into (&ANTIC_IN (block)->values, &old->values))
2173 {
2174 if (dump_file && (dump_flags & TDF_DETAILS))
2175 fprintf (dump_file, "warning: intersecting with old ANTIC_IN "
2176 "shrinks the set\n");
2177 /* Prune expressions not in the value set. */
2178 bitmap_iterator bi;
2179 unsigned int i;
2180 unsigned int to_clear = -1U;
2181 FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (block), i, bi)
2182 {
2183 if (to_clear != -1U)
2184 {
2185 bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
2186 to_clear = -1U;
2187 }
2188 pre_expr expr = expression_for_id (i);
2189 unsigned int value_id = get_expr_value_id (expr);
2190 if (!bitmap_bit_p (&ANTIC_IN (block)->values, value_id))
2191 to_clear = i;
2192 }
2193 if (to_clear != -1U)
2194 bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
2195 }
2196
2197 if (!bitmap_set_equal (old, ANTIC_IN (block)))
2198 changed = true;
2199
2200 maybe_dump_sets:
2201 if (dump_file && (dump_flags & TDF_DETAILS))
2202 {
2203 if (ANTIC_OUT)
2204 print_bitmap_set (dump_file, ANTIC_OUT, "ANTIC_OUT", block->index);
2205
2206 if (changed)
2207 fprintf (dump_file, "[changed] ");
2208 print_bitmap_set (dump_file, ANTIC_IN (block), "ANTIC_IN",
2209 block->index);
2210
2211 if (S)
2212 print_bitmap_set (dump_file, S, "S", block->index);
2213 }
2214 if (old)
2215 bitmap_set_free (old);
2216 if (S)
2217 bitmap_set_free (S);
2218 if (ANTIC_OUT)
2219 bitmap_set_free (ANTIC_OUT);
2220 return changed;
2221 }
2222
2223 /* Compute PARTIAL_ANTIC for BLOCK.
2224
2225 If succs(BLOCK) > 1 then
2226 PA_OUT[BLOCK] = value wise union of PA_IN[b] + all ANTIC_IN not
2227 in ANTIC_OUT for all succ(BLOCK)
2228 else if succs(BLOCK) == 1 then
2229 PA_OUT[BLOCK] = phi_translate (PA_IN[succ(BLOCK)])
2230
2231 PA_IN[BLOCK] = clean(PA_OUT[BLOCK] - TMP_GEN[BLOCK] - ANTIC_IN[BLOCK])
2232
2233 */
2234 static void
2235 compute_partial_antic_aux (basic_block block,
2236 bool block_has_abnormal_pred_edge)
2237 {
2238 bitmap_set_t old_PA_IN;
2239 bitmap_set_t PA_OUT;
2240 edge e;
2241 edge_iterator ei;
2242 unsigned long max_pa = param_max_partial_antic_length;
2243
2244 old_PA_IN = PA_OUT = NULL;
2245
2246 /* If any edges from predecessors are abnormal, antic_in is empty,
2247 so do nothing. */
2248 if (block_has_abnormal_pred_edge)
2249 goto maybe_dump_sets;
2250
2251 /* If there are too many partially anticipatable values in the
2252 block, phi_translate_set can take an exponential time: stop
2253 before the translation starts. */
2254 if (max_pa
2255 && single_succ_p (block)
2256 && bitmap_count_bits (&PA_IN (single_succ (block))->values) > max_pa)
2257 goto maybe_dump_sets;
2258
2259 old_PA_IN = PA_IN (block);
2260 PA_OUT = bitmap_set_new ();
2261
2262 /* If the block has no successors, ANTIC_OUT is empty. */
2263 if (EDGE_COUNT (block->succs) == 0)
2264 ;
2265 /* If we have one successor, we could have some phi nodes to
2266 translate through. Note that we can't phi translate across DFS
2267 back edges in partial antic, because it uses a union operation on
2268 the successors. For recurrences like IV's, we will end up
2269 generating a new value in the set on each go around (i + 3 (VH.1)
2270 VH.1 + 1 (VH.2), VH.2 + 1 (VH.3), etc), forever. */
2271 else if (single_succ_p (block))
2272 {
2273 e = single_succ_edge (block);
2274 if (!(e->flags & EDGE_DFS_BACK))
2275 phi_translate_set (PA_OUT, PA_IN (e->dest), e);
2276 }
2277 /* If we have multiple successors, we take the union of all of
2278 them. */
2279 else
2280 {
2281 size_t i;
2282
2283 auto_vec<edge> worklist (EDGE_COUNT (block->succs));
2284 FOR_EACH_EDGE (e, ei, block->succs)
2285 {
2286 if (e->flags & EDGE_DFS_BACK)
2287 continue;
2288 worklist.quick_push (e);
2289 }
2290 if (worklist.length () > 0)
2291 {
2292 FOR_EACH_VEC_ELT (worklist, i, e)
2293 {
2294 unsigned int i;
2295 bitmap_iterator bi;
2296
2297 FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (e->dest), i, bi)
2298 bitmap_value_insert_into_set (PA_OUT,
2299 expression_for_id (i));
2300 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
2301 {
2302 bitmap_set_t pa_in = bitmap_set_new ();
2303 phi_translate_set (pa_in, PA_IN (e->dest), e);
2304 FOR_EACH_EXPR_ID_IN_SET (pa_in, i, bi)
2305 bitmap_value_insert_into_set (PA_OUT,
2306 expression_for_id (i));
2307 bitmap_set_free (pa_in);
2308 }
2309 else
2310 FOR_EACH_EXPR_ID_IN_SET (PA_IN (e->dest), i, bi)
2311 bitmap_value_insert_into_set (PA_OUT,
2312 expression_for_id (i));
2313 }
2314 }
2315 }
2316
2317 /* Prune expressions that are clobbered in block and thus become
2318 invalid if translated from PA_OUT to PA_IN. */
2319 prune_clobbered_mems (PA_OUT, block);
2320
2321 /* PA_IN starts with PA_OUT - TMP_GEN.
2322 Then we subtract things from ANTIC_IN. */
2323 PA_IN (block) = bitmap_set_subtract_expressions (PA_OUT, TMP_GEN (block));
2324
2325 /* For partial antic, we want to put back in the phi results, since
2326 we will properly avoid making them partially antic over backedges. */
2327 bitmap_ior_into (&PA_IN (block)->values, &PHI_GEN (block)->values);
2328 bitmap_ior_into (&PA_IN (block)->expressions, &PHI_GEN (block)->expressions);
2329
2330 /* PA_IN[block] = PA_IN[block] - ANTIC_IN[block] */
2331 bitmap_set_subtract_values (PA_IN (block), ANTIC_IN (block));
2332
2333 clean (PA_IN (block), ANTIC_IN (block));
2334
2335 maybe_dump_sets:
2336 if (dump_file && (dump_flags & TDF_DETAILS))
2337 {
2338 if (PA_OUT)
2339 print_bitmap_set (dump_file, PA_OUT, "PA_OUT", block->index);
2340
2341 print_bitmap_set (dump_file, PA_IN (block), "PA_IN", block->index);
2342 }
2343 if (old_PA_IN)
2344 bitmap_set_free (old_PA_IN);
2345 if (PA_OUT)
2346 bitmap_set_free (PA_OUT);
2347 }
2348
2349 /* Compute ANTIC and partial ANTIC sets. */
2350
2351 static void
2352 compute_antic (void)
2353 {
2354 bool changed = true;
2355 int num_iterations = 0;
2356 basic_block block;
2357 int i;
2358 edge_iterator ei;
2359 edge e;
2360
2361 /* If any predecessor edges are abnormal, we punt, so antic_in is empty.
2362 We pre-build the map of blocks with incoming abnormal edges here. */
2363 auto_sbitmap has_abnormal_preds (last_basic_block_for_fn (cfun));
2364 bitmap_clear (has_abnormal_preds);
2365
2366 FOR_ALL_BB_FN (block, cfun)
2367 {
2368 BB_VISITED (block) = 0;
2369
2370 FOR_EACH_EDGE (e, ei, block->preds)
2371 if (e->flags & EDGE_ABNORMAL)
2372 {
2373 bitmap_set_bit (has_abnormal_preds, block->index);
2374 break;
2375 }
2376
2377 /* While we are here, give empty ANTIC_IN sets to each block. */
2378 ANTIC_IN (block) = bitmap_set_new ();
2379 if (do_partial_partial)
2380 PA_IN (block) = bitmap_set_new ();
2381 }
2382
2383 /* At the exit block we anticipate nothing. */
2384 BB_VISITED (EXIT_BLOCK_PTR_FOR_FN (cfun)) = 1;
2385
2386 /* For ANTIC computation we need a postorder that also guarantees that
2387 a block with a single successor is visited after its successor.
2388 RPO on the inverted CFG has this property. */
2389 auto_vec<int, 20> postorder;
2390 inverted_post_order_compute (&postorder);
2391
2392 auto_sbitmap worklist (last_basic_block_for_fn (cfun) + 1);
2393 bitmap_clear (worklist);
2394 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
2395 bitmap_set_bit (worklist, e->src->index);
2396 while (changed)
2397 {
2398 if (dump_file && (dump_flags & TDF_DETAILS))
2399 fprintf (dump_file, "Starting iteration %d\n", num_iterations);
2400 /* ??? We need to clear our PHI translation cache here as the
2401 ANTIC sets shrink and we restrict valid translations to
2402 those having operands with leaders in ANTIC. Same below
2403 for PA ANTIC computation. */
2404 num_iterations++;
2405 changed = false;
2406 for (i = postorder.length () - 1; i >= 0; i--)
2407 {
2408 if (bitmap_bit_p (worklist, postorder[i]))
2409 {
2410 basic_block block = BASIC_BLOCK_FOR_FN (cfun, postorder[i]);
2411 bitmap_clear_bit (worklist, block->index);
2412 if (compute_antic_aux (block,
2413 bitmap_bit_p (has_abnormal_preds,
2414 block->index)))
2415 {
2416 FOR_EACH_EDGE (e, ei, block->preds)
2417 bitmap_set_bit (worklist, e->src->index);
2418 changed = true;
2419 }
2420 }
2421 }
2422 /* Theoretically possible, but *highly* unlikely. */
2423 gcc_checking_assert (num_iterations < 500);
2424 }
2425
2426 /* We have to clean after the dataflow problem converged as cleaning
2427 can cause non-convergence because it is based on expressions
2428 rather than values. */
2429 FOR_EACH_BB_FN (block, cfun)
2430 clean (ANTIC_IN (block));
2431
2432 statistics_histogram_event (cfun, "compute_antic iterations",
2433 num_iterations);
2434
2435 if (do_partial_partial)
2436 {
2437 /* For partial antic we ignore backedges and thus we do not need
2438 to perform any iteration when we process blocks in postorder. */
2439 for (i = postorder.length () - 1; i >= 0; i--)
2440 {
2441 basic_block block = BASIC_BLOCK_FOR_FN (cfun, postorder[i]);
2442 compute_partial_antic_aux (block,
2443 bitmap_bit_p (has_abnormal_preds,
2444 block->index));
2445 }
2446 }
2447 }
2448
2449
2450 /* Inserted expressions are placed onto this worklist, which is used
2451 for performing quick dead code elimination of insertions we made
2452 that didn't turn out to be necessary. */
2453 static bitmap inserted_exprs;
2454
2455 /* The actual worker for create_component_ref_by_pieces. */
2456
2457 static tree
2458 create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
2459 unsigned int *operand, gimple_seq *stmts)
2460 {
2461 vn_reference_op_t currop = &ref->operands[*operand];
2462 tree genop;
2463 ++*operand;
2464 switch (currop->opcode)
2465 {
2466 case CALL_EXPR:
2467 gcc_unreachable ();
2468
2469 case MEM_REF:
2470 {
2471 tree baseop = create_component_ref_by_pieces_1 (block, ref, operand,
2472 stmts);
2473 if (!baseop)
2474 return NULL_TREE;
2475 tree offset = currop->op0;
2476 if (TREE_CODE (baseop) == ADDR_EXPR
2477 && handled_component_p (TREE_OPERAND (baseop, 0)))
2478 {
2479 poly_int64 off;
2480 tree base;
2481 base = get_addr_base_and_unit_offset (TREE_OPERAND (baseop, 0),
2482 &off);
2483 gcc_assert (base);
2484 offset = int_const_binop (PLUS_EXPR, offset,
2485 build_int_cst (TREE_TYPE (offset),
2486 off));
2487 baseop = build_fold_addr_expr (base);
2488 }
2489 genop = build2 (MEM_REF, currop->type, baseop, offset);
2490 MR_DEPENDENCE_CLIQUE (genop) = currop->clique;
2491 MR_DEPENDENCE_BASE (genop) = currop->base;
2492 REF_REVERSE_STORAGE_ORDER (genop) = currop->reverse;
2493 return genop;
2494 }
2495
2496 case TARGET_MEM_REF:
2497 {
2498 tree genop0 = NULL_TREE, genop1 = NULL_TREE;
2499 vn_reference_op_t nextop = &ref->operands[(*operand)++];
2500 tree baseop = create_component_ref_by_pieces_1 (block, ref, operand,
2501 stmts);
2502 if (!baseop)
2503 return NULL_TREE;
2504 if (currop->op0)
2505 {
2506 genop0 = find_or_generate_expression (block, currop->op0, stmts);
2507 if (!genop0)
2508 return NULL_TREE;
2509 }
2510 if (nextop->op0)
2511 {
2512 genop1 = find_or_generate_expression (block, nextop->op0, stmts);
2513 if (!genop1)
2514 return NULL_TREE;
2515 }
2516 genop = build5 (TARGET_MEM_REF, currop->type,
2517 baseop, currop->op2, genop0, currop->op1, genop1);
2518
2519 MR_DEPENDENCE_CLIQUE (genop) = currop->clique;
2520 MR_DEPENDENCE_BASE (genop) = currop->base;
2521 return genop;
2522 }
2523
2524 case ADDR_EXPR:
2525 if (currop->op0)
2526 {
2527 gcc_assert (is_gimple_min_invariant (currop->op0));
2528 return currop->op0;
2529 }
2530 /* Fallthrough. */
2531 case REALPART_EXPR:
2532 case IMAGPART_EXPR:
2533 case VIEW_CONVERT_EXPR:
2534 {
2535 tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2536 stmts);
2537 if (!genop0)
2538 return NULL_TREE;
2539 return fold_build1 (currop->opcode, currop->type, genop0);
2540 }
2541
2542 case WITH_SIZE_EXPR:
2543 {
2544 tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2545 stmts);
2546 if (!genop0)
2547 return NULL_TREE;
2548 tree genop1 = find_or_generate_expression (block, currop->op0, stmts);
2549 if (!genop1)
2550 return NULL_TREE;
2551 return fold_build2 (currop->opcode, currop->type, genop0, genop1);
2552 }
2553
2554 case BIT_FIELD_REF:
2555 {
2556 tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2557 stmts);
2558 if (!genop0)
2559 return NULL_TREE;
2560 tree op1 = currop->op0;
2561 tree op2 = currop->op1;
2562 tree t = build3 (BIT_FIELD_REF, currop->type, genop0, op1, op2);
2563 REF_REVERSE_STORAGE_ORDER (t) = currop->reverse;
2564 return fold (t);
2565 }
2566
2567 /* For array ref vn_reference_op's, operand 1 of the array ref
2568 is op0 of the reference op and operand 3 of the array ref is
2569 op1. */
2570 case ARRAY_RANGE_REF:
2571 case ARRAY_REF:
2572 {
2573 tree genop0;
2574 tree genop1 = currop->op0;
2575 tree genop2 = currop->op1;
2576 tree genop3 = currop->op2;
2577 genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2578 stmts);
2579 if (!genop0)
2580 return NULL_TREE;
2581 genop1 = find_or_generate_expression (block, genop1, stmts);
2582 if (!genop1)
2583 return NULL_TREE;
2584 if (genop2)
2585 {
2586 tree domain_type = TYPE_DOMAIN (TREE_TYPE (genop0));
2587 /* Drop zero minimum index if redundant. */
2588 if (integer_zerop (genop2)
2589 && (!domain_type
2590 || integer_zerop (TYPE_MIN_VALUE (domain_type))))
2591 genop2 = NULL_TREE;
2592 else
2593 {
2594 genop2 = find_or_generate_expression (block, genop2, stmts);
2595 if (!genop2)
2596 return NULL_TREE;
2597 }
2598 }
2599 if (genop3)
2600 {
2601 tree elmt_type = TREE_TYPE (TREE_TYPE (genop0));
2602 /* We can't always put a size in units of the element alignment
2603 here as the element alignment may be not visible. See
2604 PR43783. Simply drop the element size for constant
2605 sizes. */
2606 if (TREE_CODE (genop3) == INTEGER_CST
2607 && TREE_CODE (TYPE_SIZE_UNIT (elmt_type)) == INTEGER_CST
2608 && wi::eq_p (wi::to_offset (TYPE_SIZE_UNIT (elmt_type)),
2609 (wi::to_offset (genop3)
2610 * vn_ref_op_align_unit (currop))))
2611 genop3 = NULL_TREE;
2612 else
2613 {
2614 genop3 = find_or_generate_expression (block, genop3, stmts);
2615 if (!genop3)
2616 return NULL_TREE;
2617 }
2618 }
2619 return build4 (currop->opcode, currop->type, genop0, genop1,
2620 genop2, genop3);
2621 }
2622 case COMPONENT_REF:
2623 {
2624 tree op0;
2625 tree op1;
2626 tree genop2 = currop->op1;
2627 op0 = create_component_ref_by_pieces_1 (block, ref, operand, stmts);
2628 if (!op0)
2629 return NULL_TREE;
2630 /* op1 should be a FIELD_DECL, which are represented by themselves. */
2631 op1 = currop->op0;
2632 if (genop2)
2633 {
2634 genop2 = find_or_generate_expression (block, genop2, stmts);
2635 if (!genop2)
2636 return NULL_TREE;
2637 }
2638 return fold_build3 (COMPONENT_REF, TREE_TYPE (op1), op0, op1, genop2);
2639 }
2640
2641 case SSA_NAME:
2642 {
2643 genop = find_or_generate_expression (block, currop->op0, stmts);
2644 return genop;
2645 }
2646 case STRING_CST:
2647 case INTEGER_CST:
2648 case POLY_INT_CST:
2649 case COMPLEX_CST:
2650 case VECTOR_CST:
2651 case REAL_CST:
2652 case CONSTRUCTOR:
2653 case VAR_DECL:
2654 case PARM_DECL:
2655 case CONST_DECL:
2656 case RESULT_DECL:
2657 case FUNCTION_DECL:
2658 return currop->op0;
2659
2660 default:
2661 gcc_unreachable ();
2662 }
2663 }
2664
2665 /* For COMPONENT_REF's and ARRAY_REF's, we can't have any intermediates for the
2666 COMPONENT_REF or MEM_REF or ARRAY_REF portion, because we'd end up with
2667 trying to rename aggregates into ssa form directly, which is a no no.
2668
2669 Thus, this routine doesn't create temporaries, it just builds a
2670 single access expression for the array, calling
2671 find_or_generate_expression to build the innermost pieces.
2672
2673 This function is a subroutine of create_expression_by_pieces, and
2674 should not be called on it's own unless you really know what you
2675 are doing. */
2676
2677 static tree
2678 create_component_ref_by_pieces (basic_block block, vn_reference_t ref,
2679 gimple_seq *stmts)
2680 {
2681 unsigned int op = 0;
2682 return create_component_ref_by_pieces_1 (block, ref, &op, stmts);
2683 }
2684
2685 /* Find a simple leader for an expression, or generate one using
2686 create_expression_by_pieces from a NARY expression for the value.
2687 BLOCK is the basic_block we are looking for leaders in.
2688 OP is the tree expression to find a leader for or generate.
2689 Returns the leader or NULL_TREE on failure. */
2690
2691 static tree
2692 find_or_generate_expression (basic_block block, tree op, gimple_seq *stmts)
2693 {
2694 pre_expr expr = get_or_alloc_expr_for (op);
2695 unsigned int lookfor = get_expr_value_id (expr);
2696 pre_expr leader = bitmap_find_leader (AVAIL_OUT (block), lookfor);
2697 if (leader)
2698 {
2699 if (leader->kind == NAME)
2700 return PRE_EXPR_NAME (leader);
2701 else if (leader->kind == CONSTANT)
2702 return PRE_EXPR_CONSTANT (leader);
2703
2704 /* Defer. */
2705 return NULL_TREE;
2706 }
2707
2708 /* It must be a complex expression, so generate it recursively. Note
2709 that this is only necessary to handle gcc.dg/tree-ssa/ssa-pre28.c
2710 where the insert algorithm fails to insert a required expression. */
2711 bitmap exprset = value_expressions[lookfor];
2712 bitmap_iterator bi;
2713 unsigned int i;
2714 EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
2715 {
2716 pre_expr temp = expression_for_id (i);
2717 /* We cannot insert random REFERENCE expressions at arbitrary
2718 places. We can insert NARYs which eventually re-materializes
2719 its operand values. */
2720 if (temp->kind == NARY)
2721 return create_expression_by_pieces (block, temp, stmts,
2722 get_expr_type (expr));
2723 }
2724
2725 /* Defer. */
2726 return NULL_TREE;
2727 }
2728
2729 /* Create an expression in pieces, so that we can handle very complex
2730 expressions that may be ANTIC, but not necessary GIMPLE.
2731 BLOCK is the basic block the expression will be inserted into,
2732 EXPR is the expression to insert (in value form)
2733 STMTS is a statement list to append the necessary insertions into.
2734
2735 This function will die if we hit some value that shouldn't be
2736 ANTIC but is (IE there is no leader for it, or its components).
2737 The function returns NULL_TREE in case a different antic expression
2738 has to be inserted first.
2739 This function may also generate expressions that are themselves
2740 partially or fully redundant. Those that are will be either made
2741 fully redundant during the next iteration of insert (for partially
2742 redundant ones), or eliminated by eliminate (for fully redundant
2743 ones). */
2744
2745 static tree
2746 create_expression_by_pieces (basic_block block, pre_expr expr,
2747 gimple_seq *stmts, tree type)
2748 {
2749 tree name;
2750 tree folded;
2751 gimple_seq forced_stmts = NULL;
2752 unsigned int value_id;
2753 gimple_stmt_iterator gsi;
2754 tree exprtype = type ? type : get_expr_type (expr);
2755 pre_expr nameexpr;
2756 gassign *newstmt;
2757
2758 switch (expr->kind)
2759 {
2760 /* We may hit the NAME/CONSTANT case if we have to convert types
2761 that value numbering saw through. */
2762 case NAME:
2763 folded = PRE_EXPR_NAME (expr);
2764 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (folded))
2765 return NULL_TREE;
2766 if (useless_type_conversion_p (exprtype, TREE_TYPE (folded)))
2767 return folded;
2768 break;
2769 case CONSTANT:
2770 {
2771 folded = PRE_EXPR_CONSTANT (expr);
2772 tree tem = fold_convert (exprtype, folded);
2773 if (is_gimple_min_invariant (tem))
2774 return tem;
2775 break;
2776 }
2777 case REFERENCE:
2778 if (PRE_EXPR_REFERENCE (expr)->operands[0].opcode == CALL_EXPR)
2779 {
2780 vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
2781 unsigned int operand = 1;
2782 vn_reference_op_t currop = &ref->operands[0];
2783 tree sc = NULL_TREE;
2784 tree fn = find_or_generate_expression (block, currop->op0, stmts);
2785 if (!fn)
2786 return NULL_TREE;
2787 if (currop->op1)
2788 {
2789 sc = find_or_generate_expression (block, currop->op1, stmts);
2790 if (!sc)
2791 return NULL_TREE;
2792 }
2793 auto_vec<tree> args (ref->operands.length () - 1);
2794 while (operand < ref->operands.length ())
2795 {
2796 tree arg = create_component_ref_by_pieces_1 (block, ref,
2797 &operand, stmts);
2798 if (!arg)
2799 return NULL_TREE;
2800 args.quick_push (arg);
2801 }
2802 gcall *call = gimple_build_call_vec (fn, args);
2803 gimple_set_location (call, expr->loc);
2804 gimple_call_set_fntype (call, currop->type);
2805 if (sc)
2806 gimple_call_set_chain (call, sc);
2807 tree forcedname = make_ssa_name (TREE_TYPE (currop->type));
2808 gimple_call_set_lhs (call, forcedname);
2809 /* There's no CCP pass after PRE which would re-compute alignment
2810 information so make sure we re-materialize this here. */
2811 if (gimple_call_builtin_p (call, BUILT_IN_ASSUME_ALIGNED)
2812 && args.length () - 2 <= 1
2813 && tree_fits_uhwi_p (args[1])
2814 && (args.length () != 3 || tree_fits_uhwi_p (args[2])))
2815 {
2816 unsigned HOST_WIDE_INT halign = tree_to_uhwi (args[1]);
2817 unsigned HOST_WIDE_INT hmisalign
2818 = args.length () == 3 ? tree_to_uhwi (args[2]) : 0;
2819 if ((halign & (halign - 1)) == 0
2820 && (hmisalign & ~(halign - 1)) == 0
2821 && (unsigned int)halign != 0)
2822 set_ptr_info_alignment (get_ptr_info (forcedname),
2823 halign, hmisalign);
2824 }
2825 gimple_set_vuse (call, BB_LIVE_VOP_ON_EXIT (block));
2826 gimple_seq_add_stmt_without_update (&forced_stmts, call);
2827 folded = forcedname;
2828 }
2829 else
2830 {
2831 folded = create_component_ref_by_pieces (block,
2832 PRE_EXPR_REFERENCE (expr),
2833 stmts);
2834 if (!folded)
2835 return NULL_TREE;
2836 name = make_temp_ssa_name (exprtype, NULL, "pretmp");
2837 newstmt = gimple_build_assign (name, folded);
2838 gimple_set_location (newstmt, expr->loc);
2839 gimple_seq_add_stmt_without_update (&forced_stmts, newstmt);
2840 gimple_set_vuse (newstmt, BB_LIVE_VOP_ON_EXIT (block));
2841 folded = name;
2842 }
2843 break;
2844 case NARY:
2845 {
2846 vn_nary_op_t nary = PRE_EXPR_NARY (expr);
2847 tree *genop = XALLOCAVEC (tree, nary->length);
2848 unsigned i;
2849 for (i = 0; i < nary->length; ++i)
2850 {
2851 genop[i] = find_or_generate_expression (block, nary->op[i], stmts);
2852 if (!genop[i])
2853 return NULL_TREE;
2854 /* Ensure genop[] is properly typed for POINTER_PLUS_EXPR. It
2855 may have conversions stripped. */
2856 if (nary->opcode == POINTER_PLUS_EXPR)
2857 {
2858 if (i == 0)
2859 genop[i] = gimple_convert (&forced_stmts,
2860 nary->type, genop[i]);
2861 else if (i == 1)
2862 genop[i] = gimple_convert (&forced_stmts,
2863 sizetype, genop[i]);
2864 }
2865 else
2866 genop[i] = gimple_convert (&forced_stmts,
2867 TREE_TYPE (nary->op[i]), genop[i]);
2868 }
2869 if (nary->opcode == CONSTRUCTOR)
2870 {
2871 vec<constructor_elt, va_gc> *elts = NULL;
2872 for (i = 0; i < nary->length; ++i)
2873 CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, genop[i]);
2874 folded = build_constructor (nary->type, elts);
2875 name = make_temp_ssa_name (exprtype, NULL, "pretmp");
2876 newstmt = gimple_build_assign (name, folded);
2877 gimple_set_location (newstmt, expr->loc);
2878 gimple_seq_add_stmt_without_update (&forced_stmts, newstmt);
2879 folded = name;
2880 }
2881 else
2882 {
2883 switch (nary->length)
2884 {
2885 case 1:
2886 folded = gimple_build (&forced_stmts, expr->loc,
2887 nary->opcode, nary->type, genop[0]);
2888 break;
2889 case 2:
2890 folded = gimple_build (&forced_stmts, expr->loc, nary->opcode,
2891 nary->type, genop[0], genop[1]);
2892 break;
2893 case 3:
2894 folded = gimple_build (&forced_stmts, expr->loc, nary->opcode,
2895 nary->type, genop[0], genop[1],
2896 genop[2]);
2897 break;
2898 default:
2899 gcc_unreachable ();
2900 }
2901 }
2902 }
2903 break;
2904 default:
2905 gcc_unreachable ();
2906 }
2907
2908 folded = gimple_convert (&forced_stmts, exprtype, folded);
2909
2910 /* If there is nothing to insert, return the simplified result. */
2911 if (gimple_seq_empty_p (forced_stmts))
2912 return folded;
2913 /* If we simplified to a constant return it and discard eventually
2914 built stmts. */
2915 if (is_gimple_min_invariant (folded))
2916 {
2917 gimple_seq_discard (forced_stmts);
2918 return folded;
2919 }
2920 /* Likewise if we simplified to sth not queued for insertion. */
2921 bool found = false;
2922 gsi = gsi_last (forced_stmts);
2923 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
2924 {
2925 gimple *stmt = gsi_stmt (gsi);
2926 tree forcedname = gimple_get_lhs (stmt);
2927 if (forcedname == folded)
2928 {
2929 found = true;
2930 break;
2931 }
2932 }
2933 if (! found)
2934 {
2935 gimple_seq_discard (forced_stmts);
2936 return folded;
2937 }
2938 gcc_assert (TREE_CODE (folded) == SSA_NAME);
2939
2940 /* If we have any intermediate expressions to the value sets, add them
2941 to the value sets and chain them in the instruction stream. */
2942 if (forced_stmts)
2943 {
2944 gsi = gsi_start (forced_stmts);
2945 for (; !gsi_end_p (gsi); gsi_next (&gsi))
2946 {
2947 gimple *stmt = gsi_stmt (gsi);
2948 tree forcedname = gimple_get_lhs (stmt);
2949 pre_expr nameexpr;
2950
2951 if (forcedname != folded)
2952 {
2953 VN_INFO (forcedname)->valnum = forcedname;
2954 VN_INFO (forcedname)->value_id = get_next_value_id ();
2955 nameexpr = get_or_alloc_expr_for_name (forcedname);
2956 add_to_value (VN_INFO (forcedname)->value_id, nameexpr);
2957 bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
2958 bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
2959 }
2960
2961 bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (forcedname));
2962 }
2963 gimple_seq_add_seq (stmts, forced_stmts);
2964 }
2965
2966 name = folded;
2967
2968 /* Fold the last statement. */
2969 gsi = gsi_last (*stmts);
2970 if (fold_stmt_inplace (&gsi))
2971 update_stmt (gsi_stmt (gsi));
2972
2973 /* Add a value number to the temporary.
2974 The value may already exist in either NEW_SETS, or AVAIL_OUT, because
2975 we are creating the expression by pieces, and this particular piece of
2976 the expression may have been represented. There is no harm in replacing
2977 here. */
2978 value_id = get_expr_value_id (expr);
2979 VN_INFO (name)->value_id = value_id;
2980 VN_INFO (name)->valnum = vn_valnum_from_value_id (value_id);
2981 if (VN_INFO (name)->valnum == NULL_TREE)
2982 VN_INFO (name)->valnum = name;
2983 gcc_assert (VN_INFO (name)->valnum != NULL_TREE);
2984 nameexpr = get_or_alloc_expr_for_name (name);
2985 add_to_value (value_id, nameexpr);
2986 if (NEW_SETS (block))
2987 bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
2988 bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
2989
2990 pre_stats.insertions++;
2991 if (dump_file && (dump_flags & TDF_DETAILS))
2992 {
2993 fprintf (dump_file, "Inserted ");
2994 print_gimple_stmt (dump_file, gsi_stmt (gsi_last (*stmts)), 0);
2995 fprintf (dump_file, " in predecessor %d (%04d)\n",
2996 block->index, value_id);
2997 }
2998
2999 return name;
3000 }
3001
3002
3003 /* Insert the to-be-made-available values of expression EXPRNUM for each
3004 predecessor, stored in AVAIL, into the predecessors of BLOCK, and
3005 merge the result with a phi node, given the same value number as
3006 NODE. Return true if we have inserted new stuff. */
3007
3008 static bool
3009 insert_into_preds_of_block (basic_block block, unsigned int exprnum,
3010 vec<pre_expr> avail)
3011 {
3012 pre_expr expr = expression_for_id (exprnum);
3013 pre_expr newphi;
3014 unsigned int val = get_expr_value_id (expr);
3015 edge pred;
3016 bool insertions = false;
3017 bool nophi = false;
3018 basic_block bprime;
3019 pre_expr eprime;
3020 edge_iterator ei;
3021 tree type = get_expr_type (expr);
3022 tree temp;
3023 gphi *phi;
3024
3025 /* Make sure we aren't creating an induction variable. */
3026 if (bb_loop_depth (block) > 0 && EDGE_COUNT (block->preds) == 2)
3027 {
3028 bool firstinsideloop = false;
3029 bool secondinsideloop = false;
3030 firstinsideloop = flow_bb_inside_loop_p (block->loop_father,
3031 EDGE_PRED (block, 0)->src);
3032 secondinsideloop = flow_bb_inside_loop_p (block->loop_father,
3033 EDGE_PRED (block, 1)->src);
3034 /* Induction variables only have one edge inside the loop. */
3035 if ((firstinsideloop ^ secondinsideloop)
3036 && expr->kind != REFERENCE)
3037 {
3038 if (dump_file && (dump_flags & TDF_DETAILS))
3039 fprintf (dump_file, "Skipping insertion of phi for partial redundancy: Looks like an induction variable\n");
3040 nophi = true;
3041 }
3042 }
3043
3044 /* Make the necessary insertions. */
3045 FOR_EACH_EDGE (pred, ei, block->preds)
3046 {
3047 gimple_seq stmts = NULL;
3048 tree builtexpr;
3049 bprime = pred->src;
3050 eprime = avail[pred->dest_idx];
3051 builtexpr = create_expression_by_pieces (bprime, eprime,
3052 &stmts, type);
3053 gcc_assert (!(pred->flags & EDGE_ABNORMAL));
3054 if (!gimple_seq_empty_p (stmts))
3055 {
3056 basic_block new_bb = gsi_insert_seq_on_edge_immediate (pred, stmts);
3057 gcc_assert (! new_bb);
3058 insertions = true;
3059 }
3060 if (!builtexpr)
3061 {
3062 /* We cannot insert a PHI node if we failed to insert
3063 on one edge. */
3064 nophi = true;
3065 continue;
3066 }
3067 if (is_gimple_min_invariant (builtexpr))
3068 avail[pred->dest_idx] = get_or_alloc_expr_for_constant (builtexpr);
3069 else
3070 avail[pred->dest_idx] = get_or_alloc_expr_for_name (builtexpr);
3071 }
3072 /* If we didn't want a phi node, and we made insertions, we still have
3073 inserted new stuff, and thus return true. If we didn't want a phi node,
3074 and didn't make insertions, we haven't added anything new, so return
3075 false. */
3076 if (nophi && insertions)
3077 return true;
3078 else if (nophi && !insertions)
3079 return false;
3080
3081 /* Now build a phi for the new variable. */
3082 temp = make_temp_ssa_name (type, NULL, "prephitmp");
3083 phi = create_phi_node (temp, block);
3084
3085 VN_INFO (temp)->value_id = val;
3086 VN_INFO (temp)->valnum = vn_valnum_from_value_id (val);
3087 if (VN_INFO (temp)->valnum == NULL_TREE)
3088 VN_INFO (temp)->valnum = temp;
3089 bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (temp));
3090 FOR_EACH_EDGE (pred, ei, block->preds)
3091 {
3092 pre_expr ae = avail[pred->dest_idx];
3093 gcc_assert (get_expr_type (ae) == type
3094 || useless_type_conversion_p (type, get_expr_type (ae)));
3095 if (ae->kind == CONSTANT)
3096 add_phi_arg (phi, unshare_expr (PRE_EXPR_CONSTANT (ae)),
3097 pred, UNKNOWN_LOCATION);
3098 else
3099 add_phi_arg (phi, PRE_EXPR_NAME (ae), pred, UNKNOWN_LOCATION);
3100 }
3101
3102 newphi = get_or_alloc_expr_for_name (temp);
3103 add_to_value (val, newphi);
3104
3105 /* The value should *not* exist in PHI_GEN, or else we wouldn't be doing
3106 this insertion, since we test for the existence of this value in PHI_GEN
3107 before proceeding with the partial redundancy checks in insert_aux.
3108
3109 The value may exist in AVAIL_OUT, in particular, it could be represented
3110 by the expression we are trying to eliminate, in which case we want the
3111 replacement to occur. If it's not existing in AVAIL_OUT, we want it
3112 inserted there.
3113
3114 Similarly, to the PHI_GEN case, the value should not exist in NEW_SETS of
3115 this block, because if it did, it would have existed in our dominator's
3116 AVAIL_OUT, and would have been skipped due to the full redundancy check.
3117 */
3118
3119 bitmap_insert_into_set (PHI_GEN (block), newphi);
3120 bitmap_value_replace_in_set (AVAIL_OUT (block),
3121 newphi);
3122 bitmap_insert_into_set (NEW_SETS (block),
3123 newphi);
3124
3125 /* If we insert a PHI node for a conversion of another PHI node
3126 in the same basic-block try to preserve range information.
3127 This is important so that followup loop passes receive optimal
3128 number of iteration analysis results. See PR61743. */
3129 if (expr->kind == NARY
3130 && CONVERT_EXPR_CODE_P (expr->u.nary->opcode)
3131 && TREE_CODE (expr->u.nary->op[0]) == SSA_NAME
3132 && gimple_bb (SSA_NAME_DEF_STMT (expr->u.nary->op[0])) == block
3133 && INTEGRAL_TYPE_P (type)
3134 && INTEGRAL_TYPE_P (TREE_TYPE (expr->u.nary->op[0]))
3135 && (TYPE_PRECISION (type)
3136 >= TYPE_PRECISION (TREE_TYPE (expr->u.nary->op[0])))
3137 && SSA_NAME_RANGE_INFO (expr->u.nary->op[0]))
3138 {
3139 wide_int min, max;
3140 if (get_range_info (expr->u.nary->op[0], &min, &max) == VR_RANGE
3141 && !wi::neg_p (min, SIGNED)
3142 && !wi::neg_p (max, SIGNED))
3143 /* Just handle extension and sign-changes of all-positive ranges. */
3144 set_range_info (temp,
3145 SSA_NAME_RANGE_TYPE (expr->u.nary->op[0]),
3146 wide_int_storage::from (min, TYPE_PRECISION (type),
3147 TYPE_SIGN (type)),
3148 wide_int_storage::from (max, TYPE_PRECISION (type),
3149 TYPE_SIGN (type)));
3150 }
3151
3152 if (dump_file && (dump_flags & TDF_DETAILS))
3153 {
3154 fprintf (dump_file, "Created phi ");
3155 print_gimple_stmt (dump_file, phi, 0);
3156 fprintf (dump_file, " in block %d (%04d)\n", block->index, val);
3157 }
3158 pre_stats.phis++;
3159 return true;
3160 }
3161
3162
3163
3164 /* Perform insertion of partially redundant or hoistable values.
3165 For BLOCK, do the following:
3166 1. Propagate the NEW_SETS of the dominator into the current block.
3167 If the block has multiple predecessors,
3168 2a. Iterate over the ANTIC expressions for the block to see if
3169 any of them are partially redundant.
3170 2b. If so, insert them into the necessary predecessors to make
3171 the expression fully redundant.
3172 2c. Insert a new PHI merging the values of the predecessors.
3173 2d. Insert the new PHI, and the new expressions, into the
3174 NEW_SETS set.
3175 If the block has multiple successors,
3176 3a. Iterate over the ANTIC values for the block to see if
3177 any of them are good candidates for hoisting.
3178 3b. If so, insert expressions computing the values in BLOCK,
3179 and add the new expressions into the NEW_SETS set.
3180 4. Recursively call ourselves on the dominator children of BLOCK.
3181
3182 Steps 1, 2a, and 4 are done by insert_aux. 2b, 2c and 2d are done by
3183 do_pre_regular_insertion and do_partial_insertion. 3a and 3b are
3184 done in do_hoist_insertion.
3185 */
3186
3187 static bool
3188 do_pre_regular_insertion (basic_block block, basic_block dom)
3189 {
3190 bool new_stuff = false;
3191 vec<pre_expr> exprs;
3192 pre_expr expr;
3193 auto_vec<pre_expr> avail;
3194 int i;
3195
3196 exprs = sorted_array_from_bitmap_set (ANTIC_IN (block));
3197 avail.safe_grow (EDGE_COUNT (block->preds), true);
3198
3199 FOR_EACH_VEC_ELT (exprs, i, expr)
3200 {
3201 if (expr->kind == NARY
3202 || expr->kind == REFERENCE)
3203 {
3204 unsigned int val;
3205 bool by_some = false;
3206 bool cant_insert = false;
3207 bool all_same = true;
3208 pre_expr first_s = NULL;
3209 edge pred;
3210 basic_block bprime;
3211 pre_expr eprime = NULL;
3212 edge_iterator ei;
3213 pre_expr edoubleprime = NULL;
3214 bool do_insertion = false;
3215
3216 val = get_expr_value_id (expr);
3217 if (bitmap_set_contains_value (PHI_GEN (block), val))
3218 continue;
3219 if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3220 {
3221 if (dump_file && (dump_flags & TDF_DETAILS))
3222 {
3223 fprintf (dump_file, "Found fully redundant value: ");
3224 print_pre_expr (dump_file, expr);
3225 fprintf (dump_file, "\n");
3226 }
3227 continue;
3228 }
3229
3230 FOR_EACH_EDGE (pred, ei, block->preds)
3231 {
3232 unsigned int vprime;
3233
3234 /* We should never run insertion for the exit block
3235 and so not come across fake pred edges. */
3236 gcc_assert (!(pred->flags & EDGE_FAKE));
3237 bprime = pred->src;
3238 /* We are looking at ANTIC_OUT of bprime. */
3239 eprime = phi_translate (NULL, expr, ANTIC_IN (block), NULL, pred);
3240
3241 /* eprime will generally only be NULL if the
3242 value of the expression, translated
3243 through the PHI for this predecessor, is
3244 undefined. If that is the case, we can't
3245 make the expression fully redundant,
3246 because its value is undefined along a
3247 predecessor path. We can thus break out
3248 early because it doesn't matter what the
3249 rest of the results are. */
3250 if (eprime == NULL)
3251 {
3252 avail[pred->dest_idx] = NULL;
3253 cant_insert = true;
3254 break;
3255 }
3256
3257 vprime = get_expr_value_id (eprime);
3258 edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
3259 vprime);
3260 if (edoubleprime == NULL)
3261 {
3262 avail[pred->dest_idx] = eprime;
3263 all_same = false;
3264 }
3265 else
3266 {
3267 avail[pred->dest_idx] = edoubleprime;
3268 by_some = true;
3269 /* We want to perform insertions to remove a redundancy on
3270 a path in the CFG we want to optimize for speed. */
3271 if (optimize_edge_for_speed_p (pred))
3272 do_insertion = true;
3273 if (first_s == NULL)
3274 first_s = edoubleprime;
3275 else if (!pre_expr_d::equal (first_s, edoubleprime))
3276 all_same = false;
3277 }
3278 }
3279 /* If we can insert it, it's not the same value
3280 already existing along every predecessor, and
3281 it's defined by some predecessor, it is
3282 partially redundant. */
3283 if (!cant_insert && !all_same && by_some)
3284 {
3285 if (!do_insertion)
3286 {
3287 if (dump_file && (dump_flags & TDF_DETAILS))
3288 {
3289 fprintf (dump_file, "Skipping partial redundancy for "
3290 "expression ");
3291 print_pre_expr (dump_file, expr);
3292 fprintf (dump_file, " (%04d), no redundancy on to be "
3293 "optimized for speed edge\n", val);
3294 }
3295 }
3296 else if (dbg_cnt (treepre_insert))
3297 {
3298 if (dump_file && (dump_flags & TDF_DETAILS))
3299 {
3300 fprintf (dump_file, "Found partial redundancy for "
3301 "expression ");
3302 print_pre_expr (dump_file, expr);
3303 fprintf (dump_file, " (%04d)\n",
3304 get_expr_value_id (expr));
3305 }
3306 if (insert_into_preds_of_block (block,
3307 get_expression_id (expr),
3308 avail))
3309 new_stuff = true;
3310 }
3311 }
3312 /* If all edges produce the same value and that value is
3313 an invariant, then the PHI has the same value on all
3314 edges. Note this. */
3315 else if (!cant_insert && all_same)
3316 {
3317 gcc_assert (edoubleprime->kind == CONSTANT
3318 || edoubleprime->kind == NAME);
3319
3320 tree temp = make_temp_ssa_name (get_expr_type (expr),
3321 NULL, "pretmp");
3322 gassign *assign
3323 = gimple_build_assign (temp,
3324 edoubleprime->kind == CONSTANT ?
3325 PRE_EXPR_CONSTANT (edoubleprime) :
3326 PRE_EXPR_NAME (edoubleprime));
3327 gimple_stmt_iterator gsi = gsi_after_labels (block);
3328 gsi_insert_before (&gsi, assign, GSI_NEW_STMT);
3329
3330 VN_INFO (temp)->value_id = val;
3331 VN_INFO (temp)->valnum = vn_valnum_from_value_id (val);
3332 if (VN_INFO (temp)->valnum == NULL_TREE)
3333 VN_INFO (temp)->valnum = temp;
3334 bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (temp));
3335 pre_expr newe = get_or_alloc_expr_for_name (temp);
3336 add_to_value (val, newe);
3337 bitmap_value_replace_in_set (AVAIL_OUT (block), newe);
3338 bitmap_insert_into_set (NEW_SETS (block), newe);
3339 }
3340 }
3341 }
3342
3343 exprs.release ();
3344 return new_stuff;
3345 }
3346
3347
3348 /* Perform insertion for partially anticipatable expressions. There
3349 is only one case we will perform insertion for these. This case is
3350 if the expression is partially anticipatable, and fully available.
3351 In this case, we know that putting it earlier will enable us to
3352 remove the later computation. */
3353
3354 static bool
3355 do_pre_partial_partial_insertion (basic_block block, basic_block dom)
3356 {
3357 bool new_stuff = false;
3358 vec<pre_expr> exprs;
3359 pre_expr expr;
3360 auto_vec<pre_expr> avail;
3361 int i;
3362
3363 exprs = sorted_array_from_bitmap_set (PA_IN (block));
3364 avail.safe_grow (EDGE_COUNT (block->preds), true);
3365
3366 FOR_EACH_VEC_ELT (exprs, i, expr)
3367 {
3368 if (expr->kind == NARY
3369 || expr->kind == REFERENCE)
3370 {
3371 unsigned int val;
3372 bool by_all = true;
3373 bool cant_insert = false;
3374 edge pred;
3375 basic_block bprime;
3376 pre_expr eprime = NULL;
3377 edge_iterator ei;
3378
3379 val = get_expr_value_id (expr);
3380 if (bitmap_set_contains_value (PHI_GEN (block), val))
3381 continue;
3382 if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3383 continue;
3384
3385 FOR_EACH_EDGE (pred, ei, block->preds)
3386 {
3387 unsigned int vprime;
3388 pre_expr edoubleprime;
3389
3390 /* We should never run insertion for the exit block
3391 and so not come across fake pred edges. */
3392 gcc_assert (!(pred->flags & EDGE_FAKE));
3393 bprime = pred->src;
3394 eprime = phi_translate (NULL, expr, ANTIC_IN (block),
3395 PA_IN (block), pred);
3396
3397 /* eprime will generally only be NULL if the
3398 value of the expression, translated
3399 through the PHI for this predecessor, is
3400 undefined. If that is the case, we can't
3401 make the expression fully redundant,
3402 because its value is undefined along a
3403 predecessor path. We can thus break out
3404 early because it doesn't matter what the
3405 rest of the results are. */
3406 if (eprime == NULL)
3407 {
3408 avail[pred->dest_idx] = NULL;
3409 cant_insert = true;
3410 break;
3411 }
3412
3413 vprime = get_expr_value_id (eprime);
3414 edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime), vprime);
3415 avail[pred->dest_idx] = edoubleprime;
3416 if (edoubleprime == NULL)
3417 {
3418 by_all = false;
3419 break;
3420 }
3421 }
3422
3423 /* If we can insert it, it's not the same value
3424 already existing along every predecessor, and
3425 it's defined by some predecessor, it is
3426 partially redundant. */
3427 if (!cant_insert && by_all)
3428 {
3429 edge succ;
3430 bool do_insertion = false;
3431
3432 /* Insert only if we can remove a later expression on a path
3433 that we want to optimize for speed.
3434 The phi node that we will be inserting in BLOCK is not free,
3435 and inserting it for the sake of !optimize_for_speed successor
3436 may cause regressions on the speed path. */
3437 FOR_EACH_EDGE (succ, ei, block->succs)
3438 {
3439 if (bitmap_set_contains_value (PA_IN (succ->dest), val)
3440 || bitmap_set_contains_value (ANTIC_IN (succ->dest), val))
3441 {
3442 if (optimize_edge_for_speed_p (succ))
3443 do_insertion = true;
3444 }
3445 }
3446
3447 if (!do_insertion)
3448 {
3449 if (dump_file && (dump_flags & TDF_DETAILS))
3450 {
3451 fprintf (dump_file, "Skipping partial partial redundancy "
3452 "for expression ");
3453 print_pre_expr (dump_file, expr);
3454 fprintf (dump_file, " (%04d), not (partially) anticipated "
3455 "on any to be optimized for speed edges\n", val);
3456 }
3457 }
3458 else if (dbg_cnt (treepre_insert))
3459 {
3460 pre_stats.pa_insert++;
3461 if (dump_file && (dump_flags & TDF_DETAILS))
3462 {
3463 fprintf (dump_file, "Found partial partial redundancy "
3464 "for expression ");
3465 print_pre_expr (dump_file, expr);
3466 fprintf (dump_file, " (%04d)\n",
3467 get_expr_value_id (expr));
3468 }
3469 if (insert_into_preds_of_block (block,
3470 get_expression_id (expr),
3471 avail))
3472 new_stuff = true;
3473 }
3474 }
3475 }
3476 }
3477
3478 exprs.release ();
3479 return new_stuff;
3480 }
3481
3482 /* Insert expressions in BLOCK to compute hoistable values up.
3483 Return TRUE if something was inserted, otherwise return FALSE.
3484 The caller has to make sure that BLOCK has at least two successors. */
3485
3486 static bool
3487 do_hoist_insertion (basic_block block)
3488 {
3489 edge e;
3490 edge_iterator ei;
3491 bool new_stuff = false;
3492 unsigned i;
3493 gimple_stmt_iterator last;
3494
3495 /* At least two successors, or else... */
3496 gcc_assert (EDGE_COUNT (block->succs) >= 2);
3497
3498 /* Check that all successors of BLOCK are dominated by block.
3499 We could use dominated_by_p() for this, but actually there is a much
3500 quicker check: any successor that is dominated by BLOCK can't have
3501 more than one predecessor edge. */
3502 FOR_EACH_EDGE (e, ei, block->succs)
3503 if (! single_pred_p (e->dest))
3504 return false;
3505
3506 /* Determine the insertion point. If we cannot safely insert before
3507 the last stmt if we'd have to, bail out. */
3508 last = gsi_last_bb (block);
3509 if (!gsi_end_p (last)
3510 && !is_ctrl_stmt (gsi_stmt (last))
3511 && stmt_ends_bb_p (gsi_stmt (last)))
3512 return false;
3513
3514 /* Compute the set of hoistable expressions from ANTIC_IN. First compute
3515 hoistable values. */
3516 bitmap_set hoistable_set;
3517
3518 /* A hoistable value must be in ANTIC_IN(block)
3519 but not in AVAIL_OUT(BLOCK). */
3520 bitmap_initialize (&hoistable_set.values, &grand_bitmap_obstack);
3521 bitmap_and_compl (&hoistable_set.values,
3522 &ANTIC_IN (block)->values, &AVAIL_OUT (block)->values);
3523
3524 /* Short-cut for a common case: hoistable_set is empty. */
3525 if (bitmap_empty_p (&hoistable_set.values))
3526 return false;
3527
3528 /* Compute which of the hoistable values is in AVAIL_OUT of
3529 at least one of the successors of BLOCK. */
3530 bitmap_head availout_in_some;
3531 bitmap_initialize (&availout_in_some, &grand_bitmap_obstack);
3532 FOR_EACH_EDGE (e, ei, block->succs)
3533 /* Do not consider expressions solely because their availability
3534 on loop exits. They'd be ANTIC-IN throughout the whole loop
3535 and thus effectively hoisted across loops by combination of
3536 PRE and hoisting. */
3537 if (! loop_exit_edge_p (block->loop_father, e))
3538 bitmap_ior_and_into (&availout_in_some, &hoistable_set.values,
3539 &AVAIL_OUT (e->dest)->values);
3540 bitmap_clear (&hoistable_set.values);
3541
3542 /* Short-cut for a common case: availout_in_some is empty. */
3543 if (bitmap_empty_p (&availout_in_some))
3544 return false;
3545
3546 /* Hack hoitable_set in-place so we can use sorted_array_from_bitmap_set. */
3547 bitmap_move (&hoistable_set.values, &availout_in_some);
3548 hoistable_set.expressions = ANTIC_IN (block)->expressions;
3549
3550 /* Now finally construct the topological-ordered expression set. */
3551 vec<pre_expr> exprs = sorted_array_from_bitmap_set (&hoistable_set);
3552
3553 bitmap_clear (&hoistable_set.values);
3554
3555 /* If there are candidate values for hoisting, insert expressions
3556 strategically to make the hoistable expressions fully redundant. */
3557 pre_expr expr;
3558 FOR_EACH_VEC_ELT (exprs, i, expr)
3559 {
3560 /* While we try to sort expressions topologically above the
3561 sorting doesn't work out perfectly. Catch expressions we
3562 already inserted. */
3563 unsigned int value_id = get_expr_value_id (expr);
3564 if (bitmap_set_contains_value (AVAIL_OUT (block), value_id))
3565 {
3566 if (dump_file && (dump_flags & TDF_DETAILS))
3567 {
3568 fprintf (dump_file,
3569 "Already inserted expression for ");
3570 print_pre_expr (dump_file, expr);
3571 fprintf (dump_file, " (%04d)\n", value_id);
3572 }
3573 continue;
3574 }
3575
3576 /* If we end up with a punned expression representation and this
3577 happens to be a float typed one give up - we can't know for
3578 sure whether all paths perform the floating-point load we are
3579 about to insert and on some targets this can cause correctness
3580 issues. See PR88240. */
3581 if (expr->kind == REFERENCE
3582 && PRE_EXPR_REFERENCE (expr)->punned
3583 && FLOAT_TYPE_P (get_expr_type (expr)))
3584 continue;
3585
3586 /* OK, we should hoist this value. Perform the transformation. */
3587 pre_stats.hoist_insert++;
3588 if (dump_file && (dump_flags & TDF_DETAILS))
3589 {
3590 fprintf (dump_file,
3591 "Inserting expression in block %d for code hoisting: ",
3592 block->index);
3593 print_pre_expr (dump_file, expr);
3594 fprintf (dump_file, " (%04d)\n", value_id);
3595 }
3596
3597 gimple_seq stmts = NULL;
3598 tree res = create_expression_by_pieces (block, expr, &stmts,
3599 get_expr_type (expr));
3600
3601 /* Do not return true if expression creation ultimately
3602 did not insert any statements. */
3603 if (gimple_seq_empty_p (stmts))
3604 res = NULL_TREE;
3605 else
3606 {
3607 if (gsi_end_p (last) || is_ctrl_stmt (gsi_stmt (last)))
3608 gsi_insert_seq_before (&last, stmts, GSI_SAME_STMT);
3609 else
3610 gsi_insert_seq_after (&last, stmts, GSI_NEW_STMT);
3611 }
3612
3613 /* Make sure to not return true if expression creation ultimately
3614 failed but also make sure to insert any stmts produced as they
3615 are tracked in inserted_exprs. */
3616 if (! res)
3617 continue;
3618
3619 new_stuff = true;
3620 }
3621
3622 exprs.release ();
3623
3624 return new_stuff;
3625 }
3626
3627 /* Perform insertion of partially redundant and hoistable values. */
3628
3629 static void
3630 insert (void)
3631 {
3632 basic_block bb;
3633
3634 FOR_ALL_BB_FN (bb, cfun)
3635 NEW_SETS (bb) = bitmap_set_new ();
3636
3637 int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
3638 int rpo_num = pre_and_rev_post_order_compute (NULL, rpo, false);
3639
3640 int num_iterations = 0;
3641 bool changed;
3642 do
3643 {
3644 num_iterations++;
3645 if (dump_file && dump_flags & TDF_DETAILS)
3646 fprintf (dump_file, "Starting insert iteration %d\n", num_iterations);
3647
3648 changed = false;
3649 for (int idx = 0; idx < rpo_num; ++idx)
3650 {
3651 basic_block block = BASIC_BLOCK_FOR_FN (cfun, rpo[idx]);
3652 basic_block dom = get_immediate_dominator (CDI_DOMINATORS, block);
3653 if (dom)
3654 {
3655 unsigned i;
3656 bitmap_iterator bi;
3657 bitmap_set_t newset;
3658
3659 /* First, update the AVAIL_OUT set with anything we may have
3660 inserted higher up in the dominator tree. */
3661 newset = NEW_SETS (dom);
3662 if (newset)
3663 {
3664 /* Note that we need to value_replace both NEW_SETS, and
3665 AVAIL_OUT. For both the case of NEW_SETS, the value may be
3666 represented by some non-simple expression here that we want
3667 to replace it with. */
3668 FOR_EACH_EXPR_ID_IN_SET (newset, i, bi)
3669 {
3670 pre_expr expr = expression_for_id (i);
3671 bitmap_value_replace_in_set (NEW_SETS (block), expr);
3672 bitmap_value_replace_in_set (AVAIL_OUT (block), expr);
3673 }
3674 }
3675
3676 /* Insert expressions for partial redundancies. */
3677 if (flag_tree_pre && !single_pred_p (block))
3678 {
3679 changed |= do_pre_regular_insertion (block, dom);
3680 if (do_partial_partial)
3681 changed |= do_pre_partial_partial_insertion (block, dom);
3682 }
3683
3684 /* Insert expressions for hoisting. */
3685 if (flag_code_hoisting && EDGE_COUNT (block->succs) >= 2)
3686 changed |= do_hoist_insertion (block);
3687 }
3688 }
3689
3690 /* Clear the NEW sets before the next iteration. We have already
3691 fully propagated its contents. */
3692 if (changed)
3693 FOR_ALL_BB_FN (bb, cfun)
3694 bitmap_set_free (NEW_SETS (bb));
3695 }
3696 while (changed);
3697
3698 statistics_histogram_event (cfun, "insert iterations", num_iterations);
3699
3700 free (rpo);
3701 }
3702
3703
3704 /* Compute the AVAIL set for all basic blocks.
3705
3706 This function performs value numbering of the statements in each basic
3707 block. The AVAIL sets are built from information we glean while doing
3708 this value numbering, since the AVAIL sets contain only one entry per
3709 value.
3710
3711 AVAIL_IN[BLOCK] = AVAIL_OUT[dom(BLOCK)].
3712 AVAIL_OUT[BLOCK] = AVAIL_IN[BLOCK] U PHI_GEN[BLOCK] U TMP_GEN[BLOCK]. */
3713
3714 static void
3715 compute_avail (void)
3716 {
3717
3718 basic_block block, son;
3719 basic_block *worklist;
3720 size_t sp = 0;
3721 unsigned i;
3722 tree name;
3723
3724 /* We pretend that default definitions are defined in the entry block.
3725 This includes function arguments and the static chain decl. */
3726 FOR_EACH_SSA_NAME (i, name, cfun)
3727 {
3728 pre_expr e;
3729 if (!SSA_NAME_IS_DEFAULT_DEF (name)
3730 || has_zero_uses (name)
3731 || virtual_operand_p (name))
3732 continue;
3733
3734 e = get_or_alloc_expr_for_name (name);
3735 add_to_value (get_expr_value_id (e), e);
3736 bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR_FOR_FN (cfun)), e);
3737 bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
3738 e);
3739 }
3740
3741 if (dump_file && (dump_flags & TDF_DETAILS))
3742 {
3743 print_bitmap_set (dump_file, TMP_GEN (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
3744 "tmp_gen", ENTRY_BLOCK);
3745 print_bitmap_set (dump_file, AVAIL_OUT (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
3746 "avail_out", ENTRY_BLOCK);
3747 }
3748
3749 /* Allocate the worklist. */
3750 worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
3751
3752 /* Seed the algorithm by putting the dominator children of the entry
3753 block on the worklist. */
3754 for (son = first_dom_son (CDI_DOMINATORS, ENTRY_BLOCK_PTR_FOR_FN (cfun));
3755 son;
3756 son = next_dom_son (CDI_DOMINATORS, son))
3757 worklist[sp++] = son;
3758
3759 BB_LIVE_VOP_ON_EXIT (ENTRY_BLOCK_PTR_FOR_FN (cfun))
3760 = ssa_default_def (cfun, gimple_vop (cfun));
3761
3762 /* Loop until the worklist is empty. */
3763 while (sp)
3764 {
3765 gimple *stmt;
3766 basic_block dom;
3767
3768 /* Pick a block from the worklist. */
3769 block = worklist[--sp];
3770 vn_context_bb = block;
3771
3772 /* Initially, the set of available values in BLOCK is that of
3773 its immediate dominator. */
3774 dom = get_immediate_dominator (CDI_DOMINATORS, block);
3775 if (dom)
3776 {
3777 bitmap_set_copy (AVAIL_OUT (block), AVAIL_OUT (dom));
3778 BB_LIVE_VOP_ON_EXIT (block) = BB_LIVE_VOP_ON_EXIT (dom);
3779 }
3780
3781 /* Generate values for PHI nodes. */
3782 for (gphi_iterator gsi = gsi_start_phis (block); !gsi_end_p (gsi);
3783 gsi_next (&gsi))
3784 {
3785 tree result = gimple_phi_result (gsi.phi ());
3786
3787 /* We have no need for virtual phis, as they don't represent
3788 actual computations. */
3789 if (virtual_operand_p (result))
3790 {
3791 BB_LIVE_VOP_ON_EXIT (block) = result;
3792 continue;
3793 }
3794
3795 pre_expr e = get_or_alloc_expr_for_name (result);
3796 add_to_value (get_expr_value_id (e), e);
3797 bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3798 bitmap_insert_into_set (PHI_GEN (block), e);
3799 }
3800
3801 BB_MAY_NOTRETURN (block) = 0;
3802
3803 /* Now compute value numbers and populate value sets with all
3804 the expressions computed in BLOCK. */
3805 for (gimple_stmt_iterator gsi = gsi_start_bb (block); !gsi_end_p (gsi);
3806 gsi_next (&gsi))
3807 {
3808 ssa_op_iter iter;
3809 tree op;
3810
3811 stmt = gsi_stmt (gsi);
3812
3813 /* Cache whether the basic-block has any non-visible side-effect
3814 or control flow.
3815 If this isn't a call or it is the last stmt in the
3816 basic-block then the CFG represents things correctly. */
3817 if (is_gimple_call (stmt) && !stmt_ends_bb_p (stmt))
3818 {
3819 /* Non-looping const functions always return normally.
3820 Otherwise the call might not return or have side-effects
3821 that forbids hoisting possibly trapping expressions
3822 before it. */
3823 int flags = gimple_call_flags (stmt);
3824 if (!(flags & ECF_CONST)
3825 || (flags & ECF_LOOPING_CONST_OR_PURE))
3826 BB_MAY_NOTRETURN (block) = 1;
3827 }
3828
3829 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
3830 {
3831 pre_expr e = get_or_alloc_expr_for_name (op);
3832
3833 add_to_value (get_expr_value_id (e), e);
3834 bitmap_insert_into_set (TMP_GEN (block), e);
3835 bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3836 }
3837
3838 if (gimple_vdef (stmt))
3839 BB_LIVE_VOP_ON_EXIT (block) = gimple_vdef (stmt);
3840
3841 if (gimple_has_side_effects (stmt)
3842 || stmt_could_throw_p (cfun, stmt)
3843 || is_gimple_debug (stmt))
3844 continue;
3845
3846 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3847 {
3848 if (ssa_undefined_value_p (op))
3849 continue;
3850 pre_expr e = get_or_alloc_expr_for_name (op);
3851 bitmap_value_insert_into_set (EXP_GEN (block), e);
3852 }
3853
3854 switch (gimple_code (stmt))
3855 {
3856 case GIMPLE_RETURN:
3857 continue;
3858
3859 case GIMPLE_CALL:
3860 {
3861 vn_reference_t ref;
3862 vn_reference_s ref1;
3863 pre_expr result = NULL;
3864
3865 /* We can value number only calls to real functions. */
3866 if (gimple_call_internal_p (stmt))
3867 continue;
3868
3869 vn_reference_lookup_call (as_a <gcall *> (stmt), &ref, &ref1);
3870 if (!ref)
3871 continue;
3872
3873 /* If the value of the call is not invalidated in
3874 this block until it is computed, add the expression
3875 to EXP_GEN. */
3876 if (!gimple_vuse (stmt)
3877 || gimple_code
3878 (SSA_NAME_DEF_STMT (gimple_vuse (stmt))) == GIMPLE_PHI
3879 || gimple_bb (SSA_NAME_DEF_STMT
3880 (gimple_vuse (stmt))) != block)
3881 {
3882 result = pre_expr_pool.allocate ();
3883 result->kind = REFERENCE;
3884 result->id = 0;
3885 result->loc = gimple_location (stmt);
3886 PRE_EXPR_REFERENCE (result) = ref;
3887
3888 get_or_alloc_expression_id (result);
3889 add_to_value (get_expr_value_id (result), result);
3890 bitmap_value_insert_into_set (EXP_GEN (block), result);
3891 }
3892 continue;
3893 }
3894
3895 case GIMPLE_ASSIGN:
3896 {
3897 pre_expr result = NULL;
3898 switch (vn_get_stmt_kind (stmt))
3899 {
3900 case VN_NARY:
3901 {
3902 enum tree_code code = gimple_assign_rhs_code (stmt);
3903 vn_nary_op_t nary;
3904
3905 /* COND_EXPR and VEC_COND_EXPR are awkward in
3906 that they contain an embedded complex expression.
3907 Don't even try to shove those through PRE. */
3908 if (code == COND_EXPR
3909 || code == VEC_COND_EXPR)
3910 continue;
3911
3912 vn_nary_op_lookup_stmt (stmt, &nary);
3913 if (!nary || nary->predicated_values)
3914 continue;
3915
3916 /* If the NARY traps and there was a preceding
3917 point in the block that might not return avoid
3918 adding the nary to EXP_GEN. */
3919 if (BB_MAY_NOTRETURN (block)
3920 && vn_nary_may_trap (nary))
3921 continue;
3922
3923 result = pre_expr_pool.allocate ();
3924 result->kind = NARY;
3925 result->id = 0;
3926 result->loc = gimple_location (stmt);
3927 PRE_EXPR_NARY (result) = nary;
3928 break;
3929 }
3930
3931 case VN_REFERENCE:
3932 {
3933 tree rhs1 = gimple_assign_rhs1 (stmt);
3934 ao_ref rhs1_ref;
3935 ao_ref_init (&rhs1_ref, rhs1);
3936 alias_set_type set = ao_ref_alias_set (&rhs1_ref);
3937 alias_set_type base_set
3938 = ao_ref_base_alias_set (&rhs1_ref);
3939 vec<vn_reference_op_s> operands
3940 = vn_reference_operands_for_lookup (rhs1);
3941 vn_reference_t ref;
3942 vn_reference_lookup_pieces (gimple_vuse (stmt), set,
3943 base_set, TREE_TYPE (rhs1),
3944 operands, &ref, VN_WALK);
3945 if (!ref)
3946 {
3947 operands.release ();
3948 continue;
3949 }
3950
3951 /* If the REFERENCE traps and there was a preceding
3952 point in the block that might not return avoid
3953 adding the reference to EXP_GEN. */
3954 if (BB_MAY_NOTRETURN (block)
3955 && vn_reference_may_trap (ref))
3956 continue;
3957
3958 /* If the value of the reference is not invalidated in
3959 this block until it is computed, add the expression
3960 to EXP_GEN. */
3961 if (gimple_vuse (stmt))
3962 {
3963 gimple *def_stmt;
3964 bool ok = true;
3965 def_stmt = SSA_NAME_DEF_STMT (gimple_vuse (stmt));
3966 while (!gimple_nop_p (def_stmt)
3967 && gimple_code (def_stmt) != GIMPLE_PHI
3968 && gimple_bb (def_stmt) == block)
3969 {
3970 if (stmt_may_clobber_ref_p
3971 (def_stmt, gimple_assign_rhs1 (stmt)))
3972 {
3973 ok = false;
3974 break;
3975 }
3976 def_stmt
3977 = SSA_NAME_DEF_STMT (gimple_vuse (def_stmt));
3978 }
3979 if (!ok)
3980 {
3981 operands.release ();
3982 continue;
3983 }
3984 }
3985
3986 /* If the load was value-numbered to another
3987 load make sure we do not use its expression
3988 for insertion if it wouldn't be a valid
3989 replacement. */
3990 /* At the momemt we have a testcase
3991 for hoist insertion of aligned vs. misaligned
3992 variants in gcc.dg/torture/pr65270-1.c thus
3993 with just alignment to be considered we can
3994 simply replace the expression in the hashtable
3995 with the most conservative one. */
3996 vn_reference_op_t ref1 = &ref->operands.last ();
3997 while (ref1->opcode != TARGET_MEM_REF
3998 && ref1->opcode != MEM_REF
3999 && ref1 != &ref->operands[0])
4000 --ref1;
4001 vn_reference_op_t ref2 = &operands.last ();
4002 while (ref2->opcode != TARGET_MEM_REF
4003 && ref2->opcode != MEM_REF
4004 && ref2 != &operands[0])
4005 --ref2;
4006 if ((ref1->opcode == TARGET_MEM_REF
4007 || ref1->opcode == MEM_REF)
4008 && (TYPE_ALIGN (ref1->type)
4009 > TYPE_ALIGN (ref2->type)))
4010 ref1->type
4011 = build_aligned_type (ref1->type,
4012 TYPE_ALIGN (ref2->type));
4013 /* TBAA behavior is an obvious part so make sure
4014 that the hashtable one covers this as well
4015 by adjusting the ref alias set and its base. */
4016 if (ref->set == set
4017 || alias_set_subset_of (set, ref->set))
4018 ;
4019 else if (alias_set_subset_of (ref->set, set))
4020 {
4021 ref->set = set;
4022 if (ref1->opcode == MEM_REF)
4023 ref1->op0
4024 = wide_int_to_tree (TREE_TYPE (ref2->op0),
4025 wi::to_wide (ref1->op0));
4026 else
4027 ref1->op2
4028 = wide_int_to_tree (TREE_TYPE (ref2->op2),
4029 wi::to_wide (ref1->op2));
4030 }
4031 else
4032 {
4033 ref->set = 0;
4034 if (ref1->opcode == MEM_REF)
4035 ref1->op0
4036 = wide_int_to_tree (ptr_type_node,
4037 wi::to_wide (ref1->op0));
4038 else
4039 ref1->op2
4040 = wide_int_to_tree (ptr_type_node,
4041 wi::to_wide (ref1->op2));
4042 }
4043 operands.release ();
4044
4045 result = pre_expr_pool.allocate ();
4046 result->kind = REFERENCE;
4047 result->id = 0;
4048 result->loc = gimple_location (stmt);
4049 PRE_EXPR_REFERENCE (result) = ref;
4050 break;
4051 }
4052
4053 default:
4054 continue;
4055 }
4056
4057 get_or_alloc_expression_id (result);
4058 add_to_value (get_expr_value_id (result), result);
4059 bitmap_value_insert_into_set (EXP_GEN (block), result);
4060 continue;
4061 }
4062 default:
4063 break;
4064 }
4065 }
4066
4067 if (dump_file && (dump_flags & TDF_DETAILS))
4068 {
4069 print_bitmap_set (dump_file, EXP_GEN (block),
4070 "exp_gen", block->index);
4071 print_bitmap_set (dump_file, PHI_GEN (block),
4072 "phi_gen", block->index);
4073 print_bitmap_set (dump_file, TMP_GEN (block),
4074 "tmp_gen", block->index);
4075 print_bitmap_set (dump_file, AVAIL_OUT (block),
4076 "avail_out", block->index);
4077 }
4078
4079 /* Put the dominator children of BLOCK on the worklist of blocks
4080 to compute available sets for. */
4081 for (son = first_dom_son (CDI_DOMINATORS, block);
4082 son;
4083 son = next_dom_son (CDI_DOMINATORS, son))
4084 worklist[sp++] = son;
4085 }
4086 vn_context_bb = NULL;
4087
4088 free (worklist);
4089 }
4090
4091
4092 /* Initialize data structures used by PRE. */
4093
4094 static void
4095 init_pre (void)
4096 {
4097 basic_block bb;
4098
4099 next_expression_id = 1;
4100 expressions.create (0);
4101 expressions.safe_push (NULL);
4102 value_expressions.create (get_max_value_id () + 1);
4103 value_expressions.safe_grow_cleared (get_max_value_id () + 1, true);
4104 name_to_id.create (0);
4105
4106 inserted_exprs = BITMAP_ALLOC (NULL);
4107
4108 connect_infinite_loops_to_exit ();
4109 memset (&pre_stats, 0, sizeof (pre_stats));
4110
4111 alloc_aux_for_blocks (sizeof (struct bb_bitmap_sets));
4112
4113 calculate_dominance_info (CDI_DOMINATORS);
4114
4115 bitmap_obstack_initialize (&grand_bitmap_obstack);
4116 phi_translate_table = new hash_table<expr_pred_trans_d> (5110);
4117 expression_to_id = new hash_table<pre_expr_d> (num_ssa_names * 3);
4118 FOR_ALL_BB_FN (bb, cfun)
4119 {
4120 EXP_GEN (bb) = bitmap_set_new ();
4121 PHI_GEN (bb) = bitmap_set_new ();
4122 TMP_GEN (bb) = bitmap_set_new ();
4123 AVAIL_OUT (bb) = bitmap_set_new ();
4124 }
4125 }
4126
4127
4128 /* Deallocate data structures used by PRE. */
4129
4130 static void
4131 fini_pre ()
4132 {
4133 value_expressions.release ();
4134 expressions.release ();
4135 BITMAP_FREE (inserted_exprs);
4136 bitmap_obstack_release (&grand_bitmap_obstack);
4137 bitmap_set_pool.release ();
4138 pre_expr_pool.release ();
4139 delete phi_translate_table;
4140 phi_translate_table = NULL;
4141 delete expression_to_id;
4142 expression_to_id = NULL;
4143 name_to_id.release ();
4144
4145 free_aux_for_blocks ();
4146 }
4147
4148 namespace {
4149
4150 const pass_data pass_data_pre =
4151 {
4152 GIMPLE_PASS, /* type */
4153 "pre", /* name */
4154 OPTGROUP_NONE, /* optinfo_flags */
4155 TV_TREE_PRE, /* tv_id */
4156 ( PROP_cfg | PROP_ssa ), /* properties_required */
4157 0, /* properties_provided */
4158 0, /* properties_destroyed */
4159 TODO_rebuild_alias, /* todo_flags_start */
4160 0, /* todo_flags_finish */
4161 };
4162
4163 class pass_pre : public gimple_opt_pass
4164 {
4165 public:
4166 pass_pre (gcc::context *ctxt)
4167 : gimple_opt_pass (pass_data_pre, ctxt)
4168 {}
4169
4170 /* opt_pass methods: */
4171 virtual bool gate (function *)
4172 { return flag_tree_pre != 0 || flag_code_hoisting != 0; }
4173 virtual unsigned int execute (function *);
4174
4175 }; // class pass_pre
4176
4177 /* Valueization hook for RPO VN when we are calling back to it
4178 at ANTIC compute time. */
4179
4180 static tree
4181 pre_valueize (tree name)
4182 {
4183 if (TREE_CODE (name) == SSA_NAME)
4184 {
4185 tree tem = VN_INFO (name)->valnum;
4186 if (tem != VN_TOP && tem != name)
4187 {
4188 if (TREE_CODE (tem) != SSA_NAME
4189 || SSA_NAME_IS_DEFAULT_DEF (tem))
4190 return tem;
4191 /* We create temporary SSA names for representatives that
4192 do not have a definition (yet) but are not default defs either
4193 assume they are fine to use. */
4194 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (tem));
4195 if (! def_bb
4196 || dominated_by_p (CDI_DOMINATORS, vn_context_bb, def_bb))
4197 return tem;
4198 /* ??? Now we could look for a leader. Ideally we'd somehow
4199 expose RPO VN leaders and get rid of AVAIL_OUT as well... */
4200 }
4201 }
4202 return name;
4203 }
4204
4205 unsigned int
4206 pass_pre::execute (function *fun)
4207 {
4208 unsigned int todo = 0;
4209
4210 do_partial_partial =
4211 flag_tree_partial_pre && optimize_function_for_speed_p (fun);
4212
4213 /* This has to happen before VN runs because
4214 loop_optimizer_init may create new phis, etc. */
4215 loop_optimizer_init (LOOPS_NORMAL);
4216 split_edges_for_insertion ();
4217 scev_initialize ();
4218 calculate_dominance_info (CDI_DOMINATORS);
4219
4220 run_rpo_vn (VN_WALK);
4221
4222 init_pre ();
4223
4224 vn_valueize = pre_valueize;
4225
4226 /* Insert can get quite slow on an incredibly large number of basic
4227 blocks due to some quadratic behavior. Until this behavior is
4228 fixed, don't run it when he have an incredibly large number of
4229 bb's. If we aren't going to run insert, there is no point in
4230 computing ANTIC, either, even though it's plenty fast nor do
4231 we require AVAIL. */
4232 if (n_basic_blocks_for_fn (fun) < 4000)
4233 {
4234 compute_avail ();
4235 compute_antic ();
4236 insert ();
4237 }
4238
4239 /* Make sure to remove fake edges before committing our inserts.
4240 This makes sure we don't end up with extra critical edges that
4241 we would need to split. */
4242 remove_fake_exit_edges ();
4243 gsi_commit_edge_inserts ();
4244
4245 /* Eliminate folds statements which might (should not...) end up
4246 not keeping virtual operands up-to-date. */
4247 gcc_assert (!need_ssa_update_p (fun));
4248
4249 statistics_counter_event (fun, "Insertions", pre_stats.insertions);
4250 statistics_counter_event (fun, "PA inserted", pre_stats.pa_insert);
4251 statistics_counter_event (fun, "HOIST inserted", pre_stats.hoist_insert);
4252 statistics_counter_event (fun, "New PHIs", pre_stats.phis);
4253
4254 todo |= eliminate_with_rpo_vn (inserted_exprs);
4255
4256 vn_valueize = NULL;
4257
4258 /* Because we don't follow exactly the standard PRE algorithm, and decide not
4259 to insert PHI nodes sometimes, and because value numbering of casts isn't
4260 perfect, we sometimes end up inserting dead code. This simple DCE-like
4261 pass removes any insertions we made that weren't actually used. */
4262 simple_dce_from_worklist (inserted_exprs);
4263
4264 fini_pre ();
4265
4266 scev_finalize ();
4267 loop_optimizer_finalize ();
4268
4269 /* TODO: tail_merge_optimize may merge all predecessors of a block, in which
4270 case we can merge the block with the remaining predecessor of the block.
4271 It should either:
4272 - call merge_blocks after each tail merge iteration
4273 - call merge_blocks after all tail merge iterations
4274 - mark TODO_cleanup_cfg when necessary
4275 - share the cfg cleanup with fini_pre. */
4276 todo |= tail_merge_optimize (todo);
4277
4278 free_rpo_vn ();
4279
4280 /* Tail merging invalidates the virtual SSA web, together with
4281 cfg-cleanup opportunities exposed by PRE this will wreck the
4282 SSA updating machinery. So make sure to run update-ssa
4283 manually, before eventually scheduling cfg-cleanup as part of
4284 the todo. */
4285 update_ssa (TODO_update_ssa_only_virtuals);
4286
4287 return todo;
4288 }
4289
4290 } // anon namespace
4291
4292 gimple_opt_pass *
4293 make_pass_pre (gcc::context *ctxt)
4294 {
4295 return new pass_pre (ctxt);
4296 }