OSDN Git Service

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