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