OSDN Git Service

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