OSDN Git Service

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