OSDN Git Service

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