OSDN Git Service

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