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