OSDN Git Service

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