OSDN Git Service

2009-12-10 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-pre.c
1 /* SSA-PRE for trees.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Daniel Berlin <dan@dberlin.org> and Steven Bosscher
5    <stevenb@suse.de>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
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 "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 "obstack.h"
42 #include "tree-pass.h"
43 #include "flags.h"
44 #include "bitmap.h"
45 #include "langhooks.h"
46 #include "cfgloop.h"
47 #include "tree-ssa-sccvn.h"
48 #include "tree-scalar-evolution.h"
49 #include "params.h"
50 #include "dbgcnt.h"
51
52 /* TODO:
53
54    1. Avail sets can be shared by making an avail_find_leader that
55       walks up the dominator tree and looks in those avail sets.
56       This might affect code optimality, it's unclear right now.
57    2. Strength reduction can be performed by anticipating expressions
58       we can repair later on.
59    3. We can do back-substitution or smarter value numbering to catch
60       commutative expressions split up over multiple statements.
61 */
62
63 /* For ease of terminology, "expression node" in the below refers to
64    every expression node but GIMPLE_ASSIGN, because GIMPLE_ASSIGNs
65    represent the actual statement containing the expressions we care about,
66    and 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
108    For the partial anticipation case, we only perform insertion if it
109    is partially anticipated in some block, and fully available in all
110    of the predecessors.
111
112    insert/insert_aux/do_regular_insertion/do_partial_partial_insertion
113    performs these steps.
114
115    Fourth, we eliminate fully redundant expressions.
116    This is a simple statement walk that replaces redundant
117    calculations with the now available values.  */
118
119 /* Representations of value numbers:
120
121    Value numbers are represented by a representative SSA_NAME.  We
122    will create fake SSA_NAME's in situations where we need a
123    representative but do not have one (because it is a complex
124    expression).  In order to facilitate storing the value numbers in
125    bitmaps, and keep the number of wasted SSA_NAME's down, we also
126    associate a value_id with each value number, and create full blown
127    ssa_name's only where we actually need them (IE in operands of
128    existing expressions).
129
130    Theoretically you could replace all the value_id's with
131    SSA_NAME_VERSION, but this would allocate a large number of
132    SSA_NAME's (which are each > 30 bytes) just to get a 4 byte number.
133    It would also require an additional indirection at each point we
134    use the value id.  */
135
136 /* Representation of expressions on value numbers:
137
138    Expressions consisting of value numbers are represented the same
139    way as our VN internally represents them, with an additional
140    "pre_expr" wrapping around them in order to facilitate storing all
141    of the expressions in the same sets.  */
142
143 /* Representation of sets:
144
145    The dataflow sets do not need to be sorted in any particular order
146    for the majority of their lifetime, are simply represented as two
147    bitmaps, one that keeps track of values present in the set, and one
148    that keeps track of expressions present in the set.
149
150    When we need them in topological order, we produce it on demand by
151    transforming the bitmap into an array and sorting it into topo
152    order.  */
153
154 /* Type of expression, used to know which member of the PRE_EXPR union
155    is valid.  */
156
157 enum pre_expr_kind
158 {
159     NAME,
160     NARY,
161     REFERENCE,
162     CONSTANT
163 };
164
165 typedef union pre_expr_union_d
166 {
167   tree name;
168   tree constant;
169   vn_nary_op_t nary;
170   vn_reference_t reference;
171 } pre_expr_union;
172
173 typedef struct pre_expr_d
174 {
175   enum pre_expr_kind kind;
176   unsigned int id;
177   pre_expr_union u;
178 } *pre_expr;
179
180 #define PRE_EXPR_NAME(e) (e)->u.name
181 #define PRE_EXPR_NARY(e) (e)->u.nary
182 #define PRE_EXPR_REFERENCE(e) (e)->u.reference
183 #define PRE_EXPR_CONSTANT(e) (e)->u.constant
184
185 static int
186 pre_expr_eq (const void *p1, const void *p2)
187 {
188   const struct pre_expr_d *e1 = (const struct pre_expr_d *) p1;
189   const struct pre_expr_d *e2 = (const struct pre_expr_d *) p2;
190
191   if (e1->kind != e2->kind)
192     return false;
193
194   switch (e1->kind)
195     {
196     case CONSTANT:
197       return vn_constant_eq_with_type (PRE_EXPR_CONSTANT (e1),
198                                        PRE_EXPR_CONSTANT (e2));
199     case NAME:
200       return PRE_EXPR_NAME (e1) == PRE_EXPR_NAME (e2);
201     case NARY:
202       return vn_nary_op_eq (PRE_EXPR_NARY (e1), PRE_EXPR_NARY (e2));
203     case REFERENCE:
204       return vn_reference_eq (PRE_EXPR_REFERENCE (e1),
205                               PRE_EXPR_REFERENCE (e2));
206     default:
207       abort();
208     }
209 }
210
211 static hashval_t
212 pre_expr_hash (const void *p1)
213 {
214   const struct pre_expr_d *e = (const struct pre_expr_d *) p1;
215   switch (e->kind)
216     {
217     case CONSTANT:
218       return vn_hash_constant_with_type (PRE_EXPR_CONSTANT (e));
219     case NAME:
220       return iterative_hash_hashval_t (SSA_NAME_VERSION (PRE_EXPR_NAME (e)), 0);
221     case NARY:
222       return PRE_EXPR_NARY (e)->hashcode;
223     case REFERENCE:
224       return PRE_EXPR_REFERENCE (e)->hashcode;
225     default:
226       abort ();
227     }
228 }
229
230
231 /* Next global expression id number.  */
232 static unsigned int next_expression_id;
233
234 /* Mapping from expression to id number we can use in bitmap sets.  */
235 DEF_VEC_P (pre_expr);
236 DEF_VEC_ALLOC_P (pre_expr, heap);
237 static VEC(pre_expr, heap) *expressions;
238 static htab_t expression_to_id;
239
240 /* Allocate an expression id for EXPR.  */
241
242 static inline unsigned int
243 alloc_expression_id (pre_expr expr)
244 {
245   void **slot;
246   /* Make sure we won't overflow. */
247   gcc_assert (next_expression_id + 1 > next_expression_id);
248   expr->id = next_expression_id++;
249   VEC_safe_push (pre_expr, heap, expressions, expr);
250   slot = htab_find_slot (expression_to_id, expr, INSERT);
251   gcc_assert (!*slot);
252   *slot = expr;
253   return next_expression_id - 1;
254 }
255
256 /* Return the expression id for tree EXPR.  */
257
258 static inline unsigned int
259 get_expression_id (const pre_expr expr)
260 {
261   return expr->id;
262 }
263
264 static inline unsigned int
265 lookup_expression_id (const pre_expr expr)
266 {
267   void **slot;
268
269   slot = htab_find_slot (expression_to_id, expr, NO_INSERT);
270   if (!slot)
271     return 0;
272   return ((pre_expr)*slot)->id;
273 }
274
275 /* Return the existing expression id for EXPR, or create one if one
276    does not exist yet.  */
277
278 static inline unsigned int
279 get_or_alloc_expression_id (pre_expr expr)
280 {
281   unsigned int id = lookup_expression_id (expr);
282   if (id == 0)
283     return alloc_expression_id (expr);
284   return expr->id = id;
285 }
286
287 /* Return the expression that has expression id ID */
288
289 static inline pre_expr
290 expression_for_id (unsigned int id)
291 {
292   return VEC_index (pre_expr, expressions, id);
293 }
294
295 /* Free the expression id field in all of our expressions,
296    and then destroy the expressions array.  */
297
298 static void
299 clear_expression_ids (void)
300 {
301   VEC_free (pre_expr, heap, expressions);
302 }
303
304 static alloc_pool pre_expr_pool;
305
306 /* Given an SSA_NAME NAME, get or create a pre_expr to represent it.  */
307
308 static pre_expr
309 get_or_alloc_expr_for_name (tree name)
310 {
311   pre_expr result = (pre_expr) pool_alloc (pre_expr_pool);
312   unsigned int result_id;
313
314   result->kind = NAME;
315   result->id = 0;
316   PRE_EXPR_NAME (result) = name;
317   result_id = lookup_expression_id (result);
318   if (result_id != 0)
319     {
320       pool_free (pre_expr_pool, result);
321       result = expression_for_id (result_id);
322       return result;
323     }
324   get_or_alloc_expression_id (result);
325   return result;
326 }
327
328 static bool in_fre = false;
329
330 /* An unordered bitmap set.  One bitmap tracks values, the other,
331    expressions.  */
332 typedef struct bitmap_set
333 {
334   bitmap expressions;
335   bitmap values;
336 } *bitmap_set_t;
337
338 #define FOR_EACH_EXPR_ID_IN_SET(set, id, bi)            \
339   EXECUTE_IF_SET_IN_BITMAP((set)->expressions, 0, (id), (bi))
340
341 #define FOR_EACH_VALUE_ID_IN_SET(set, id, bi)           \
342   EXECUTE_IF_SET_IN_BITMAP((set)->values, 0, (id), (bi))
343
344 /* Mapping from value id to expressions with that value_id.  */
345 DEF_VEC_P (bitmap_set_t);
346 DEF_VEC_ALLOC_P (bitmap_set_t, heap);
347 static VEC(bitmap_set_t, heap) *value_expressions;
348
349 /* Sets that we need to keep track of.  */
350 typedef struct bb_bitmap_sets
351 {
352   /* The EXP_GEN set, which represents expressions/values generated in
353      a basic block.  */
354   bitmap_set_t exp_gen;
355
356   /* The PHI_GEN set, which represents PHI results generated in a
357      basic block.  */
358   bitmap_set_t phi_gen;
359
360   /* The TMP_GEN set, which represents results/temporaries generated
361      in a basic block. IE the LHS of an expression.  */
362   bitmap_set_t tmp_gen;
363
364   /* The AVAIL_OUT set, which represents which values are available in
365      a given basic block.  */
366   bitmap_set_t avail_out;
367
368   /* The ANTIC_IN set, which represents which values are anticipatable
369      in a given basic block.  */
370   bitmap_set_t antic_in;
371
372   /* The PA_IN set, which represents which values are
373      partially anticipatable in a given basic block.  */
374   bitmap_set_t pa_in;
375
376   /* The NEW_SETS set, which is used during insertion to augment the
377      AVAIL_OUT set of blocks with the new insertions performed during
378      the current iteration.  */
379   bitmap_set_t new_sets;
380
381   /* A cache for value_dies_in_block_x.  */
382   bitmap expr_dies;
383
384   /* True if we have visited this block during ANTIC calculation.  */
385   unsigned int visited:1;
386
387   /* True we have deferred processing this block during ANTIC
388      calculation until its successor is processed.  */
389   unsigned int deferred : 1;
390 } *bb_value_sets_t;
391
392 #define EXP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->exp_gen
393 #define PHI_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->phi_gen
394 #define TMP_GEN(BB)     ((bb_value_sets_t) ((BB)->aux))->tmp_gen
395 #define AVAIL_OUT(BB)   ((bb_value_sets_t) ((BB)->aux))->avail_out
396 #define ANTIC_IN(BB)    ((bb_value_sets_t) ((BB)->aux))->antic_in
397 #define PA_IN(BB)       ((bb_value_sets_t) ((BB)->aux))->pa_in
398 #define NEW_SETS(BB)    ((bb_value_sets_t) ((BB)->aux))->new_sets
399 #define EXPR_DIES(BB)   ((bb_value_sets_t) ((BB)->aux))->expr_dies
400 #define BB_VISITED(BB)  ((bb_value_sets_t) ((BB)->aux))->visited
401 #define BB_DEFERRED(BB) ((bb_value_sets_t) ((BB)->aux))->deferred
402
403
404 /* Basic block list in postorder.  */
405 static int *postorder;
406
407 /* This structure is used to keep track of statistics on what
408    optimization PRE was able to perform.  */
409 static struct
410 {
411   /* The number of RHS computations eliminated by PRE.  */
412   int eliminations;
413
414   /* The number of new expressions/temporaries generated by PRE.  */
415   int insertions;
416
417   /* The number of inserts found due to partial anticipation  */
418   int pa_insert;
419
420   /* The number of new PHI nodes added by PRE.  */
421   int phis;
422
423   /* The number of values found constant.  */
424   int constified;
425
426 } pre_stats;
427
428 static bool do_partial_partial;
429 static pre_expr bitmap_find_leader (bitmap_set_t, unsigned int, gimple);
430 static void bitmap_value_insert_into_set (bitmap_set_t, pre_expr);
431 static void bitmap_value_replace_in_set (bitmap_set_t, pre_expr);
432 static void bitmap_set_copy (bitmap_set_t, bitmap_set_t);
433 static bool bitmap_set_contains_value (bitmap_set_t, unsigned int);
434 static void bitmap_insert_into_set (bitmap_set_t, pre_expr);
435 static void bitmap_insert_into_set_1 (bitmap_set_t, pre_expr, bool);
436 static bitmap_set_t bitmap_set_new (void);
437 static tree create_expression_by_pieces (basic_block, pre_expr, gimple_seq *,
438                                          gimple, tree);
439 static tree find_or_generate_expression (basic_block, pre_expr, gimple_seq *,
440                                          gimple);
441 static unsigned int get_expr_value_id (pre_expr);
442
443 /* We can add and remove elements and entries to and from sets
444    and hash tables, so we use alloc pools for them.  */
445
446 static alloc_pool bitmap_set_pool;
447 static bitmap_obstack grand_bitmap_obstack;
448
449 /* To avoid adding 300 temporary variables when we only need one, we
450    only create one temporary variable, on demand, and build ssa names
451    off that.  We do have to change the variable if the types don't
452    match the current variable's type.  */
453 static tree pretemp;
454 static tree storetemp;
455 static tree prephitemp;
456
457 /* Set of blocks with statements that have had its EH information
458    cleaned up.  */
459 static bitmap need_eh_cleanup;
460
461 /* The phi_translate_table caches phi translations for a given
462    expression and predecessor.  */
463
464 static htab_t phi_translate_table;
465
466 /* A three tuple {e, pred, v} used to cache phi translations in the
467    phi_translate_table.  */
468
469 typedef struct expr_pred_trans_d
470 {
471   /* The expression.  */
472   pre_expr e;
473
474   /* The predecessor block along which we translated the expression.  */
475   basic_block pred;
476
477   /* The value that resulted from the translation.  */
478   pre_expr v;
479
480   /* The hashcode for the expression, pred pair. This is cached for
481      speed reasons.  */
482   hashval_t hashcode;
483 } *expr_pred_trans_t;
484 typedef const struct expr_pred_trans_d *const_expr_pred_trans_t;
485
486 /* Return the hash value for a phi translation table entry.  */
487
488 static hashval_t
489 expr_pred_trans_hash (const void *p)
490 {
491   const_expr_pred_trans_t const ve = (const_expr_pred_trans_t) p;
492   return ve->hashcode;
493 }
494
495 /* Return true if two phi translation table entries are the same.
496    P1 and P2 should point to the expr_pred_trans_t's to be compared.*/
497
498 static int
499 expr_pred_trans_eq (const void *p1, const void *p2)
500 {
501   const_expr_pred_trans_t const ve1 = (const_expr_pred_trans_t) p1;
502   const_expr_pred_trans_t const ve2 = (const_expr_pred_trans_t) p2;
503   basic_block b1 = ve1->pred;
504   basic_block b2 = ve2->pred;
505
506   /* If they are not translations for the same basic block, they can't
507      be equal.  */
508   if (b1 != b2)
509     return false;
510   return pre_expr_eq (ve1->e, ve2->e);
511 }
512
513 /* Search in the phi translation table for the translation of
514    expression E in basic block PRED.
515    Return the translated value, if found, NULL otherwise.  */
516
517 static inline pre_expr
518 phi_trans_lookup (pre_expr e, basic_block pred)
519 {
520   void **slot;
521   struct expr_pred_trans_d ept;
522
523   ept.e = e;
524   ept.pred = pred;
525   ept.hashcode = iterative_hash_hashval_t (pre_expr_hash (e), pred->index);
526   slot = htab_find_slot_with_hash (phi_translate_table, &ept, ept.hashcode,
527                                    NO_INSERT);
528   if (!slot)
529     return NULL;
530   else
531     return ((expr_pred_trans_t) *slot)->v;
532 }
533
534
535 /* Add the tuple mapping from {expression E, basic block PRED} to
536    value V, to the phi translation table.  */
537
538 static inline void
539 phi_trans_add (pre_expr e, pre_expr v, basic_block pred)
540 {
541   void **slot;
542   expr_pred_trans_t new_pair = XNEW (struct expr_pred_trans_d);
543   new_pair->e = e;
544   new_pair->pred = pred;
545   new_pair->v = v;
546   new_pair->hashcode = iterative_hash_hashval_t (pre_expr_hash (e),
547                                                  pred->index);
548
549   slot = htab_find_slot_with_hash (phi_translate_table, new_pair,
550                                    new_pair->hashcode, INSERT);
551   if (*slot)
552     free (*slot);
553   *slot = (void *) new_pair;
554 }
555
556
557 /* Add expression E to the expression set of value id V.  */
558
559 void
560 add_to_value (unsigned int v, pre_expr e)
561 {
562   bitmap_set_t set;
563
564   gcc_assert (get_expr_value_id (e) == v);
565
566   if (v >= VEC_length (bitmap_set_t, value_expressions))
567     {
568       VEC_safe_grow_cleared (bitmap_set_t, heap, value_expressions,
569                              v + 1);
570     }
571
572   set = VEC_index (bitmap_set_t, value_expressions, v);
573   if (!set)
574     {
575       set = bitmap_set_new ();
576       VEC_replace (bitmap_set_t, value_expressions, v, set);
577     }
578
579   bitmap_insert_into_set_1 (set, e, true);
580 }
581
582 /* Create a new bitmap set and return it.  */
583
584 static bitmap_set_t
585 bitmap_set_new (void)
586 {
587   bitmap_set_t ret = (bitmap_set_t) pool_alloc (bitmap_set_pool);
588   ret->expressions = BITMAP_ALLOC (&grand_bitmap_obstack);
589   ret->values = BITMAP_ALLOC (&grand_bitmap_obstack);
590   return ret;
591 }
592
593 /* Return the value id for a PRE expression EXPR.  */
594
595 static unsigned int
596 get_expr_value_id (pre_expr expr)
597 {
598   switch (expr->kind)
599     {
600     case CONSTANT:
601       {
602         unsigned int id;
603         id = get_constant_value_id (PRE_EXPR_CONSTANT (expr));
604         if (id == 0)
605           {
606             id = get_or_alloc_constant_value_id (PRE_EXPR_CONSTANT (expr));
607             add_to_value (id, expr);
608           }
609         return id;
610       }
611     case NAME:
612       return VN_INFO (PRE_EXPR_NAME (expr))->value_id;
613     case NARY:
614       return PRE_EXPR_NARY (expr)->value_id;
615     case REFERENCE:
616       return PRE_EXPR_REFERENCE (expr)->value_id;
617     default:
618       gcc_unreachable ();
619     }
620 }
621
622 /* Remove an expression EXPR from a bitmapped set.  */
623
624 static void
625 bitmap_remove_from_set (bitmap_set_t set, pre_expr expr)
626 {
627   unsigned int val  = get_expr_value_id (expr);
628   if (!value_id_constant_p (val))
629     {
630       bitmap_clear_bit (set->values, val);
631       bitmap_clear_bit (set->expressions, get_expression_id (expr));
632     }
633 }
634
635 static void
636 bitmap_insert_into_set_1 (bitmap_set_t set, pre_expr expr,
637                           bool allow_constants)
638 {
639   unsigned int val  = get_expr_value_id (expr);
640   if (allow_constants || !value_id_constant_p (val))
641     {
642       /* We specifically expect this and only this function to be able to
643          insert constants into a set.  */
644       bitmap_set_bit (set->values, val);
645       bitmap_set_bit (set->expressions, get_or_alloc_expression_id (expr));
646     }
647 }
648
649 /* Insert an expression EXPR into a bitmapped set.  */
650
651 static void
652 bitmap_insert_into_set (bitmap_set_t set, pre_expr expr)
653 {
654   bitmap_insert_into_set_1 (set, expr, false);
655 }
656
657 /* Copy a bitmapped set ORIG, into bitmapped set DEST.  */
658
659 static void
660 bitmap_set_copy (bitmap_set_t dest, bitmap_set_t orig)
661 {
662   bitmap_copy (dest->expressions, orig->expressions);
663   bitmap_copy (dest->values, orig->values);
664 }
665
666
667 /* Free memory used up by SET.  */
668 static void
669 bitmap_set_free (bitmap_set_t set)
670 {
671   BITMAP_FREE (set->expressions);
672   BITMAP_FREE (set->values);
673 }
674
675
676 /* Generate an topological-ordered array of bitmap set SET.  */
677
678 static VEC(pre_expr, heap) *
679 sorted_array_from_bitmap_set (bitmap_set_t set)
680 {
681   unsigned int i, j;
682   bitmap_iterator bi, bj;
683   VEC(pre_expr, heap) *result = NULL;
684
685   FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
686     {
687       /* The number of expressions having a given value is usually
688          relatively small.  Thus, rather than making a vector of all
689          the expressions and sorting it by value-id, we walk the values
690          and check in the reverse mapping that tells us what expressions
691          have a given value, to filter those in our set.  As a result,
692          the expressions are inserted in value-id order, which means
693          topological order.
694
695          If this is somehow a significant lose for some cases, we can
696          choose which set to walk based on the set size.  */
697       bitmap_set_t exprset = VEC_index (bitmap_set_t, value_expressions, i);
698       FOR_EACH_EXPR_ID_IN_SET (exprset, j, bj)
699         {
700           if (bitmap_bit_p (set->expressions, j))
701             VEC_safe_push (pre_expr, heap, result, expression_for_id (j));
702         }
703     }
704
705   return result;
706 }
707
708 /* Perform bitmapped set operation DEST &= ORIG.  */
709
710 static void
711 bitmap_set_and (bitmap_set_t dest, bitmap_set_t orig)
712 {
713   bitmap_iterator bi;
714   unsigned int i;
715
716   if (dest != orig)
717     {
718       bitmap temp = BITMAP_ALLOC (&grand_bitmap_obstack);
719
720       bitmap_and_into (dest->values, orig->values);
721       bitmap_copy (temp, dest->expressions);
722       EXECUTE_IF_SET_IN_BITMAP (temp, 0, i, bi)
723         {
724           pre_expr expr = expression_for_id (i);
725           unsigned int value_id = get_expr_value_id (expr);
726           if (!bitmap_bit_p (dest->values, value_id))
727             bitmap_clear_bit (dest->expressions, i);
728         }
729       BITMAP_FREE (temp);
730     }
731 }
732
733 /* Subtract all values and expressions contained in ORIG from DEST.  */
734
735 static bitmap_set_t
736 bitmap_set_subtract (bitmap_set_t dest, bitmap_set_t orig)
737 {
738   bitmap_set_t result = bitmap_set_new ();
739   bitmap_iterator bi;
740   unsigned int i;
741
742   bitmap_and_compl (result->expressions, dest->expressions,
743                     orig->expressions);
744
745   FOR_EACH_EXPR_ID_IN_SET (result, i, bi)
746     {
747       pre_expr expr = expression_for_id (i);
748       unsigned int value_id = get_expr_value_id (expr);
749       bitmap_set_bit (result->values, value_id);
750     }
751
752   return result;
753 }
754
755 /* Subtract all the values in bitmap set B from bitmap set A.  */
756
757 static void
758 bitmap_set_subtract_values (bitmap_set_t a, bitmap_set_t b)
759 {
760   unsigned int i;
761   bitmap_iterator bi;
762   bitmap temp = BITMAP_ALLOC (&grand_bitmap_obstack);
763
764   bitmap_copy (temp, a->expressions);
765   EXECUTE_IF_SET_IN_BITMAP (temp, 0, i, bi)
766     {
767       pre_expr expr = expression_for_id (i);
768       if (bitmap_set_contains_value (b, get_expr_value_id (expr)))
769         bitmap_remove_from_set (a, expr);
770     }
771   BITMAP_FREE (temp);
772 }
773
774
775 /* Return true if bitmapped set SET contains the value VALUE_ID.  */
776
777 static bool
778 bitmap_set_contains_value (bitmap_set_t set, unsigned int value_id)
779 {
780   if (value_id_constant_p (value_id))
781     return true;
782
783   if (!set || bitmap_empty_p (set->expressions))
784     return false;
785
786   return bitmap_bit_p (set->values, value_id);
787 }
788
789 static inline bool
790 bitmap_set_contains_expr (bitmap_set_t set, const pre_expr expr)
791 {
792   return bitmap_bit_p (set->expressions, get_expression_id (expr));
793 }
794
795 /* Replace an instance of value LOOKFOR with expression EXPR in SET.  */
796
797 static void
798 bitmap_set_replace_value (bitmap_set_t set, unsigned int lookfor,
799                           const pre_expr expr)
800 {
801   bitmap_set_t exprset;
802   unsigned int i;
803   bitmap_iterator bi;
804
805   if (value_id_constant_p (lookfor))
806     return;
807
808   if (!bitmap_set_contains_value (set, lookfor))
809     return;
810
811   /* The number of expressions having a given value is usually
812      significantly less than the total number of expressions in SET.
813      Thus, rather than check, for each expression in SET, whether it
814      has the value LOOKFOR, we walk the reverse mapping that tells us
815      what expressions have a given value, and see if any of those
816      expressions are in our set.  For large testcases, this is about
817      5-10x faster than walking the bitmap.  If this is somehow a
818      significant lose for some cases, we can choose which set to walk
819      based on the set size.  */
820   exprset = VEC_index (bitmap_set_t, value_expressions, lookfor);
821   FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi)
822     {
823       if (bitmap_bit_p (set->expressions, i))
824         {
825           bitmap_clear_bit (set->expressions, i);
826           bitmap_set_bit (set->expressions, get_expression_id (expr));
827           return;
828         }
829     }
830 }
831
832 /* Return true if two bitmap sets are equal.  */
833
834 static bool
835 bitmap_set_equal (bitmap_set_t a, bitmap_set_t b)
836 {
837   return bitmap_equal_p (a->values, b->values);
838 }
839
840 /* Replace an instance of EXPR's VALUE with EXPR in SET if it exists,
841    and add it otherwise.  */
842
843 static void
844 bitmap_value_replace_in_set (bitmap_set_t set, pre_expr expr)
845 {
846   unsigned int val = get_expr_value_id (expr);
847
848   if (bitmap_set_contains_value (set, val))
849     bitmap_set_replace_value (set, val, expr);
850   else
851     bitmap_insert_into_set (set, expr);
852 }
853
854 /* Insert EXPR into SET if EXPR's value is not already present in
855    SET.  */
856
857 static void
858 bitmap_value_insert_into_set (bitmap_set_t set, pre_expr expr)
859 {
860   unsigned int val = get_expr_value_id (expr);
861
862   if (value_id_constant_p (val))
863     return;
864
865   if (!bitmap_set_contains_value (set, val))
866     bitmap_insert_into_set (set, expr);
867 }
868
869 /* Print out EXPR to outfile.  */
870
871 static void
872 print_pre_expr (FILE *outfile, const pre_expr expr)
873 {
874   switch (expr->kind)
875     {
876     case CONSTANT:
877       print_generic_expr (outfile, PRE_EXPR_CONSTANT (expr), 0);
878       break;
879     case NAME:
880       print_generic_expr (outfile, PRE_EXPR_NAME (expr), 0);
881       break;
882     case NARY:
883       {
884         unsigned int i;
885         vn_nary_op_t nary = PRE_EXPR_NARY (expr);
886         fprintf (outfile, "{%s,", tree_code_name [nary->opcode]);
887         for (i = 0; i < nary->length; i++)
888           {
889             print_generic_expr (outfile, nary->op[i], 0);
890             if (i != (unsigned) nary->length - 1)
891               fprintf (outfile, ",");
892           }
893         fprintf (outfile, "}");
894       }
895       break;
896
897     case REFERENCE:
898       {
899         vn_reference_op_t vro;
900         unsigned int i;
901         vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
902         fprintf (outfile, "{");
903         for (i = 0;
904              VEC_iterate (vn_reference_op_s, ref->operands, i, vro);
905              i++)
906           {
907             bool closebrace = false;
908             if (vro->opcode != SSA_NAME
909                 && TREE_CODE_CLASS (vro->opcode) != tcc_declaration)
910               {
911                 fprintf (outfile, "%s", tree_code_name [vro->opcode]);
912                 if (vro->op0)
913                   {
914                     fprintf (outfile, "<");
915                     closebrace = true;
916                   }
917               }
918             if (vro->op0)
919               {
920                 print_generic_expr (outfile, vro->op0, 0);
921                 if (vro->op1)
922                   {
923                     fprintf (outfile, ",");
924                     print_generic_expr (outfile, vro->op1, 0);
925                   }
926                 if (vro->op2)
927                   {
928                     fprintf (outfile, ",");
929                     print_generic_expr (outfile, vro->op2, 0);
930                   }
931               }
932             if (closebrace)
933                 fprintf (outfile, ">");
934             if (i != VEC_length (vn_reference_op_s, ref->operands) - 1)
935               fprintf (outfile, ",");
936           }
937         fprintf (outfile, "}");
938         if (ref->vuse)
939           {
940             fprintf (outfile, "@");
941             print_generic_expr (outfile, ref->vuse, 0);
942           }
943       }
944       break;
945     }
946 }
947 void debug_pre_expr (pre_expr);
948
949 /* Like print_pre_expr but always prints to stderr.  */
950 void
951 debug_pre_expr (pre_expr e)
952 {
953   print_pre_expr (stderr, e);
954   fprintf (stderr, "\n");
955 }
956
957 /* Print out SET to OUTFILE.  */
958
959 static void
960 print_bitmap_set (FILE *outfile, bitmap_set_t set,
961                   const char *setname, int blockindex)
962 {
963   fprintf (outfile, "%s[%d] := { ", setname, blockindex);
964   if (set)
965     {
966       bool first = true;
967       unsigned i;
968       bitmap_iterator bi;
969
970       FOR_EACH_EXPR_ID_IN_SET (set, i, bi)
971         {
972           const pre_expr expr = expression_for_id (i);
973
974           if (!first)
975             fprintf (outfile, ", ");
976           first = false;
977           print_pre_expr (outfile, expr);
978
979           fprintf (outfile, " (%04d)", get_expr_value_id (expr));
980         }
981     }
982   fprintf (outfile, " }\n");
983 }
984
985 void debug_bitmap_set (bitmap_set_t);
986
987 void
988 debug_bitmap_set (bitmap_set_t set)
989 {
990   print_bitmap_set (stderr, set, "debug", 0);
991 }
992
993 /* Print out the expressions that have VAL to OUTFILE.  */
994
995 void
996 print_value_expressions (FILE *outfile, unsigned int val)
997 {
998   bitmap_set_t set = VEC_index (bitmap_set_t, value_expressions, val);
999   if (set)
1000     {
1001       char s[10];
1002       sprintf (s, "%04d", val);
1003       print_bitmap_set (outfile, set, s, 0);
1004     }
1005 }
1006
1007
1008 void
1009 debug_value_expressions (unsigned int val)
1010 {
1011   print_value_expressions (stderr, val);
1012 }
1013
1014 /* Given a CONSTANT, allocate a new CONSTANT type PRE_EXPR to
1015    represent it.  */
1016
1017 static pre_expr
1018 get_or_alloc_expr_for_constant (tree constant)
1019 {
1020   unsigned int result_id;
1021   unsigned int value_id;
1022   pre_expr newexpr = (pre_expr) pool_alloc (pre_expr_pool);
1023   newexpr->kind = CONSTANT;
1024   PRE_EXPR_CONSTANT (newexpr) = constant;
1025   result_id = lookup_expression_id (newexpr);
1026   if (result_id != 0)
1027     {
1028       pool_free (pre_expr_pool, newexpr);
1029       newexpr = expression_for_id (result_id);
1030       return newexpr;
1031     }
1032   value_id = get_or_alloc_constant_value_id (constant);
1033   get_or_alloc_expression_id (newexpr);
1034   add_to_value (value_id, newexpr);
1035   return newexpr;
1036 }
1037
1038 /* Given a value id V, find the actual tree representing the constant
1039    value if there is one, and return it. Return NULL if we can't find
1040    a constant.  */
1041
1042 static tree
1043 get_constant_for_value_id (unsigned int v)
1044 {
1045   if (value_id_constant_p (v))
1046     {
1047       unsigned int i;
1048       bitmap_iterator bi;
1049       bitmap_set_t exprset = VEC_index (bitmap_set_t, value_expressions, v);
1050
1051       FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi)
1052         {
1053           pre_expr expr = expression_for_id (i);
1054           if (expr->kind == CONSTANT)
1055             return PRE_EXPR_CONSTANT (expr);
1056         }
1057     }
1058   return NULL;
1059 }
1060
1061 /* Get or allocate a pre_expr for a piece of GIMPLE, and return it.
1062    Currently only supports constants and SSA_NAMES.  */
1063 static pre_expr
1064 get_or_alloc_expr_for (tree t)
1065 {
1066   if (TREE_CODE (t) == SSA_NAME)
1067     return get_or_alloc_expr_for_name (t);
1068   else if (is_gimple_min_invariant (t))
1069     return get_or_alloc_expr_for_constant (t);
1070   else
1071     {
1072       /* More complex expressions can result from SCCVN expression
1073          simplification that inserts values for them.  As they all
1074          do not have VOPs the get handled by the nary ops struct.  */
1075       vn_nary_op_t result;
1076       unsigned int result_id;
1077       vn_nary_op_lookup (t, &result);
1078       if (result != NULL)
1079         {
1080           pre_expr e = (pre_expr) pool_alloc (pre_expr_pool);
1081           e->kind = NARY;
1082           PRE_EXPR_NARY (e) = result;
1083           result_id = lookup_expression_id (e);
1084           if (result_id != 0)
1085             {
1086               pool_free (pre_expr_pool, e);
1087               e = expression_for_id (result_id);
1088               return e;
1089             }
1090           alloc_expression_id (e);
1091           return e;
1092         }
1093     }
1094   return NULL;
1095 }
1096
1097 /* Return the folded version of T if T, when folded, is a gimple
1098    min_invariant.  Otherwise, return T.  */
1099
1100 static pre_expr
1101 fully_constant_expression (pre_expr e)
1102 {
1103   switch (e->kind)
1104     {
1105     case CONSTANT:
1106       return e;
1107     case NARY:
1108       {
1109         vn_nary_op_t nary = PRE_EXPR_NARY (e);
1110         switch (TREE_CODE_CLASS (nary->opcode))
1111           {
1112           case tcc_expression:
1113             if (nary->opcode == TRUTH_NOT_EXPR)
1114               goto do_unary;
1115             if (nary->opcode != TRUTH_AND_EXPR
1116                 && nary->opcode != TRUTH_OR_EXPR
1117                 && nary->opcode != TRUTH_XOR_EXPR)
1118               return e;
1119             /* Fallthrough.  */
1120           case tcc_binary:
1121           case tcc_comparison:
1122             {
1123               /* We have to go from trees to pre exprs to value ids to
1124                  constants.  */
1125               tree naryop0 = nary->op[0];
1126               tree naryop1 = nary->op[1];
1127               tree result;
1128               if (!is_gimple_min_invariant (naryop0))
1129                 {
1130                   pre_expr rep0 = get_or_alloc_expr_for (naryop0);
1131                   unsigned int vrep0 = get_expr_value_id (rep0);
1132                   tree const0 = get_constant_for_value_id (vrep0);
1133                   if (const0)
1134                     naryop0 = fold_convert (TREE_TYPE (naryop0), const0);
1135                 }
1136               if (!is_gimple_min_invariant (naryop1))
1137                 {
1138                   pre_expr rep1 = get_or_alloc_expr_for (naryop1);
1139                   unsigned int vrep1 = get_expr_value_id (rep1);
1140                   tree const1 = get_constant_for_value_id (vrep1);
1141                   if (const1)
1142                     naryop1 = fold_convert (TREE_TYPE (naryop1), const1);
1143                 }
1144               result = fold_binary (nary->opcode, nary->type,
1145                                     naryop0, naryop1);
1146               if (result && is_gimple_min_invariant (result))
1147                 return get_or_alloc_expr_for_constant (result);
1148               /* We might have simplified the expression to a
1149                  SSA_NAME for example from x_1 * 1.  But we cannot
1150                  insert a PHI for x_1 unconditionally as x_1 might
1151                  not be available readily.  */
1152               return e;
1153             }
1154           case tcc_reference:
1155             if (nary->opcode != REALPART_EXPR
1156                 && nary->opcode != IMAGPART_EXPR
1157                 && nary->opcode != VIEW_CONVERT_EXPR)
1158               return e;
1159             /* Fallthrough.  */
1160           case tcc_unary:
1161 do_unary:
1162             {
1163               /* We have to go from trees to pre exprs to value ids to
1164                  constants.  */
1165               tree naryop0 = nary->op[0];
1166               tree const0, result;
1167               if (is_gimple_min_invariant (naryop0))
1168                 const0 = naryop0;
1169               else
1170                 {
1171                   pre_expr rep0 = get_or_alloc_expr_for (naryop0);
1172                   unsigned int vrep0 = get_expr_value_id (rep0);
1173                   const0 = get_constant_for_value_id (vrep0);
1174                 }
1175               result = NULL;
1176               if (const0)
1177                 {
1178                   tree type1 = TREE_TYPE (nary->op[0]);
1179                   const0 = fold_convert (type1, const0);
1180                   result = fold_unary (nary->opcode, nary->type, const0);
1181                 }
1182               if (result && is_gimple_min_invariant (result))
1183                 return get_or_alloc_expr_for_constant (result);
1184               return e;
1185             }
1186           default:
1187             return e;
1188           }
1189       }
1190     case REFERENCE:
1191       {
1192         vn_reference_t ref = PRE_EXPR_REFERENCE (e);
1193         VEC (vn_reference_op_s, heap) *operands = ref->operands;
1194         vn_reference_op_t op;
1195
1196         /* Try to simplify the translated expression if it is
1197            a call to a builtin function with at most two arguments.  */
1198         op = VEC_index (vn_reference_op_s, operands, 0);
1199         if (op->opcode == CALL_EXPR
1200             && TREE_CODE (op->op0) == ADDR_EXPR
1201             && TREE_CODE (TREE_OPERAND (op->op0, 0)) == FUNCTION_DECL
1202             && DECL_BUILT_IN (TREE_OPERAND (op->op0, 0))
1203             && VEC_length (vn_reference_op_s, operands) >= 2
1204             && VEC_length (vn_reference_op_s, operands) <= 3)
1205           {
1206             vn_reference_op_t arg0, arg1 = NULL;
1207             bool anyconst = false;
1208             arg0 = VEC_index (vn_reference_op_s, operands, 1);
1209             if (VEC_length (vn_reference_op_s, operands) > 2)
1210               arg1 = VEC_index (vn_reference_op_s, operands, 2);
1211             if (TREE_CODE_CLASS (arg0->opcode) == tcc_constant
1212                 || (arg0->opcode == ADDR_EXPR
1213                     && is_gimple_min_invariant (arg0->op0)))
1214               anyconst = true;
1215             if (arg1
1216                 && (TREE_CODE_CLASS (arg1->opcode) == tcc_constant
1217                     || (arg1->opcode == ADDR_EXPR
1218                         && is_gimple_min_invariant (arg1->op0))))
1219               anyconst = true;
1220             if (anyconst)
1221               {
1222                 tree folded = build_call_expr (TREE_OPERAND (op->op0, 0),
1223                                                arg1 ? 2 : 1,
1224                                                arg0->op0,
1225                                                arg1 ? arg1->op0 : NULL);
1226                 if (folded
1227                     && TREE_CODE (folded) == NOP_EXPR)
1228                   folded = TREE_OPERAND (folded, 0);
1229                 if (folded
1230                     && is_gimple_min_invariant (folded))
1231                   return get_or_alloc_expr_for_constant (folded);
1232               }
1233           }
1234           return e;
1235         }
1236     default:
1237       return e;
1238     }
1239   return e;
1240 }
1241
1242 /* Translate the VUSE backwards through phi nodes in PHIBLOCK, so that
1243    it has the value it would have in BLOCK.  Set *SAME_VALID to true
1244    in case the new vuse doesn't change the value id of the OPERANDS.  */
1245
1246 static tree
1247 translate_vuse_through_block (VEC (vn_reference_op_s, heap) *operands,
1248                               alias_set_type set, tree type, tree vuse,
1249                               basic_block phiblock,
1250                               basic_block block, bool *same_valid)
1251 {
1252   gimple phi = SSA_NAME_DEF_STMT (vuse);
1253   ao_ref ref;
1254   edge e = NULL;
1255   bool use_oracle;
1256
1257   *same_valid = true;
1258
1259   if (gimple_bb (phi) != phiblock)
1260     return vuse;
1261
1262   use_oracle = ao_ref_init_from_vn_reference (&ref, set, type, operands);
1263
1264   /* Use the alias-oracle to find either the PHI node in this block,
1265      the first VUSE used in this block that is equivalent to vuse or
1266      the first VUSE which definition in this block kills the value.  */
1267   if (gimple_code (phi) == GIMPLE_PHI)
1268     e = find_edge (block, phiblock);
1269   else if (use_oracle)
1270     while (!stmt_may_clobber_ref_p_1 (phi, &ref))
1271       {
1272         vuse = gimple_vuse (phi);
1273         phi = SSA_NAME_DEF_STMT (vuse);
1274         if (gimple_bb (phi) != phiblock)
1275           return vuse;
1276         if (gimple_code (phi) == GIMPLE_PHI)
1277           {
1278             e = find_edge (block, phiblock);
1279             break;
1280           }
1281       }
1282   else
1283     return NULL_TREE;
1284
1285   if (e)
1286     {
1287       if (use_oracle)
1288         {
1289           bitmap visited = NULL;
1290           /* Try to find a vuse that dominates this phi node by skipping
1291              non-clobbering statements.  */
1292           vuse = get_continuation_for_phi (phi, &ref, &visited);
1293           if (visited)
1294             BITMAP_FREE (visited);
1295         }
1296       else
1297         vuse = NULL_TREE;
1298       if (!vuse)
1299         {
1300           /* If we didn't find any, the value ID can't stay the same,
1301              but return the translated vuse.  */
1302           *same_valid = false;
1303           vuse = PHI_ARG_DEF (phi, e->dest_idx);
1304         }
1305       /* ??? We would like to return vuse here as this is the canonical
1306          upmost vdef that this reference is associated with.  But during
1307          insertion of the references into the hash tables we only ever
1308          directly insert with their direct gimple_vuse, hence returning
1309          something else would make us not find the other expression.  */
1310       return PHI_ARG_DEF (phi, e->dest_idx);
1311     }
1312
1313   return NULL_TREE;
1314 }
1315
1316 /* Like bitmap_find_leader, but checks for the value existing in SET1 *or*
1317    SET2.  This is used to avoid making a set consisting of the union
1318    of PA_IN and ANTIC_IN during insert.  */
1319
1320 static inline pre_expr
1321 find_leader_in_sets (unsigned int val, bitmap_set_t set1, bitmap_set_t set2)
1322 {
1323   pre_expr result;
1324
1325   result = bitmap_find_leader (set1, val, NULL);
1326   if (!result && set2)
1327     result = bitmap_find_leader (set2, val, NULL);
1328   return result;
1329 }
1330
1331 /* Get the tree type for our PRE expression e.  */
1332
1333 static tree
1334 get_expr_type (const pre_expr e)
1335 {
1336   switch (e->kind)
1337     {
1338     case NAME:
1339       return TREE_TYPE (PRE_EXPR_NAME (e));
1340     case CONSTANT:
1341       return TREE_TYPE (PRE_EXPR_CONSTANT (e));
1342     case REFERENCE:
1343       return PRE_EXPR_REFERENCE (e)->type;
1344     case NARY:
1345       return PRE_EXPR_NARY (e)->type;
1346     }
1347   gcc_unreachable();
1348 }
1349
1350 /* Get a representative SSA_NAME for a given expression.
1351    Since all of our sub-expressions are treated as values, we require
1352    them to be SSA_NAME's for simplicity.
1353    Prior versions of GVNPRE used to use "value handles" here, so that
1354    an expression would be VH.11 + VH.10 instead of d_3 + e_6.  In
1355    either case, the operands are really values (IE we do not expect
1356    them to be usable without finding leaders).  */
1357
1358 static tree
1359 get_representative_for (const pre_expr e)
1360 {
1361   tree exprtype;
1362   tree name;
1363   unsigned int value_id = get_expr_value_id (e);
1364
1365   switch (e->kind)
1366     {
1367     case NAME:
1368       return PRE_EXPR_NAME (e);
1369     case CONSTANT:
1370       return PRE_EXPR_CONSTANT (e);
1371     case NARY:
1372     case REFERENCE:
1373       {
1374         /* Go through all of the expressions representing this value
1375            and pick out an SSA_NAME.  */
1376         unsigned int i;
1377         bitmap_iterator bi;
1378         bitmap_set_t exprs = VEC_index (bitmap_set_t, value_expressions,
1379                                         value_id);
1380         FOR_EACH_EXPR_ID_IN_SET (exprs, i, bi)
1381           {
1382             pre_expr rep = expression_for_id (i);
1383             if (rep->kind == NAME)
1384               return PRE_EXPR_NAME (rep);
1385           }
1386       }
1387       break;
1388     }
1389   /* If we reached here we couldn't find an SSA_NAME.  This can
1390      happen when we've discovered a value that has never appeared in
1391      the program as set to an SSA_NAME, most likely as the result of
1392      phi translation.  */
1393   if (dump_file)
1394     {
1395       fprintf (dump_file,
1396                "Could not find SSA_NAME representative for expression:");
1397       print_pre_expr (dump_file, e);
1398       fprintf (dump_file, "\n");
1399     }
1400
1401   exprtype = get_expr_type (e);
1402
1403   /* Build and insert the assignment of the end result to the temporary
1404      that we will return.  */
1405   if (!pretemp || exprtype != TREE_TYPE (pretemp))
1406     {
1407       pretemp = create_tmp_var (exprtype, "pretmp");
1408       get_var_ann (pretemp);
1409     }
1410
1411   name = make_ssa_name (pretemp, gimple_build_nop ());
1412   VN_INFO_GET (name)->value_id = value_id;
1413   if (e->kind == CONSTANT)
1414     VN_INFO (name)->valnum = PRE_EXPR_CONSTANT (e);
1415   else
1416     VN_INFO (name)->valnum = name;
1417
1418   add_to_value (value_id, get_or_alloc_expr_for_name (name));
1419   if (dump_file)
1420     {
1421       fprintf (dump_file, "Created SSA_NAME representative ");
1422       print_generic_expr (dump_file, name, 0);
1423       fprintf (dump_file, " for expression:");
1424       print_pre_expr (dump_file, e);
1425       fprintf (dump_file, "\n");
1426     }
1427
1428   return name;
1429 }
1430
1431
1432
1433
1434 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
1435    the phis in PRED.  Return NULL if we can't find a leader for each part
1436    of the translated expression.  */
1437
1438 static pre_expr
1439 phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
1440                basic_block pred, basic_block phiblock)
1441 {
1442   pre_expr oldexpr = expr;
1443   pre_expr phitrans;
1444
1445   if (!expr)
1446     return NULL;
1447
1448   if (value_id_constant_p (get_expr_value_id (expr)))
1449     return expr;
1450
1451   phitrans = phi_trans_lookup (expr, pred);
1452   if (phitrans)
1453     return phitrans;
1454
1455   switch (expr->kind)
1456     {
1457       /* Constants contain no values that need translation.  */
1458     case CONSTANT:
1459       return expr;
1460
1461     case NARY:
1462       {
1463         unsigned int i;
1464         bool changed = false;
1465         vn_nary_op_t nary = PRE_EXPR_NARY (expr);
1466         struct vn_nary_op_s newnary;
1467         /* The NARY structure is only guaranteed to have been
1468            allocated to the nary->length operands.  */
1469         memcpy (&newnary, nary, (sizeof (struct vn_nary_op_s)
1470                                  - sizeof (tree) * (4 - nary->length)));
1471
1472         for (i = 0; i < newnary.length; i++)
1473           {
1474             if (TREE_CODE (newnary.op[i]) != SSA_NAME)
1475               continue;
1476             else
1477               {
1478                 pre_expr leader, result;
1479                 unsigned int op_val_id = VN_INFO (newnary.op[i])->value_id;
1480                 leader = find_leader_in_sets (op_val_id, set1, set2);
1481                 result = phi_translate (leader, set1, set2, pred, phiblock);
1482                 if (result && result != leader)
1483                   {
1484                     tree name = get_representative_for (result);
1485                     if (!name)
1486                       return NULL;
1487                     newnary.op[i] = name;
1488                   }
1489                 else if (!result)
1490                   return NULL;
1491
1492                 changed |= newnary.op[i] != nary->op[i];
1493               }
1494           }
1495         if (changed)
1496           {
1497             pre_expr constant;
1498
1499             tree result = vn_nary_op_lookup_pieces (newnary.length,
1500                                                     newnary.opcode,
1501                                                     newnary.type,
1502                                                     newnary.op[0],
1503                                                     newnary.op[1],
1504                                                     newnary.op[2],
1505                                                     newnary.op[3],
1506                                                     &nary);
1507             unsigned int new_val_id;
1508
1509             expr = (pre_expr) pool_alloc (pre_expr_pool);
1510             expr->kind = NARY;
1511             expr->id = 0;
1512             if (result && is_gimple_min_invariant (result))
1513               return get_or_alloc_expr_for_constant (result);
1514
1515
1516             if (nary)
1517               {
1518                 PRE_EXPR_NARY (expr) = nary;
1519                 constant = fully_constant_expression (expr);
1520                 if (constant != expr)
1521                   return constant;
1522
1523                 new_val_id = nary->value_id;
1524                 get_or_alloc_expression_id (expr);
1525               }
1526             else
1527               {
1528                 new_val_id = get_next_value_id ();
1529                 VEC_safe_grow_cleared (bitmap_set_t, heap,
1530                                        value_expressions,
1531                                        get_max_value_id() + 1);
1532                 nary = vn_nary_op_insert_pieces (newnary.length,
1533                                                  newnary.opcode,
1534                                                  newnary.type,
1535                                                  newnary.op[0],
1536                                                  newnary.op[1],
1537                                                  newnary.op[2],
1538                                                  newnary.op[3],
1539                                                  result, new_val_id);
1540                 PRE_EXPR_NARY (expr) = nary;
1541                 constant = fully_constant_expression (expr);
1542                 if (constant != expr)
1543                   return constant;
1544                 get_or_alloc_expression_id (expr);
1545               }
1546             add_to_value (new_val_id, expr);
1547           }
1548         phi_trans_add (oldexpr, expr, pred);
1549         return expr;
1550       }
1551       break;
1552
1553     case REFERENCE:
1554       {
1555         vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
1556         VEC (vn_reference_op_s, heap) *operands = ref->operands;
1557         tree vuse = ref->vuse;
1558         tree newvuse = vuse;
1559         VEC (vn_reference_op_s, heap) *newoperands = NULL;
1560         bool changed = false, same_valid = true;
1561         unsigned int i, j;
1562         vn_reference_op_t operand;
1563         vn_reference_t newref;
1564
1565         for (i = 0, j = 0;
1566              VEC_iterate (vn_reference_op_s, operands, i, operand); i++, j++)
1567           {
1568             pre_expr opresult;
1569             pre_expr leader;
1570             tree oldop0 = operand->op0;
1571             tree oldop1 = operand->op1;
1572             tree oldop2 = operand->op2;
1573             tree op0 = oldop0;
1574             tree op1 = oldop1;
1575             tree op2 = oldop2;
1576             tree type = operand->type;
1577             vn_reference_op_s newop = *operand;
1578
1579             if (op0 && TREE_CODE (op0) == SSA_NAME)
1580               {
1581                 unsigned int op_val_id = VN_INFO (op0)->value_id;
1582                 leader = find_leader_in_sets (op_val_id, set1, set2);
1583                 opresult = phi_translate (leader, set1, set2, pred, phiblock);
1584                 if (opresult && opresult != leader)
1585                   {
1586                     tree name = get_representative_for (opresult);
1587                     if (!name)
1588                       break;
1589                     op0 = name;
1590                   }
1591                 else if (!opresult)
1592                   break;
1593               }
1594             changed |= op0 != oldop0;
1595
1596             if (op1 && TREE_CODE (op1) == SSA_NAME)
1597               {
1598                 unsigned int op_val_id = VN_INFO (op1)->value_id;
1599                 leader = find_leader_in_sets (op_val_id, set1, set2);
1600                 opresult = phi_translate (leader, set1, set2, pred, phiblock);
1601                 if (opresult && opresult != leader)
1602                   {
1603                     tree name = get_representative_for (opresult);
1604                     if (!name)
1605                       break;
1606                     op1 = name;
1607                   }
1608                 else if (!opresult)
1609                   break;
1610               }
1611             /* We can't possibly insert these.  */
1612             else if (op1 && !is_gimple_min_invariant (op1))
1613               break;
1614             changed |= op1 != oldop1;
1615             if (op2 && TREE_CODE (op2) == SSA_NAME)
1616               {
1617                 unsigned int op_val_id = VN_INFO (op2)->value_id;
1618                 leader = find_leader_in_sets (op_val_id, set1, set2);
1619                 opresult = phi_translate (leader, set1, set2, pred, phiblock);
1620                 if (opresult && opresult != leader)
1621                   {
1622                     tree name = get_representative_for (opresult);
1623                     if (!name)
1624                       break;
1625                     op2 = name;
1626                   }
1627                 else if (!opresult)
1628                   break;
1629               }
1630             /* We can't possibly insert these.  */
1631             else if (op2 && !is_gimple_min_invariant (op2))
1632               break;
1633             changed |= op2 != oldop2;
1634
1635             if (!newoperands)
1636               newoperands = VEC_copy (vn_reference_op_s, heap, operands);
1637             /* We may have changed from an SSA_NAME to a constant */
1638             if (newop.opcode == SSA_NAME && TREE_CODE (op0) != SSA_NAME)
1639               newop.opcode = TREE_CODE (op0);
1640             newop.type = type;
1641             newop.op0 = op0;
1642             newop.op1 = op1;
1643             newop.op2 = op2;
1644             VEC_replace (vn_reference_op_s, newoperands, j, &newop);
1645             /* If it transforms from an SSA_NAME to an address, fold with
1646                a preceding indirect reference.  */
1647             if (j > 0 && op0 && TREE_CODE (op0) == ADDR_EXPR
1648                 && VEC_index (vn_reference_op_s,
1649                               newoperands, j - 1)->opcode == INDIRECT_REF)
1650               vn_reference_fold_indirect (&newoperands, &j);
1651           }
1652         if (i != VEC_length (vn_reference_op_s, operands))
1653           {
1654             if (newoperands)
1655               VEC_free (vn_reference_op_s, heap, newoperands);
1656             return NULL;
1657           }
1658
1659         if (vuse)
1660           {
1661             newvuse = translate_vuse_through_block (newoperands,
1662                                                     ref->set, ref->type,
1663                                                     vuse, phiblock, pred,
1664                                                     &same_valid);
1665             if (newvuse == NULL_TREE)
1666               {
1667                 VEC_free (vn_reference_op_s, heap, newoperands);
1668                 return NULL;
1669               }
1670           }
1671
1672         if (changed || newvuse != vuse)
1673           {
1674             unsigned int new_val_id;
1675             pre_expr constant;
1676
1677             tree result = vn_reference_lookup_pieces (newvuse, ref->set,
1678                                                       ref->type,
1679                                                       newoperands,
1680                                                       &newref, true);
1681             if (newref)
1682               VEC_free (vn_reference_op_s, heap, newoperands);
1683
1684             if (result && is_gimple_min_invariant (result))
1685               {
1686                 gcc_assert (!newoperands);
1687                 return get_or_alloc_expr_for_constant (result);
1688               }
1689
1690             expr = (pre_expr) pool_alloc (pre_expr_pool);
1691             expr->kind = REFERENCE;
1692             expr->id = 0;
1693
1694             if (newref)
1695               {
1696                 PRE_EXPR_REFERENCE (expr) = newref;
1697                 constant = fully_constant_expression (expr);
1698                 if (constant != expr)
1699                   return constant;
1700
1701                 new_val_id = newref->value_id;
1702                 get_or_alloc_expression_id (expr);
1703               }
1704             else
1705               {
1706                 if (changed || !same_valid)
1707                   {
1708                     new_val_id = get_next_value_id ();
1709                     VEC_safe_grow_cleared (bitmap_set_t, heap,
1710                                            value_expressions,
1711                                            get_max_value_id() + 1);
1712                   }
1713                 else
1714                   new_val_id = ref->value_id;
1715                 newref = vn_reference_insert_pieces (newvuse, ref->set,
1716                                                      ref->type,
1717                                                      newoperands,
1718                                                      result, new_val_id);
1719                 newoperands = NULL;
1720                 PRE_EXPR_REFERENCE (expr) = newref;
1721                 constant = fully_constant_expression (expr);
1722                 if (constant != expr)
1723                   return constant;
1724                 get_or_alloc_expression_id (expr);
1725               }
1726             add_to_value (new_val_id, expr);
1727           }
1728         VEC_free (vn_reference_op_s, heap, newoperands);
1729         phi_trans_add (oldexpr, expr, pred);
1730         return expr;
1731       }
1732       break;
1733
1734     case NAME:
1735       {
1736         gimple phi = NULL;
1737         edge e;
1738         gimple def_stmt;
1739         tree name = PRE_EXPR_NAME (expr);
1740
1741         def_stmt = SSA_NAME_DEF_STMT (name);
1742         if (gimple_code (def_stmt) == GIMPLE_PHI
1743             && gimple_bb (def_stmt) == phiblock)
1744           phi = def_stmt;
1745         else
1746           return expr;
1747
1748         e = find_edge (pred, gimple_bb (phi));
1749         if (e)
1750           {
1751             tree def = PHI_ARG_DEF (phi, e->dest_idx);
1752             pre_expr newexpr;
1753
1754             if (TREE_CODE (def) == SSA_NAME)
1755               def = VN_INFO (def)->valnum;
1756
1757             /* Handle constant. */
1758             if (is_gimple_min_invariant (def))
1759               return get_or_alloc_expr_for_constant (def);
1760
1761             if (TREE_CODE (def) == SSA_NAME && ssa_undefined_value_p (def))
1762               return NULL;
1763
1764             newexpr = get_or_alloc_expr_for_name (def);
1765             return newexpr;
1766           }
1767       }
1768       return expr;
1769
1770     default:
1771       gcc_unreachable ();
1772     }
1773 }
1774
1775 /* For each expression in SET, translate the values through phi nodes
1776    in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting
1777    expressions in DEST.  */
1778
1779 static void
1780 phi_translate_set (bitmap_set_t dest, bitmap_set_t set, basic_block pred,
1781                    basic_block phiblock)
1782 {
1783   VEC (pre_expr, heap) *exprs;
1784   pre_expr expr;
1785   int i;
1786
1787   if (!phi_nodes (phiblock))
1788     {
1789       bitmap_set_copy (dest, set);
1790       return;
1791     }
1792
1793   exprs = sorted_array_from_bitmap_set (set);
1794   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
1795     {
1796       pre_expr translated;
1797       translated = phi_translate (expr, set, NULL, pred, phiblock);
1798
1799       /* Don't add empty translations to the cache  */
1800       if (translated)
1801         phi_trans_add (expr, translated, pred);
1802
1803       if (translated != NULL)
1804         bitmap_value_insert_into_set (dest, translated);
1805     }
1806   VEC_free (pre_expr, heap, exprs);
1807 }
1808
1809 /* Find the leader for a value (i.e., the name representing that
1810    value) in a given set, and return it.  If STMT is non-NULL it
1811    makes sure the defining statement for the leader dominates it.
1812    Return NULL if no leader is found.  */
1813
1814 static pre_expr
1815 bitmap_find_leader (bitmap_set_t set, unsigned int val, gimple stmt)
1816 {
1817   if (value_id_constant_p (val))
1818     {
1819       unsigned int i;
1820       bitmap_iterator bi;
1821       bitmap_set_t exprset = VEC_index (bitmap_set_t, value_expressions, val);
1822
1823       FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi)
1824         {
1825           pre_expr expr = expression_for_id (i);
1826           if (expr->kind == CONSTANT)
1827             return expr;
1828         }
1829     }
1830   if (bitmap_set_contains_value (set, val))
1831     {
1832       /* Rather than walk the entire bitmap of expressions, and see
1833          whether any of them has the value we are looking for, we look
1834          at the reverse mapping, which tells us the set of expressions
1835          that have a given value (IE value->expressions with that
1836          value) and see if any of those expressions are in our set.
1837          The number of expressions per value is usually significantly
1838          less than the number of expressions in the set.  In fact, for
1839          large testcases, doing it this way is roughly 5-10x faster
1840          than walking the bitmap.
1841          If this is somehow a significant lose for some cases, we can
1842          choose which set to walk based on which set is smaller.  */
1843       unsigned int i;
1844       bitmap_iterator bi;
1845       bitmap_set_t exprset = VEC_index (bitmap_set_t, value_expressions, val);
1846
1847       EXECUTE_IF_AND_IN_BITMAP (exprset->expressions,
1848                                 set->expressions, 0, i, bi)
1849         {
1850           pre_expr val = expression_for_id (i);
1851           /* At the point where stmt is not null, there should always
1852              be an SSA_NAME first in the list of expressions.  */
1853           if (stmt)
1854             {
1855               gimple def_stmt = SSA_NAME_DEF_STMT (PRE_EXPR_NAME (val));
1856               if (gimple_code (def_stmt) != GIMPLE_PHI
1857                   && gimple_bb (def_stmt) == gimple_bb (stmt)
1858                   && gimple_uid (def_stmt) >= gimple_uid (stmt))
1859                 continue;
1860             }
1861           return val;
1862         }
1863     }
1864   return NULL;
1865 }
1866
1867 /* Determine if EXPR, a memory expression, is ANTIC_IN at the top of
1868    BLOCK by seeing if it is not killed in the block.  Note that we are
1869    only determining whether there is a store that kills it.  Because
1870    of the order in which clean iterates over values, we are guaranteed
1871    that altered operands will have caused us to be eliminated from the
1872    ANTIC_IN set already.  */
1873
1874 static bool
1875 value_dies_in_block_x (pre_expr expr, basic_block block)
1876 {
1877   tree vuse = PRE_EXPR_REFERENCE (expr)->vuse;
1878   vn_reference_t refx = PRE_EXPR_REFERENCE (expr);
1879   gimple def;
1880   gimple_stmt_iterator gsi;
1881   unsigned id = get_expression_id (expr);
1882   bool res = false;
1883   ao_ref ref;
1884
1885   if (!vuse)
1886     return false;
1887
1888   /* Lookup a previously calculated result.  */
1889   if (EXPR_DIES (block)
1890       && bitmap_bit_p (EXPR_DIES (block), id * 2))
1891     return bitmap_bit_p (EXPR_DIES (block), id * 2 + 1);
1892
1893   /* A memory expression {e, VUSE} dies in the block if there is a
1894      statement that may clobber e.  If, starting statement walk from the
1895      top of the basic block, a statement uses VUSE there can be no kill
1896      inbetween that use and the original statement that loaded {e, VUSE},
1897      so we can stop walking.  */
1898   ref.base = NULL_TREE;
1899   for (gsi = gsi_start_bb (block); !gsi_end_p (gsi); gsi_next (&gsi))
1900     {
1901       tree def_vuse, def_vdef;
1902       def = gsi_stmt (gsi);
1903       def_vuse = gimple_vuse (def);
1904       def_vdef = gimple_vdef (def);
1905
1906       /* Not a memory statement.  */
1907       if (!def_vuse)
1908         continue;
1909
1910       /* Not a may-def.  */
1911       if (!def_vdef)
1912         {
1913           /* A load with the same VUSE, we're done.  */
1914           if (def_vuse == vuse)
1915             break;
1916
1917           continue;
1918         }
1919
1920       /* Init ref only if we really need it.  */
1921       if (ref.base == NULL_TREE
1922           && !ao_ref_init_from_vn_reference (&ref, refx->set, refx->type,
1923                                              refx->operands))
1924         {
1925           res = true;
1926           break;
1927         }
1928       /* If the statement may clobber expr, it dies.  */
1929       if (stmt_may_clobber_ref_p_1 (def, &ref))
1930         {
1931           res = true;
1932           break;
1933         }
1934     }
1935
1936   /* Remember the result.  */
1937   if (!EXPR_DIES (block))
1938     EXPR_DIES (block) = BITMAP_ALLOC (&grand_bitmap_obstack);
1939   bitmap_set_bit (EXPR_DIES (block), id * 2);
1940   if (res)
1941     bitmap_set_bit (EXPR_DIES (block), id * 2 + 1);
1942
1943   return res;
1944 }
1945
1946
1947 #define union_contains_value(SET1, SET2, VAL)                   \
1948   (bitmap_set_contains_value ((SET1), (VAL))                    \
1949    || ((SET2) && bitmap_set_contains_value ((SET2), (VAL))))
1950
1951 /* Determine if vn_reference_op_t VRO is legal in SET1 U SET2.
1952  */
1953 static bool
1954 vro_valid_in_sets (bitmap_set_t set1, bitmap_set_t set2,
1955                    vn_reference_op_t vro)
1956 {
1957   if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
1958     {
1959       struct pre_expr_d temp;
1960       temp.kind = NAME;
1961       temp.id = 0;
1962       PRE_EXPR_NAME (&temp) = vro->op0;
1963       temp.id = lookup_expression_id (&temp);
1964       if (temp.id == 0)
1965         return false;
1966       if (!union_contains_value (set1, set2,
1967                                  get_expr_value_id (&temp)))
1968         return false;
1969     }
1970   if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
1971     {
1972       struct pre_expr_d temp;
1973       temp.kind = NAME;
1974       temp.id = 0;
1975       PRE_EXPR_NAME (&temp) = vro->op1;
1976       temp.id = lookup_expression_id (&temp);
1977       if (temp.id == 0)
1978         return false;
1979       if (!union_contains_value (set1, set2,
1980                                  get_expr_value_id (&temp)))
1981         return false;
1982     }
1983
1984   if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
1985     {
1986       struct pre_expr_d temp;
1987       temp.kind = NAME;
1988       temp.id = 0;
1989       PRE_EXPR_NAME (&temp) = vro->op2;
1990       temp.id = lookup_expression_id (&temp);
1991       if (temp.id == 0)
1992         return false;
1993       if (!union_contains_value (set1, set2,
1994                                  get_expr_value_id (&temp)))
1995         return false;
1996     }
1997
1998   return true;
1999 }
2000
2001 /* Determine if the expression EXPR is valid in SET1 U SET2.
2002    ONLY SET2 CAN BE NULL.
2003    This means that we have a leader for each part of the expression
2004    (if it consists of values), or the expression is an SSA_NAME.
2005    For loads/calls, we also see if the vuse is killed in this block.  */
2006
2007 static bool
2008 valid_in_sets (bitmap_set_t set1, bitmap_set_t set2, pre_expr expr,
2009                basic_block block)
2010 {
2011   switch (expr->kind)
2012     {
2013     case NAME:
2014       return bitmap_set_contains_expr (AVAIL_OUT (block), expr);
2015     case NARY:
2016       {
2017         unsigned int i;
2018         vn_nary_op_t nary = PRE_EXPR_NARY (expr);
2019         for (i = 0; i < nary->length; i++)
2020           {
2021             if (TREE_CODE (nary->op[i]) == SSA_NAME)
2022               {
2023                 struct pre_expr_d temp;
2024                 temp.kind = NAME;
2025                 temp.id = 0;
2026                 PRE_EXPR_NAME (&temp) = nary->op[i];
2027                 temp.id = lookup_expression_id (&temp);
2028                 if (temp.id == 0)
2029                   return false;
2030                 if (!union_contains_value (set1, set2,
2031                                            get_expr_value_id (&temp)))
2032                   return false;
2033               }
2034           }
2035         return true;
2036       }
2037       break;
2038     case REFERENCE:
2039       {
2040         vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
2041         vn_reference_op_t vro;
2042         unsigned int i;
2043
2044         for (i = 0; VEC_iterate (vn_reference_op_s, ref->operands, i, vro); i++)
2045           {
2046             if (!vro_valid_in_sets (set1, set2, vro))
2047               return false;
2048           }
2049         if (ref->vuse)
2050           {
2051             gimple def_stmt = SSA_NAME_DEF_STMT (ref->vuse);
2052             if (!gimple_nop_p (def_stmt)
2053                 && gimple_bb (def_stmt) != block
2054                 && !dominated_by_p (CDI_DOMINATORS,
2055                                     block, gimple_bb (def_stmt)))
2056               return false;
2057           }
2058         return !value_dies_in_block_x (expr, block);
2059       }
2060     default:
2061       gcc_unreachable ();
2062     }
2063 }
2064
2065 /* Clean the set of expressions that are no longer valid in SET1 or
2066    SET2.  This means expressions that are made up of values we have no
2067    leaders for in SET1 or SET2.  This version is used for partial
2068    anticipation, which means it is not valid in either ANTIC_IN or
2069    PA_IN.  */
2070
2071 static void
2072 dependent_clean (bitmap_set_t set1, bitmap_set_t set2, basic_block block)
2073 {
2074   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (set1);
2075   pre_expr expr;
2076   int i;
2077
2078   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
2079     {
2080       if (!valid_in_sets (set1, set2, expr, block))
2081         bitmap_remove_from_set (set1, expr);
2082     }
2083   VEC_free (pre_expr, heap, exprs);
2084 }
2085
2086 /* Clean the set of expressions that are no longer valid in SET.  This
2087    means expressions that are made up of values we have no leaders for
2088    in SET.  */
2089
2090 static void
2091 clean (bitmap_set_t set, basic_block block)
2092 {
2093   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (set);
2094   pre_expr expr;
2095   int i;
2096
2097   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
2098     {
2099       if (!valid_in_sets (set, NULL, expr, block))
2100         bitmap_remove_from_set (set, expr);
2101     }
2102   VEC_free (pre_expr, heap, exprs);
2103 }
2104
2105 static sbitmap has_abnormal_preds;
2106
2107 /* List of blocks that may have changed during ANTIC computation and
2108    thus need to be iterated over.  */
2109
2110 static sbitmap changed_blocks;
2111
2112 /* Decide whether to defer a block for a later iteration, or PHI
2113    translate SOURCE to DEST using phis in PHIBLOCK.  Return false if we
2114    should defer the block, and true if we processed it.  */
2115
2116 static bool
2117 defer_or_phi_translate_block (bitmap_set_t dest, bitmap_set_t source,
2118                               basic_block block, basic_block phiblock)
2119 {
2120   if (!BB_VISITED (phiblock))
2121     {
2122       SET_BIT (changed_blocks, block->index);
2123       BB_VISITED (block) = 0;
2124       BB_DEFERRED (block) = 1;
2125       return false;
2126     }
2127   else
2128     phi_translate_set (dest, source, block, phiblock);
2129   return true;
2130 }
2131
2132 /* Compute the ANTIC set for BLOCK.
2133
2134    If succs(BLOCK) > 1 then
2135      ANTIC_OUT[BLOCK] = intersection of ANTIC_IN[b] for all succ(BLOCK)
2136    else if succs(BLOCK) == 1 then
2137      ANTIC_OUT[BLOCK] = phi_translate (ANTIC_IN[succ(BLOCK)])
2138
2139    ANTIC_IN[BLOCK] = clean(ANTIC_OUT[BLOCK] U EXP_GEN[BLOCK] - TMP_GEN[BLOCK])
2140 */
2141
2142 static bool
2143 compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
2144 {
2145   bool changed = false;
2146   bitmap_set_t S, old, ANTIC_OUT;
2147   bitmap_iterator bi;
2148   unsigned int bii;
2149   edge e;
2150   edge_iterator ei;
2151
2152   old = ANTIC_OUT = S = NULL;
2153   BB_VISITED (block) = 1;
2154
2155   /* If any edges from predecessors are abnormal, antic_in is empty,
2156      so do nothing.  */
2157   if (block_has_abnormal_pred_edge)
2158     goto maybe_dump_sets;
2159
2160   old = ANTIC_IN (block);
2161   ANTIC_OUT = bitmap_set_new ();
2162
2163   /* If the block has no successors, ANTIC_OUT is empty.  */
2164   if (EDGE_COUNT (block->succs) == 0)
2165     ;
2166   /* If we have one successor, we could have some phi nodes to
2167      translate through.  */
2168   else if (single_succ_p (block))
2169     {
2170       basic_block succ_bb = single_succ (block);
2171
2172       /* We trade iterations of the dataflow equations for having to
2173          phi translate the maximal set, which is incredibly slow
2174          (since the maximal set often has 300+ members, even when you
2175          have a small number of blocks).
2176          Basically, we defer the computation of ANTIC for this block
2177          until we have processed it's successor, which will inevitably
2178          have a *much* smaller set of values to phi translate once
2179          clean has been run on it.
2180          The cost of doing this is that we technically perform more
2181          iterations, however, they are lower cost iterations.
2182
2183          Timings for PRE on tramp3d-v4:
2184          without maximal set fix: 11 seconds
2185          with maximal set fix/without deferring: 26 seconds
2186          with maximal set fix/with deferring: 11 seconds
2187      */
2188
2189       if (!defer_or_phi_translate_block (ANTIC_OUT, ANTIC_IN (succ_bb),
2190                                         block, succ_bb))
2191         {
2192           changed = true;
2193           goto maybe_dump_sets;
2194         }
2195     }
2196   /* If we have multiple successors, we take the intersection of all of
2197      them.  Note that in the case of loop exit phi nodes, we may have
2198      phis to translate through.  */
2199   else
2200     {
2201       VEC(basic_block, heap) * worklist;
2202       size_t i;
2203       basic_block bprime, first = NULL;
2204
2205       worklist = VEC_alloc (basic_block, heap, EDGE_COUNT (block->succs));
2206       FOR_EACH_EDGE (e, ei, block->succs)
2207         {
2208           if (!first
2209               && BB_VISITED (e->dest))
2210             first = e->dest;
2211           else if (BB_VISITED (e->dest))
2212             VEC_quick_push (basic_block, worklist, e->dest);
2213         }
2214
2215       /* Of multiple successors we have to have visited one already.  */
2216       if (!first)
2217         {
2218           SET_BIT (changed_blocks, block->index);
2219           BB_VISITED (block) = 0;
2220           BB_DEFERRED (block) = 1;
2221           changed = true;
2222           VEC_free (basic_block, heap, worklist);
2223           goto maybe_dump_sets;
2224         }
2225
2226       if (phi_nodes (first))
2227         phi_translate_set (ANTIC_OUT, ANTIC_IN (first), block, first);
2228       else
2229         bitmap_set_copy (ANTIC_OUT, ANTIC_IN (first));
2230
2231       for (i = 0; VEC_iterate (basic_block, worklist, i, bprime); i++)
2232         {
2233           if (phi_nodes (bprime))
2234             {
2235               bitmap_set_t tmp = bitmap_set_new ();
2236               phi_translate_set (tmp, ANTIC_IN (bprime), block, bprime);
2237               bitmap_set_and (ANTIC_OUT, tmp);
2238               bitmap_set_free (tmp);
2239             }
2240           else
2241             bitmap_set_and (ANTIC_OUT, ANTIC_IN (bprime));
2242         }
2243       VEC_free (basic_block, heap, worklist);
2244     }
2245
2246   /* Generate ANTIC_OUT - TMP_GEN.  */
2247   S = bitmap_set_subtract (ANTIC_OUT, TMP_GEN (block));
2248
2249   /* Start ANTIC_IN with EXP_GEN - TMP_GEN.  */
2250   ANTIC_IN (block) = bitmap_set_subtract (EXP_GEN (block),
2251                                           TMP_GEN (block));
2252
2253   /* Then union in the ANTIC_OUT - TMP_GEN values,
2254      to get ANTIC_OUT U EXP_GEN - TMP_GEN */
2255   FOR_EACH_EXPR_ID_IN_SET (S, bii, bi)
2256     bitmap_value_insert_into_set (ANTIC_IN (block),
2257                                   expression_for_id (bii));
2258
2259   clean (ANTIC_IN (block), block);
2260
2261   /* !old->expressions can happen when we deferred a block.  */
2262   if (!old->expressions || !bitmap_set_equal (old, ANTIC_IN (block)))
2263     {
2264       changed = true;
2265       SET_BIT (changed_blocks, block->index);
2266       FOR_EACH_EDGE (e, ei, block->preds)
2267         SET_BIT (changed_blocks, e->src->index);
2268     }
2269   else
2270     RESET_BIT (changed_blocks, block->index);
2271
2272  maybe_dump_sets:
2273   if (dump_file && (dump_flags & TDF_DETAILS))
2274     {
2275       if (!BB_DEFERRED (block) || BB_VISITED (block))
2276         {
2277           if (ANTIC_OUT)
2278             print_bitmap_set (dump_file, ANTIC_OUT, "ANTIC_OUT", block->index);
2279
2280           print_bitmap_set (dump_file, ANTIC_IN (block), "ANTIC_IN",
2281                             block->index);
2282
2283           if (S)
2284             print_bitmap_set (dump_file, S, "S", block->index);
2285         }
2286       else
2287         {
2288           fprintf (dump_file,
2289                    "Block %d was deferred for a future iteration.\n",
2290                    block->index);
2291         }
2292     }
2293   if (old)
2294     bitmap_set_free (old);
2295   if (S)
2296     bitmap_set_free (S);
2297   if (ANTIC_OUT)
2298     bitmap_set_free (ANTIC_OUT);
2299   return changed;
2300 }
2301
2302 /* Compute PARTIAL_ANTIC for BLOCK.
2303
2304    If succs(BLOCK) > 1 then
2305      PA_OUT[BLOCK] = value wise union of PA_IN[b] + all ANTIC_IN not
2306      in ANTIC_OUT for all succ(BLOCK)
2307    else if succs(BLOCK) == 1 then
2308      PA_OUT[BLOCK] = phi_translate (PA_IN[succ(BLOCK)])
2309
2310    PA_IN[BLOCK] = dependent_clean(PA_OUT[BLOCK] - TMP_GEN[BLOCK]
2311                                   - ANTIC_IN[BLOCK])
2312
2313 */
2314 static bool
2315 compute_partial_antic_aux (basic_block block,
2316                            bool block_has_abnormal_pred_edge)
2317 {
2318   bool changed = false;
2319   bitmap_set_t old_PA_IN;
2320   bitmap_set_t PA_OUT;
2321   edge e;
2322   edge_iterator ei;
2323   unsigned long max_pa = PARAM_VALUE (PARAM_MAX_PARTIAL_ANTIC_LENGTH);
2324
2325   old_PA_IN = PA_OUT = NULL;
2326
2327   /* If any edges from predecessors are abnormal, antic_in is empty,
2328      so do nothing.  */
2329   if (block_has_abnormal_pred_edge)
2330     goto maybe_dump_sets;
2331
2332   /* If there are too many partially anticipatable values in the
2333      block, phi_translate_set can take an exponential time: stop
2334      before the translation starts.  */
2335   if (max_pa
2336       && single_succ_p (block)
2337       && bitmap_count_bits (PA_IN (single_succ (block))->values) > max_pa)
2338     goto maybe_dump_sets;
2339
2340   old_PA_IN = PA_IN (block);
2341   PA_OUT = bitmap_set_new ();
2342
2343   /* If the block has no successors, ANTIC_OUT is empty.  */
2344   if (EDGE_COUNT (block->succs) == 0)
2345     ;
2346   /* If we have one successor, we could have some phi nodes to
2347      translate through.  Note that we can't phi translate across DFS
2348      back edges in partial antic, because it uses a union operation on
2349      the successors.  For recurrences like IV's, we will end up
2350      generating a new value in the set on each go around (i + 3 (VH.1)
2351      VH.1 + 1 (VH.2), VH.2 + 1 (VH.3), etc), forever.  */
2352   else if (single_succ_p (block))
2353     {
2354       basic_block succ = single_succ (block);
2355       if (!(single_succ_edge (block)->flags & EDGE_DFS_BACK))
2356         phi_translate_set (PA_OUT, PA_IN (succ), block, succ);
2357     }
2358   /* If we have multiple successors, we take the union of all of
2359      them.  */
2360   else
2361     {
2362       VEC(basic_block, heap) * worklist;
2363       size_t i;
2364       basic_block bprime;
2365
2366       worklist = VEC_alloc (basic_block, heap, EDGE_COUNT (block->succs));
2367       FOR_EACH_EDGE (e, ei, block->succs)
2368         {
2369           if (e->flags & EDGE_DFS_BACK)
2370             continue;
2371           VEC_quick_push (basic_block, worklist, e->dest);
2372         }
2373       if (VEC_length (basic_block, worklist) > 0)
2374         {
2375           for (i = 0; VEC_iterate (basic_block, worklist, i, bprime); i++)
2376             {
2377               unsigned int i;
2378               bitmap_iterator bi;
2379
2380               FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (bprime), i, bi)
2381                 bitmap_value_insert_into_set (PA_OUT,
2382                                               expression_for_id (i));
2383               if (phi_nodes (bprime))
2384                 {
2385                   bitmap_set_t pa_in = bitmap_set_new ();
2386                   phi_translate_set (pa_in, PA_IN (bprime), block, bprime);
2387                   FOR_EACH_EXPR_ID_IN_SET (pa_in, i, bi)
2388                     bitmap_value_insert_into_set (PA_OUT,
2389                                                   expression_for_id (i));
2390                   bitmap_set_free (pa_in);
2391                 }
2392               else
2393                 FOR_EACH_EXPR_ID_IN_SET (PA_IN (bprime), i, bi)
2394                   bitmap_value_insert_into_set (PA_OUT,
2395                                                 expression_for_id (i));
2396             }
2397         }
2398       VEC_free (basic_block, heap, worklist);
2399     }
2400
2401   /* PA_IN starts with PA_OUT - TMP_GEN.
2402      Then we subtract things from ANTIC_IN.  */
2403   PA_IN (block) = bitmap_set_subtract (PA_OUT, TMP_GEN (block));
2404
2405   /* For partial antic, we want to put back in the phi results, since
2406      we will properly avoid making them partially antic over backedges.  */
2407   bitmap_ior_into (PA_IN (block)->values, PHI_GEN (block)->values);
2408   bitmap_ior_into (PA_IN (block)->expressions, PHI_GEN (block)->expressions);
2409
2410   /* PA_IN[block] = PA_IN[block] - ANTIC_IN[block] */
2411   bitmap_set_subtract_values (PA_IN (block), ANTIC_IN (block));
2412
2413   dependent_clean (PA_IN (block), ANTIC_IN (block), block);
2414
2415   if (!bitmap_set_equal (old_PA_IN, PA_IN (block)))
2416     {
2417       changed = true;
2418       SET_BIT (changed_blocks, block->index);
2419       FOR_EACH_EDGE (e, ei, block->preds)
2420         SET_BIT (changed_blocks, e->src->index);
2421     }
2422   else
2423     RESET_BIT (changed_blocks, block->index);
2424
2425  maybe_dump_sets:
2426   if (dump_file && (dump_flags & TDF_DETAILS))
2427     {
2428       if (PA_OUT)
2429         print_bitmap_set (dump_file, PA_OUT, "PA_OUT", block->index);
2430
2431       print_bitmap_set (dump_file, PA_IN (block), "PA_IN", block->index);
2432     }
2433   if (old_PA_IN)
2434     bitmap_set_free (old_PA_IN);
2435   if (PA_OUT)
2436     bitmap_set_free (PA_OUT);
2437   return changed;
2438 }
2439
2440 /* Compute ANTIC and partial ANTIC sets.  */
2441
2442 static void
2443 compute_antic (void)
2444 {
2445   bool changed = true;
2446   int num_iterations = 0;
2447   basic_block block;
2448   int i;
2449
2450   /* If any predecessor edges are abnormal, we punt, so antic_in is empty.
2451      We pre-build the map of blocks with incoming abnormal edges here.  */
2452   has_abnormal_preds = sbitmap_alloc (last_basic_block);
2453   sbitmap_zero (has_abnormal_preds);
2454
2455   FOR_EACH_BB (block)
2456     {
2457       edge_iterator ei;
2458       edge e;
2459
2460       FOR_EACH_EDGE (e, ei, block->preds)
2461         {
2462           e->flags &= ~EDGE_DFS_BACK;
2463           if (e->flags & EDGE_ABNORMAL)
2464             {
2465               SET_BIT (has_abnormal_preds, block->index);
2466               break;
2467             }
2468         }
2469
2470       BB_VISITED (block) = 0;
2471       BB_DEFERRED (block) = 0;
2472       /* While we are here, give empty ANTIC_IN sets to each block.  */
2473       ANTIC_IN (block) = bitmap_set_new ();
2474       PA_IN (block) = bitmap_set_new ();
2475     }
2476
2477   /* At the exit block we anticipate nothing.  */
2478   ANTIC_IN (EXIT_BLOCK_PTR) = bitmap_set_new ();
2479   BB_VISITED (EXIT_BLOCK_PTR) = 1;
2480   PA_IN (EXIT_BLOCK_PTR) = bitmap_set_new ();
2481
2482   changed_blocks = sbitmap_alloc (last_basic_block + 1);
2483   sbitmap_ones (changed_blocks);
2484   while (changed)
2485     {
2486       if (dump_file && (dump_flags & TDF_DETAILS))
2487         fprintf (dump_file, "Starting iteration %d\n", num_iterations);
2488       num_iterations++;
2489       changed = false;
2490       for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; i++)
2491         {
2492           if (TEST_BIT (changed_blocks, postorder[i]))
2493             {
2494               basic_block block = BASIC_BLOCK (postorder[i]);
2495               changed |= compute_antic_aux (block,
2496                                             TEST_BIT (has_abnormal_preds,
2497                                                       block->index));
2498             }
2499         }
2500 #ifdef ENABLE_CHECKING
2501       /* Theoretically possible, but *highly* unlikely.  */
2502       gcc_assert (num_iterations < 500);
2503 #endif
2504     }
2505
2506   statistics_histogram_event (cfun, "compute_antic iterations",
2507                               num_iterations);
2508
2509   if (do_partial_partial)
2510     {
2511       sbitmap_ones (changed_blocks);
2512       mark_dfs_back_edges ();
2513       num_iterations = 0;
2514       changed = true;
2515       while (changed)
2516         {
2517           if (dump_file && (dump_flags & TDF_DETAILS))
2518             fprintf (dump_file, "Starting iteration %d\n", num_iterations);
2519           num_iterations++;
2520           changed = false;
2521           for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; i++)
2522             {
2523               if (TEST_BIT (changed_blocks, postorder[i]))
2524                 {
2525                   basic_block block = BASIC_BLOCK (postorder[i]);
2526                   changed
2527                     |= compute_partial_antic_aux (block,
2528                                                   TEST_BIT (has_abnormal_preds,
2529                                                             block->index));
2530                 }
2531             }
2532 #ifdef ENABLE_CHECKING
2533           /* Theoretically possible, but *highly* unlikely.  */
2534           gcc_assert (num_iterations < 500);
2535 #endif
2536         }
2537       statistics_histogram_event (cfun, "compute_partial_antic iterations",
2538                                   num_iterations);
2539     }
2540   sbitmap_free (has_abnormal_preds);
2541   sbitmap_free (changed_blocks);
2542 }
2543
2544 /* Return true if we can value number the call in STMT.  This is true
2545    if we have a pure or constant call.  */
2546
2547 static bool
2548 can_value_number_call (gimple stmt)
2549 {
2550   if (gimple_call_flags (stmt) & (ECF_PURE | ECF_CONST))
2551     return true;
2552   return false;
2553 }
2554
2555 /* Return true if OP is a tree which we can perform PRE on.
2556    This may not match the operations we can value number, but in
2557    a perfect world would.  */
2558
2559 static bool
2560 can_PRE_operation (tree op)
2561 {
2562   return UNARY_CLASS_P (op)
2563     || BINARY_CLASS_P (op)
2564     || COMPARISON_CLASS_P (op)
2565     || TREE_CODE (op) == INDIRECT_REF
2566     || TREE_CODE (op) == COMPONENT_REF
2567     || TREE_CODE (op) == VIEW_CONVERT_EXPR
2568     || TREE_CODE (op) == CALL_EXPR
2569     || TREE_CODE (op) == ARRAY_REF;
2570 }
2571
2572
2573 /* Inserted expressions are placed onto this worklist, which is used
2574    for performing quick dead code elimination of insertions we made
2575    that didn't turn out to be necessary.   */
2576 static VEC(gimple,heap) *inserted_exprs;
2577 static bitmap inserted_phi_names;
2578
2579 /* Pool allocated fake store expressions are placed onto this
2580    worklist, which, after performing dead code elimination, is walked
2581    to see which expressions need to be put into GC'able memory  */
2582 static VEC(gimple, heap) *need_creation;
2583
2584 /* The actual worker for create_component_ref_by_pieces.  */
2585
2586 static tree
2587 create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
2588                                   unsigned int *operand, gimple_seq *stmts,
2589                                   gimple domstmt)
2590 {
2591   vn_reference_op_t currop = VEC_index (vn_reference_op_s, ref->operands,
2592                                         *operand);
2593   tree genop;
2594   ++*operand;
2595   switch (currop->opcode)
2596     {
2597     case CALL_EXPR:
2598       {
2599         tree folded, sc = currop->op1;
2600         unsigned int nargs = 0;
2601         tree *args = XNEWVEC (tree, VEC_length (vn_reference_op_s,
2602                                                 ref->operands) - 1);
2603         while (*operand < VEC_length (vn_reference_op_s, ref->operands))
2604           {
2605             args[nargs] = create_component_ref_by_pieces_1 (block, ref,
2606                                                             operand, stmts,
2607                                                             domstmt);
2608             nargs++;
2609           }
2610         folded = build_call_array (currop->type,
2611                                    TREE_CODE (currop->op0) == FUNCTION_DECL
2612                                    ? build_fold_addr_expr (currop->op0)
2613                                    : currop->op0,
2614                                    nargs, args);
2615         free (args);
2616         if (sc)
2617           {
2618             pre_expr scexpr = get_or_alloc_expr_for (sc);
2619             sc = find_or_generate_expression (block, scexpr, stmts, domstmt);
2620             if (!sc)
2621               return NULL_TREE;
2622             CALL_EXPR_STATIC_CHAIN (folded) = sc;
2623           }
2624         return folded;
2625       }
2626       break;
2627     case TARGET_MEM_REF:
2628       {
2629         vn_reference_op_t nextop = VEC_index (vn_reference_op_s, ref->operands,
2630                                               *operand);
2631         pre_expr op0expr;
2632         tree genop0 = NULL_TREE;
2633         tree baseop = create_component_ref_by_pieces_1 (block, ref, operand,
2634                                                         stmts, domstmt);
2635         if (!baseop)
2636           return NULL_TREE;
2637         if (currop->op0)
2638           {
2639             op0expr = get_or_alloc_expr_for (currop->op0);
2640             genop0 = find_or_generate_expression (block, op0expr,
2641                                                   stmts, domstmt);
2642             if (!genop0)
2643               return NULL_TREE;
2644           }
2645         if (DECL_P (baseop))
2646           return build6 (TARGET_MEM_REF, currop->type,
2647                          baseop, NULL_TREE,
2648                          genop0, currop->op1, currop->op2,
2649                          unshare_expr (nextop->op1));
2650         else
2651           return build6 (TARGET_MEM_REF, currop->type,
2652                          NULL_TREE, baseop,
2653                          genop0, currop->op1, currop->op2,
2654                          unshare_expr (nextop->op1));
2655       }
2656       break;
2657     case ADDR_EXPR:
2658       if (currop->op0)
2659         {
2660           gcc_assert (is_gimple_min_invariant (currop->op0));
2661           return currop->op0;
2662         }
2663       /* Fallthrough.  */
2664     case REALPART_EXPR:
2665     case IMAGPART_EXPR:
2666     case VIEW_CONVERT_EXPR:
2667       {
2668         tree folded;
2669         tree genop0 = create_component_ref_by_pieces_1 (block, ref,
2670                                                         operand,
2671                                                         stmts, domstmt);
2672         if (!genop0)
2673           return NULL_TREE;
2674         folded = fold_build1 (currop->opcode, currop->type,
2675                               genop0);
2676         return folded;
2677       }
2678       break;
2679     case ALIGN_INDIRECT_REF:
2680     case MISALIGNED_INDIRECT_REF:
2681     case INDIRECT_REF:
2682       {
2683         tree folded;
2684         tree genop1 = create_component_ref_by_pieces_1 (block, ref,
2685                                                         operand,
2686                                                         stmts, domstmt);
2687         if (!genop1)
2688           return NULL_TREE;
2689         genop1 = fold_convert (build_pointer_type (currop->type),
2690                                genop1);
2691
2692         if (currop->opcode == MISALIGNED_INDIRECT_REF)
2693           folded = fold_build2 (currop->opcode, currop->type,
2694                                 genop1, currop->op1);
2695         else
2696           folded = fold_build1 (currop->opcode, currop->type,
2697                                 genop1);
2698         return folded;
2699       }
2700       break;
2701     case BIT_FIELD_REF:
2702       {
2703         tree folded;
2704         tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2705                                                         stmts, domstmt);
2706         pre_expr op1expr = get_or_alloc_expr_for (currop->op0);
2707         pre_expr op2expr = get_or_alloc_expr_for (currop->op1);
2708         tree genop1;
2709         tree genop2;
2710
2711         if (!genop0)
2712           return NULL_TREE;
2713         genop1 = find_or_generate_expression (block, op1expr, stmts, domstmt);
2714         if (!genop1)
2715           return NULL_TREE;
2716         genop2 = find_or_generate_expression (block, op2expr, stmts, domstmt);
2717         if (!genop2)
2718           return NULL_TREE;
2719         folded = fold_build3 (BIT_FIELD_REF, currop->type, genop0, genop1,
2720                               genop2);
2721         return folded;
2722       }
2723
2724       /* For array ref vn_reference_op's, operand 1 of the array ref
2725          is op0 of the reference op and operand 3 of the array ref is
2726          op1.  */
2727     case ARRAY_RANGE_REF:
2728     case ARRAY_REF:
2729       {
2730         tree genop0;
2731         tree genop1 = currop->op0;
2732         pre_expr op1expr;
2733         tree genop2 = currop->op1;
2734         pre_expr op2expr;
2735         tree genop3 = currop->op2;
2736         pre_expr op3expr;
2737         genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
2738                                                    stmts, domstmt);
2739         if (!genop0)
2740           return NULL_TREE;
2741         op1expr = get_or_alloc_expr_for (genop1);
2742         genop1 = find_or_generate_expression (block, op1expr, stmts, domstmt);
2743         if (!genop1)
2744           return NULL_TREE;
2745         if (genop2)
2746           {
2747             op2expr = get_or_alloc_expr_for (genop2);
2748             genop2 = find_or_generate_expression (block, op2expr, stmts,
2749                                                   domstmt);
2750             if (!genop2)
2751               return NULL_TREE;
2752           }
2753         if (genop3)
2754           {
2755             tree elmt_type = TREE_TYPE (TREE_TYPE (genop0));
2756             genop3 = size_binop (EXACT_DIV_EXPR, genop3,
2757                                  size_int (TYPE_ALIGN_UNIT (elmt_type)));
2758             op3expr = get_or_alloc_expr_for (genop3);
2759             genop3 = find_or_generate_expression (block, op3expr, stmts,
2760                                                   domstmt);
2761             if (!genop3)
2762               return NULL_TREE;
2763           }
2764         return build4 (currop->opcode, currop->type, genop0, genop1,
2765                        genop2, genop3);
2766       }
2767     case COMPONENT_REF:
2768       {
2769         tree op0;
2770         tree op1;
2771         tree genop2 = currop->op1;
2772         pre_expr op2expr;
2773         op0 = create_component_ref_by_pieces_1 (block, ref, operand,
2774                                                 stmts, domstmt);
2775         if (!op0)
2776           return NULL_TREE;
2777         /* op1 should be a FIELD_DECL, which are represented by
2778            themselves.  */
2779         op1 = currop->op0;
2780         if (genop2)
2781           {
2782             op2expr = get_or_alloc_expr_for (genop2);
2783             genop2 = find_or_generate_expression (block, op2expr, stmts,
2784                                                   domstmt);
2785             if (!genop2)
2786               return NULL_TREE;
2787           }
2788
2789         return fold_build3 (COMPONENT_REF, TREE_TYPE (op1), op0, op1,
2790                             genop2);
2791       }
2792       break;
2793     case SSA_NAME:
2794       {
2795         pre_expr op0expr = get_or_alloc_expr_for (currop->op0);
2796         genop = find_or_generate_expression (block, op0expr, stmts, domstmt);
2797         return genop;
2798       }
2799     case STRING_CST:
2800     case INTEGER_CST:
2801     case COMPLEX_CST:
2802     case VECTOR_CST:
2803     case REAL_CST:
2804     case CONSTRUCTOR:
2805     case VAR_DECL:
2806     case PARM_DECL:
2807     case CONST_DECL:
2808     case RESULT_DECL:
2809     case FUNCTION_DECL:
2810       return currop->op0;
2811
2812     default:
2813       gcc_unreachable ();
2814     }
2815 }
2816
2817 /* For COMPONENT_REF's and ARRAY_REF's, we can't have any intermediates for the
2818    COMPONENT_REF or INDIRECT_REF or ARRAY_REF portion, because we'd end up with
2819    trying to rename aggregates into ssa form directly, which is a no no.
2820
2821    Thus, this routine doesn't create temporaries, it just builds a
2822    single access expression for the array, calling
2823    find_or_generate_expression to build the innermost pieces.
2824
2825    This function is a subroutine of create_expression_by_pieces, and
2826    should not be called on it's own unless you really know what you
2827    are doing.  */
2828
2829 static tree
2830 create_component_ref_by_pieces (basic_block block, vn_reference_t ref,
2831                                 gimple_seq *stmts, gimple domstmt)
2832 {
2833   unsigned int op = 0;
2834   return create_component_ref_by_pieces_1 (block, ref, &op, stmts, domstmt);
2835 }
2836
2837 /* Find a leader for an expression, or generate one using
2838    create_expression_by_pieces if it's ANTIC but
2839    complex.
2840    BLOCK is the basic_block we are looking for leaders in.
2841    EXPR is the expression to find a leader or generate for.
2842    STMTS is the statement list to put the inserted expressions on.
2843    Returns the SSA_NAME of the LHS of the generated expression or the
2844    leader.
2845    DOMSTMT if non-NULL is a statement that should be dominated by
2846    all uses in the generated expression.  If DOMSTMT is non-NULL this
2847    routine can fail and return NULL_TREE.  Otherwise it will assert
2848    on failure.  */
2849
2850 static tree
2851 find_or_generate_expression (basic_block block, pre_expr expr,
2852                              gimple_seq *stmts, gimple domstmt)
2853 {
2854   pre_expr leader = bitmap_find_leader (AVAIL_OUT (block),
2855                                         get_expr_value_id (expr), domstmt);
2856   tree genop = NULL;
2857   if (leader)
2858     {
2859       if (leader->kind == NAME)
2860         genop = PRE_EXPR_NAME (leader);
2861       else if (leader->kind == CONSTANT)
2862         genop = PRE_EXPR_CONSTANT (leader);
2863     }
2864
2865   /* If it's still NULL, it must be a complex expression, so generate
2866      it recursively.  Not so for FRE though.  */
2867   if (genop == NULL
2868       && !in_fre)
2869     {
2870       bitmap_set_t exprset;
2871       unsigned int lookfor = get_expr_value_id (expr);
2872       bool handled = false;
2873       bitmap_iterator bi;
2874       unsigned int i;
2875
2876       exprset = VEC_index (bitmap_set_t, value_expressions, lookfor);
2877       FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi)
2878         {
2879           pre_expr temp = expression_for_id (i);
2880           if (temp->kind != NAME)
2881             {
2882               handled = true;
2883               genop = create_expression_by_pieces (block, temp, stmts,
2884                                                    domstmt,
2885                                                    get_expr_type (expr));
2886               break;
2887             }
2888         }
2889       if (!handled && domstmt)
2890         return NULL_TREE;
2891
2892       gcc_assert (handled);
2893     }
2894   return genop;
2895 }
2896
2897 #define NECESSARY GF_PLF_1
2898
2899 /* Create an expression in pieces, so that we can handle very complex
2900    expressions that may be ANTIC, but not necessary GIMPLE.
2901    BLOCK is the basic block the expression will be inserted into,
2902    EXPR is the expression to insert (in value form)
2903    STMTS is a statement list to append the necessary insertions into.
2904
2905    This function will die if we hit some value that shouldn't be
2906    ANTIC but is (IE there is no leader for it, or its components).
2907    This function may also generate expressions that are themselves
2908    partially or fully redundant.  Those that are will be either made
2909    fully redundant during the next iteration of insert (for partially
2910    redundant ones), or eliminated by eliminate (for fully redundant
2911    ones).
2912
2913    If DOMSTMT is non-NULL then we make sure that all uses in the
2914    expressions dominate that statement.  In this case the function
2915    can return NULL_TREE to signal failure.  */
2916
2917 static tree
2918 create_expression_by_pieces (basic_block block, pre_expr expr,
2919                              gimple_seq *stmts, gimple domstmt, tree type)
2920 {
2921   tree temp, name;
2922   tree folded;
2923   gimple_seq forced_stmts = NULL;
2924   unsigned int value_id;
2925   gimple_stmt_iterator gsi;
2926   tree exprtype = type ? type : get_expr_type (expr);
2927   pre_expr nameexpr;
2928   gimple newstmt;
2929
2930   switch (expr->kind)
2931     {
2932       /* We may hit the NAME/CONSTANT case if we have to convert types
2933          that value numbering saw through.  */
2934     case NAME:
2935       folded = PRE_EXPR_NAME (expr);
2936       break;
2937     case CONSTANT:
2938       folded = PRE_EXPR_CONSTANT (expr);
2939       break;
2940     case REFERENCE:
2941       {
2942         vn_reference_t ref = PRE_EXPR_REFERENCE (expr);
2943         folded = create_component_ref_by_pieces (block, ref, stmts, domstmt);
2944       }
2945       break;
2946     case NARY:
2947       {
2948         vn_nary_op_t nary = PRE_EXPR_NARY (expr);
2949         switch (nary->length)
2950           {
2951           case 2:
2952             {
2953               pre_expr op1 = get_or_alloc_expr_for (nary->op[0]);
2954               pre_expr op2 = get_or_alloc_expr_for (nary->op[1]);
2955               tree genop1 = find_or_generate_expression (block, op1,
2956                                                          stmts, domstmt);
2957               tree genop2 = find_or_generate_expression (block, op2,
2958                                                          stmts, domstmt);
2959               if (!genop1 || !genop2)
2960                 return NULL_TREE;
2961               genop1 = fold_convert (TREE_TYPE (nary->op[0]),
2962                                      genop1);
2963               /* Ensure op2 is a sizetype for POINTER_PLUS_EXPR.  It
2964                  may be a constant with the wrong type.  */
2965               if (nary->opcode == POINTER_PLUS_EXPR)
2966                 genop2 = fold_convert (sizetype, genop2);
2967               else
2968                 genop2 = fold_convert (TREE_TYPE (nary->op[1]), genop2);
2969
2970               folded = fold_build2 (nary->opcode, nary->type,
2971                                     genop1, genop2);
2972             }
2973             break;
2974           case 1:
2975             {
2976               pre_expr op1 = get_or_alloc_expr_for (nary->op[0]);
2977               tree genop1 = find_or_generate_expression (block, op1,
2978                                                          stmts, domstmt);
2979               if (!genop1)
2980                 return NULL_TREE;
2981               genop1 = fold_convert (TREE_TYPE (nary->op[0]), genop1);
2982
2983               folded = fold_build1 (nary->opcode, nary->type,
2984                                     genop1);
2985             }
2986             break;
2987           default:
2988             return NULL_TREE;
2989           }
2990       }
2991       break;
2992     default:
2993       return NULL_TREE;
2994     }
2995
2996   if (!useless_type_conversion_p (exprtype, TREE_TYPE (folded)))
2997     folded = fold_convert (exprtype, folded);
2998
2999   /* Force the generated expression to be a sequence of GIMPLE
3000      statements.
3001      We have to call unshare_expr because force_gimple_operand may
3002      modify the tree we pass to it.  */
3003   folded = force_gimple_operand (unshare_expr (folded), &forced_stmts,
3004                                  false, NULL);
3005
3006   /* If we have any intermediate expressions to the value sets, add them
3007      to the value sets and chain them in the instruction stream.  */
3008   if (forced_stmts)
3009     {
3010       gsi = gsi_start (forced_stmts);
3011       for (; !gsi_end_p (gsi); gsi_next (&gsi))
3012         {
3013           gimple stmt = gsi_stmt (gsi);
3014           tree forcedname = gimple_get_lhs (stmt);
3015           pre_expr nameexpr;
3016
3017           VEC_safe_push (gimple, heap, inserted_exprs, stmt);
3018           if (TREE_CODE (forcedname) == SSA_NAME)
3019             {
3020               VN_INFO_GET (forcedname)->valnum = forcedname;
3021               VN_INFO (forcedname)->value_id = get_next_value_id ();
3022               nameexpr = get_or_alloc_expr_for_name (forcedname);
3023               add_to_value (VN_INFO (forcedname)->value_id, nameexpr);
3024               if (!in_fre)
3025                 bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
3026               bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
3027             }
3028           mark_symbols_for_renaming (stmt);
3029         }
3030       gimple_seq_add_seq (stmts, forced_stmts);
3031     }
3032
3033   /* Build and insert the assignment of the end result to the temporary
3034      that we will return.  */
3035   if (!pretemp || exprtype != TREE_TYPE (pretemp))
3036     {
3037       pretemp = create_tmp_var (exprtype, "pretmp");
3038       get_var_ann (pretemp);
3039     }
3040
3041   temp = pretemp;
3042   add_referenced_var (temp);
3043
3044   if (TREE_CODE (exprtype) == COMPLEX_TYPE
3045       || TREE_CODE (exprtype) == VECTOR_TYPE)
3046     DECL_GIMPLE_REG_P (temp) = 1;
3047
3048   newstmt = gimple_build_assign (temp, folded);
3049   name = make_ssa_name (temp, newstmt);
3050   gimple_assign_set_lhs (newstmt, name);
3051   gimple_set_plf (newstmt, NECESSARY, false);
3052
3053   gimple_seq_add_stmt (stmts, newstmt);
3054   VEC_safe_push (gimple, heap, inserted_exprs, newstmt);
3055
3056   /* All the symbols in NEWEXPR should be put into SSA form.  */
3057   mark_symbols_for_renaming (newstmt);
3058
3059   /* Add a value number to the temporary.
3060      The value may already exist in either NEW_SETS, or AVAIL_OUT, because
3061      we are creating the expression by pieces, and this particular piece of
3062      the expression may have been represented.  There is no harm in replacing
3063      here.  */
3064   VN_INFO_GET (name)->valnum = name;
3065   value_id = get_expr_value_id (expr);
3066   VN_INFO (name)->value_id = value_id;
3067   nameexpr = get_or_alloc_expr_for_name (name);
3068   add_to_value (value_id, nameexpr);
3069   if (!in_fre)
3070     bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
3071   bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
3072
3073   pre_stats.insertions++;
3074   if (dump_file && (dump_flags & TDF_DETAILS))
3075     {
3076       fprintf (dump_file, "Inserted ");
3077       print_gimple_stmt (dump_file, newstmt, 0, 0);
3078       fprintf (dump_file, " in predecessor %d\n", block->index);
3079     }
3080
3081   return name;
3082 }
3083
3084
3085 /* Returns true if we want to inhibit the insertions of PHI nodes
3086    for the given EXPR for basic block BB (a member of a loop).
3087    We want to do this, when we fear that the induction variable we
3088    create might inhibit vectorization.  */
3089
3090 static bool
3091 inhibit_phi_insertion (basic_block bb, pre_expr expr)
3092 {
3093   vn_reference_t vr = PRE_EXPR_REFERENCE (expr);
3094   VEC (vn_reference_op_s, heap) *ops = vr->operands;
3095   vn_reference_op_t op;
3096   unsigned i;
3097
3098   /* If we aren't going to vectorize we don't inhibit anything.  */
3099   if (!flag_tree_vectorize)
3100     return false;
3101
3102   /* Otherwise we inhibit the insertion when the address of the
3103      memory reference is a simple induction variable.  In other
3104      cases the vectorizer won't do anything anyway (either it's
3105      loop invariant or a complicated expression).  */
3106   for (i = 0; VEC_iterate (vn_reference_op_s, ops, i, op); ++i)
3107     {
3108       switch (op->opcode)
3109         {
3110         case ARRAY_REF:
3111         case ARRAY_RANGE_REF:
3112           if (TREE_CODE (op->op0) != SSA_NAME)
3113             break;
3114           /* Fallthru.  */
3115         case SSA_NAME:
3116           {
3117             basic_block defbb = gimple_bb (SSA_NAME_DEF_STMT (op->op0));
3118             affine_iv iv;
3119             /* Default defs are loop invariant.  */
3120             if (!defbb)
3121               break;
3122             /* Defined outside this loop, also loop invariant.  */
3123             if (!flow_bb_inside_loop_p (bb->loop_father, defbb))
3124               break;
3125             /* If it's a simple induction variable inhibit insertion,
3126                the vectorizer might be interested in this one.  */
3127             if (simple_iv (bb->loop_father, bb->loop_father,
3128                            op->op0, &iv, true))
3129               return true;
3130             /* No simple IV, vectorizer can't do anything, hence no
3131                reason to inhibit the transformation for this operand.  */
3132             break;
3133           }
3134         default:
3135           break;
3136         }
3137     }
3138   return false;
3139 }
3140
3141 /* Insert the to-be-made-available values of expression EXPRNUM for each
3142    predecessor, stored in AVAIL, into the predecessors of BLOCK, and
3143    merge the result with a phi node, given the same value number as
3144    NODE.  Return true if we have inserted new stuff.  */
3145
3146 static bool
3147 insert_into_preds_of_block (basic_block block, unsigned int exprnum,
3148                             pre_expr *avail)
3149 {
3150   pre_expr expr = expression_for_id (exprnum);
3151   pre_expr newphi;
3152   unsigned int val = get_expr_value_id (expr);
3153   edge pred;
3154   bool insertions = false;
3155   bool nophi = false;
3156   basic_block bprime;
3157   pre_expr eprime;
3158   edge_iterator ei;
3159   tree type = get_expr_type (expr);
3160   tree temp;
3161   gimple phi;
3162
3163   if (dump_file && (dump_flags & TDF_DETAILS))
3164     {
3165       fprintf (dump_file, "Found partial redundancy for expression ");
3166       print_pre_expr (dump_file, expr);
3167       fprintf (dump_file, " (%04d)\n", val);
3168     }
3169
3170   /* Make sure we aren't creating an induction variable.  */
3171   if (block->loop_depth > 0 && EDGE_COUNT (block->preds) == 2)
3172     {
3173       bool firstinsideloop = false;
3174       bool secondinsideloop = false;
3175       firstinsideloop = flow_bb_inside_loop_p (block->loop_father,
3176                                                EDGE_PRED (block, 0)->src);
3177       secondinsideloop = flow_bb_inside_loop_p (block->loop_father,
3178                                                 EDGE_PRED (block, 1)->src);
3179       /* Induction variables only have one edge inside the loop.  */
3180       if ((firstinsideloop ^ secondinsideloop)
3181           && (expr->kind != REFERENCE
3182               || inhibit_phi_insertion (block, expr)))
3183         {
3184           if (dump_file && (dump_flags & TDF_DETAILS))
3185             fprintf (dump_file, "Skipping insertion of phi for partial redundancy: Looks like an induction variable\n");
3186           nophi = true;
3187         }
3188     }
3189
3190   /* Make sure we are not inserting trapping expressions.  */
3191   FOR_EACH_EDGE (pred, ei, block->preds)
3192     {
3193       bprime = pred->src;
3194       eprime = avail[bprime->index];
3195       if (eprime->kind == NARY
3196           && vn_nary_may_trap (PRE_EXPR_NARY (eprime)))
3197         return false;
3198     }
3199
3200   /* Make the necessary insertions.  */
3201   FOR_EACH_EDGE (pred, ei, block->preds)
3202     {
3203       gimple_seq stmts = NULL;
3204       tree builtexpr;
3205       bprime = pred->src;
3206       eprime = avail[bprime->index];
3207
3208       if (eprime->kind != NAME && eprime->kind != CONSTANT)
3209         {
3210           builtexpr = create_expression_by_pieces (bprime,
3211                                                    eprime,
3212                                                    &stmts, NULL,
3213                                                    type);
3214           gcc_assert (!(pred->flags & EDGE_ABNORMAL));
3215           gsi_insert_seq_on_edge (pred, stmts);
3216           avail[bprime->index] = get_or_alloc_expr_for_name (builtexpr);
3217           insertions = true;
3218         }
3219       else if (eprime->kind == CONSTANT)
3220         {
3221           /* Constants may not have the right type, fold_convert
3222              should give us back a constant with the right type.
3223           */
3224           tree constant = PRE_EXPR_CONSTANT (eprime);
3225           if (!useless_type_conversion_p (type, TREE_TYPE (constant)))
3226             {
3227               tree builtexpr = fold_convert (type, constant);
3228               if (!is_gimple_min_invariant (builtexpr))
3229                 {
3230                   tree forcedexpr = force_gimple_operand (builtexpr,
3231                                                           &stmts, true,
3232                                                           NULL);
3233                   if (!is_gimple_min_invariant (forcedexpr))
3234                     {
3235                       if (forcedexpr != builtexpr)
3236                         {
3237                           VN_INFO_GET (forcedexpr)->valnum = PRE_EXPR_CONSTANT (eprime);
3238                           VN_INFO (forcedexpr)->value_id = get_expr_value_id (eprime);
3239                         }
3240                       if (stmts)
3241                         {
3242                           gimple_stmt_iterator gsi;
3243                           gsi = gsi_start (stmts);
3244                           for (; !gsi_end_p (gsi); gsi_next (&gsi))
3245                             {
3246                               gimple stmt = gsi_stmt (gsi);
3247                               VEC_safe_push (gimple, heap, inserted_exprs, stmt);
3248                               gimple_set_plf (stmt, NECESSARY, false);
3249                             }
3250                           gsi_insert_seq_on_edge (pred, stmts);
3251                         }
3252                       avail[bprime->index] = get_or_alloc_expr_for_name (forcedexpr);
3253                     }
3254                 }
3255             }
3256         }
3257       else if (eprime->kind == NAME)
3258         {
3259           /* We may have to do a conversion because our value
3260              numbering can look through types in certain cases, but
3261              our IL requires all operands of a phi node have the same
3262              type.  */
3263           tree name = PRE_EXPR_NAME (eprime);
3264           if (!useless_type_conversion_p (type, TREE_TYPE (name)))
3265             {
3266               tree builtexpr;
3267               tree forcedexpr;
3268               builtexpr = fold_convert (type, name);
3269               forcedexpr = force_gimple_operand (builtexpr,
3270                                                  &stmts, true,
3271                                                  NULL);
3272
3273               if (forcedexpr != name)
3274                 {
3275                   VN_INFO_GET (forcedexpr)->valnum = VN_INFO (name)->valnum;
3276                   VN_INFO (forcedexpr)->value_id = VN_INFO (name)->value_id;
3277                 }
3278
3279               if (stmts)
3280                 {
3281                   gimple_stmt_iterator gsi;
3282                   gsi = gsi_start (stmts);
3283                   for (; !gsi_end_p (gsi); gsi_next (&gsi))
3284                     {
3285                       gimple stmt = gsi_stmt (gsi);
3286                       VEC_safe_push (gimple, heap, inserted_exprs, stmt);
3287                       gimple_set_plf (stmt, NECESSARY, false);
3288                     }
3289                   gsi_insert_seq_on_edge (pred, stmts);
3290                 }
3291               avail[bprime->index] = get_or_alloc_expr_for_name (forcedexpr);
3292             }
3293         }
3294     }
3295   /* If we didn't want a phi node, and we made insertions, we still have
3296      inserted new stuff, and thus return true.  If we didn't want a phi node,
3297      and didn't make insertions, we haven't added anything new, so return
3298      false.  */
3299   if (nophi && insertions)
3300     return true;
3301   else if (nophi && !insertions)
3302     return false;
3303
3304   /* Now build a phi for the new variable.  */
3305   if (!prephitemp || TREE_TYPE (prephitemp) != type)
3306     {
3307       prephitemp = create_tmp_var (type, "prephitmp");
3308       get_var_ann (prephitemp);
3309     }
3310
3311   temp = prephitemp;
3312   add_referenced_var (temp);
3313
3314   if (TREE_CODE (type) == COMPLEX_TYPE
3315       || TREE_CODE (type) == VECTOR_TYPE)
3316     DECL_GIMPLE_REG_P (temp) = 1;
3317   phi = create_phi_node (temp, block);
3318
3319   gimple_set_plf (phi, NECESSARY, false);
3320   VN_INFO_GET (gimple_phi_result (phi))->valnum = gimple_phi_result (phi);
3321   VN_INFO (gimple_phi_result (phi))->value_id = val;
3322   VEC_safe_push (gimple, heap, inserted_exprs, phi);
3323   bitmap_set_bit (inserted_phi_names,
3324                   SSA_NAME_VERSION (gimple_phi_result (phi)));
3325   FOR_EACH_EDGE (pred, ei, block->preds)
3326     {
3327       pre_expr ae = avail[pred->src->index];
3328       gcc_assert (get_expr_type (ae) == type
3329                   || useless_type_conversion_p (type, get_expr_type (ae)));
3330       if (ae->kind == CONSTANT)
3331         add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION);
3332       else
3333         add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred,
3334                      UNKNOWN_LOCATION);
3335     }
3336
3337   newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
3338   add_to_value (val, newphi);
3339
3340   /* The value should *not* exist in PHI_GEN, or else we wouldn't be doing
3341      this insertion, since we test for the existence of this value in PHI_GEN
3342      before proceeding with the partial redundancy checks in insert_aux.
3343
3344      The value may exist in AVAIL_OUT, in particular, it could be represented
3345      by the expression we are trying to eliminate, in which case we want the
3346      replacement to occur.  If it's not existing in AVAIL_OUT, we want it
3347      inserted there.
3348
3349      Similarly, to the PHI_GEN case, the value should not exist in NEW_SETS of
3350      this block, because if it did, it would have existed in our dominator's
3351      AVAIL_OUT, and would have been skipped due to the full redundancy check.
3352   */
3353
3354   bitmap_insert_into_set (PHI_GEN (block), newphi);
3355   bitmap_value_replace_in_set (AVAIL_OUT (block),
3356                                newphi);
3357   bitmap_insert_into_set (NEW_SETS (block),
3358                           newphi);
3359
3360   if (dump_file && (dump_flags & TDF_DETAILS))
3361     {
3362       fprintf (dump_file, "Created phi ");
3363       print_gimple_stmt (dump_file, phi, 0, 0);
3364       fprintf (dump_file, " in block %d\n", block->index);
3365     }
3366   pre_stats.phis++;
3367   return true;
3368 }
3369
3370
3371
3372 /* Perform insertion of partially redundant values.
3373    For BLOCK, do the following:
3374    1.  Propagate the NEW_SETS of the dominator into the current block.
3375    If the block has multiple predecessors,
3376        2a. Iterate over the ANTIC expressions for the block to see if
3377            any of them are partially redundant.
3378        2b. If so, insert them into the necessary predecessors to make
3379            the expression fully redundant.
3380        2c. Insert a new PHI merging the values of the predecessors.
3381        2d. Insert the new PHI, and the new expressions, into the
3382            NEW_SETS set.
3383    3. Recursively call ourselves on the dominator children of BLOCK.
3384
3385    Steps 1, 2a, and 3 are done by insert_aux. 2b, 2c and 2d are done by
3386    do_regular_insertion and do_partial_insertion.
3387
3388 */
3389
3390 static bool
3391 do_regular_insertion (basic_block block, basic_block dom)
3392 {
3393   bool new_stuff = false;
3394   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (ANTIC_IN (block));
3395   pre_expr expr;
3396   int i;
3397
3398   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
3399     {
3400       if (expr->kind != NAME)
3401         {
3402           pre_expr *avail;
3403           unsigned int val;
3404           bool by_some = false;
3405           bool cant_insert = false;
3406           bool all_same = true;
3407           pre_expr first_s = NULL;
3408           edge pred;
3409           basic_block bprime;
3410           pre_expr eprime = NULL;
3411           edge_iterator ei;
3412           pre_expr edoubleprime = NULL;
3413           bool do_insertion = false;
3414
3415           val = get_expr_value_id (expr);
3416           if (bitmap_set_contains_value (PHI_GEN (block), val))
3417             continue;
3418           if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3419             {
3420               if (dump_file && (dump_flags & TDF_DETAILS))
3421                 fprintf (dump_file, "Found fully redundant value\n");
3422               continue;
3423             }
3424
3425           avail = XCNEWVEC (pre_expr, last_basic_block);
3426           FOR_EACH_EDGE (pred, ei, block->preds)
3427             {
3428               unsigned int vprime;
3429
3430               /* We should never run insertion for the exit block
3431                  and so not come across fake pred edges.  */
3432               gcc_assert (!(pred->flags & EDGE_FAKE));
3433               bprime = pred->src;
3434               eprime = phi_translate (expr, ANTIC_IN (block), NULL,
3435                                       bprime, block);
3436
3437               /* eprime will generally only be NULL if the
3438                  value of the expression, translated
3439                  through the PHI for this predecessor, is
3440                  undefined.  If that is the case, we can't
3441                  make the expression fully redundant,
3442                  because its value is undefined along a
3443                  predecessor path.  We can thus break out
3444                  early because it doesn't matter what the
3445                  rest of the results are.  */
3446               if (eprime == NULL)
3447                 {
3448                   cant_insert = true;
3449                   break;
3450                 }
3451
3452               eprime = fully_constant_expression (eprime);
3453               vprime = get_expr_value_id (eprime);
3454               edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
3455                                                  vprime, NULL);
3456               if (edoubleprime == NULL)
3457                 {
3458                   avail[bprime->index] = eprime;
3459                   all_same = false;
3460                 }
3461               else
3462                 {
3463                   avail[bprime->index] = edoubleprime;
3464                   by_some = true;
3465                   /* We want to perform insertions to remove a redundancy on
3466                      a path in the CFG we want to optimize for speed.  */
3467                   if (optimize_edge_for_speed_p (pred))
3468                     do_insertion = true;
3469                   if (first_s == NULL)
3470                     first_s = edoubleprime;
3471                   else if (!pre_expr_eq (first_s, edoubleprime))
3472                     all_same = false;
3473                 }
3474             }
3475           /* If we can insert it, it's not the same value
3476              already existing along every predecessor, and
3477              it's defined by some predecessor, it is
3478              partially redundant.  */
3479           if (!cant_insert && !all_same && by_some && do_insertion
3480               && dbg_cnt (treepre_insert))
3481             {
3482               if (insert_into_preds_of_block (block, get_expression_id (expr),
3483                                               avail))
3484                 new_stuff = true;
3485             }
3486           /* If all edges produce the same value and that value is
3487              an invariant, then the PHI has the same value on all
3488              edges.  Note this.  */
3489           else if (!cant_insert && all_same && eprime
3490                    && (edoubleprime->kind == CONSTANT
3491                        || edoubleprime->kind == NAME)
3492                    && !value_id_constant_p (val))
3493             {
3494               unsigned int j;
3495               bitmap_iterator bi;
3496               bitmap_set_t exprset = VEC_index (bitmap_set_t,
3497                                                 value_expressions, val);
3498
3499               unsigned int new_val = get_expr_value_id (edoubleprime);
3500               FOR_EACH_EXPR_ID_IN_SET (exprset, j, bi)
3501                 {
3502                   pre_expr expr = expression_for_id (j);
3503
3504                   if (expr->kind == NAME)
3505                     {
3506                       vn_ssa_aux_t info = VN_INFO (PRE_EXPR_NAME (expr));
3507                       /* Just reset the value id and valnum so it is
3508                          the same as the constant we have discovered.  */
3509                       if (edoubleprime->kind == CONSTANT)
3510                         {
3511                           info->valnum = PRE_EXPR_CONSTANT (edoubleprime);
3512                           pre_stats.constified++;
3513                         }
3514                       else
3515                         info->valnum = VN_INFO (PRE_EXPR_NAME (edoubleprime))->valnum;
3516                       info->value_id = new_val;
3517                     }
3518                 }
3519             }
3520           free (avail);
3521         }
3522     }
3523
3524   VEC_free (pre_expr, heap, exprs);
3525   return new_stuff;
3526 }
3527
3528
3529 /* Perform insertion for partially anticipatable expressions.  There
3530    is only one case we will perform insertion for these.  This case is
3531    if the expression is partially anticipatable, and fully available.
3532    In this case, we know that putting it earlier will enable us to
3533    remove the later computation.  */
3534
3535
3536 static bool
3537 do_partial_partial_insertion (basic_block block, basic_block dom)
3538 {
3539   bool new_stuff = false;
3540   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (PA_IN (block));
3541   pre_expr expr;
3542   int i;
3543
3544   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
3545     {
3546       if (expr->kind != NAME)
3547         {
3548           pre_expr *avail;
3549           unsigned int val;
3550           bool by_all = true;
3551           bool cant_insert = false;
3552           edge pred;
3553           basic_block bprime;
3554           pre_expr eprime = NULL;
3555           edge_iterator ei;
3556
3557           val = get_expr_value_id (expr);
3558           if (bitmap_set_contains_value (PHI_GEN (block), val))
3559             continue;
3560           if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3561             continue;
3562
3563           avail = XCNEWVEC (pre_expr, last_basic_block);
3564           FOR_EACH_EDGE (pred, ei, block->preds)
3565             {
3566               unsigned int vprime;
3567               pre_expr edoubleprime;
3568
3569               /* We should never run insertion for the exit block
3570                  and so not come across fake pred edges.  */
3571               gcc_assert (!(pred->flags & EDGE_FAKE));
3572               bprime = pred->src;
3573               eprime = phi_translate (expr, ANTIC_IN (block),
3574                                       PA_IN (block),
3575                                       bprime, block);
3576
3577               /* eprime will generally only be NULL if the
3578                  value of the expression, translated
3579                  through the PHI for this predecessor, is
3580                  undefined.  If that is the case, we can't
3581                  make the expression fully redundant,
3582                  because its value is undefined along a
3583                  predecessor path.  We can thus break out
3584                  early because it doesn't matter what the
3585                  rest of the results are.  */
3586               if (eprime == NULL)
3587                 {
3588                   cant_insert = true;
3589                   break;
3590                 }
3591
3592               eprime = fully_constant_expression (eprime);
3593               vprime = get_expr_value_id (eprime);
3594               edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
3595                                                  vprime, NULL);
3596               if (edoubleprime == NULL)
3597                 {
3598                   by_all = false;
3599                   break;
3600                 }
3601               else
3602                 avail[bprime->index] = edoubleprime;
3603
3604             }
3605
3606           /* If we can insert it, it's not the same value
3607              already existing along every predecessor, and
3608              it's defined by some predecessor, it is
3609              partially redundant.  */
3610           if (!cant_insert && by_all && dbg_cnt (treepre_insert))
3611             {
3612               pre_stats.pa_insert++;
3613               if (insert_into_preds_of_block (block, get_expression_id (expr),
3614                                               avail))
3615                 new_stuff = true;
3616             }
3617           free (avail);
3618         }
3619     }
3620
3621   VEC_free (pre_expr, heap, exprs);
3622   return new_stuff;
3623 }
3624
3625 static bool
3626 insert_aux (basic_block block)
3627 {
3628   basic_block son;
3629   bool new_stuff = false;
3630
3631   if (block)
3632     {
3633       basic_block dom;
3634       dom = get_immediate_dominator (CDI_DOMINATORS, block);
3635       if (dom)
3636         {
3637           unsigned i;
3638           bitmap_iterator bi;
3639           bitmap_set_t newset = NEW_SETS (dom);
3640           if (newset)
3641             {
3642               /* Note that we need to value_replace both NEW_SETS, and
3643                  AVAIL_OUT. For both the case of NEW_SETS, the value may be
3644                  represented by some non-simple expression here that we want
3645                  to replace it with.  */
3646               FOR_EACH_EXPR_ID_IN_SET (newset, i, bi)
3647                 {
3648                   pre_expr expr = expression_for_id (i);
3649                   bitmap_value_replace_in_set (NEW_SETS (block), expr);
3650                   bitmap_value_replace_in_set (AVAIL_OUT (block), expr);
3651                 }
3652             }
3653           if (!single_pred_p (block))
3654             {
3655               new_stuff |= do_regular_insertion (block, dom);
3656               if (do_partial_partial)
3657                 new_stuff |= do_partial_partial_insertion (block, dom);
3658             }
3659         }
3660     }
3661   for (son = first_dom_son (CDI_DOMINATORS, block);
3662        son;
3663        son = next_dom_son (CDI_DOMINATORS, son))
3664     {
3665       new_stuff |= insert_aux (son);
3666     }
3667
3668   return new_stuff;
3669 }
3670
3671 /* Perform insertion of partially redundant values.  */
3672
3673 static void
3674 insert (void)
3675 {
3676   bool new_stuff = true;
3677   basic_block bb;
3678   int num_iterations = 0;
3679
3680   FOR_ALL_BB (bb)
3681     NEW_SETS (bb) = bitmap_set_new ();
3682
3683   while (new_stuff)
3684     {
3685       num_iterations++;
3686       new_stuff = insert_aux (ENTRY_BLOCK_PTR);
3687     }
3688   statistics_histogram_event (cfun, "insert iterations", num_iterations);
3689 }
3690
3691
3692 /* Add OP to EXP_GEN (block), and possibly to the maximal set.  */
3693
3694 static void
3695 add_to_exp_gen (basic_block block, tree op)
3696 {
3697   if (!in_fre)
3698     {
3699       pre_expr result;
3700       if (TREE_CODE (op) == SSA_NAME && ssa_undefined_value_p (op))
3701         return;
3702       result = get_or_alloc_expr_for_name (op);
3703       bitmap_value_insert_into_set (EXP_GEN (block), result);
3704     }
3705 }
3706
3707 /* Create value ids for PHI in BLOCK.  */
3708
3709 static void
3710 make_values_for_phi (gimple phi, basic_block block)
3711 {
3712   tree result = gimple_phi_result (phi);
3713
3714   /* We have no need for virtual phis, as they don't represent
3715      actual computations.  */
3716   if (is_gimple_reg (result))
3717     {
3718       pre_expr e = get_or_alloc_expr_for_name (result);
3719       add_to_value (get_expr_value_id (e), e);
3720       bitmap_insert_into_set (PHI_GEN (block), e);
3721       bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3722       if (!in_fre)
3723         {
3724           unsigned i;
3725           for (i = 0; i < gimple_phi_num_args (phi); ++i)
3726             {
3727               tree arg = gimple_phi_arg_def (phi, i);
3728               if (TREE_CODE (arg) == SSA_NAME)
3729                 {
3730                   e = get_or_alloc_expr_for_name (arg);
3731                   add_to_value (get_expr_value_id (e), e);
3732                 }
3733             }
3734         }
3735     }
3736 }
3737
3738 /* Compute the AVAIL set for all basic blocks.
3739
3740    This function performs value numbering of the statements in each basic
3741    block.  The AVAIL sets are built from information we glean while doing
3742    this value numbering, since the AVAIL sets contain only one entry per
3743    value.
3744
3745    AVAIL_IN[BLOCK] = AVAIL_OUT[dom(BLOCK)].
3746    AVAIL_OUT[BLOCK] = AVAIL_IN[BLOCK] U PHI_GEN[BLOCK] U TMP_GEN[BLOCK].  */
3747
3748 static void
3749 compute_avail (void)
3750 {
3751
3752   basic_block block, son;
3753   basic_block *worklist;
3754   size_t sp = 0;
3755   unsigned i;
3756
3757   /* We pretend that default definitions are defined in the entry block.
3758      This includes function arguments and the static chain decl.  */
3759   for (i = 1; i < num_ssa_names; ++i)
3760     {
3761       tree name = ssa_name (i);
3762       pre_expr e;
3763       if (!name
3764           || !SSA_NAME_IS_DEFAULT_DEF (name)
3765           || has_zero_uses (name)
3766           || !is_gimple_reg (name))
3767         continue;
3768
3769       e = get_or_alloc_expr_for_name (name);
3770       add_to_value (get_expr_value_id (e), e);
3771       if (!in_fre)
3772         bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
3773       bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
3774     }
3775
3776   /* Allocate the worklist.  */
3777   worklist = XNEWVEC (basic_block, n_basic_blocks);
3778
3779   /* Seed the algorithm by putting the dominator children of the entry
3780      block on the worklist.  */
3781   for (son = first_dom_son (CDI_DOMINATORS, ENTRY_BLOCK_PTR);
3782        son;
3783        son = next_dom_son (CDI_DOMINATORS, son))
3784     worklist[sp++] = son;
3785
3786   /* Loop until the worklist is empty.  */
3787   while (sp)
3788     {
3789       gimple_stmt_iterator gsi;
3790       gimple stmt;
3791       basic_block dom;
3792       unsigned int stmt_uid = 1;
3793
3794       /* Pick a block from the worklist.  */
3795       block = worklist[--sp];
3796
3797       /* Initially, the set of available values in BLOCK is that of
3798          its immediate dominator.  */
3799       dom = get_immediate_dominator (CDI_DOMINATORS, block);
3800       if (dom)
3801         bitmap_set_copy (AVAIL_OUT (block), AVAIL_OUT (dom));
3802
3803       /* Generate values for PHI nodes.  */
3804       for (gsi = gsi_start_phis (block); !gsi_end_p (gsi); gsi_next (&gsi))
3805         make_values_for_phi (gsi_stmt (gsi), block);
3806
3807       /* Now compute value numbers and populate value sets with all
3808          the expressions computed in BLOCK.  */
3809       for (gsi = gsi_start_bb (block); !gsi_end_p (gsi); gsi_next (&gsi))
3810         {
3811           ssa_op_iter iter;
3812           tree op;
3813
3814           stmt = gsi_stmt (gsi);
3815           gimple_set_uid (stmt, stmt_uid++);
3816
3817           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
3818             {
3819               pre_expr e = get_or_alloc_expr_for_name (op);
3820
3821               add_to_value (get_expr_value_id (e), e);
3822               if (!in_fre)
3823                 bitmap_insert_into_set (TMP_GEN (block), e);
3824               bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3825             }
3826
3827           if (gimple_has_volatile_ops (stmt)
3828               || stmt_could_throw_p (stmt))
3829             continue;
3830
3831           switch (gimple_code (stmt))
3832             {
3833             case GIMPLE_RETURN:
3834               FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3835                 add_to_exp_gen (block, op);
3836               continue;
3837
3838             case GIMPLE_CALL:
3839               {
3840                 vn_reference_t ref;
3841                 unsigned int i;
3842                 vn_reference_op_t vro;
3843                 pre_expr result = NULL;
3844                 VEC(vn_reference_op_s, heap) *ops = NULL;
3845
3846                 if (!can_value_number_call (stmt))
3847                   continue;
3848
3849                 copy_reference_ops_from_call (stmt, &ops);
3850                 vn_reference_lookup_pieces (gimple_vuse (stmt), 0,
3851                                             gimple_expr_type (stmt),
3852                                             ops, &ref, false);
3853                 VEC_free (vn_reference_op_s, heap, ops);
3854                 if (!ref)
3855                   continue;
3856
3857                 for (i = 0; VEC_iterate (vn_reference_op_s,
3858                                          ref->operands, i,
3859                                          vro); i++)
3860                   {
3861                     if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
3862                       add_to_exp_gen (block, vro->op0);
3863                     if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
3864                       add_to_exp_gen (block, vro->op1);
3865                     if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
3866                       add_to_exp_gen (block, vro->op2);
3867                   }
3868                 result = (pre_expr) pool_alloc (pre_expr_pool);
3869                 result->kind = REFERENCE;
3870                 result->id = 0;
3871                 PRE_EXPR_REFERENCE (result) = ref;
3872
3873                 get_or_alloc_expression_id (result);
3874                 add_to_value (get_expr_value_id (result), result);
3875                 if (!in_fre)
3876                   bitmap_value_insert_into_set (EXP_GEN (block), result);
3877                 continue;
3878               }
3879
3880             case GIMPLE_ASSIGN:
3881               {
3882                 pre_expr result = NULL;
3883                 switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
3884                   {
3885                   case tcc_unary:
3886                   case tcc_binary:
3887                   case tcc_comparison:
3888                     {
3889                       vn_nary_op_t nary;
3890                       unsigned int i;
3891
3892                       vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1,
3893                                                 gimple_assign_rhs_code (stmt),
3894                                                 gimple_expr_type (stmt),
3895                                                 gimple_assign_rhs1 (stmt),
3896                                                 gimple_assign_rhs2 (stmt),
3897                                                 NULL_TREE, NULL_TREE, &nary);
3898
3899                       if (!nary)
3900                         continue;
3901
3902                       for (i = 0; i < nary->length; i++)
3903                         if (TREE_CODE (nary->op[i]) == SSA_NAME)
3904                           add_to_exp_gen (block, nary->op[i]);
3905
3906                       result = (pre_expr) pool_alloc (pre_expr_pool);
3907                       result->kind = NARY;
3908                       result->id = 0;
3909                       PRE_EXPR_NARY (result) = nary;
3910                       break;
3911                     }
3912
3913                   case tcc_declaration:
3914                   case tcc_reference:
3915                     {
3916                       vn_reference_t ref;
3917                       unsigned int i;
3918                       vn_reference_op_t vro;
3919
3920                       vn_reference_lookup (gimple_assign_rhs1 (stmt),
3921                                            gimple_vuse (stmt),
3922                                            true, &ref);
3923                       if (!ref)
3924                         continue;
3925
3926                       for (i = 0; VEC_iterate (vn_reference_op_s,
3927                                                ref->operands, i,
3928                                                vro); i++)
3929                         {
3930                           if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
3931                             add_to_exp_gen (block, vro->op0);
3932                           if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
3933                             add_to_exp_gen (block, vro->op1);
3934                           if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
3935                             add_to_exp_gen (block, vro->op2);
3936                         }
3937                       result = (pre_expr) pool_alloc (pre_expr_pool);
3938                       result->kind = REFERENCE;
3939                       result->id = 0;
3940                       PRE_EXPR_REFERENCE (result) = ref;
3941                       break;
3942                     }
3943
3944                   default:
3945                     /* For any other statement that we don't
3946                        recognize, simply add all referenced
3947                        SSA_NAMEs to EXP_GEN.  */
3948                     FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3949                       add_to_exp_gen (block, op);
3950                     continue;
3951                   }
3952
3953                 get_or_alloc_expression_id (result);
3954                 add_to_value (get_expr_value_id (result), result);
3955                 if (!in_fre)
3956                   bitmap_value_insert_into_set (EXP_GEN (block), result);
3957
3958                 continue;
3959               }
3960             default:
3961               break;
3962             }
3963         }
3964
3965       /* Put the dominator children of BLOCK on the worklist of blocks
3966          to compute available sets for.  */
3967       for (son = first_dom_son (CDI_DOMINATORS, block);
3968            son;
3969            son = next_dom_son (CDI_DOMINATORS, son))
3970         worklist[sp++] = son;
3971     }
3972
3973   free (worklist);
3974 }
3975
3976 /* Insert the expression for SSA_VN that SCCVN thought would be simpler
3977    than the available expressions for it.  The insertion point is
3978    right before the first use in STMT.  Returns the SSA_NAME that should
3979    be used for replacement.  */
3980
3981 static tree
3982 do_SCCVN_insertion (gimple stmt, tree ssa_vn)
3983 {
3984   basic_block bb = gimple_bb (stmt);
3985   gimple_stmt_iterator gsi;
3986   gimple_seq stmts = NULL;
3987   tree expr;
3988   pre_expr e;
3989
3990   /* First create a value expression from the expression we want
3991      to insert and associate it with the value handle for SSA_VN.  */
3992   e = get_or_alloc_expr_for (vn_get_expr_for (ssa_vn));
3993   if (e == NULL)
3994     return NULL_TREE;
3995
3996   /* Then use create_expression_by_pieces to generate a valid
3997      expression to insert at this point of the IL stream.  */
3998   expr = create_expression_by_pieces (bb, e, &stmts, stmt, NULL);
3999   if (expr == NULL_TREE)
4000     return NULL_TREE;
4001   gsi = gsi_for_stmt (stmt);
4002   gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
4003
4004   return expr;
4005 }
4006
4007 /* Eliminate fully redundant computations.  */
4008
4009 static unsigned int
4010 eliminate (void)
4011 {
4012   VEC (gimple, heap) *to_remove = NULL;
4013   basic_block b;
4014   unsigned int todo = 0;
4015   gimple_stmt_iterator gsi;
4016   gimple stmt;
4017   unsigned i;
4018
4019   FOR_EACH_BB (b)
4020     {
4021       for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
4022         {
4023           stmt = gsi_stmt (gsi);
4024
4025           /* Lookup the RHS of the expression, see if we have an
4026              available computation for it.  If so, replace the RHS with
4027              the available computation.  */
4028           if (gimple_has_lhs (stmt)
4029               && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME
4030               && !gimple_assign_ssa_name_copy_p (stmt)
4031               && (!gimple_assign_single_p (stmt)
4032                   || !is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
4033               && !gimple_has_volatile_ops  (stmt)
4034               && !has_zero_uses (gimple_get_lhs (stmt)))
4035             {
4036               tree lhs = gimple_get_lhs (stmt);
4037               tree rhs = NULL_TREE;
4038               tree sprime = NULL;
4039               pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
4040               pre_expr sprimeexpr;
4041
4042               if (gimple_assign_single_p (stmt))
4043                 rhs = gimple_assign_rhs1 (stmt);
4044
4045               sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
4046                                                get_expr_value_id (lhsexpr),
4047                                                NULL);
4048
4049               if (sprimeexpr)
4050                 {
4051                   if (sprimeexpr->kind == CONSTANT)
4052                     sprime = PRE_EXPR_CONSTANT (sprimeexpr);
4053                   else if (sprimeexpr->kind == NAME)
4054                     sprime = PRE_EXPR_NAME (sprimeexpr);
4055                   else
4056                     gcc_unreachable ();
4057                 }
4058
4059               /* If there is no existing leader but SCCVN knows this
4060                  value is constant, use that constant.  */
4061               if (!sprime && is_gimple_min_invariant (VN_INFO (lhs)->valnum))
4062                 {
4063                   sprime = VN_INFO (lhs)->valnum;
4064                   if (!useless_type_conversion_p (TREE_TYPE (lhs),
4065                                                   TREE_TYPE (sprime)))
4066                     sprime = fold_convert (TREE_TYPE (lhs), sprime);
4067
4068                   if (dump_file && (dump_flags & TDF_DETAILS))
4069                     {
4070                       fprintf (dump_file, "Replaced ");
4071                       print_gimple_expr (dump_file, stmt, 0, 0);
4072                       fprintf (dump_file, " with ");
4073                       print_generic_expr (dump_file, sprime, 0);
4074                       fprintf (dump_file, " in ");
4075                       print_gimple_stmt (dump_file, stmt, 0, 0);
4076                     }
4077                   pre_stats.eliminations++;
4078                   propagate_tree_value_into_stmt (&gsi, sprime);
4079                   stmt = gsi_stmt (gsi);
4080                   update_stmt (stmt);
4081                   continue;
4082                 }
4083
4084               /* If there is no existing usable leader but SCCVN thinks
4085                  it has an expression it wants to use as replacement,
4086                  insert that.  */
4087               if (!sprime || sprime == lhs)
4088                 {
4089                   tree val = VN_INFO (lhs)->valnum;
4090                   if (val != VN_TOP
4091                       && TREE_CODE (val) == SSA_NAME
4092                       && VN_INFO (val)->needs_insertion
4093                       && can_PRE_operation (vn_get_expr_for (val)))
4094                     sprime = do_SCCVN_insertion (stmt, val);
4095                 }
4096               if (sprime
4097                   && sprime != lhs
4098                   && (rhs == NULL_TREE
4099                       || TREE_CODE (rhs) != SSA_NAME
4100                       || may_propagate_copy (rhs, sprime)))
4101                 {
4102                   gcc_assert (sprime != rhs);
4103
4104                   if (dump_file && (dump_flags & TDF_DETAILS))
4105                     {
4106                       fprintf (dump_file, "Replaced ");
4107                       print_gimple_expr (dump_file, stmt, 0, 0);
4108                       fprintf (dump_file, " with ");
4109                       print_generic_expr (dump_file, sprime, 0);
4110                       fprintf (dump_file, " in ");
4111                       print_gimple_stmt (dump_file, stmt, 0, 0);
4112                     }
4113
4114                   if (TREE_CODE (sprime) == SSA_NAME)
4115                     gimple_set_plf (SSA_NAME_DEF_STMT (sprime),
4116                                     NECESSARY, true);
4117                   /* We need to make sure the new and old types actually match,
4118                      which may require adding a simple cast, which fold_convert
4119                      will do for us.  */
4120                   if ((!rhs || TREE_CODE (rhs) != SSA_NAME)
4121                       && !useless_type_conversion_p (gimple_expr_type (stmt),
4122                                                      TREE_TYPE (sprime)))
4123                     sprime = fold_convert (gimple_expr_type (stmt), sprime);
4124
4125                   pre_stats.eliminations++;
4126                   propagate_tree_value_into_stmt (&gsi, sprime);
4127                   stmt = gsi_stmt (gsi);
4128                   update_stmt (stmt);
4129
4130                   /* If we removed EH side effects from the statement, clean
4131                      its EH information.  */
4132                   if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
4133                     {
4134                       bitmap_set_bit (need_eh_cleanup,
4135                                       gimple_bb (stmt)->index);
4136                       if (dump_file && (dump_flags & TDF_DETAILS))
4137                         fprintf (dump_file, "  Removed EH side effects.\n");
4138                     }
4139                 }
4140             }
4141           /* If the statement is a scalar store, see if the expression
4142              has the same value number as its rhs.  If so, the store is
4143              dead.  */
4144           else if (gimple_assign_single_p (stmt)
4145                    && !is_gimple_reg (gimple_assign_lhs (stmt))
4146                    && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
4147                        || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
4148             {
4149               tree rhs = gimple_assign_rhs1 (stmt);
4150               tree val;
4151               val = vn_reference_lookup (gimple_assign_lhs (stmt),
4152                                          gimple_vuse (stmt), true, NULL);
4153               if (TREE_CODE (rhs) == SSA_NAME)
4154                 rhs = VN_INFO (rhs)->valnum;
4155               if (val
4156                   && operand_equal_p (val, rhs, 0))
4157                 {
4158                   if (dump_file && (dump_flags & TDF_DETAILS))
4159                     {
4160                       fprintf (dump_file, "Deleted redundant store ");
4161                       print_gimple_stmt (dump_file, stmt, 0, 0);
4162                     }
4163
4164                   /* Queue stmt for removal.  */
4165                   VEC_safe_push (gimple, heap, to_remove, stmt);
4166                 }
4167             }
4168           /* Visit COND_EXPRs and fold the comparison with the
4169              available value-numbers.  */
4170           else if (gimple_code (stmt) == GIMPLE_COND)
4171             {
4172               tree op0 = gimple_cond_lhs (stmt);
4173               tree op1 = gimple_cond_rhs (stmt);
4174               tree result;
4175
4176               if (TREE_CODE (op0) == SSA_NAME)
4177                 op0 = VN_INFO (op0)->valnum;
4178               if (TREE_CODE (op1) == SSA_NAME)
4179                 op1 = VN_INFO (op1)->valnum;
4180               result = fold_binary (gimple_cond_code (stmt), boolean_type_node,
4181                                     op0, op1);
4182               if (result && TREE_CODE (result) == INTEGER_CST)
4183                 {
4184                   if (integer_zerop (result))
4185                     gimple_cond_make_false (stmt);
4186                   else
4187                     gimple_cond_make_true (stmt);
4188                   update_stmt (stmt);
4189                   todo = TODO_cleanup_cfg;
4190                 }
4191             }
4192           /* Visit indirect calls and turn them into direct calls if
4193              possible.  */
4194           if (gimple_code (stmt) == GIMPLE_CALL
4195               && TREE_CODE (gimple_call_fn (stmt)) == SSA_NAME)
4196             {
4197               tree fn = VN_INFO (gimple_call_fn (stmt))->valnum;
4198               if (TREE_CODE (fn) == ADDR_EXPR
4199                   && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL)
4200                 {
4201                   if (dump_file && (dump_flags & TDF_DETAILS))
4202                     {
4203                       fprintf (dump_file, "Replacing call target with ");
4204                       print_generic_expr (dump_file, fn, 0);
4205                       fprintf (dump_file, " in ");
4206                       print_gimple_stmt (dump_file, stmt, 0, 0);
4207                     }
4208
4209                   gimple_call_set_fn (stmt, fn);
4210                   update_stmt (stmt);
4211                   if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
4212                     {
4213                       bitmap_set_bit (need_eh_cleanup,
4214                                       gimple_bb (stmt)->index);
4215                       if (dump_file && (dump_flags & TDF_DETAILS))
4216                         fprintf (dump_file, "  Removed EH side effects.\n");
4217                     }
4218
4219                   /* Changing an indirect call to a direct call may
4220                      have exposed different semantics.  This may
4221                      require an SSA update.  */
4222                   todo |= TODO_update_ssa_only_virtuals;
4223                 }
4224             }
4225         }
4226
4227       for (gsi = gsi_start_phis (b); !gsi_end_p (gsi);)
4228         {
4229           gimple stmt, phi = gsi_stmt (gsi);
4230           tree sprime = NULL_TREE, res = PHI_RESULT (phi);
4231           pre_expr sprimeexpr, resexpr;
4232           gimple_stmt_iterator gsi2;
4233
4234           /* We want to perform redundant PHI elimination.  Do so by
4235              replacing the PHI with a single copy if possible.
4236              Do not touch inserted, single-argument or virtual PHIs.  */
4237           if (gimple_phi_num_args (phi) == 1
4238               || !is_gimple_reg (res)
4239               || bitmap_bit_p (inserted_phi_names, SSA_NAME_VERSION (res)))
4240             {
4241               gsi_next (&gsi);
4242               continue;
4243             }
4244
4245           resexpr = get_or_alloc_expr_for_name (res);
4246           sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
4247                                            get_expr_value_id (resexpr), NULL);
4248           if (sprimeexpr)
4249             {
4250               if (sprimeexpr->kind == CONSTANT)
4251                 sprime = PRE_EXPR_CONSTANT (sprimeexpr);
4252               else if (sprimeexpr->kind == NAME)
4253                 sprime = PRE_EXPR_NAME (sprimeexpr);
4254               else
4255                 gcc_unreachable ();
4256             }
4257           if (!sprimeexpr
4258               || sprime == res)
4259             {
4260               gsi_next (&gsi);
4261               continue;
4262             }
4263
4264           if (dump_file && (dump_flags & TDF_DETAILS))
4265             {
4266               fprintf (dump_file, "Replaced redundant PHI node defining ");
4267               print_generic_expr (dump_file, res, 0);
4268               fprintf (dump_file, " with ");
4269               print_generic_expr (dump_file, sprime, 0);
4270               fprintf (dump_file, "\n");
4271             }
4272
4273           remove_phi_node (&gsi, false);
4274
4275           if (!useless_type_conversion_p (TREE_TYPE (res), TREE_TYPE (sprime)))
4276             sprime = fold_convert (TREE_TYPE (res), sprime);
4277           stmt = gimple_build_assign (res, sprime);
4278           SSA_NAME_DEF_STMT (res) = stmt;
4279           if (TREE_CODE (sprime) == SSA_NAME)
4280             gimple_set_plf (SSA_NAME_DEF_STMT (sprime),
4281                             NECESSARY, true);
4282           gsi2 = gsi_after_labels (b);
4283           gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
4284           /* Queue the copy for eventual removal.  */
4285           VEC_safe_push (gimple, heap, to_remove, stmt);
4286           pre_stats.eliminations++;
4287         }
4288     }
4289
4290   /* We cannot remove stmts during BB walk, especially not release SSA
4291      names there as this confuses the VN machinery.  The stmts ending
4292      up in to_remove are either stores or simple copies.  */
4293   for (i = 0; VEC_iterate (gimple, to_remove, i, stmt); ++i)
4294     {
4295       tree lhs = gimple_assign_lhs (stmt);
4296       use_operand_p use_p;
4297       gimple use_stmt;
4298
4299       /* If there is a single use only, propagate the equivalency
4300          instead of keeping the copy.  */
4301       if (TREE_CODE (lhs) == SSA_NAME
4302           && single_imm_use (lhs, &use_p, &use_stmt)
4303           && may_propagate_copy (USE_FROM_PTR (use_p),
4304                                  gimple_assign_rhs1 (stmt)))
4305         {
4306           SET_USE (use_p, gimple_assign_rhs1 (stmt));
4307           update_stmt (use_stmt);
4308         }
4309
4310       /* If this is a store or a now unused copy, remove it.  */
4311       if (TREE_CODE (lhs) != SSA_NAME
4312           || has_zero_uses (lhs))
4313         {
4314           gsi = gsi_for_stmt (stmt);
4315           unlink_stmt_vdef (stmt);
4316           gsi_remove (&gsi, true);
4317           release_defs (stmt);
4318         }
4319     }
4320   VEC_free (gimple, heap, to_remove);
4321
4322   return todo;
4323 }
4324
4325 /* Borrow a bit of tree-ssa-dce.c for the moment.
4326    XXX: In 4.1, we should be able to just run a DCE pass after PRE, though
4327    this may be a bit faster, and we may want critical edges kept split.  */
4328
4329 /* If OP's defining statement has not already been determined to be necessary,
4330    mark that statement necessary. Return the stmt, if it is newly
4331    necessary.  */
4332
4333 static inline gimple
4334 mark_operand_necessary (tree op)
4335 {
4336   gimple stmt;
4337
4338   gcc_assert (op);
4339
4340   if (TREE_CODE (op) != SSA_NAME)
4341     return NULL;
4342
4343   stmt = SSA_NAME_DEF_STMT (op);
4344   gcc_assert (stmt);
4345
4346   if (gimple_plf (stmt, NECESSARY)
4347       || gimple_nop_p (stmt))
4348     return NULL;
4349
4350   gimple_set_plf (stmt, NECESSARY, true);
4351   return stmt;
4352 }
4353
4354 /* Because we don't follow exactly the standard PRE algorithm, and decide not
4355    to insert PHI nodes sometimes, and because value numbering of casts isn't
4356    perfect, we sometimes end up inserting dead code.   This simple DCE-like
4357    pass removes any insertions we made that weren't actually used.  */
4358
4359 static void
4360 remove_dead_inserted_code (void)
4361 {
4362   VEC(gimple,heap) *worklist = NULL;
4363   int i;
4364   gimple t;
4365
4366   worklist = VEC_alloc (gimple, heap, VEC_length (gimple, inserted_exprs));
4367   for (i = 0; VEC_iterate (gimple, inserted_exprs, i, t); i++)
4368     {
4369       if (gimple_plf (t, NECESSARY))
4370         VEC_quick_push (gimple, worklist, t);
4371     }
4372   while (VEC_length (gimple, worklist) > 0)
4373     {
4374       t = VEC_pop (gimple, worklist);
4375
4376       /* PHI nodes are somewhat special in that each PHI alternative has
4377          data and control dependencies.  All the statements feeding the
4378          PHI node's arguments are always necessary. */
4379       if (gimple_code (t) == GIMPLE_PHI)
4380         {
4381           unsigned k;
4382
4383           VEC_reserve (gimple, heap, worklist, gimple_phi_num_args (t));
4384           for (k = 0; k < gimple_phi_num_args (t); k++)
4385             {
4386               tree arg = PHI_ARG_DEF (t, k);
4387               if (TREE_CODE (arg) == SSA_NAME)
4388                 {
4389                   gimple n = mark_operand_necessary (arg);
4390                   if (n)
4391                     VEC_quick_push (gimple, worklist, n);
4392                 }
4393             }
4394         }
4395       else
4396         {
4397           /* Propagate through the operands.  Examine all the USE, VUSE and
4398              VDEF operands in this statement.  Mark all the statements
4399              which feed this statement's uses as necessary.  */
4400           ssa_op_iter iter;
4401           tree use;
4402
4403           /* The operands of VDEF expressions are also needed as they
4404              represent potential definitions that may reach this
4405              statement (VDEF operands allow us to follow def-def
4406              links).  */
4407
4408           FOR_EACH_SSA_TREE_OPERAND (use, t, iter, SSA_OP_ALL_USES)
4409             {
4410               gimple n = mark_operand_necessary (use);
4411               if (n)
4412                 VEC_safe_push (gimple, heap, worklist, n);
4413             }
4414         }
4415     }
4416
4417   for (i = 0; VEC_iterate (gimple, inserted_exprs, i, t); i++)
4418     {
4419       if (!gimple_plf (t, NECESSARY))
4420         {
4421           gimple_stmt_iterator gsi;
4422
4423           if (dump_file && (dump_flags & TDF_DETAILS))
4424             {
4425               fprintf (dump_file, "Removing unnecessary insertion:");
4426               print_gimple_stmt (dump_file, t, 0, 0);
4427             }
4428
4429           gsi = gsi_for_stmt (t);
4430           if (gimple_code (t) == GIMPLE_PHI)
4431             remove_phi_node (&gsi, true);
4432           else
4433             {
4434               gsi_remove (&gsi, true);
4435               release_defs (t);
4436             }
4437         }
4438     }
4439   VEC_free (gimple, heap, worklist);
4440 }
4441
4442 /* Initialize data structures used by PRE.  */
4443
4444 static void
4445 init_pre (bool do_fre)
4446 {
4447   basic_block bb;
4448
4449   next_expression_id = 1;
4450   expressions = NULL;
4451   VEC_safe_push (pre_expr, heap, expressions, NULL);
4452   value_expressions = VEC_alloc (bitmap_set_t, heap, get_max_value_id () + 1);
4453   VEC_safe_grow_cleared (bitmap_set_t, heap, value_expressions,
4454                          get_max_value_id() + 1);
4455
4456   in_fre = do_fre;
4457
4458   inserted_exprs = NULL;
4459   need_creation = NULL;
4460   pretemp = NULL_TREE;
4461   storetemp = NULL_TREE;
4462   prephitemp = NULL_TREE;
4463
4464   connect_infinite_loops_to_exit ();
4465   memset (&pre_stats, 0, sizeof (pre_stats));
4466
4467
4468   postorder = XNEWVEC (int, n_basic_blocks - NUM_FIXED_BLOCKS);
4469   post_order_compute (postorder, false, false);
4470
4471   FOR_ALL_BB (bb)
4472     bb->aux = XCNEWVEC (struct bb_bitmap_sets, 1);
4473
4474   calculate_dominance_info (CDI_POST_DOMINATORS);
4475   calculate_dominance_info (CDI_DOMINATORS);
4476
4477   bitmap_obstack_initialize (&grand_bitmap_obstack);
4478   inserted_phi_names = BITMAP_ALLOC (&grand_bitmap_obstack);
4479   phi_translate_table = htab_create (5110, expr_pred_trans_hash,
4480                                      expr_pred_trans_eq, free);
4481   expression_to_id = htab_create (num_ssa_names * 3,
4482                                   pre_expr_hash,
4483                                   pre_expr_eq, NULL);
4484   bitmap_set_pool = create_alloc_pool ("Bitmap sets",
4485                                        sizeof (struct bitmap_set), 30);
4486   pre_expr_pool = create_alloc_pool ("pre_expr nodes",
4487                                      sizeof (struct pre_expr_d), 30);
4488   FOR_ALL_BB (bb)
4489     {
4490       EXP_GEN (bb) = bitmap_set_new ();
4491       PHI_GEN (bb) = bitmap_set_new ();
4492       TMP_GEN (bb) = bitmap_set_new ();
4493       AVAIL_OUT (bb) = bitmap_set_new ();
4494     }
4495
4496   need_eh_cleanup = BITMAP_ALLOC (NULL);
4497 }
4498
4499
4500 /* Deallocate data structures used by PRE.  */
4501
4502 static void
4503 fini_pre (bool do_fre)
4504 {
4505   basic_block bb;
4506
4507   free (postorder);
4508   VEC_free (bitmap_set_t, heap, value_expressions);
4509   VEC_free (gimple, heap, inserted_exprs);
4510   VEC_free (gimple, heap, need_creation);
4511   bitmap_obstack_release (&grand_bitmap_obstack);
4512   free_alloc_pool (bitmap_set_pool);
4513   free_alloc_pool (pre_expr_pool);
4514   htab_delete (phi_translate_table);
4515   htab_delete (expression_to_id);
4516
4517   FOR_ALL_BB (bb)
4518     {
4519       free (bb->aux);
4520       bb->aux = NULL;
4521     }
4522
4523   free_dominance_info (CDI_POST_DOMINATORS);
4524
4525   if (!bitmap_empty_p (need_eh_cleanup))
4526     {
4527       gimple_purge_all_dead_eh_edges (need_eh_cleanup);
4528       cleanup_tree_cfg ();
4529     }
4530
4531   BITMAP_FREE (need_eh_cleanup);
4532
4533   if (!do_fre)
4534     loop_optimizer_finalize ();
4535 }
4536
4537 /* Main entry point to the SSA-PRE pass.  DO_FRE is true if the caller
4538    only wants to do full redundancy elimination.  */
4539
4540 static unsigned int
4541 execute_pre (bool do_fre)
4542 {
4543   unsigned int todo = 0;
4544
4545   do_partial_partial = optimize > 2 && optimize_function_for_speed_p (cfun);
4546
4547   /* This has to happen before SCCVN runs because
4548      loop_optimizer_init may create new phis, etc.  */
4549   if (!do_fre)
4550     loop_optimizer_init (LOOPS_NORMAL);
4551
4552   if (!run_scc_vn (do_fre))
4553     {
4554       if (!do_fre)
4555         {
4556           remove_dead_inserted_code ();
4557           loop_optimizer_finalize ();
4558         }
4559
4560       return 0;
4561     }
4562   init_pre (do_fre);
4563   scev_initialize ();
4564
4565
4566   /* Collect and value number expressions computed in each basic block.  */
4567   compute_avail ();
4568
4569   if (dump_file && (dump_flags & TDF_DETAILS))
4570     {
4571       basic_block bb;
4572
4573       FOR_ALL_BB (bb)
4574         {
4575           print_bitmap_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
4576           print_bitmap_set (dump_file, PHI_GEN (bb), "phi_gen", bb->index);
4577           print_bitmap_set (dump_file, TMP_GEN (bb), "tmp_gen", bb->index);
4578           print_bitmap_set (dump_file, AVAIL_OUT (bb), "avail_out", bb->index);
4579         }
4580     }
4581
4582   /* Insert can get quite slow on an incredibly large number of basic
4583      blocks due to some quadratic behavior.  Until this behavior is
4584      fixed, don't run it when he have an incredibly large number of
4585      bb's.  If we aren't going to run insert, there is no point in
4586      computing ANTIC, either, even though it's plenty fast.  */
4587   if (!do_fre && n_basic_blocks < 4000)
4588     {
4589       compute_antic ();
4590       insert ();
4591     }
4592
4593   /* Remove all the redundant expressions.  */
4594   todo |= eliminate ();
4595
4596   statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
4597   statistics_counter_event (cfun, "PA inserted", pre_stats.pa_insert);
4598   statistics_counter_event (cfun, "New PHIs", pre_stats.phis);
4599   statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
4600   statistics_counter_event (cfun, "Constified", pre_stats.constified);
4601
4602   /* Make sure to remove fake edges before committing our inserts.
4603      This makes sure we don't end up with extra critical edges that
4604      we would need to split.  */
4605   remove_fake_exit_edges ();
4606   gsi_commit_edge_inserts ();
4607
4608   clear_expression_ids ();
4609   free_scc_vn ();
4610   if (!do_fre)
4611     remove_dead_inserted_code ();
4612
4613   scev_finalize ();
4614   fini_pre (do_fre);
4615
4616   return todo;
4617 }
4618
4619 /* Gate and execute functions for PRE.  */
4620
4621 static unsigned int
4622 do_pre (void)
4623 {
4624   return execute_pre (false);
4625 }
4626
4627 static bool
4628 gate_pre (void)
4629 {
4630   return flag_tree_pre != 0;
4631 }
4632
4633 struct gimple_opt_pass pass_pre =
4634 {
4635  {
4636   GIMPLE_PASS,
4637   "pre",                                /* name */
4638   gate_pre,                             /* gate */
4639   do_pre,                               /* execute */
4640   NULL,                                 /* sub */
4641   NULL,                                 /* next */
4642   0,                                    /* static_pass_number */
4643   TV_TREE_PRE,                          /* tv_id */
4644   PROP_no_crit_edges | PROP_cfg
4645     | PROP_ssa,                         /* properties_required */
4646   0,                                    /* properties_provided */
4647   0,                                    /* properties_destroyed */
4648   TODO_rebuild_alias,                   /* todo_flags_start */
4649   TODO_update_ssa_only_virtuals | TODO_dump_func | TODO_ggc_collect
4650   | TODO_verify_ssa /* todo_flags_finish */
4651  }
4652 };
4653
4654
4655 /* Gate and execute functions for FRE.  */
4656
4657 static unsigned int
4658 execute_fre (void)
4659 {
4660   return execute_pre (true);
4661 }
4662
4663 static bool
4664 gate_fre (void)
4665 {
4666   return flag_tree_fre != 0;
4667 }
4668
4669 struct gimple_opt_pass pass_fre =
4670 {
4671  {
4672   GIMPLE_PASS,
4673   "fre",                                /* name */
4674   gate_fre,                             /* gate */
4675   execute_fre,                          /* execute */
4676   NULL,                                 /* sub */
4677   NULL,                                 /* next */
4678   0,                                    /* static_pass_number */
4679   TV_TREE_FRE,                          /* tv_id */
4680   PROP_cfg | PROP_ssa,                  /* properties_required */
4681   0,                                    /* properties_provided */
4682   0,                                    /* properties_destroyed */
4683   0,                                    /* todo_flags_start */
4684   TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
4685  }
4686 };