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