Import of virgin gcc 4.0.0 distribution.
[dragonfly.git] / contrib / gcc-4.0 / gcc / tree-ssa-pre.c
1 /* SSA-PRE for trees.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Daniel Berlin <dan@dberlin.org> and Steven Bosscher
4    <stevenb@suse.de> 
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "errors.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 "tree-pass.h"
43 #include "flags.h"
44 #include "bitmap.h"
45 #include "langhooks.h"
46 #include "cfgloop.h"
47
48 /* TODO:
49    
50    1. Avail sets can be shared by making an avail_find_leader that
51       walks up the dominator tree and looks in those avail sets.
52       This might affect code optimality, it's unclear right now.
53    2. Load motion can be performed by value numbering the loads the
54       same as we do other expressions.  This requires iterative
55       hashing the vuses into the values.  Right now we simply assign
56       a new value every time we see a statement with a vuse.
57    3. Strength reduction can be performed by anticipating expressions
58       we can repair later on.
59    4. We can do back-substitution or smarter value numbering to catch
60       commutative expressions split up over multiple statements.
61 */   
62
63 /* For ease of terminology, "expression node" in the below refers to
64    every expression node but MODIFY_EXPR, because MODIFY_EXPR's represent
65    the actual statement containing the expressions we care about, and
66    we cache the value number by putting it in the expression.  */
67
68 /* Basic algorithm
69    
70    First we walk the statements to generate the AVAIL sets, the
71    EXP_GEN sets, and the tmp_gen sets.  EXP_GEN sets represent the
72    generation of values/expressions by a given block.  We use them
73    when computing the ANTIC sets.  The AVAIL sets consist of
74    SSA_NAME's that represent values, so we know what values are
75    available in what blocks.  AVAIL is a forward dataflow problem.  In
76    SSA, values are never killed, so we don't need a kill set, or a
77    fixpoint iteration, in order to calculate the AVAIL sets.  In
78    traditional parlance, AVAIL sets tell us the downsafety of the
79    expressions/values.
80    
81    Next, we generate the ANTIC sets.  These sets represent the
82    anticipatable expressions.  ANTIC is a backwards dataflow
83    problem.An expression is anticipatable in a given block if it could
84    be generated in that block.  This means that if we had to perform
85    an insertion in that block, of the value of that expression, we
86    could.  Calculating the ANTIC sets requires phi translation of
87    expressions, because the flow goes backwards through phis.  We must
88    iterate to a fixpoint of the ANTIC sets, because we have a kill
89    set.  Even in SSA form, values are not live over the entire
90    function, only from their definition point onwards.  So we have to
91    remove values from the ANTIC set once we go past the definition
92    point of the leaders that make them up.
93    compute_antic/compute_antic_aux performs this computation.
94
95    Third, we perform insertions to make partially redundant
96    expressions fully redundant.
97
98    An expression is partially redundant (excluding partial
99    anticipation) if:
100
101    1. It is AVAIL in some, but not all, of the predecessors of a
102       given block.
103    2. It is ANTIC in all the predecessors.
104
105    In order to make it fully redundant, we insert the expression into
106    the predecessors where it is not available, but is ANTIC.
107    insert/insert_aux performs this insertion.
108
109    Fourth, we eliminate fully redundant expressions.
110    This is a simple statement walk that replaces redundant
111    calculations  with the now available values.  */
112
113 /* Representations of value numbers:
114
115    Value numbers are represented using the "value handle" approach.
116    This means that each SSA_NAME (and for other reasons to be
117    disclosed in a moment, expression nodes) has a value handle that
118    can be retrieved through get_value_handle.  This value handle, *is*
119    the value number of the SSA_NAME.  You can pointer compare the
120    value handles for equivalence purposes.
121
122    For debugging reasons, the value handle is internally more than
123    just a number, it is a VAR_DECL named "value.x", where x is a
124    unique number for each value number in use.  This allows
125    expressions with SSA_NAMES replaced by value handles to still be
126    pretty printed in a sane way.  They simply print as "value.3 *
127    value.5", etc.  
128
129    Expression nodes have value handles associated with them as a
130    cache.  Otherwise, we'd have to look them up again in the hash
131    table This makes significant difference (factor of two or more) on
132    some test cases.  They can be thrown away after the pass is
133    finished.  */
134
135 /* Representation of expressions on value numbers: 
136
137    In some portions of this code, you will notice we allocate "fake"
138    analogues to the expression we are value numbering, and replace the
139    operands with the values of the expression.  Since we work on
140    values, and not just names, we canonicalize expressions to value
141    expressions for use in the ANTIC sets, the EXP_GEN set, etc.  
142
143    This is theoretically unnecessary, it just saves a bunch of
144    repeated get_value_handle and find_leader calls in the remainder of
145    the code, trading off temporary memory usage for speed.  The tree
146    nodes aren't actually creating more garbage, since they are
147    allocated in a special pools which are thrown away at the end of
148    this pass.  
149
150    All of this also means that if you print the EXP_GEN or ANTIC sets,
151    you will see "value.5 + value.7" in the set, instead of "a_55 +
152    b_66" or something.  The only thing that actually cares about
153    seeing the value leaders is phi translation, and it needs to be
154    able to find the leader for a value in an arbitrary block, so this
155    "value expression" form is perfect for it (otherwise you'd do
156    get_value_handle->find_leader->translate->get_value_handle->find_leader).*/
157
158
159 /* Representation of sets:
160
161    There are currently two types of sets used, hopefully to be unified soon.
162    The AVAIL sets do not need to be sorted in any particular order,
163    and thus, are simply represented as two bitmaps, one that keeps
164    track of values present in the set, and one that keeps track of
165    expressions present in the set.
166    
167    The other sets are represented as doubly linked lists kept in topological
168    order, with an optional supporting bitmap of values present in the
169    set.  The sets represent values, and the elements can be values or
170    expressions.  The elements can appear in different sets, but each
171    element can only appear once in each set.
172
173    Since each node in the set represents a value, we also want to be
174    able to map expression, set pairs to something that tells us
175    whether the value is present is a set.  We use a per-set bitmap for
176    that.  The value handles also point to a linked list of the
177    expressions they represent via a tree annotation.  This is mainly
178    useful only for debugging, since we don't do identity lookups.  */
179
180
181 /* A value set element.  Basically a single linked list of
182    expressions/values.  */
183 typedef struct value_set_node
184 {
185   /* An expression.  */
186   tree expr;
187
188   /* A pointer to the next element of the value set.  */
189   struct value_set_node *next;
190 } *value_set_node_t;
191
192
193 /* A value set.  This is a singly linked list of value_set_node
194    elements with a possible bitmap that tells us what values exist in
195    the set.  This set must be kept in topologically sorted order.  */
196 typedef struct value_set
197 {
198   /* The head of the list.  Used for iterating over the list in
199      order.  */
200   value_set_node_t head;
201
202   /* The tail of the list.  Used for tail insertions, which are
203      necessary to keep the set in topologically sorted order because
204      of how the set is built.  */
205   value_set_node_t tail;
206   
207   /* The length of the list.  */
208   size_t length;
209   
210   /* True if the set is indexed, which means it contains a backing
211      bitmap for quick determination of whether certain values exist in the
212      set.  */
213   bool indexed;
214   
215   /* The bitmap of values that exist in the set.  May be NULL in an
216      empty or non-indexed set.  */
217   bitmap values;
218   
219 } *value_set_t;
220
221
222 /* An unordered bitmap set.  One bitmap tracks values, the other,
223    expressions.  */
224 typedef struct bitmap_set
225 {
226   bitmap expressions;
227   bitmap values;
228 } *bitmap_set_t;
229
230 /* Sets that we need to keep track of.  */
231 typedef struct bb_value_sets
232 {
233   /* The EXP_GEN set, which represents expressions/values generated in
234      a basic block.  */
235   value_set_t exp_gen;
236
237   /* The PHI_GEN set, which represents PHI results generated in a
238      basic block.  */
239   bitmap_set_t phi_gen;
240
241   /* The TMP_GEN set, which represents results/temporaries generated
242      in a basic block. IE the LHS of an expression.  */
243   bitmap_set_t tmp_gen;
244
245   /* The AVAIL_OUT set, which represents which values are available in
246      a given basic block.  */
247   bitmap_set_t avail_out;
248
249   /* The ANTIC_IN set, which represents which values are anticiptable
250      in a given basic block.  */
251   value_set_t antic_in;
252
253   /* The NEW_SETS set, which is used during insertion to augment the
254      AVAIL_OUT set of blocks with the new insertions performed during
255      the current iteration.  */
256   bitmap_set_t new_sets;
257 } *bb_value_sets_t;
258
259 #define EXP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->exp_gen
260 #define PHI_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->phi_gen
261 #define TMP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->tmp_gen
262 #define AVAIL_OUT(BB)   ((bb_value_sets_t) ((BB)->aux))->avail_out
263 #define ANTIC_IN(BB)    ((bb_value_sets_t) ((BB)->aux))->antic_in
264 #define NEW_SETS(BB)    ((bb_value_sets_t) ((BB)->aux))->new_sets
265
266 /* This structure is used to keep track of statistics on what
267    optimization PRE was able to perform.  */
268 static struct
269 {
270   /* The number of RHS computations eliminated by PRE.  */
271   int eliminations;
272
273   /* The number of new expressions/temporaries generated by PRE.  */
274   int insertions;
275
276   /* The number of new PHI nodes added by PRE.  */
277   int phis;
278   
279   /* The number of values found constant.  */
280   int constified;
281   
282 } pre_stats;
283
284
285 static tree bitmap_find_leader (bitmap_set_t, tree);
286 static tree find_leader (value_set_t, tree);
287 static void value_insert_into_set (value_set_t, tree);
288 static void bitmap_value_insert_into_set (bitmap_set_t, tree);
289 static void bitmap_value_replace_in_set (bitmap_set_t, tree);
290 static void insert_into_set (value_set_t, tree);
291 static void bitmap_set_copy (bitmap_set_t, bitmap_set_t);
292 static bool bitmap_set_contains_value (bitmap_set_t, tree);
293 static bitmap_set_t bitmap_set_new (void);
294 static value_set_t set_new  (bool);
295 static bool is_undefined_value (tree);
296 static tree create_expression_by_pieces (basic_block, tree, tree);
297
298
299 /* We can add and remove elements and entries to and from sets
300    and hash tables, so we use alloc pools for them.  */
301
302 static alloc_pool value_set_pool;
303 static alloc_pool bitmap_set_pool;
304 static alloc_pool value_set_node_pool;
305 static alloc_pool binary_node_pool;
306 static alloc_pool unary_node_pool;
307 static alloc_pool reference_node_pool;
308 static bitmap_obstack grand_bitmap_obstack;
309
310 /* Set of blocks with statements that have had its EH information
311    cleaned up.  */
312 static bitmap need_eh_cleanup;
313
314 /* The phi_translate_table caches phi translations for a given
315    expression and predecessor.  */
316
317 static htab_t phi_translate_table;
318
319 /* A three tuple {e, pred, v} used to cache phi translations in the
320    phi_translate_table.  */
321
322 typedef struct expr_pred_trans_d
323 {
324   /* The expression.  */
325   tree e;
326
327   /* The predecessor block along which we translated the expression.  */
328   basic_block pred;
329
330   /* The value that resulted from the translation.  */
331   tree v;
332
333   /* The hashcode for the expression, pred pair. This is cached for
334      speed reasons.  */
335   hashval_t hashcode;
336 } *expr_pred_trans_t;
337
338 /* Return the hash value for a phi translation table entry.  */
339
340 static hashval_t
341 expr_pred_trans_hash (const void *p)
342 {
343   const expr_pred_trans_t ve = (expr_pred_trans_t) p;
344   return ve->hashcode;
345 }
346
347 /* Return true if two phi translation table entries are the same.
348    P1 and P2 should point to the expr_pred_trans_t's to be compared.*/
349
350 static int
351 expr_pred_trans_eq (const void *p1, const void *p2)
352 {
353   const expr_pred_trans_t ve1 = (expr_pred_trans_t) p1;
354   const expr_pred_trans_t ve2 = (expr_pred_trans_t) p2;
355   basic_block b1 = ve1->pred;
356   basic_block b2 = ve2->pred;
357
358   
359   /* If they are not translations for the same basic block, they can't
360      be equal.  */
361   if (b1 != b2)
362     return false;
363
364   /* If they are for the same basic block, determine if the
365      expressions are equal.  */  
366   if (expressions_equal_p (ve1->e, ve2->e))
367     return true;
368   
369   return false;
370 }
371
372 /* Search in the phi translation table for the translation of
373    expression E in basic block PRED. Return the translated value, if
374    found, NULL otherwise.  */ 
375
376 static inline tree
377 phi_trans_lookup (tree e, basic_block pred)
378 {
379   void **slot;
380   struct expr_pred_trans_d ept;
381   ept.e = e;
382   ept.pred = pred;
383   ept.hashcode = vn_compute (e, (unsigned long) pred, NULL);
384   slot = htab_find_slot_with_hash (phi_translate_table, &ept, ept.hashcode,
385                                    NO_INSERT);
386   if (!slot)
387     return NULL;
388   else
389     return ((expr_pred_trans_t) *slot)->v;
390 }
391
392
393 /* Add the tuple mapping from {expression E, basic block PRED} to
394    value V, to the phi translation table.  */
395
396 static inline void
397 phi_trans_add (tree e, tree v, basic_block pred)
398 {
399   void **slot;
400   expr_pred_trans_t new_pair = xmalloc (sizeof (*new_pair));
401   new_pair->e = e;
402   new_pair->pred = pred;
403   new_pair->v = v;
404   new_pair->hashcode = vn_compute (e, (unsigned long) pred, NULL);
405   slot = htab_find_slot_with_hash (phi_translate_table, new_pair,
406                                    new_pair->hashcode, INSERT);
407   if (*slot)
408     free (*slot);
409   *slot = (void *) new_pair;
410 }
411
412
413 /* Add expression E to the expression set of value V.  */
414
415 void
416 add_to_value (tree v, tree e)
417 {
418   /* Constants have no expression sets.  */
419   if (is_gimple_min_invariant (v))
420     return;
421
422   if (VALUE_HANDLE_EXPR_SET (v) == NULL)
423     VALUE_HANDLE_EXPR_SET (v) = set_new (false);
424
425   insert_into_set (VALUE_HANDLE_EXPR_SET (v), e);
426 }
427
428
429 /* Return true if value V exists in the bitmap for SET.  */
430
431 static inline bool
432 value_exists_in_set_bitmap (value_set_t set, tree v)
433 {
434   if (!set->values)
435     return false;
436
437   return bitmap_bit_p (set->values, VALUE_HANDLE_ID (v));
438 }
439
440
441 /* Remove value V from the bitmap for SET.  */
442
443 static void
444 value_remove_from_set_bitmap (value_set_t set, tree v)
445 {
446   gcc_assert (set->indexed);
447
448   if (!set->values)
449     return;
450
451   bitmap_clear_bit (set->values, VALUE_HANDLE_ID (v));
452 }
453
454
455 /* Insert the value number V into the bitmap of values existing in
456    SET.  */
457
458 static inline void
459 value_insert_into_set_bitmap (value_set_t set, tree v)
460 {
461   gcc_assert (set->indexed);
462
463   if (set->values == NULL)
464     set->values = BITMAP_ALLOC (&grand_bitmap_obstack);
465
466   bitmap_set_bit (set->values, VALUE_HANDLE_ID (v));
467 }
468
469
470 /* Create a new bitmap set and return it.  */
471
472 static bitmap_set_t 
473 bitmap_set_new (void)
474 {
475   bitmap_set_t ret = pool_alloc (bitmap_set_pool);
476   ret->expressions = BITMAP_ALLOC (&grand_bitmap_obstack);
477   ret->values = BITMAP_ALLOC (&grand_bitmap_obstack);
478   return ret;
479 }
480
481 /* Create a new set.  */
482
483 static value_set_t
484 set_new  (bool indexed)
485 {
486   value_set_t ret;
487   ret = pool_alloc (value_set_pool);
488   ret->head = ret->tail = NULL;
489   ret->length = 0;
490   ret->indexed = indexed;
491   ret->values = NULL;
492   return ret;
493 }
494
495 /* Insert an expression EXPR into a bitmapped set.  */
496
497 static void
498 bitmap_insert_into_set (bitmap_set_t set, tree expr)
499 {
500   tree val;
501   /* XXX: For now, we only let SSA_NAMES into the bitmap sets.  */
502   gcc_assert (TREE_CODE (expr) == SSA_NAME);
503   val = get_value_handle (expr);
504   
505   gcc_assert (val);
506   if (!is_gimple_min_invariant (val))
507   {
508     bitmap_set_bit (set->values, VALUE_HANDLE_ID (val));
509     bitmap_set_bit (set->expressions, SSA_NAME_VERSION (expr));
510   }
511 }
512
513 /* Insert EXPR into SET.  */
514
515 static void
516 insert_into_set (value_set_t set, tree expr)
517 {
518   value_set_node_t newnode = pool_alloc (value_set_node_pool);
519   tree val = get_value_handle (expr);
520   gcc_assert (val);
521   
522   if (is_gimple_min_invariant (val))
523     return;
524
525   /* For indexed sets, insert the value into the set value bitmap.
526      For all sets, add it to the linked list and increment the list
527      length.  */
528   if (set->indexed)
529     value_insert_into_set_bitmap (set, val);
530
531   newnode->next = NULL;
532   newnode->expr = expr;
533   set->length ++;
534   if (set->head == NULL)
535     {
536       set->head = set->tail = newnode;
537     }
538   else
539     {
540       set->tail->next = newnode;
541       set->tail = newnode;
542     }
543 }
544
545 /* Copy a bitmapped set ORIG, into bitmapped set DEST.  */
546
547 static void
548 bitmap_set_copy (bitmap_set_t dest, bitmap_set_t orig)
549 {
550   bitmap_copy (dest->expressions, orig->expressions);
551   bitmap_copy (dest->values, orig->values);
552 }
553
554 /* Copy the set ORIG to the set DEST.  */
555
556 static void
557 set_copy (value_set_t dest, value_set_t orig)
558 {
559   value_set_node_t node;
560  
561   if (!orig || !orig->head)
562     return;
563
564   for (node = orig->head;
565        node;
566        node = node->next)
567     {
568       insert_into_set (dest, node->expr);
569     }
570 }
571
572 /* Remove EXPR from SET.  */
573
574 static void
575 set_remove (value_set_t set, tree expr)
576 {
577   value_set_node_t node, prev;
578
579   /* Remove the value of EXPR from the bitmap, decrement the set
580      length, and remove it from the actual double linked list.  */ 
581   value_remove_from_set_bitmap (set, get_value_handle (expr));
582   set->length--;
583   prev = NULL;
584   for (node = set->head; 
585        node != NULL; 
586        prev = node, node = node->next)
587     {
588       if (node->expr == expr)
589         {
590           if (prev == NULL)
591             set->head = node->next;
592           else
593             prev->next= node->next;
594  
595           if (node == set->tail)
596             set->tail = prev;
597           pool_free (value_set_node_pool, node);
598           return;
599         }
600     }
601 }
602
603 /* Return true if SET contains the value VAL.  */
604
605 static bool
606 set_contains_value (value_set_t set, tree val)
607 {
608   /* All constants are in every set.  */
609   if (is_gimple_min_invariant (val))
610     return true;
611   
612   if (set->length == 0)
613     return false;
614   
615   return value_exists_in_set_bitmap (set, val);
616 }
617
618 /* Return true if bitmapped set SET contains the expression EXPR.  */
619 static bool
620 bitmap_set_contains (bitmap_set_t set, tree expr)
621 {
622   /* All constants are in every set.  */
623   if (is_gimple_min_invariant (get_value_handle (expr)))
624     return true;
625
626   /* XXX: Bitmapped sets only contain SSA_NAME's for now.  */
627   if (TREE_CODE (expr) != SSA_NAME)
628     return false;
629   return bitmap_bit_p (set->expressions, SSA_NAME_VERSION (expr));
630 }
631
632   
633 /* Return true if bitmapped set SET contains the value VAL.  */
634
635 static bool
636 bitmap_set_contains_value (bitmap_set_t set, tree val)
637 {
638   if (is_gimple_min_invariant (val))
639     return true;
640   return bitmap_bit_p (set->values, VALUE_HANDLE_ID (val));
641 }
642
643 /* Replace an instance of value LOOKFOR with expression EXPR in SET.  */
644
645 static void
646 bitmap_set_replace_value (bitmap_set_t set, tree lookfor, tree expr)
647 {
648   value_set_t exprset;
649   value_set_node_t node;
650   if (is_gimple_min_invariant (lookfor))
651     return;
652   if (!bitmap_set_contains_value (set, lookfor))
653     return;
654
655   /* The number of expressions having a given value is usually
656      significantly less than the total number of expressions in SET.
657      Thus, rather than check, for each expression in SET, whether it
658      has the value LOOKFOR, we walk the reverse mapping that tells us
659      what expressions have a given value, and see if any of those
660      expressions are in our set.  For large testcases, this is about
661      5-10x faster than walking the bitmap.  If this is somehow a
662      significant lose for some cases, we can choose which set to walk
663      based on the set size.  */
664   exprset = VALUE_HANDLE_EXPR_SET (lookfor);
665   for (node = exprset->head; node; node = node->next)
666     {
667       if (TREE_CODE (node->expr) == SSA_NAME)
668         {
669           if (bitmap_bit_p (set->expressions, SSA_NAME_VERSION (node->expr)))
670             {
671               bitmap_clear_bit (set->expressions, SSA_NAME_VERSION (node->expr));
672               bitmap_set_bit (set->expressions, SSA_NAME_VERSION (expr));
673               return;
674             }
675         }
676     }
677 }
678
679 /* Subtract bitmapped set B from value set A, and return the new set.  */
680
681 static value_set_t
682 bitmap_set_subtract_from_value_set (value_set_t a, bitmap_set_t b,
683                                     bool indexed)
684 {
685   value_set_t ret = set_new (indexed);
686   value_set_node_t node;
687   for (node = a->head;
688        node;
689        node = node->next)
690     {
691       if (!bitmap_set_contains (b, node->expr))
692         insert_into_set (ret, node->expr);
693     }
694   return ret;
695 }
696
697 /* Return true if two sets are equal.  */
698
699 static bool
700 set_equal (value_set_t a, value_set_t b)
701 {
702   value_set_node_t node;
703
704   if (a->length != b->length)
705     return false;
706   for (node = a->head;
707        node;
708        node = node->next)
709     {
710       if (!set_contains_value (b, get_value_handle (node->expr)))
711         return false;
712     }
713   return true;
714 }
715
716 /* Replace an instance of EXPR's VALUE with EXPR in SET if it exists,
717    and add it otherwise. */
718
719 static void
720 bitmap_value_replace_in_set (bitmap_set_t set, tree expr)
721 {
722   tree val = get_value_handle (expr);
723   if (bitmap_set_contains_value (set, val))
724     bitmap_set_replace_value (set, val, expr);
725   else
726     bitmap_insert_into_set (set, expr);
727 }
728
729 /* Insert EXPR into SET if EXPR's value is not already present in
730    SET.  */
731
732 static void
733 bitmap_value_insert_into_set (bitmap_set_t set, tree expr)
734 {
735   tree val = get_value_handle (expr);
736
737   if (is_gimple_min_invariant (val))
738     return;
739   
740   if (!bitmap_set_contains_value (set, val))
741     bitmap_insert_into_set (set, expr);
742 }
743
744 /* Insert the value for EXPR into SET, if it doesn't exist already.  */
745
746 static void
747 value_insert_into_set (value_set_t set, tree expr)
748 {
749   tree val = get_value_handle (expr);
750
751   /* Constant and invariant values exist everywhere, and thus,
752      actually keeping them in the sets is pointless.  */
753   if (is_gimple_min_invariant (val))
754     return;
755
756   if (!set_contains_value (set, val))
757     insert_into_set (set, expr);
758 }
759
760
761 /* Print out SET to OUTFILE.  */
762
763 static void
764 bitmap_print_value_set (FILE *outfile, bitmap_set_t set,
765                         const char *setname, int blockindex)
766 {
767   fprintf (outfile, "%s[%d] := { ", setname, blockindex);
768   if (set)
769     {
770       bool first = true;
771       unsigned i;
772       bitmap_iterator bi;
773
774       EXECUTE_IF_SET_IN_BITMAP (set->expressions, 0, i, bi)
775         {
776           if (!first)
777             fprintf (outfile, ", ");
778           first = false;
779           print_generic_expr (outfile, ssa_name (i), 0);
780         
781           fprintf (outfile, " (");
782           print_generic_expr (outfile, get_value_handle (ssa_name (i)), 0);
783           fprintf (outfile, ") ");
784         }
785     }
786   fprintf (outfile, " }\n");
787 }
788 /* Print out the value_set SET to OUTFILE.  */
789
790 static void
791 print_value_set (FILE *outfile, value_set_t set,
792                  const char *setname, int blockindex)
793 {
794   value_set_node_t node;
795   fprintf (outfile, "%s[%d] := { ", setname, blockindex);
796   if (set)
797     {
798       for (node = set->head;
799            node;
800            node = node->next)
801         {
802           print_generic_expr (outfile, node->expr, 0);
803           
804           fprintf (outfile, " (");
805           print_generic_expr (outfile, get_value_handle (node->expr), 0);
806           fprintf (outfile, ") ");
807                      
808           if (node->next)
809             fprintf (outfile, ", ");
810         }
811     }
812
813   fprintf (outfile, " }\n");
814 }
815
816 /* Print out the expressions that have VAL to OUTFILE.  */
817
818 void
819 print_value_expressions (FILE *outfile, tree val)
820 {
821   if (VALUE_HANDLE_EXPR_SET (val))
822     {
823       char s[10];
824       sprintf (s, "VH.%04d", VALUE_HANDLE_ID (val));
825       print_value_set (outfile, VALUE_HANDLE_EXPR_SET (val), s, 0);
826     }
827 }
828
829
830 void
831 debug_value_expressions (tree val)
832 {
833   print_value_expressions (stderr, val);
834 }
835
836   
837 void debug_value_set (value_set_t, const char *, int);
838
839 void
840 debug_value_set (value_set_t set, const char *setname, int blockindex)
841 {
842   print_value_set (stderr, set, setname, blockindex);
843 }
844
845 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
846    the phis in PRED.  Return NULL if we can't find a leader for each
847    part of the translated expression.  */
848
849 static tree
850 phi_translate (tree expr, value_set_t set, basic_block pred,
851                basic_block phiblock)
852 {
853   tree phitrans = NULL;
854   tree oldexpr = expr;
855   
856   if (expr == NULL)
857     return NULL;
858
859   if (is_gimple_min_invariant (expr))
860     return expr;
861
862   /* Phi translations of a given expression don't change.  */
863   phitrans = phi_trans_lookup (expr, pred);
864   if (phitrans)
865     return phitrans;
866   
867   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
868     {
869     case tcc_reference:
870       /* XXX: Until we have PRE of loads working, none will be ANTIC.  */
871       return NULL;
872
873     case tcc_binary:
874       {
875         tree oldop1 = TREE_OPERAND (expr, 0);
876         tree oldop2 = TREE_OPERAND (expr, 1);
877         tree newop1;
878         tree newop2;
879         tree newexpr;
880         
881         newop1 = phi_translate (find_leader (set, oldop1),
882                                 set, pred, phiblock);
883         if (newop1 == NULL)
884           return NULL;
885         newop2 = phi_translate (find_leader (set, oldop2),
886                                 set, pred, phiblock);
887         if (newop2 == NULL)
888           return NULL;
889         if (newop1 != oldop1 || newop2 != oldop2)
890           {
891             newexpr = pool_alloc (binary_node_pool);
892             memcpy (newexpr, expr, tree_size (expr));
893             create_tree_ann (newexpr);
894             TREE_OPERAND (newexpr, 0) = newop1 == oldop1 ? oldop1 : get_value_handle (newop1);
895             TREE_OPERAND (newexpr, 1) = newop2 == oldop2 ? oldop2 : get_value_handle (newop2);
896             vn_lookup_or_add (newexpr, NULL);
897             expr = newexpr;
898             phi_trans_add (oldexpr, newexpr, pred);         
899           }
900       }
901       return expr;
902
903     case tcc_unary:
904       {
905         tree oldop1 = TREE_OPERAND (expr, 0);
906         tree newop1;
907         tree newexpr;
908
909         newop1 = phi_translate (find_leader (set, oldop1),
910                                 set, pred, phiblock);
911         if (newop1 == NULL)
912           return NULL;
913         if (newop1 != oldop1)
914           {
915             newexpr = pool_alloc (unary_node_pool);
916             memcpy (newexpr, expr, tree_size (expr));
917             create_tree_ann (newexpr);   
918             TREE_OPERAND (newexpr, 0) = get_value_handle (newop1);
919             vn_lookup_or_add (newexpr, NULL);
920             expr = newexpr;
921             phi_trans_add (oldexpr, newexpr, pred);
922           }
923       }
924       return expr;
925
926     case tcc_exceptional:
927       {
928         tree phi = NULL;
929         edge e;
930         gcc_assert (TREE_CODE (expr) == SSA_NAME);
931         if (TREE_CODE (SSA_NAME_DEF_STMT (expr)) == PHI_NODE)
932           phi = SSA_NAME_DEF_STMT (expr);
933         else
934           return expr;
935         
936         e = find_edge (pred, bb_for_stmt (phi));
937         if (e)
938           {
939             if (is_undefined_value (PHI_ARG_DEF (phi, e->dest_idx)))
940               return NULL;
941             vn_lookup_or_add (PHI_ARG_DEF (phi, e->dest_idx), NULL);
942             return PHI_ARG_DEF (phi, e->dest_idx);
943           }
944       }
945       return expr;
946
947     default:
948       gcc_unreachable ();
949     }
950 }
951
952 static void
953 phi_translate_set (value_set_t dest, value_set_t set, basic_block pred,
954                    basic_block phiblock)
955 {
956   value_set_node_t node;
957   for (node = set->head;
958        node;
959        node = node->next)
960     {
961       tree translated;
962       translated = phi_translate (node->expr, set, pred, phiblock);
963       phi_trans_add (node->expr, translated, pred);
964       
965       if (translated != NULL)
966         value_insert_into_set (dest, translated);
967     } 
968 }
969
970 /* Find the leader for a value (i.e., the name representing that
971    value) in a given set, and return it.  Return NULL if no leader is
972    found.  */
973
974 static tree
975 bitmap_find_leader (bitmap_set_t set, tree val)
976 {
977   if (val == NULL)
978     return NULL;
979   
980   if (is_gimple_min_invariant (val))
981     return val;
982   if (bitmap_set_contains_value (set, val))
983     {
984       /* Rather than walk the entire bitmap of expressions, and see
985          whether any of them has the value we are looking for, we look
986          at the reverse mapping, which tells us the set of expressions
987          that have a given value (IE value->expressions with that
988          value) and see if any of those expressions are in our set.
989          The number of expressions per value is usually significantly
990          less than the number of expressions in the set.  In fact, for
991          large testcases, doing it this way is roughly 5-10x faster
992          than walking the bitmap.
993          If this is somehow a significant lose for some cases, we can
994          choose which set to walk based on which set is smaller.  */     
995       value_set_t exprset;
996       value_set_node_t node;
997       exprset = VALUE_HANDLE_EXPR_SET (val);
998       for (node = exprset->head; node; node = node->next)
999         {
1000           if (TREE_CODE (node->expr) == SSA_NAME)
1001             {
1002               if (bitmap_bit_p (set->expressions, 
1003                                 SSA_NAME_VERSION (node->expr)))
1004                 return node->expr;
1005             }
1006         }
1007     }
1008   return NULL;
1009 }
1010
1011         
1012 /* Find the leader for a value (i.e., the name representing that
1013    value) in a given set, and return it.  Return NULL if no leader is
1014    found.  */
1015
1016 static tree
1017 find_leader (value_set_t set, tree val)
1018 {
1019   value_set_node_t node;
1020
1021   if (val == NULL)
1022     return NULL;
1023
1024   /* Constants represent themselves.  */
1025   if (is_gimple_min_invariant (val))
1026     return val;
1027
1028   if (set->length == 0)
1029     return NULL;
1030   
1031   if (value_exists_in_set_bitmap (set, val))
1032     {
1033       for (node = set->head;
1034            node;
1035            node = node->next)
1036         {
1037           if (get_value_handle (node->expr) == val)
1038             return node->expr;
1039         }
1040     }
1041
1042   return NULL;
1043 }
1044
1045 /* Determine if the expression EXPR is valid in SET.  This means that
1046    we have a leader for each part of the expression (if it consists of
1047    values), or the expression is an SSA_NAME.  
1048
1049    NB:  We never should run into a case where we have SSA_NAME +
1050    SSA_NAME or SSA_NAME + value.  The sets valid_in_set is called on,
1051    the ANTIC sets, will only ever have SSA_NAME's or binary value
1052    expression (IE VALUE1 + VALUE2)  */
1053
1054 static bool
1055 valid_in_set (value_set_t set, tree expr)
1056 {
1057   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
1058     {
1059     case tcc_binary:
1060       {
1061         tree op1 = TREE_OPERAND (expr, 0);
1062         tree op2 = TREE_OPERAND (expr, 1);
1063         return set_contains_value (set, op1) && set_contains_value (set, op2);
1064       }
1065
1066     case tcc_unary:
1067       {
1068         tree op1 = TREE_OPERAND (expr, 0);
1069         return set_contains_value (set, op1);
1070       }
1071
1072     case tcc_reference:
1073       /* XXX: Until PRE of loads works, no reference nodes are ANTIC.  */
1074       return false;
1075
1076     case tcc_exceptional:
1077       gcc_assert (TREE_CODE (expr) == SSA_NAME);
1078       return true;
1079
1080     default:
1081       /* No other cases should be encountered.  */
1082       gcc_unreachable (); 
1083    }
1084 }
1085
1086 /* Clean the set of expressions that are no longer valid in SET.  This
1087    means expressions that are made up of values we have no leaders for
1088    in SET.  */
1089
1090 static void
1091 clean (value_set_t set)
1092 {
1093   value_set_node_t node;
1094   value_set_node_t next;
1095   node = set->head;
1096   while (node)
1097     {
1098       next = node->next;
1099       if (!valid_in_set (set, node->expr))      
1100         set_remove (set, node->expr);
1101       node = next;
1102     }
1103 }
1104
1105 DEF_VEC_MALLOC_P (basic_block);
1106 sbitmap has_abnormal_preds;
1107
1108 /* Compute the ANTIC set for BLOCK.
1109
1110    If succs(BLOCK) > 1 then
1111      ANTIC_OUT[BLOCK] = intersection of ANTIC_IN[b] for all succ(BLOCK)
1112    else if succs(BLOCK) == 1 then
1113      ANTIC_OUT[BLOCK] = phi_translate (ANTIC_IN[succ(BLOCK)])
1114
1115    ANTIC_IN[BLOCK] = clean(ANTIC_OUT[BLOCK] U EXP_GEN[BLOCK] - TMP_GEN[BLOCK])
1116
1117    XXX: It would be nice to either write a set_clear, and use it for
1118    ANTIC_OUT, or to mark the antic_out set as deleted at the end
1119    of this routine, so that the pool can hand the same memory back out
1120    again for the next ANTIC_OUT.  */
1121
1122 static bool
1123 compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
1124 {
1125   basic_block son;
1126   bool changed = false;
1127   value_set_t S, old, ANTIC_OUT;
1128   value_set_node_t node;
1129
1130   ANTIC_OUT = S = NULL;
1131
1132   /* If any edges from predecessors are abnormal, antic_in is empty,
1133      so do nothing.  */
1134   if (block_has_abnormal_pred_edge)
1135     goto maybe_dump_sets;
1136
1137   old = set_new (false);
1138   set_copy (old, ANTIC_IN (block));
1139   ANTIC_OUT = set_new (true);
1140
1141   /* If the block has no successors, ANTIC_OUT is empty.  */
1142   if (EDGE_COUNT (block->succs) == 0)
1143     ;
1144   /* If we have one successor, we could have some phi nodes to
1145      translate through.  */
1146   else if (EDGE_COUNT (block->succs) == 1)
1147     {
1148       phi_translate_set (ANTIC_OUT, ANTIC_IN(EDGE_SUCC (block, 0)->dest),
1149                          block, EDGE_SUCC (block, 0)->dest);
1150     }
1151   /* If we have multiple successors, we take the intersection of all of
1152      them.  */
1153   else
1154     {
1155       VEC (basic_block) * worklist;
1156       edge e;
1157       size_t i;
1158       basic_block bprime, first;
1159       edge_iterator ei;
1160
1161       worklist = VEC_alloc (basic_block, 2);
1162       FOR_EACH_EDGE (e, ei, block->succs)
1163         VEC_safe_push (basic_block, worklist, e->dest);
1164       first = VEC_index (basic_block, worklist, 0);
1165       set_copy (ANTIC_OUT, ANTIC_IN (first));
1166
1167       for (i = 1; VEC_iterate (basic_block, worklist, i, bprime); i++)
1168         {
1169           node = ANTIC_OUT->head;
1170           while (node)
1171             {
1172               tree val;
1173               value_set_node_t next = node->next;
1174               val = get_value_handle (node->expr);
1175               if (!set_contains_value (ANTIC_IN (bprime), val))
1176                 set_remove (ANTIC_OUT, node->expr);
1177               node = next;
1178             }
1179         }
1180       VEC_free (basic_block, worklist);
1181     }
1182
1183   /* Generate ANTIC_OUT - TMP_GEN.  */
1184   S = bitmap_set_subtract_from_value_set (ANTIC_OUT, TMP_GEN (block), false);
1185
1186   /* Start ANTIC_IN with EXP_GEN - TMP_GEN */
1187   ANTIC_IN (block) = bitmap_set_subtract_from_value_set (EXP_GEN (block), 
1188                                                          TMP_GEN (block),
1189                                                          true);
1190
1191   /* Then union in the ANTIC_OUT - TMP_GEN values,
1192      to get ANTIC_OUT U EXP_GEN - TMP_GEN */
1193   for (node = S->head; node; node = node->next)
1194     value_insert_into_set (ANTIC_IN (block), node->expr);
1195
1196   clean (ANTIC_IN (block));
1197   if (!set_equal (old, ANTIC_IN (block)))
1198     changed = true;
1199
1200  maybe_dump_sets:
1201   if (dump_file && (dump_flags & TDF_DETAILS))
1202     {
1203       if (ANTIC_OUT)
1204         print_value_set (dump_file, ANTIC_OUT, "ANTIC_OUT", block->index);
1205       print_value_set (dump_file, ANTIC_IN (block), "ANTIC_IN", block->index);
1206       if (S)
1207         print_value_set (dump_file, S, "S", block->index);
1208     }
1209
1210   for (son = first_dom_son (CDI_POST_DOMINATORS, block);
1211        son;
1212        son = next_dom_son (CDI_POST_DOMINATORS, son))
1213     {
1214       changed |= compute_antic_aux (son,
1215                                     TEST_BIT (has_abnormal_preds, son->index));
1216     }
1217   return changed;
1218 }
1219
1220 /* Compute ANTIC sets.  */
1221
1222 static void
1223 compute_antic (void)
1224 {
1225   bool changed = true;
1226   int num_iterations = 0;
1227   basic_block block;
1228
1229   /* If any predecessor edges are abnormal, we punt, so antic_in is empty.
1230      We pre-build the map of blocks with incoming abnormal edges here.  */
1231   has_abnormal_preds = sbitmap_alloc (last_basic_block);
1232   sbitmap_zero (has_abnormal_preds);
1233   FOR_EACH_BB (block)
1234     {
1235       edge_iterator ei;
1236       edge e;
1237
1238       FOR_EACH_EDGE (e, ei, block->preds)
1239         if (e->flags & EDGE_ABNORMAL)
1240           {
1241             SET_BIT (has_abnormal_preds, block->index);
1242             break;
1243           }
1244
1245       /* While we are here, give empty ANTIC_IN sets to each block.  */
1246       ANTIC_IN (block) = set_new (true);
1247     }
1248   /* At the exit block we anticipate nothing.  */
1249   ANTIC_IN (EXIT_BLOCK_PTR) = set_new (true);
1250
1251   while (changed)
1252     {
1253       num_iterations++;
1254       changed = false;
1255       changed = compute_antic_aux (EXIT_BLOCK_PTR, false);
1256     }
1257
1258   sbitmap_free (has_abnormal_preds);
1259
1260   if (dump_file && (dump_flags & TDF_STATS))
1261     fprintf (dump_file, "compute_antic required %d iterations\n", num_iterations);
1262 }
1263
1264 static VEC(tree_on_heap) *inserted_exprs;
1265 /* Find a leader for an expression, or generate one using
1266    create_expression_by_pieces if it's ANTIC but
1267    complex.  
1268    BLOCK is the basic_block we are looking for leaders in.
1269    EXPR is the expression to find a leader or generate for. 
1270    STMTS is the statement list to put the inserted expressions on.
1271    Returns the SSA_NAME of the LHS of the generated expression or the
1272    leader.  */
1273
1274 static tree
1275 find_or_generate_expression (basic_block block, tree expr, tree stmts)
1276 {
1277   tree genop = bitmap_find_leader (AVAIL_OUT (block), expr);
1278
1279   /* If it's still NULL, see if it is a complex expression, and if
1280      so, generate it recursively, otherwise, abort, because it's
1281      not really .  */
1282   if (genop == NULL)
1283     {
1284       genop = VALUE_HANDLE_EXPR_SET (expr)->head->expr;
1285       gcc_assert (UNARY_CLASS_P (genop)
1286                   || BINARY_CLASS_P (genop)
1287                   || REFERENCE_CLASS_P (genop));
1288       genop = create_expression_by_pieces (block, genop, stmts);
1289     }
1290   return genop;
1291 }
1292
1293 #define NECESSARY(stmt)         stmt->common.asm_written_flag  
1294 /* Create an expression in pieces, so that we can handle very complex
1295    expressions that may be ANTIC, but not necessary GIMPLE.  
1296    BLOCK is the basic block the expression will be inserted into,
1297    EXPR is the expression to insert (in value form)
1298    STMTS is a statement list to append the necessary insertions into.
1299
1300    This function will abort if we hit some value that shouldn't be
1301    ANTIC but is (IE there is no leader for it, or its components).
1302    This function may also generate expressions that are themselves
1303    partially or fully redundant.  Those that are will be either made
1304    fully redundant during the next iteration of insert (for partially
1305    redundant ones), or eliminated by eliminate (for fully redundant
1306    ones).  */
1307
1308 static tree
1309 create_expression_by_pieces (basic_block block, tree expr, tree stmts)
1310 {
1311   tree name = NULL_TREE;
1312   tree newexpr = NULL_TREE;
1313   tree v;
1314   
1315   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
1316     {
1317     case tcc_binary:
1318       {
1319         tree_stmt_iterator tsi;
1320         tree forced_stmts;
1321         tree genop1, genop2;
1322         tree temp;
1323         tree folded;
1324         tree op1 = TREE_OPERAND (expr, 0);
1325         tree op2 = TREE_OPERAND (expr, 1);
1326         genop1 = find_or_generate_expression (block, op1, stmts);
1327         genop2 = find_or_generate_expression (block, op2, stmts);
1328         temp = create_tmp_var (TREE_TYPE (expr), "pretmp");
1329         add_referenced_tmp_var (temp);
1330         
1331         folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), 
1332                               genop1, genop2));
1333         newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
1334         if (forced_stmts)
1335           {
1336             tsi = tsi_start (forced_stmts);
1337             for (; !tsi_end_p (tsi); tsi_next (&tsi))
1338               {
1339                 tree stmt = tsi_stmt (tsi);
1340                 tree forcedname = TREE_OPERAND (stmt, 0);
1341                 tree forcedexpr = TREE_OPERAND (stmt, 1);
1342                 tree val = vn_lookup_or_add (forcedexpr, NULL);
1343                 vn_add (forcedname, val, NULL);         
1344                 bitmap_value_replace_in_set (NEW_SETS (block), forcedname); 
1345                 bitmap_value_replace_in_set (AVAIL_OUT (block), forcedname);
1346               }
1347
1348             tsi = tsi_last (stmts);
1349             tsi_link_after (&tsi, forced_stmts, TSI_CONTINUE_LINKING);
1350           }
1351         newexpr = build (MODIFY_EXPR, TREE_TYPE (expr),
1352                          temp, newexpr);
1353         NECESSARY (newexpr) = 0;
1354         name = make_ssa_name (temp, newexpr);
1355         TREE_OPERAND (newexpr, 0) = name;
1356         tsi = tsi_last (stmts);
1357         tsi_link_after (&tsi, newexpr, TSI_CONTINUE_LINKING);
1358         VEC_safe_push (tree_on_heap, inserted_exprs, newexpr);
1359         pre_stats.insertions++;
1360         break;
1361       }
1362     case tcc_unary:
1363       {
1364         tree_stmt_iterator tsi;
1365         tree forced_stmts = NULL;
1366         tree genop1;
1367         tree temp;
1368         tree folded;
1369         tree op1 = TREE_OPERAND (expr, 0);
1370         genop1 = find_or_generate_expression (block, op1, stmts);
1371         temp = create_tmp_var (TREE_TYPE (expr), "pretmp");
1372         add_referenced_tmp_var (temp);
1373         folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), 
1374                               genop1));
1375         /* If the generated operand  is already GIMPLE min_invariant
1376            just use it instead of calling force_gimple_operand on it,
1377            since that may make it not invariant by copying it into an
1378            assignment.  */
1379         if (!is_gimple_min_invariant (genop1))
1380           newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
1381         else
1382           newexpr = genop1;
1383         if (forced_stmts)
1384           {
1385             tsi = tsi_start (forced_stmts);
1386             for (; !tsi_end_p (tsi); tsi_next (&tsi))
1387               {
1388                 tree stmt = tsi_stmt (tsi);
1389                 tree forcedname = TREE_OPERAND (stmt, 0);
1390                 tree forcedexpr = TREE_OPERAND (stmt, 1);
1391                 tree val = vn_lookup_or_add (forcedexpr, NULL);
1392                 vn_add (forcedname, val, NULL);         
1393                 bitmap_value_replace_in_set (NEW_SETS (block), forcedname); 
1394                 bitmap_value_replace_in_set (AVAIL_OUT (block), forcedname);
1395               }
1396             tsi = tsi_last (stmts);
1397             tsi_link_after (&tsi, forced_stmts, TSI_CONTINUE_LINKING);
1398           }
1399         newexpr = build (MODIFY_EXPR, TREE_TYPE (expr),
1400                          temp, newexpr);
1401         name = make_ssa_name (temp, newexpr);
1402         TREE_OPERAND (newexpr, 0) = name;
1403         NECESSARY (newexpr) = 0;
1404         tsi = tsi_last (stmts);
1405         tsi_link_after (&tsi, newexpr, TSI_CONTINUE_LINKING);
1406         VEC_safe_push (tree_on_heap, inserted_exprs, newexpr);
1407         pre_stats.insertions++;
1408
1409         break;
1410       }
1411     default:
1412       gcc_unreachable ();
1413       
1414     }
1415   v = get_value_handle (expr);
1416   vn_add (name, v, NULL);
1417
1418   /* The value may already exist in either NEW_SETS, or AVAIL_OUT, because
1419      we are creating the expression by pieces, and this particular piece of
1420      the expression may have been represented.  There is no harm in replacing
1421      here.  */
1422   bitmap_value_replace_in_set (NEW_SETS (block), name); 
1423   bitmap_value_replace_in_set (AVAIL_OUT (block), name);
1424   if (dump_file && (dump_flags & TDF_DETAILS))
1425     {                               
1426       fprintf (dump_file, "Inserted ");
1427       print_generic_expr (dump_file, newexpr, 0);
1428       fprintf (dump_file, " in predecessor %d\n", block->index);
1429     }
1430   return name;
1431 }
1432
1433 /* Return the folded version of T if T, when folded, is a gimple
1434    min_invariant.  Otherwise, return T. */ 
1435
1436 static tree
1437 fully_constant_expression (tree t)
1438 {  
1439   tree folded;
1440   folded = fold (t);
1441   if (folded && is_gimple_min_invariant (folded))
1442     return folded;
1443   return t;
1444 }
1445
1446 /* Insert the to-be-made-available values of NODE for each predecessor, stored
1447    in AVAIL, into the predecessors of BLOCK, and merge the result with a phi
1448    node, given the same value handle as NODE.  The prefix of the phi node is
1449    given with TMPNAME.  Return true if we have inserted new stuff.  */
1450
1451 static bool
1452 insert_into_preds_of_block (basic_block block, value_set_node_t node,
1453                             tree *avail, const char *tmpname)
1454 {
1455   tree val = get_value_handle (node->expr);
1456   edge pred;
1457   bool insertions = false;
1458   bool nophi = false;
1459   basic_block bprime;
1460   tree eprime;
1461   edge_iterator ei;
1462   tree type = TREE_TYPE (avail[EDGE_PRED (block, 0)->src->index]);
1463   tree temp;
1464   
1465   if (dump_file && (dump_flags & TDF_DETAILS))
1466     {
1467       fprintf (dump_file, "Found partial redundancy for expression ");
1468       print_generic_expr (dump_file, node->expr, 0);
1469       fprintf (dump_file, "\n");
1470     }
1471
1472   /* Make sure we aren't creating an induction variable.  */
1473   if (block->loop_depth > 0 && EDGE_COUNT (block->preds) == 2)
1474     {
1475       bool firstinsideloop = false;
1476       bool secondinsideloop = false;
1477       firstinsideloop = flow_bb_inside_loop_p (block->loop_father, 
1478                                                EDGE_PRED (block, 0)->src);
1479       secondinsideloop = flow_bb_inside_loop_p (block->loop_father,
1480                                                 EDGE_PRED (block, 1)->src);
1481       /* Induction variables only have one edge inside the loop.  */
1482       if (firstinsideloop ^ secondinsideloop)
1483         {
1484           if (dump_file && (dump_flags & TDF_DETAILS))
1485             fprintf (dump_file, "Skipping insertion of phi for partial redundancy: Looks like an induction variable\n");
1486           nophi = true;
1487         }
1488     }
1489           
1490
1491   /* Make the necessary insertions.  */
1492   FOR_EACH_EDGE (pred, ei, block->preds)
1493     {
1494       tree stmts = alloc_stmt_list ();
1495       tree builtexpr;
1496       bprime = pred->src;
1497       eprime = avail[bprime->index];
1498       if (BINARY_CLASS_P (eprime)
1499           || UNARY_CLASS_P (eprime))
1500         {
1501           builtexpr = create_expression_by_pieces (bprime,
1502                                                    eprime,
1503                                                    stmts);
1504           bsi_insert_on_edge (pred, stmts);
1505           avail[bprime->index] = builtexpr;
1506           insertions = true;
1507         }                             
1508     }
1509   /* If we didn't want a phi node, and we made insertions, we still have
1510      inserted new stuff, and thus return true.  If we didn't want a phi node,
1511      and didn't make insertions, we haven't added anything new, so return
1512      false.  */
1513   if (nophi && insertions)
1514     return true;
1515   else if (nophi && !insertions)
1516     return false;
1517
1518   /* Now build a phi for the new variable.  */
1519   temp = create_tmp_var (type, tmpname);
1520   add_referenced_tmp_var (temp);
1521   temp = create_phi_node (temp, block);
1522   NECESSARY (temp) = 0; 
1523   VEC_safe_push (tree_on_heap, inserted_exprs, temp);
1524   FOR_EACH_EDGE (pred, ei, block->preds)
1525     add_phi_arg (temp, avail[pred->src->index], pred);
1526   
1527   vn_add (PHI_RESULT (temp), val, NULL);
1528   
1529   /* The value should *not* exist in PHI_GEN, or else we wouldn't be doing
1530      this insertion, since we test for the existence of this value in PHI_GEN
1531      before proceeding with the partial redundancy checks in insert_aux.
1532      
1533      The value may exist in AVAIL_OUT, in particular, it could be represented
1534      by the expression we are trying to eliminate, in which case we want the
1535      replacement to occur.  If it's not existing in AVAIL_OUT, we want it
1536      inserted there.
1537      
1538      Similarly, to the PHI_GEN case, the value should not exist in NEW_SETS of
1539      this block, because if it did, it would have existed in our dominator's
1540      AVAIL_OUT, and would have been skipped due to the full redundancy check.
1541   */
1542
1543   bitmap_insert_into_set (PHI_GEN (block),
1544                           PHI_RESULT (temp));
1545   bitmap_value_replace_in_set (AVAIL_OUT (block), 
1546                                PHI_RESULT (temp));
1547   bitmap_insert_into_set (NEW_SETS (block),
1548                           PHI_RESULT (temp));
1549   
1550   if (dump_file && (dump_flags & TDF_DETAILS))
1551     {
1552       fprintf (dump_file, "Created phi ");
1553       print_generic_expr (dump_file, temp, 0);
1554       fprintf (dump_file, " in block %d\n", block->index);
1555     }
1556   pre_stats.phis++;
1557   return true;
1558 }
1559
1560
1561       
1562 /* Perform insertion of partially redundant values.
1563    For BLOCK, do the following:
1564    1.  Propagate the NEW_SETS of the dominator into the current block.
1565    If the block has multiple predecessors, 
1566        2a. Iterate over the ANTIC expressions for the block to see if
1567            any of them are partially redundant.
1568        2b. If so, insert them into the necessary predecessors to make
1569            the expression fully redundant.
1570        2c. Insert a new PHI merging the values of the predecessors.
1571        2d. Insert the new PHI, and the new expressions, into the
1572            NEW_SETS set.  
1573    3. Recursively call ourselves on the dominator children of BLOCK.
1574
1575 */
1576
1577 static bool
1578 insert_aux (basic_block block)
1579 {
1580   basic_block son;
1581   bool new_stuff = false;
1582
1583   if (block)
1584     {
1585       basic_block dom;
1586       dom = get_immediate_dominator (CDI_DOMINATORS, block);
1587       if (dom)
1588         {
1589           unsigned i;
1590           bitmap_iterator bi;
1591           bitmap_set_t newset = NEW_SETS (dom);
1592           if (newset)
1593             {
1594               /* Note that we need to value_replace both NEW_SETS, and
1595                  AVAIL_OUT. For both the case of NEW_SETS, the value may be
1596                  represented by some non-simple expression here that we want
1597                  to replace it with.  */
1598               EXECUTE_IF_SET_IN_BITMAP (newset->expressions, 0, i, bi)
1599                 {
1600                   bitmap_value_replace_in_set (NEW_SETS (block), ssa_name (i));
1601                   bitmap_value_replace_in_set (AVAIL_OUT (block), ssa_name (i));
1602                 }
1603             }
1604           if (EDGE_COUNT (block->preds) > 1)
1605             {
1606               value_set_node_t node;
1607               for (node = ANTIC_IN (block)->head;
1608                    node;
1609                    node = node->next)
1610                 {
1611                   if (BINARY_CLASS_P (node->expr)
1612                       || UNARY_CLASS_P (node->expr))
1613                     {
1614                       tree *avail;
1615                       tree val;
1616                       bool by_some = false;
1617                       bool cant_insert = false;
1618                       bool all_same = true;
1619                       tree first_s = NULL;
1620                       edge pred;
1621                       basic_block bprime;
1622                       tree eprime = NULL_TREE;
1623                       edge_iterator ei;
1624
1625                       val = get_value_handle (node->expr);
1626                       if (bitmap_set_contains_value (PHI_GEN (block), val))
1627                         continue; 
1628                       if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
1629                         {
1630                           if (dump_file && (dump_flags & TDF_DETAILS))
1631                             fprintf (dump_file, "Found fully redundant value\n");
1632                           continue;
1633                         }
1634                                               
1635                       avail = xcalloc (last_basic_block, sizeof (tree));
1636                       FOR_EACH_EDGE (pred, ei, block->preds)
1637                         {
1638                           tree vprime;
1639                           tree edoubleprime;
1640
1641                           /* This can happen in the very weird case
1642                              that our fake infinite loop edges have caused a
1643                              critical edge to appear.  */
1644                           if (EDGE_CRITICAL_P (pred))
1645                             {
1646                               cant_insert = true;
1647                               break;
1648                             }
1649                           bprime = pred->src;
1650                           eprime = phi_translate (node->expr,
1651                                                   ANTIC_IN (block),
1652                                                   bprime, block);
1653
1654                           /* eprime will generally only be NULL if the
1655                              value of the expression, translated
1656                              through the PHI for this predecessor, is
1657                              undefined.  If that is the case, we can't
1658                              make the expression fully redundant,
1659                              because its value is undefined along a
1660                              predecessor path.  We can thus break out
1661                              early because it doesn't matter what the
1662                              rest of the results are.  */
1663                           if (eprime == NULL)
1664                             {
1665                               cant_insert = true;
1666                               break;
1667                             }
1668
1669                           eprime = fully_constant_expression (eprime);
1670                           vprime = get_value_handle (eprime);
1671                           gcc_assert (vprime);
1672                           edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
1673                                                              vprime);
1674                           if (edoubleprime == NULL)
1675                             {
1676                               avail[bprime->index] = eprime;
1677                               all_same = false;
1678                             }
1679                           else
1680                             {
1681                               avail[bprime->index] = edoubleprime;
1682                               by_some = true; 
1683                               if (first_s == NULL)
1684                                 first_s = edoubleprime;
1685                               else if (!operand_equal_p (first_s, edoubleprime,
1686                                                          0))
1687                                 all_same = false;
1688                             }
1689                         }
1690                       /* If we can insert it, it's not the same value
1691                          already existing along every predecessor, and
1692                          it's defined by some predecessor, it is
1693                          partially redundant.  */
1694                       if (!cant_insert && !all_same && by_some)
1695                         {
1696                           if (insert_into_preds_of_block (block, node, avail, 
1697                                                           "prephitmp"))
1698                             new_stuff = true;
1699                         }
1700                       /* If all edges produce the same value and that value is
1701                          an invariant, then the PHI has the same value on all
1702                          edges.  Note this.  */
1703                       else if (!cant_insert && all_same && eprime 
1704                                && is_gimple_min_invariant (eprime)
1705                                && !is_gimple_min_invariant (val))
1706                         {
1707                           value_set_t exprset = VALUE_HANDLE_EXPR_SET (val);
1708                           value_set_node_t node;
1709                           for (node = exprset->head; node; node = node->next)
1710                             {
1711                               if (TREE_CODE (node->expr) == SSA_NAME)
1712                                 {                                 
1713                                   vn_add (node->expr, eprime, NULL);
1714                                   pre_stats.constified++;
1715                                 }
1716                             }
1717                         }
1718                       free (avail);
1719                     }
1720                 }
1721             }
1722         }
1723     }
1724   for (son = first_dom_son (CDI_DOMINATORS, block);
1725        son;
1726        son = next_dom_son (CDI_DOMINATORS, son))
1727     {
1728       new_stuff |= insert_aux (son);
1729     }
1730
1731   return new_stuff;
1732 }
1733
1734 /* Perform insertion of partially redundant values.  */
1735
1736 static void
1737 insert (void)
1738 {
1739   bool new_stuff = true;
1740   basic_block bb;
1741   int num_iterations = 0;
1742   
1743   FOR_ALL_BB (bb)
1744     NEW_SETS (bb) = bitmap_set_new ();
1745   
1746   while (new_stuff)
1747     {
1748       num_iterations++;
1749       new_stuff = false;
1750       new_stuff = insert_aux (ENTRY_BLOCK_PTR);
1751     }
1752   if (num_iterations > 2 && dump_file && (dump_flags & TDF_STATS))
1753     fprintf (dump_file, "insert required %d iterations\n", num_iterations);
1754 }
1755
1756
1757 /* Return true if VAR is an SSA variable with no defining statement in
1758    this procedure, *AND* isn't a live-on-entry parameter.  */
1759
1760 static bool
1761 is_undefined_value (tree expr)
1762 {
1763   return (TREE_CODE (expr) == SSA_NAME
1764           && IS_EMPTY_STMT (SSA_NAME_DEF_STMT (expr))
1765           /* PARM_DECLs and hard registers are always defined.  */
1766           && TREE_CODE (SSA_NAME_VAR (expr)) != PARM_DECL);
1767 }
1768
1769
1770 /* Given an SSA variable VAR and an expression EXPR, compute the value
1771    number for EXPR and create a value handle (VAL) for it.  If VAR and
1772    EXPR are not the same, associate VAL with VAR.  Finally, add VAR to
1773    S1 and its value handle to S2.
1774
1775    VUSES represent the virtual use operands associated with EXPR (if
1776    any). They are used when computing the hash value for EXPR.  */
1777
1778 static inline void
1779 add_to_sets (tree var, tree expr, vuse_optype vuses, bitmap_set_t s1,
1780              bitmap_set_t s2)
1781 {
1782   tree val = vn_lookup_or_add (expr, vuses);
1783
1784   /* VAR and EXPR may be the same when processing statements for which
1785      we are not computing value numbers (e.g., non-assignments, or
1786      statements that make aliased stores).  In those cases, we are
1787      only interested in making VAR available as its own value.  */
1788   if (var != expr)
1789     vn_add (var, val, NULL);
1790
1791   if (s1)
1792     bitmap_insert_into_set (s1, var);
1793   bitmap_value_insert_into_set (s2, var);
1794 }
1795
1796
1797 /* Given a unary or binary expression EXPR, create and return a new
1798    expression with the same structure as EXPR but with its operands
1799    replaced with the value handles of each of the operands of EXPR.
1800    Insert EXPR's operands into the EXP_GEN set for BLOCK.
1801
1802    VUSES represent the virtual use operands associated with EXPR (if
1803    any). They are used when computing the hash value for EXPR.  */
1804
1805 static inline tree
1806 create_value_expr_from (tree expr, basic_block block, vuse_optype vuses)
1807 {
1808   int i;
1809   enum tree_code code = TREE_CODE (expr);
1810   tree vexpr;
1811
1812   gcc_assert (TREE_CODE_CLASS (code) == tcc_unary
1813               || TREE_CODE_CLASS (code) == tcc_binary
1814               || TREE_CODE_CLASS (code) == tcc_reference);
1815
1816   if (TREE_CODE_CLASS (code) == tcc_unary)
1817     vexpr = pool_alloc (unary_node_pool);
1818   else if (TREE_CODE_CLASS (code) == tcc_reference)
1819     vexpr = pool_alloc (reference_node_pool);
1820   else
1821     vexpr = pool_alloc (binary_node_pool);
1822
1823   memcpy (vexpr, expr, tree_size (expr));
1824
1825   for (i = 0; i < TREE_CODE_LENGTH (code); i++)
1826     {
1827       tree op = TREE_OPERAND (expr, i);
1828       if (op != NULL)
1829         {
1830           tree val = vn_lookup_or_add (op, vuses);
1831           if (!is_undefined_value (op))
1832             value_insert_into_set (EXP_GEN (block), op);
1833           if (TREE_CODE (val) == VALUE_HANDLE)
1834             TREE_TYPE (val) = TREE_TYPE (TREE_OPERAND (vexpr, i));
1835           TREE_OPERAND (vexpr, i) = val;
1836         }
1837     }
1838
1839   return vexpr;
1840 }
1841
1842
1843 /* Compute the AVAIL set for all basic blocks.
1844
1845    This function performs value numbering of the statements in each basic
1846    block.  The AVAIL sets are built from information we glean while doing
1847    this value numbering, since the AVAIL sets contain only one entry per
1848    value.
1849    
1850    AVAIL_IN[BLOCK] = AVAIL_OUT[dom(BLOCK)].
1851    AVAIL_OUT[BLOCK] = AVAIL_IN[BLOCK] U PHI_GEN[BLOCK] U TMP_GEN[BLOCK].  */
1852
1853 static void
1854 compute_avail (void)
1855 {
1856   basic_block block, son;
1857   basic_block *worklist;
1858   size_t sp = 0;
1859   tree param;
1860
1861   /* For arguments with default definitions, we pretend they are
1862      defined in the entry block.  */
1863   for (param = DECL_ARGUMENTS (current_function_decl);
1864        param;
1865        param = TREE_CHAIN (param))
1866     {
1867       if (default_def (param) != NULL)
1868         {
1869           tree val;
1870           tree def = default_def (param);
1871           val = vn_lookup_or_add (def, NULL);
1872           bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), def);
1873           bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), def);
1874         }
1875     }
1876
1877   /* Allocate the worklist.  */
1878   worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
1879
1880   /* Seed the algorithm by putting the dominator children of the entry
1881      block on the worklist.  */
1882   for (son = first_dom_son (CDI_DOMINATORS, ENTRY_BLOCK_PTR);
1883        son;
1884        son = next_dom_son (CDI_DOMINATORS, son))
1885     worklist[sp++] = son;
1886
1887   /* Loop until the worklist is empty.  */
1888   while (sp)
1889     {
1890       block_stmt_iterator bsi;
1891       tree stmt, phi;
1892       basic_block dom;
1893
1894       /* Pick a block from the worklist.  */
1895       block = worklist[--sp];
1896
1897       /* Initially, the set of available values in BLOCK is that of
1898          its immediate dominator.  */
1899       dom = get_immediate_dominator (CDI_DOMINATORS, block);
1900       if (dom)
1901         bitmap_set_copy (AVAIL_OUT (block), AVAIL_OUT (dom));
1902
1903       /* Generate values for PHI nodes.  */
1904       for (phi = phi_nodes (block); phi; phi = PHI_CHAIN (phi))
1905         /* We have no need for virtual phis, as they don't represent
1906            actual computations.  */
1907         if (is_gimple_reg (PHI_RESULT (phi)))
1908           add_to_sets (PHI_RESULT (phi), PHI_RESULT (phi), NULL,
1909                        PHI_GEN (block), AVAIL_OUT (block));
1910
1911       /* Now compute value numbers and populate value sets with all
1912          the expressions computed in BLOCK.  */
1913       for (bsi = bsi_start (block); !bsi_end_p (bsi); bsi_next (&bsi))
1914         {
1915           stmt_ann_t ann;
1916           size_t j;
1917
1918           stmt = bsi_stmt (bsi);
1919           ann = stmt_ann (stmt);
1920           get_stmt_operands (stmt);
1921
1922           /* We are only interested in assignments of the form
1923              X_i = EXPR, where EXPR represents an "interesting"
1924              computation, it has no volatile operands and X_i
1925              doesn't flow through an abnormal edge.  */
1926           if (TREE_CODE (stmt) == MODIFY_EXPR
1927               && !ann->has_volatile_ops
1928               && TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME
1929               && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (stmt, 0)))
1930             {
1931               tree lhs = TREE_OPERAND (stmt, 0);
1932               tree rhs = TREE_OPERAND (stmt, 1);
1933               vuse_optype vuses = STMT_VUSE_OPS (stmt);
1934
1935               STRIP_USELESS_TYPE_CONVERSION (rhs);
1936               if (TREE_CODE (rhs) == SSA_NAME
1937                   || is_gimple_min_invariant (rhs))
1938                 {
1939                   /* Compute a value number for the RHS of the statement
1940                      and add its value to the AVAIL_OUT set for the block.
1941                      Add the LHS to TMP_GEN.  */
1942                   add_to_sets (lhs, rhs, vuses, TMP_GEN (block), 
1943                                AVAIL_OUT (block));
1944                   
1945                   if (TREE_CODE (rhs) == SSA_NAME
1946                       && !is_undefined_value (rhs))
1947                     value_insert_into_set (EXP_GEN (block), rhs);
1948                   continue;
1949                 }          
1950               else if (UNARY_CLASS_P (rhs) || BINARY_CLASS_P (rhs)
1951                        || TREE_CODE (rhs) == INDIRECT_REF)
1952                 {
1953                   /* For binary, unary, and reference expressions,
1954                      create a duplicate expression with the operands
1955                      replaced with the value handles of the original
1956                      RHS.  */
1957                   tree newt = create_value_expr_from (rhs, block, vuses);
1958                   add_to_sets (lhs, newt, vuses, TMP_GEN (block),
1959                                AVAIL_OUT (block));
1960                   value_insert_into_set (EXP_GEN (block), newt);
1961                   continue;
1962                 }
1963             }
1964
1965           /* For any other statement that we don't recognize, simply
1966              make the names generated by the statement available in
1967              AVAIL_OUT and TMP_GEN.  */
1968           for (j = 0; j < NUM_DEFS (STMT_DEF_OPS (stmt)); j++)
1969             {
1970               tree def = DEF_OP (STMT_DEF_OPS (stmt), j);
1971               add_to_sets (def, def, NULL, TMP_GEN (block),
1972                             AVAIL_OUT (block));
1973             }
1974
1975           for (j = 0; j < NUM_USES (STMT_USE_OPS (stmt)); j++)
1976             {
1977               tree use = USE_OP (STMT_USE_OPS (stmt), j);
1978               add_to_sets (use, use, NULL, NULL, AVAIL_OUT (block));
1979             }
1980         }
1981
1982       /* Put the dominator children of BLOCK on the worklist of blocks
1983          to compute available sets for.  */
1984       for (son = first_dom_son (CDI_DOMINATORS, block);
1985            son;
1986            son = next_dom_son (CDI_DOMINATORS, son))
1987         worklist[sp++] = son;
1988     }
1989
1990   free (worklist);
1991 }
1992
1993
1994 /* Eliminate fully redundant computations.  */
1995
1996 static void
1997 eliminate (void)
1998 {
1999   basic_block b;
2000
2001   FOR_EACH_BB (b)
2002     {
2003       block_stmt_iterator i;
2004       
2005       for (i = bsi_start (b); !bsi_end_p (i); bsi_next (&i))
2006         {
2007           tree stmt = bsi_stmt (i);
2008
2009           /* Lookup the RHS of the expression, see if we have an
2010              available computation for it.  If so, replace the RHS with
2011              the available computation.  */
2012           if (TREE_CODE (stmt) == MODIFY_EXPR
2013               && TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME
2014               && TREE_CODE (TREE_OPERAND (stmt ,1)) != SSA_NAME
2015               && !is_gimple_min_invariant (TREE_OPERAND (stmt, 1))
2016               && !stmt_ann (stmt)->has_volatile_ops)
2017             {
2018               tree lhs = TREE_OPERAND (stmt, 0);
2019               tree *rhs_p = &TREE_OPERAND (stmt, 1);
2020               tree sprime;
2021
2022               sprime = bitmap_find_leader (AVAIL_OUT (b),
2023                                            vn_lookup (lhs, NULL));
2024               if (sprime 
2025                   && sprime != lhs
2026                   && (TREE_CODE (*rhs_p) != SSA_NAME
2027                       || may_propagate_copy (*rhs_p, sprime)))
2028                 {
2029                   gcc_assert (sprime != *rhs_p);
2030
2031                   if (dump_file && (dump_flags & TDF_DETAILS))
2032                     {
2033                       fprintf (dump_file, "Replaced ");
2034                       print_generic_expr (dump_file, *rhs_p, 0);
2035                       fprintf (dump_file, " with ");
2036                       print_generic_expr (dump_file, sprime, 0);
2037                       fprintf (dump_file, " in ");
2038                       print_generic_stmt (dump_file, stmt, 0);
2039                     }
2040                   if (TREE_CODE (sprime) == SSA_NAME) 
2041                     NECESSARY (SSA_NAME_DEF_STMT (sprime)) = 1;
2042                   pre_stats.eliminations++;
2043                   propagate_tree_value (rhs_p, sprime);
2044                   modify_stmt (stmt);
2045
2046                   /* If we removed EH side effects from the statement, clean
2047                      its EH information.  */
2048                   if (maybe_clean_eh_stmt (stmt))
2049                     {
2050                       bitmap_set_bit (need_eh_cleanup,
2051                                       bb_for_stmt (stmt)->index);
2052                       if (dump_file && (dump_flags & TDF_DETAILS))
2053                         fprintf (dump_file, "  Removed EH side effects.\n");
2054                     }
2055                 }
2056             }
2057         }
2058     }
2059 }
2060
2061 /* Borrow a bit of tree-ssa-dce.c for the moment.
2062    XXX: In 4.1, we should be able to just run a DCE pass after PRE, though
2063    this may be a bit faster, and we may want critical edges kept split.  */
2064
2065 /* If OP's defining statement has not already been determined to be necessary,
2066    mark that statement necessary. and place it on the WORKLIST.  */ 
2067
2068 static inline void
2069 mark_operand_necessary (tree op, VEC(tree_on_heap) **worklist)
2070 {
2071   tree stmt;
2072   int ver;
2073
2074   gcc_assert (op);
2075
2076   ver = SSA_NAME_VERSION (op);
2077
2078   stmt = SSA_NAME_DEF_STMT (op);
2079   gcc_assert (stmt);
2080
2081   if (NECESSARY (stmt)
2082       || IS_EMPTY_STMT (stmt))
2083     return;
2084
2085   NECESSARY (stmt) = 1;
2086   VEC_safe_push (tree_on_heap, *worklist, stmt);
2087 }
2088
2089 /* Because we don't follow exactly the standard PRE algorithm, and decide not
2090    to insert PHI nodes sometimes, and because value numbering of casts isn't
2091    perfect, we sometimes end up inserting dead code.   This simple DCE-like
2092    pass removes any insertions we made that weren't actually used.  */
2093
2094 static void
2095 remove_dead_inserted_code (void)
2096 {
2097   VEC (tree_on_heap) *worklist = NULL;
2098   int i;
2099   tree t;
2100
2101   for (i = 0; VEC_iterate (tree_on_heap, inserted_exprs, i, t); i++)
2102     {
2103       if (NECESSARY (t))
2104         VEC_safe_push (tree_on_heap, worklist, t);
2105     }
2106   while (VEC_length (tree_on_heap, worklist) > 0)
2107     {
2108       t = VEC_pop (tree_on_heap, worklist);
2109       if (TREE_CODE (t) == PHI_NODE)
2110         {
2111           /* PHI nodes are somewhat special in that each PHI alternative has
2112              data and control dependencies.  All the statements feeding the
2113              PHI node's arguments are always necessary.  In aggressive mode,
2114              we also consider the control dependent edges leading to the
2115              predecessor block associated with each PHI alternative as
2116              necessary.  */
2117           int k;
2118           for (k = 0; k < PHI_NUM_ARGS (t); k++)
2119             {
2120               tree arg = PHI_ARG_DEF (t, k);
2121               if (TREE_CODE (arg) == SSA_NAME)
2122                 mark_operand_necessary (arg, &worklist);
2123             }
2124         }
2125       else
2126         {
2127           /* Propagate through the operands.  Examine all the USE, VUSE and
2128              V_MAY_DEF operands in this statement.  Mark all the statements 
2129              which feed this statement's uses as necessary.  */
2130           ssa_op_iter iter;
2131           tree use;
2132
2133           get_stmt_operands (t);
2134
2135           /* The operands of V_MAY_DEF expressions are also needed as they
2136              represent potential definitions that may reach this
2137              statement (V_MAY_DEF operands allow us to follow def-def 
2138              links).  */
2139
2140           FOR_EACH_SSA_TREE_OPERAND (use, t, iter, SSA_OP_ALL_USES)
2141             mark_operand_necessary (use, &worklist);
2142         }
2143     }
2144   for (i = 0; VEC_iterate (tree_on_heap, inserted_exprs, i, t); i++)
2145     {
2146       if (!NECESSARY (t))
2147         {
2148           block_stmt_iterator bsi;
2149           if (dump_file && (dump_flags & TDF_DETAILS))
2150             {
2151               fprintf (dump_file, "Removing unnecessary insertion:");
2152               print_generic_stmt (dump_file, t, 0);
2153             }
2154           if (TREE_CODE (t) == PHI_NODE)
2155             {
2156               remove_phi_node (t, NULL, bb_for_stmt (t));
2157             }
2158           else
2159             {
2160               bsi = bsi_for_stmt (t);
2161               bsi_remove (&bsi);
2162             }
2163         }
2164     }
2165   VEC_free (tree_on_heap, worklist);
2166 }
2167 /* Initialize data structures used by PRE.  */
2168
2169 static void
2170 init_pre (bool do_fre)
2171 {
2172   basic_block bb;
2173
2174   inserted_exprs = NULL;
2175   vn_init ();
2176   if (!do_fre)
2177     current_loops = loop_optimizer_init (dump_file);
2178   connect_infinite_loops_to_exit ();
2179   memset (&pre_stats, 0, sizeof (pre_stats));
2180
2181   /* If block 0 has more than one predecessor, it means that its PHI
2182      nodes will have arguments coming from block -1.  This creates
2183      problems for several places in PRE that keep local arrays indexed
2184      by block number.  To prevent this, we split the edge coming from
2185      ENTRY_BLOCK_PTR (FIXME, if ENTRY_BLOCK_PTR had an index number
2186      different than -1 we wouldn't have to hack this.  tree-ssa-dce.c
2187      needs a similar change).  */
2188   if (EDGE_COUNT (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest->preds) > 1)
2189     if (!(EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->flags & EDGE_ABNORMAL))
2190       split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
2191
2192   FOR_ALL_BB (bb)
2193     bb->aux = xcalloc (1, sizeof (struct bb_value_sets));
2194
2195   bitmap_obstack_initialize (&grand_bitmap_obstack);
2196   phi_translate_table = htab_create (511, expr_pred_trans_hash,
2197                                      expr_pred_trans_eq, free);
2198   value_set_pool = create_alloc_pool ("Value sets",
2199                                       sizeof (struct value_set), 30);
2200   bitmap_set_pool = create_alloc_pool ("Bitmap sets",
2201                                        sizeof (struct bitmap_set), 30);
2202   value_set_node_pool = create_alloc_pool ("Value set nodes",
2203                                            sizeof (struct value_set_node), 30);
2204   calculate_dominance_info (CDI_POST_DOMINATORS);
2205   calculate_dominance_info (CDI_DOMINATORS);
2206   binary_node_pool = create_alloc_pool ("Binary tree nodes",
2207                                         tree_code_size (PLUS_EXPR), 30);
2208   unary_node_pool = create_alloc_pool ("Unary tree nodes",
2209                                        tree_code_size (NEGATE_EXPR), 30);
2210   reference_node_pool = create_alloc_pool ("Reference tree nodes",
2211                                            tree_code_size (ARRAY_REF), 30);
2212   FOR_ALL_BB (bb)
2213     {
2214       EXP_GEN (bb) = set_new (true);
2215       PHI_GEN (bb) = bitmap_set_new ();
2216       TMP_GEN (bb) = bitmap_set_new ();
2217       AVAIL_OUT (bb) = bitmap_set_new ();
2218     }
2219
2220   need_eh_cleanup = BITMAP_ALLOC (NULL);
2221 }
2222
2223
2224 /* Deallocate data structures used by PRE.  */
2225
2226 static void
2227 fini_pre (bool do_fre)
2228 {
2229   basic_block bb;
2230   unsigned int i;
2231
2232   VEC_free (tree_on_heap, inserted_exprs);
2233   bitmap_obstack_release (&grand_bitmap_obstack);
2234   free_alloc_pool (value_set_pool);
2235   free_alloc_pool (bitmap_set_pool);
2236   free_alloc_pool (value_set_node_pool);
2237   free_alloc_pool (binary_node_pool);
2238   free_alloc_pool (reference_node_pool);
2239   free_alloc_pool (unary_node_pool);
2240   htab_delete (phi_translate_table);
2241   remove_fake_exit_edges ();
2242
2243   FOR_ALL_BB (bb)
2244     {
2245       free (bb->aux);
2246       bb->aux = NULL;
2247     }
2248
2249   free_dominance_info (CDI_POST_DOMINATORS);
2250   vn_delete ();
2251
2252   if (!bitmap_empty_p (need_eh_cleanup))
2253     {
2254       tree_purge_all_dead_eh_edges (need_eh_cleanup);
2255       cleanup_tree_cfg ();
2256     }
2257
2258   BITMAP_FREE (need_eh_cleanup);
2259
2260   /* Wipe out pointers to VALUE_HANDLEs.  In the not terribly distant
2261      future we will want them to be persistent though.  */
2262   for (i = 0; i < num_ssa_names; i++)
2263     {
2264       tree name = ssa_name (i);
2265
2266       if (!name)
2267         continue;
2268
2269       if (SSA_NAME_VALUE (name)
2270           && TREE_CODE (SSA_NAME_VALUE (name)) == VALUE_HANDLE)
2271         SSA_NAME_VALUE (name) = NULL;
2272     }
2273   if (!do_fre && current_loops)
2274     {
2275       loop_optimizer_finalize (current_loops, dump_file);
2276       current_loops = NULL;
2277     }
2278 }
2279
2280
2281 /* Main entry point to the SSA-PRE pass.  DO_FRE is true if the caller
2282    only wants to do full redundancy elimination.  */
2283
2284 static void
2285 execute_pre (bool do_fre)
2286 {
2287   init_pre (do_fre);
2288
2289   /* Collect and value number expressions computed in each basic block.  */
2290   compute_avail ();
2291
2292   if (dump_file && (dump_flags & TDF_DETAILS))
2293     {
2294       basic_block bb;
2295
2296       FOR_ALL_BB (bb)
2297         {
2298           print_value_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
2299           bitmap_print_value_set (dump_file, TMP_GEN (bb), "tmp_gen", 
2300                                   bb->index);
2301           bitmap_print_value_set (dump_file, AVAIL_OUT (bb), "avail_out", 
2302                                   bb->index);
2303         }
2304     }
2305
2306   /* Insert can get quite slow on an incredibly large number of basic
2307      blocks due to some quadratic behavior.  Until this behavior is
2308      fixed, don't run it when he have an incredibly large number of
2309      bb's.  If we aren't going to run insert, there is no point in
2310      computing ANTIC, either, even though it's plenty fast.  */
2311   if (!do_fre && n_basic_blocks < 4000)
2312     {
2313       compute_antic ();
2314       insert ();
2315     }
2316
2317   /* Remove all the redundant expressions.  */
2318   eliminate ();
2319
2320
2321   if (dump_file && (dump_flags & TDF_STATS))
2322     {
2323       fprintf (dump_file, "Insertions:%d\n", pre_stats.insertions);
2324       fprintf (dump_file, "New PHIs:%d\n", pre_stats.phis);
2325       fprintf (dump_file, "Eliminated:%d\n", pre_stats.eliminations);
2326       fprintf (dump_file, "Constified:%d\n", pre_stats.constified);
2327     }
2328   
2329   bsi_commit_edge_inserts ();
2330   if (!do_fre)
2331     remove_dead_inserted_code ();
2332   fini_pre (do_fre);
2333
2334 }
2335
2336
2337 /* Gate and execute functions for PRE.  */
2338
2339 static void
2340 do_pre (void)
2341 {
2342   execute_pre (false);
2343 }
2344
2345 static bool
2346 gate_pre (void)
2347 {
2348   return flag_tree_pre != 0;
2349 }
2350
2351 struct tree_opt_pass pass_pre =
2352 {
2353   "pre",                                /* name */
2354   gate_pre,                             /* gate */
2355   do_pre,                               /* execute */
2356   NULL,                                 /* sub */
2357   NULL,                                 /* next */
2358   0,                                    /* static_pass_number */
2359   TV_TREE_PRE,                          /* tv_id */
2360   PROP_no_crit_edges | PROP_cfg
2361     | PROP_ssa | PROP_alias,            /* properties_required */
2362   0,                                    /* properties_provided */
2363   0,                                    /* properties_destroyed */
2364   0,                                    /* todo_flags_start */
2365   TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
2366   0                                     /* letter */
2367 };
2368
2369
2370 /* Gate and execute functions for FRE.  */
2371
2372 static void
2373 do_fre (void)
2374 {
2375   execute_pre (true);
2376 }
2377
2378 static bool
2379 gate_fre (void)
2380 {
2381   return flag_tree_fre != 0;
2382 }
2383
2384 struct tree_opt_pass pass_fre =
2385 {
2386   "fre",                                /* name */
2387   gate_fre,                             /* gate */
2388   do_fre,                               /* execute */
2389   NULL,                                 /* sub */
2390   NULL,                                 /* next */
2391   0,                                    /* static_pass_number */
2392   TV_TREE_FRE,                          /* tv_id */
2393   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
2394   0,                                    /* properties_provided */
2395   0,                                    /* properties_destroyed */
2396   0,                                    /* todo_flags_start */
2397   TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
2398   0                                     /* letter */
2399 };