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