OSDN Git Service

* tree-ssa-pre.c (compute_antic): Keep BB_VISITED flag zeroed.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-pre.c
1 /* SSA-PRE for trees.
2    Copyright (C) 2001, 2002, 2003, 2004 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 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "errors.h"
27 #include "ggc.h"
28 #include "tree.h"
29
30 /* These RTL headers are needed for basic-block.h.  */
31 #include "rtl.h"
32 #include "tm_p.h"
33 #include "hard-reg-set.h"
34 #include "basic-block.h"
35 #include "diagnostic.h"
36 #include "tree-inline.h"
37 #include "tree-flow.h"
38 #include "tree-gimple.h"
39 #include "tree-dump.h"
40 #include "timevar.h"
41 #include "fibheap.h"
42 #include "hashtab.h"
43 #include "tree-iterator.h"
44 #include "real.h"
45 #include "alloc-pool.h"
46 #include "tree-pass.h"
47 #include "flags.h"
48 #include "splay-tree.h"
49 #include "bitmap.h"
50 #include "langhooks.h"
51 /* TODO:
52    
53    1. Implement load value numbering.
54    2. Speed up insert_aux so that we can use it all the time.  It
55       spends most of it's time in quadratic value replacement.
56    3. Avail sets can be shared by making an avail_find_leader that
57       walks up the dominator tree and looks in those avail sets.
58       This might affect code optimality, it's unclear right now.
59    4. Load motion can be performed by value numbering the loads the
60       same as we do other expressions.  This requires iterative
61       hashing the vuses into the values.  Right now we simply assign
62       a new value every time we see a statement with a vuse.
63    5. Strength reduction can be performed by anticipating expressions
64       we can repair later on.
65 */   
66
67 /* For ease of terminology, "expression node" in the below refers to
68    every expression node but MODIFY_EXPR, because MODIFY_EXPR's represent
69    the actual statement containing the expressions we care about, and
70    we cache the value number by putting it in the expression.  */
71
72 /* Basic algorithm
73    
74    First we walk the statements to generate the AVAIL sets, the EXP_GEN
75    sets, and the tmp_gen sets.  AVAIL is a forward dataflow
76    problem. EXP_GEN sets represent the generation of
77    values/expressions by a given block.  We use them when computing
78    the ANTIC sets.  The AVAIL sets consist of SSA_NAME's that
79    represent values, so we know what values are available in what
80    blocks.  In SSA, values are never killed, so we don't need a kill
81    set, or a fixpoint iteration, in order to calculate the AVAIL sets.
82    In traditional parlance, AVAIL sets tell us the downsafety of the
83    expressions/values.
84    
85    Next, we generate the ANTIC sets.  ANTIC is a backwards dataflow
86    problem.  These sets represent the anticipatable expressions.  An
87    expression is anticipatable in a given block if it could be
88    generated in that block.  This means that if we had to perform an
89    insertion in that block, of the value of that expression, we could.
90    Calculating the ANTIC sets requires phi translation of expressions,
91    because the flow goes backwards through phis.  We must iterate to a
92    fixpoint of the ANTIC sets, because we have a kill set.
93    Even in SSA form, values are not live over the entire function,
94    only from their definition point onwards.  So we have to remove
95    values from the ANTIC set once we go past the definition point of
96    the leaders that make them up.  compute_antic/compute_antic_aux
97    performs this computation.
98
99    Third, we perform insertions to make partially redundant
100    expressions fully redundant.
101
102    An expression is partially redundant (excluding partial
103    anticipation) if:
104
105    1. It is AVAIL in some, but not all, of the predecessors of a
106       given block.
107    2. It is ANTIC in all the predecessors.
108
109    In order to make it fully redundant, we insert the expression into
110    the predecessors where it is not available, but is ANTIC.
111    insert/insert_aux performs this insertion.
112
113    Fourth, we eliminate fully redundant expressions.
114    This is a simple statement walk that replaces redundant
115    calculations  with the now available values.  */
116
117 /* Representations of value numbers:
118
119    Value numbers are represented using the "value handle" approach.
120    This means that each SSA_NAME (and for other reasons to be
121    disclosed in a moment, expression nodes and constant nodes) has a
122    value handle that can be retrieved through get_value_handle.  This
123    value handle, *is* the value number of the SSA_NAME.  You can
124    pointer compare the value handles for equivalence purposes.
125
126    For debugging reasons, the value handle is internally more than
127    just a number, it is a VAR_DECL named "value.x", where x is a
128    unique number for each value number in use.  This allows
129    expressions with SSA_NAMES replaced by value handles to still be
130    pretty printed in a sane way.  They simply print as "value.3 *
131    value.5", etc.  
132
133    Expression nodes have value handles associated with them as a
134    cache.  Otherwise, we'd have to look them up again in the hash
135    table This makes significant difference (factor of two or more) on
136    some test cases.  They can be thrown away after the Constants have
137    value handles associated with them so that they aren't special
138    cased everywhere, and for consistency sake. This may be changed
139    depending on memory usage vs code maintenance tradeoff.  */
140
141 /* Representation of expressions on value numbers: 
142
143    In some portions of this code, you will notice we allocate "fake"
144    analogues to the expression we are value numbering, and replace the
145    operands with the values of the expression.  Since we work on
146    values, and not just names, we canonicalize expressions to value
147    expressions for use in the ANTIC sets, the EXP_GEN set, etc.  
148
149    This is theoretically unnecessary, it just saves a bunch of
150    repeated get_value_handle and find_leader calls in the remainder of
151    the code, trading off temporary memory usage for speed.  The tree
152    nodes aren't actually creating more garbage, since they are
153    allocated in a special pools which are thrown away at the end of
154    this pass.  
155
156    All of this also means that if you print the EXP_GEN or ANTIC sets,
157    you will see "value.5 + value.7" in the set, instead of "a_55 +
158    b_66" or something.  The only thing that actually cares about
159    seeing the value leaders is phi translation, and it needs to be
160    able to find the leader for a value in an arbitrary block, so this
161    "value expression" form is perfect for it (otherwise you'd do
162    get_value_handle->find_leader->translate->get_value_handle->find_leader).*/
163
164
165 /* Representation of sets:
166
167    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 constants,
170    values, or expressions.  The elements can appear in different sets,
171    but each 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/constants/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 /* All of the following sets, except for TMP_GEN, are indexed.
222    TMP_GEN is only ever iterated over, we never check what values
223    exist in it.  */
224
225 typedef struct bb_value_sets
226 {
227   /* The EXP_GEN set, which represents expressions/values generated in
228      a basic block.  */
229   value_set_t exp_gen;
230
231   /* The PHI_GEN set, which represents PHI results generated in a
232      basic block.  */
233   value_set_t phi_gen;
234
235   /* The TMP_GEN set, which represents results/temporaries genererated
236      in a basic block. IE the LHS of an expression.  */
237   value_set_t tmp_gen;
238
239   /* The AVAIL_OUT set, which represents which values are available in
240      a given basic block.  */
241   value_set_t avail_out;
242
243   /* The ANTIC_IN set, which represents which values are anticiptable
244      in a given basic block.  */
245   value_set_t antic_in;
246
247   /* The NEW_SETS set, which is used during insertion to augment the
248      AVAIL_OUT set of blocks with the new insertions performed during
249      the current iteration.  */
250   value_set_t new_sets;
251 } *bb_value_sets_t;
252
253 #define EXP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->exp_gen
254 #define PHI_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->phi_gen
255 #define TMP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->tmp_gen
256 #define AVAIL_OUT(BB)   ((bb_value_sets_t) ((BB)->aux))->avail_out
257 #define ANTIC_IN(BB)    ((bb_value_sets_t) ((BB)->aux))->antic_in
258 #define NEW_SETS(BB)    ((bb_value_sets_t) ((BB)->aux))->new_sets
259
260 /* This structure is used to keep track of statistics on what
261    optimization PRE was able to perform.  */
262 static struct
263 {
264   /* The number of RHS computations eliminated by PRE.  */
265   int eliminations;
266
267   /* The number of new expressions/temporaries generated by PRE.  */
268   int insertions;
269
270   /* The number of new PHI nodes added by PRE.  */
271   int phis;
272 } pre_stats;
273
274 static tree find_leader (value_set_t, tree);
275 static void value_insert_into_set (value_set_t, tree);
276 static void insert_into_set (value_set_t, tree);
277 static void add_to_value (tree, tree);
278 static value_set_t set_new  (bool);
279 static bool is_undefined_value (tree);
280 static bool expressions_equal_p (tree, tree);
281
282 /* We can add and remove elements and entries to and from sets
283    and hash tables, so we use alloc pools for them.  */
284
285 static alloc_pool value_set_pool;
286 static alloc_pool value_set_node_pool;
287 static alloc_pool binary_node_pool;
288 static alloc_pool unary_node_pool;
289
290 /* The value table that maps expressions to values.  */
291
292 static htab_t value_table;
293
294 /* The phi_translate_table caches phi translations for a given
295    expression and predecessor.  */
296
297 static htab_t phi_translate_table;
298
299 /* Compare two expressions E1 and E2 and return true if they are
300    equal.  */
301
302 static bool
303 expressions_equal_p (tree e1, tree e2)
304 {
305   tree te1, te2;
306   
307   if (e1 == e2)
308     return true;
309   
310   te1 = TREE_TYPE (e1);
311   te2 = TREE_TYPE (e2);
312
313   if (TREE_CODE (e1) == TREE_CODE (e2) 
314       && (te1 == te2 || lang_hooks.types_compatible_p (te1, te2))
315       && operand_equal_p (e1, e2, 0))
316     return true;
317   return false;
318 }
319
320 /* Map expressions to values.  These are simple pairs of expressions
321    and the values they represent.  To find the value represented by
322    an expression, we use a hash table where the elements are {e,v}
323    pairs, and the expression is the key.  */
324
325 typedef struct val_expr_pair_d
326 {
327   tree v, e;
328   hashval_t hashcode;
329 } *val_expr_pair_t;
330
331
332 /* Hash a {v,e} pair that is pointed to by P.
333    The hashcode is cached in the val_expr_pair, so we just return
334    that.  */
335
336 static hashval_t
337 val_expr_pair_hash (const void *p)
338 {
339   const val_expr_pair_t ve = (val_expr_pair_t) p;
340   return ve->hashcode;
341 }
342
343
344 /* Given two val_expr_pair_t's, return true if they represent the same
345    expression, false otherwise.
346    P1 and P2 should point to the val_expr_pair_t's to be compared.  */
347
348 static int
349 val_expr_pair_expr_eq (const void *p1, const void *p2)
350 {
351   const val_expr_pair_t ve1 = (val_expr_pair_t) p1;
352   const val_expr_pair_t ve2 = (val_expr_pair_t) p2;
353
354   if (expressions_equal_p (ve1->e, ve2->e))
355     return true;
356   
357   return false;
358 }
359
360
361 /* Get the value handle of EXPR.  This is the only correct way to get
362    the value handle for a "thing". 
363    Returns NULL if the value handle does not exist.  */
364
365 tree
366 get_value_handle (tree expr)
367 {
368   /* We should never see these.  */
369   if (DECL_P (expr))
370     abort ();
371   else if (TREE_CODE (expr) == SSA_NAME)
372     {
373       return SSA_NAME_VALUE (expr);
374     }
375   else if (TREE_CODE_CLASS (TREE_CODE (expr)) == 'c'
376            || EXPR_P (expr))
377     {
378       tree_ann_t ann = tree_ann (expr);  
379       if (ann)
380         return ann->common.value_handle;
381       return NULL;
382     }
383   abort ();
384 }
385
386
387 /* Set the value handle for expression E to value V */
388    
389 void
390 set_value_handle (tree e, tree v)
391 {
392   if (DECL_P (e))
393     abort ();
394   else if (TREE_CODE (e) == SSA_NAME)
395     SSA_NAME_VALUE (e) = v;
396   else if (TREE_CODE_CLASS (TREE_CODE (e)) == 'c'
397            || EXPR_P (e))
398     get_tree_ann (e)->common.value_handle = v;
399 }
400
401 /* A three tuple {e, pred, v} used to cache phi translations in the
402    phi_translate_table.  */
403
404 typedef struct expr_pred_trans_d
405 {
406   /* The expression. */
407   tree e;
408
409   /* The predecessor block along which we translated the expression.  */
410   basic_block pred;
411
412   /* The value that resulted from the translation.  */
413   tree v;
414
415   /* The hashcode for the expression, pred pair. This is cached for
416      speed reasons.  */
417   hashval_t hashcode;
418 } *expr_pred_trans_t;
419
420 /* Return the hash value for a phi translation table entry.  */
421
422 static hashval_t
423 expr_pred_trans_hash (const void *p)
424 {
425   const expr_pred_trans_t ve = (expr_pred_trans_t) p;
426   return ve->hashcode;
427 }
428
429 /* Return true if two phi translation table entries are the same.
430    P1 and P2 should point to the expr_pred_trans_t's to be compared.*/
431
432 static int
433 expr_pred_trans_eq (const void *p1, const void *p2)
434 {
435   const expr_pred_trans_t ve1 = (expr_pred_trans_t) p1;
436   const expr_pred_trans_t ve2 = (expr_pred_trans_t) p2;
437   basic_block b1 = ve1->pred;
438   basic_block b2 = ve2->pred;
439
440   
441   /* If they are not translations for the same basic block, they can't
442      be equal.  */
443   if (b1 != b2)
444     return false;
445
446   /* If they are for the same basic block, determine if the
447      expressions are equal.   */  
448   if (expressions_equal_p (ve1->e, ve2->e))
449     return true;
450   
451   return false;
452 }
453
454 /* Search in the phi translation table for the translation of
455    expression E in basic block PRED. Return the translated value, if
456    found, NULL otherwise. */ 
457
458 static inline tree
459 phi_trans_lookup (tree e, basic_block pred)
460 {
461   void **slot;
462   struct expr_pred_trans_d ept;
463   ept.e = e;
464   ept.pred = pred;
465   ept.hashcode = iterative_hash_expr (e, (unsigned long) pred);
466   slot = htab_find_slot_with_hash (phi_translate_table, &ept, ept.hashcode,
467                                    NO_INSERT);
468   if (!slot)
469     return NULL;
470   else
471     return ((expr_pred_trans_t) *slot)->v;
472 }
473
474
475 /* Add the tuple mapping from {expression E, basic block PRED} to
476    value V, to the phi translation table.  */
477
478 static inline void
479 phi_trans_add (tree e, tree v, basic_block pred)
480 {
481   void **slot;
482   expr_pred_trans_t new_pair = xmalloc (sizeof (*new_pair));
483   new_pair->e = e;
484   new_pair->pred = pred;
485   new_pair->v = v;
486   new_pair->hashcode = iterative_hash_expr (e, (unsigned long) pred);
487   slot = htab_find_slot_with_hash (phi_translate_table, new_pair,
488                                    new_pair->hashcode, INSERT);
489   if (*slot)
490     free (*slot);
491   *slot = (void *) new_pair;
492 }
493
494 /* Search in TABLE for an existing instance of expression E,
495    and return its value, or NULL if none has been set.  */
496
497 static inline tree
498 lookup (htab_t table, tree e)
499 {
500   void **slot;
501   struct val_expr_pair_d vep = {NULL, NULL, 0};
502   vep.e = e;
503   vep.hashcode = iterative_hash_expr (e,0); 
504   slot = htab_find_slot_with_hash (table, &vep, vep.hashcode, NO_INSERT);
505   if (!slot)
506     return NULL_TREE;
507   else
508     return ((val_expr_pair_t) *slot)->v;
509 }
510
511 /* Add expression E to the expression set of value V.  */
512
513 static inline void
514 add_to_value (tree v, tree e)
515 {
516 #if DEBUG_VALUE_EXPRESSIONS
517   var_ann_t va = var_ann (v);
518 #endif
519   /* For values representing numerical constants, we mark
520      TREE_CONSTANT as true and set the tree chain to the actual
521      constant.  This is because unlike values involving expressions,
522      which are only available to use where the expressions are live, a
523      constant can be remade anywhere, and thus, is available
524      everywhere.  */
525   if (TREE_CODE_CLASS (TREE_CODE (e)) == 'c')
526     {
527       TREE_CONSTANT (v) = true;
528       TREE_CHAIN (v) = e;
529     }
530   else if (is_gimple_min_invariant (e))
531     {
532       TREE_CONSTANT (v) = true;
533       TREE_CHAIN (v) = e;
534     }
535 #if DEBUG_VALUE_EXPRESSIONS
536   if (va->expr_set == NULL)
537     va->expr_set = set_new (false);
538   insert_into_set (va->expr_set, e);
539 #endif
540 }
541
542 /* Insert E into TABLE with value V, and add expression E to the value
543    set for value V.  */
544
545 static inline void
546 add (htab_t table, tree e, tree v)
547 {
548
549   void **slot;
550   val_expr_pair_t new_pair = xmalloc (sizeof (struct val_expr_pair_d));
551   new_pair->e = e;
552   new_pair->v = v;
553   new_pair->hashcode = iterative_hash_expr (e, 0);
554   slot = htab_find_slot_with_hash (table, new_pair, new_pair->hashcode,
555                                    INSERT);
556   if (*slot)
557     free (*slot);
558   *slot = (void *) new_pair;
559   set_value_handle (e, v);
560
561   add_to_value (v, e);
562  
563 }
564
565 /* A unique counter that is incremented every time we create a new
566    value.  */
567 static int pre_uid;
568
569 /* Create a new value handle for expression EXPR.  */
570
571 static tree
572 create_new_value (tree expr)
573 {
574   tree a = create_tmp_var_raw (TREE_TYPE (expr), "value");
575   create_var_ann (a);
576   var_ann (a)->uid = pre_uid++;
577
578   if (dump_file && (dump_flags & TDF_DETAILS))
579     {     
580       fprintf (dump_file, "Created value ");
581       print_generic_expr (dump_file, a, dump_flags);
582       fprintf (dump_file, " for ");
583       print_generic_expr (dump_file, expr, dump_flags);
584       fprintf (dump_file, "\n");
585     }
586   return a;
587 }
588
589 /* Like lookup, but creates a new value for expression E if E doesn't
590    already have a value.
591    Return the existing/created value for E.  */
592
593 static inline tree
594 lookup_or_add (htab_t table, tree e)
595 {
596   tree x = lookup (table, e);
597   if (x == NULL_TREE)
598     {
599       tree v;
600       v = create_new_value (e);
601       add (table, e, v);
602       x = v;
603     }
604   set_value_handle (e, x);
605   return x;
606 }
607
608   
609 /* Return true if value V exists in the bitmap for SET.  */
610
611 static inline bool
612 value_exists_in_set_bitmap (value_set_t set, tree v)
613 {
614   if (TREE_CODE (v) != VAR_DECL)
615     abort ();
616
617   if (!set->values)
618     return false;
619   return bitmap_bit_p (set->values, get_var_ann (v)->uid);
620 }
621
622 /* Remove value V from the bitmap for SET.  */
623
624 static void
625 value_remove_from_set_bitmap (value_set_t set, tree v)
626 {
627   if (TREE_CODE (v) != VAR_DECL)
628     abort ();
629 #ifdef ENABLE_CHECKING
630   if (!set->indexed)
631     abort ();
632 #endif
633   if (!set->values)
634     return;
635   bitmap_clear_bit (set->values, get_var_ann (v)->uid);
636 }
637
638
639 /* Insert the value number V into the bitmap of values existing in
640    SET.  */
641
642 static inline void
643 value_insert_into_set_bitmap (value_set_t set, tree v)
644 {
645   if (TREE_CODE (v) != VAR_DECL)
646     abort ();  
647 #ifdef ENABLE_CHECKING
648   if (!set->indexed)
649     abort ();
650 #endif
651   if (set->values == NULL)
652     {
653       set->values = BITMAP_GGC_ALLOC ();
654       bitmap_clear (set->values);
655     }
656   bitmap_set_bit (set->values, get_var_ann (v)->uid);
657 }
658
659 /* Create a new set.  */
660
661 static value_set_t
662 set_new  (bool indexed)
663 {
664   value_set_t ret;
665   ret = pool_alloc (value_set_pool);
666   ret->head = ret->tail = NULL;
667   ret->length = 0;
668   ret->indexed = indexed;
669   ret->values = NULL;
670   return ret;
671 }
672
673
674 /* Insert EXPR into SET.  */
675
676 static void
677 insert_into_set (value_set_t set, tree expr)
678 {
679   value_set_node_t newnode = pool_alloc (value_set_node_pool);
680   tree val = get_value_handle (expr);
681   if (DECL_P (expr))
682     abort ();
683   
684   if (val == NULL)
685     abort ();
686
687   /* For indexed sets, insert the value into the set value bitmap.
688      For all sets, add it to the linked list and increment the list
689      length.  */
690   if (set->indexed)
691     value_insert_into_set_bitmap (set, val);
692
693   newnode->next = NULL;
694   newnode->expr = expr;
695   set->length ++;
696   if (set->head == NULL)
697     {
698       set->head = set->tail = newnode;
699     }
700   else
701     {
702       set->tail->next = newnode;
703       set->tail = newnode;
704     }
705 }
706
707 /* Copy the set ORIG to the set DEST.  */
708
709 static void
710 set_copy (value_set_t dest, value_set_t orig)
711 {
712   value_set_node_t node;
713  
714   if (!orig || !orig->head)
715     return;
716
717   for (node = orig->head;
718        node;
719        node = node->next)
720     {
721       insert_into_set (dest, node->expr);
722     }
723 }
724
725 /* Remove EXPR from SET.  */
726
727 static void
728 set_remove (value_set_t set, tree expr)
729 {
730   value_set_node_t node, prev;
731
732   /* Remove the value of EXPR from the bitmap, decrement the set
733      length, and remove it from the actual double linked list.  */ 
734   value_remove_from_set_bitmap (set, get_value_handle (expr));
735   set->length--;
736   prev = NULL;
737   for (node = set->head; 
738        node != NULL; 
739        prev = node, node = node->next)
740     {
741       if (node->expr == expr)
742         {
743           if (prev == NULL)
744             set->head = node->next;
745           else
746             prev->next= node->next;
747  
748           if (node == set->tail)
749             set->tail = prev;
750           pool_free (value_set_node_pool, node);
751           return;
752         }
753     }
754 }
755
756 /* Return true if SET contains the value VAL.  */
757
758 static bool
759 set_contains_value (value_set_t set, tree val)
760 {
761   /* This is only referring to the flag above that we set on
762      values referring to numerical constants, because we know that we
763      are dealing with one of the value handles we created.  */
764   if (TREE_CONSTANT (val))
765     return true;
766   
767   if (set->length == 0)
768     return false;
769   
770   return value_exists_in_set_bitmap (set, val);
771 }
772
773 /* Replace the leader for the value LOOKFOR in SET with EXPR.  */
774
775 static void
776 set_replace_value (value_set_t set, tree lookfor, tree expr)
777 {
778   value_set_node_t node = set->head;
779
780   /* The lookup is probably more expensive than walking the linked
781      list when we have only a small number of nodes.  */
782   if (!set_contains_value (set, lookfor))
783     return;
784
785   for (node = set->head;
786        node;
787        node = node->next)
788     {
789       if (get_value_handle (node->expr) == lookfor)
790         {
791           node->expr = expr;
792           return;
793         }
794     }
795 }
796
797 /* Return true if the set contains expression (not value) EXPR.  */
798
799 static bool
800 set_contains (value_set_t set, tree expr)
801 {
802   value_set_node_t node;
803   
804   for (node = set->head;
805        node;
806        node = node->next)
807     {
808       if (operand_equal_p (node->expr, expr, 0))
809         return true;
810     }
811   return false;
812 }
813
814 /* Subtract set B from set A, and return the new set.  */
815
816 static value_set_t
817 set_subtract (value_set_t a, value_set_t b, bool indexed)
818 {
819   value_set_t ret = set_new (indexed);
820   value_set_node_t node;
821   for (node = a->head;
822        node;
823        node = node->next)
824     {
825       if (!set_contains (b, node->expr))
826         insert_into_set (ret, node->expr);
827     }
828   return ret;
829 }
830
831 /* Return true if two sets are equal. */
832
833 static bool
834 set_equal (value_set_t a, value_set_t b)
835 {
836   value_set_node_t node;
837
838   if (a->length != b->length)
839     return false;
840   for (node = a->head;
841        node;
842        node = node->next)
843     {
844       if (!set_contains_value (b, get_value_handle (node->expr)))
845         return false;
846     }
847   return true;
848 }
849
850 /* Replace the value for EXPR in SET with EXPR.  */
851 static void
852 value_replace_in_set (value_set_t set, tree expr)
853 {
854   tree val = get_value_handle (expr);
855
856   if (set->length == 0)
857     return;
858   
859   set_replace_value (set, val, expr);
860 }
861
862 /* Insert the value for EXPR into SET, if it doesn't exist already.  */
863
864 static void
865 value_insert_into_set (value_set_t set, tree expr)
866 {
867   tree val = get_value_handle (expr);
868
869   /* Constant values exist everywhere.  */
870   if (TREE_CONSTANT (val))
871     return;
872
873   if (!set_contains_value (set, val))
874     insert_into_set (set, expr);
875 }
876
877
878 /* Print out the value_set SET to OUTFILE.  */
879
880 static void
881 print_value_set (FILE *outfile, value_set_t set,
882                  const char *setname, int blockindex)
883 {
884   value_set_node_t node;
885   fprintf (outfile, "%s[%d] := { ", setname, blockindex);
886   if (set)
887     {
888       for (node = set->head;
889            node;
890            node = node->next)
891         {
892           print_generic_expr (outfile, node->expr, 0);
893           
894           fprintf (outfile, " (");
895           print_generic_expr (outfile, get_value_handle (node->expr), 0);
896           fprintf (outfile, ") ");
897                      
898           if (node->next)
899             fprintf (outfile, ", ");
900         }
901     }
902
903   fprintf (outfile, " }\n");
904 }
905
906 /* Print out the expressions that have VAL to OUTFILE.  */
907 void
908 print_value_expressions (FILE *outfile, tree val)
909 {
910   var_ann_t va = var_ann (val);
911   if (va && va->expr_set)
912     print_value_set (outfile, va->expr_set, 
913                      IDENTIFIER_POINTER (DECL_NAME (val)), 0);
914 }
915
916
917 void
918 debug_value_expressions (tree val)
919 {
920   print_value_expressions (stderr, val);
921 }
922
923   
924 void debug_value_set (value_set_t, const char *, int);
925
926 void
927 debug_value_set (value_set_t set, const char *setname, int blockindex)
928 {
929   print_value_set (stderr, set, setname, blockindex);
930 }
931
932 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
933    the phis in PRED.  Return NULL if we can't find a leader for each
934    part of the translated expression.  */
935
936 static tree
937 phi_translate (tree expr, value_set_t set,  basic_block pred,
938                basic_block phiblock)
939 {
940   tree phitrans = NULL;
941   tree oldexpr = expr;
942   
943   if (expr == NULL)
944     return NULL;
945
946   /* Phi translations of a given expression don't change,  */
947   phitrans = phi_trans_lookup (expr, pred);
948   if (phitrans)
949     return phitrans;
950   
951   
952   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
953     {
954     case '2':
955       {
956         tree oldop1 = TREE_OPERAND (expr, 0);
957         tree oldop2 = TREE_OPERAND (expr, 1);
958         tree newop1;
959         tree newop2;
960         tree newexpr;
961         
962         newop1 = phi_translate (find_leader (set, oldop1),
963                                 set, pred, phiblock);
964         if (newop1 == NULL)
965           return NULL;
966         newop2 = phi_translate (find_leader (set, oldop2),
967                                 set, pred, phiblock);
968         if (newop2 == NULL)
969           return NULL;
970         if (newop1 != oldop1 || newop2 != oldop2)
971           {
972             newexpr = pool_alloc (binary_node_pool);
973             memcpy (newexpr, expr, tree_size (expr));
974             create_tree_ann (newexpr);
975             TREE_OPERAND (newexpr, 0) = newop1 == oldop1 ? oldop1 : get_value_handle (newop1);
976             TREE_OPERAND (newexpr, 1) = newop2 == oldop2 ? oldop2 : get_value_handle (newop2);
977             lookup_or_add (value_table, newexpr);
978             expr = newexpr;
979             phi_trans_add (oldexpr, newexpr, pred);         
980           }
981       }
982       break;
983     case '1':
984       {
985         tree oldop1 = TREE_OPERAND (expr, 0);
986         tree newop1;
987         tree newexpr;
988
989         newop1 = phi_translate (find_leader (set, oldop1),
990                                 set, pred, phiblock);
991         if (newop1 == NULL)
992           return NULL;
993         if (newop1 != oldop1)
994           {
995             newexpr = pool_alloc (unary_node_pool);
996             memcpy (newexpr, expr, tree_size (expr));
997             create_tree_ann (newexpr);   
998             TREE_OPERAND (newexpr, 0) = get_value_handle (newop1);
999             lookup_or_add (value_table, newexpr);
1000             expr = newexpr;
1001             phi_trans_add (oldexpr, newexpr, pred);
1002           }
1003       }
1004       break;
1005     case 'd':
1006       abort ();
1007     case 'x':
1008       {
1009         tree phi = NULL;
1010         int i;
1011         if (TREE_CODE (expr) != SSA_NAME)
1012           abort ();
1013         if (TREE_CODE (SSA_NAME_DEF_STMT (expr)) == PHI_NODE)
1014           phi = SSA_NAME_DEF_STMT (expr);
1015         else
1016           return expr;
1017         
1018         for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1019           if (PHI_ARG_EDGE (phi, i)->src == pred)
1020             {
1021               tree val;
1022               if (is_undefined_value (PHI_ARG_DEF (phi, i)))
1023                 return NULL;
1024               val = lookup_or_add (value_table, PHI_ARG_DEF (phi, i));
1025               return PHI_ARG_DEF (phi, i);
1026             }
1027       }
1028       break;
1029     }
1030   return expr;
1031 }
1032
1033 static void
1034 phi_translate_set (value_set_t dest, value_set_t set, basic_block pred,
1035                    basic_block phiblock)
1036 {
1037   value_set_node_t node;
1038   for (node = set->head;
1039        node;
1040        node = node->next)
1041     {
1042       tree translated;
1043       translated = phi_translate (node->expr, set, pred, phiblock);
1044       phi_trans_add (node->expr, translated, pred);
1045       
1046       if (translated != NULL)
1047         value_insert_into_set (dest, translated);
1048     } 
1049 }
1050
1051 /* Find the leader for a value (IE the name representing that
1052    value) in a given set, and return it.  Return NULL if no leader is
1053    found.  */
1054
1055 static tree
1056 find_leader (value_set_t set, tree val)
1057 {
1058   value_set_node_t node;
1059
1060   if (val == NULL)
1061     return NULL;
1062
1063   if (TREE_CONSTANT (val))
1064     return TREE_CHAIN (val);
1065
1066   if (set->length == 0)
1067     return NULL;
1068   
1069   if (value_exists_in_set_bitmap (set, val))
1070     {
1071       for (node = set->head;
1072            node;
1073            node = node->next)
1074         {
1075           if (get_value_handle (node->expr) == val)
1076             return node->expr;
1077         }
1078     }
1079   return NULL;
1080 }
1081
1082 /* Determine if the expression EXPR is valid in SET.  This means that
1083    we have a leader for each part of the expression (if it consists of
1084    values), or the expression is an SSA_NAME.  
1085
1086    NB:  We never should run into a case where we have SSA_NAME +
1087    SSA_NAME or SSA_NAME + value.  The sets valid_in_set is called on,
1088    the ANTIC sets, will only ever have SSA_NAME's or binary value
1089    expression (IE VALUE1 + VALUE2)  */
1090
1091 static bool
1092 valid_in_set (value_set_t set, tree expr)
1093 {
1094   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
1095     {
1096     case '2':
1097       {
1098         tree op1 = TREE_OPERAND (expr, 0);
1099         tree op2 = TREE_OPERAND (expr, 1);
1100         return set_contains_value (set, op1) && set_contains_value (set, op2);
1101       }
1102       break;
1103     case '1':
1104       {
1105         tree op1 = TREE_OPERAND (expr, 0);
1106         return set_contains_value (set, op1);
1107       }
1108       break;
1109     case 'x':
1110       {
1111         if (TREE_CODE (expr) == SSA_NAME)
1112           return true;
1113         abort ();
1114       }
1115     case 'c':
1116       abort ();
1117     }
1118   return false;
1119 }
1120
1121 /* Clean the set of expressions that are no longer valid in SET.  This
1122    means expressions that are made up of values we have no leaders for
1123    in SET.  */
1124
1125 static void
1126 clean (value_set_t set)
1127 {
1128   value_set_node_t node;
1129   value_set_node_t next;
1130   node = set->head;
1131   while (node)
1132     {
1133       next = node->next;
1134       if (!valid_in_set (set, node->expr))      
1135         set_remove (set, node->expr);
1136       node = next;
1137     }
1138 }
1139
1140 /* Compute the ANTIC set for BLOCK.
1141
1142 ANTIC_OUT[BLOCK] = intersection of ANTIC_IN[b] for all succ(BLOCK), if
1143 succs(BLOCK) > 1
1144 ANTIC_OUT[BLOCK] = phi_translate (ANTIC_IN[succ(BLOCK)]) if
1145 succs(BLOCK) == 1
1146
1147 ANTIC_IN[BLOCK] = clean(ANTIC_OUT[BLOCK] U EXP_GEN[BLOCK] -
1148 TMP_GEN[BLOCK])
1149
1150 Iterate until fixpointed.
1151
1152 XXX: It would be nice to either write a set_clear, and use it for
1153 antic_out, or to mark the antic_out set as deleted at the end
1154 of this routine, so that the pool can hand the same memory back out
1155 again for the next antic_out.  */
1156
1157
1158 static bool
1159 compute_antic_aux (basic_block block)
1160 {
1161   basic_block son;
1162   edge e;
1163   bool changed = false;
1164   value_set_t S, old, ANTIC_OUT;
1165   value_set_node_t node;
1166   
1167   ANTIC_OUT = S = NULL;
1168   /* If any edges from predecessors are abnormal, antic_in is empty, so
1169      punt.  Remember that the block has an incoming abnormal edge by
1170      setting the BB_VISITED flag.  */
1171   if (! (block->flags & BB_VISITED))
1172     {
1173       for (e = block->pred; e; e = e->pred_next)
1174         if (e->flags & EDGE_ABNORMAL)
1175           {
1176             block->flags |= BB_VISITED;
1177             break;
1178           }
1179     }
1180   if (block->flags & BB_VISITED)
1181     {
1182       S = NULL;
1183       goto visit_sons;
1184     }
1185   
1186
1187   old = set_new (false);
1188   set_copy (old, ANTIC_IN (block));
1189   ANTIC_OUT = set_new (true);
1190
1191   /* If the block has no successors, ANTIC_OUT is empty, because it is
1192      the exit block.  */
1193   if (block->succ == NULL);
1194
1195   /* If we have one successor, we could have some phi nodes to
1196      translate through.  */
1197   else if (block->succ->succ_next == NULL)
1198     {
1199       phi_translate_set (ANTIC_OUT, ANTIC_IN(block->succ->dest),
1200                          block, block->succ->dest);
1201     }
1202   /* If we have multiple successors, we take the intersection of all of
1203      them.  */
1204   else
1205     {
1206       varray_type worklist;
1207       edge e;
1208       size_t i;
1209       basic_block bprime, first;
1210
1211       VARRAY_BB_INIT (worklist, 1, "succ");
1212       e = block->succ;
1213       while (e)
1214         {
1215           VARRAY_PUSH_BB (worklist, e->dest);
1216           e = e->succ_next;
1217         }
1218       first = VARRAY_BB (worklist, 0);
1219       set_copy (ANTIC_OUT, ANTIC_IN (first));
1220
1221       for (i = 1; i < VARRAY_ACTIVE_SIZE (worklist); i++)
1222         {
1223           bprime = VARRAY_BB (worklist, i);
1224           node = ANTIC_OUT->head;
1225           while (node)
1226             {
1227               tree val;
1228               value_set_node_t next = node->next;
1229               val = get_value_handle (node->expr);
1230               if (!set_contains_value (ANTIC_IN (bprime), val))
1231                 set_remove (ANTIC_OUT, node->expr);
1232               node = next;
1233             }
1234         }
1235       VARRAY_CLEAR (worklist);
1236     }
1237
1238   /* Generate ANTIC_OUT - TMP_GEN */
1239   S = set_subtract (ANTIC_OUT, TMP_GEN (block), false);
1240
1241   /* Start ANTIC_IN with EXP_GEN - TMP_GEN */
1242   ANTIC_IN (block) = set_subtract (EXP_GEN (block),TMP_GEN (block), true);
1243   
1244   /* Then union in the ANTIC_OUT - TMP_GEN values, to get ANTIC_OUT U
1245      EXP_GEN - TMP_GEN */
1246   for (node = S->head;
1247        node;
1248        node = node->next)
1249     {
1250       value_insert_into_set (ANTIC_IN (block), node->expr);
1251     }
1252   clean (ANTIC_IN (block));
1253   
1254
1255   if (!set_equal (old, ANTIC_IN (block)))
1256     changed = true;
1257
1258  visit_sons:
1259   if (dump_file && (dump_flags & TDF_DETAILS))
1260     {
1261       if (ANTIC_OUT)
1262         print_value_set (dump_file, ANTIC_OUT, "ANTIC_OUT", block->index);
1263       print_value_set (dump_file, ANTIC_IN (block), "ANTIC_IN", block->index);
1264       if (S)
1265         print_value_set (dump_file, S, "S", block->index);
1266
1267     }
1268
1269   for (son = first_dom_son (CDI_POST_DOMINATORS, block);
1270        son;
1271        son = next_dom_son (CDI_POST_DOMINATORS, son))
1272     {
1273       changed |= compute_antic_aux (son);
1274     }
1275   return changed;
1276 }
1277
1278 /* Compute ANTIC sets.  */
1279
1280 static void
1281 compute_antic (void)
1282 {
1283   bool changed = true;
1284   basic_block bb;
1285   int num_iterations = 0;
1286   FOR_ALL_BB (bb)
1287     {
1288       ANTIC_IN (bb) = set_new (true);
1289       if (bb->flags & BB_VISITED)
1290         abort ();
1291     }
1292
1293   while (changed)
1294     {
1295       num_iterations++;
1296       changed = false;
1297       changed = compute_antic_aux (EXIT_BLOCK_PTR);
1298     }
1299   FOR_ALL_BB (bb)
1300     {
1301       bb->flags &= ~BB_VISITED;
1302     }
1303   if (num_iterations > 2 && dump_file && (dump_flags & TDF_STATS))
1304     fprintf (dump_file, "compute_antic required %d iterations\n", num_iterations);
1305 }
1306
1307 /* Perform insertion of partially redundant values.
1308    For BLOCK, do the following:
1309    1.  Propagate the NEW_SETS of the dominator into the current block.
1310    If the block has multiple predecessors, 
1311        2a. Iterate over the ANTIC expressions for the block to see if
1312            any of them are partially redundant.
1313        2b. If so, insert them into the necessary predecessors to make
1314            the expression fully redundant.
1315        2c. Insert a new PHI merging the values of the predecessors.
1316        2d. Insert the new PHI, and the new expressions, into the
1317            NEW_SETS set.  
1318    3. Recursively call ourselves on the dominator children of BLOCK.
1319
1320 */
1321 static bool
1322 insert_aux (basic_block block)
1323 {
1324   basic_block son;
1325   bool new_stuff = false;
1326
1327   if (block)
1328     {
1329       value_set_node_t e;
1330       basic_block dom;
1331       dom = get_immediate_dominator (CDI_DOMINATORS, block);
1332       if (dom)
1333         {
1334           e = NEW_SETS (dom)->head;
1335           while (e)
1336             {
1337               insert_into_set (NEW_SETS (block), e->expr);
1338               value_replace_in_set (AVAIL_OUT (block), e->expr);
1339               e = e->next;
1340             }
1341           if (block->pred->pred_next)
1342             {
1343               value_set_node_t node;
1344               for (node = ANTIC_IN (block)->head;
1345                    node;
1346                    node = node->next)
1347                 {
1348                   if (TREE_CODE_CLASS (TREE_CODE (node->expr)) == '2'
1349                       || TREE_CODE_CLASS (TREE_CODE (node->expr)) == '1')
1350                     {
1351                       tree *avail;
1352                       tree val;
1353                       bool by_some = false;
1354                       bool cant_insert = false;
1355                       bool all_same = true;
1356                       tree first_s = NULL;
1357                       edge pred;
1358                       basic_block bprime;
1359                       tree eprime;
1360
1361                       val = get_value_handle (node->expr);
1362                       if (set_contains_value (PHI_GEN (block), val))
1363                         continue; 
1364                       if (set_contains_value (AVAIL_OUT (dom), val))
1365                         {
1366                           if (dump_file && (dump_flags & TDF_DETAILS))
1367                             fprintf (dump_file, "Found fully redundant value\n");
1368                           continue;
1369                         }
1370                                     
1371                       avail = xcalloc (last_basic_block, sizeof (tree));
1372                       for (pred = block->pred;
1373                            pred;
1374                            pred = pred->pred_next)
1375                         {
1376                           tree vprime;
1377                           tree edoubleprime;
1378                           bprime = pred->src;
1379                           eprime = phi_translate (node->expr,
1380                                                   ANTIC_IN (block),
1381                                                   bprime, block);
1382
1383                           /* eprime will generally only be NULL if the
1384                              value of the expression, translated
1385                              through the PHI for this predecessor, is
1386                              undefined.  If that is the case, we can't
1387                              make the expression fully redundant,
1388                              because its value is undefined along a
1389                              predecessor path.  We can thus break out
1390                              early because it doesn't matter what the
1391                              rest of the results are.  */
1392                           if (eprime == NULL)
1393                             {
1394                               cant_insert = true;
1395                               break;
1396                             }
1397
1398                           vprime = get_value_handle (eprime);
1399                           if (!vprime)
1400                             abort ();                     
1401                           edoubleprime = find_leader (AVAIL_OUT (bprime),
1402                                                       vprime);
1403                           if (edoubleprime == NULL)
1404                             {
1405                               avail[bprime->index] = eprime;
1406                               all_same = false;
1407                             }
1408                           else
1409                             {
1410                               avail[bprime->index] = edoubleprime;
1411                               by_some = true; 
1412                               if (first_s == NULL)
1413                                 first_s = edoubleprime;
1414                               else if (first_s != edoubleprime)
1415                                 all_same = false;
1416                               if (first_s != edoubleprime 
1417                                   && operand_equal_p (first_s, edoubleprime, 0))
1418                                 abort ();
1419                             }
1420                         }
1421                       /* If we can insert it, it's not the same value
1422                          already existing along every predecessor, and
1423                          it's defined by some predecessor, it is
1424                          partially redundant.  */
1425                       if (!cant_insert && !all_same && by_some)
1426                         {
1427                           tree type = TREE_TYPE (avail[block->pred->src->index]);
1428                           tree temp;
1429                           tree v;
1430
1431                           if (dump_file && (dump_flags & TDF_DETAILS))
1432                             {
1433                               fprintf (dump_file, "Found partial redundancy for expression ");
1434                               print_generic_expr (dump_file, node->expr, 0);
1435                               fprintf (dump_file, "\n");
1436                             }
1437
1438                           /* Make the necessary insertions. */
1439                           for (pred = block->pred;
1440                                pred;
1441                                pred = pred->pred_next)
1442                             {
1443                               bprime = pred->src;
1444                               eprime = avail[bprime->index];
1445                               if (TREE_CODE_CLASS (TREE_CODE (eprime)) == '2')
1446                                 {
1447                                   tree s1, s2;
1448                                   tree newexpr;
1449                                   s1 = find_leader (AVAIL_OUT (bprime),
1450                                                     TREE_OPERAND (eprime, 0));
1451                                   /* Depending on the order we process
1452                                      DOM branches in, the value may
1453                                      not have propagated to all the
1454                                      dom children yet during this
1455                                      iteration.  In this case, the
1456                                      value will always be in the
1457                                      NEW_SETS for *our* dominator */
1458                                   if (!s1)
1459                                     s1 = find_leader (NEW_SETS (dom),
1460                                                       TREE_OPERAND (eprime, 0));
1461                                   if (!s1)
1462                                     abort ();
1463                                   
1464                                   s2 = find_leader (AVAIL_OUT (bprime),
1465                                                     TREE_OPERAND (eprime, 1));
1466                                   if (!s2)
1467                                     s2 = find_leader (NEW_SETS (dom),
1468                                                       TREE_OPERAND (eprime, 1));
1469                                   if (!s2)
1470                                     abort ();
1471                                   
1472                                   temp = create_tmp_var (TREE_TYPE (eprime),
1473                                                          "pretmp");
1474                                   add_referenced_tmp_var (temp);
1475                                   newexpr = build (TREE_CODE (eprime),
1476                                                    TREE_TYPE (eprime),
1477                                                    s1, s2);
1478                                   newexpr = build (MODIFY_EXPR, 
1479                                                    TREE_TYPE (eprime),
1480                                                    temp, newexpr);
1481                                   temp = make_ssa_name (temp, newexpr);
1482                                   TREE_OPERAND (newexpr, 0) = temp;
1483                                   bsi_insert_on_edge (pred, newexpr);
1484                                   bsi_commit_edge_inserts (NULL);
1485                                   
1486                                   if (dump_file && (dump_flags & TDF_DETAILS))
1487                                     {                               
1488                                       fprintf (dump_file, "Inserted ");
1489                                       print_generic_expr (dump_file, newexpr, 0);
1490                                       fprintf (dump_file, " in predecessor %d\n", pred->src->index);
1491                                     }
1492                                   pre_stats.insertions++;
1493                                   v = lookup_or_add (value_table, eprime);
1494                                   add (value_table, temp, v);
1495                                   insert_into_set (NEW_SETS (bprime), temp);
1496                                   value_insert_into_set (AVAIL_OUT (bprime), 
1497                                                          temp);
1498                                   avail[bprime->index] = temp;
1499                                 }
1500                               else if (TREE_CODE_CLASS (TREE_CODE (eprime)) == '1')
1501                                 {
1502                                   tree s1;
1503                                   tree newexpr;
1504                                   s1 = find_leader (AVAIL_OUT (bprime),
1505                                                     TREE_OPERAND (eprime, 0));
1506                                   /* Depending on the order we process
1507                                      DOM branches in, the value may not have
1508                                      propagated to all the dom
1509                                      children yet in the current
1510                                      iteration, but it will be in
1511                                      NEW_SETS if it is not yet
1512                                      propagated.  */
1513                                      
1514                                   if (!s1)
1515                                     s1 = find_leader (NEW_SETS (dom),
1516                                                       TREE_OPERAND (eprime, 0));
1517                                   if (!s1)
1518                                     abort ();
1519                                   
1520                                   temp = create_tmp_var (TREE_TYPE (eprime),
1521                                                          "pretmp");
1522                                   add_referenced_tmp_var (temp);
1523                                   newexpr = build (TREE_CODE (eprime),
1524                                                    TREE_TYPE (eprime),
1525                                                    s1);
1526                                   newexpr = build (MODIFY_EXPR, 
1527                                                    TREE_TYPE (eprime),
1528                                                    temp, newexpr);
1529                                   temp = make_ssa_name (temp, newexpr);
1530                                   TREE_OPERAND (newexpr, 0) = temp;
1531                                   bsi_insert_on_edge (pred, newexpr);
1532                                   bsi_commit_edge_inserts (NULL);
1533                                   
1534                                   if (dump_file && (dump_flags & TDF_DETAILS))
1535                                     {                               
1536                                       fprintf (dump_file, "Inserted ");
1537                                       print_generic_expr (dump_file, newexpr, 0);
1538                                       fprintf (dump_file, " in predecessor %d\n", pred->src->index);
1539                                     }
1540                                   pre_stats.insertions++;
1541                                   v = lookup_or_add (value_table, eprime);
1542                                   add (value_table, temp, v);
1543                                   insert_into_set (NEW_SETS (bprime), temp);
1544                                   value_insert_into_set (AVAIL_OUT (bprime), 
1545                                                          temp);
1546                                   avail[bprime->index] = temp;
1547                                 }
1548                             }           
1549                           /* Now build a phi for the new variable.  */
1550                           temp = create_tmp_var (type, "prephitmp");
1551                           add_referenced_tmp_var (temp);
1552                           temp = create_phi_node (temp, block);
1553                           add (value_table, PHI_RESULT (temp), val);
1554
1555 #if 0
1556                           if (!set_contains_value (AVAIL_OUT (block), val))
1557                             insert_into_set (AVAIL_OUT (block), 
1558                                              PHI_RESULT (temp));
1559                           else
1560 #endif
1561                             value_replace_in_set (AVAIL_OUT (block), 
1562                                                  PHI_RESULT (temp));
1563                           for (pred = block->pred;
1564                                pred;
1565                                pred = pred->pred_next)
1566                             {
1567                               add_phi_arg (&temp, avail[pred->src->index],
1568                                            pred);
1569                             }
1570                           if (dump_file && (dump_flags & TDF_DETAILS))
1571                             {
1572                               fprintf (dump_file, "Created phi ");
1573                               print_generic_expr (dump_file, temp, 0);
1574                               fprintf (dump_file, " in block %d\n", block->index);
1575                             }
1576                           pre_stats.phis++;
1577                           new_stuff = true;
1578                           insert_into_set (NEW_SETS (block),
1579                                            PHI_RESULT (temp));
1580                           insert_into_set (PHI_GEN (block),
1581                                            PHI_RESULT (temp));
1582                         }
1583
1584                       free (avail);
1585                     }
1586                 }
1587             }
1588         }
1589     }
1590   for (son = first_dom_son (CDI_DOMINATORS, block);
1591        son;
1592        son = next_dom_son (CDI_DOMINATORS, son))
1593     {
1594       new_stuff |= insert_aux (son);
1595     }
1596
1597   return new_stuff;
1598 }
1599
1600 /* Perform insertion of partially redundant values.  */
1601
1602 static void
1603 insert (void)
1604 {
1605   bool new_stuff = true;
1606   basic_block bb;
1607   int num_iterations = 0;
1608
1609   FOR_ALL_BB (bb)
1610     NEW_SETS (bb) = set_new (true);
1611   
1612   while (new_stuff)
1613     {
1614       num_iterations++;
1615       new_stuff = false;
1616       new_stuff = insert_aux (ENTRY_BLOCK_PTR);
1617     }
1618   if (num_iterations > 2 && dump_file && (dump_flags & TDF_STATS))
1619     fprintf (dump_file, "insert required %d iterations\n", num_iterations);
1620 }
1621
1622 /* Return true if EXPR has no defining statement in this procedure,
1623    *AND* isn't a live-on-entry parameter.  */
1624 static bool
1625 is_undefined_value (tree expr)
1626 {  
1627   
1628 #ifdef ENABLE_CHECKING
1629   /* We should never be handed DECL's  */
1630   if (DECL_P (expr))
1631     abort ();
1632 #endif
1633   if (TREE_CODE (expr) == SSA_NAME)
1634     {
1635       /* XXX: Is this the correct test?  */
1636       if (TREE_CODE (SSA_NAME_VAR (expr)) == PARM_DECL)
1637         return false;
1638       if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (expr)))
1639         return true;
1640     }
1641   return false;
1642 }
1643
1644 /* Compute the AVAIL set for BLOCK.
1645    This function performs value numbering of the statements in BLOCK. 
1646    The AVAIL sets are built from information we glean while doing this
1647    value numbering, since the AVAIL sets contain only entry per
1648    value.
1649
1650    
1651    AVAIL_IN[BLOCK] = AVAIL_OUT[dom(BLOCK)].
1652    AVAIL_OUT[BLOCK] = AVAIL_IN[BLOCK] U PHI_GEN[BLOCK] U
1653    TMP_GEN[BLOCK].
1654 */
1655
1656 static void
1657 compute_avail (basic_block block)
1658 {
1659   basic_block son;
1660   
1661   /* For arguments with default definitions, we pretend they are
1662      defined in the entry block.  */
1663   if (block == ENTRY_BLOCK_PTR)
1664     {
1665       tree param;
1666       for (param = DECL_ARGUMENTS (current_function_decl);
1667            param;
1668            param = TREE_CHAIN (param))
1669         {
1670           if (default_def (param) != NULL)
1671             {
1672               tree val;
1673               tree def = default_def (param);
1674               val = lookup_or_add (value_table, def);
1675               insert_into_set (TMP_GEN (block), def);
1676               value_insert_into_set (AVAIL_OUT (block), def);
1677             }
1678         }
1679     }
1680   else if (block)
1681     {
1682       block_stmt_iterator bsi;
1683       tree stmt, phi;
1684       basic_block dom;
1685
1686       dom = get_immediate_dominator (CDI_DOMINATORS, block);
1687       if (dom)
1688         set_copy (AVAIL_OUT (block), AVAIL_OUT (dom));
1689       for (phi = phi_nodes (block); phi; phi = PHI_CHAIN (phi))
1690         {
1691           /* Ignore virtual PHIs until we can do PRE on expressions
1692              with virtual operands.  */
1693           if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
1694             continue;
1695
1696           lookup_or_add (value_table, PHI_RESULT (phi));
1697           value_insert_into_set (AVAIL_OUT (block), PHI_RESULT (phi));
1698           insert_into_set (PHI_GEN (block), PHI_RESULT (phi));
1699         }
1700
1701       for (bsi = bsi_start (block); !bsi_end_p (bsi); bsi_next (&bsi))
1702         {
1703           tree op0, op1;
1704           stmt = bsi_stmt (bsi);
1705           get_stmt_operands (stmt);
1706           
1707           if (NUM_VUSES (STMT_VUSE_OPS (stmt))
1708               || NUM_V_MUST_DEFS (STMT_V_MUST_DEF_OPS (stmt))
1709               || NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt))
1710               || stmt_ann (stmt)->has_volatile_ops)
1711             {
1712               size_t j;
1713               for (j = 0; j < NUM_DEFS (STMT_DEF_OPS (stmt)); j++)
1714                 {
1715                   tree def = DEF_OP (STMT_DEF_OPS (stmt), j);
1716                   lookup_or_add (value_table, def);
1717                   insert_into_set (TMP_GEN (block), def);
1718                   value_insert_into_set (AVAIL_OUT (block), def);
1719                 }
1720               for (j = 0; j < NUM_USES (STMT_USE_OPS (stmt)); j++)
1721                 {
1722                   tree use = USE_OP (STMT_USE_OPS (stmt), j);
1723                   if (TREE_CODE (use) == SSA_NAME)
1724                     {
1725                       lookup_or_add (value_table, use);
1726                       insert_into_set (TMP_GEN (block), use);
1727                       value_insert_into_set (AVAIL_OUT (block), use);
1728                     }
1729                 }
1730               continue;
1731             }
1732           else if (TREE_CODE (stmt) == RETURN_EXPR
1733                    && TREE_OPERAND (stmt, 0)
1734                    && TREE_CODE (TREE_OPERAND (stmt, 0)) == MODIFY_EXPR)
1735             stmt = TREE_OPERAND (stmt, 0);
1736           
1737           if (TREE_CODE (stmt) == MODIFY_EXPR)
1738             {
1739               op0 = TREE_OPERAND (stmt, 0);
1740               if (TREE_CODE (op0) != SSA_NAME)
1741                 continue;
1742               if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
1743                 continue;
1744               op1 = TREE_OPERAND (stmt, 1);
1745               STRIP_USELESS_TYPE_CONVERSION (op1);
1746               if (TREE_CODE_CLASS (TREE_CODE (op1)) == 'c')
1747                 {
1748                   add (value_table, op0, lookup_or_add (value_table, op1));
1749                   insert_into_set (TMP_GEN (block), op0);
1750                   value_insert_into_set (AVAIL_OUT (block), op0);
1751                 }
1752               else if (TREE_CODE_CLASS (TREE_CODE (op1)) == '2')
1753                 {
1754                   tree bop1, bop2;
1755                   tree val, val1, val2;
1756                   tree newt;
1757                   bop1 = TREE_OPERAND (op1, 0);
1758                   bop2 = TREE_OPERAND (op1, 1);
1759                   val1 = lookup_or_add (value_table, bop1);
1760                   val2 = lookup_or_add (value_table, bop2);
1761  
1762                   newt = pool_alloc (binary_node_pool);
1763                   memcpy (newt, op1, tree_size (op1));
1764                   TREE_OPERAND (newt, 0) = val1;
1765                   TREE_OPERAND (newt, 1) = val2;
1766                   val = lookup_or_add (value_table, newt);
1767                   add (value_table, op0, val);
1768                   if (!is_undefined_value (bop1))
1769                     value_insert_into_set (EXP_GEN (block), bop1);
1770                   if (!is_undefined_value (bop2))
1771                     value_insert_into_set (EXP_GEN (block), bop2);
1772                   value_insert_into_set (EXP_GEN (block), newt);
1773                   insert_into_set (TMP_GEN (block), op0);
1774                   value_insert_into_set (AVAIL_OUT (block), op0);  
1775                 }
1776               else if (TREE_CODE_CLASS (TREE_CODE (op1)) == '1'
1777                        && !is_gimple_cast (op1))
1778                 {
1779                   tree uop;
1780                   tree val, val1;
1781                   tree newt;
1782                   uop = TREE_OPERAND (op1, 0);
1783                   val1 = lookup_or_add (value_table, uop);
1784                   newt = pool_alloc (unary_node_pool);
1785                   memcpy (newt, op1, tree_size (op1));
1786                   TREE_OPERAND (newt, 0) = val1;
1787                   val = lookup_or_add (value_table, newt);
1788                   add (value_table, op0, val);
1789                   if (!is_undefined_value (uop))
1790                     value_insert_into_set (EXP_GEN (block), uop);
1791                   value_insert_into_set (EXP_GEN (block), newt);
1792                   insert_into_set (TMP_GEN (block), op0);
1793                   value_insert_into_set (AVAIL_OUT (block), op0);
1794                 }
1795               else if (TREE_CODE (op1) == SSA_NAME)
1796                 {
1797                   tree val = lookup_or_add (value_table, op1);
1798                   add (value_table, op0, val);
1799                   if (!is_undefined_value (op1))
1800                     value_insert_into_set (EXP_GEN (block), op1);
1801                   insert_into_set (TMP_GEN (block), op0);
1802                   value_insert_into_set (AVAIL_OUT (block), op0);
1803                 }
1804               else
1805                 {
1806                   size_t j;
1807                   for (j = 0; j < NUM_DEFS (STMT_DEF_OPS (stmt)); j++)
1808                     {
1809                       tree def = DEF_OP (STMT_DEF_OPS (stmt), j);
1810                       lookup_or_add (value_table, def);
1811                       insert_into_set (TMP_GEN (block), def);
1812                       value_insert_into_set (AVAIL_OUT (block), def);
1813                       if (def != op0)
1814                         abort ();
1815                     }
1816                   for (j = 0; j < NUM_USES (STMT_USE_OPS (stmt)); j++)
1817                     {
1818                       tree use = USE_OP (STMT_USE_OPS (stmt), j);
1819                       if (TREE_CODE (use) == SSA_NAME)
1820                         {
1821                           lookup_or_add (value_table, use);
1822                           insert_into_set (TMP_GEN (block), use);
1823                           value_insert_into_set (AVAIL_OUT (block), use);
1824                         }
1825                     }
1826                 }
1827             }
1828           else
1829             {
1830               size_t j;
1831               for (j = 0; j < NUM_DEFS (STMT_DEF_OPS (stmt)); j++)
1832                 {
1833                   tree def = DEF_OP (STMT_DEF_OPS (stmt), j);
1834                   lookup_or_add (value_table, def);
1835                   insert_into_set (TMP_GEN (block), def);
1836                   value_insert_into_set (AVAIL_OUT (block), def);
1837                 }
1838               for (j = 0; j < NUM_USES (STMT_USE_OPS (stmt)); j++)
1839                 {
1840                   tree use = USE_OP (STMT_USE_OPS (stmt), j);
1841                   if (TREE_CODE (use) == SSA_NAME)
1842                     {
1843                       lookup_or_add (value_table, use);
1844                       insert_into_set (TMP_GEN (block), use);
1845                       value_insert_into_set (AVAIL_OUT (block), use);
1846                     }
1847                 }
1848             }
1849         }
1850     }
1851   for (son = first_dom_son (CDI_DOMINATORS, block);
1852        son;
1853        son = next_dom_son (CDI_DOMINATORS, son))
1854     compute_avail (son);
1855
1856 }
1857
1858 /* Eliminate fully redundant computations.  */
1859
1860 static void
1861 eliminate (void)
1862 {
1863   basic_block b;
1864
1865   FOR_EACH_BB (b)
1866     {
1867       block_stmt_iterator i;
1868       
1869       for (i = bsi_start (b); !bsi_end_p (i); bsi_next (&i))
1870         {
1871           tree stmt = bsi_stmt (i);
1872
1873           if (NUM_VUSES (STMT_VUSE_OPS (stmt))
1874               || NUM_V_MUST_DEFS (STMT_V_MUST_DEF_OPS (stmt))
1875               || NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt))
1876               || stmt_ann (stmt)->has_volatile_ops)
1877             continue;
1878           /* Lookup the RHS of the expression, see if we have an
1879              available computation for it. If so, replace the RHS with
1880              the available computation.  */
1881           if (TREE_CODE (stmt) == MODIFY_EXPR)
1882             {
1883               tree t = TREE_OPERAND (stmt, 0);
1884               tree expr = TREE_OPERAND (stmt, 1);
1885               tree sprime;
1886               /* There is no point in eliminating NOP_EXPR, it isn't
1887                  supposed to generate any code.  */
1888               if (TREE_CODE (expr) == NOP_EXPR
1889                   || (TREE_CODE_CLASS (TREE_CODE (expr)) != '2' 
1890                    && TREE_CODE_CLASS (TREE_CODE (expr)) != '1'))
1891                 continue;
1892               sprime = find_leader (AVAIL_OUT (b),
1893                                     lookup (value_table, t));
1894               if (sprime 
1895                   && sprime != t 
1896                   && may_propagate_copy (sprime, TREE_OPERAND (stmt, 1)))
1897                 {
1898                   if (dump_file && (dump_flags & TDF_DETAILS))
1899                     {
1900                       fprintf (dump_file, "Replaced ");
1901                       print_generic_expr (dump_file, expr, 0);
1902                       fprintf (dump_file, " with ");
1903                       print_generic_expr (dump_file, sprime, 0);
1904                       fprintf (dump_file, " in ");
1905                       print_generic_stmt (dump_file, stmt, 0);
1906                     }
1907                   pre_stats.eliminations++;
1908                   propagate_tree_value (&TREE_OPERAND (stmt, 1), sprime);
1909                   modify_stmt (stmt);
1910                 }
1911             }
1912
1913         }
1914     }
1915 }
1916
1917 /* Main entry point to the SSA-PRE pass.
1918
1919    PHASE indicates which dump file from the DUMP_FILES array to use when
1920    dumping debugging information.  */
1921
1922 static void
1923 execute_pre (void)
1924 {
1925   size_t tsize;
1926   basic_block bb;
1927   pre_uid = num_referenced_vars;
1928   memset (&pre_stats, 0, sizeof (pre_stats));
1929   FOR_ALL_BB (bb)
1930     {
1931       bb->aux = xcalloc (1, sizeof (struct bb_value_sets));
1932     }
1933   phi_translate_table = htab_create (511, expr_pred_trans_hash,
1934                                      expr_pred_trans_eq,
1935                                      free);
1936   value_table = htab_create (511, val_expr_pair_hash,
1937                              val_expr_pair_expr_eq, free);
1938   value_set_pool = create_alloc_pool ("Value sets",
1939                                       sizeof (struct value_set), 30);
1940   value_set_node_pool = create_alloc_pool ("Value set nodes",
1941                                        sizeof (struct value_set_node), 30);
1942   calculate_dominance_info (CDI_POST_DOMINATORS);
1943   calculate_dominance_info (CDI_DOMINATORS);
1944   tsize = tree_size (build (PLUS_EXPR, void_type_node, NULL_TREE,
1945                             NULL_TREE));
1946   binary_node_pool = create_alloc_pool ("Binary tree nodes", tsize, 30);
1947   tsize = tree_size (build1 (NEGATE_EXPR, void_type_node, NULL_TREE));
1948   unary_node_pool = create_alloc_pool ("Unary tree nodes", tsize, 30);
1949
1950   FOR_ALL_BB (bb)
1951     {
1952       EXP_GEN (bb) = set_new (true);
1953       PHI_GEN (bb) = set_new (true);
1954       TMP_GEN (bb) = set_new (false);
1955       AVAIL_OUT (bb) = set_new (true);
1956     }
1957
1958   compute_avail (ENTRY_BLOCK_PTR);
1959
1960   if (dump_file && (dump_flags & TDF_DETAILS))
1961     {
1962       FOR_ALL_BB (bb)
1963         {
1964           print_value_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
1965           print_value_set (dump_file, TMP_GEN (bb), "tmp_gen", bb->index);
1966           print_value_set (dump_file, AVAIL_OUT (bb), "avail_out", bb->index);
1967         }
1968     }
1969
1970   /* Insert can get quite slow on an incredibly large number of basic
1971      blocks due to some quadratic behavior.  Until this behavior is
1972      fixed, don't run it when he have an incredibly large number of
1973      bb's.  If we aren't going to run insert, there is no point in
1974      computing ANTIC, either, even though it's plenty fast.  */
1975  
1976   if (n_basic_blocks < 4000)
1977     {
1978       compute_antic ();
1979       
1980       insert ();
1981     }
1982   eliminate ();
1983   
1984   if (dump_file && (dump_flags & TDF_STATS))
1985     {
1986       fprintf (dump_file, "Insertions:%d\n", pre_stats.insertions);
1987       fprintf (dump_file, "New PHIs:%d\n", pre_stats.phis);
1988       fprintf (dump_file, "Eliminated:%d\n", pre_stats.eliminations);
1989     }
1990
1991   free_alloc_pool (value_set_pool);
1992   free_alloc_pool (value_set_node_pool);
1993   free_alloc_pool (binary_node_pool);
1994   free_alloc_pool (unary_node_pool);
1995   htab_delete (value_table);
1996   htab_delete (phi_translate_table);
1997   
1998   FOR_ALL_BB (bb)
1999     {
2000       free (bb->aux);
2001       bb->aux = NULL;
2002     }
2003   free_dominance_info (CDI_POST_DOMINATORS);
2004 }
2005
2006 static bool
2007 gate_pre (void)
2008 {
2009   return flag_tree_pre != 0;
2010 }
2011
2012 struct tree_opt_pass pass_pre =
2013 {
2014   "pre",                                /* name */
2015   gate_pre,                             /* gate */
2016   execute_pre,                          /* execute */
2017   NULL,                                 /* sub */
2018   NULL,                                 /* next */
2019   0,                                    /* static_pass_number */
2020   TV_TREE_PRE,                          /* tv_id */
2021   PROP_no_crit_edges | PROP_cfg | PROP_ssa,/* properties_required */
2022   0,                                    /* properties_provided */
2023   0,                                    /* properties_destroyed */
2024   0,                                    /* todo_flags_start */
2025   TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
2026 };