OSDN Git Service

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