OSDN Git Service

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