OSDN Git Service

PR libfortran/40549
[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    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 "rtl.h"
195 #include "tm_p.h"
196 #include "ggc.h"
197 #include "basic-block.h"
198 #include "output.h"
199 #include "expr.h"
200 #include "function.h"
201 #include "diagnostic.h"
202 #include "timevar.h"
203 #include "tree-dump.h"
204 #include "tree-flow.h"
205 #include "tree-pass.h"
206 #include "tree-ssa-propagate.h"
207 #include "value-prof.h"
208 #include "langhooks.h"
209 #include "target.h"
210 #include "toplev.h"
211 #include "dbgcnt.h"
212
213
214 /* Possible lattice values.  */
215 typedef enum
216 {
217   UNINITIALIZED,
218   UNDEFINED,
219   CONSTANT,
220   VARYING
221 } ccp_lattice_t;
222
223 /* Array of propagated constant values.  After propagation,
224    CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I).  If
225    the constant is held in an SSA name representing a memory store
226    (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
227    memory reference used to store (i.e., the LHS of the assignment
228    doing the store).  */
229 static prop_value_t *const_val;
230
231 static void canonicalize_float_value (prop_value_t *);
232
233 /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX.  */
234
235 static void
236 dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
237 {
238   switch (val.lattice_val)
239     {
240     case UNINITIALIZED:
241       fprintf (outf, "%sUNINITIALIZED", prefix);
242       break;
243     case UNDEFINED:
244       fprintf (outf, "%sUNDEFINED", prefix);
245       break;
246     case VARYING:
247       fprintf (outf, "%sVARYING", prefix);
248       break;
249     case CONSTANT:
250       fprintf (outf, "%sCONSTANT ", prefix);
251       print_generic_expr (outf, val.value, dump_flags);
252       break;
253     default:
254       gcc_unreachable ();
255     }
256 }
257
258
259 /* Print lattice value VAL to stderr.  */
260
261 void debug_lattice_value (prop_value_t val);
262
263 void
264 debug_lattice_value (prop_value_t val)
265 {
266   dump_lattice_value (stderr, "", val);
267   fprintf (stderr, "\n");
268 }
269
270
271
272 /* If SYM is a constant variable with known value, return the value.
273    NULL_TREE is returned otherwise.  */
274
275 tree
276 get_symbol_constant_value (tree sym)
277 {
278   if (TREE_STATIC (sym)
279       && (TREE_READONLY (sym)
280           || TREE_CODE (sym) == CONST_DECL))
281     {
282       tree val = DECL_INITIAL (sym);
283       if (val)
284         {
285           STRIP_USELESS_TYPE_CONVERSION (val);
286           if (is_gimple_min_invariant (val))
287             {
288               if (TREE_CODE (val) == ADDR_EXPR)
289                 {
290                   tree base = get_base_address (TREE_OPERAND (val, 0));
291                   if (base && TREE_CODE (base) == VAR_DECL)
292                     {
293                       TREE_ADDRESSABLE (base) = 1;
294                       if (gimple_referenced_vars (cfun))
295                         add_referenced_var (base);
296                     }
297                 }
298               return val;
299             }
300         }
301       /* Variables declared 'const' without an initializer
302          have zero as the initializer if they may not be
303          overridden at link or run time.  */
304       if (!val
305           && !DECL_EXTERNAL (sym)
306           && targetm.binds_local_p (sym)
307           && (INTEGRAL_TYPE_P (TREE_TYPE (sym))
308                || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym))))
309         return fold_convert (TREE_TYPE (sym), integer_zero_node);
310     }
311
312   return NULL_TREE;
313 }
314
315 /* Compute a default value for variable VAR and store it in the
316    CONST_VAL array.  The following rules are used to get default
317    values:
318
319    1- Global and static variables that are declared constant are
320       considered CONSTANT.
321
322    2- Any other value is considered UNDEFINED.  This is useful when
323       considering PHI nodes.  PHI arguments that are undefined do not
324       change the constant value of the PHI node, which allows for more
325       constants to be propagated.
326
327    3- Variables defined by statements other than assignments and PHI
328       nodes are considered VARYING.
329
330    4- Initial values of variables that are not GIMPLE registers are
331       considered VARYING.  */
332
333 static prop_value_t
334 get_default_value (tree var)
335 {
336   tree sym = SSA_NAME_VAR (var);
337   prop_value_t val = { UNINITIALIZED, NULL_TREE };
338   gimple stmt;
339
340   stmt = SSA_NAME_DEF_STMT (var);
341
342   if (gimple_nop_p (stmt))
343     {
344       /* Variables defined by an empty statement are those used
345          before being initialized.  If VAR is a local variable, we
346          can assume initially that it is UNDEFINED, otherwise we must
347          consider it VARYING.  */
348       if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
349         val.lattice_val = UNDEFINED;
350       else
351         val.lattice_val = VARYING;
352     }
353   else if (is_gimple_assign (stmt)
354            /* Value-returning GIMPLE_CALL statements assign to
355               a variable, and are treated similarly to GIMPLE_ASSIGN.  */
356            || (is_gimple_call (stmt)
357                && gimple_call_lhs (stmt) != NULL_TREE)
358            || gimple_code (stmt) == GIMPLE_PHI)
359     {
360       tree cst;
361       if (gimple_assign_single_p (stmt)
362           && DECL_P (gimple_assign_rhs1 (stmt))
363           && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
364         {
365           val.lattice_val = CONSTANT;
366           val.value = cst;
367         }
368       else
369         /* Any other variable defined by an assignment or a PHI node
370            is considered UNDEFINED.  */
371         val.lattice_val = UNDEFINED;
372     }
373   else
374     {
375       /* Otherwise, VAR will never take on a constant value.  */
376       val.lattice_val = VARYING;
377     }
378
379   return val;
380 }
381
382
383 /* Get the constant value associated with variable VAR.  */
384
385 static inline prop_value_t *
386 get_value (tree var)
387 {
388   prop_value_t *val;
389
390   if (const_val == NULL)
391     return NULL;
392
393   val = &const_val[SSA_NAME_VERSION (var)];
394   if (val->lattice_val == UNINITIALIZED)
395     *val = get_default_value (var);
396
397   canonicalize_float_value (val);
398
399   return val;
400 }
401
402 /* Sets the value associated with VAR to VARYING.  */
403
404 static inline void
405 set_value_varying (tree var)
406 {
407   prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
408
409   val->lattice_val = VARYING;
410   val->value = NULL_TREE;
411 }
412
413 /* For float types, modify the value of VAL to make ccp work correctly
414    for non-standard values (-0, NaN):
415
416    If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
417    If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
418      This is to fix the following problem (see PR 29921): Suppose we have
419
420      x = 0.0 * y
421
422      and we set value of y to NaN.  This causes value of x to be set to NaN.
423      When we later determine that y is in fact VARYING, fold uses the fact
424      that HONOR_NANS is false, and we try to change the value of x to 0,
425      causing an ICE.  With HONOR_NANS being false, the real appearance of
426      NaN would cause undefined behavior, though, so claiming that y (and x)
427      are UNDEFINED initially is correct.  */
428
429 static void
430 canonicalize_float_value (prop_value_t *val)
431 {
432   enum machine_mode mode;
433   tree type;
434   REAL_VALUE_TYPE d;
435
436   if (val->lattice_val != CONSTANT
437       || TREE_CODE (val->value) != REAL_CST)
438     return;
439
440   d = TREE_REAL_CST (val->value);
441   type = TREE_TYPE (val->value);
442   mode = TYPE_MODE (type);
443
444   if (!HONOR_SIGNED_ZEROS (mode)
445       && REAL_VALUE_MINUS_ZERO (d))
446     {
447       val->value = build_real (type, dconst0);
448       return;
449     }
450
451   if (!HONOR_NANS (mode)
452       && REAL_VALUE_ISNAN (d))
453     {
454       val->lattice_val = UNDEFINED;
455       val->value = NULL;
456       return;
457     }
458 }
459
460 /* Set the value for variable VAR to NEW_VAL.  Return true if the new
461    value is different from VAR's previous value.  */
462
463 static bool
464 set_lattice_value (tree var, prop_value_t new_val)
465 {
466   prop_value_t *old_val = get_value (var);
467
468   canonicalize_float_value (&new_val);
469
470   /* Lattice transitions must always be monotonically increasing in
471      value.  If *OLD_VAL and NEW_VAL are the same, return false to
472      inform the caller that this was a non-transition.  */
473
474   gcc_assert (old_val->lattice_val < new_val.lattice_val
475               || (old_val->lattice_val == new_val.lattice_val
476                   && ((!old_val->value && !new_val.value)
477                       || operand_equal_p (old_val->value, new_val.value, 0))));
478
479   if (old_val->lattice_val != new_val.lattice_val)
480     {
481       if (dump_file && (dump_flags & TDF_DETAILS))
482         {
483           dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
484           fprintf (dump_file, ".  Adding SSA edges to worklist.\n");
485         }
486
487       *old_val = new_val;
488
489       gcc_assert (new_val.lattice_val != UNDEFINED);
490       return true;
491     }
492
493   return false;
494 }
495
496
497 /* Return the likely CCP lattice value for STMT.
498
499    If STMT has no operands, then return CONSTANT.
500
501    Else if undefinedness of operands of STMT cause its value to be
502    undefined, then return UNDEFINED.
503
504    Else if any operands of STMT are constants, then return CONSTANT.
505
506    Else return VARYING.  */
507
508 static ccp_lattice_t
509 likely_value (gimple stmt)
510 {
511   bool has_constant_operand, has_undefined_operand, all_undefined_operands;
512   tree use;
513   ssa_op_iter iter;
514   unsigned i;
515
516   enum gimple_code code = gimple_code (stmt);
517
518   /* This function appears to be called only for assignments, calls,
519      conditionals, and switches, due to the logic in visit_stmt.  */
520   gcc_assert (code == GIMPLE_ASSIGN
521               || code == GIMPLE_CALL
522               || code == GIMPLE_COND
523               || code == GIMPLE_SWITCH);
524
525   /* If the statement has volatile operands, it won't fold to a
526      constant value.  */
527   if (gimple_has_volatile_ops (stmt))
528     return VARYING;
529
530   /* Arrive here for more complex cases.  */
531   has_constant_operand = false;
532   has_undefined_operand = false;
533   all_undefined_operands = true;
534   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
535     {
536       prop_value_t *val = get_value (use);
537
538       if (val->lattice_val == UNDEFINED)
539         has_undefined_operand = true;
540       else
541         all_undefined_operands = false;
542
543       if (val->lattice_val == CONSTANT)
544         has_constant_operand = true;
545     }
546
547   /* There may be constants in regular rhs operands.  For calls we
548      have to ignore lhs, fndecl and static chain, otherwise only
549      the lhs.  */
550   for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
551        i < gimple_num_ops (stmt); ++i)
552     {
553       tree op = gimple_op (stmt, i);
554       if (!op || TREE_CODE (op) == SSA_NAME)
555         continue;
556       if (is_gimple_min_invariant (op))
557         has_constant_operand = true;
558     }
559
560   /* If the operation combines operands like COMPLEX_EXPR make sure to
561      not mark the result UNDEFINED if only one part of the result is
562      undefined.  */
563   if (has_undefined_operand && all_undefined_operands)
564     return UNDEFINED;
565   else if (code == GIMPLE_ASSIGN && has_undefined_operand)
566     {
567       switch (gimple_assign_rhs_code (stmt))
568         {
569         /* Unary operators are handled with all_undefined_operands.  */
570         case PLUS_EXPR:
571         case MINUS_EXPR:
572         case POINTER_PLUS_EXPR:
573           /* Not MIN_EXPR, MAX_EXPR.  One VARYING operand may be selected.
574              Not bitwise operators, one VARYING operand may specify the
575              result completely.  Not logical operators for the same reason.
576              Not COMPLEX_EXPR as one VARYING operand makes the result partly
577              not UNDEFINED.  Not *DIV_EXPR, comparisons and shifts because
578              the undefined operand may be promoted.  */
579           return UNDEFINED;
580
581         default:
582           ;
583         }
584     }
585   /* If there was an UNDEFINED operand but the result may be not UNDEFINED
586      fall back to VARYING even if there were CONSTANT operands.  */
587   if (has_undefined_operand)
588     return VARYING;
589
590   /* We do not consider virtual operands here -- load from read-only
591      memory may have only VARYING virtual operands, but still be
592      constant.  */
593   if (has_constant_operand
594       || gimple_references_memory_p (stmt))
595     return CONSTANT;
596
597   return VARYING;
598 }
599
600 /* Returns true if STMT cannot be constant.  */
601
602 static bool
603 surely_varying_stmt_p (gimple stmt)
604 {
605   /* If the statement has operands that we cannot handle, it cannot be
606      constant.  */
607   if (gimple_has_volatile_ops (stmt))
608     return true;
609
610   /* If it is a call and does not return a value or is not a
611      builtin and not an indirect call, it is varying.  */
612   if (is_gimple_call (stmt))
613     {
614       tree fndecl;
615       if (!gimple_call_lhs (stmt)
616           || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
617               && !DECL_BUILT_IN (fndecl)))
618         return true;
619     }
620
621   /* Any other store operation is not interesting.  */
622   else if (gimple_vdef (stmt))
623     return true;
624
625   /* Anything other than assignments and conditional jumps are not
626      interesting for CCP.  */
627   if (gimple_code (stmt) != GIMPLE_ASSIGN
628       && gimple_code (stmt) != GIMPLE_COND
629       && gimple_code (stmt) != GIMPLE_SWITCH
630       && gimple_code (stmt) != GIMPLE_CALL)
631     return true;
632
633   return false;
634 }
635
636 /* Initialize local data structures for CCP.  */
637
638 static void
639 ccp_initialize (void)
640 {
641   basic_block bb;
642
643   const_val = XCNEWVEC (prop_value_t, num_ssa_names);
644
645   /* Initialize simulation flags for PHI nodes and statements.  */
646   FOR_EACH_BB (bb)
647     {
648       gimple_stmt_iterator i;
649
650       for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
651         {
652           gimple stmt = gsi_stmt (i);
653           bool is_varying = surely_varying_stmt_p (stmt);
654
655           if (is_varying)
656             {
657               tree def;
658               ssa_op_iter iter;
659
660               /* If the statement will not produce a constant, mark
661                  all its outputs VARYING.  */
662               FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
663                 set_value_varying (def);
664             }
665           prop_set_simulate_again (stmt, !is_varying);
666         }
667     }
668
669   /* Now process PHI nodes.  We never clear the simulate_again flag on
670      phi nodes, since we do not know which edges are executable yet,
671      except for phi nodes for virtual operands when we do not do store ccp.  */
672   FOR_EACH_BB (bb)
673     {
674       gimple_stmt_iterator i;
675
676       for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
677         {
678           gimple phi = gsi_stmt (i);
679
680           if (!is_gimple_reg (gimple_phi_result (phi)))
681             prop_set_simulate_again (phi, false);
682           else
683             prop_set_simulate_again (phi, true);
684         }
685     }
686 }
687
688 /* Debug count support. Reset the values of ssa names
689    VARYING when the total number ssa names analyzed is
690    beyond the debug count specified.  */
691
692 static void
693 do_dbg_cnt (void)
694 {
695   unsigned i;
696   for (i = 0; i < num_ssa_names; i++)
697     {
698       if (!dbg_cnt (ccp))
699         {
700           const_val[i].lattice_val = VARYING;
701           const_val[i].value = NULL_TREE;
702         }
703     }
704 }
705
706
707 /* Do final substitution of propagated values, cleanup the flowgraph and
708    free allocated storage.  
709
710    Return TRUE when something was optimized.  */
711
712 static bool
713 ccp_finalize (void)
714 {
715   bool something_changed;
716
717   do_dbg_cnt ();
718   /* Perform substitutions based on the known constant values.  */
719   something_changed = substitute_and_fold (const_val, false);
720
721   free (const_val);
722   const_val = NULL;
723   return something_changed;;
724 }
725
726
727 /* Compute the meet operator between *VAL1 and *VAL2.  Store the result
728    in VAL1.
729
730                 any  M UNDEFINED   = any
731                 any  M VARYING     = VARYING
732                 Ci   M Cj          = Ci         if (i == j)
733                 Ci   M Cj          = VARYING    if (i != j)
734    */
735
736 static void
737 ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
738 {
739   if (val1->lattice_val == UNDEFINED)
740     {
741       /* UNDEFINED M any = any   */
742       *val1 = *val2;
743     }
744   else if (val2->lattice_val == UNDEFINED)
745     {
746       /* any M UNDEFINED = any
747          Nothing to do.  VAL1 already contains the value we want.  */
748       ;
749     }
750   else if (val1->lattice_val == VARYING
751            || val2->lattice_val == VARYING)
752     {
753       /* any M VARYING = VARYING.  */
754       val1->lattice_val = VARYING;
755       val1->value = NULL_TREE;
756     }
757   else if (val1->lattice_val == CONSTANT
758            && val2->lattice_val == CONSTANT
759            && simple_cst_equal (val1->value, val2->value) == 1)
760     {
761       /* Ci M Cj = Ci           if (i == j)
762          Ci M Cj = VARYING      if (i != j)
763
764          If these two values come from memory stores, make sure that
765          they come from the same memory reference.  */
766       val1->lattice_val = CONSTANT;
767       val1->value = val1->value;
768     }
769   else
770     {
771       /* Any other combination is VARYING.  */
772       val1->lattice_val = VARYING;
773       val1->value = NULL_TREE;
774     }
775 }
776
777
778 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
779    lattice values to determine PHI_NODE's lattice value.  The value of a
780    PHI node is determined calling ccp_lattice_meet with all the arguments
781    of the PHI node that are incoming via executable edges.  */
782
783 static enum ssa_prop_result
784 ccp_visit_phi_node (gimple phi)
785 {
786   unsigned i;
787   prop_value_t *old_val, new_val;
788
789   if (dump_file && (dump_flags & TDF_DETAILS))
790     {
791       fprintf (dump_file, "\nVisiting PHI node: ");
792       print_gimple_stmt (dump_file, phi, 0, dump_flags);
793     }
794
795   old_val = get_value (gimple_phi_result (phi));
796   switch (old_val->lattice_val)
797     {
798     case VARYING:
799       return SSA_PROP_VARYING;
800
801     case CONSTANT:
802       new_val = *old_val;
803       break;
804
805     case UNDEFINED:
806       new_val.lattice_val = UNDEFINED;
807       new_val.value = NULL_TREE;
808       break;
809
810     default:
811       gcc_unreachable ();
812     }
813
814   for (i = 0; i < gimple_phi_num_args (phi); i++)
815     {
816       /* Compute the meet operator over all the PHI arguments flowing
817          through executable edges.  */
818       edge e = gimple_phi_arg_edge (phi, i);
819
820       if (dump_file && (dump_flags & TDF_DETAILS))
821         {
822           fprintf (dump_file,
823               "\n    Argument #%d (%d -> %d %sexecutable)\n",
824               i, e->src->index, e->dest->index,
825               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
826         }
827
828       /* If the incoming edge is executable, Compute the meet operator for
829          the existing value of the PHI node and the current PHI argument.  */
830       if (e->flags & EDGE_EXECUTABLE)
831         {
832           tree arg = gimple_phi_arg (phi, i)->def;
833           prop_value_t arg_val;
834
835           if (is_gimple_min_invariant (arg))
836             {
837               arg_val.lattice_val = CONSTANT;
838               arg_val.value = arg;
839             }
840           else
841             arg_val = *(get_value (arg));
842
843           ccp_lattice_meet (&new_val, &arg_val);
844
845           if (dump_file && (dump_flags & TDF_DETAILS))
846             {
847               fprintf (dump_file, "\t");
848               print_generic_expr (dump_file, arg, dump_flags);
849               dump_lattice_value (dump_file, "\tValue: ", arg_val);
850               fprintf (dump_file, "\n");
851             }
852
853           if (new_val.lattice_val == VARYING)
854             break;
855         }
856     }
857
858   if (dump_file && (dump_flags & TDF_DETAILS))
859     {
860       dump_lattice_value (dump_file, "\n    PHI node value: ", new_val);
861       fprintf (dump_file, "\n\n");
862     }
863
864   /* Make the transition to the new value.  */
865   if (set_lattice_value (gimple_phi_result (phi), new_val))
866     {
867       if (new_val.lattice_val == VARYING)
868         return SSA_PROP_VARYING;
869       else
870         return SSA_PROP_INTERESTING;
871     }
872   else
873     return SSA_PROP_NOT_INTERESTING;
874 }
875
876 /* Return true if we may propagate the address expression ADDR into the 
877    dereference DEREF and cancel them.  */
878
879 bool
880 may_propagate_address_into_dereference (tree addr, tree deref)
881 {
882   gcc_assert (INDIRECT_REF_P (deref)
883               && TREE_CODE (addr) == ADDR_EXPR);
884
885   /* Don't propagate if ADDR's operand has incomplete type.  */
886   if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_OPERAND (addr, 0))))
887     return false;
888
889   /* If the address is invariant then we do not need to preserve restrict
890      qualifications.  But we do need to preserve volatile qualifiers until
891      we can annotate the folded dereference itself properly.  */
892   if (is_gimple_min_invariant (addr)
893       && (!TREE_THIS_VOLATILE (deref)
894           || TYPE_VOLATILE (TREE_TYPE (addr))))
895     return useless_type_conversion_p (TREE_TYPE (deref),
896                                       TREE_TYPE (TREE_OPERAND (addr, 0)));
897
898   /* Else both the address substitution and the folding must result in
899      a valid useless type conversion sequence.  */
900   return (useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (deref, 0)),
901                                      TREE_TYPE (addr))
902           && useless_type_conversion_p (TREE_TYPE (deref),
903                                         TREE_TYPE (TREE_OPERAND (addr, 0))));
904 }
905
906 /* CCP specific front-end to the non-destructive constant folding
907    routines.
908
909    Attempt to simplify the RHS of STMT knowing that one or more
910    operands are constants.
911
912    If simplification is possible, return the simplified RHS,
913    otherwise return the original RHS or NULL_TREE.  */
914
915 static tree
916 ccp_fold (gimple stmt)
917 {
918   location_t loc = gimple_location (stmt);
919   switch (gimple_code (stmt))
920     {
921     case GIMPLE_ASSIGN:
922       {
923         enum tree_code subcode = gimple_assign_rhs_code (stmt);
924
925         switch (get_gimple_rhs_class (subcode))
926           {
927           case GIMPLE_SINGLE_RHS:
928             {
929               tree rhs = gimple_assign_rhs1 (stmt);
930               enum tree_code_class kind = TREE_CODE_CLASS (subcode);
931
932               if (TREE_CODE (rhs) == SSA_NAME)
933                 {
934                   /* If the RHS is an SSA_NAME, return its known constant value,
935                      if any.  */
936                   return get_value (rhs)->value;
937                 }
938               /* Handle propagating invariant addresses into address operations.
939                  The folding we do here matches that in tree-ssa-forwprop.c.  */
940               else if (TREE_CODE (rhs) == ADDR_EXPR)
941                 {
942                   tree *base;
943                   base = &TREE_OPERAND (rhs, 0);
944                   while (handled_component_p (*base))
945                     base = &TREE_OPERAND (*base, 0);
946                   if (TREE_CODE (*base) == INDIRECT_REF
947                       && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME)
948                     {
949                       prop_value_t *val = get_value (TREE_OPERAND (*base, 0));
950                       if (val->lattice_val == CONSTANT
951                           && TREE_CODE (val->value) == ADDR_EXPR
952                           && may_propagate_address_into_dereference
953                                (val->value, *base))
954                         {
955                           /* We need to return a new tree, not modify the IL
956                              or share parts of it.  So play some tricks to
957                              avoid manually building it.  */
958                           tree ret, save = *base;
959                           *base = TREE_OPERAND (val->value, 0);
960                           ret = unshare_expr (rhs);
961                           recompute_tree_invariant_for_addr_expr (ret);
962                           *base = save;
963                           return ret;
964                         }
965                     }
966                 }
967               else if (TREE_CODE (rhs) == CONSTRUCTOR
968                        && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
969                        && (CONSTRUCTOR_NELTS (rhs)
970                            == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
971                 {
972                   unsigned i;
973                   tree val, list;
974
975                   list = NULL_TREE;
976                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
977                     {
978                       if (TREE_CODE (val) == SSA_NAME
979                           && get_value (val)->lattice_val == CONSTANT)
980                         val = get_value (val)->value;
981                       if (TREE_CODE (val) == INTEGER_CST
982                           || TREE_CODE (val) == REAL_CST
983                           || TREE_CODE (val) == FIXED_CST)
984                         list = tree_cons (NULL_TREE, val, list);
985                       else
986                         return NULL_TREE;
987                     }
988
989                   return build_vector (TREE_TYPE (rhs), nreverse (list));
990                 }
991
992               if (kind == tcc_reference)
993                 {
994                   if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
995                        || TREE_CODE (rhs) == REALPART_EXPR
996                        || TREE_CODE (rhs) == IMAGPART_EXPR)
997                       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
998                     {
999                       prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
1000                       if (val->lattice_val == CONSTANT)
1001                         return fold_unary_loc (EXPR_LOCATION (rhs),
1002                                            TREE_CODE (rhs),
1003                                            TREE_TYPE (rhs), val->value);
1004                     }
1005                   else if (TREE_CODE (rhs) == INDIRECT_REF
1006                            && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
1007                     {
1008                       prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
1009                       if (val->lattice_val == CONSTANT
1010                           && TREE_CODE (val->value) == ADDR_EXPR
1011                           && useless_type_conversion_p (TREE_TYPE (rhs),
1012                                                         TREE_TYPE (TREE_TYPE (val->value))))
1013                         rhs = TREE_OPERAND (val->value, 0);
1014                     }
1015                   return fold_const_aggregate_ref (rhs);
1016                 }
1017               else if (kind == tcc_declaration)
1018                 return get_symbol_constant_value (rhs);
1019               return rhs;
1020             }
1021             
1022           case GIMPLE_UNARY_RHS:
1023             {
1024               /* Handle unary operators that can appear in GIMPLE form.
1025                  Note that we know the single operand must be a constant,
1026                  so this should almost always return a simplified RHS.  */
1027               tree lhs = gimple_assign_lhs (stmt);
1028               tree op0 = gimple_assign_rhs1 (stmt);
1029
1030               /* Simplify the operand down to a constant.  */
1031               if (TREE_CODE (op0) == SSA_NAME)
1032                 {
1033                   prop_value_t *val = get_value (op0);
1034                   if (val->lattice_val == CONSTANT)
1035                     op0 = get_value (op0)->value;
1036                 }
1037
1038               /* Conversions are useless for CCP purposes if they are
1039                  value-preserving.  Thus the restrictions that
1040                  useless_type_conversion_p places for pointer type conversions
1041                  do not apply here.  Substitution later will only substitute to
1042                  allowed places.  */
1043               if (CONVERT_EXPR_CODE_P (subcode)
1044                   && POINTER_TYPE_P (TREE_TYPE (lhs))
1045                   && POINTER_TYPE_P (TREE_TYPE (op0))
1046                   /* Do not allow differences in volatile qualification
1047                      as this might get us confused as to whether a
1048                      propagation destination statement is volatile
1049                      or not.  See PR36988.  */
1050                   && (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (lhs)))
1051                       == TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (op0)))))
1052                 {
1053                   tree tem;
1054                   /* Still try to generate a constant of correct type.  */
1055                   if (!useless_type_conversion_p (TREE_TYPE (lhs),
1056                                                   TREE_TYPE (op0))
1057                       && ((tem = maybe_fold_offset_to_address
1058                            (loc,
1059                             op0, integer_zero_node, TREE_TYPE (lhs)))
1060                           != NULL_TREE))
1061                     return tem;
1062                   return op0;
1063                 }
1064
1065               return 
1066                 fold_unary_ignore_overflow_loc (loc, subcode,
1067                                                 gimple_expr_type (stmt), op0);
1068             }
1069
1070           case GIMPLE_BINARY_RHS:
1071             {
1072               /* Handle binary operators that can appear in GIMPLE form.  */
1073               tree op0 = gimple_assign_rhs1 (stmt);
1074               tree op1 = gimple_assign_rhs2 (stmt);
1075
1076               /* Simplify the operands down to constants when appropriate.  */
1077               if (TREE_CODE (op0) == SSA_NAME)
1078                 {
1079                   prop_value_t *val = get_value (op0);
1080                   if (val->lattice_val == CONSTANT)
1081                     op0 = val->value;
1082                 }
1083
1084               if (TREE_CODE (op1) == SSA_NAME)
1085                 {
1086                   prop_value_t *val = get_value (op1);
1087                   if (val->lattice_val == CONSTANT)
1088                     op1 = val->value;
1089                 }
1090
1091               /* Fold &foo + CST into an invariant reference if possible.  */
1092               if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
1093                   && TREE_CODE (op0) == ADDR_EXPR
1094                   && TREE_CODE (op1) == INTEGER_CST)
1095                 {
1096                   tree lhs = gimple_assign_lhs (stmt);
1097                   tree tem = maybe_fold_offset_to_address
1098                     (loc, op0, op1, TREE_TYPE (lhs));
1099                   if (tem != NULL_TREE)
1100                     return tem;
1101                 }
1102
1103               return fold_binary_loc (loc, subcode,
1104                                   gimple_expr_type (stmt), op0, op1);
1105             }
1106
1107           default:
1108             gcc_unreachable ();
1109           }
1110       }
1111       break;
1112
1113     case GIMPLE_CALL:
1114       {
1115         tree fn = gimple_call_fn (stmt);
1116         prop_value_t *val;
1117
1118         if (TREE_CODE (fn) == SSA_NAME)
1119           {
1120             val = get_value (fn);
1121             if (val->lattice_val == CONSTANT)
1122               fn = val->value;
1123           }
1124         if (TREE_CODE (fn) == ADDR_EXPR
1125             && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
1126             && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
1127           {
1128             tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
1129             tree call, retval;
1130             unsigned i;
1131             for (i = 0; i < gimple_call_num_args (stmt); ++i)
1132               {
1133                 args[i] = gimple_call_arg (stmt, i);
1134                 if (TREE_CODE (args[i]) == SSA_NAME)
1135                   {
1136                     val = get_value (args[i]);
1137                     if (val->lattice_val == CONSTANT)
1138                       args[i] = val->value;
1139                   }
1140               }
1141             call = build_call_array_loc (loc,
1142                                          gimple_call_return_type (stmt),
1143                                          fn, gimple_call_num_args (stmt), args);
1144             retval = fold_call_expr (EXPR_LOCATION (call), call, false);
1145             if (retval)
1146               /* fold_call_expr wraps the result inside a NOP_EXPR.  */
1147               STRIP_NOPS (retval);
1148             return retval;
1149           }
1150         return NULL_TREE;
1151       }
1152
1153     case GIMPLE_COND:
1154       {
1155         /* Handle comparison operators that can appear in GIMPLE form.  */
1156         tree op0 = gimple_cond_lhs (stmt);
1157         tree op1 = gimple_cond_rhs (stmt);
1158         enum tree_code code = gimple_cond_code (stmt);
1159
1160         /* Simplify the operands down to constants when appropriate.  */
1161         if (TREE_CODE (op0) == SSA_NAME)
1162           {
1163             prop_value_t *val = get_value (op0);
1164             if (val->lattice_val == CONSTANT)
1165               op0 = val->value;
1166           }
1167
1168         if (TREE_CODE (op1) == SSA_NAME)
1169           {
1170             prop_value_t *val = get_value (op1);
1171             if (val->lattice_val == CONSTANT)
1172               op1 = val->value;
1173           }
1174
1175         return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
1176       }
1177
1178     case GIMPLE_SWITCH:
1179       {
1180         tree rhs = gimple_switch_index (stmt);
1181
1182         if (TREE_CODE (rhs) == SSA_NAME)
1183           {
1184             /* If the RHS is an SSA_NAME, return its known constant value,
1185                if any.  */
1186             return get_value (rhs)->value;
1187           }
1188
1189         return rhs;
1190       }
1191
1192     default:
1193       gcc_unreachable ();
1194     }
1195 }
1196
1197
1198 /* Return the tree representing the element referenced by T if T is an
1199    ARRAY_REF or COMPONENT_REF into constant aggregates.  Return
1200    NULL_TREE otherwise.  */
1201
1202 tree
1203 fold_const_aggregate_ref (tree t)
1204 {
1205   prop_value_t *value;
1206   tree base, ctor, idx, field;
1207   unsigned HOST_WIDE_INT cnt;
1208   tree cfield, cval;
1209
1210   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1211     return get_symbol_constant_value (t);
1212
1213   switch (TREE_CODE (t))
1214     {
1215     case ARRAY_REF:
1216       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1217          DECL_INITIAL.  If BASE is a nested reference into another
1218          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1219          the inner reference.  */
1220       base = TREE_OPERAND (t, 0);
1221       switch (TREE_CODE (base))
1222         {
1223         case VAR_DECL:
1224           if (!TREE_READONLY (base)
1225               || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1226               || !targetm.binds_local_p (base))
1227             return NULL_TREE;
1228
1229           ctor = DECL_INITIAL (base);
1230           break;
1231
1232         case ARRAY_REF:
1233         case COMPONENT_REF:
1234           ctor = fold_const_aggregate_ref (base);
1235           break;
1236
1237         case STRING_CST:
1238         case CONSTRUCTOR:
1239           ctor = base;
1240           break;
1241
1242         default:
1243           return NULL_TREE;
1244         }
1245
1246       if (ctor == NULL_TREE
1247           || (TREE_CODE (ctor) != CONSTRUCTOR
1248               && TREE_CODE (ctor) != STRING_CST)
1249           || !TREE_STATIC (ctor))
1250         return NULL_TREE;
1251
1252       /* Get the index.  If we have an SSA_NAME, try to resolve it
1253          with the current lattice value for the SSA_NAME.  */
1254       idx = TREE_OPERAND (t, 1);
1255       switch (TREE_CODE (idx))
1256         {
1257         case SSA_NAME:
1258           if ((value = get_value (idx))
1259               && value->lattice_val == CONSTANT
1260               && TREE_CODE (value->value) == INTEGER_CST)
1261             idx = value->value;
1262           else
1263             return NULL_TREE;
1264           break;
1265
1266         case INTEGER_CST:
1267           break;
1268
1269         default:
1270           return NULL_TREE;
1271         }
1272
1273       /* Fold read from constant string.  */
1274       if (TREE_CODE (ctor) == STRING_CST)
1275         {
1276           if ((TYPE_MODE (TREE_TYPE (t))
1277                == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1278               && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1279                   == MODE_INT)
1280               && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1281               && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
1282             return build_int_cst_type (TREE_TYPE (t),
1283                                        (TREE_STRING_POINTER (ctor)
1284                                         [TREE_INT_CST_LOW (idx)]));
1285           return NULL_TREE;
1286         }
1287
1288       /* Whoo-hoo!  I'll fold ya baby.  Yeah!  */
1289       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1290         if (tree_int_cst_equal (cfield, idx))
1291           {
1292             STRIP_USELESS_TYPE_CONVERSION (cval);
1293             if (TREE_CODE (cval) == ADDR_EXPR)
1294               {
1295                 tree base = get_base_address (TREE_OPERAND (cval, 0));
1296                 if (base && TREE_CODE (base) == VAR_DECL)
1297                   add_referenced_var (base);
1298               }
1299             return cval;
1300           }
1301       break;
1302
1303     case COMPONENT_REF:
1304       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1305          DECL_INITIAL.  If BASE is a nested reference into another
1306          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1307          the inner reference.  */
1308       base = TREE_OPERAND (t, 0);
1309       switch (TREE_CODE (base))
1310         {
1311         case VAR_DECL:
1312           if (!TREE_READONLY (base)
1313               || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1314               || !targetm.binds_local_p (base))
1315             return NULL_TREE;
1316
1317           ctor = DECL_INITIAL (base);
1318           break;
1319
1320         case ARRAY_REF:
1321         case COMPONENT_REF:
1322           ctor = fold_const_aggregate_ref (base);
1323           break;
1324
1325         default:
1326           return NULL_TREE;
1327         }
1328
1329       if (ctor == NULL_TREE
1330           || TREE_CODE (ctor) != CONSTRUCTOR
1331           || !TREE_STATIC (ctor))
1332         return NULL_TREE;
1333
1334       field = TREE_OPERAND (t, 1);
1335
1336       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1337         if (cfield == field
1338             /* FIXME: Handle bit-fields.  */
1339             && ! DECL_BIT_FIELD (cfield))
1340           {
1341             STRIP_USELESS_TYPE_CONVERSION (cval);
1342             if (TREE_CODE (cval) == ADDR_EXPR)
1343               {
1344                 tree base = get_base_address (TREE_OPERAND (cval, 0));
1345                 if (base && TREE_CODE (base) == VAR_DECL)
1346                   add_referenced_var (base);
1347               }
1348             return cval;
1349           }
1350       break;
1351
1352     case REALPART_EXPR:
1353     case IMAGPART_EXPR:
1354       {
1355         tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1356         if (c && TREE_CODE (c) == COMPLEX_CST)
1357           return fold_build1_loc (EXPR_LOCATION (t),
1358                               TREE_CODE (t), TREE_TYPE (t), c);
1359         break;
1360       }
1361
1362     case INDIRECT_REF:
1363       {
1364         tree base = TREE_OPERAND (t, 0);
1365         if (TREE_CODE (base) == SSA_NAME
1366             && (value = get_value (base))
1367             && value->lattice_val == CONSTANT
1368             && TREE_CODE (value->value) == ADDR_EXPR
1369             && useless_type_conversion_p (TREE_TYPE (t),
1370                                           TREE_TYPE (TREE_TYPE (value->value))))
1371           return fold_const_aggregate_ref (TREE_OPERAND (value->value, 0));
1372         break;
1373       }
1374
1375     default:
1376       break;
1377     }
1378
1379   return NULL_TREE;
1380 }
1381
1382 /* Evaluate statement STMT.
1383    Valid only for assignments, calls, conditionals, and switches. */
1384
1385 static prop_value_t
1386 evaluate_stmt (gimple stmt)
1387 {
1388   prop_value_t val;
1389   tree simplified = NULL_TREE;
1390   ccp_lattice_t likelyvalue = likely_value (stmt);
1391   bool is_constant;
1392
1393   fold_defer_overflow_warnings ();
1394
1395   /* If the statement is likely to have a CONSTANT result, then try
1396      to fold the statement to determine the constant value.  */
1397   /* FIXME.  This is the only place that we call ccp_fold.
1398      Since likely_value never returns CONSTANT for calls, we will
1399      not attempt to fold them, including builtins that may profit.  */
1400   if (likelyvalue == CONSTANT)
1401     simplified = ccp_fold (stmt);
1402   /* If the statement is likely to have a VARYING result, then do not
1403      bother folding the statement.  */
1404   else if (likelyvalue == VARYING)
1405     {
1406       enum gimple_code code = gimple_code (stmt);
1407       if (code == GIMPLE_ASSIGN)
1408         {
1409           enum tree_code subcode = gimple_assign_rhs_code (stmt);
1410           
1411           /* Other cases cannot satisfy is_gimple_min_invariant
1412              without folding.  */
1413           if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
1414             simplified = gimple_assign_rhs1 (stmt);
1415         }
1416       else if (code == GIMPLE_SWITCH)
1417         simplified = gimple_switch_index (stmt);
1418       else
1419         /* These cannot satisfy is_gimple_min_invariant without folding.  */
1420         gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
1421     }
1422
1423   is_constant = simplified && is_gimple_min_invariant (simplified);
1424
1425   fold_undefer_overflow_warnings (is_constant, stmt, 0);
1426
1427   if (dump_file && (dump_flags & TDF_DETAILS))
1428     {
1429       fprintf (dump_file, "which is likely ");
1430       switch (likelyvalue)
1431         {
1432         case CONSTANT:
1433           fprintf (dump_file, "CONSTANT");
1434           break;
1435         case UNDEFINED:
1436           fprintf (dump_file, "UNDEFINED");
1437           break;
1438         case VARYING:
1439           fprintf (dump_file, "VARYING");
1440           break;
1441         default:;
1442         }
1443       fprintf (dump_file, "\n");
1444     }
1445
1446   if (is_constant)
1447     {
1448       /* The statement produced a constant value.  */
1449       val.lattice_val = CONSTANT;
1450       val.value = simplified;
1451     }
1452   else
1453     {
1454       /* The statement produced a nonconstant value.  If the statement
1455          had UNDEFINED operands, then the result of the statement
1456          should be UNDEFINED.  Otherwise, the statement is VARYING.  */
1457       if (likelyvalue == UNDEFINED)
1458         val.lattice_val = likelyvalue;
1459       else
1460         val.lattice_val = VARYING;
1461
1462       val.value = NULL_TREE;
1463     }
1464
1465   return val;
1466 }
1467
1468 /* Visit the assignment statement STMT.  Set the value of its LHS to the
1469    value computed by the RHS and store LHS in *OUTPUT_P.  If STMT
1470    creates virtual definitions, set the value of each new name to that
1471    of the RHS (if we can derive a constant out of the RHS).
1472    Value-returning call statements also perform an assignment, and
1473    are handled here.  */
1474
1475 static enum ssa_prop_result
1476 visit_assignment (gimple stmt, tree *output_p)
1477 {
1478   prop_value_t val;
1479   enum ssa_prop_result retval;
1480
1481   tree lhs = gimple_get_lhs (stmt);
1482
1483   gcc_assert (gimple_code (stmt) != GIMPLE_CALL
1484               || gimple_call_lhs (stmt) != NULL_TREE);
1485
1486   if (gimple_assign_copy_p (stmt))
1487     {
1488       tree rhs = gimple_assign_rhs1 (stmt);
1489
1490       if  (TREE_CODE (rhs) == SSA_NAME)
1491         {
1492           /* For a simple copy operation, we copy the lattice values.  */
1493           prop_value_t *nval = get_value (rhs);
1494           val = *nval;
1495         }
1496       else
1497         val = evaluate_stmt (stmt);
1498     }
1499   else
1500     /* Evaluate the statement, which could be
1501        either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
1502     val = evaluate_stmt (stmt);
1503
1504   retval = SSA_PROP_NOT_INTERESTING;
1505
1506   /* Set the lattice value of the statement's output.  */
1507   if (TREE_CODE (lhs) == SSA_NAME)
1508     {
1509       /* If STMT is an assignment to an SSA_NAME, we only have one
1510          value to set.  */
1511       if (set_lattice_value (lhs, val))
1512         {
1513           *output_p = lhs;
1514           if (val.lattice_val == VARYING)
1515             retval = SSA_PROP_VARYING;
1516           else
1517             retval = SSA_PROP_INTERESTING;
1518         }
1519     }
1520
1521   return retval;
1522 }
1523
1524
1525 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
1526    if it can determine which edge will be taken.  Otherwise, return
1527    SSA_PROP_VARYING.  */
1528
1529 static enum ssa_prop_result
1530 visit_cond_stmt (gimple stmt, edge *taken_edge_p)
1531 {
1532   prop_value_t val;
1533   basic_block block;
1534
1535   block = gimple_bb (stmt);
1536   val = evaluate_stmt (stmt);
1537
1538   /* Find which edge out of the conditional block will be taken and add it
1539      to the worklist.  If no single edge can be determined statically,
1540      return SSA_PROP_VARYING to feed all the outgoing edges to the
1541      propagation engine.  */
1542   *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
1543   if (*taken_edge_p)
1544     return SSA_PROP_INTERESTING;
1545   else
1546     return SSA_PROP_VARYING;
1547 }
1548
1549
1550 /* Evaluate statement STMT.  If the statement produces an output value and
1551    its evaluation changes the lattice value of its output, return
1552    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1553    output value.
1554    
1555    If STMT is a conditional branch and we can determine its truth
1556    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
1557    value, return SSA_PROP_VARYING.  */
1558
1559 static enum ssa_prop_result
1560 ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
1561 {
1562   tree def;
1563   ssa_op_iter iter;
1564
1565   if (dump_file && (dump_flags & TDF_DETAILS))
1566     {
1567       fprintf (dump_file, "\nVisiting statement:\n");
1568       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
1569     }
1570
1571   switch (gimple_code (stmt))
1572     {
1573       case GIMPLE_ASSIGN:
1574         /* If the statement is an assignment that produces a single
1575            output value, evaluate its RHS to see if the lattice value of
1576            its output has changed.  */
1577         return visit_assignment (stmt, output_p);
1578
1579       case GIMPLE_CALL:
1580         /* A value-returning call also performs an assignment.  */
1581         if (gimple_call_lhs (stmt) != NULL_TREE)
1582           return visit_assignment (stmt, output_p);
1583         break;
1584
1585       case GIMPLE_COND:
1586       case GIMPLE_SWITCH:
1587         /* If STMT is a conditional branch, see if we can determine
1588            which branch will be taken.   */
1589         /* FIXME.  It appears that we should be able to optimize
1590            computed GOTOs here as well.  */
1591         return visit_cond_stmt (stmt, taken_edge_p);
1592
1593       default:
1594         break;
1595     }
1596
1597   /* Any other kind of statement is not interesting for constant
1598      propagation and, therefore, not worth simulating.  */
1599   if (dump_file && (dump_flags & TDF_DETAILS))
1600     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
1601
1602   /* Definitions made by statements other than assignments to
1603      SSA_NAMEs represent unknown modifications to their outputs.
1604      Mark them VARYING.  */
1605   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1606     {
1607       prop_value_t v = { VARYING, NULL_TREE };
1608       set_lattice_value (def, v);
1609     }
1610
1611   return SSA_PROP_VARYING;
1612 }
1613
1614
1615 /* Main entry point for SSA Conditional Constant Propagation.  */
1616
1617 static unsigned int
1618 do_ssa_ccp (void)
1619 {
1620   ccp_initialize ();
1621   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
1622   if (ccp_finalize ())
1623     return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
1624   else
1625     return 0;
1626 }
1627
1628
1629 static bool
1630 gate_ccp (void)
1631 {
1632   return flag_tree_ccp != 0;
1633 }
1634
1635
1636 struct gimple_opt_pass pass_ccp = 
1637 {
1638  {
1639   GIMPLE_PASS,
1640   "ccp",                                /* name */
1641   gate_ccp,                             /* gate */
1642   do_ssa_ccp,                           /* execute */
1643   NULL,                                 /* sub */
1644   NULL,                                 /* next */
1645   0,                                    /* static_pass_number */
1646   TV_TREE_CCP,                          /* tv_id */
1647   PROP_cfg | PROP_ssa,                  /* properties_required */
1648   0,                                    /* properties_provided */
1649   0,                                    /* properties_destroyed */
1650   0,                                    /* todo_flags_start */
1651   TODO_dump_func | TODO_verify_ssa
1652   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1653  }
1654 };
1655
1656
1657 /* A subroutine of fold_stmt.  Attempts to fold *(A+O) to A[X].
1658    BASE is an array type.  OFFSET is a byte displacement.  ORIG_TYPE
1659    is the desired result type.
1660
1661    LOC is the location of the original expression.  */
1662
1663 static tree
1664 maybe_fold_offset_to_array_ref (location_t loc, tree base, tree offset,
1665                                 tree orig_type,
1666                                 bool allow_negative_idx)
1667 {
1668   tree min_idx, idx, idx_type, elt_offset = integer_zero_node;
1669   tree array_type, elt_type, elt_size;
1670   tree domain_type;
1671
1672   /* If BASE is an ARRAY_REF, we can pick up another offset (this time
1673      measured in units of the size of elements type) from that ARRAY_REF).
1674      We can't do anything if either is variable.
1675
1676      The case we handle here is *(&A[N]+O).  */
1677   if (TREE_CODE (base) == ARRAY_REF)
1678     {
1679       tree low_bound = array_ref_low_bound (base);
1680
1681       elt_offset = TREE_OPERAND (base, 1);
1682       if (TREE_CODE (low_bound) != INTEGER_CST
1683           || TREE_CODE (elt_offset) != INTEGER_CST)
1684         return NULL_TREE;
1685
1686       elt_offset = int_const_binop (MINUS_EXPR, elt_offset, low_bound, 0);
1687       base = TREE_OPERAND (base, 0);
1688     }
1689
1690   /* Ignore stupid user tricks of indexing non-array variables.  */
1691   array_type = TREE_TYPE (base);
1692   if (TREE_CODE (array_type) != ARRAY_TYPE)
1693     return NULL_TREE;
1694   elt_type = TREE_TYPE (array_type);
1695   if (!useless_type_conversion_p (orig_type, elt_type))
1696     return NULL_TREE;
1697
1698   /* Use signed size type for intermediate computation on the index.  */
1699   idx_type = signed_type_for (size_type_node);
1700
1701   /* If OFFSET and ELT_OFFSET are zero, we don't care about the size of the
1702      element type (so we can use the alignment if it's not constant).
1703      Otherwise, compute the offset as an index by using a division.  If the
1704      division isn't exact, then don't do anything.  */
1705   elt_size = TYPE_SIZE_UNIT (elt_type);
1706   if (!elt_size)
1707     return NULL;
1708   if (integer_zerop (offset))
1709     {
1710       if (TREE_CODE (elt_size) != INTEGER_CST)
1711         elt_size = size_int (TYPE_ALIGN (elt_type));
1712
1713       idx = build_int_cst (idx_type, 0);
1714     }
1715   else
1716     {
1717       unsigned HOST_WIDE_INT lquo, lrem;
1718       HOST_WIDE_INT hquo, hrem;
1719       double_int soffset;
1720
1721       /* The final array offset should be signed, so we need
1722          to sign-extend the (possibly pointer) offset here
1723          and use signed division.  */
1724       soffset = double_int_sext (tree_to_double_int (offset),
1725                                  TYPE_PRECISION (TREE_TYPE (offset)));
1726       if (TREE_CODE (elt_size) != INTEGER_CST
1727           || div_and_round_double (TRUNC_DIV_EXPR, 0,
1728                                    soffset.low, soffset.high,
1729                                    TREE_INT_CST_LOW (elt_size),
1730                                    TREE_INT_CST_HIGH (elt_size),
1731                                    &lquo, &hquo, &lrem, &hrem)
1732           || lrem || hrem)
1733         return NULL_TREE;
1734
1735       idx = build_int_cst_wide (idx_type, lquo, hquo);
1736     }
1737
1738   /* Assume the low bound is zero.  If there is a domain type, get the
1739      low bound, if any, convert the index into that type, and add the
1740      low bound.  */
1741   min_idx = build_int_cst (idx_type, 0);
1742   domain_type = TYPE_DOMAIN (array_type);
1743   if (domain_type)
1744     {
1745       idx_type = domain_type;
1746       if (TYPE_MIN_VALUE (idx_type))
1747         min_idx = TYPE_MIN_VALUE (idx_type);
1748       else
1749         min_idx = fold_convert (idx_type, min_idx);
1750
1751       if (TREE_CODE (min_idx) != INTEGER_CST)
1752         return NULL_TREE;
1753
1754       elt_offset = fold_convert (idx_type, elt_offset);
1755     }
1756
1757   if (!integer_zerop (min_idx))
1758     idx = int_const_binop (PLUS_EXPR, idx, min_idx, 0);
1759   if (!integer_zerop (elt_offset))
1760     idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0);
1761
1762   /* Make sure to possibly truncate late after offsetting.  */
1763   idx = fold_convert (idx_type, idx);
1764
1765   /* We don't want to construct access past array bounds. For example
1766        char *(c[4]);
1767        c[3][2];
1768      should not be simplified into (*c)[14] or tree-vrp will
1769      give false warnings.  The same is true for
1770        struct A { long x; char d[0]; } *a;
1771        (char *)a - 4;
1772      which should be not folded to &a->d[-8].  */
1773   if (domain_type
1774       && TYPE_MAX_VALUE (domain_type) 
1775       && TREE_CODE (TYPE_MAX_VALUE (domain_type)) == INTEGER_CST)
1776     {
1777       tree up_bound = TYPE_MAX_VALUE (domain_type);
1778
1779       if (tree_int_cst_lt (up_bound, idx)
1780           /* Accesses after the end of arrays of size 0 (gcc
1781              extension) and 1 are likely intentional ("struct
1782              hack").  */
1783           && compare_tree_int (up_bound, 1) > 0)
1784         return NULL_TREE;
1785     }
1786   if (domain_type
1787       && TYPE_MIN_VALUE (domain_type))
1788     {
1789       if (!allow_negative_idx
1790           && TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST
1791           && tree_int_cst_lt (idx, TYPE_MIN_VALUE (domain_type)))
1792         return NULL_TREE;
1793     }
1794   else if (!allow_negative_idx
1795            && compare_tree_int (idx, 0) < 0)
1796     return NULL_TREE;
1797
1798   {
1799     tree t = build4 (ARRAY_REF, elt_type, base, idx, NULL_TREE, NULL_TREE);
1800     SET_EXPR_LOCATION (t, loc);
1801     return t;
1802   }
1803 }
1804
1805
1806 /* Attempt to fold *(S+O) to S.X.
1807    BASE is a record type.  OFFSET is a byte displacement.  ORIG_TYPE
1808    is the desired result type.
1809
1810    LOC is the location of the original expression.  */
1811
1812 static tree
1813 maybe_fold_offset_to_component_ref (location_t loc, tree record_type,
1814                                     tree base, tree offset,
1815                                     tree orig_type, bool base_is_ptr)
1816 {
1817   tree f, t, field_type, tail_array_field, field_offset;
1818   tree ret;
1819   tree new_base;
1820
1821   if (TREE_CODE (record_type) != RECORD_TYPE
1822       && TREE_CODE (record_type) != UNION_TYPE
1823       && TREE_CODE (record_type) != QUAL_UNION_TYPE)
1824     return NULL_TREE;
1825
1826   /* Short-circuit silly cases.  */
1827   if (useless_type_conversion_p (record_type, orig_type))
1828     return NULL_TREE;
1829
1830   tail_array_field = NULL_TREE;
1831   for (f = TYPE_FIELDS (record_type); f ; f = TREE_CHAIN (f))
1832     {
1833       int cmp;
1834
1835       if (TREE_CODE (f) != FIELD_DECL)
1836         continue;
1837       if (DECL_BIT_FIELD (f))
1838         continue;
1839
1840       if (!DECL_FIELD_OFFSET (f))
1841         continue;
1842       field_offset = byte_position (f);
1843       if (TREE_CODE (field_offset) != INTEGER_CST)
1844         continue;
1845
1846       /* ??? Java creates "interesting" fields for representing base classes.
1847          They have no name, and have no context.  With no context, we get into
1848          trouble with nonoverlapping_component_refs_p.  Skip them.  */
1849       if (!DECL_FIELD_CONTEXT (f))
1850         continue;
1851
1852       /* The previous array field isn't at the end.  */
1853       tail_array_field = NULL_TREE;
1854
1855       /* Check to see if this offset overlaps with the field.  */
1856       cmp = tree_int_cst_compare (field_offset, offset);
1857       if (cmp > 0)
1858         continue;
1859
1860       field_type = TREE_TYPE (f);
1861
1862       /* Here we exactly match the offset being checked.  If the types match,
1863          then we can return that field.  */
1864       if (cmp == 0
1865           && useless_type_conversion_p (orig_type, field_type))
1866         {
1867           if (base_is_ptr)
1868             base = build1 (INDIRECT_REF, record_type, base);
1869           t = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
1870           return t;
1871         }
1872       
1873       /* Don't care about offsets into the middle of scalars.  */
1874       if (!AGGREGATE_TYPE_P (field_type))
1875         continue;
1876
1877       /* Check for array at the end of the struct.  This is often
1878          used as for flexible array members.  We should be able to
1879          turn this into an array access anyway.  */
1880       if (TREE_CODE (field_type) == ARRAY_TYPE)
1881         tail_array_field = f;
1882
1883       /* Check the end of the field against the offset.  */
1884       if (!DECL_SIZE_UNIT (f)
1885           || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
1886         continue;
1887       t = int_const_binop (MINUS_EXPR, offset, field_offset, 1);
1888       if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
1889         continue;
1890
1891       /* If we matched, then set offset to the displacement into
1892          this field.  */
1893       if (base_is_ptr)
1894         new_base = build1 (INDIRECT_REF, record_type, base);
1895       else
1896         new_base = base;
1897       protected_set_expr_location (new_base, loc);
1898       new_base = build3 (COMPONENT_REF, field_type, new_base, f, NULL_TREE);
1899       protected_set_expr_location (new_base, loc);
1900
1901       /* Recurse to possibly find the match.  */
1902       ret = maybe_fold_offset_to_array_ref (loc, new_base, t, orig_type,
1903                                             f == TYPE_FIELDS (record_type));
1904       if (ret)
1905         return ret;
1906       ret = maybe_fold_offset_to_component_ref (loc, field_type, new_base, t,
1907                                                 orig_type, false);
1908       if (ret)
1909         return ret;
1910     }
1911
1912   if (!tail_array_field)
1913     return NULL_TREE;
1914
1915   f = tail_array_field;
1916   field_type = TREE_TYPE (f);
1917   offset = int_const_binop (MINUS_EXPR, offset, byte_position (f), 1);
1918
1919   /* If we get here, we've got an aggregate field, and a possibly 
1920      nonzero offset into them.  Recurse and hope for a valid match.  */
1921   if (base_is_ptr)
1922     {
1923       base = build1 (INDIRECT_REF, record_type, base);
1924       SET_EXPR_LOCATION (base, loc);
1925     }
1926   base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
1927   SET_EXPR_LOCATION (base, loc);
1928
1929   t = maybe_fold_offset_to_array_ref (loc, base, offset, orig_type,
1930                                       f == TYPE_FIELDS (record_type));
1931   if (t)
1932     return t;
1933   return maybe_fold_offset_to_component_ref (loc, field_type, base, offset,
1934                                              orig_type, false);
1935 }
1936
1937 /* Attempt to express (ORIG_TYPE)BASE+OFFSET as BASE->field_of_orig_type
1938    or BASE[index] or by combination of those.
1939
1940    LOC is the location of original expression.
1941
1942    Before attempting the conversion strip off existing ADDR_EXPRs and
1943    handled component refs.  */
1944
1945 tree
1946 maybe_fold_offset_to_reference (location_t loc, tree base, tree offset,
1947                                 tree orig_type)
1948 {
1949   tree ret;
1950   tree type;
1951   bool base_is_ptr = true;
1952
1953   STRIP_NOPS (base);
1954   if (TREE_CODE (base) == ADDR_EXPR)
1955     {
1956       base_is_ptr = false;
1957
1958       base = TREE_OPERAND (base, 0);
1959
1960       /* Handle case where existing COMPONENT_REF pick e.g. wrong field of union,
1961          so it needs to be removed and new COMPONENT_REF constructed.
1962          The wrong COMPONENT_REF are often constructed by folding the
1963          (type *)&object within the expression (type *)&object+offset  */
1964       if (handled_component_p (base))
1965         {
1966           HOST_WIDE_INT sub_offset, size, maxsize;
1967           tree newbase;
1968           newbase = get_ref_base_and_extent (base, &sub_offset,
1969                                              &size, &maxsize);
1970           gcc_assert (newbase);
1971           if (size == maxsize
1972               && size != -1
1973               && !(sub_offset & (BITS_PER_UNIT - 1)))
1974             {
1975               base = newbase;
1976               if (sub_offset)
1977                 offset = int_const_binop (PLUS_EXPR, offset,
1978                                           build_int_cst (TREE_TYPE (offset),
1979                                           sub_offset / BITS_PER_UNIT), 1);
1980             }
1981         }
1982       if (useless_type_conversion_p (orig_type, TREE_TYPE (base))
1983           && integer_zerop (offset))
1984         return base;
1985       type = TREE_TYPE (base);
1986     }
1987   else
1988     {
1989       base_is_ptr = true;
1990       if (!POINTER_TYPE_P (TREE_TYPE (base)))
1991         return NULL_TREE;
1992       type = TREE_TYPE (TREE_TYPE (base));
1993     }
1994   ret = maybe_fold_offset_to_component_ref (loc, type, base, offset,
1995                                             orig_type, base_is_ptr);
1996   if (!ret)
1997     {
1998       if (base_is_ptr)
1999         {
2000           base = build1 (INDIRECT_REF, type, base);
2001           SET_EXPR_LOCATION (base, loc);
2002         }
2003       ret = maybe_fold_offset_to_array_ref (loc,
2004                                             base, offset, orig_type, true);
2005     }
2006   return ret;
2007 }
2008
2009 /* Attempt to express (ORIG_TYPE)&BASE+OFFSET as &BASE->field_of_orig_type
2010    or &BASE[index] or by combination of those.
2011
2012    LOC is the location of the original expression.
2013
2014    Before attempting the conversion strip off existing component refs.  */
2015
2016 tree
2017 maybe_fold_offset_to_address (location_t loc, tree addr, tree offset,
2018                               tree orig_type)
2019 {
2020   tree t;
2021
2022   gcc_assert (POINTER_TYPE_P (TREE_TYPE (addr))
2023               && POINTER_TYPE_P (orig_type));
2024
2025   t = maybe_fold_offset_to_reference (loc, addr, offset,
2026                                       TREE_TYPE (orig_type));
2027   if (t != NULL_TREE)
2028     {
2029       tree orig = addr;
2030       tree ptr_type;
2031
2032       /* For __builtin_object_size to function correctly we need to
2033          make sure not to fold address arithmetic so that we change
2034          reference from one array to another.  This would happen for
2035          example for
2036
2037            struct X { char s1[10]; char s2[10] } s;
2038            char *foo (void) { return &s.s2[-4]; }
2039
2040          where we need to avoid generating &s.s1[6].  As the C and
2041          C++ frontends create different initial trees
2042          (char *) &s.s1 + -4  vs.  &s.s1[-4]  we have to do some
2043          sophisticated comparisons here.  Note that checking for the
2044          condition after the fact is easier than trying to avoid doing
2045          the folding.  */
2046       STRIP_NOPS (orig);
2047       if (TREE_CODE (orig) == ADDR_EXPR)
2048         orig = TREE_OPERAND (orig, 0);
2049       if ((TREE_CODE (orig) == ARRAY_REF
2050            || (TREE_CODE (orig) == COMPONENT_REF
2051                && TREE_CODE (TREE_TYPE (TREE_OPERAND (orig, 1))) == ARRAY_TYPE))
2052           && (TREE_CODE (t) == ARRAY_REF
2053               || TREE_CODE (t) == COMPONENT_REF)
2054           && !operand_equal_p (TREE_CODE (orig) == ARRAY_REF
2055                                ? TREE_OPERAND (orig, 0) : orig,
2056                                TREE_CODE (t) == ARRAY_REF
2057                                ? TREE_OPERAND (t, 0) : t, 0))
2058         return NULL_TREE;
2059
2060       ptr_type = build_pointer_type (TREE_TYPE (t));
2061       if (!useless_type_conversion_p (orig_type, ptr_type))
2062         return NULL_TREE;
2063       return build_fold_addr_expr_with_type_loc (loc, t, ptr_type);
2064     }
2065
2066   return NULL_TREE;
2067 }
2068
2069 /* A subroutine of fold_stmt.  Attempt to simplify *(BASE+OFFSET).
2070    Return the simplified expression, or NULL if nothing could be done.  */
2071
2072 static tree
2073 maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
2074 {
2075   tree t;
2076   bool volatile_p = TREE_THIS_VOLATILE (expr);
2077   location_t loc = EXPR_LOCATION (expr);
2078
2079   /* We may well have constructed a double-nested PLUS_EXPR via multiple
2080      substitutions.  Fold that down to one.  Remove NON_LVALUE_EXPRs that
2081      are sometimes added.  */
2082   base = fold (base);
2083   STRIP_TYPE_NOPS (base);
2084   TREE_OPERAND (expr, 0) = base;
2085
2086   /* One possibility is that the address reduces to a string constant.  */
2087   t = fold_read_from_constant_string (expr);
2088   if (t)
2089     return t;
2090
2091   /* Add in any offset from a POINTER_PLUS_EXPR.  */
2092   if (TREE_CODE (base) == POINTER_PLUS_EXPR)
2093     {
2094       tree offset2;
2095
2096       offset2 = TREE_OPERAND (base, 1);
2097       if (TREE_CODE (offset2) != INTEGER_CST)
2098         return NULL_TREE;
2099       base = TREE_OPERAND (base, 0);
2100
2101       offset = fold_convert (sizetype,
2102                              int_const_binop (PLUS_EXPR, offset, offset2, 1));
2103     }
2104
2105   if (TREE_CODE (base) == ADDR_EXPR)
2106     {
2107       tree base_addr = base;
2108
2109       /* Strip the ADDR_EXPR.  */
2110       base = TREE_OPERAND (base, 0);
2111
2112       /* Fold away CONST_DECL to its value, if the type is scalar.  */
2113       if (TREE_CODE (base) == CONST_DECL
2114           && is_gimple_min_invariant (DECL_INITIAL (base)))
2115         return DECL_INITIAL (base);
2116
2117       /* Try folding *(&B+O) to B.X.  */
2118       t = maybe_fold_offset_to_reference (loc, base_addr, offset,
2119                                           TREE_TYPE (expr));
2120       if (t)
2121         {
2122           /* Preserve volatileness of the original expression.
2123              We can end up with a plain decl here which is shared
2124              and we shouldn't mess with its flags.  */
2125           if (!SSA_VAR_P (t))
2126             TREE_THIS_VOLATILE (t) = volatile_p;
2127           return t;
2128         }
2129     }
2130   else
2131     {
2132       /* We can get here for out-of-range string constant accesses, 
2133          such as "_"[3].  Bail out of the entire substitution search
2134          and arrange for the entire statement to be replaced by a
2135          call to __builtin_trap.  In all likelihood this will all be
2136          constant-folded away, but in the meantime we can't leave with
2137          something that get_expr_operands can't understand.  */
2138
2139       t = base;
2140       STRIP_NOPS (t);
2141       if (TREE_CODE (t) == ADDR_EXPR
2142           && TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)
2143         {
2144           /* FIXME: Except that this causes problems elsewhere with dead
2145              code not being deleted, and we die in the rtl expanders 
2146              because we failed to remove some ssa_name.  In the meantime,
2147              just return zero.  */
2148           /* FIXME2: This condition should be signaled by
2149              fold_read_from_constant_string directly, rather than 
2150              re-checking for it here.  */
2151           return integer_zero_node;
2152         }
2153
2154       /* Try folding *(B+O) to B->X.  Still an improvement.  */
2155       if (POINTER_TYPE_P (TREE_TYPE (base)))
2156         {
2157           t = maybe_fold_offset_to_reference (loc, base, offset,
2158                                               TREE_TYPE (expr));
2159           if (t)
2160             return t;
2161         }
2162     }
2163
2164   /* Otherwise we had an offset that we could not simplify.  */
2165   return NULL_TREE;
2166 }
2167
2168
2169 /* A quaint feature extant in our address arithmetic is that there
2170    can be hidden type changes here.  The type of the result need
2171    not be the same as the type of the input pointer.
2172
2173    What we're after here is an expression of the form
2174         (T *)(&array + const)
2175    where array is OP0, const is OP1, RES_TYPE is T and
2176    the cast doesn't actually exist, but is implicit in the
2177    type of the POINTER_PLUS_EXPR.  We'd like to turn this into
2178         &array[x]
2179    which may be able to propagate further.  */
2180
2181 tree
2182 maybe_fold_stmt_addition (location_t loc, tree res_type, tree op0, tree op1)
2183 {
2184   tree ptd_type;
2185   tree t;
2186
2187   /* The first operand should be an ADDR_EXPR.  */
2188   if (TREE_CODE (op0) != ADDR_EXPR)
2189     return NULL_TREE;
2190   op0 = TREE_OPERAND (op0, 0);
2191
2192   /* It had better be a constant.  */
2193   if (TREE_CODE (op1) != INTEGER_CST)
2194     {
2195       /* Or op0 should now be A[0] and the non-constant offset defined
2196          via a multiplication by the array element size.  */
2197       if (TREE_CODE (op0) == ARRAY_REF
2198           && integer_zerop (TREE_OPERAND (op0, 1))
2199           && TREE_CODE (op1) == SSA_NAME
2200           && host_integerp (TYPE_SIZE_UNIT (TREE_TYPE (op0)), 1))
2201         {
2202           gimple offset_def = SSA_NAME_DEF_STMT (op1);
2203           if (!is_gimple_assign (offset_def))
2204             return NULL_TREE;
2205
2206           if (gimple_assign_rhs_code (offset_def) == MULT_EXPR
2207               && TREE_CODE (gimple_assign_rhs2 (offset_def)) == INTEGER_CST
2208               && tree_int_cst_equal (gimple_assign_rhs2 (offset_def),
2209                                      TYPE_SIZE_UNIT (TREE_TYPE (op0))))
2210             return build1 (ADDR_EXPR, res_type,
2211                            build4 (ARRAY_REF, TREE_TYPE (op0),
2212                                    TREE_OPERAND (op0, 0),
2213                                    gimple_assign_rhs1 (offset_def),
2214                                    TREE_OPERAND (op0, 2),
2215                                    TREE_OPERAND (op0, 3)));
2216           else if (integer_onep (TYPE_SIZE_UNIT (TREE_TYPE (op0)))
2217                    && gimple_assign_rhs_code (offset_def) != MULT_EXPR)
2218             return build1 (ADDR_EXPR, res_type,
2219                            build4 (ARRAY_REF, TREE_TYPE (op0),
2220                                    TREE_OPERAND (op0, 0),
2221                                    op1,
2222                                    TREE_OPERAND (op0, 2),
2223                                    TREE_OPERAND (op0, 3)));
2224         }
2225       return NULL_TREE;
2226     }
2227
2228   /* If the first operand is an ARRAY_REF, expand it so that we can fold
2229      the offset into it.  */
2230   while (TREE_CODE (op0) == ARRAY_REF)
2231     {
2232       tree array_obj = TREE_OPERAND (op0, 0);
2233       tree array_idx = TREE_OPERAND (op0, 1);
2234       tree elt_type = TREE_TYPE (op0);
2235       tree elt_size = TYPE_SIZE_UNIT (elt_type);
2236       tree min_idx;
2237
2238       if (TREE_CODE (array_idx) != INTEGER_CST)
2239         break;
2240       if (TREE_CODE (elt_size) != INTEGER_CST)
2241         break;
2242
2243       /* Un-bias the index by the min index of the array type.  */
2244       min_idx = TYPE_DOMAIN (TREE_TYPE (array_obj));
2245       if (min_idx)
2246         {
2247           min_idx = TYPE_MIN_VALUE (min_idx);
2248           if (min_idx)
2249             {
2250               if (TREE_CODE (min_idx) != INTEGER_CST)
2251                 break;
2252
2253               array_idx = fold_convert (TREE_TYPE (min_idx), array_idx);
2254               if (!integer_zerop (min_idx))
2255                 array_idx = int_const_binop (MINUS_EXPR, array_idx,
2256                                              min_idx, 0);
2257             }
2258         }
2259
2260       /* Convert the index to a byte offset.  */
2261       array_idx = fold_convert (sizetype, array_idx);
2262       array_idx = int_const_binop (MULT_EXPR, array_idx, elt_size, 0);
2263
2264       /* Update the operands for the next round, or for folding.  */
2265       op1 = int_const_binop (PLUS_EXPR,
2266                              array_idx, op1, 0);
2267       op0 = array_obj;
2268     }
2269
2270   ptd_type = TREE_TYPE (res_type);
2271   /* If we want a pointer to void, reconstruct the reference from the
2272      array element type.  A pointer to that can be trivially converted
2273      to void *.  This happens as we fold (void *)(ptr p+ off).  */
2274   if (VOID_TYPE_P (ptd_type)
2275       && TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
2276     ptd_type = TREE_TYPE (TREE_TYPE (op0));
2277
2278   /* At which point we can try some of the same things as for indirects.  */
2279   t = maybe_fold_offset_to_array_ref (loc, op0, op1, ptd_type, true);
2280   if (!t)
2281     t = maybe_fold_offset_to_component_ref (loc, TREE_TYPE (op0), op0, op1,
2282                                             ptd_type, false);
2283   if (t)
2284     {
2285       t = build1 (ADDR_EXPR, res_type, t);
2286       SET_EXPR_LOCATION (t, loc);
2287     }
2288
2289   return t;
2290 }
2291
2292 /* Subroutine of fold_stmt.  We perform several simplifications of the
2293    memory reference tree EXPR and make sure to re-gimplify them properly
2294    after propagation of constant addresses.  IS_LHS is true if the
2295    reference is supposed to be an lvalue.  */
2296
2297 static tree
2298 maybe_fold_reference (tree expr, bool is_lhs)
2299 {
2300   tree *t = &expr;
2301
2302   if (TREE_CODE (expr) == ARRAY_REF
2303       && !is_lhs)
2304     {
2305       tree tem = fold_read_from_constant_string (expr);
2306       if (tem)
2307         return tem;
2308     }
2309
2310   /* ???  We might want to open-code the relevant remaining cases
2311      to avoid using the generic fold.  */
2312   if (handled_component_p (*t)
2313       && CONSTANT_CLASS_P (TREE_OPERAND (*t, 0)))
2314     {
2315       tree tem = fold (*t);
2316       if (tem != *t)
2317         return tem;
2318     }
2319
2320   while (handled_component_p (*t))
2321     t = &TREE_OPERAND (*t, 0);
2322
2323   if (TREE_CODE (*t) == INDIRECT_REF)
2324     {
2325       tree tem = maybe_fold_stmt_indirect (*t, TREE_OPERAND (*t, 0),
2326                                            integer_zero_node);
2327       /* Avoid folding *"abc" = 5 into 'a' = 5.  */
2328       if (is_lhs && tem && CONSTANT_CLASS_P (tem))
2329         tem = NULL_TREE;
2330       if (!tem
2331           && TREE_CODE (TREE_OPERAND (*t, 0)) == ADDR_EXPR)
2332         /* If we had a good reason for propagating the address here,
2333            make sure we end up with valid gimple.  See PR34989.  */
2334         tem = TREE_OPERAND (TREE_OPERAND (*t, 0), 0);
2335
2336       if (tem)
2337         {
2338           *t = tem;
2339           tem = maybe_fold_reference (expr, is_lhs);
2340           if (tem)
2341             return tem;
2342           return expr;
2343         }
2344     }
2345   else if (!is_lhs
2346            && DECL_P (*t))
2347     {
2348       tree tem = get_symbol_constant_value (*t);
2349       if (tem)
2350         {
2351           *t = tem;
2352           tem = maybe_fold_reference (expr, is_lhs);
2353           if (tem)
2354             return tem;
2355           return expr;
2356         }
2357     }
2358
2359   return NULL_TREE;
2360 }
2361
2362
2363 /* Return the string length, maximum string length or maximum value of
2364    ARG in LENGTH.
2365    If ARG is an SSA name variable, follow its use-def chains.  If LENGTH
2366    is not NULL and, for TYPE == 0, its value is not equal to the length
2367    we determine or if we are unable to determine the length or value,
2368    return false.  VISITED is a bitmap of visited variables.
2369    TYPE is 0 if string length should be returned, 1 for maximum string
2370    length and 2 for maximum value ARG can have.  */
2371
2372 static bool
2373 get_maxval_strlen (tree arg, tree *length, bitmap visited, int type)
2374 {
2375   tree var, val;
2376   gimple def_stmt;
2377   
2378   if (TREE_CODE (arg) != SSA_NAME)
2379     {
2380       if (TREE_CODE (arg) == COND_EXPR)
2381         return get_maxval_strlen (COND_EXPR_THEN (arg), length, visited, type)
2382                && get_maxval_strlen (COND_EXPR_ELSE (arg), length, visited, type);
2383       /* We can end up with &(*iftmp_1)[0] here as well, so handle it.  */
2384       else if (TREE_CODE (arg) == ADDR_EXPR
2385                && TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF
2386                && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg, 0), 1)))
2387         {
2388           tree aop0 = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
2389           if (TREE_CODE (aop0) == INDIRECT_REF
2390               && TREE_CODE (TREE_OPERAND (aop0, 0)) == SSA_NAME)
2391             return get_maxval_strlen (TREE_OPERAND (aop0, 0),
2392                                       length, visited, type);
2393         }
2394
2395       if (type == 2)
2396         {
2397           val = arg;
2398           if (TREE_CODE (val) != INTEGER_CST
2399               || tree_int_cst_sgn (val) < 0)
2400             return false;
2401         }
2402       else
2403         val = c_strlen (arg, 1);
2404       if (!val)
2405         return false;
2406
2407       if (*length)
2408         {
2409           if (type > 0)
2410             {
2411               if (TREE_CODE (*length) != INTEGER_CST
2412                   || TREE_CODE (val) != INTEGER_CST)
2413                 return false;
2414
2415               if (tree_int_cst_lt (*length, val))
2416                 *length = val;
2417               return true;
2418             }
2419           else if (simple_cst_equal (val, *length) != 1)
2420             return false;
2421         }
2422
2423       *length = val;
2424       return true;
2425     }
2426
2427   /* If we were already here, break the infinite cycle.  */
2428   if (bitmap_bit_p (visited, SSA_NAME_VERSION (arg)))
2429     return true;
2430   bitmap_set_bit (visited, SSA_NAME_VERSION (arg));
2431
2432   var = arg;
2433   def_stmt = SSA_NAME_DEF_STMT (var);
2434
2435   switch (gimple_code (def_stmt))
2436     {
2437       case GIMPLE_ASSIGN:
2438         /* The RHS of the statement defining VAR must either have a
2439            constant length or come from another SSA_NAME with a constant
2440            length.  */
2441         if (gimple_assign_single_p (def_stmt)
2442             || gimple_assign_unary_nop_p (def_stmt))
2443           {
2444             tree rhs = gimple_assign_rhs1 (def_stmt);
2445             return get_maxval_strlen (rhs, length, visited, type);
2446           }
2447         return false;
2448
2449       case GIMPLE_PHI:
2450         {
2451           /* All the arguments of the PHI node must have the same constant
2452              length.  */
2453           unsigned i;
2454
2455           for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
2456           {
2457             tree arg = gimple_phi_arg (def_stmt, i)->def;
2458
2459             /* If this PHI has itself as an argument, we cannot
2460                determine the string length of this argument.  However,
2461                if we can find a constant string length for the other
2462                PHI args then we can still be sure that this is a
2463                constant string length.  So be optimistic and just
2464                continue with the next argument.  */
2465             if (arg == gimple_phi_result (def_stmt))
2466               continue;
2467
2468             if (!get_maxval_strlen (arg, length, visited, type))
2469               return false;
2470           }
2471         }
2472         return true;        
2473
2474       default:
2475         return false;
2476     }
2477 }
2478
2479
2480 /* Fold builtin call in statement STMT.  Returns a simplified tree.
2481    We may return a non-constant expression, including another call
2482    to a different function and with different arguments, e.g.,
2483    substituting memcpy for strcpy when the string length is known.
2484    Note that some builtins expand into inline code that may not
2485    be valid in GIMPLE.  Callers must take care.  */
2486
2487 static tree
2488 ccp_fold_builtin (gimple stmt)
2489 {
2490   tree result, val[3];
2491   tree callee, a;
2492   int arg_idx, type;
2493   bitmap visited;
2494   bool ignore;
2495   int nargs;
2496   location_t loc = gimple_location (stmt);
2497
2498   gcc_assert (is_gimple_call (stmt));
2499
2500   ignore = (gimple_call_lhs (stmt) == NULL);
2501
2502   /* First try the generic builtin folder.  If that succeeds, return the
2503      result directly.  */
2504   result = fold_call_stmt (stmt, ignore);
2505   if (result)
2506     {
2507       if (ignore)
2508         STRIP_NOPS (result);
2509       return result;
2510     }
2511
2512   /* Ignore MD builtins.  */
2513   callee = gimple_call_fndecl (stmt);
2514   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
2515     return NULL_TREE;
2516
2517   /* If the builtin could not be folded, and it has no argument list,
2518      we're done.  */
2519   nargs = gimple_call_num_args (stmt);
2520   if (nargs == 0)
2521     return NULL_TREE;
2522
2523   /* Limit the work only for builtins we know how to simplify.  */
2524   switch (DECL_FUNCTION_CODE (callee))
2525     {
2526     case BUILT_IN_STRLEN:
2527     case BUILT_IN_FPUTS:
2528     case BUILT_IN_FPUTS_UNLOCKED:
2529       arg_idx = 0;
2530       type = 0;
2531       break;
2532     case BUILT_IN_STRCPY:
2533     case BUILT_IN_STRNCPY:
2534       arg_idx = 1;
2535       type = 0;
2536       break;
2537     case BUILT_IN_MEMCPY_CHK:
2538     case BUILT_IN_MEMPCPY_CHK:
2539     case BUILT_IN_MEMMOVE_CHK:
2540     case BUILT_IN_MEMSET_CHK:
2541     case BUILT_IN_STRNCPY_CHK:
2542       arg_idx = 2;
2543       type = 2;
2544       break;
2545     case BUILT_IN_STRCPY_CHK:
2546     case BUILT_IN_STPCPY_CHK:
2547       arg_idx = 1;
2548       type = 1;
2549       break;
2550     case BUILT_IN_SNPRINTF_CHK:
2551     case BUILT_IN_VSNPRINTF_CHK:
2552       arg_idx = 1;
2553       type = 2;
2554       break;
2555     default:
2556       return NULL_TREE;
2557     }
2558
2559   if (arg_idx >= nargs)
2560     return NULL_TREE;
2561
2562   /* Try to use the dataflow information gathered by the CCP process.  */
2563   visited = BITMAP_ALLOC (NULL);
2564   bitmap_clear (visited);
2565
2566   memset (val, 0, sizeof (val));
2567   a = gimple_call_arg (stmt, arg_idx);
2568   if (!get_maxval_strlen (a, &val[arg_idx], visited, type))
2569     val[arg_idx] = NULL_TREE;
2570
2571   BITMAP_FREE (visited);
2572
2573   result = NULL_TREE;
2574   switch (DECL_FUNCTION_CODE (callee))
2575     {
2576     case BUILT_IN_STRLEN:
2577       if (val[0] && nargs == 1)
2578         {
2579           tree new_val =
2580               fold_convert (TREE_TYPE (gimple_call_lhs (stmt)), val[0]);
2581
2582           /* If the result is not a valid gimple value, or not a cast
2583              of a valid gimple value, then we can not use the result.  */
2584           if (is_gimple_val (new_val)
2585               || (is_gimple_cast (new_val)
2586                   && is_gimple_val (TREE_OPERAND (new_val, 0))))
2587             return new_val;
2588         }
2589       break;
2590
2591     case BUILT_IN_STRCPY:
2592       if (val[1] && is_gimple_val (val[1]) && nargs == 2)
2593         result = fold_builtin_strcpy (loc, callee,
2594                                       gimple_call_arg (stmt, 0),
2595                                       gimple_call_arg (stmt, 1),
2596                                       val[1]);
2597       break;
2598
2599     case BUILT_IN_STRNCPY:
2600       if (val[1] && is_gimple_val (val[1]) && nargs == 3)
2601         result = fold_builtin_strncpy (loc, callee,
2602                                        gimple_call_arg (stmt, 0),
2603                                        gimple_call_arg (stmt, 1),
2604                                        gimple_call_arg (stmt, 2),
2605                                        val[1]);
2606       break;
2607
2608     case BUILT_IN_FPUTS:
2609       if (nargs == 2)
2610         result = fold_builtin_fputs (loc, gimple_call_arg (stmt, 0),
2611                                      gimple_call_arg (stmt, 1),
2612                                      ignore, false, val[0]);
2613       break;
2614
2615     case BUILT_IN_FPUTS_UNLOCKED:
2616       if (nargs == 2)
2617         result = fold_builtin_fputs (loc, gimple_call_arg (stmt, 0),
2618                                      gimple_call_arg (stmt, 1),
2619                                      ignore, true, val[0]);
2620       break;
2621
2622     case BUILT_IN_MEMCPY_CHK:
2623     case BUILT_IN_MEMPCPY_CHK:
2624     case BUILT_IN_MEMMOVE_CHK:
2625     case BUILT_IN_MEMSET_CHK:
2626       if (val[2] && is_gimple_val (val[2]) && nargs == 4)
2627         result = fold_builtin_memory_chk (loc, callee,
2628                                           gimple_call_arg (stmt, 0),
2629                                           gimple_call_arg (stmt, 1),
2630                                           gimple_call_arg (stmt, 2),
2631                                           gimple_call_arg (stmt, 3),
2632                                           val[2], ignore,
2633                                           DECL_FUNCTION_CODE (callee));
2634       break;
2635
2636     case BUILT_IN_STRCPY_CHK:
2637     case BUILT_IN_STPCPY_CHK:
2638       if (val[1] && is_gimple_val (val[1]) && nargs == 3)
2639         result = fold_builtin_stxcpy_chk (loc, callee,
2640                                           gimple_call_arg (stmt, 0),
2641                                           gimple_call_arg (stmt, 1),
2642                                           gimple_call_arg (stmt, 2),
2643                                           val[1], ignore,
2644                                           DECL_FUNCTION_CODE (callee));
2645       break;
2646
2647     case BUILT_IN_STRNCPY_CHK:
2648       if (val[2] && is_gimple_val (val[2]) && nargs == 4)
2649         result = fold_builtin_strncpy_chk (loc, gimple_call_arg (stmt, 0),
2650                                            gimple_call_arg (stmt, 1),
2651                                            gimple_call_arg (stmt, 2),
2652                                            gimple_call_arg (stmt, 3),
2653                                            val[2]);
2654       break;
2655
2656     case BUILT_IN_SNPRINTF_CHK:
2657     case BUILT_IN_VSNPRINTF_CHK:
2658       if (val[1] && is_gimple_val (val[1]))
2659         result = gimple_fold_builtin_snprintf_chk (stmt, val[1],
2660                                                    DECL_FUNCTION_CODE (callee));
2661       break;
2662
2663     default:
2664       gcc_unreachable ();
2665     }
2666
2667   if (result && ignore)
2668     result = fold_ignored_result (result);
2669   return result;
2670 }
2671
2672 /* Attempt to fold an assignment statement pointed-to by SI.  Returns a
2673    replacement rhs for the statement or NULL_TREE if no simplification
2674    could be made.  It is assumed that the operands have been previously
2675    folded.  */
2676
2677 static tree
2678 fold_gimple_assign (gimple_stmt_iterator *si)
2679 {
2680   gimple stmt = gsi_stmt (*si);
2681   enum tree_code subcode = gimple_assign_rhs_code (stmt);
2682   location_t loc = gimple_location (stmt);
2683
2684   tree result = NULL_TREE;
2685
2686   switch (get_gimple_rhs_class (subcode))
2687     {
2688     case GIMPLE_SINGLE_RHS:
2689       {
2690         tree rhs = gimple_assign_rhs1 (stmt);
2691
2692         /* Try to fold a conditional expression.  */
2693         if (TREE_CODE (rhs) == COND_EXPR)
2694           {
2695             tree op0 = COND_EXPR_COND (rhs);
2696             tree tem;
2697             bool set = false;
2698             location_t cond_loc = EXPR_LOCATION (rhs);
2699
2700             if (COMPARISON_CLASS_P (op0))
2701               {
2702                 fold_defer_overflow_warnings ();
2703                 tem = fold_binary_loc (cond_loc,
2704                                    TREE_CODE (op0), TREE_TYPE (op0),
2705                                    TREE_OPERAND (op0, 0),
2706                                    TREE_OPERAND (op0, 1));
2707                 /* This is actually a conditional expression, not a GIMPLE
2708                    conditional statement, however, the valid_gimple_rhs_p
2709                    test still applies.  */
2710                 set = (tem && is_gimple_condexpr (tem)
2711                        && valid_gimple_rhs_p (tem));
2712                 fold_undefer_overflow_warnings (set, stmt, 0);
2713               }
2714             else if (is_gimple_min_invariant (op0))
2715               {
2716                 tem = op0;
2717                 set = true;
2718               }
2719             else
2720               return NULL_TREE;
2721
2722             if (set)
2723               result = fold_build3_loc (cond_loc, COND_EXPR, TREE_TYPE (rhs), tem,
2724                                     COND_EXPR_THEN (rhs), COND_EXPR_ELSE (rhs));
2725           }
2726
2727         else if (TREE_CODE (rhs) == TARGET_MEM_REF)
2728           return maybe_fold_tmr (rhs);
2729
2730         else if (REFERENCE_CLASS_P (rhs))
2731           return maybe_fold_reference (rhs, false);
2732
2733         else if (TREE_CODE (rhs) == ADDR_EXPR)
2734           {
2735             tree tem = maybe_fold_reference (TREE_OPERAND (rhs, 0), true);
2736             if (tem)
2737               result = fold_convert (TREE_TYPE (rhs),
2738                                      build_fold_addr_expr_loc (loc, tem));
2739           }
2740
2741         else if (TREE_CODE (rhs) == CONSTRUCTOR
2742                  && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
2743                  && (CONSTRUCTOR_NELTS (rhs)
2744                      == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
2745           {
2746             /* Fold a constant vector CONSTRUCTOR to VECTOR_CST.  */
2747             unsigned i;
2748             tree val;
2749
2750             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
2751               if (TREE_CODE (val) != INTEGER_CST
2752                   && TREE_CODE (val) != REAL_CST
2753                   && TREE_CODE (val) != FIXED_CST)
2754                 return NULL_TREE;
2755
2756             return build_vector_from_ctor (TREE_TYPE (rhs),
2757                                            CONSTRUCTOR_ELTS (rhs));
2758           }
2759
2760         else if (DECL_P (rhs))
2761           return get_symbol_constant_value (rhs);
2762
2763         /* If we couldn't fold the RHS, hand over to the generic
2764            fold routines.  */
2765         if (result == NULL_TREE)
2766           result = fold (rhs);
2767
2768         /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR
2769            that may have been added by fold, and "useless" type 
2770            conversions that might now be apparent due to propagation.  */
2771         STRIP_USELESS_TYPE_CONVERSION (result);
2772
2773         if (result != rhs && valid_gimple_rhs_p (result))
2774           return result;
2775
2776         return NULL_TREE;
2777       }
2778       break;
2779
2780     case GIMPLE_UNARY_RHS:
2781       {
2782         tree rhs = gimple_assign_rhs1 (stmt);
2783
2784         result = fold_unary_loc (loc, subcode, gimple_expr_type (stmt), rhs);
2785         if (result)
2786           {
2787             /* If the operation was a conversion do _not_ mark a
2788                resulting constant with TREE_OVERFLOW if the original
2789                constant was not.  These conversions have implementation
2790                defined behavior and retaining the TREE_OVERFLOW flag
2791                here would confuse later passes such as VRP.  */
2792             if (CONVERT_EXPR_CODE_P (subcode)
2793                 && TREE_CODE (result) == INTEGER_CST
2794                 && TREE_CODE (rhs) == INTEGER_CST)
2795               TREE_OVERFLOW (result) = TREE_OVERFLOW (rhs);
2796
2797             STRIP_USELESS_TYPE_CONVERSION (result);
2798             if (valid_gimple_rhs_p (result))
2799               return result;
2800           }
2801         else if (CONVERT_EXPR_CODE_P (subcode)
2802                  && POINTER_TYPE_P (gimple_expr_type (stmt))
2803                  && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
2804           {
2805             tree type = gimple_expr_type (stmt);
2806             tree t = maybe_fold_offset_to_address (loc,
2807                                                    gimple_assign_rhs1 (stmt),
2808                                                    integer_zero_node, type);
2809             if (t)
2810               return t;
2811           }
2812       }
2813       break;
2814
2815     case GIMPLE_BINARY_RHS:
2816       /* Try to fold pointer addition.  */
2817       if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
2818         {
2819           tree type = TREE_TYPE (gimple_assign_rhs1 (stmt));
2820           if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
2821             {
2822               type = build_pointer_type (TREE_TYPE (TREE_TYPE (type)));
2823               if (!useless_type_conversion_p
2824                     (TREE_TYPE (gimple_assign_lhs (stmt)), type))
2825                 type = TREE_TYPE (gimple_assign_rhs1 (stmt));
2826             }
2827           result = maybe_fold_stmt_addition (gimple_location (stmt),
2828                                              type,
2829                                              gimple_assign_rhs1 (stmt),
2830                                              gimple_assign_rhs2 (stmt));
2831         }
2832
2833       if (!result)
2834         result = fold_binary_loc (loc, subcode,
2835                               TREE_TYPE (gimple_assign_lhs (stmt)),
2836                               gimple_assign_rhs1 (stmt),
2837                               gimple_assign_rhs2 (stmt));
2838
2839       if (result)
2840         {
2841           STRIP_USELESS_TYPE_CONVERSION (result);
2842           if (valid_gimple_rhs_p (result))
2843             return result;
2844
2845           /* Fold might have produced non-GIMPLE, so if we trust it blindly
2846              we lose canonicalization opportunities.  Do not go again
2847              through fold here though, or the same non-GIMPLE will be
2848              produced.  */
2849           if (commutative_tree_code (subcode)
2850               && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
2851                                        gimple_assign_rhs2 (stmt), false))
2852             return build2 (subcode, TREE_TYPE (gimple_assign_lhs (stmt)),
2853                            gimple_assign_rhs2 (stmt),
2854                            gimple_assign_rhs1 (stmt));
2855         }
2856       break;
2857
2858     case GIMPLE_INVALID_RHS:
2859       gcc_unreachable ();
2860     }
2861
2862   return NULL_TREE;
2863 }
2864
2865 /* Attempt to fold a conditional statement. Return true if any changes were
2866    made. We only attempt to fold the condition expression, and do not perform
2867    any transformation that would require alteration of the cfg.  It is
2868    assumed that the operands have been previously folded.  */
2869
2870 static bool
2871 fold_gimple_cond (gimple stmt)
2872 {
2873   tree result = fold_binary_loc (gimple_location (stmt),
2874                              gimple_cond_code (stmt),
2875                              boolean_type_node,
2876                              gimple_cond_lhs (stmt),
2877                              gimple_cond_rhs (stmt));
2878
2879   if (result)
2880     {
2881       STRIP_USELESS_TYPE_CONVERSION (result);
2882       if (is_gimple_condexpr (result) && valid_gimple_rhs_p (result))
2883         {
2884           gimple_cond_set_condition_from_tree (stmt, result);
2885           return true;
2886         }
2887     }
2888
2889   return false;
2890 }
2891
2892
2893 /* Attempt to fold a call statement referenced by the statement iterator GSI.
2894    The statement may be replaced by another statement, e.g., if the call
2895    simplifies to a constant value. Return true if any changes were made.
2896    It is assumed that the operands have been previously folded.  */
2897
2898 static bool
2899 fold_gimple_call (gimple_stmt_iterator *gsi)
2900 {
2901   gimple stmt = gsi_stmt (*gsi);
2902
2903   tree callee = gimple_call_fndecl (stmt);
2904
2905   /* Check for builtins that CCP can handle using information not
2906      available in the generic fold routines.  */
2907   if (callee && DECL_BUILT_IN (callee))
2908     {
2909       tree result = ccp_fold_builtin (stmt);
2910
2911       if (result)
2912         return update_call_from_tree (gsi, result);
2913     }
2914   else
2915     {
2916       /* Check for resolvable OBJ_TYPE_REF.  The only sorts we can resolve
2917          here are when we've propagated the address of a decl into the
2918          object slot.  */
2919       /* ??? Should perhaps do this in fold proper.  However, doing it
2920          there requires that we create a new CALL_EXPR, and that requires
2921          copying EH region info to the new node.  Easier to just do it
2922          here where we can just smash the call operand.  */
2923       /* ??? Is there a good reason not to do this in fold_stmt_inplace?  */
2924       callee = gimple_call_fn (stmt);
2925       if (TREE_CODE (callee) == OBJ_TYPE_REF
2926           && lang_hooks.fold_obj_type_ref
2927           && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
2928           && DECL_P (TREE_OPERAND
2929                      (OBJ_TYPE_REF_OBJECT (callee), 0)))
2930         {
2931           tree t;
2932
2933           /* ??? Caution: Broken ADDR_EXPR semantics means that
2934              looking at the type of the operand of the addr_expr
2935              can yield an array type.  See silly exception in
2936              check_pointer_types_r.  */
2937           t = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (callee)));
2938           t = lang_hooks.fold_obj_type_ref (callee, t);
2939           if (t)
2940             {
2941               gimple_call_set_fn (stmt, t);
2942               return true;
2943             }
2944         }
2945     }
2946
2947   return false;
2948 }
2949
2950 /* Worker for both fold_stmt and fold_stmt_inplace.  The INPLACE argument
2951    distinguishes both cases.  */
2952
2953 static bool
2954 fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
2955 {
2956   bool changed = false;
2957   gimple stmt = gsi_stmt (*gsi);
2958   unsigned i;
2959
2960   /* Fold the main computation performed by the statement.  */
2961   switch (gimple_code (stmt))
2962     {
2963     case GIMPLE_ASSIGN:
2964       {
2965         unsigned old_num_ops = gimple_num_ops (stmt);
2966         tree new_rhs = fold_gimple_assign (gsi);
2967         if (new_rhs != NULL_TREE
2968             && (!inplace
2969                 || get_gimple_rhs_num_ops (TREE_CODE (new_rhs)) < old_num_ops))
2970           {
2971             gimple_assign_set_rhs_from_tree (gsi, new_rhs);
2972             changed = true;
2973           }
2974         break;
2975       }
2976
2977     case GIMPLE_COND:
2978       changed |= fold_gimple_cond (stmt);
2979       break;
2980
2981     case GIMPLE_CALL:
2982       /* Fold *& in call arguments.  */
2983       for (i = 0; i < gimple_call_num_args (stmt); ++i)
2984         if (REFERENCE_CLASS_P (gimple_call_arg (stmt, i)))
2985           {
2986             tree tmp = maybe_fold_reference (gimple_call_arg (stmt, i), false);
2987             if (tmp)
2988               {
2989                 gimple_call_set_arg (stmt, i, tmp);
2990                 changed = true;
2991               }
2992           }
2993       /* The entire statement may be replaced in this case.  */
2994       if (!inplace)
2995         changed |= fold_gimple_call (gsi);
2996       break;
2997
2998     case GIMPLE_ASM:
2999       /* Fold *& in asm operands.  */
3000       for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
3001         {
3002           tree link = gimple_asm_output_op (stmt, i);
3003           tree op = TREE_VALUE (link);
3004           if (REFERENCE_CLASS_P (op)
3005               && (op = maybe_fold_reference (op, true)) != NULL_TREE)
3006             {
3007               TREE_VALUE (link) = op;
3008               changed = true;
3009             }
3010         }
3011       for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
3012         {
3013           tree link = gimple_asm_input_op (stmt, i);
3014           tree op = TREE_VALUE (link);
3015           if (REFERENCE_CLASS_P (op)
3016               && (op = maybe_fold_reference (op, false)) != NULL_TREE)
3017             {
3018               TREE_VALUE (link) = op;
3019               changed = true;
3020             }
3021         }
3022       break;
3023
3024     default:;
3025     }
3026
3027   stmt = gsi_stmt (*gsi);
3028
3029   /* Fold *& on the lhs.  */
3030   if (gimple_has_lhs (stmt))
3031     {
3032       tree lhs = gimple_get_lhs (stmt);
3033       if (lhs && REFERENCE_CLASS_P (lhs))
3034         {
3035           tree new_lhs = maybe_fold_reference (lhs, true);
3036           if (new_lhs)
3037             {
3038               gimple_set_lhs (stmt, new_lhs);
3039               changed = true;
3040             }
3041         }
3042     }
3043
3044   return changed;
3045 }
3046
3047 /* Fold the statement pointed to by GSI.  In some cases, this function may
3048    replace the whole statement with a new one.  Returns true iff folding
3049    makes any changes.
3050    The statement pointed to by GSI should be in valid gimple form but may
3051    be in unfolded state as resulting from for example constant propagation
3052    which can produce *&x = 0.  */
3053
3054 bool
3055 fold_stmt (gimple_stmt_iterator *gsi)
3056 {
3057   return fold_stmt_1 (gsi, false);
3058 }
3059
3060 /* Perform the minimal folding on statement STMT.  Only operations like
3061    *&x created by constant propagation are handled.  The statement cannot
3062    be replaced with a new one.  Return true if the statement was
3063    changed, false otherwise.
3064    The statement STMT should be in valid gimple form but may
3065    be in unfolded state as resulting from for example constant propagation
3066    which can produce *&x = 0.  */
3067
3068 bool
3069 fold_stmt_inplace (gimple stmt)
3070 {
3071   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
3072   bool changed = fold_stmt_1 (&gsi, true);
3073   gcc_assert (gsi_stmt (gsi) == stmt);
3074   return changed;
3075 }
3076
3077 /* Try to optimize out __builtin_stack_restore.  Optimize it out
3078    if there is another __builtin_stack_restore in the same basic
3079    block and no calls or ASM_EXPRs are in between, or if this block's
3080    only outgoing edge is to EXIT_BLOCK and there are no calls or
3081    ASM_EXPRs after this __builtin_stack_restore.  */
3082
3083 static tree
3084 optimize_stack_restore (gimple_stmt_iterator i)
3085 {
3086   tree callee, rhs;
3087   gimple stmt, stack_save;
3088   gimple_stmt_iterator stack_save_gsi;
3089
3090   basic_block bb = gsi_bb (i);
3091   gimple call = gsi_stmt (i);
3092
3093   if (gimple_code (call) != GIMPLE_CALL
3094       || gimple_call_num_args (call) != 1
3095       || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
3096       || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
3097     return NULL_TREE;
3098
3099   for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
3100     {
3101       stmt = gsi_stmt (i);
3102       if (gimple_code (stmt) == GIMPLE_ASM)
3103         return NULL_TREE;
3104       if (gimple_code (stmt) != GIMPLE_CALL)
3105         continue;
3106
3107       callee = gimple_call_fndecl (stmt);
3108       if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
3109         return NULL_TREE;
3110
3111       if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
3112         break;
3113     }
3114
3115   if (gsi_end_p (i)
3116       && (! single_succ_p (bb)
3117           || single_succ_edge (bb)->dest != EXIT_BLOCK_PTR))
3118     return NULL_TREE;
3119
3120   stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
3121   if (gimple_code (stack_save) != GIMPLE_CALL
3122       || gimple_call_lhs (stack_save) != gimple_call_arg (call, 0)
3123       || stmt_could_throw_p (stack_save)
3124       || !has_single_use (gimple_call_arg (call, 0)))
3125     return NULL_TREE;
3126
3127   callee = gimple_call_fndecl (stack_save);
3128   if (!callee
3129       || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
3130       || DECL_FUNCTION_CODE (callee) != BUILT_IN_STACK_SAVE
3131       || gimple_call_num_args (stack_save) != 0)
3132     return NULL_TREE;
3133
3134   stack_save_gsi = gsi_for_stmt (stack_save);
3135   rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
3136   if (!update_call_from_tree (&stack_save_gsi, rhs))
3137     return NULL_TREE;
3138
3139   /* No effect, so the statement will be deleted.  */
3140   return integer_zero_node;
3141 }
3142
3143 /* If va_list type is a simple pointer and nothing special is needed,
3144    optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
3145    __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
3146    pointer assignment.  */
3147
3148 static tree
3149 optimize_stdarg_builtin (gimple call)
3150 {
3151   tree callee, lhs, rhs, cfun_va_list;
3152   bool va_list_simple_ptr;
3153   location_t loc = gimple_location (call);
3154
3155   if (gimple_code (call) != GIMPLE_CALL)
3156     return NULL_TREE;
3157
3158   callee = gimple_call_fndecl (call);
3159
3160   cfun_va_list = targetm.fn_abi_va_list (callee);
3161   va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
3162                        && (TREE_TYPE (cfun_va_list) == void_type_node
3163                            || TREE_TYPE (cfun_va_list) == char_type_node);
3164
3165   switch (DECL_FUNCTION_CODE (callee))
3166     {
3167     case BUILT_IN_VA_START:
3168       if (!va_list_simple_ptr
3169           || targetm.expand_builtin_va_start != NULL
3170           || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
3171         return NULL_TREE;
3172
3173       if (gimple_call_num_args (call) != 2)
3174         return NULL_TREE;
3175
3176       lhs = gimple_call_arg (call, 0);
3177       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3178           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
3179              != TYPE_MAIN_VARIANT (cfun_va_list))
3180         return NULL_TREE;
3181       
3182       lhs = build_fold_indirect_ref_loc (loc, lhs);
3183       rhs = build_call_expr_loc (loc, built_in_decls[BUILT_IN_NEXT_ARG],
3184                              1, integer_zero_node);
3185       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
3186       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3187
3188     case BUILT_IN_VA_COPY:
3189       if (!va_list_simple_ptr)
3190         return NULL_TREE;
3191
3192       if (gimple_call_num_args (call) != 2)
3193         return NULL_TREE;
3194
3195       lhs = gimple_call_arg (call, 0);
3196       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3197           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
3198              != TYPE_MAIN_VARIANT (cfun_va_list))
3199         return NULL_TREE;
3200
3201       lhs = build_fold_indirect_ref_loc (loc, lhs);
3202       rhs = gimple_call_arg (call, 1);
3203       if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
3204           != TYPE_MAIN_VARIANT (cfun_va_list))
3205         return NULL_TREE;
3206
3207       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
3208       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3209
3210     case BUILT_IN_VA_END:
3211       /* No effect, so the statement will be deleted.  */
3212       return integer_zero_node;
3213
3214     default:
3215       gcc_unreachable ();
3216     }
3217 }
3218
3219 /* Convert EXPR into a GIMPLE value suitable for substitution on the
3220    RHS of an assignment.  Insert the necessary statements before
3221    iterator *SI_P.  The statement at *SI_P, which must be a GIMPLE_CALL
3222    is replaced.  If the call is expected to produces a result, then it
3223    is replaced by an assignment of the new RHS to the result variable.
3224    If the result is to be ignored, then the call is replaced by a
3225    GIMPLE_NOP.  */
3226
3227 static void
3228 gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr)
3229 {
3230   tree lhs;
3231   tree tmp = NULL_TREE;  /* Silence warning.  */
3232   gimple stmt, new_stmt;
3233   gimple_stmt_iterator i;
3234   gimple_seq stmts = gimple_seq_alloc();
3235   struct gimplify_ctx gctx;
3236
3237   stmt = gsi_stmt (*si_p);
3238
3239   gcc_assert (is_gimple_call (stmt));
3240
3241   lhs = gimple_call_lhs (stmt);
3242
3243   push_gimplify_context (&gctx);
3244
3245   if (lhs == NULL_TREE)
3246     gimplify_and_add (expr, &stmts);
3247   else 
3248     tmp = get_initialized_tmp_var (expr, &stmts, NULL);
3249
3250   pop_gimplify_context (NULL);
3251
3252   if (gimple_has_location (stmt))
3253     annotate_all_with_location (stmts, gimple_location (stmt));
3254
3255   /* The replacement can expose previously unreferenced variables.  */
3256   for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
3257   {
3258     new_stmt = gsi_stmt (i);
3259     find_new_referenced_vars (new_stmt);
3260     gsi_insert_before (si_p, new_stmt, GSI_NEW_STMT);
3261     mark_symbols_for_renaming (new_stmt);
3262     gsi_next (si_p);
3263   }
3264
3265   if (lhs == NULL_TREE)
3266     {
3267       new_stmt = gimple_build_nop ();
3268       unlink_stmt_vdef (stmt);
3269       release_defs (stmt);
3270     }
3271   else
3272     {
3273       new_stmt = gimple_build_assign (lhs, tmp);
3274       gimple_set_vuse (new_stmt, gimple_vuse (stmt));
3275       gimple_set_vdef (new_stmt, gimple_vdef (stmt));
3276       move_ssa_defining_stmt_for_defs (new_stmt, stmt);
3277     }
3278
3279   gimple_set_location (new_stmt, gimple_location (stmt));
3280   gsi_replace (si_p, new_stmt, false);
3281 }
3282
3283 /* A simple pass that attempts to fold all builtin functions.  This pass
3284    is run after we've propagated as many constants as we can.  */
3285
3286 static unsigned int
3287 execute_fold_all_builtins (void)
3288 {
3289   bool cfg_changed = false;
3290   basic_block bb;
3291   unsigned int todoflags = 0;
3292   
3293   FOR_EACH_BB (bb)
3294     {
3295       gimple_stmt_iterator i;
3296       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
3297         {
3298           gimple stmt, old_stmt;
3299           tree callee, result;
3300           enum built_in_function fcode;
3301
3302           stmt = gsi_stmt (i);
3303
3304           if (gimple_code (stmt) != GIMPLE_CALL)
3305             {
3306               gsi_next (&i);
3307               continue;
3308             }
3309           callee = gimple_call_fndecl (stmt);
3310           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
3311             {
3312               gsi_next (&i);
3313               continue;
3314             }
3315           fcode = DECL_FUNCTION_CODE (callee);
3316
3317           result = ccp_fold_builtin (stmt);
3318
3319           if (result)
3320             gimple_remove_stmt_histograms (cfun, stmt);
3321
3322           if (!result)
3323             switch (DECL_FUNCTION_CODE (callee))
3324               {
3325               case BUILT_IN_CONSTANT_P:
3326                 /* Resolve __builtin_constant_p.  If it hasn't been
3327                    folded to integer_one_node by now, it's fairly
3328                    certain that the value simply isn't constant.  */
3329                 result = integer_zero_node;
3330                 break;
3331
3332               case BUILT_IN_STACK_RESTORE:
3333                 result = optimize_stack_restore (i);
3334                 if (result)
3335                   break;
3336                 gsi_next (&i);
3337                 continue;
3338
3339               case BUILT_IN_VA_START:
3340               case BUILT_IN_VA_END:
3341               case BUILT_IN_VA_COPY:
3342                 /* These shouldn't be folded before pass_stdarg.  */
3343                 result = optimize_stdarg_builtin (stmt);
3344                 if (result)
3345                   break;
3346                 /* FALLTHRU */
3347
3348               default:
3349                 gsi_next (&i);
3350                 continue;
3351               }
3352
3353           if (dump_file && (dump_flags & TDF_DETAILS))
3354             {
3355               fprintf (dump_file, "Simplified\n  ");
3356               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
3357             }
3358
3359           old_stmt = stmt;
3360           if (!update_call_from_tree (&i, result))
3361             {
3362               gimplify_and_update_call_from_tree (&i, result);
3363               todoflags |= TODO_update_address_taken;
3364             }
3365
3366           stmt = gsi_stmt (i);
3367           update_stmt (stmt);
3368
3369           if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
3370               && gimple_purge_dead_eh_edges (bb))
3371             cfg_changed = true;
3372
3373           if (dump_file && (dump_flags & TDF_DETAILS))
3374             {
3375               fprintf (dump_file, "to\n  ");
3376               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
3377               fprintf (dump_file, "\n");
3378             }
3379
3380           /* Retry the same statement if it changed into another
3381              builtin, there might be new opportunities now.  */
3382           if (gimple_code (stmt) != GIMPLE_CALL)
3383             {
3384               gsi_next (&i);
3385               continue;
3386             }
3387           callee = gimple_call_fndecl (stmt);
3388           if (!callee
3389               || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
3390               || DECL_FUNCTION_CODE (callee) == fcode)
3391             gsi_next (&i);
3392         }
3393     }
3394   
3395   /* Delete unreachable blocks.  */
3396   if (cfg_changed)
3397     todoflags |= TODO_cleanup_cfg;
3398   
3399   return todoflags;
3400 }
3401
3402
3403 struct gimple_opt_pass pass_fold_builtins = 
3404 {
3405  {
3406   GIMPLE_PASS,
3407   "fab",                                /* name */
3408   NULL,                                 /* gate */
3409   execute_fold_all_builtins,            /* execute */
3410   NULL,                                 /* sub */
3411   NULL,                                 /* next */
3412   0,                                    /* static_pass_number */
3413   TV_NONE,                              /* tv_id */
3414   PROP_cfg | PROP_ssa,                  /* properties_required */
3415   0,                                    /* properties_provided */
3416   0,                                    /* properties_destroyed */
3417   0,                                    /* todo_flags_start */
3418   TODO_dump_func
3419     | TODO_verify_ssa
3420     | TODO_update_ssa                   /* todo_flags_finish */
3421  }
3422 };