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