OSDN Git Service

2010-07-05 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-ccp.c
1 /* Conditional constant propagation pass for the GNU compiler.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010 Free Software Foundation, Inc.
4    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
5    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any
12 later version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 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 /* Conditional constant propagation (CCP) is based on the SSA
24    propagation engine (tree-ssa-propagate.c).  Constant assignments of
25    the form VAR = CST are propagated from the assignments into uses of
26    VAR, which in turn may generate new constants.  The simulation uses
27    a four level lattice to keep track of constant values associated
28    with SSA names.  Given an SSA name V_i, it may take one of the
29    following values:
30
31         UNINITIALIZED   ->  the initial state of the value.  This value
32                             is replaced with a correct initial value
33                             the first time the value is used, so the
34                             rest of the pass does not need to care about
35                             it.  Using this value simplifies initialization
36                             of the pass, and prevents us from needlessly
37                             scanning statements that are never reached.
38
39         UNDEFINED       ->  V_i is a local variable whose definition
40                             has not been processed yet.  Therefore we
41                             don't yet know if its value is a constant
42                             or not.
43
44         CONSTANT        ->  V_i has been found to hold a constant
45                             value C.
46
47         VARYING         ->  V_i cannot take a constant value, or if it
48                             does, it is not possible to determine it
49                             at compile time.
50
51    The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
52
53    1- In ccp_visit_stmt, we are interested in assignments whose RHS
54       evaluates into a constant and conditional jumps whose predicate
55       evaluates into a boolean true or false.  When an assignment of
56       the form V_i = CONST is found, V_i's lattice value is set to
57       CONSTANT and CONST is associated with it.  This causes the
58       propagation engine to add all the SSA edges coming out the
59       assignment into the worklists, so that statements that use V_i
60       can be visited.
61
62       If the statement is a conditional with a constant predicate, we
63       mark the outgoing edges as executable or not executable
64       depending on the predicate's value.  This is then used when
65       visiting PHI nodes to know when a PHI argument can be ignored.
66
67
68    2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
69       same constant C, then the LHS of the PHI is set to C.  This
70       evaluation is known as the "meet operation".  Since one of the
71       goals of this evaluation is to optimistically return constant
72       values as often as possible, it uses two main short cuts:
73
74       - If an argument is flowing in through a non-executable edge, it
75         is ignored.  This is useful in cases like this:
76
77                         if (PRED)
78                           a_9 = 3;
79                         else
80                           a_10 = 100;
81                         a_11 = PHI (a_9, a_10)
82
83         If PRED is known to always evaluate to false, then we can
84         assume that a_11 will always take its value from a_10, meaning
85         that instead of consider it VARYING (a_9 and a_10 have
86         different values), we can consider it CONSTANT 100.
87
88       - If an argument has an UNDEFINED value, then it does not affect
89         the outcome of the meet operation.  If a variable V_i has an
90         UNDEFINED value, it means that either its defining statement
91         hasn't been visited yet or V_i has no defining statement, in
92         which case the original symbol 'V' is being used
93         uninitialized.  Since 'V' is a local variable, the compiler
94         may assume any initial value for it.
95
96
97    After propagation, every variable V_i that ends up with a lattice
98    value of CONSTANT will have the associated constant value in the
99    array CONST_VAL[i].VALUE.  That is fed into substitute_and_fold for
100    final substitution and folding.
101
102
103    Constant propagation in stores and loads (STORE-CCP)
104    ----------------------------------------------------
105
106    While CCP has all the logic to propagate constants in GIMPLE
107    registers, it is missing the ability to associate constants with
108    stores and loads (i.e., pointer dereferences, structures and
109    global/aliased variables).  We don't keep loads and stores in
110    SSA, but we do build a factored use-def web for them (in the
111    virtual operands).
112
113    For instance, consider the following code fragment:
114
115           struct A a;
116           const int B = 42;
117
118           void foo (int i)
119           {
120             if (i > 10)
121               a.a = 42;
122             else
123               {
124                 a.b = 21;
125                 a.a = a.b + 21;
126               }
127
128             if (a.a != B)
129               never_executed ();
130           }
131
132    We should be able to deduce that the predicate 'a.a != B' is always
133    false.  To achieve this, we associate constant values to the SSA
134    names in the VDEF operands for each store.  Additionally,
135    since we also glob partial loads/stores with the base symbol, we
136    also keep track of the memory reference where the constant value
137    was stored (in the MEM_REF field of PROP_VALUE_T).  For instance,
138
139         # a_5 = VDEF <a_4>
140         a.a = 2;
141
142         # VUSE <a_5>
143         x_3 = a.b;
144
145    In the example above, CCP will associate value '2' with 'a_5', but
146    it would be wrong to replace the load from 'a.b' with '2', because
147    '2' had been stored into a.a.
148
149    Note that the initial value of virtual operands is VARYING, not
150    UNDEFINED.  Consider, for instance global variables:
151
152         int A;
153
154         foo (int i)
155         {
156           if (i_3 > 10)
157             A_4 = 3;
158           # A_5 = PHI (A_4, A_2);
159
160           # VUSE <A_5>
161           A.0_6 = A;
162
163           return A.0_6;
164         }
165
166    The value of A_2 cannot be assumed to be UNDEFINED, as it may have
167    been defined outside of foo.  If we were to assume it UNDEFINED, we
168    would erroneously optimize the above into 'return 3;'.
169
170    Though STORE-CCP is not too expensive, it does have to do more work
171    than regular CCP, so it is only enabled at -O2.  Both regular CCP
172    and STORE-CCP use the exact same algorithm.  The only distinction
173    is that when doing STORE-CCP, the boolean variable DO_STORE_CCP is
174    set to true.  This affects the evaluation of statements and PHI
175    nodes.
176
177    References:
178
179      Constant propagation with conditional branches,
180      Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
181
182      Building an Optimizing Compiler,
183      Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
184
185      Advanced Compiler Design and Implementation,
186      Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6  */
187
188 #include "config.h"
189 #include "system.h"
190 #include "coretypes.h"
191 #include "tm.h"
192 #include "tree.h"
193 #include "flags.h"
194 #include "tm_p.h"
195 #include "basic-block.h"
196 #include "output.h"
197 #include "function.h"
198 #include "tree-pretty-print.h"
199 #include "gimple-pretty-print.h"
200 #include "timevar.h"
201 #include "tree-dump.h"
202 #include "tree-flow.h"
203 #include "tree-pass.h"
204 #include "tree-ssa-propagate.h"
205 #include "value-prof.h"
206 #include "langhooks.h"
207 #include "target.h"
208 #include "toplev.h"
209 #include "dbgcnt.h"
210
211
212 /* Possible lattice values.  */
213 typedef enum
214 {
215   UNINITIALIZED,
216   UNDEFINED,
217   CONSTANT,
218   VARYING
219 } ccp_lattice_t;
220
221 /* Array of propagated constant values.  After propagation,
222    CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I).  If
223    the constant is held in an SSA name representing a memory store
224    (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
225    memory reference used to store (i.e., the LHS of the assignment
226    doing the store).  */
227 static prop_value_t *const_val;
228
229 static void canonicalize_float_value (prop_value_t *);
230 static bool ccp_fold_stmt (gimple_stmt_iterator *);
231
232 /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX.  */
233
234 static void
235 dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
236 {
237   switch (val.lattice_val)
238     {
239     case UNINITIALIZED:
240       fprintf (outf, "%sUNINITIALIZED", prefix);
241       break;
242     case UNDEFINED:
243       fprintf (outf, "%sUNDEFINED", prefix);
244       break;
245     case VARYING:
246       fprintf (outf, "%sVARYING", prefix);
247       break;
248     case CONSTANT:
249       fprintf (outf, "%sCONSTANT ", prefix);
250       print_generic_expr (outf, val.value, dump_flags);
251       break;
252     default:
253       gcc_unreachable ();
254     }
255 }
256
257
258 /* Print lattice value VAL to stderr.  */
259
260 void debug_lattice_value (prop_value_t val);
261
262 DEBUG_FUNCTION void
263 debug_lattice_value (prop_value_t val)
264 {
265   dump_lattice_value (stderr, "", val);
266   fprintf (stderr, "\n");
267 }
268
269
270 /* Compute a default value for variable VAR and store it in the
271    CONST_VAL array.  The following rules are used to get default
272    values:
273
274    1- Global and static variables that are declared constant are
275       considered CONSTANT.
276
277    2- Any other value is considered UNDEFINED.  This is useful when
278       considering PHI nodes.  PHI arguments that are undefined do not
279       change the constant value of the PHI node, which allows for more
280       constants to be propagated.
281
282    3- Variables defined by statements other than assignments and PHI
283       nodes are considered VARYING.
284
285    4- Initial values of variables that are not GIMPLE registers are
286       considered VARYING.  */
287
288 static prop_value_t
289 get_default_value (tree var)
290 {
291   tree sym = SSA_NAME_VAR (var);
292   prop_value_t val = { UNINITIALIZED, NULL_TREE };
293   gimple stmt;
294
295   stmt = SSA_NAME_DEF_STMT (var);
296
297   if (gimple_nop_p (stmt))
298     {
299       /* Variables defined by an empty statement are those used
300          before being initialized.  If VAR is a local variable, we
301          can assume initially that it is UNDEFINED, otherwise we must
302          consider it VARYING.  */
303       if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
304         val.lattice_val = UNDEFINED;
305       else
306         val.lattice_val = VARYING;
307     }
308   else if (is_gimple_assign (stmt)
309            /* Value-returning GIMPLE_CALL statements assign to
310               a variable, and are treated similarly to GIMPLE_ASSIGN.  */
311            || (is_gimple_call (stmt)
312                && gimple_call_lhs (stmt) != NULL_TREE)
313            || gimple_code (stmt) == GIMPLE_PHI)
314     {
315       tree cst;
316       if (gimple_assign_single_p (stmt)
317           && DECL_P (gimple_assign_rhs1 (stmt))
318           && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
319         {
320           val.lattice_val = CONSTANT;
321           val.value = cst;
322         }
323       else
324         /* Any other variable defined by an assignment or a PHI node
325            is considered UNDEFINED.  */
326         val.lattice_val = UNDEFINED;
327     }
328   else
329     {
330       /* Otherwise, VAR will never take on a constant value.  */
331       val.lattice_val = VARYING;
332     }
333
334   return val;
335 }
336
337
338 /* Get the constant value associated with variable VAR.  */
339
340 static inline prop_value_t *
341 get_value (tree var)
342 {
343   prop_value_t *val;
344
345   if (const_val == NULL)
346     return NULL;
347
348   val = &const_val[SSA_NAME_VERSION (var)];
349   if (val->lattice_val == UNINITIALIZED)
350     *val = get_default_value (var);
351
352   canonicalize_float_value (val);
353
354   return val;
355 }
356
357 /* Sets the value associated with VAR to VARYING.  */
358
359 static inline void
360 set_value_varying (tree var)
361 {
362   prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
363
364   val->lattice_val = VARYING;
365   val->value = NULL_TREE;
366 }
367
368 /* For float types, modify the value of VAL to make ccp work correctly
369    for non-standard values (-0, NaN):
370
371    If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
372    If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
373      This is to fix the following problem (see PR 29921): Suppose we have
374
375      x = 0.0 * y
376
377      and we set value of y to NaN.  This causes value of x to be set to NaN.
378      When we later determine that y is in fact VARYING, fold uses the fact
379      that HONOR_NANS is false, and we try to change the value of x to 0,
380      causing an ICE.  With HONOR_NANS being false, the real appearance of
381      NaN would cause undefined behavior, though, so claiming that y (and x)
382      are UNDEFINED initially is correct.  */
383
384 static void
385 canonicalize_float_value (prop_value_t *val)
386 {
387   enum machine_mode mode;
388   tree type;
389   REAL_VALUE_TYPE d;
390
391   if (val->lattice_val != CONSTANT
392       || TREE_CODE (val->value) != REAL_CST)
393     return;
394
395   d = TREE_REAL_CST (val->value);
396   type = TREE_TYPE (val->value);
397   mode = TYPE_MODE (type);
398
399   if (!HONOR_SIGNED_ZEROS (mode)
400       && REAL_VALUE_MINUS_ZERO (d))
401     {
402       val->value = build_real (type, dconst0);
403       return;
404     }
405
406   if (!HONOR_NANS (mode)
407       && REAL_VALUE_ISNAN (d))
408     {
409       val->lattice_val = UNDEFINED;
410       val->value = NULL;
411       return;
412     }
413 }
414
415 /* Set the value for variable VAR to NEW_VAL.  Return true if the new
416    value is different from VAR's previous value.  */
417
418 static bool
419 set_lattice_value (tree var, prop_value_t new_val)
420 {
421   prop_value_t *old_val = get_value (var);
422
423   canonicalize_float_value (&new_val);
424
425   /* Lattice transitions must always be monotonically increasing in
426      value.  If *OLD_VAL and NEW_VAL are the same, return false to
427      inform the caller that this was a non-transition.  */
428
429   gcc_assert (old_val->lattice_val < new_val.lattice_val
430               || (old_val->lattice_val == new_val.lattice_val
431                   && ((!old_val->value && !new_val.value)
432                       || operand_equal_p (old_val->value, new_val.value, 0))));
433
434   if (old_val->lattice_val != new_val.lattice_val)
435     {
436       if (dump_file && (dump_flags & TDF_DETAILS))
437         {
438           dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
439           fprintf (dump_file, ".  Adding SSA edges to worklist.\n");
440         }
441
442       *old_val = new_val;
443
444       gcc_assert (new_val.lattice_val != UNDEFINED);
445       return true;
446     }
447
448   return false;
449 }
450
451
452 /* Return the likely CCP lattice value for STMT.
453
454    If STMT has no operands, then return CONSTANT.
455
456    Else if undefinedness of operands of STMT cause its value to be
457    undefined, then return UNDEFINED.
458
459    Else if any operands of STMT are constants, then return CONSTANT.
460
461    Else return VARYING.  */
462
463 static ccp_lattice_t
464 likely_value (gimple stmt)
465 {
466   bool has_constant_operand, has_undefined_operand, all_undefined_operands;
467   tree use;
468   ssa_op_iter iter;
469   unsigned i;
470
471   enum gimple_code code = gimple_code (stmt);
472
473   /* This function appears to be called only for assignments, calls,
474      conditionals, and switches, due to the logic in visit_stmt.  */
475   gcc_assert (code == GIMPLE_ASSIGN
476               || code == GIMPLE_CALL
477               || code == GIMPLE_COND
478               || code == GIMPLE_SWITCH);
479
480   /* If the statement has volatile operands, it won't fold to a
481      constant value.  */
482   if (gimple_has_volatile_ops (stmt))
483     return VARYING;
484
485   /* Arrive here for more complex cases.  */
486   has_constant_operand = false;
487   has_undefined_operand = false;
488   all_undefined_operands = true;
489   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
490     {
491       prop_value_t *val = get_value (use);
492
493       if (val->lattice_val == UNDEFINED)
494         has_undefined_operand = true;
495       else
496         all_undefined_operands = false;
497
498       if (val->lattice_val == CONSTANT)
499         has_constant_operand = true;
500     }
501
502   /* There may be constants in regular rhs operands.  For calls we
503      have to ignore lhs, fndecl and static chain, otherwise only
504      the lhs.  */
505   for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
506        i < gimple_num_ops (stmt); ++i)
507     {
508       tree op = gimple_op (stmt, i);
509       if (!op || TREE_CODE (op) == SSA_NAME)
510         continue;
511       if (is_gimple_min_invariant (op))
512         has_constant_operand = true;
513     }
514
515   if (has_constant_operand)
516     all_undefined_operands = false;
517
518   /* If the operation combines operands like COMPLEX_EXPR make sure to
519      not mark the result UNDEFINED if only one part of the result is
520      undefined.  */
521   if (has_undefined_operand && all_undefined_operands)
522     return UNDEFINED;
523   else if (code == GIMPLE_ASSIGN && has_undefined_operand)
524     {
525       switch (gimple_assign_rhs_code (stmt))
526         {
527         /* Unary operators are handled with all_undefined_operands.  */
528         case PLUS_EXPR:
529         case MINUS_EXPR:
530         case POINTER_PLUS_EXPR:
531           /* Not MIN_EXPR, MAX_EXPR.  One VARYING operand may be selected.
532              Not bitwise operators, one VARYING operand may specify the
533              result completely.  Not logical operators for the same reason.
534              Not COMPLEX_EXPR as one VARYING operand makes the result partly
535              not UNDEFINED.  Not *DIV_EXPR, comparisons and shifts because
536              the undefined operand may be promoted.  */
537           return UNDEFINED;
538
539         default:
540           ;
541         }
542     }
543   /* If there was an UNDEFINED operand but the result may be not UNDEFINED
544      fall back to VARYING even if there were CONSTANT operands.  */
545   if (has_undefined_operand)
546     return VARYING;
547
548   /* We do not consider virtual operands here -- load from read-only
549      memory may have only VARYING virtual operands, but still be
550      constant.  */
551   if (has_constant_operand
552       || gimple_references_memory_p (stmt))
553     return CONSTANT;
554
555   return VARYING;
556 }
557
558 /* Returns true if STMT cannot be constant.  */
559
560 static bool
561 surely_varying_stmt_p (gimple stmt)
562 {
563   /* If the statement has operands that we cannot handle, it cannot be
564      constant.  */
565   if (gimple_has_volatile_ops (stmt))
566     return true;
567
568   /* If it is a call and does not return a value or is not a
569      builtin and not an indirect call, it is varying.  */
570   if (is_gimple_call (stmt))
571     {
572       tree fndecl;
573       if (!gimple_call_lhs (stmt)
574           || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
575               && !DECL_BUILT_IN (fndecl)))
576         return true;
577     }
578
579   /* Any other store operation is not interesting.  */
580   else if (gimple_vdef (stmt))
581     return true;
582
583   /* Anything other than assignments and conditional jumps are not
584      interesting for CCP.  */
585   if (gimple_code (stmt) != GIMPLE_ASSIGN
586       && gimple_code (stmt) != GIMPLE_COND
587       && gimple_code (stmt) != GIMPLE_SWITCH
588       && gimple_code (stmt) != GIMPLE_CALL)
589     return true;
590
591   return false;
592 }
593
594 /* Initialize local data structures for CCP.  */
595
596 static void
597 ccp_initialize (void)
598 {
599   basic_block bb;
600
601   const_val = XCNEWVEC (prop_value_t, num_ssa_names);
602
603   /* Initialize simulation flags for PHI nodes and statements.  */
604   FOR_EACH_BB (bb)
605     {
606       gimple_stmt_iterator i;
607
608       for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
609         {
610           gimple stmt = gsi_stmt (i);
611           bool is_varying;
612
613           /* If the statement is a control insn, then we do not
614              want to avoid simulating the statement once.  Failure
615              to do so means that those edges will never get added.  */
616           if (stmt_ends_bb_p (stmt))
617             is_varying = false;
618           else
619             is_varying = surely_varying_stmt_p (stmt);
620
621           if (is_varying)
622             {
623               tree def;
624               ssa_op_iter iter;
625
626               /* If the statement will not produce a constant, mark
627                  all its outputs VARYING.  */
628               FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
629                 set_value_varying (def);
630             }
631           prop_set_simulate_again (stmt, !is_varying);
632         }
633     }
634
635   /* Now process PHI nodes.  We never clear the simulate_again flag on
636      phi nodes, since we do not know which edges are executable yet,
637      except for phi nodes for virtual operands when we do not do store ccp.  */
638   FOR_EACH_BB (bb)
639     {
640       gimple_stmt_iterator i;
641
642       for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
643         {
644           gimple phi = gsi_stmt (i);
645
646           if (!is_gimple_reg (gimple_phi_result (phi)))
647             prop_set_simulate_again (phi, false);
648           else
649             prop_set_simulate_again (phi, true);
650         }
651     }
652 }
653
654 /* Debug count support. Reset the values of ssa names
655    VARYING when the total number ssa names analyzed is
656    beyond the debug count specified.  */
657
658 static void
659 do_dbg_cnt (void)
660 {
661   unsigned i;
662   for (i = 0; i < num_ssa_names; i++)
663     {
664       if (!dbg_cnt (ccp))
665         {
666           const_val[i].lattice_val = VARYING;
667           const_val[i].value = NULL_TREE;
668         }
669     }
670 }
671
672
673 /* Do final substitution of propagated values, cleanup the flowgraph and
674    free allocated storage.
675
676    Return TRUE when something was optimized.  */
677
678 static bool
679 ccp_finalize (void)
680 {
681   bool something_changed;
682
683   do_dbg_cnt ();
684   /* Perform substitutions based on the known constant values.  */
685   something_changed = substitute_and_fold (const_val, ccp_fold_stmt, true);
686
687   free (const_val);
688   const_val = NULL;
689   return something_changed;;
690 }
691
692
693 /* Compute the meet operator between *VAL1 and *VAL2.  Store the result
694    in VAL1.
695
696                 any  M UNDEFINED   = any
697                 any  M VARYING     = VARYING
698                 Ci   M Cj          = Ci         if (i == j)
699                 Ci   M Cj          = VARYING    if (i != j)
700    */
701
702 static void
703 ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
704 {
705   if (val1->lattice_val == UNDEFINED)
706     {
707       /* UNDEFINED M any = any   */
708       *val1 = *val2;
709     }
710   else if (val2->lattice_val == UNDEFINED)
711     {
712       /* any M UNDEFINED = any
713          Nothing to do.  VAL1 already contains the value we want.  */
714       ;
715     }
716   else if (val1->lattice_val == VARYING
717            || val2->lattice_val == VARYING)
718     {
719       /* any M VARYING = VARYING.  */
720       val1->lattice_val = VARYING;
721       val1->value = NULL_TREE;
722     }
723   else if (val1->lattice_val == CONSTANT
724            && val2->lattice_val == CONSTANT
725            && simple_cst_equal (val1->value, val2->value) == 1)
726     {
727       /* Ci M Cj = Ci           if (i == j)
728          Ci M Cj = VARYING      if (i != j)
729
730          If these two values come from memory stores, make sure that
731          they come from the same memory reference.  */
732       val1->lattice_val = CONSTANT;
733       val1->value = val1->value;
734     }
735   else
736     {
737       /* Any other combination is VARYING.  */
738       val1->lattice_val = VARYING;
739       val1->value = NULL_TREE;
740     }
741 }
742
743
744 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
745    lattice values to determine PHI_NODE's lattice value.  The value of a
746    PHI node is determined calling ccp_lattice_meet with all the arguments
747    of the PHI node that are incoming via executable edges.  */
748
749 static enum ssa_prop_result
750 ccp_visit_phi_node (gimple phi)
751 {
752   unsigned i;
753   prop_value_t *old_val, new_val;
754
755   if (dump_file && (dump_flags & TDF_DETAILS))
756     {
757       fprintf (dump_file, "\nVisiting PHI node: ");
758       print_gimple_stmt (dump_file, phi, 0, dump_flags);
759     }
760
761   old_val = get_value (gimple_phi_result (phi));
762   switch (old_val->lattice_val)
763     {
764     case VARYING:
765       return SSA_PROP_VARYING;
766
767     case CONSTANT:
768       new_val = *old_val;
769       break;
770
771     case UNDEFINED:
772       new_val.lattice_val = UNDEFINED;
773       new_val.value = NULL_TREE;
774       break;
775
776     default:
777       gcc_unreachable ();
778     }
779
780   for (i = 0; i < gimple_phi_num_args (phi); i++)
781     {
782       /* Compute the meet operator over all the PHI arguments flowing
783          through executable edges.  */
784       edge e = gimple_phi_arg_edge (phi, i);
785
786       if (dump_file && (dump_flags & TDF_DETAILS))
787         {
788           fprintf (dump_file,
789               "\n    Argument #%d (%d -> %d %sexecutable)\n",
790               i, e->src->index, e->dest->index,
791               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
792         }
793
794       /* If the incoming edge is executable, Compute the meet operator for
795          the existing value of the PHI node and the current PHI argument.  */
796       if (e->flags & EDGE_EXECUTABLE)
797         {
798           tree arg = gimple_phi_arg (phi, i)->def;
799           prop_value_t arg_val;
800
801           if (is_gimple_min_invariant (arg))
802             {
803               arg_val.lattice_val = CONSTANT;
804               arg_val.value = arg;
805             }
806           else
807             arg_val = *(get_value (arg));
808
809           ccp_lattice_meet (&new_val, &arg_val);
810
811           if (dump_file && (dump_flags & TDF_DETAILS))
812             {
813               fprintf (dump_file, "\t");
814               print_generic_expr (dump_file, arg, dump_flags);
815               dump_lattice_value (dump_file, "\tValue: ", arg_val);
816               fprintf (dump_file, "\n");
817             }
818
819           if (new_val.lattice_val == VARYING)
820             break;
821         }
822     }
823
824   if (dump_file && (dump_flags & TDF_DETAILS))
825     {
826       dump_lattice_value (dump_file, "\n    PHI node value: ", new_val);
827       fprintf (dump_file, "\n\n");
828     }
829
830   /* Make the transition to the new value.  */
831   if (set_lattice_value (gimple_phi_result (phi), new_val))
832     {
833       if (new_val.lattice_val == VARYING)
834         return SSA_PROP_VARYING;
835       else
836         return SSA_PROP_INTERESTING;
837     }
838   else
839     return SSA_PROP_NOT_INTERESTING;
840 }
841
842 /* Get operand number OPNR from the rhs of STMT.  Before returning it,
843    simplify it to a constant if possible.  */
844
845 static tree
846 get_rhs_assign_op_for_ccp (gimple stmt, int opnr)
847 {
848   tree op = gimple_op (stmt, opnr);
849   
850   if (TREE_CODE (op) == SSA_NAME)
851     {
852       prop_value_t *val = get_value (op);
853       if (val->lattice_val == CONSTANT)
854         op = get_value (op)->value;
855     }
856   return op;
857 }
858
859 /* CCP specific front-end to the non-destructive constant folding
860    routines.
861
862    Attempt to simplify the RHS of STMT knowing that one or more
863    operands are constants.
864
865    If simplification is possible, return the simplified RHS,
866    otherwise return the original RHS or NULL_TREE.  */
867
868 static tree
869 ccp_fold (gimple stmt)
870 {
871   location_t loc = gimple_location (stmt);
872   switch (gimple_code (stmt))
873     {
874     case GIMPLE_ASSIGN:
875       {
876         enum tree_code subcode = gimple_assign_rhs_code (stmt);
877
878         switch (get_gimple_rhs_class (subcode))
879           {
880           case GIMPLE_SINGLE_RHS:
881             {
882               tree rhs = gimple_assign_rhs1 (stmt);
883               enum tree_code_class kind = TREE_CODE_CLASS (subcode);
884
885               if (TREE_CODE (rhs) == SSA_NAME)
886                 {
887                   /* If the RHS is an SSA_NAME, return its known constant value,
888                      if any.  */
889                   return get_value (rhs)->value;
890                 }
891               /* Handle propagating invariant addresses into address operations.
892                  The folding we do here matches that in tree-ssa-forwprop.c.  */
893               else if (TREE_CODE (rhs) == ADDR_EXPR)
894                 {
895                   tree *base;
896                   base = &TREE_OPERAND (rhs, 0);
897                   while (handled_component_p (*base))
898                     base = &TREE_OPERAND (*base, 0);
899                   if (TREE_CODE (*base) == MEM_REF
900                       && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME)
901                     {
902                       prop_value_t *val = get_value (TREE_OPERAND (*base, 0));
903                       if (val->lattice_val == CONSTANT
904                           && TREE_CODE (val->value) == ADDR_EXPR)
905                         {
906                           tree ret, save = *base;
907                           tree new_base;
908                           new_base = fold_build2 (MEM_REF, TREE_TYPE (*base),
909                                                   unshare_expr (val->value),
910                                                   TREE_OPERAND (*base, 1));
911                           /* We need to return a new tree, not modify the IL
912                              or share parts of it.  So play some tricks to
913                              avoid manually building it.  */
914                           *base = new_base;
915                           ret = unshare_expr (rhs);
916                           recompute_tree_invariant_for_addr_expr (ret);
917                           *base = save;
918                           return ret;
919                         }
920                     }
921                 }
922               else if (TREE_CODE (rhs) == CONSTRUCTOR
923                        && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
924                        && (CONSTRUCTOR_NELTS (rhs)
925                            == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
926                 {
927                   unsigned i;
928                   tree val, list;
929
930                   list = NULL_TREE;
931                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
932                     {
933                       if (TREE_CODE (val) == SSA_NAME
934                           && get_value (val)->lattice_val == CONSTANT)
935                         val = get_value (val)->value;
936                       if (TREE_CODE (val) == INTEGER_CST
937                           || TREE_CODE (val) == REAL_CST
938                           || TREE_CODE (val) == FIXED_CST)
939                         list = tree_cons (NULL_TREE, val, list);
940                       else
941                         return NULL_TREE;
942                     }
943
944                   return build_vector (TREE_TYPE (rhs), nreverse (list));
945                 }
946
947               if (kind == tcc_reference)
948                 {
949                   if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
950                        || TREE_CODE (rhs) == REALPART_EXPR
951                        || TREE_CODE (rhs) == IMAGPART_EXPR)
952                       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
953                     {
954                       prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
955                       if (val->lattice_val == CONSTANT)
956                         return fold_unary_loc (EXPR_LOCATION (rhs),
957                                            TREE_CODE (rhs),
958                                            TREE_TYPE (rhs), val->value);
959                     }
960                   else if (TREE_CODE (rhs) == MEM_REF
961                            && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
962                     {
963                       prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
964                       if (val->lattice_val == CONSTANT
965                           && TREE_CODE (val->value) == ADDR_EXPR)
966                         {
967                           tree tem = fold_build2 (MEM_REF, TREE_TYPE (rhs),
968                                                   unshare_expr (val->value),
969                                                   TREE_OPERAND (rhs, 1));
970                           if (tem)
971                             rhs = tem;
972                         }
973                     }
974                   return fold_const_aggregate_ref (rhs);
975                 }
976               else if (kind == tcc_declaration)
977                 return get_symbol_constant_value (rhs);
978               return rhs;
979             }
980
981           case GIMPLE_UNARY_RHS:
982             {
983               /* Handle unary operators that can appear in GIMPLE form.
984                  Note that we know the single operand must be a constant,
985                  so this should almost always return a simplified RHS.  */
986               tree lhs = gimple_assign_lhs (stmt);
987               tree op0 = get_rhs_assign_op_for_ccp (stmt, 1);
988
989               /* Conversions are useless for CCP purposes if they are
990                  value-preserving.  Thus the restrictions that
991                  useless_type_conversion_p places for pointer type conversions
992                  do not apply here.  Substitution later will only substitute to
993                  allowed places.  */
994               if (CONVERT_EXPR_CODE_P (subcode)
995                   && POINTER_TYPE_P (TREE_TYPE (lhs))
996                   && POINTER_TYPE_P (TREE_TYPE (op0)))
997                 {
998                   tree tem;
999                   /* Try to re-construct array references on-the-fly.  */
1000                   if (!useless_type_conversion_p (TREE_TYPE (lhs),
1001                                                   TREE_TYPE (op0))
1002                       && ((tem = maybe_fold_offset_to_address
1003                            (loc,
1004                             op0, integer_zero_node, TREE_TYPE (lhs)))
1005                           != NULL_TREE))
1006                     return tem;
1007                   return op0;
1008                 }
1009
1010               return
1011                 fold_unary_ignore_overflow_loc (loc, subcode,
1012                                                 gimple_expr_type (stmt), op0);
1013             }
1014
1015           case GIMPLE_BINARY_RHS:
1016             {
1017               /* Handle binary operators that can appear in GIMPLE form.  */
1018               tree op0 = get_rhs_assign_op_for_ccp (stmt, 1);
1019               tree op1 = get_rhs_assign_op_for_ccp (stmt, 2);
1020
1021               /* Translate &x + CST into an invariant form suitable for
1022                  further propagation.  */
1023               if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
1024                   && TREE_CODE (op0) == ADDR_EXPR
1025                   && TREE_CODE (op1) == INTEGER_CST)
1026                 {
1027                   tree off = fold_convert (ptr_type_node, op1);
1028                   return build_fold_addr_expr
1029                            (fold_build2 (MEM_REF,
1030                                          TREE_TYPE (TREE_TYPE (op0)),
1031                                          unshare_expr (op0), off));
1032                 }
1033
1034               return fold_binary_loc (loc, subcode,
1035                                       gimple_expr_type (stmt), op0, op1);
1036             }
1037
1038           case GIMPLE_TERNARY_RHS:
1039             {
1040               /* Handle binary operators that can appear in GIMPLE form.  */
1041               tree op0 = get_rhs_assign_op_for_ccp (stmt, 1);
1042               tree op1 = get_rhs_assign_op_for_ccp (stmt, 2);
1043               tree op2 = get_rhs_assign_op_for_ccp (stmt, 3);
1044
1045               return fold_ternary_loc (loc, subcode,
1046                                        gimple_expr_type (stmt), op0, op1, op2);
1047             }
1048
1049           default:
1050             gcc_unreachable ();
1051           }
1052       }
1053       break;
1054
1055     case GIMPLE_CALL:
1056       {
1057         tree fn = gimple_call_fn (stmt);
1058         prop_value_t *val;
1059
1060         if (TREE_CODE (fn) == SSA_NAME)
1061           {
1062             val = get_value (fn);
1063             if (val->lattice_val == CONSTANT)
1064               fn = val->value;
1065           }
1066         if (TREE_CODE (fn) == ADDR_EXPR
1067             && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
1068             && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
1069           {
1070             tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
1071             tree call, retval;
1072             unsigned i;
1073             for (i = 0; i < gimple_call_num_args (stmt); ++i)
1074               {
1075                 args[i] = gimple_call_arg (stmt, i);
1076                 if (TREE_CODE (args[i]) == SSA_NAME)
1077                   {
1078                     val = get_value (args[i]);
1079                     if (val->lattice_val == CONSTANT)
1080                       args[i] = val->value;
1081                   }
1082               }
1083             call = build_call_array_loc (loc,
1084                                          gimple_call_return_type (stmt),
1085                                          fn, gimple_call_num_args (stmt), args);
1086             retval = fold_call_expr (EXPR_LOCATION (call), call, false);
1087             if (retval)
1088               /* fold_call_expr wraps the result inside a NOP_EXPR.  */
1089               STRIP_NOPS (retval);
1090             return retval;
1091           }
1092         return NULL_TREE;
1093       }
1094
1095     case GIMPLE_COND:
1096       {
1097         /* Handle comparison operators that can appear in GIMPLE form.  */
1098         tree op0 = gimple_cond_lhs (stmt);
1099         tree op1 = gimple_cond_rhs (stmt);
1100         enum tree_code code = gimple_cond_code (stmt);
1101
1102         /* Simplify the operands down to constants when appropriate.  */
1103         if (TREE_CODE (op0) == SSA_NAME)
1104           {
1105             prop_value_t *val = get_value (op0);
1106             if (val->lattice_val == CONSTANT)
1107               op0 = val->value;
1108           }
1109
1110         if (TREE_CODE (op1) == SSA_NAME)
1111           {
1112             prop_value_t *val = get_value (op1);
1113             if (val->lattice_val == CONSTANT)
1114               op1 = val->value;
1115           }
1116
1117         return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
1118       }
1119
1120     case GIMPLE_SWITCH:
1121       {
1122         tree rhs = gimple_switch_index (stmt);
1123
1124         if (TREE_CODE (rhs) == SSA_NAME)
1125           {
1126             /* If the RHS is an SSA_NAME, return its known constant value,
1127                if any.  */
1128             return get_value (rhs)->value;
1129           }
1130
1131         return rhs;
1132       }
1133
1134     default:
1135       gcc_unreachable ();
1136     }
1137 }
1138
1139
1140 /* Return the tree representing the element referenced by T if T is an
1141    ARRAY_REF or COMPONENT_REF into constant aggregates.  Return
1142    NULL_TREE otherwise.  */
1143
1144 tree
1145 fold_const_aggregate_ref (tree t)
1146 {
1147   prop_value_t *value;
1148   tree base, ctor, idx, field;
1149   unsigned HOST_WIDE_INT cnt;
1150   tree cfield, cval;
1151
1152   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1153     return get_symbol_constant_value (t);
1154
1155   switch (TREE_CODE (t))
1156     {
1157     case ARRAY_REF:
1158       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1159          DECL_INITIAL.  If BASE is a nested reference into another
1160          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1161          the inner reference.  */
1162       base = TREE_OPERAND (t, 0);
1163       switch (TREE_CODE (base))
1164         {
1165         case VAR_DECL:
1166           if (!TREE_READONLY (base)
1167               || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1168               || !targetm.binds_local_p (base))
1169             return NULL_TREE;
1170
1171           ctor = DECL_INITIAL (base);
1172           break;
1173
1174         case ARRAY_REF:
1175         case COMPONENT_REF:
1176           ctor = fold_const_aggregate_ref (base);
1177           break;
1178
1179         case STRING_CST:
1180         case CONSTRUCTOR:
1181           ctor = base;
1182           break;
1183
1184         default:
1185           return NULL_TREE;
1186         }
1187
1188       if (ctor == NULL_TREE
1189           || (TREE_CODE (ctor) != CONSTRUCTOR
1190               && TREE_CODE (ctor) != STRING_CST)
1191           || !TREE_STATIC (ctor))
1192         return NULL_TREE;
1193
1194       /* Get the index.  If we have an SSA_NAME, try to resolve it
1195          with the current lattice value for the SSA_NAME.  */
1196       idx = TREE_OPERAND (t, 1);
1197       switch (TREE_CODE (idx))
1198         {
1199         case SSA_NAME:
1200           if ((value = get_value (idx))
1201               && value->lattice_val == CONSTANT
1202               && TREE_CODE (value->value) == INTEGER_CST)
1203             idx = value->value;
1204           else
1205             return NULL_TREE;
1206           break;
1207
1208         case INTEGER_CST:
1209           break;
1210
1211         default:
1212           return NULL_TREE;
1213         }
1214
1215       /* Fold read from constant string.  */
1216       if (TREE_CODE (ctor) == STRING_CST)
1217         {
1218           if ((TYPE_MODE (TREE_TYPE (t))
1219                == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1220               && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1221                   == MODE_INT)
1222               && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1223               && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
1224             return build_int_cst_type (TREE_TYPE (t),
1225                                        (TREE_STRING_POINTER (ctor)
1226                                         [TREE_INT_CST_LOW (idx)]));
1227           return NULL_TREE;
1228         }
1229
1230       /* Whoo-hoo!  I'll fold ya baby.  Yeah!  */
1231       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1232         if (tree_int_cst_equal (cfield, idx))
1233           {
1234             STRIP_NOPS (cval);
1235             if (TREE_CODE (cval) == ADDR_EXPR)
1236               {
1237                 tree base = get_base_address (TREE_OPERAND (cval, 0));
1238                 if (base && TREE_CODE (base) == VAR_DECL)
1239                   add_referenced_var (base);
1240               }
1241             return cval;
1242           }
1243       break;
1244
1245     case COMPONENT_REF:
1246       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1247          DECL_INITIAL.  If BASE is a nested reference into another
1248          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1249          the inner reference.  */
1250       base = TREE_OPERAND (t, 0);
1251       switch (TREE_CODE (base))
1252         {
1253         case VAR_DECL:
1254           if (!TREE_READONLY (base)
1255               || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1256               || !targetm.binds_local_p (base))
1257             return NULL_TREE;
1258
1259           ctor = DECL_INITIAL (base);
1260           break;
1261
1262         case ARRAY_REF:
1263         case COMPONENT_REF:
1264           ctor = fold_const_aggregate_ref (base);
1265           break;
1266
1267         default:
1268           return NULL_TREE;
1269         }
1270
1271       if (ctor == NULL_TREE
1272           || TREE_CODE (ctor) != CONSTRUCTOR
1273           || !TREE_STATIC (ctor))
1274         return NULL_TREE;
1275
1276       field = TREE_OPERAND (t, 1);
1277
1278       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1279         if (cfield == field
1280             /* FIXME: Handle bit-fields.  */
1281             && ! DECL_BIT_FIELD (cfield))
1282           {
1283             STRIP_NOPS (cval);
1284             if (TREE_CODE (cval) == ADDR_EXPR)
1285               {
1286                 tree base = get_base_address (TREE_OPERAND (cval, 0));
1287                 if (base && TREE_CODE (base) == VAR_DECL)
1288                   add_referenced_var (base);
1289               }
1290             return cval;
1291           }
1292       break;
1293
1294     case REALPART_EXPR:
1295     case IMAGPART_EXPR:
1296       {
1297         tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1298         if (c && TREE_CODE (c) == COMPLEX_CST)
1299           return fold_build1_loc (EXPR_LOCATION (t),
1300                               TREE_CODE (t), TREE_TYPE (t), c);
1301         break;
1302       }
1303
1304     case MEM_REF:
1305       /* Get the base object we are accessing.  */
1306       base = TREE_OPERAND (t, 0);
1307       if (TREE_CODE (base) == SSA_NAME
1308           && (value = get_value (base))
1309           && value->lattice_val == CONSTANT)
1310         base = value->value;
1311       if (TREE_CODE (base) != ADDR_EXPR)
1312         return NULL_TREE;
1313       base = TREE_OPERAND (base, 0);
1314       switch (TREE_CODE (base))
1315         {
1316         case VAR_DECL:
1317           if (DECL_P (base)
1318               && !AGGREGATE_TYPE_P (TREE_TYPE (base))
1319               && integer_zerop (TREE_OPERAND (t, 1)))
1320             {
1321               tree res = get_symbol_constant_value (base);
1322               if (res
1323                   && !useless_type_conversion_p
1324                         (TREE_TYPE (t), TREE_TYPE (res)))
1325                 res = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (t), res);
1326               return res;
1327             }
1328
1329           if (!TREE_READONLY (base)
1330               || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1331               || !targetm.binds_local_p (base))
1332             return NULL_TREE;
1333
1334           ctor = DECL_INITIAL (base);
1335           break;
1336
1337         case STRING_CST:
1338         case CONSTRUCTOR:
1339           ctor = base;
1340           break;
1341
1342         default:
1343           return NULL_TREE;
1344         }
1345
1346       if (ctor == NULL_TREE
1347           || (TREE_CODE (ctor) != CONSTRUCTOR
1348               && TREE_CODE (ctor) != STRING_CST)
1349           || !TREE_STATIC (ctor))
1350         return NULL_TREE;
1351
1352       /* Get the byte offset.  */
1353       idx = TREE_OPERAND (t, 1);
1354
1355       /* Fold read from constant string.  */
1356       if (TREE_CODE (ctor) == STRING_CST)
1357         {
1358           if ((TYPE_MODE (TREE_TYPE (t))
1359                == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1360               && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1361                   == MODE_INT)
1362               && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1363               && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
1364             return build_int_cst_type (TREE_TYPE (t),
1365                                        (TREE_STRING_POINTER (ctor)
1366                                         [TREE_INT_CST_LOW (idx)]));
1367           return NULL_TREE;
1368         }
1369
1370       /* ???  Implement byte-offset indexing into a non-array CONSTRUCTOR.  */
1371       if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE
1372           && (TYPE_MODE (TREE_TYPE (t))
1373               == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1374           && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (t))) != 0
1375           && integer_zerop
1376                (int_const_binop
1377                   (TRUNC_MOD_EXPR, idx,
1378                    size_int (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (t)))), 0)))
1379         {
1380           idx = int_const_binop (TRUNC_DIV_EXPR, idx,
1381                                  size_int (GET_MODE_SIZE
1382                                              (TYPE_MODE (TREE_TYPE (t)))), 0);
1383           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1384             if (tree_int_cst_equal (cfield, idx))
1385               {
1386                 STRIP_NOPS (cval);
1387                 if (TREE_CODE (cval) == ADDR_EXPR)
1388                   {
1389                     tree base = get_base_address (TREE_OPERAND (cval, 0));
1390                     if (base && TREE_CODE (base) == VAR_DECL)
1391                       add_referenced_var (base);
1392                   }
1393                 if (useless_type_conversion_p (TREE_TYPE (t), TREE_TYPE (cval)))
1394                   return cval;
1395                 else if (CONSTANT_CLASS_P (cval))
1396                   return fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (t), cval);
1397                 else
1398                   return NULL_TREE;
1399               }
1400         }
1401       break;
1402
1403     default:
1404       break;
1405     }
1406
1407   return NULL_TREE;
1408 }
1409
1410 /* Evaluate statement STMT.
1411    Valid only for assignments, calls, conditionals, and switches. */
1412
1413 static prop_value_t
1414 evaluate_stmt (gimple stmt)
1415 {
1416   prop_value_t val;
1417   tree simplified = NULL_TREE;
1418   ccp_lattice_t likelyvalue = likely_value (stmt);
1419   bool is_constant;
1420
1421   fold_defer_overflow_warnings ();
1422
1423   /* If the statement is likely to have a CONSTANT result, then try
1424      to fold the statement to determine the constant value.  */
1425   /* FIXME.  This is the only place that we call ccp_fold.
1426      Since likely_value never returns CONSTANT for calls, we will
1427      not attempt to fold them, including builtins that may profit.  */
1428   if (likelyvalue == CONSTANT)
1429     simplified = ccp_fold (stmt);
1430   /* If the statement is likely to have a VARYING result, then do not
1431      bother folding the statement.  */
1432   else if (likelyvalue == VARYING)
1433     {
1434       enum gimple_code code = gimple_code (stmt);
1435       if (code == GIMPLE_ASSIGN)
1436         {
1437           enum tree_code subcode = gimple_assign_rhs_code (stmt);
1438
1439           /* Other cases cannot satisfy is_gimple_min_invariant
1440              without folding.  */
1441           if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
1442             simplified = gimple_assign_rhs1 (stmt);
1443         }
1444       else if (code == GIMPLE_SWITCH)
1445         simplified = gimple_switch_index (stmt);
1446       else
1447         /* These cannot satisfy is_gimple_min_invariant without folding.  */
1448         gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
1449     }
1450
1451   is_constant = simplified && is_gimple_min_invariant (simplified);
1452
1453   fold_undefer_overflow_warnings (is_constant, stmt, 0);
1454
1455   if (dump_file && (dump_flags & TDF_DETAILS))
1456     {
1457       fprintf (dump_file, "which is likely ");
1458       switch (likelyvalue)
1459         {
1460         case CONSTANT:
1461           fprintf (dump_file, "CONSTANT");
1462           break;
1463         case UNDEFINED:
1464           fprintf (dump_file, "UNDEFINED");
1465           break;
1466         case VARYING:
1467           fprintf (dump_file, "VARYING");
1468           break;
1469         default:;
1470         }
1471       fprintf (dump_file, "\n");
1472     }
1473
1474   if (is_constant)
1475     {
1476       /* The statement produced a constant value.  */
1477       val.lattice_val = CONSTANT;
1478       val.value = simplified;
1479     }
1480   else
1481     {
1482       /* The statement produced a nonconstant value.  If the statement
1483          had UNDEFINED operands, then the result of the statement
1484          should be UNDEFINED.  Otherwise, the statement is VARYING.  */
1485       if (likelyvalue == UNDEFINED)
1486         val.lattice_val = likelyvalue;
1487       else
1488         val.lattice_val = VARYING;
1489
1490       val.value = NULL_TREE;
1491     }
1492
1493   return val;
1494 }
1495
1496 /* Fold the stmt at *GSI with CCP specific information that propagating
1497    and regular folding does not catch.  */
1498
1499 static bool
1500 ccp_fold_stmt (gimple_stmt_iterator *gsi)
1501 {
1502   gimple stmt = gsi_stmt (*gsi);
1503
1504   switch (gimple_code (stmt))
1505     {
1506     case GIMPLE_COND:
1507       {
1508         prop_value_t val;
1509         /* Statement evaluation will handle type mismatches in constants
1510            more gracefully than the final propagation.  This allows us to
1511            fold more conditionals here.  */
1512         val = evaluate_stmt (stmt);
1513         if (val.lattice_val != CONSTANT
1514             || TREE_CODE (val.value) != INTEGER_CST)
1515           return false;
1516
1517         if (integer_zerop (val.value))
1518           gimple_cond_make_false (stmt);
1519         else
1520           gimple_cond_make_true (stmt);
1521
1522         return true;
1523       }
1524
1525     case GIMPLE_CALL:
1526       {
1527         tree lhs = gimple_call_lhs (stmt);
1528         prop_value_t *val;
1529         tree argt;
1530         bool changed = false;
1531         unsigned i;
1532
1533         /* If the call was folded into a constant make sure it goes
1534            away even if we cannot propagate into all uses because of
1535            type issues.  */
1536         if (lhs
1537             && TREE_CODE (lhs) == SSA_NAME
1538             && (val = get_value (lhs))
1539             && val->lattice_val == CONSTANT)
1540           {
1541             tree new_rhs = unshare_expr (val->value);
1542             bool res;
1543             if (!useless_type_conversion_p (TREE_TYPE (lhs),
1544                                             TREE_TYPE (new_rhs)))
1545               new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
1546             res = update_call_from_tree (gsi, new_rhs);
1547             gcc_assert (res);
1548             return true;
1549           }
1550
1551         /* Propagate into the call arguments.  Compared to replace_uses_in
1552            this can use the argument slot types for type verification
1553            instead of the current argument type.  We also can safely
1554            drop qualifiers here as we are dealing with constants anyway.  */
1555         argt = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt))));
1556         for (i = 0; i < gimple_call_num_args (stmt) && argt;
1557              ++i, argt = TREE_CHAIN (argt))
1558           {
1559             tree arg = gimple_call_arg (stmt, i);
1560             if (TREE_CODE (arg) == SSA_NAME
1561                 && (val = get_value (arg))
1562                 && val->lattice_val == CONSTANT
1563                 && useless_type_conversion_p
1564                      (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
1565                       TYPE_MAIN_VARIANT (TREE_TYPE (val->value))))
1566               {
1567                 gimple_call_set_arg (stmt, i, unshare_expr (val->value));
1568                 changed = true;
1569               }
1570           }
1571
1572         return changed;
1573       }
1574
1575     case GIMPLE_ASSIGN:
1576       {
1577         tree lhs = gimple_assign_lhs (stmt);
1578         prop_value_t *val;
1579
1580         /* If we have a load that turned out to be constant replace it
1581            as we cannot propagate into all uses in all cases.  */
1582         if (gimple_assign_single_p (stmt)
1583             && TREE_CODE (lhs) == SSA_NAME
1584             && (val = get_value (lhs))
1585             && val->lattice_val == CONSTANT)
1586           {
1587             tree rhs = unshare_expr (val->value);
1588             if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
1589               rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
1590             gimple_assign_set_rhs_from_tree (gsi, rhs);
1591             return true;
1592           }
1593
1594         return false;
1595       }
1596
1597     default:
1598       return false;
1599     }
1600 }
1601
1602 /* Visit the assignment statement STMT.  Set the value of its LHS to the
1603    value computed by the RHS and store LHS in *OUTPUT_P.  If STMT
1604    creates virtual definitions, set the value of each new name to that
1605    of the RHS (if we can derive a constant out of the RHS).
1606    Value-returning call statements also perform an assignment, and
1607    are handled here.  */
1608
1609 static enum ssa_prop_result
1610 visit_assignment (gimple stmt, tree *output_p)
1611 {
1612   prop_value_t val;
1613   enum ssa_prop_result retval;
1614
1615   tree lhs = gimple_get_lhs (stmt);
1616
1617   gcc_assert (gimple_code (stmt) != GIMPLE_CALL
1618               || gimple_call_lhs (stmt) != NULL_TREE);
1619
1620   if (gimple_assign_copy_p (stmt))
1621     {
1622       tree rhs = gimple_assign_rhs1 (stmt);
1623
1624       if  (TREE_CODE (rhs) == SSA_NAME)
1625         {
1626           /* For a simple copy operation, we copy the lattice values.  */
1627           prop_value_t *nval = get_value (rhs);
1628           val = *nval;
1629         }
1630       else
1631         val = evaluate_stmt (stmt);
1632     }
1633   else
1634     /* Evaluate the statement, which could be
1635        either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
1636     val = evaluate_stmt (stmt);
1637
1638   retval = SSA_PROP_NOT_INTERESTING;
1639
1640   /* Set the lattice value of the statement's output.  */
1641   if (TREE_CODE (lhs) == SSA_NAME)
1642     {
1643       /* If STMT is an assignment to an SSA_NAME, we only have one
1644          value to set.  */
1645       if (set_lattice_value (lhs, val))
1646         {
1647           *output_p = lhs;
1648           if (val.lattice_val == VARYING)
1649             retval = SSA_PROP_VARYING;
1650           else
1651             retval = SSA_PROP_INTERESTING;
1652         }
1653     }
1654
1655   return retval;
1656 }
1657
1658
1659 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
1660    if it can determine which edge will be taken.  Otherwise, return
1661    SSA_PROP_VARYING.  */
1662
1663 static enum ssa_prop_result
1664 visit_cond_stmt (gimple stmt, edge *taken_edge_p)
1665 {
1666   prop_value_t val;
1667   basic_block block;
1668
1669   block = gimple_bb (stmt);
1670   val = evaluate_stmt (stmt);
1671
1672   /* Find which edge out of the conditional block will be taken and add it
1673      to the worklist.  If no single edge can be determined statically,
1674      return SSA_PROP_VARYING to feed all the outgoing edges to the
1675      propagation engine.  */
1676   *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
1677   if (*taken_edge_p)
1678     return SSA_PROP_INTERESTING;
1679   else
1680     return SSA_PROP_VARYING;
1681 }
1682
1683
1684 /* Evaluate statement STMT.  If the statement produces an output value and
1685    its evaluation changes the lattice value of its output, return
1686    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1687    output value.
1688
1689    If STMT is a conditional branch and we can determine its truth
1690    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
1691    value, return SSA_PROP_VARYING.  */
1692
1693 static enum ssa_prop_result
1694 ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
1695 {
1696   tree def;
1697   ssa_op_iter iter;
1698
1699   if (dump_file && (dump_flags & TDF_DETAILS))
1700     {
1701       fprintf (dump_file, "\nVisiting statement:\n");
1702       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
1703     }
1704
1705   switch (gimple_code (stmt))
1706     {
1707       case GIMPLE_ASSIGN:
1708         /* If the statement is an assignment that produces a single
1709            output value, evaluate its RHS to see if the lattice value of
1710            its output has changed.  */
1711         return visit_assignment (stmt, output_p);
1712
1713       case GIMPLE_CALL:
1714         /* A value-returning call also performs an assignment.  */
1715         if (gimple_call_lhs (stmt) != NULL_TREE)
1716           return visit_assignment (stmt, output_p);
1717         break;
1718
1719       case GIMPLE_COND:
1720       case GIMPLE_SWITCH:
1721         /* If STMT is a conditional branch, see if we can determine
1722            which branch will be taken.   */
1723         /* FIXME.  It appears that we should be able to optimize
1724            computed GOTOs here as well.  */
1725         return visit_cond_stmt (stmt, taken_edge_p);
1726
1727       default:
1728         break;
1729     }
1730
1731   /* Any other kind of statement is not interesting for constant
1732      propagation and, therefore, not worth simulating.  */
1733   if (dump_file && (dump_flags & TDF_DETAILS))
1734     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
1735
1736   /* Definitions made by statements other than assignments to
1737      SSA_NAMEs represent unknown modifications to their outputs.
1738      Mark them VARYING.  */
1739   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1740     {
1741       prop_value_t v = { VARYING, NULL_TREE };
1742       set_lattice_value (def, v);
1743     }
1744
1745   return SSA_PROP_VARYING;
1746 }
1747
1748
1749 /* Main entry point for SSA Conditional Constant Propagation.  */
1750
1751 static unsigned int
1752 do_ssa_ccp (void)
1753 {
1754   ccp_initialize ();
1755   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
1756   if (ccp_finalize ())
1757     return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
1758   else
1759     return 0;
1760 }
1761
1762
1763 static bool
1764 gate_ccp (void)
1765 {
1766   return flag_tree_ccp != 0;
1767 }
1768
1769
1770 struct gimple_opt_pass pass_ccp =
1771 {
1772  {
1773   GIMPLE_PASS,
1774   "ccp",                                /* name */
1775   gate_ccp,                             /* gate */
1776   do_ssa_ccp,                           /* execute */
1777   NULL,                                 /* sub */
1778   NULL,                                 /* next */
1779   0,                                    /* static_pass_number */
1780   TV_TREE_CCP,                          /* tv_id */
1781   PROP_cfg | PROP_ssa,                  /* properties_required */
1782   0,                                    /* properties_provided */
1783   0,                                    /* properties_destroyed */
1784   0,                                    /* todo_flags_start */
1785   TODO_dump_func | TODO_verify_ssa
1786   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1787  }
1788 };
1789
1790
1791
1792 /* Try to optimize out __builtin_stack_restore.  Optimize it out
1793    if there is another __builtin_stack_restore in the same basic
1794    block and no calls or ASM_EXPRs are in between, or if this block's
1795    only outgoing edge is to EXIT_BLOCK and there are no calls or
1796    ASM_EXPRs after this __builtin_stack_restore.  */
1797
1798 static tree
1799 optimize_stack_restore (gimple_stmt_iterator i)
1800 {
1801   tree callee;
1802   gimple stmt;
1803
1804   basic_block bb = gsi_bb (i);
1805   gimple call = gsi_stmt (i);
1806
1807   if (gimple_code (call) != GIMPLE_CALL
1808       || gimple_call_num_args (call) != 1
1809       || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
1810       || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
1811     return NULL_TREE;
1812
1813   for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
1814     {
1815       stmt = gsi_stmt (i);
1816       if (gimple_code (stmt) == GIMPLE_ASM)
1817         return NULL_TREE;
1818       if (gimple_code (stmt) != GIMPLE_CALL)
1819         continue;
1820
1821       callee = gimple_call_fndecl (stmt);
1822       if (!callee
1823           || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
1824           /* All regular builtins are ok, just obviously not alloca.  */
1825           || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA)
1826         return NULL_TREE;
1827
1828       if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
1829         goto second_stack_restore;
1830     }
1831
1832   if (!gsi_end_p (i))
1833     return NULL_TREE;
1834
1835   /* Allow one successor of the exit block, or zero successors.  */
1836   switch (EDGE_COUNT (bb->succs))
1837     {
1838     case 0:
1839       break;
1840     case 1:
1841       if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
1842         return NULL_TREE;
1843       break;
1844     default:
1845       return NULL_TREE;
1846     }
1847  second_stack_restore:
1848
1849   /* If there's exactly one use, then zap the call to __builtin_stack_save.
1850      If there are multiple uses, then the last one should remove the call.
1851      In any case, whether the call to __builtin_stack_save can be removed
1852      or not is irrelevant to removing the call to __builtin_stack_restore.  */
1853   if (has_single_use (gimple_call_arg (call, 0)))
1854     {
1855       gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
1856       if (is_gimple_call (stack_save))
1857         {
1858           callee = gimple_call_fndecl (stack_save);
1859           if (callee
1860               && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
1861               && DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
1862             {
1863               gimple_stmt_iterator stack_save_gsi;
1864               tree rhs;
1865
1866               stack_save_gsi = gsi_for_stmt (stack_save);
1867               rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
1868               update_call_from_tree (&stack_save_gsi, rhs);
1869             }
1870         }
1871     }
1872
1873   /* No effect, so the statement will be deleted.  */
1874   return integer_zero_node;
1875 }
1876
1877 /* If va_list type is a simple pointer and nothing special is needed,
1878    optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
1879    __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
1880    pointer assignment.  */
1881
1882 static tree
1883 optimize_stdarg_builtin (gimple call)
1884 {
1885   tree callee, lhs, rhs, cfun_va_list;
1886   bool va_list_simple_ptr;
1887   location_t loc = gimple_location (call);
1888
1889   if (gimple_code (call) != GIMPLE_CALL)
1890     return NULL_TREE;
1891
1892   callee = gimple_call_fndecl (call);
1893
1894   cfun_va_list = targetm.fn_abi_va_list (callee);
1895   va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
1896                        && (TREE_TYPE (cfun_va_list) == void_type_node
1897                            || TREE_TYPE (cfun_va_list) == char_type_node);
1898
1899   switch (DECL_FUNCTION_CODE (callee))
1900     {
1901     case BUILT_IN_VA_START:
1902       if (!va_list_simple_ptr
1903           || targetm.expand_builtin_va_start != NULL
1904           || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
1905         return NULL_TREE;
1906
1907       if (gimple_call_num_args (call) != 2)
1908         return NULL_TREE;
1909
1910       lhs = gimple_call_arg (call, 0);
1911       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
1912           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
1913              != TYPE_MAIN_VARIANT (cfun_va_list))
1914         return NULL_TREE;
1915
1916       lhs = build_fold_indirect_ref_loc (loc, lhs);
1917       rhs = build_call_expr_loc (loc, built_in_decls[BUILT_IN_NEXT_ARG],
1918                              1, integer_zero_node);
1919       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
1920       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
1921
1922     case BUILT_IN_VA_COPY:
1923       if (!va_list_simple_ptr)
1924         return NULL_TREE;
1925
1926       if (gimple_call_num_args (call) != 2)
1927         return NULL_TREE;
1928
1929       lhs = gimple_call_arg (call, 0);
1930       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
1931           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
1932              != TYPE_MAIN_VARIANT (cfun_va_list))
1933         return NULL_TREE;
1934
1935       lhs = build_fold_indirect_ref_loc (loc, lhs);
1936       rhs = gimple_call_arg (call, 1);
1937       if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
1938           != TYPE_MAIN_VARIANT (cfun_va_list))
1939         return NULL_TREE;
1940
1941       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
1942       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
1943
1944     case BUILT_IN_VA_END:
1945       /* No effect, so the statement will be deleted.  */
1946       return integer_zero_node;
1947
1948     default:
1949       gcc_unreachable ();
1950     }
1951 }
1952
1953 /* A simple pass that attempts to fold all builtin functions.  This pass
1954    is run after we've propagated as many constants as we can.  */
1955
1956 static unsigned int
1957 execute_fold_all_builtins (void)
1958 {
1959   bool cfg_changed = false;
1960   basic_block bb;
1961   unsigned int todoflags = 0;
1962
1963   FOR_EACH_BB (bb)
1964     {
1965       gimple_stmt_iterator i;
1966       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
1967         {
1968           gimple stmt, old_stmt;
1969           tree callee, result;
1970           enum built_in_function fcode;
1971
1972           stmt = gsi_stmt (i);
1973
1974           if (gimple_code (stmt) != GIMPLE_CALL)
1975             {
1976               gsi_next (&i);
1977               continue;
1978             }
1979           callee = gimple_call_fndecl (stmt);
1980           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
1981             {
1982               gsi_next (&i);
1983               continue;
1984             }
1985           fcode = DECL_FUNCTION_CODE (callee);
1986
1987           result = gimple_fold_builtin (stmt);
1988
1989           if (result)
1990             gimple_remove_stmt_histograms (cfun, stmt);
1991
1992           if (!result)
1993             switch (DECL_FUNCTION_CODE (callee))
1994               {
1995               case BUILT_IN_CONSTANT_P:
1996                 /* Resolve __builtin_constant_p.  If it hasn't been
1997                    folded to integer_one_node by now, it's fairly
1998                    certain that the value simply isn't constant.  */
1999                 result = integer_zero_node;
2000                 break;
2001
2002               case BUILT_IN_STACK_RESTORE:
2003                 result = optimize_stack_restore (i);
2004                 if (result)
2005                   break;
2006                 gsi_next (&i);
2007                 continue;
2008
2009               case BUILT_IN_VA_START:
2010               case BUILT_IN_VA_END:
2011               case BUILT_IN_VA_COPY:
2012                 /* These shouldn't be folded before pass_stdarg.  */
2013                 result = optimize_stdarg_builtin (stmt);
2014                 if (result)
2015                   break;
2016                 /* FALLTHRU */
2017
2018               default:
2019                 gsi_next (&i);
2020                 continue;
2021               }
2022
2023           if (dump_file && (dump_flags & TDF_DETAILS))
2024             {
2025               fprintf (dump_file, "Simplified\n  ");
2026               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2027             }
2028
2029           old_stmt = stmt;
2030           if (!update_call_from_tree (&i, result))
2031             {
2032               gimplify_and_update_call_from_tree (&i, result);
2033               todoflags |= TODO_update_address_taken;
2034             }
2035
2036           stmt = gsi_stmt (i);
2037           update_stmt (stmt);
2038
2039           if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
2040               && gimple_purge_dead_eh_edges (bb))
2041             cfg_changed = true;
2042
2043           if (dump_file && (dump_flags & TDF_DETAILS))
2044             {
2045               fprintf (dump_file, "to\n  ");
2046               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2047               fprintf (dump_file, "\n");
2048             }
2049
2050           /* Retry the same statement if it changed into another
2051              builtin, there might be new opportunities now.  */
2052           if (gimple_code (stmt) != GIMPLE_CALL)
2053             {
2054               gsi_next (&i);
2055               continue;
2056             }
2057           callee = gimple_call_fndecl (stmt);
2058           if (!callee
2059               || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2060               || DECL_FUNCTION_CODE (callee) == fcode)
2061             gsi_next (&i);
2062         }
2063     }
2064
2065   /* Delete unreachable blocks.  */
2066   if (cfg_changed)
2067     todoflags |= TODO_cleanup_cfg;
2068
2069   return todoflags;
2070 }
2071
2072
2073 struct gimple_opt_pass pass_fold_builtins =
2074 {
2075  {
2076   GIMPLE_PASS,
2077   "fab",                                /* name */
2078   NULL,                                 /* gate */
2079   execute_fold_all_builtins,            /* execute */
2080   NULL,                                 /* sub */
2081   NULL,                                 /* next */
2082   0,                                    /* static_pass_number */
2083   TV_NONE,                              /* tv_id */
2084   PROP_cfg | PROP_ssa,                  /* properties_required */
2085   0,                                    /* properties_provided */
2086   0,                                    /* properties_destroyed */
2087   0,                                    /* todo_flags_start */
2088   TODO_dump_func
2089     | TODO_verify_ssa
2090     | TODO_update_ssa                   /* todo_flags_finish */
2091  }
2092 };