OSDN Git Service

contrib/
[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 (!useless_type_conversion_p (type, TREE_TYPE (constant)))
3023             {
3024               tree builtexpr = fold_convert (type, constant);
3025               if (!is_gimple_min_invariant (builtexpr)) 
3026                 {
3027                   tree forcedexpr = force_gimple_operand (builtexpr,
3028                                                           &stmts, true,
3029                                                           NULL);
3030                   if (!is_gimple_min_invariant (forcedexpr))
3031                     {
3032                       if (forcedexpr != builtexpr)
3033                         {
3034                           VN_INFO_GET (forcedexpr)->valnum = PRE_EXPR_CONSTANT (eprime);
3035                           VN_INFO (forcedexpr)->value_id = get_expr_value_id (eprime);
3036                         }
3037                       if (stmts)
3038                         {
3039                           gimple_stmt_iterator gsi;
3040                           gsi = gsi_start (stmts);
3041                           for (; !gsi_end_p (gsi); gsi_next (&gsi))
3042                             {
3043                               gimple stmt = gsi_stmt (gsi);
3044                               VEC_safe_push (gimple, heap, inserted_exprs, stmt);
3045                               gimple_set_plf (stmt, NECESSARY, false);
3046                             }
3047                           gsi_insert_seq_on_edge (pred, stmts);
3048                         }
3049                       avail[bprime->index] = get_or_alloc_expr_for_name (forcedexpr);
3050                     }
3051                 }
3052             }
3053         }
3054       else if (eprime->kind == NAME)
3055         {
3056           /* We may have to do a conversion because our value
3057              numbering can look through types in certain cases, but
3058              our IL requires all operands of a phi node have the same
3059              type.  */
3060           tree name = PRE_EXPR_NAME (eprime);
3061           if (!useless_type_conversion_p (type, TREE_TYPE (name)))
3062             {
3063               tree builtexpr;
3064               tree forcedexpr;
3065               builtexpr = fold_convert (type, name);
3066               forcedexpr = force_gimple_operand (builtexpr,
3067                                                  &stmts, true,
3068                                                  NULL);
3069
3070               if (forcedexpr != name)
3071                 {
3072                   VN_INFO_GET (forcedexpr)->valnum = VN_INFO (name)->valnum;
3073                   VN_INFO (forcedexpr)->value_id = VN_INFO (name)->value_id;
3074                 }
3075
3076               if (stmts)
3077                 {
3078                   gimple_stmt_iterator gsi;
3079                   gsi = gsi_start (stmts);
3080                   for (; !gsi_end_p (gsi); gsi_next (&gsi))
3081                     {
3082                       gimple stmt = gsi_stmt (gsi);
3083                       VEC_safe_push (gimple, heap, inserted_exprs, stmt);
3084                       gimple_set_plf (stmt, NECESSARY, false);
3085                     }
3086                   gsi_insert_seq_on_edge (pred, stmts);
3087                 }
3088               avail[bprime->index] = get_or_alloc_expr_for_name (forcedexpr);
3089             }
3090         }
3091     }
3092   /* If we didn't want a phi node, and we made insertions, we still have
3093      inserted new stuff, and thus return true.  If we didn't want a phi node,
3094      and didn't make insertions, we haven't added anything new, so return
3095      false.  */
3096   if (nophi && insertions)
3097     return true;
3098   else if (nophi && !insertions)
3099     return false;
3100
3101   /* Now build a phi for the new variable.  */
3102   if (!prephitemp || TREE_TYPE (prephitemp) != type)
3103     {
3104       prephitemp = create_tmp_var (type, "prephitmp");
3105       get_var_ann (prephitemp);
3106     }
3107
3108   temp = prephitemp;
3109   add_referenced_var (temp);
3110
3111   if (TREE_CODE (type) == COMPLEX_TYPE
3112       || TREE_CODE (type) == VECTOR_TYPE)
3113     DECL_GIMPLE_REG_P (temp) = 1;
3114
3115   phi = create_phi_node (temp, block);
3116   FOR_EACH_EDGE (pred, ei, block->preds)
3117     {
3118       pre_expr ae = avail[pred->src->index];
3119       gcc_assert (get_expr_type (ae) == type
3120                   || useless_type_conversion_p (type, get_expr_type (ae)));
3121       if (ae->kind == CONSTANT)
3122         add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred);
3123       else
3124         add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred);
3125     }
3126   /* If the PHI node is already available, use it.  */
3127   if ((res = vn_phi_lookup (phi)) != NULL_TREE)
3128     {
3129       gimple_stmt_iterator gsi = gsi_for_stmt (phi);
3130       remove_phi_node (&gsi, true);
3131       release_defs (phi);
3132       add_to_value (val, get_or_alloc_expr_for_name (res));
3133       return false;
3134     }
3135
3136   gimple_set_plf (phi, NECESSARY, false);
3137   VN_INFO_GET (gimple_phi_result (phi))->valnum = gimple_phi_result (phi);
3138   VN_INFO (gimple_phi_result (phi))->value_id = val;
3139   VEC_safe_push (gimple, heap, inserted_exprs, phi);
3140
3141   newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
3142   add_to_value (val, newphi);
3143
3144   /* The value should *not* exist in PHI_GEN, or else we wouldn't be doing
3145      this insertion, since we test for the existence of this value in PHI_GEN
3146      before proceeding with the partial redundancy checks in insert_aux.
3147
3148      The value may exist in AVAIL_OUT, in particular, it could be represented
3149      by the expression we are trying to eliminate, in which case we want the
3150      replacement to occur.  If it's not existing in AVAIL_OUT, we want it
3151      inserted there.
3152
3153      Similarly, to the PHI_GEN case, the value should not exist in NEW_SETS of
3154      this block, because if it did, it would have existed in our dominator's
3155      AVAIL_OUT, and would have been skipped due to the full redundancy check.
3156   */
3157
3158   bitmap_insert_into_set (PHI_GEN (block), newphi);
3159   bitmap_value_replace_in_set (AVAIL_OUT (block),
3160                                newphi);
3161   bitmap_insert_into_set (NEW_SETS (block),
3162                           newphi);
3163
3164   if (dump_file && (dump_flags & TDF_DETAILS))
3165     {
3166       fprintf (dump_file, "Created phi ");
3167       print_gimple_stmt (dump_file, phi, 0, 0);
3168       fprintf (dump_file, " in block %d\n", block->index);
3169     }
3170   pre_stats.phis++;
3171   return true;
3172 }
3173
3174
3175
3176 /* Perform insertion of partially redundant values.
3177    For BLOCK, do the following:
3178    1.  Propagate the NEW_SETS of the dominator into the current block.
3179    If the block has multiple predecessors,
3180        2a. Iterate over the ANTIC expressions for the block to see if
3181            any of them are partially redundant.
3182        2b. If so, insert them into the necessary predecessors to make
3183            the expression fully redundant.
3184        2c. Insert a new PHI merging the values of the predecessors.
3185        2d. Insert the new PHI, and the new expressions, into the
3186            NEW_SETS set.
3187    3. Recursively call ourselves on the dominator children of BLOCK.
3188
3189    Steps 1, 2a, and 3 are done by insert_aux. 2b, 2c and 2d are done by
3190    do_regular_insertion and do_partial_insertion.
3191
3192 */
3193
3194 static bool
3195 do_regular_insertion (basic_block block, basic_block dom)
3196 {
3197   bool new_stuff = false;
3198   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (ANTIC_IN (block));
3199   pre_expr expr;
3200   int i;
3201
3202   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
3203     {
3204       if (expr->kind != NAME)
3205         {
3206           pre_expr *avail;
3207           unsigned int val;
3208           bool by_some = false;
3209           bool cant_insert = false;
3210           bool all_same = true;
3211           pre_expr first_s = NULL;
3212           edge pred;
3213           basic_block bprime;
3214           pre_expr eprime = NULL;
3215           edge_iterator ei;
3216           pre_expr edoubleprime;
3217
3218           val = get_expr_value_id (expr);
3219           if (bitmap_set_contains_value (PHI_GEN (block), val))
3220             continue;
3221           if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3222             {
3223               if (dump_file && (dump_flags & TDF_DETAILS))
3224                 fprintf (dump_file, "Found fully redundant value\n");
3225               continue;
3226             }
3227
3228           avail = XCNEWVEC (pre_expr, last_basic_block);
3229           FOR_EACH_EDGE (pred, ei, block->preds)
3230             {
3231               unsigned int vprime;
3232
3233               /* We should never run insertion for the exit block
3234                  and so not come across fake pred edges.  */
3235               gcc_assert (!(pred->flags & EDGE_FAKE));
3236               bprime = pred->src;
3237               eprime = phi_translate (expr, ANTIC_IN (block), NULL,
3238                                       bprime, block);
3239
3240               /* eprime will generally only be NULL if the
3241                  value of the expression, translated
3242                  through the PHI for this predecessor, is
3243                  undefined.  If that is the case, we can't
3244                  make the expression fully redundant,
3245                  because its value is undefined along a
3246                  predecessor path.  We can thus break out
3247                  early because it doesn't matter what the
3248                  rest of the results are.  */
3249               if (eprime == NULL)
3250                 {
3251                   cant_insert = true;
3252                   break;
3253                 }
3254
3255               eprime = fully_constant_expression (eprime);
3256               vprime = get_expr_value_id (eprime);
3257               edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
3258                                                  vprime, NULL);
3259               if (edoubleprime == NULL)
3260                 {
3261                   avail[bprime->index] = eprime;
3262                   all_same = false;
3263                 }
3264               else
3265                 {
3266                   avail[bprime->index] = edoubleprime;
3267                   by_some = true;
3268                   if (first_s == NULL)
3269                     first_s = edoubleprime;
3270                   else if (!pre_expr_eq (first_s, edoubleprime))
3271                     all_same = false;
3272                 }
3273             }
3274           /* If we can insert it, it's not the same value
3275              already existing along every predecessor, and
3276              it's defined by some predecessor, it is
3277              partially redundant.  */
3278           if (!cant_insert && !all_same && by_some && dbg_cnt (treepre_insert))
3279             {
3280               if (insert_into_preds_of_block (block, get_expression_id (expr),
3281                                               avail))
3282                 new_stuff = true;
3283             }
3284           /* If all edges produce the same value and that value is
3285              an invariant, then the PHI has the same value on all
3286              edges.  Note this.  */
3287           else if (!cant_insert && all_same && eprime
3288                    && (edoubleprime->kind == CONSTANT
3289                        || edoubleprime->kind == NAME)
3290                    && !value_id_constant_p (val))
3291             {
3292               unsigned int j;
3293               bitmap_iterator bi;
3294               bitmap_set_t exprset = VEC_index (bitmap_set_t,
3295                                                 value_expressions, val);
3296
3297               unsigned int new_val = get_expr_value_id (edoubleprime);
3298               FOR_EACH_EXPR_ID_IN_SET (exprset, j, bi)
3299                 {
3300                   pre_expr expr = expression_for_id (j);
3301
3302                   if (expr->kind == NAME)
3303                     {
3304                       vn_ssa_aux_t info = VN_INFO (PRE_EXPR_NAME (expr));
3305                       /* Just reset the value id and valnum so it is
3306                          the same as the constant we have discovered.  */
3307                       if (edoubleprime->kind == CONSTANT)
3308                         {
3309                           info->valnum = PRE_EXPR_CONSTANT (edoubleprime);
3310                           pre_stats.constified++;
3311                         }
3312                       else
3313                         info->valnum = PRE_EXPR_NAME (edoubleprime);
3314                       info->value_id = new_val;
3315                     }
3316                 }
3317             }
3318           free (avail);
3319         }
3320     }
3321
3322   VEC_free (pre_expr, heap, exprs);
3323   return new_stuff;
3324 }
3325
3326
3327 /* Perform insertion for partially anticipatable expressions.  There
3328    is only one case we will perform insertion for these.  This case is
3329    if the expression is partially anticipatable, and fully available.
3330    In this case, we know that putting it earlier will enable us to
3331    remove the later computation.  */
3332
3333
3334 static bool
3335 do_partial_partial_insertion (basic_block block, basic_block dom)
3336 {
3337   bool new_stuff = false;
3338   VEC (pre_expr, heap) *exprs = sorted_array_from_bitmap_set (PA_IN (block));
3339   pre_expr expr;
3340   int i;
3341
3342   for (i = 0; VEC_iterate (pre_expr, exprs, i, expr); i++)
3343     {
3344       if (expr->kind != NAME)
3345         {
3346           pre_expr *avail;
3347           unsigned int val;
3348           bool by_all = true;
3349           bool cant_insert = false;
3350           edge pred;
3351           basic_block bprime;
3352           pre_expr eprime = NULL;
3353           edge_iterator ei;
3354
3355           val = get_expr_value_id (expr);
3356           if (bitmap_set_contains_value (PHI_GEN (block), val))
3357             continue;
3358           if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
3359             continue;
3360
3361           avail = XCNEWVEC (pre_expr, last_basic_block);
3362           FOR_EACH_EDGE (pred, ei, block->preds)
3363             {
3364               unsigned int vprime;
3365               pre_expr edoubleprime;
3366
3367               /* We should never run insertion for the exit block
3368                  and so not come across fake pred edges.  */
3369               gcc_assert (!(pred->flags & EDGE_FAKE));
3370               bprime = pred->src;
3371               eprime = phi_translate (expr, ANTIC_IN (block),
3372                                       PA_IN (block),
3373                                       bprime, block);
3374
3375               /* eprime will generally only be NULL if the
3376                  value of the expression, translated
3377                  through the PHI for this predecessor, is
3378                  undefined.  If that is the case, we can't
3379                  make the expression fully redundant,
3380                  because its value is undefined along a
3381                  predecessor path.  We can thus break out
3382                  early because it doesn't matter what the
3383                  rest of the results are.  */
3384               if (eprime == NULL)
3385                 {
3386                   cant_insert = true;
3387                   break;
3388                 }
3389
3390               eprime = fully_constant_expression (eprime);
3391               vprime = get_expr_value_id (eprime);
3392               edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
3393                                                  vprime, NULL);
3394               if (edoubleprime == NULL)
3395                 {
3396                   by_all = false;
3397                   break;
3398                 }
3399               else
3400                 avail[bprime->index] = edoubleprime;
3401
3402             }
3403
3404           /* If we can insert it, it's not the same value
3405              already existing along every predecessor, and
3406              it's defined by some predecessor, it is
3407              partially redundant.  */
3408           if (!cant_insert && by_all && dbg_cnt (treepre_insert))
3409             {
3410               pre_stats.pa_insert++;
3411               if (insert_into_preds_of_block (block, get_expression_id (expr),
3412                                               avail))
3413                 new_stuff = true;
3414             }
3415           free (avail);
3416         }
3417     }
3418
3419   VEC_free (pre_expr, heap, exprs);
3420   return new_stuff;
3421 }
3422
3423 static bool
3424 insert_aux (basic_block block)
3425 {
3426   basic_block son;
3427   bool new_stuff = false;
3428
3429   if (block)
3430     {
3431       basic_block dom;
3432       dom = get_immediate_dominator (CDI_DOMINATORS, block);
3433       if (dom)
3434         {
3435           unsigned i;
3436           bitmap_iterator bi;
3437           bitmap_set_t newset = NEW_SETS (dom);
3438           if (newset)
3439             {
3440               /* Note that we need to value_replace both NEW_SETS, and
3441                  AVAIL_OUT. For both the case of NEW_SETS, the value may be
3442                  represented by some non-simple expression here that we want
3443                  to replace it with.  */
3444               FOR_EACH_EXPR_ID_IN_SET (newset, i, bi)
3445                 {
3446                   pre_expr expr = expression_for_id (i);
3447                   bitmap_value_replace_in_set (NEW_SETS (block), expr);
3448                   bitmap_value_replace_in_set (AVAIL_OUT (block), expr);
3449                 }
3450             }
3451           if (!single_pred_p (block))
3452             {
3453               new_stuff |= do_regular_insertion (block, dom);
3454               if (do_partial_partial)
3455                 new_stuff |= do_partial_partial_insertion (block, dom);
3456             }
3457         }
3458     }
3459   for (son = first_dom_son (CDI_DOMINATORS, block);
3460        son;
3461        son = next_dom_son (CDI_DOMINATORS, son))
3462     {
3463       new_stuff |= insert_aux (son);
3464     }
3465
3466   return new_stuff;
3467 }
3468
3469 /* Perform insertion of partially redundant values.  */
3470
3471 static void
3472 insert (void)
3473 {
3474   bool new_stuff = true;
3475   basic_block bb;
3476   int num_iterations = 0;
3477
3478   FOR_ALL_BB (bb)
3479     NEW_SETS (bb) = bitmap_set_new ();
3480
3481   while (new_stuff)
3482     {
3483       num_iterations++;
3484       new_stuff = insert_aux (ENTRY_BLOCK_PTR);
3485     }
3486   statistics_histogram_event (cfun, "insert iterations", num_iterations);
3487 }
3488
3489
3490 /* Add OP to EXP_GEN (block), and possibly to the maximal set if it is
3491    not defined by a phi node.
3492    PHI nodes can't go in the maximal sets because they are not in
3493    TMP_GEN, so it is possible to get into non-monotonic situations
3494    during ANTIC calculation, because it will *add* bits.  */
3495
3496 static void
3497 add_to_exp_gen (basic_block block, tree op)
3498 {
3499   if (!in_fre)
3500     {
3501       pre_expr result;
3502       if (TREE_CODE (op) == SSA_NAME && ssa_undefined_value_p (op))
3503         return;
3504       result = get_or_alloc_expr_for_name (op);
3505       bitmap_value_insert_into_set (EXP_GEN (block), result);
3506       if (TREE_CODE (op) != SSA_NAME
3507           || gimple_code (SSA_NAME_DEF_STMT (op)) != GIMPLE_PHI)
3508         bitmap_value_insert_into_set (maximal_set, result);
3509     }
3510 }
3511
3512 /* Create value ids for PHI in BLOCK.  */
3513
3514 static void
3515 make_values_for_phi (gimple phi, basic_block block)
3516 {
3517   tree result = gimple_phi_result (phi);
3518
3519   /* We have no need for virtual phis, as they don't represent
3520      actual computations.  */
3521   if (is_gimple_reg (result))
3522     {
3523       pre_expr e = get_or_alloc_expr_for_name (result);
3524       add_to_value (get_expr_value_id (e), e);
3525       bitmap_insert_into_set (PHI_GEN (block), e);
3526       bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3527     }
3528 }
3529
3530 /* Compute the AVAIL set for all basic blocks.
3531
3532    This function performs value numbering of the statements in each basic
3533    block.  The AVAIL sets are built from information we glean while doing
3534    this value numbering, since the AVAIL sets contain only one entry per
3535    value.
3536
3537    AVAIL_IN[BLOCK] = AVAIL_OUT[dom(BLOCK)].
3538    AVAIL_OUT[BLOCK] = AVAIL_IN[BLOCK] U PHI_GEN[BLOCK] U TMP_GEN[BLOCK].  */
3539
3540 static void
3541 compute_avail (void)
3542 {
3543
3544   basic_block block, son;
3545   basic_block *worklist;
3546   size_t sp = 0;
3547   tree param;
3548
3549   /* For arguments with default definitions, we pretend they are
3550      defined in the entry block.  */
3551   for (param = DECL_ARGUMENTS (current_function_decl);
3552        param;
3553        param = TREE_CHAIN (param))
3554     {
3555       if (gimple_default_def (cfun, param) != NULL)
3556         {
3557           tree def = gimple_default_def (cfun, param);
3558           pre_expr e = get_or_alloc_expr_for_name (def);
3559
3560           add_to_value (get_expr_value_id (e), e);
3561           if (!in_fre)
3562             {
3563               bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
3564               bitmap_value_insert_into_set (maximal_set, e);
3565             }
3566           bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
3567         }
3568     }
3569
3570   /* Likewise for the static chain decl. */
3571   if (cfun->static_chain_decl)
3572     {
3573       param = cfun->static_chain_decl;
3574       if (gimple_default_def (cfun, param) != NULL)
3575         {
3576           tree def = gimple_default_def (cfun, param);
3577           pre_expr e = get_or_alloc_expr_for_name (def);
3578
3579           add_to_value (get_expr_value_id (e), e);
3580           if (!in_fre)
3581             {
3582               bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
3583               bitmap_value_insert_into_set (maximal_set, e);
3584             }
3585           bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
3586         }
3587     }
3588
3589   /* Allocate the worklist.  */
3590   worklist = XNEWVEC (basic_block, n_basic_blocks);
3591
3592   /* Seed the algorithm by putting the dominator children of the entry
3593      block on the worklist.  */
3594   for (son = first_dom_son (CDI_DOMINATORS, ENTRY_BLOCK_PTR);
3595        son;
3596        son = next_dom_son (CDI_DOMINATORS, son))
3597     worklist[sp++] = son;
3598
3599   /* Loop until the worklist is empty.  */
3600   while (sp)
3601     {
3602       gimple_stmt_iterator gsi;
3603       gimple stmt;
3604       basic_block dom;
3605       unsigned int stmt_uid = 1;
3606
3607       /* Pick a block from the worklist.  */
3608       block = worklist[--sp];
3609
3610       /* Initially, the set of available values in BLOCK is that of
3611          its immediate dominator.  */
3612       dom = get_immediate_dominator (CDI_DOMINATORS, block);
3613       if (dom)
3614         bitmap_set_copy (AVAIL_OUT (block), AVAIL_OUT (dom));
3615
3616       /* Generate values for PHI nodes.  */
3617       for (gsi = gsi_start_phis (block); !gsi_end_p (gsi); gsi_next (&gsi))
3618         make_values_for_phi (gsi_stmt (gsi), block);
3619
3620       /* Now compute value numbers and populate value sets with all
3621          the expressions computed in BLOCK.  */
3622       for (gsi = gsi_start_bb (block); !gsi_end_p (gsi); gsi_next (&gsi))
3623         {
3624           ssa_op_iter iter;
3625           tree op;
3626
3627           stmt = gsi_stmt (gsi);
3628           gimple_set_uid (stmt, stmt_uid++);
3629
3630           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
3631             {
3632               pre_expr e = get_or_alloc_expr_for_name (op);
3633
3634               add_to_value (get_expr_value_id (e), e);
3635               if (!in_fre)
3636                 {
3637                   bitmap_insert_into_set (TMP_GEN (block), e);
3638                   bitmap_value_insert_into_set (maximal_set, e);
3639                 }
3640               bitmap_value_insert_into_set (AVAIL_OUT (block), e);
3641             }
3642
3643           if (gimple_has_volatile_ops (stmt)
3644               || stmt_could_throw_p (stmt))
3645             continue;
3646
3647           switch (gimple_code (stmt))
3648             {
3649             case GIMPLE_RETURN:
3650               FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3651                 add_to_exp_gen (block, op);
3652               continue;
3653
3654             case GIMPLE_CALL:
3655               {
3656                 vn_reference_t ref;
3657                 unsigned int i;
3658                 vn_reference_op_t vro;
3659                 pre_expr result = NULL;
3660                 VEC(vn_reference_op_s, heap) *ops = NULL;
3661
3662                 if (!can_value_number_call (stmt))
3663                   continue;
3664
3665                 copy_reference_ops_from_call (stmt, &ops);
3666                 vn_reference_lookup_pieces (shared_vuses_from_stmt (stmt),
3667                                             ops, &ref, false);
3668                 VEC_free (vn_reference_op_s, heap, ops);
3669                 if (!ref)
3670                   continue;
3671
3672                 for (i = 0; VEC_iterate (vn_reference_op_s,
3673                                          ref->operands, i,
3674                                          vro); i++)
3675                   {
3676                     if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
3677                       add_to_exp_gen (block, vro->op0);
3678                     if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
3679                       add_to_exp_gen (block, vro->op1);
3680                     if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
3681                       add_to_exp_gen (block, vro->op2);
3682                   }
3683                 result = (pre_expr) pool_alloc (pre_expr_pool);
3684                 result->kind = REFERENCE;
3685                 result->id = 0;
3686                 PRE_EXPR_REFERENCE (result) = ref;
3687
3688                 get_or_alloc_expression_id (result);
3689                 add_to_value (get_expr_value_id (result), result);
3690                 if (!in_fre)
3691                   {
3692                     bitmap_value_insert_into_set (EXP_GEN (block),
3693                                                   result);
3694                     bitmap_value_insert_into_set (maximal_set, result);
3695                   }
3696                 continue;
3697               }
3698
3699             case GIMPLE_ASSIGN:
3700               {
3701                 pre_expr result = NULL;
3702                 switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
3703                   {
3704                   case tcc_unary:
3705                     if (is_exception_related (stmt))
3706                       continue;
3707                   case tcc_binary:
3708                     {
3709                       vn_nary_op_t nary;
3710                       unsigned int i;
3711
3712                       vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1,
3713                                                 gimple_assign_rhs_code (stmt),
3714                                                 gimple_expr_type (stmt),
3715                                                 gimple_assign_rhs1 (stmt),
3716                                                 gimple_assign_rhs2 (stmt),
3717                                                 NULL_TREE, NULL_TREE, &nary);
3718
3719                       if (!nary)
3720                         continue;
3721
3722                       for (i = 0; i < nary->length; i++)
3723                         if (TREE_CODE (nary->op[i]) == SSA_NAME)
3724                           add_to_exp_gen (block, nary->op[i]);
3725
3726                       result = (pre_expr) pool_alloc (pre_expr_pool);
3727                       result->kind = NARY;
3728                       result->id = 0;
3729                       PRE_EXPR_NARY (result) = nary;
3730                       break;
3731                     }
3732
3733                   case tcc_declaration:
3734                   case tcc_reference:
3735                     {
3736                       vn_reference_t ref;
3737                       unsigned int i;
3738                       vn_reference_op_t vro;
3739
3740                       vn_reference_lookup (gimple_assign_rhs1 (stmt),
3741                                            shared_vuses_from_stmt (stmt),
3742                                            false, &ref);
3743                       if (!ref)
3744                         continue;
3745
3746                       for (i = 0; VEC_iterate (vn_reference_op_s,
3747                                                ref->operands, i,
3748                                                vro); i++)
3749                         {
3750                           if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
3751                             add_to_exp_gen (block, vro->op0);
3752                           if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
3753                             add_to_exp_gen (block, vro->op1);
3754                           if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
3755                             add_to_exp_gen (block, vro->op2);
3756                         }
3757                       result = (pre_expr) pool_alloc (pre_expr_pool);
3758                       result->kind = REFERENCE;
3759                       result->id = 0;
3760                       PRE_EXPR_REFERENCE (result) = ref;
3761                       break;
3762                     }
3763
3764                   default:
3765                     /* For any other statement that we don't
3766                        recognize, simply add all referenced
3767                        SSA_NAMEs to EXP_GEN.  */
3768                     FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3769                       add_to_exp_gen (block, op);
3770                     continue;
3771                   }
3772
3773                 get_or_alloc_expression_id (result);
3774                 add_to_value (get_expr_value_id (result), result);
3775                 if (!in_fre)
3776                   {
3777                     bitmap_value_insert_into_set (EXP_GEN (block), result);
3778                     bitmap_value_insert_into_set (maximal_set, result);
3779                   }
3780
3781                 continue;
3782               }
3783             default:
3784               break;
3785             }
3786         }
3787
3788       /* Put the dominator children of BLOCK on the worklist of blocks
3789          to compute available sets for.  */
3790       for (son = first_dom_son (CDI_DOMINATORS, block);
3791            son;
3792            son = next_dom_son (CDI_DOMINATORS, son))
3793         worklist[sp++] = son;
3794     }
3795
3796   free (worklist);
3797 }
3798
3799 /* Insert the expression for SSA_VN that SCCVN thought would be simpler
3800    than the available expressions for it.  The insertion point is
3801    right before the first use in STMT.  Returns the SSA_NAME that should
3802    be used for replacement.  */
3803
3804 static tree
3805 do_SCCVN_insertion (gimple stmt, tree ssa_vn)
3806 {
3807   basic_block bb = gimple_bb (stmt);
3808   gimple_stmt_iterator gsi;
3809   gimple_seq stmts = NULL;
3810   tree expr;
3811   pre_expr e;
3812
3813   /* First create a value expression from the expression we want
3814      to insert and associate it with the value handle for SSA_VN.  */
3815   e = get_or_alloc_expr_for (vn_get_expr_for (ssa_vn));
3816   if (e == NULL)
3817     return NULL_TREE;
3818
3819   /* Then use create_expression_by_pieces to generate a valid
3820      expression to insert at this point of the IL stream.  */
3821   expr = create_expression_by_pieces (bb, e, &stmts, stmt, NULL);
3822   if (expr == NULL_TREE)
3823     return NULL_TREE;
3824   gsi = gsi_for_stmt (stmt);
3825   gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
3826
3827   return expr;
3828 }
3829
3830 /* Eliminate fully redundant computations.  */
3831
3832 static unsigned int
3833 eliminate (void)
3834 {
3835   basic_block b;
3836   unsigned int todo = 0;
3837
3838   FOR_EACH_BB (b)
3839     {
3840       gimple_stmt_iterator i;
3841
3842       for (i = gsi_start_bb (b); !gsi_end_p (i); gsi_next (&i))
3843         {
3844           gimple stmt = gsi_stmt (i);
3845
3846           /* Lookup the RHS of the expression, see if we have an
3847              available computation for it.  If so, replace the RHS with
3848              the available computation.  */
3849           if (gimple_has_lhs (stmt)
3850               && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME
3851               && !gimple_assign_ssa_name_copy_p (stmt)
3852               && (!gimple_assign_single_p (stmt)
3853                   || !is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
3854               && !gimple_has_volatile_ops  (stmt)
3855               && !has_zero_uses (gimple_get_lhs (stmt)))
3856             {
3857               tree lhs = gimple_get_lhs (stmt);
3858               tree rhs = NULL_TREE;
3859               tree sprime = NULL;
3860               pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
3861               pre_expr sprimeexpr;
3862
3863               if (gimple_assign_single_p (stmt))
3864                 rhs = gimple_assign_rhs1 (stmt);
3865
3866               sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
3867                                                get_expr_value_id (lhsexpr),
3868                                                NULL);
3869
3870               if (sprimeexpr)
3871                 {
3872                   if (sprimeexpr->kind == CONSTANT)
3873                     sprime = PRE_EXPR_CONSTANT (sprimeexpr);
3874                   else if (sprimeexpr->kind == NAME)
3875                     sprime = PRE_EXPR_NAME (sprimeexpr);
3876                   else
3877                     gcc_unreachable ();
3878                 }
3879
3880               /* If there is no existing leader but SCCVN knows this
3881                  value is constant, use that constant.  */
3882               if (!sprime && is_gimple_min_invariant (VN_INFO (lhs)->valnum))
3883                 {
3884                   sprime = fold_convert (TREE_TYPE (lhs),
3885                                          VN_INFO (lhs)->valnum);
3886
3887                   if (dump_file && (dump_flags & TDF_DETAILS))
3888                     {
3889                       fprintf (dump_file, "Replaced ");
3890                       print_gimple_expr (dump_file, stmt, 0, 0);
3891                       fprintf (dump_file, " with ");
3892                       print_generic_expr (dump_file, sprime, 0);
3893                       fprintf (dump_file, " in ");
3894                       print_gimple_stmt (dump_file, stmt, 0, 0);
3895                     }
3896                   pre_stats.eliminations++;
3897                   propagate_tree_value_into_stmt (&i, sprime);
3898                   stmt = gsi_stmt (i);
3899                   update_stmt (stmt);
3900                   continue;
3901                 }
3902
3903               /* If there is no existing usable leader but SCCVN thinks
3904                  it has an expression it wants to use as replacement,
3905                  insert that.  */
3906               if (!sprime || sprime == lhs)
3907                 {
3908                   tree val = VN_INFO (lhs)->valnum;
3909                   if (val != VN_TOP
3910                       && TREE_CODE (val) == SSA_NAME
3911                       && VN_INFO (val)->needs_insertion
3912                       && can_PRE_operation (vn_get_expr_for (val)))
3913                     sprime = do_SCCVN_insertion (stmt, val);
3914                 }
3915               if (sprime
3916                   && sprime != lhs
3917                   && (rhs == NULL_TREE
3918                       || TREE_CODE (rhs) != SSA_NAME
3919                       || may_propagate_copy (rhs, sprime)))
3920                 {
3921                   gcc_assert (sprime != rhs);
3922
3923                   if (dump_file && (dump_flags & TDF_DETAILS))
3924                     {
3925                       fprintf (dump_file, "Replaced ");
3926                       print_gimple_expr (dump_file, stmt, 0, 0);
3927                       fprintf (dump_file, " with ");
3928                       print_generic_expr (dump_file, sprime, 0);
3929                       fprintf (dump_file, " in ");
3930                       print_gimple_stmt (dump_file, stmt, 0, 0);
3931                     }
3932
3933                   if (TREE_CODE (sprime) == SSA_NAME)
3934                     gimple_set_plf (SSA_NAME_DEF_STMT (sprime),
3935                                     NECESSARY, true);
3936                   /* We need to make sure the new and old types actually match,
3937                      which may require adding a simple cast, which fold_convert
3938                      will do for us.  */
3939                   if ((!rhs || TREE_CODE (rhs) != SSA_NAME)
3940                       && !useless_type_conversion_p (gimple_expr_type (stmt),
3941                                                      TREE_TYPE (sprime)))
3942                     sprime = fold_convert (gimple_expr_type (stmt), sprime);
3943
3944                   pre_stats.eliminations++;
3945                   propagate_tree_value_into_stmt (&i, sprime);
3946                   stmt = gsi_stmt (i);
3947                   update_stmt (stmt);
3948
3949                   /* If we removed EH side effects from the statement, clean
3950                      its EH information.  */
3951                   if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
3952                     {
3953                       bitmap_set_bit (need_eh_cleanup,
3954                                       gimple_bb (stmt)->index);
3955                       if (dump_file && (dump_flags & TDF_DETAILS))
3956                         fprintf (dump_file, "  Removed EH side effects.\n");
3957                     }
3958                 }
3959             }
3960           /* Visit COND_EXPRs and fold the comparison with the
3961              available value-numbers.  */
3962           else if (gimple_code (stmt) == GIMPLE_COND)
3963             {
3964               tree op0 = gimple_cond_lhs (stmt);
3965               tree op1 = gimple_cond_rhs (stmt);
3966               tree result;
3967
3968               if (TREE_CODE (op0) == SSA_NAME)
3969                 op0 = VN_INFO (op0)->valnum;
3970               if (TREE_CODE (op1) == SSA_NAME)
3971                 op1 = VN_INFO (op1)->valnum;
3972               result = fold_binary (gimple_cond_code (stmt), boolean_type_node,
3973                                     op0, op1);
3974               if (result && TREE_CODE (result) == INTEGER_CST)
3975                 {
3976                   if (integer_zerop (result))
3977                     gimple_cond_make_false (stmt);
3978                   else
3979                     gimple_cond_make_true (stmt);
3980                   update_stmt (stmt);
3981                   todo = TODO_cleanup_cfg;
3982                 }
3983             }
3984         }
3985     }
3986
3987   return todo;
3988 }
3989
3990 /* Borrow a bit of tree-ssa-dce.c for the moment.
3991    XXX: In 4.1, we should be able to just run a DCE pass after PRE, though
3992    this may be a bit faster, and we may want critical edges kept split.  */
3993
3994 /* If OP's defining statement has not already been determined to be necessary,
3995    mark that statement necessary. Return the stmt, if it is newly
3996    necessary.  */
3997
3998 static inline gimple
3999 mark_operand_necessary (tree op)
4000 {
4001   gimple stmt;
4002
4003   gcc_assert (op);
4004
4005   if (TREE_CODE (op) != SSA_NAME)
4006     return NULL;
4007
4008   stmt = SSA_NAME_DEF_STMT (op);
4009   gcc_assert (stmt);
4010
4011   if (gimple_plf (stmt, NECESSARY)
4012       || gimple_nop_p (stmt))
4013     return NULL;
4014
4015   gimple_set_plf (stmt, NECESSARY, true);
4016   return stmt;
4017 }
4018
4019 /* Because we don't follow exactly the standard PRE algorithm, and decide not
4020    to insert PHI nodes sometimes, and because value numbering of casts isn't
4021    perfect, we sometimes end up inserting dead code.   This simple DCE-like
4022    pass removes any insertions we made that weren't actually used.  */
4023
4024 static void
4025 remove_dead_inserted_code (void)
4026 {
4027   VEC(gimple,heap) *worklist = NULL;
4028   int i;
4029   gimple t;
4030
4031   worklist = VEC_alloc (gimple, heap, VEC_length (gimple, inserted_exprs));
4032   for (i = 0; VEC_iterate (gimple, inserted_exprs, i, t); i++)
4033     {
4034       if (gimple_plf (t, NECESSARY))
4035         VEC_quick_push (gimple, worklist, t);
4036     }
4037   while (VEC_length (gimple, worklist) > 0)
4038     {
4039       t = VEC_pop (gimple, worklist);
4040
4041       /* PHI nodes are somewhat special in that each PHI alternative has
4042          data and control dependencies.  All the statements feeding the
4043          PHI node's arguments are always necessary. */
4044       if (gimple_code (t) == GIMPLE_PHI)
4045         {
4046           unsigned k;
4047
4048           VEC_reserve (gimple, heap, worklist, gimple_phi_num_args (t));
4049           for (k = 0; k < gimple_phi_num_args (t); k++)
4050             {
4051               tree arg = PHI_ARG_DEF (t, k);
4052               if (TREE_CODE (arg) == SSA_NAME)
4053                 {
4054                   gimple n = mark_operand_necessary (arg);
4055                   if (n)
4056                     VEC_quick_push (gimple, worklist, n);
4057                 }
4058             }
4059         }
4060       else
4061         {
4062           /* Propagate through the operands.  Examine all the USE, VUSE and
4063              VDEF operands in this statement.  Mark all the statements
4064              which feed this statement's uses as necessary.  */
4065           ssa_op_iter iter;
4066           tree use;
4067
4068           /* The operands of VDEF expressions are also needed as they
4069              represent potential definitions that may reach this
4070              statement (VDEF operands allow us to follow def-def
4071              links).  */
4072
4073           FOR_EACH_SSA_TREE_OPERAND (use, t, iter, SSA_OP_ALL_USES)
4074             {
4075               gimple n = mark_operand_necessary (use);
4076               if (n)
4077                 VEC_safe_push (gimple, heap, worklist, n);
4078             }
4079         }
4080     }
4081
4082   for (i = 0; VEC_iterate (gimple, inserted_exprs, i, t); i++)
4083     {
4084       if (!gimple_plf (t, NECESSARY))
4085         {
4086           gimple_stmt_iterator gsi;
4087
4088           if (dump_file && (dump_flags & TDF_DETAILS))
4089             {
4090               fprintf (dump_file, "Removing unnecessary insertion:");
4091               print_gimple_stmt (dump_file, t, 0, 0);
4092             }
4093
4094           gsi = gsi_for_stmt (t);
4095           if (gimple_code (t) == GIMPLE_PHI)
4096             remove_phi_node (&gsi, true);
4097           else
4098             gsi_remove (&gsi, true);
4099           release_defs (t);
4100         }
4101     }
4102   VEC_free (gimple, heap, worklist);
4103 }
4104
4105 /* Initialize data structures used by PRE.  */
4106
4107 static void
4108 init_pre (bool do_fre)
4109 {
4110   basic_block bb;
4111
4112   next_expression_id = 1;
4113   expressions = NULL;
4114   VEC_safe_push (pre_expr, heap, expressions, NULL);
4115   value_expressions = VEC_alloc (bitmap_set_t, heap, get_max_value_id () + 1);
4116   VEC_safe_grow_cleared (bitmap_set_t, heap, value_expressions,
4117                          get_max_value_id() + 1);
4118
4119   in_fre = do_fre;
4120
4121   inserted_exprs = NULL;
4122   need_creation = NULL;
4123   pretemp = NULL_TREE;
4124   storetemp = NULL_TREE;
4125   prephitemp = NULL_TREE;
4126
4127   connect_infinite_loops_to_exit ();
4128   memset (&pre_stats, 0, sizeof (pre_stats));
4129
4130
4131   postorder = XNEWVEC (int, n_basic_blocks - NUM_FIXED_BLOCKS);
4132   post_order_compute (postorder, false, false);
4133
4134   FOR_ALL_BB (bb)
4135     bb->aux = XCNEWVEC (struct bb_bitmap_sets, 1);
4136
4137   calculate_dominance_info (CDI_POST_DOMINATORS);
4138   calculate_dominance_info (CDI_DOMINATORS);
4139
4140   bitmap_obstack_initialize (&grand_bitmap_obstack);
4141   phi_translate_table = htab_create (5110, expr_pred_trans_hash,
4142                                      expr_pred_trans_eq, free);
4143   expression_to_id = htab_create (num_ssa_names * 3,
4144                                   pre_expr_hash,
4145                                   pre_expr_eq, NULL);
4146   seen_during_translate = BITMAP_ALLOC (&grand_bitmap_obstack);
4147   bitmap_set_pool = create_alloc_pool ("Bitmap sets",
4148                                        sizeof (struct bitmap_set), 30);
4149   pre_expr_pool = create_alloc_pool ("pre_expr nodes",
4150                                      sizeof (struct pre_expr_d), 30);
4151   FOR_ALL_BB (bb)
4152     {
4153       EXP_GEN (bb) = bitmap_set_new ();
4154       PHI_GEN (bb) = bitmap_set_new ();
4155       TMP_GEN (bb) = bitmap_set_new ();
4156       AVAIL_OUT (bb) = bitmap_set_new ();
4157     }
4158   maximal_set = in_fre ? NULL : bitmap_set_new ();
4159
4160   need_eh_cleanup = BITMAP_ALLOC (NULL);
4161 }
4162
4163
4164 /* Deallocate data structures used by PRE.  */
4165
4166 static void
4167 fini_pre (bool do_fre)
4168 {
4169   basic_block bb;
4170
4171   free (postorder);
4172   VEC_free (bitmap_set_t, heap, value_expressions);
4173   VEC_free (gimple, heap, inserted_exprs);
4174   VEC_free (gimple, heap, need_creation);
4175   bitmap_obstack_release (&grand_bitmap_obstack);
4176   free_alloc_pool (bitmap_set_pool);
4177   free_alloc_pool (pre_expr_pool);
4178   htab_delete (phi_translate_table);
4179   htab_delete (expression_to_id);
4180
4181   FOR_ALL_BB (bb)
4182     {
4183       free (bb->aux);
4184       bb->aux = NULL;
4185     }
4186
4187   free_dominance_info (CDI_POST_DOMINATORS);
4188
4189   if (!bitmap_empty_p (need_eh_cleanup))
4190     {
4191       gimple_purge_all_dead_eh_edges (need_eh_cleanup);
4192       cleanup_tree_cfg ();
4193     }
4194
4195   BITMAP_FREE (need_eh_cleanup);
4196
4197   if (!do_fre)
4198     loop_optimizer_finalize ();
4199 }
4200
4201 /* Main entry point to the SSA-PRE pass.  DO_FRE is true if the caller
4202    only wants to do full redundancy elimination.  */
4203
4204 static unsigned int
4205 execute_pre (bool do_fre ATTRIBUTE_UNUSED)
4206 {
4207   unsigned int todo = 0;
4208
4209   do_partial_partial = optimize > 2;
4210
4211   /* This has to happen before SCCVN runs because
4212      loop_optimizer_init may create new phis, etc.  */
4213   if (!do_fre)
4214     loop_optimizer_init (LOOPS_NORMAL);
4215
4216   if (!run_scc_vn (do_fre))
4217     {
4218       if (!do_fre)
4219         {
4220           remove_dead_inserted_code ();
4221           loop_optimizer_finalize ();
4222         }
4223       
4224       return 0;
4225     }
4226   init_pre (do_fre);
4227
4228
4229   /* Collect and value number expressions computed in each basic block.  */
4230   compute_avail ();
4231
4232   if (dump_file && (dump_flags & TDF_DETAILS))
4233     {
4234       basic_block bb;
4235
4236       FOR_ALL_BB (bb)
4237         {
4238           print_bitmap_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
4239           print_bitmap_set (dump_file, TMP_GEN (bb), "tmp_gen",
4240                                   bb->index);
4241           print_bitmap_set (dump_file, AVAIL_OUT (bb), "avail_out",
4242                                   bb->index);
4243         }
4244     }
4245
4246   /* Insert can get quite slow on an incredibly large number of basic
4247      blocks due to some quadratic behavior.  Until this behavior is
4248      fixed, don't run it when he have an incredibly large number of
4249      bb's.  If we aren't going to run insert, there is no point in
4250      computing ANTIC, either, even though it's plenty fast.  */
4251   if (!do_fre && n_basic_blocks < 4000)
4252     {
4253       compute_antic ();
4254       insert ();
4255     }
4256
4257   /* Remove all the redundant expressions.  */
4258   todo |= eliminate ();
4259
4260   statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
4261   statistics_counter_event (cfun, "PA inserted", pre_stats.pa_insert);
4262   statistics_counter_event (cfun, "New PHIs", pre_stats.phis);
4263   statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
4264   statistics_counter_event (cfun, "Constified", pre_stats.constified);
4265
4266   /* Make sure to remove fake edges before committing our inserts.
4267      This makes sure we don't end up with extra critical edges that
4268      we would need to split.  */
4269   remove_fake_exit_edges ();
4270   gsi_commit_edge_inserts ();
4271
4272   clear_expression_ids ();
4273   free_scc_vn ();
4274   if (!do_fre)
4275     remove_dead_inserted_code ();
4276
4277   fini_pre (do_fre);
4278
4279   return todo;
4280 }
4281
4282 /* Gate and execute functions for PRE.  */
4283
4284 static unsigned int
4285 do_pre (void)
4286 {
4287   return TODO_rebuild_alias | execute_pre (false);
4288 }
4289
4290 static bool
4291 gate_pre (void)
4292 {
4293   /* PRE tends to generate bigger code.  */
4294   return flag_tree_pre != 0 && optimize_function_for_speed_p (cfun);
4295 }
4296
4297 struct gimple_opt_pass pass_pre =
4298 {
4299  {
4300   GIMPLE_PASS,
4301   "pre",                                /* name */
4302   gate_pre,                             /* gate */
4303   do_pre,                               /* execute */
4304   NULL,                                 /* sub */
4305   NULL,                                 /* next */
4306   0,                                    /* static_pass_number */
4307   TV_TREE_PRE,                          /* tv_id */
4308   PROP_no_crit_edges | PROP_cfg
4309     | PROP_ssa | PROP_alias,            /* properties_required */
4310   0,                                    /* properties_provided */
4311   0,                                    /* properties_destroyed */
4312   0,                                    /* todo_flags_start */
4313   TODO_update_ssa_only_virtuals | TODO_dump_func | TODO_ggc_collect
4314   | TODO_verify_ssa /* todo_flags_finish */
4315  }
4316 };
4317
4318
4319 /* Gate and execute functions for FRE.  */
4320
4321 static unsigned int
4322 execute_fre (void)
4323 {
4324   return execute_pre (true);
4325 }
4326
4327 static bool
4328 gate_fre (void)
4329 {
4330   return flag_tree_fre != 0;
4331 }
4332
4333 struct gimple_opt_pass pass_fre =
4334 {
4335  {
4336   GIMPLE_PASS,
4337   "fre",                                /* name */
4338   gate_fre,                             /* gate */
4339   execute_fre,                          /* execute */
4340   NULL,                                 /* sub */
4341   NULL,                                 /* next */
4342   0,                                    /* static_pass_number */
4343   TV_TREE_FRE,                          /* tv_id */
4344   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
4345   0,                                    /* properties_provided */
4346   0,                                    /* properties_destroyed */
4347   0,                                    /* todo_flags_start */
4348   TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
4349  }
4350 };