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