OSDN Git Service

PR debug/46307
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-ccp.c
1 /* Conditional constant propagation pass for the GNU compiler.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010 Free Software Foundation, Inc.
4    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
5    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any
12 later version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* Conditional constant propagation (CCP) is based on the SSA
24    propagation engine (tree-ssa-propagate.c).  Constant assignments of
25    the form VAR = CST are propagated from the assignments into uses of
26    VAR, which in turn may generate new constants.  The simulation uses
27    a four level lattice to keep track of constant values associated
28    with SSA names.  Given an SSA name V_i, it may take one of the
29    following values:
30
31         UNINITIALIZED   ->  the initial state of the value.  This value
32                             is replaced with a correct initial value
33                             the first time the value is used, so the
34                             rest of the pass does not need to care about
35                             it.  Using this value simplifies initialization
36                             of the pass, and prevents us from needlessly
37                             scanning statements that are never reached.
38
39         UNDEFINED       ->  V_i is a local variable whose definition
40                             has not been processed yet.  Therefore we
41                             don't yet know if its value is a constant
42                             or not.
43
44         CONSTANT        ->  V_i has been found to hold a constant
45                             value C.
46
47         VARYING         ->  V_i cannot take a constant value, or if it
48                             does, it is not possible to determine it
49                             at compile time.
50
51    The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
52
53    1- In ccp_visit_stmt, we are interested in assignments whose RHS
54       evaluates into a constant and conditional jumps whose predicate
55       evaluates into a boolean true or false.  When an assignment of
56       the form V_i = CONST is found, V_i's lattice value is set to
57       CONSTANT and CONST is associated with it.  This causes the
58       propagation engine to add all the SSA edges coming out the
59       assignment into the worklists, so that statements that use V_i
60       can be visited.
61
62       If the statement is a conditional with a constant predicate, we
63       mark the outgoing edges as executable or not executable
64       depending on the predicate's value.  This is then used when
65       visiting PHI nodes to know when a PHI argument can be ignored.
66
67
68    2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
69       same constant C, then the LHS of the PHI is set to C.  This
70       evaluation is known as the "meet operation".  Since one of the
71       goals of this evaluation is to optimistically return constant
72       values as often as possible, it uses two main short cuts:
73
74       - If an argument is flowing in through a non-executable edge, it
75         is ignored.  This is useful in cases like this:
76
77                         if (PRED)
78                           a_9 = 3;
79                         else
80                           a_10 = 100;
81                         a_11 = PHI (a_9, a_10)
82
83         If PRED is known to always evaluate to false, then we can
84         assume that a_11 will always take its value from a_10, meaning
85         that instead of consider it VARYING (a_9 and a_10 have
86         different values), we can consider it CONSTANT 100.
87
88       - If an argument has an UNDEFINED value, then it does not affect
89         the outcome of the meet operation.  If a variable V_i has an
90         UNDEFINED value, it means that either its defining statement
91         hasn't been visited yet or V_i has no defining statement, in
92         which case the original symbol 'V' is being used
93         uninitialized.  Since 'V' is a local variable, the compiler
94         may assume any initial value for it.
95
96
97    After propagation, every variable V_i that ends up with a lattice
98    value of CONSTANT will have the associated constant value in the
99    array CONST_VAL[i].VALUE.  That is fed into substitute_and_fold for
100    final substitution and folding.
101
102    References:
103
104      Constant propagation with conditional branches,
105      Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
106
107      Building an Optimizing Compiler,
108      Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
109
110      Advanced Compiler Design and Implementation,
111      Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6  */
112
113 #include "config.h"
114 #include "system.h"
115 #include "coretypes.h"
116 #include "tm.h"
117 #include "tree.h"
118 #include "flags.h"
119 #include "tm_p.h"
120 #include "basic-block.h"
121 #include "output.h"
122 #include "function.h"
123 #include "tree-pretty-print.h"
124 #include "gimple-pretty-print.h"
125 #include "timevar.h"
126 #include "tree-dump.h"
127 #include "tree-flow.h"
128 #include "tree-pass.h"
129 #include "tree-ssa-propagate.h"
130 #include "value-prof.h"
131 #include "langhooks.h"
132 #include "target.h"
133 #include "diagnostic-core.h"
134 #include "toplev.h"
135 #include "dbgcnt.h"
136
137
138 /* Possible lattice values.  */
139 typedef enum
140 {
141   UNINITIALIZED,
142   UNDEFINED,
143   CONSTANT,
144   VARYING
145 } ccp_lattice_t;
146
147 struct prop_value_d {
148     /* Lattice value.  */
149     ccp_lattice_t lattice_val;
150
151     /* Propagated value.  */
152     tree value;
153
154     /* Mask that applies to the propagated value during CCP.  For
155        X with a CONSTANT lattice value X & ~mask == value & ~mask.  */
156     double_int mask;
157 };
158
159 typedef struct prop_value_d prop_value_t;
160
161 /* Array of propagated constant values.  After propagation,
162    CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I).  If
163    the constant is held in an SSA name representing a memory store
164    (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
165    memory reference used to store (i.e., the LHS of the assignment
166    doing the store).  */
167 static prop_value_t *const_val;
168
169 static void canonicalize_float_value (prop_value_t *);
170 static bool ccp_fold_stmt (gimple_stmt_iterator *);
171 static tree fold_ctor_reference (tree type, tree ctor,
172                                  unsigned HOST_WIDE_INT offset,
173                                  unsigned HOST_WIDE_INT size);
174
175 /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX.  */
176
177 static void
178 dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
179 {
180   switch (val.lattice_val)
181     {
182     case UNINITIALIZED:
183       fprintf (outf, "%sUNINITIALIZED", prefix);
184       break;
185     case UNDEFINED:
186       fprintf (outf, "%sUNDEFINED", prefix);
187       break;
188     case VARYING:
189       fprintf (outf, "%sVARYING", prefix);
190       break;
191     case CONSTANT:
192       fprintf (outf, "%sCONSTANT ", prefix);
193       if (TREE_CODE (val.value) != INTEGER_CST
194           || double_int_zero_p (val.mask))
195         print_generic_expr (outf, val.value, dump_flags);
196       else
197         {
198           double_int cval = double_int_and_not (tree_to_double_int (val.value),
199                                                 val.mask);
200           fprintf (outf, "%sCONSTANT " HOST_WIDE_INT_PRINT_DOUBLE_HEX,
201                    prefix, cval.high, cval.low);
202           fprintf (outf, " (" HOST_WIDE_INT_PRINT_DOUBLE_HEX ")",
203                    val.mask.high, val.mask.low);
204         }
205       break;
206     default:
207       gcc_unreachable ();
208     }
209 }
210
211
212 /* Print lattice value VAL to stderr.  */
213
214 void debug_lattice_value (prop_value_t val);
215
216 DEBUG_FUNCTION void
217 debug_lattice_value (prop_value_t val)
218 {
219   dump_lattice_value (stderr, "", val);
220   fprintf (stderr, "\n");
221 }
222
223
224 /* Compute a default value for variable VAR and store it in the
225    CONST_VAL array.  The following rules are used to get default
226    values:
227
228    1- Global and static variables that are declared constant are
229       considered CONSTANT.
230
231    2- Any other value is considered UNDEFINED.  This is useful when
232       considering PHI nodes.  PHI arguments that are undefined do not
233       change the constant value of the PHI node, which allows for more
234       constants to be propagated.
235
236    3- Variables defined by statements other than assignments and PHI
237       nodes are considered VARYING.
238
239    4- Initial values of variables that are not GIMPLE registers are
240       considered VARYING.  */
241
242 static prop_value_t
243 get_default_value (tree var)
244 {
245   tree sym = SSA_NAME_VAR (var);
246   prop_value_t val = { UNINITIALIZED, NULL_TREE, { 0, 0 } };
247   gimple stmt;
248
249   stmt = SSA_NAME_DEF_STMT (var);
250
251   if (gimple_nop_p (stmt))
252     {
253       /* Variables defined by an empty statement are those used
254          before being initialized.  If VAR is a local variable, we
255          can assume initially that it is UNDEFINED, otherwise we must
256          consider it VARYING.  */
257       if (is_gimple_reg (sym)
258           && TREE_CODE (sym) == VAR_DECL)
259         val.lattice_val = UNDEFINED;
260       else
261         {
262           val.lattice_val = VARYING;
263           val.mask = double_int_minus_one;
264         }
265     }
266   else if (is_gimple_assign (stmt)
267            /* Value-returning GIMPLE_CALL statements assign to
268               a variable, and are treated similarly to GIMPLE_ASSIGN.  */
269            || (is_gimple_call (stmt)
270                && gimple_call_lhs (stmt) != NULL_TREE)
271            || gimple_code (stmt) == GIMPLE_PHI)
272     {
273       tree cst;
274       if (gimple_assign_single_p (stmt)
275           && DECL_P (gimple_assign_rhs1 (stmt))
276           && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
277         {
278           val.lattice_val = CONSTANT;
279           val.value = cst;
280         }
281       else
282         /* Any other variable defined by an assignment or a PHI node
283            is considered UNDEFINED.  */
284         val.lattice_val = UNDEFINED;
285     }
286   else
287     {
288       /* Otherwise, VAR will never take on a constant value.  */
289       val.lattice_val = VARYING;
290       val.mask = double_int_minus_one;
291     }
292
293   return val;
294 }
295
296
297 /* Get the constant value associated with variable VAR.  */
298
299 static inline prop_value_t *
300 get_value (tree var)
301 {
302   prop_value_t *val;
303
304   if (const_val == NULL)
305     return NULL;
306
307   val = &const_val[SSA_NAME_VERSION (var)];
308   if (val->lattice_val == UNINITIALIZED)
309     *val = get_default_value (var);
310
311   canonicalize_float_value (val);
312
313   return val;
314 }
315
316 /* Return the constant tree value associated with VAR.  */
317
318 static inline tree
319 get_constant_value (tree var)
320 {
321   prop_value_t *val;
322   if (TREE_CODE (var) != SSA_NAME)
323     {
324       if (is_gimple_min_invariant (var))
325         return var;
326       return NULL_TREE;
327     }
328   val = get_value (var);
329   if (val
330       && val->lattice_val == CONSTANT
331       && (TREE_CODE (val->value) != INTEGER_CST
332           || double_int_zero_p (val->mask)))
333     return val->value;
334   return NULL_TREE;
335 }
336
337 /* Sets the value associated with VAR to VARYING.  */
338
339 static inline void
340 set_value_varying (tree var)
341 {
342   prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
343
344   val->lattice_val = VARYING;
345   val->value = NULL_TREE;
346   val->mask = double_int_minus_one;
347 }
348
349 /* For float types, modify the value of VAL to make ccp work correctly
350    for non-standard values (-0, NaN):
351
352    If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
353    If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
354      This is to fix the following problem (see PR 29921): Suppose we have
355
356      x = 0.0 * y
357
358      and we set value of y to NaN.  This causes value of x to be set to NaN.
359      When we later determine that y is in fact VARYING, fold uses the fact
360      that HONOR_NANS is false, and we try to change the value of x to 0,
361      causing an ICE.  With HONOR_NANS being false, the real appearance of
362      NaN would cause undefined behavior, though, so claiming that y (and x)
363      are UNDEFINED initially is correct.  */
364
365 static void
366 canonicalize_float_value (prop_value_t *val)
367 {
368   enum machine_mode mode;
369   tree type;
370   REAL_VALUE_TYPE d;
371
372   if (val->lattice_val != CONSTANT
373       || TREE_CODE (val->value) != REAL_CST)
374     return;
375
376   d = TREE_REAL_CST (val->value);
377   type = TREE_TYPE (val->value);
378   mode = TYPE_MODE (type);
379
380   if (!HONOR_SIGNED_ZEROS (mode)
381       && REAL_VALUE_MINUS_ZERO (d))
382     {
383       val->value = build_real (type, dconst0);
384       return;
385     }
386
387   if (!HONOR_NANS (mode)
388       && REAL_VALUE_ISNAN (d))
389     {
390       val->lattice_val = UNDEFINED;
391       val->value = NULL;
392       return;
393     }
394 }
395
396 /* Return whether the lattice transition is valid.  */
397
398 static bool
399 valid_lattice_transition (prop_value_t old_val, prop_value_t new_val)
400 {
401   /* Lattice transitions must always be monotonically increasing in
402      value.  */
403   if (old_val.lattice_val < new_val.lattice_val)
404     return true;
405
406   if (old_val.lattice_val != new_val.lattice_val)
407     return false;
408
409   if (!old_val.value && !new_val.value)
410     return true;
411
412   /* Now both lattice values are CONSTANT.  */
413
414   /* Allow transitioning from &x to &x & ~3.  */
415   if (TREE_CODE (old_val.value) != INTEGER_CST
416       && TREE_CODE (new_val.value) == INTEGER_CST)
417     return true;
418
419   /* Bit-lattices have to agree in the still valid bits.  */
420   if (TREE_CODE (old_val.value) == INTEGER_CST
421       && TREE_CODE (new_val.value) == INTEGER_CST)
422     return double_int_equal_p
423                 (double_int_and_not (tree_to_double_int (old_val.value),
424                                      new_val.mask),
425                  double_int_and_not (tree_to_double_int (new_val.value),
426                                      new_val.mask));
427
428   /* Otherwise constant values have to agree.  */
429   return operand_equal_p (old_val.value, new_val.value, 0);
430 }
431
432 /* Set the value for variable VAR to NEW_VAL.  Return true if the new
433    value is different from VAR's previous value.  */
434
435 static bool
436 set_lattice_value (tree var, prop_value_t new_val)
437 {
438   /* We can deal with old UNINITIALIZED values just fine here.  */
439   prop_value_t *old_val = &const_val[SSA_NAME_VERSION (var)];
440
441   canonicalize_float_value (&new_val);
442
443   /* We have to be careful to not go up the bitwise lattice
444      represented by the mask.
445      ???  This doesn't seem to be the best place to enforce this.  */
446   if (new_val.lattice_val == CONSTANT
447       && old_val->lattice_val == CONSTANT
448       && TREE_CODE (new_val.value) == INTEGER_CST
449       && TREE_CODE (old_val->value) == INTEGER_CST)
450     {
451       double_int diff;
452       diff = double_int_xor (tree_to_double_int (new_val.value),
453                              tree_to_double_int (old_val->value));
454       new_val.mask = double_int_ior (new_val.mask,
455                                      double_int_ior (old_val->mask, diff));
456     }
457
458   gcc_assert (valid_lattice_transition (*old_val, new_val));
459
460   /* If *OLD_VAL and NEW_VAL are the same, return false to inform the
461      caller that this was a non-transition.  */
462   if (old_val->lattice_val != new_val.lattice_val
463       || (new_val.lattice_val == CONSTANT
464           && TREE_CODE (new_val.value) == INTEGER_CST
465           && (TREE_CODE (old_val->value) != INTEGER_CST
466               || !double_int_equal_p (new_val.mask, old_val->mask))))
467     {
468       /* ???  We would like to delay creation of INTEGER_CSTs from
469          partially constants here.  */
470
471       if (dump_file && (dump_flags & TDF_DETAILS))
472         {
473           dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
474           fprintf (dump_file, ".  Adding SSA edges to worklist.\n");
475         }
476
477       *old_val = new_val;
478
479       gcc_assert (new_val.lattice_val != UNINITIALIZED);
480       return true;
481     }
482
483   return false;
484 }
485
486 static prop_value_t get_value_for_expr (tree, bool);
487 static prop_value_t bit_value_binop (enum tree_code, tree, tree, tree);
488 static void bit_value_binop_1 (enum tree_code, tree, double_int *, double_int *,
489                                tree, double_int, double_int,
490                                tree, double_int, double_int);
491
492 /* Return a double_int that can be used for bitwise simplifications
493    from VAL.  */
494
495 static double_int
496 value_to_double_int (prop_value_t val)
497 {
498   if (val.value
499       && TREE_CODE (val.value) == INTEGER_CST)
500     return tree_to_double_int (val.value);
501   else
502     return double_int_zero;
503 }
504
505 /* Return the value for the address expression EXPR based on alignment
506    information.  */
507
508 static prop_value_t
509 get_value_from_alignment (tree expr)
510 {
511   prop_value_t val;
512   HOST_WIDE_INT bitsize, bitpos;
513   tree base, offset;
514   enum machine_mode mode;
515   int align;
516
517   gcc_assert (TREE_CODE (expr) == ADDR_EXPR);
518
519   base = get_inner_reference (TREE_OPERAND (expr, 0),
520                               &bitsize, &bitpos, &offset,
521                               &mode, &align, &align, false);
522   if (TREE_CODE (base) == MEM_REF)
523     val = bit_value_binop (PLUS_EXPR, TREE_TYPE (expr),
524                            TREE_OPERAND (base, 0), TREE_OPERAND (base, 1));
525   else if (base
526            && ((align = get_object_alignment (base, BIGGEST_ALIGNMENT))
527                 > BITS_PER_UNIT))
528     {
529       val.lattice_val = CONSTANT;
530       /* We assume pointers are zero-extended.  */
531       val.mask = double_int_and_not
532                    (double_int_mask (TYPE_PRECISION (TREE_TYPE (expr))),
533                     uhwi_to_double_int (align / BITS_PER_UNIT - 1));
534       val.value = build_int_cst (TREE_TYPE (expr), 0);
535     }
536   else
537     {
538       val.lattice_val = VARYING;
539       val.mask = double_int_minus_one;
540       val.value = NULL_TREE;
541     }
542   if (bitpos != 0)
543     {
544       double_int value, mask;
545       bit_value_binop_1 (PLUS_EXPR, TREE_TYPE (expr), &value, &mask,
546                          TREE_TYPE (expr), value_to_double_int (val), val.mask,
547                          TREE_TYPE (expr),
548                          shwi_to_double_int (bitpos / BITS_PER_UNIT),
549                          double_int_zero);
550       val.lattice_val = double_int_minus_one_p (mask) ? VARYING : CONSTANT;
551       val.mask = mask;
552       if (val.lattice_val == CONSTANT)
553         val.value = double_int_to_tree (TREE_TYPE (expr), value);
554       else
555         val.value = NULL_TREE;
556     }
557   /* ???  We should handle i * 4 and more complex expressions from
558      the offset, possibly by just expanding get_value_for_expr.  */
559   if (offset != NULL_TREE)
560     {
561       double_int value, mask;
562       prop_value_t oval = get_value_for_expr (offset, true);
563       bit_value_binop_1 (PLUS_EXPR, TREE_TYPE (expr), &value, &mask,
564                          TREE_TYPE (expr), value_to_double_int (val), val.mask,
565                          TREE_TYPE (expr), value_to_double_int (oval),
566                          oval.mask);
567       val.mask = mask;
568       if (double_int_minus_one_p (mask))
569         {
570           val.lattice_val = VARYING;
571           val.value = NULL_TREE;
572         }
573       else
574         {
575           val.lattice_val = CONSTANT;
576           val.value = double_int_to_tree (TREE_TYPE (expr), value);
577         }
578     }
579
580   return val;
581 }
582
583 /* Return the value for the tree operand EXPR.  If FOR_BITS_P is true
584    return constant bits extracted from alignment information for
585    invariant addresses.  */
586
587 static prop_value_t
588 get_value_for_expr (tree expr, bool for_bits_p)
589 {
590   prop_value_t val;
591
592   if (TREE_CODE (expr) == SSA_NAME)
593     {
594       val = *get_value (expr);
595       if (for_bits_p
596           && val.lattice_val == CONSTANT
597           && TREE_CODE (val.value) == ADDR_EXPR)
598         val = get_value_from_alignment (val.value);
599     }
600   else if (is_gimple_min_invariant (expr)
601            && (!for_bits_p || TREE_CODE (expr) != ADDR_EXPR))
602     {
603       val.lattice_val = CONSTANT;
604       val.value = expr;
605       val.mask = double_int_zero;
606       canonicalize_float_value (&val);
607     }
608   else if (TREE_CODE (expr) == ADDR_EXPR)
609     val = get_value_from_alignment (expr);
610   else
611     {
612       val.lattice_val = VARYING;
613       val.mask = double_int_minus_one;
614       val.value = NULL_TREE;
615     }
616   return val;
617 }
618
619 /* Return the likely CCP lattice value for STMT.
620
621    If STMT has no operands, then return CONSTANT.
622
623    Else if undefinedness of operands of STMT cause its value to be
624    undefined, then return UNDEFINED.
625
626    Else if any operands of STMT are constants, then return CONSTANT.
627
628    Else return VARYING.  */
629
630 static ccp_lattice_t
631 likely_value (gimple stmt)
632 {
633   bool has_constant_operand, has_undefined_operand, all_undefined_operands;
634   tree use;
635   ssa_op_iter iter;
636   unsigned i;
637
638   enum gimple_code code = gimple_code (stmt);
639
640   /* This function appears to be called only for assignments, calls,
641      conditionals, and switches, due to the logic in visit_stmt.  */
642   gcc_assert (code == GIMPLE_ASSIGN
643               || code == GIMPLE_CALL
644               || code == GIMPLE_COND
645               || code == GIMPLE_SWITCH);
646
647   /* If the statement has volatile operands, it won't fold to a
648      constant value.  */
649   if (gimple_has_volatile_ops (stmt))
650     return VARYING;
651
652   /* Arrive here for more complex cases.  */
653   has_constant_operand = false;
654   has_undefined_operand = false;
655   all_undefined_operands = true;
656   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
657     {
658       prop_value_t *val = get_value (use);
659
660       if (val->lattice_val == UNDEFINED)
661         has_undefined_operand = true;
662       else
663         all_undefined_operands = false;
664
665       if (val->lattice_val == CONSTANT)
666         has_constant_operand = true;
667     }
668
669   /* There may be constants in regular rhs operands.  For calls we
670      have to ignore lhs, fndecl and static chain, otherwise only
671      the lhs.  */
672   for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
673        i < gimple_num_ops (stmt); ++i)
674     {
675       tree op = gimple_op (stmt, i);
676       if (!op || TREE_CODE (op) == SSA_NAME)
677         continue;
678       if (is_gimple_min_invariant (op))
679         has_constant_operand = true;
680     }
681
682   if (has_constant_operand)
683     all_undefined_operands = false;
684
685   /* If the operation combines operands like COMPLEX_EXPR make sure to
686      not mark the result UNDEFINED if only one part of the result is
687      undefined.  */
688   if (has_undefined_operand && all_undefined_operands)
689     return UNDEFINED;
690   else if (code == GIMPLE_ASSIGN && has_undefined_operand)
691     {
692       switch (gimple_assign_rhs_code (stmt))
693         {
694         /* Unary operators are handled with all_undefined_operands.  */
695         case PLUS_EXPR:
696         case MINUS_EXPR:
697         case POINTER_PLUS_EXPR:
698           /* Not MIN_EXPR, MAX_EXPR.  One VARYING operand may be selected.
699              Not bitwise operators, one VARYING operand may specify the
700              result completely.  Not logical operators for the same reason.
701              Not COMPLEX_EXPR as one VARYING operand makes the result partly
702              not UNDEFINED.  Not *DIV_EXPR, comparisons and shifts because
703              the undefined operand may be promoted.  */
704           return UNDEFINED;
705
706         default:
707           ;
708         }
709     }
710   /* If there was an UNDEFINED operand but the result may be not UNDEFINED
711      fall back to VARYING even if there were CONSTANT operands.  */
712   if (has_undefined_operand)
713     return VARYING;
714
715   /* We do not consider virtual operands here -- load from read-only
716      memory may have only VARYING virtual operands, but still be
717      constant.  */
718   if (has_constant_operand
719       || gimple_references_memory_p (stmt))
720     return CONSTANT;
721
722   return VARYING;
723 }
724
725 /* Returns true if STMT cannot be constant.  */
726
727 static bool
728 surely_varying_stmt_p (gimple stmt)
729 {
730   /* If the statement has operands that we cannot handle, it cannot be
731      constant.  */
732   if (gimple_has_volatile_ops (stmt))
733     return true;
734
735   /* If it is a call and does not return a value or is not a
736      builtin and not an indirect call, it is varying.  */
737   if (is_gimple_call (stmt))
738     {
739       tree fndecl;
740       if (!gimple_call_lhs (stmt)
741           || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
742               && !DECL_BUILT_IN (fndecl)))
743         return true;
744     }
745
746   /* Any other store operation is not interesting.  */
747   else if (gimple_vdef (stmt))
748     return true;
749
750   /* Anything other than assignments and conditional jumps are not
751      interesting for CCP.  */
752   if (gimple_code (stmt) != GIMPLE_ASSIGN
753       && gimple_code (stmt) != GIMPLE_COND
754       && gimple_code (stmt) != GIMPLE_SWITCH
755       && gimple_code (stmt) != GIMPLE_CALL)
756     return true;
757
758   return false;
759 }
760
761 /* Initialize local data structures for CCP.  */
762
763 static void
764 ccp_initialize (void)
765 {
766   basic_block bb;
767
768   const_val = XCNEWVEC (prop_value_t, num_ssa_names);
769
770   /* Initialize simulation flags for PHI nodes and statements.  */
771   FOR_EACH_BB (bb)
772     {
773       gimple_stmt_iterator i;
774
775       for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
776         {
777           gimple stmt = gsi_stmt (i);
778           bool is_varying;
779
780           /* If the statement is a control insn, then we do not
781              want to avoid simulating the statement once.  Failure
782              to do so means that those edges will never get added.  */
783           if (stmt_ends_bb_p (stmt))
784             is_varying = false;
785           else
786             is_varying = surely_varying_stmt_p (stmt);
787
788           if (is_varying)
789             {
790               tree def;
791               ssa_op_iter iter;
792
793               /* If the statement will not produce a constant, mark
794                  all its outputs VARYING.  */
795               FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
796                 set_value_varying (def);
797             }
798           prop_set_simulate_again (stmt, !is_varying);
799         }
800     }
801
802   /* Now process PHI nodes.  We never clear the simulate_again flag on
803      phi nodes, since we do not know which edges are executable yet,
804      except for phi nodes for virtual operands when we do not do store ccp.  */
805   FOR_EACH_BB (bb)
806     {
807       gimple_stmt_iterator i;
808
809       for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
810         {
811           gimple phi = gsi_stmt (i);
812
813           if (!is_gimple_reg (gimple_phi_result (phi)))
814             prop_set_simulate_again (phi, false);
815           else
816             prop_set_simulate_again (phi, true);
817         }
818     }
819 }
820
821 /* Debug count support. Reset the values of ssa names
822    VARYING when the total number ssa names analyzed is
823    beyond the debug count specified.  */
824
825 static void
826 do_dbg_cnt (void)
827 {
828   unsigned i;
829   for (i = 0; i < num_ssa_names; i++)
830     {
831       if (!dbg_cnt (ccp))
832         {
833           const_val[i].lattice_val = VARYING;
834           const_val[i].mask = double_int_minus_one;
835           const_val[i].value = NULL_TREE;
836         }
837     }
838 }
839
840
841 /* Do final substitution of propagated values, cleanup the flowgraph and
842    free allocated storage.
843
844    Return TRUE when something was optimized.  */
845
846 static bool
847 ccp_finalize (void)
848 {
849   bool something_changed;
850   unsigned i;
851
852   do_dbg_cnt ();
853
854   /* Derive alignment and misalignment information from partially
855      constant pointers in the lattice.  */
856   for (i = 1; i < num_ssa_names; ++i)
857     {
858       tree name = ssa_name (i);
859       prop_value_t *val;
860       struct ptr_info_def *pi;
861       unsigned int tem, align;
862
863       if (!name
864           || !POINTER_TYPE_P (TREE_TYPE (name)))
865         continue;
866
867       val = get_value (name);
868       if (val->lattice_val != CONSTANT
869           || TREE_CODE (val->value) != INTEGER_CST)
870         continue;
871
872       /* Trailing constant bits specify the alignment, trailing value
873          bits the misalignment.  */
874       tem = val->mask.low;
875       align = (tem & -tem);
876       if (align == 1)
877         continue;
878
879       pi = get_ptr_info (name);
880       pi->align = align;
881       pi->misalign = TREE_INT_CST_LOW (val->value) & (align - 1);
882     }
883
884   /* Perform substitutions based on the known constant values.  */
885   something_changed = substitute_and_fold (get_constant_value,
886                                            ccp_fold_stmt, true);
887
888   free (const_val);
889   const_val = NULL;
890   return something_changed;;
891 }
892
893
894 /* Compute the meet operator between *VAL1 and *VAL2.  Store the result
895    in VAL1.
896
897                 any  M UNDEFINED   = any
898                 any  M VARYING     = VARYING
899                 Ci   M Cj          = Ci         if (i == j)
900                 Ci   M Cj          = VARYING    if (i != j)
901    */
902
903 static void
904 ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
905 {
906   if (val1->lattice_val == UNDEFINED)
907     {
908       /* UNDEFINED M any = any   */
909       *val1 = *val2;
910     }
911   else if (val2->lattice_val == UNDEFINED)
912     {
913       /* any M UNDEFINED = any
914          Nothing to do.  VAL1 already contains the value we want.  */
915       ;
916     }
917   else if (val1->lattice_val == VARYING
918            || val2->lattice_val == VARYING)
919     {
920       /* any M VARYING = VARYING.  */
921       val1->lattice_val = VARYING;
922       val1->mask = double_int_minus_one;
923       val1->value = NULL_TREE;
924     }
925   else if (val1->lattice_val == CONSTANT
926            && val2->lattice_val == CONSTANT
927            && TREE_CODE (val1->value) == INTEGER_CST
928            && TREE_CODE (val2->value) == INTEGER_CST)
929     {
930       /* Ci M Cj = Ci           if (i == j)
931          Ci M Cj = VARYING      if (i != j)
932
933          For INTEGER_CSTs mask unequal bits.  If no equal bits remain,
934          drop to varying.  */
935       val1->mask
936           = double_int_ior (double_int_ior (val1->mask,
937                                             val2->mask),
938                             double_int_xor (tree_to_double_int (val1->value),
939                                             tree_to_double_int (val2->value)));
940       if (double_int_minus_one_p (val1->mask))
941         {
942           val1->lattice_val = VARYING;
943           val1->value = NULL_TREE;
944         }
945     }
946   else if (val1->lattice_val == CONSTANT
947            && val2->lattice_val == CONSTANT
948            && simple_cst_equal (val1->value, val2->value) == 1)
949     {
950       /* Ci M Cj = Ci           if (i == j)
951          Ci M Cj = VARYING      if (i != j)
952
953          VAL1 already contains the value we want for equivalent values.  */
954     }
955   else if (val1->lattice_val == CONSTANT
956            && val2->lattice_val == CONSTANT
957            && (TREE_CODE (val1->value) == ADDR_EXPR
958                || TREE_CODE (val2->value) == ADDR_EXPR))
959     {
960       /* When not equal addresses are involved try meeting for
961          alignment.  */
962       prop_value_t tem = *val2;
963       if (TREE_CODE (val1->value) == ADDR_EXPR)
964         *val1 = get_value_for_expr (val1->value, true);
965       if (TREE_CODE (val2->value) == ADDR_EXPR)
966         tem = get_value_for_expr (val2->value, true);
967       ccp_lattice_meet (val1, &tem);
968     }
969   else
970     {
971       /* Any other combination is VARYING.  */
972       val1->lattice_val = VARYING;
973       val1->mask = double_int_minus_one;
974       val1->value = NULL_TREE;
975     }
976 }
977
978
979 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
980    lattice values to determine PHI_NODE's lattice value.  The value of a
981    PHI node is determined calling ccp_lattice_meet with all the arguments
982    of the PHI node that are incoming via executable edges.  */
983
984 static enum ssa_prop_result
985 ccp_visit_phi_node (gimple phi)
986 {
987   unsigned i;
988   prop_value_t *old_val, new_val;
989
990   if (dump_file && (dump_flags & TDF_DETAILS))
991     {
992       fprintf (dump_file, "\nVisiting PHI node: ");
993       print_gimple_stmt (dump_file, phi, 0, dump_flags);
994     }
995
996   old_val = get_value (gimple_phi_result (phi));
997   switch (old_val->lattice_val)
998     {
999     case VARYING:
1000       return SSA_PROP_VARYING;
1001
1002     case CONSTANT:
1003       new_val = *old_val;
1004       break;
1005
1006     case UNDEFINED:
1007       new_val.lattice_val = UNDEFINED;
1008       new_val.value = NULL_TREE;
1009       break;
1010
1011     default:
1012       gcc_unreachable ();
1013     }
1014
1015   for (i = 0; i < gimple_phi_num_args (phi); i++)
1016     {
1017       /* Compute the meet operator over all the PHI arguments flowing
1018          through executable edges.  */
1019       edge e = gimple_phi_arg_edge (phi, i);
1020
1021       if (dump_file && (dump_flags & TDF_DETAILS))
1022         {
1023           fprintf (dump_file,
1024               "\n    Argument #%d (%d -> %d %sexecutable)\n",
1025               i, e->src->index, e->dest->index,
1026               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
1027         }
1028
1029       /* If the incoming edge is executable, Compute the meet operator for
1030          the existing value of the PHI node and the current PHI argument.  */
1031       if (e->flags & EDGE_EXECUTABLE)
1032         {
1033           tree arg = gimple_phi_arg (phi, i)->def;
1034           prop_value_t arg_val = get_value_for_expr (arg, false);
1035
1036           ccp_lattice_meet (&new_val, &arg_val);
1037
1038           if (dump_file && (dump_flags & TDF_DETAILS))
1039             {
1040               fprintf (dump_file, "\t");
1041               print_generic_expr (dump_file, arg, dump_flags);
1042               dump_lattice_value (dump_file, "\tValue: ", arg_val);
1043               fprintf (dump_file, "\n");
1044             }
1045
1046           if (new_val.lattice_val == VARYING)
1047             break;
1048         }
1049     }
1050
1051   if (dump_file && (dump_flags & TDF_DETAILS))
1052     {
1053       dump_lattice_value (dump_file, "\n    PHI node value: ", new_val);
1054       fprintf (dump_file, "\n\n");
1055     }
1056
1057   /* Make the transition to the new value.  */
1058   if (set_lattice_value (gimple_phi_result (phi), new_val))
1059     {
1060       if (new_val.lattice_val == VARYING)
1061         return SSA_PROP_VARYING;
1062       else
1063         return SSA_PROP_INTERESTING;
1064     }
1065   else
1066     return SSA_PROP_NOT_INTERESTING;
1067 }
1068
1069 /* Return the constant value for OP or OP otherwise.  */
1070
1071 static tree
1072 valueize_op (tree op)
1073 {
1074   if (TREE_CODE (op) == SSA_NAME)
1075     {
1076       tree tem = get_constant_value (op);
1077       if (tem)
1078         return tem;
1079     }
1080   return op;
1081 }
1082
1083 /* CCP specific front-end to the non-destructive constant folding
1084    routines.
1085
1086    Attempt to simplify the RHS of STMT knowing that one or more
1087    operands are constants.
1088
1089    If simplification is possible, return the simplified RHS,
1090    otherwise return the original RHS or NULL_TREE.  */
1091
1092 static tree
1093 ccp_fold (gimple stmt)
1094 {
1095   location_t loc = gimple_location (stmt);
1096   switch (gimple_code (stmt))
1097     {
1098     case GIMPLE_ASSIGN:
1099       {
1100         enum tree_code subcode = gimple_assign_rhs_code (stmt);
1101
1102         switch (get_gimple_rhs_class (subcode))
1103           {
1104           case GIMPLE_SINGLE_RHS:
1105             {
1106               tree rhs = gimple_assign_rhs1 (stmt);
1107               enum tree_code_class kind = TREE_CODE_CLASS (subcode);
1108
1109               if (TREE_CODE (rhs) == SSA_NAME)
1110                 {
1111                   /* If the RHS is an SSA_NAME, return its known constant value,
1112                      if any.  */
1113                   return get_constant_value (rhs);
1114                 }
1115               /* Handle propagating invariant addresses into address operations.
1116                  The folding we do here matches that in tree-ssa-forwprop.c.  */
1117               else if (TREE_CODE (rhs) == ADDR_EXPR)
1118                 {
1119                   tree *base;
1120                   base = &TREE_OPERAND (rhs, 0);
1121                   while (handled_component_p (*base))
1122                     base = &TREE_OPERAND (*base, 0);
1123                   if (TREE_CODE (*base) == MEM_REF
1124                       && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME)
1125                     {
1126                       tree val = get_constant_value (TREE_OPERAND (*base, 0));
1127                       if (val
1128                           && TREE_CODE (val) == ADDR_EXPR)
1129                         {
1130                           tree ret, save = *base;
1131                           tree new_base;
1132                           new_base = fold_build2 (MEM_REF, TREE_TYPE (*base),
1133                                                   unshare_expr (val),
1134                                                   TREE_OPERAND (*base, 1));
1135                           /* We need to return a new tree, not modify the IL
1136                              or share parts of it.  So play some tricks to
1137                              avoid manually building it.  */
1138                           *base = new_base;
1139                           ret = unshare_expr (rhs);
1140                           recompute_tree_invariant_for_addr_expr (ret);
1141                           *base = save;
1142                           return ret;
1143                         }
1144                     }
1145                 }
1146               else if (TREE_CODE (rhs) == CONSTRUCTOR
1147                        && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
1148                        && (CONSTRUCTOR_NELTS (rhs)
1149                            == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
1150                 {
1151                   unsigned i;
1152                   tree val, list;
1153
1154                   list = NULL_TREE;
1155                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
1156                     {
1157                       val = valueize_op (val);
1158                       if (TREE_CODE (val) == INTEGER_CST
1159                           || TREE_CODE (val) == REAL_CST
1160                           || TREE_CODE (val) == FIXED_CST)
1161                         list = tree_cons (NULL_TREE, val, list);
1162                       else
1163                         return NULL_TREE;
1164                     }
1165
1166                   return build_vector (TREE_TYPE (rhs), nreverse (list));
1167                 }
1168
1169               if (kind == tcc_reference)
1170                 {
1171                   if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
1172                        || TREE_CODE (rhs) == REALPART_EXPR
1173                        || TREE_CODE (rhs) == IMAGPART_EXPR)
1174                       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
1175                     {
1176                       tree val = get_constant_value (TREE_OPERAND (rhs, 0));
1177                       if (val)
1178                         return fold_unary_loc (EXPR_LOCATION (rhs),
1179                                                TREE_CODE (rhs),
1180                                                TREE_TYPE (rhs), val);
1181                     }
1182                   else if (TREE_CODE (rhs) == MEM_REF
1183                            && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
1184                     {
1185                       tree val = get_constant_value (TREE_OPERAND (rhs, 0));
1186                       if (val
1187                           && TREE_CODE (val) == ADDR_EXPR)
1188                         {
1189                           tree tem = fold_build2 (MEM_REF, TREE_TYPE (rhs),
1190                                                   unshare_expr (val),
1191                                                   TREE_OPERAND (rhs, 1));
1192                           if (tem)
1193                             rhs = tem;
1194                         }
1195                     }
1196                   return fold_const_aggregate_ref (rhs);
1197                 }
1198               else if (kind == tcc_declaration)
1199                 return get_symbol_constant_value (rhs);
1200               return rhs;
1201             }
1202
1203           case GIMPLE_UNARY_RHS:
1204             {
1205               /* Handle unary operators that can appear in GIMPLE form.
1206                  Note that we know the single operand must be a constant,
1207                  so this should almost always return a simplified RHS.  */
1208               tree lhs = gimple_assign_lhs (stmt);
1209               tree op0 = valueize_op (gimple_assign_rhs1 (stmt));
1210
1211               /* Conversions are useless for CCP purposes if they are
1212                  value-preserving.  Thus the restrictions that
1213                  useless_type_conversion_p places for pointer type conversions
1214                  do not apply here.  Substitution later will only substitute to
1215                  allowed places.  */
1216               if (CONVERT_EXPR_CODE_P (subcode)
1217                   && POINTER_TYPE_P (TREE_TYPE (lhs))
1218                   && POINTER_TYPE_P (TREE_TYPE (op0)))
1219                 {
1220                   tree tem;
1221                   /* Try to re-construct array references on-the-fly.  */
1222                   if (!useless_type_conversion_p (TREE_TYPE (lhs),
1223                                                   TREE_TYPE (op0))
1224                       && ((tem = maybe_fold_offset_to_address
1225                            (loc,
1226                             op0, integer_zero_node, TREE_TYPE (lhs)))
1227                           != NULL_TREE))
1228                     return tem;
1229                   return op0;
1230                 }
1231
1232               return
1233                 fold_unary_ignore_overflow_loc (loc, subcode,
1234                                                 gimple_expr_type (stmt), op0);
1235             }
1236
1237           case GIMPLE_BINARY_RHS:
1238             {
1239               /* Handle binary operators that can appear in GIMPLE form.  */
1240               tree op0 = valueize_op (gimple_assign_rhs1 (stmt));
1241               tree op1 = valueize_op (gimple_assign_rhs2 (stmt));
1242
1243               /* Translate &x + CST into an invariant form suitable for
1244                  further propagation.  */
1245               if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
1246                   && TREE_CODE (op0) == ADDR_EXPR
1247                   && TREE_CODE (op1) == INTEGER_CST)
1248                 {
1249                   tree off = fold_convert (ptr_type_node, op1);
1250                   return build_fold_addr_expr
1251                            (fold_build2 (MEM_REF,
1252                                          TREE_TYPE (TREE_TYPE (op0)),
1253                                          unshare_expr (op0), off));
1254                 }
1255
1256               return fold_binary_loc (loc, subcode,
1257                                       gimple_expr_type (stmt), op0, op1);
1258             }
1259
1260           case GIMPLE_TERNARY_RHS:
1261             {
1262               /* Handle ternary operators that can appear in GIMPLE form.  */
1263               tree op0 = valueize_op (gimple_assign_rhs1 (stmt));
1264               tree op1 = valueize_op (gimple_assign_rhs2 (stmt));
1265               tree op2 = valueize_op (gimple_assign_rhs3 (stmt));
1266
1267               return fold_ternary_loc (loc, subcode,
1268                                        gimple_expr_type (stmt), op0, op1, op2);
1269             }
1270
1271           default:
1272             gcc_unreachable ();
1273           }
1274       }
1275       break;
1276
1277     case GIMPLE_CALL:
1278       {
1279         tree fn = valueize_op (gimple_call_fn (stmt));
1280         if (TREE_CODE (fn) == ADDR_EXPR
1281             && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
1282             && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
1283           {
1284             tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
1285             tree call, retval;
1286             unsigned i;
1287             for (i = 0; i < gimple_call_num_args (stmt); ++i)
1288               args[i] = valueize_op (gimple_call_arg (stmt, i));
1289             call = build_call_array_loc (loc,
1290                                          gimple_call_return_type (stmt),
1291                                          fn, gimple_call_num_args (stmt), args);
1292             retval = fold_call_expr (EXPR_LOCATION (call), call, false);
1293             if (retval)
1294               /* fold_call_expr wraps the result inside a NOP_EXPR.  */
1295               STRIP_NOPS (retval);
1296             return retval;
1297           }
1298         return NULL_TREE;
1299       }
1300
1301     case GIMPLE_COND:
1302       {
1303         /* Handle comparison operators that can appear in GIMPLE form.  */
1304         tree op0 = valueize_op (gimple_cond_lhs (stmt));
1305         tree op1 = valueize_op (gimple_cond_rhs (stmt));
1306         enum tree_code code = gimple_cond_code (stmt);
1307         return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
1308       }
1309
1310     case GIMPLE_SWITCH:
1311       {
1312         /* Return the constant switch index.  */
1313         return valueize_op (gimple_switch_index (stmt));
1314       }
1315
1316     default:
1317       gcc_unreachable ();
1318     }
1319 }
1320
1321 /* See if we can find constructor defining value of BASE.
1322    When we know the consructor with constant offset (such as
1323    base is array[40] and we do know constructor of array), then
1324    BIT_OFFSET is adjusted accordingly.
1325
1326    As a special case, return error_mark_node when constructor
1327    is not explicitly available, but it is known to be zero
1328    such as 'static const int a;'.  */
1329 static tree
1330 get_base_constructor (tree base, HOST_WIDE_INT *bit_offset)
1331 {
1332   HOST_WIDE_INT bit_offset2, size, max_size;
1333   if (TREE_CODE (base) == MEM_REF)
1334     {
1335       if (!integer_zerop (TREE_OPERAND (base, 1)))
1336         {
1337           if (!host_integerp (TREE_OPERAND (base, 1), 0))
1338             return NULL_TREE;
1339           *bit_offset += (mem_ref_offset (base).low
1340                           * BITS_PER_UNIT);
1341         }
1342
1343       base = get_constant_value (TREE_OPERAND (base, 0));
1344       if (!base || TREE_CODE (base) != ADDR_EXPR)
1345         return NULL_TREE;
1346       base = TREE_OPERAND (base, 0);
1347     }
1348
1349   /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1350      DECL_INITIAL.  If BASE is a nested reference into another
1351      ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1352      the inner reference.  */
1353   switch (TREE_CODE (base))
1354     {
1355     case VAR_DECL:
1356       if (!const_value_known_p (base))
1357         return NULL_TREE;
1358
1359       /* Fallthru.  */
1360     case CONST_DECL:
1361       if (!DECL_INITIAL (base)
1362           && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
1363         return error_mark_node;
1364       return DECL_INITIAL (base);
1365       
1366       break;
1367
1368     case ARRAY_REF:
1369     case COMPONENT_REF:
1370       base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size);
1371       if (max_size == -1 || size != max_size)
1372         return NULL_TREE;
1373       *bit_offset +=  bit_offset2;
1374       return get_base_constructor (base, bit_offset);
1375       break;
1376
1377     case STRING_CST:
1378     case CONSTRUCTOR:
1379       return base;
1380       break;
1381
1382     default:
1383       return NULL_TREE;
1384     }
1385 }
1386
1387 /* CTOR is STRING_CST.  Fold reference of type TYPE and size SIZE
1388    to the memory at bit OFFSET.  
1389
1390    We do only simple job of folding byte accesses.  */
1391
1392 static tree
1393 fold_string_cst_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
1394                                 unsigned HOST_WIDE_INT size)
1395 {
1396   if (INTEGRAL_TYPE_P (type)
1397       && (TYPE_MODE (type)
1398           == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1399       && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1400           == MODE_INT)
1401       && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1402       && size == BITS_PER_UNIT
1403       && !(offset % BITS_PER_UNIT))
1404     {
1405       offset /= BITS_PER_UNIT;
1406       if (offset < (unsigned HOST_WIDE_INT) TREE_STRING_LENGTH (ctor))
1407         return build_int_cst_type (type, (TREE_STRING_POINTER (ctor)
1408                                    [offset]));
1409       /* Folding
1410          const char a[20]="hello";
1411          return a[10];
1412
1413          might lead to offset greater than string length.  In this case we
1414          know value is either initialized to 0 or out of bounds.  Return 0
1415          in both cases.  */
1416       return build_zero_cst (type);
1417     }
1418   return NULL_TREE;
1419 }
1420
1421 /* CTOR is CONSTRUCTOR of an array type.  Fold reference of type TYPE and size
1422    SIZE to the memory at bit OFFSET.  */
1423
1424 static tree
1425 fold_array_ctor_reference (tree type, tree ctor,
1426                            unsigned HOST_WIDE_INT offset,
1427                            unsigned HOST_WIDE_INT size)
1428 {
1429   unsigned HOST_WIDE_INT cnt;
1430   tree cfield, cval;
1431   double_int low_bound, elt_size;
1432   double_int index, max_index;
1433   double_int access_index;
1434   tree domain_type = TYPE_DOMAIN (TREE_TYPE (ctor));
1435   HOST_WIDE_INT inner_offset;
1436
1437   /* Compute low bound and elt size.  */
1438   if (domain_type && TYPE_MIN_VALUE (domain_type))
1439     {
1440       /* Static constructors for variably sized objects makes no sense.  */
1441       gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST);
1442       low_bound = tree_to_double_int (TYPE_MIN_VALUE (domain_type));
1443     }
1444   else
1445     low_bound = double_int_zero;
1446   /* Static constructors for variably sized objects makes no sense.  */
1447   gcc_assert (TREE_CODE(TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))))
1448               == INTEGER_CST);
1449   elt_size =
1450     tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))));
1451
1452
1453   /* We can handle only constantly sized accesses that are known to not
1454      be larger than size of array element.  */
1455   if (!TYPE_SIZE_UNIT (type)
1456       || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
1457       || double_int_cmp (elt_size,
1458                          tree_to_double_int (TYPE_SIZE_UNIT (type)), 0) < 0)
1459     return NULL_TREE;
1460
1461   /* Compute the array index we look for.  */
1462   access_index = double_int_udiv (uhwi_to_double_int (offset / BITS_PER_UNIT),
1463                                   elt_size, TRUNC_DIV_EXPR);
1464   access_index = double_int_add (access_index, low_bound);
1465
1466   /* And offset within the access.  */
1467   inner_offset = offset % (double_int_to_uhwi (elt_size) * BITS_PER_UNIT);
1468
1469   /* See if the array field is large enough to span whole access.  We do not
1470      care to fold accesses spanning multiple array indexes.  */
1471   if (inner_offset + size > double_int_to_uhwi (elt_size) * BITS_PER_UNIT)
1472     return NULL_TREE;
1473
1474   index = double_int_sub (low_bound, double_int_one);
1475   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1476     {
1477       /* Array constructor might explicitely set index, or specify range
1478          or leave index NULL meaning that it is next index after previous
1479          one.  */
1480       if (cfield)
1481         {
1482           if (TREE_CODE (cfield) == INTEGER_CST)
1483             max_index = index = tree_to_double_int (cfield);
1484           else
1485             {
1486               gcc_assert (TREE_CODE (cfield) == RANGE_EXPR);
1487               index = tree_to_double_int (TREE_OPERAND (cfield, 0));
1488               max_index = tree_to_double_int (TREE_OPERAND (cfield, 1));
1489             }
1490         }
1491       else
1492         max_index = index = double_int_add (index, double_int_one);
1493
1494       /* Do we have match?  */
1495       if (double_int_cmp (access_index, index, 1) >= 0
1496           && double_int_cmp (access_index, max_index, 1) <= 0)
1497         return fold_ctor_reference (type, cval, inner_offset, size);
1498     }
1499   /* When memory is not explicitely mentioned in constructor,
1500      it is 0 (or out of range).  */
1501   return build_zero_cst (type);
1502 }
1503
1504 /* CTOR is CONSTRUCTOR of an aggregate or vector.
1505    Fold reference of type TYPE and size SIZE to the memory at bit OFFSET.  */
1506
1507 static tree
1508 fold_nonarray_ctor_reference (tree type, tree ctor,
1509                               unsigned HOST_WIDE_INT offset,
1510                               unsigned HOST_WIDE_INT size)
1511 {
1512   unsigned HOST_WIDE_INT cnt;
1513   tree cfield, cval;
1514
1515   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield,
1516                             cval)
1517     {
1518       tree byte_offset = DECL_FIELD_OFFSET (cfield);
1519       tree field_offset = DECL_FIELD_BIT_OFFSET (cfield);
1520       tree field_size = DECL_SIZE (cfield);
1521       double_int bitoffset;
1522       double_int byte_offset_cst = tree_to_double_int (byte_offset);
1523       double_int bits_per_unit_cst = uhwi_to_double_int (BITS_PER_UNIT);
1524       double_int bitoffset_end;
1525
1526       /* Variable sized objects in static constructors makes no sense,
1527          but field_size can be NULL for flexible array members.  */
1528       gcc_assert (TREE_CODE (field_offset) == INTEGER_CST
1529                   && TREE_CODE (byte_offset) == INTEGER_CST
1530                   && (field_size != NULL_TREE
1531                       ? TREE_CODE (field_size) == INTEGER_CST
1532                       : TREE_CODE (TREE_TYPE (cfield)) == ARRAY_TYPE));
1533
1534       /* Compute bit offset of the field.  */
1535       bitoffset = double_int_add (tree_to_double_int (field_offset),
1536                                   double_int_mul (byte_offset_cst,
1537                                                   bits_per_unit_cst));
1538       /* Compute bit offset where the field ends.  */
1539       if (field_size != NULL_TREE)
1540         bitoffset_end = double_int_add (bitoffset,
1541                                         tree_to_double_int (field_size));
1542       else
1543         bitoffset_end = double_int_zero;
1544
1545       /* Is OFFSET in the range (BITOFFSET, BITOFFSET_END)? */
1546       if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) >= 0
1547           && (field_size == NULL_TREE
1548               || double_int_cmp (uhwi_to_double_int (offset),
1549                                  bitoffset_end, 0) < 0))
1550         {
1551           double_int access_end = double_int_add (uhwi_to_double_int (offset),
1552                                                   uhwi_to_double_int (size));
1553           double_int inner_offset = double_int_sub (uhwi_to_double_int (offset),
1554                                                     bitoffset);
1555           /* We do have overlap.  Now see if field is large enough to
1556              cover the access.  Give up for accesses spanning multiple
1557              fields.  */
1558           if (double_int_cmp (access_end, bitoffset_end, 0) > 0)
1559             return NULL_TREE;
1560           return fold_ctor_reference (type, cval,
1561                                       double_int_to_uhwi (inner_offset), size);
1562         }
1563     }
1564   /* When memory is not explicitely mentioned in constructor, it is 0.  */
1565   return build_zero_cst (type);
1566 }
1567
1568 /* CTOR is value initializing memory, fold reference of type TYPE and size SIZE
1569    to the memory at bit OFFSET.  */
1570
1571 static tree
1572 fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
1573                      unsigned HOST_WIDE_INT size)
1574 {
1575   tree ret;
1576
1577   /* We found the field with exact match.  */
1578   if (useless_type_conversion_p (type, TREE_TYPE (ctor))
1579       && !offset)
1580     return canonicalize_constructor_val (ctor);
1581
1582   /* We are at the end of walk, see if we can view convert the
1583      result.  */
1584   if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
1585       /* VIEW_CONVERT_EXPR is defined only for matching sizes.  */
1586       && operand_equal_p (TYPE_SIZE (type),
1587                           TYPE_SIZE (TREE_TYPE (ctor)), 0))
1588     {
1589       ret = canonicalize_constructor_val (ctor);
1590       ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
1591       if (ret)
1592         STRIP_NOPS (ret);
1593       return ret;
1594     }
1595   if (TREE_CODE (ctor) == STRING_CST)
1596     return fold_string_cst_ctor_reference (type, ctor, offset, size);
1597   if (TREE_CODE (ctor) == CONSTRUCTOR)
1598     {
1599
1600       if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE)
1601         return fold_array_ctor_reference (type, ctor, offset, size);
1602       else
1603         return fold_nonarray_ctor_reference (type, ctor, offset, size);
1604     }
1605
1606   return NULL_TREE;
1607 }
1608
1609 /* Return the tree representing the element referenced by T if T is an
1610    ARRAY_REF or COMPONENT_REF into constant aggregates.  Return
1611    NULL_TREE otherwise.  */
1612
1613 tree
1614 fold_const_aggregate_ref (tree t)
1615 {
1616   tree ctor, idx, base;
1617   HOST_WIDE_INT offset, size, max_size;
1618   tree tem;
1619
1620   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1621     return get_symbol_constant_value (t);
1622
1623   tem = fold_read_from_constant_string (t);
1624   if (tem)
1625     return tem;
1626
1627   switch (TREE_CODE (t))
1628     {
1629     case ARRAY_REF:
1630     case ARRAY_RANGE_REF:
1631       /* Constant indexes are handled well by get_base_constructor.
1632          Only special case variable offsets.
1633          FIXME: This code can't handle nested references with variable indexes
1634          (they will be handled only by iteration of ccp).  Perhaps we can bring
1635          get_ref_base_and_extent here and make it use get_constant_value.  */
1636       if (TREE_CODE (TREE_OPERAND (t, 1)) == SSA_NAME
1637           && (idx = get_constant_value (TREE_OPERAND (t, 1)))
1638           && host_integerp (idx, 0))
1639         {
1640           tree low_bound, unit_size;
1641
1642           /* If the resulting bit-offset is constant, track it.  */
1643           if ((low_bound = array_ref_low_bound (t),
1644                host_integerp (low_bound, 0))
1645               && (unit_size = array_ref_element_size (t),
1646                   host_integerp (unit_size, 1)))
1647             {
1648               offset = TREE_INT_CST_LOW (idx);
1649               offset -= TREE_INT_CST_LOW (low_bound);
1650               offset *= TREE_INT_CST_LOW (unit_size);
1651               offset *= BITS_PER_UNIT;
1652
1653               base = TREE_OPERAND (t, 0);
1654               ctor = get_base_constructor (base, &offset);
1655               /* Empty constructor.  Always fold to 0. */
1656               if (ctor == error_mark_node)
1657                 return build_zero_cst (TREE_TYPE (t));
1658               /* Out of bound array access.  Value is undefined, but don't fold. */
1659               if (offset < 0)
1660                 return NULL_TREE;
1661               /* We can not determine ctor.  */
1662               if (!ctor)
1663                 return NULL_TREE;
1664               return fold_ctor_reference (TREE_TYPE (t), ctor, offset,
1665                                           TREE_INT_CST_LOW (unit_size)
1666                                           * BITS_PER_UNIT);
1667             }
1668         }
1669       /* Fallthru.  */
1670         
1671     case COMPONENT_REF:
1672     case BIT_FIELD_REF:
1673     case TARGET_MEM_REF:
1674     case MEM_REF:
1675       base = get_ref_base_and_extent (t, &offset, &size, &max_size);
1676       ctor = get_base_constructor (base, &offset);
1677
1678       /* Empty constructor.  Always fold to 0. */
1679       if (ctor == error_mark_node)
1680         return build_zero_cst (TREE_TYPE (t));
1681       /* We do not know precise address.  */
1682       if (max_size == -1 || max_size != size)
1683         return NULL_TREE;
1684       /* We can not determine ctor.  */
1685       if (!ctor)
1686         return NULL_TREE;
1687
1688       /* Out of bound array access.  Value is undefined, but don't fold. */
1689       if (offset < 0)
1690         return NULL_TREE;
1691
1692       return fold_ctor_reference (TREE_TYPE (t), ctor, offset, size);
1693
1694     case REALPART_EXPR:
1695     case IMAGPART_EXPR:
1696       {
1697         tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1698         if (c && TREE_CODE (c) == COMPLEX_CST)
1699           return fold_build1_loc (EXPR_LOCATION (t),
1700                               TREE_CODE (t), TREE_TYPE (t), c);
1701         break;
1702       }
1703
1704     default:
1705       break;
1706     }
1707
1708   return NULL_TREE;
1709 }
1710
1711 /* Apply the operation CODE in type TYPE to the value, mask pair
1712    RVAL and RMASK representing a value of type RTYPE and set
1713    the value, mask pair *VAL and *MASK to the result.  */
1714
1715 static void
1716 bit_value_unop_1 (enum tree_code code, tree type,
1717                   double_int *val, double_int *mask,
1718                   tree rtype, double_int rval, double_int rmask)
1719 {
1720   switch (code)
1721     {
1722     case BIT_NOT_EXPR:
1723       *mask = rmask;
1724       *val = double_int_not (rval);
1725       break;
1726
1727     case NEGATE_EXPR:
1728       {
1729         double_int temv, temm;
1730         /* Return ~rval + 1.  */
1731         bit_value_unop_1 (BIT_NOT_EXPR, type, &temv, &temm, type, rval, rmask);
1732         bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1733                          type, temv, temm,
1734                          type, double_int_one, double_int_zero);
1735         break;
1736       }
1737
1738     CASE_CONVERT:
1739       {
1740         bool uns;
1741
1742         /* First extend mask and value according to the original type.  */
1743         uns = (TREE_CODE (rtype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (rtype)
1744                ? 0 : TYPE_UNSIGNED (rtype));
1745         *mask = double_int_ext (rmask, TYPE_PRECISION (rtype), uns);
1746         *val = double_int_ext (rval, TYPE_PRECISION (rtype), uns);
1747
1748         /* Then extend mask and value according to the target type.  */
1749         uns = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1750                ? 0 : TYPE_UNSIGNED (type));
1751         *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1752         *val = double_int_ext (*val, TYPE_PRECISION (type), uns);
1753         break;
1754       }
1755
1756     default:
1757       *mask = double_int_minus_one;
1758       break;
1759     }
1760 }
1761
1762 /* Apply the operation CODE in type TYPE to the value, mask pairs
1763    R1VAL, R1MASK and R2VAL, R2MASK representing a values of type R1TYPE
1764    and R2TYPE and set the value, mask pair *VAL and *MASK to the result.  */
1765
1766 static void
1767 bit_value_binop_1 (enum tree_code code, tree type,
1768                    double_int *val, double_int *mask,
1769                    tree r1type, double_int r1val, double_int r1mask,
1770                    tree r2type, double_int r2val, double_int r2mask)
1771 {
1772   bool uns = (TREE_CODE (type) == INTEGER_TYPE
1773               && TYPE_IS_SIZETYPE (type) ? 0 : TYPE_UNSIGNED (type));
1774   /* Assume we'll get a constant result.  Use an initial varying value,
1775      we fall back to varying in the end if necessary.  */
1776   *mask = double_int_minus_one;
1777   switch (code)
1778     {
1779     case BIT_AND_EXPR:
1780       /* The mask is constant where there is a known not
1781          set bit, (m1 | m2) & ((v1 | m1) & (v2 | m2)) */
1782       *mask = double_int_and (double_int_ior (r1mask, r2mask),
1783                               double_int_and (double_int_ior (r1val, r1mask),
1784                                               double_int_ior (r2val, r2mask)));
1785       *val = double_int_and (r1val, r2val);
1786       break;
1787
1788     case BIT_IOR_EXPR:
1789       /* The mask is constant where there is a known
1790          set bit, (m1 | m2) & ~((v1 & ~m1) | (v2 & ~m2)).  */
1791       *mask = double_int_and_not
1792                 (double_int_ior (r1mask, r2mask),
1793                  double_int_ior (double_int_and_not (r1val, r1mask),
1794                                  double_int_and_not (r2val, r2mask)));
1795       *val = double_int_ior (r1val, r2val);
1796       break;
1797
1798     case BIT_XOR_EXPR:
1799       /* m1 | m2  */
1800       *mask = double_int_ior (r1mask, r2mask);
1801       *val = double_int_xor (r1val, r2val);
1802       break;
1803
1804     case LROTATE_EXPR:
1805     case RROTATE_EXPR:
1806       if (double_int_zero_p (r2mask))
1807         {
1808           HOST_WIDE_INT shift = r2val.low;
1809           if (code == RROTATE_EXPR)
1810             shift = -shift;
1811           *mask = double_int_lrotate (r1mask, shift, TYPE_PRECISION (type));
1812           *val = double_int_lrotate (r1val, shift, TYPE_PRECISION (type));
1813         }
1814       break;
1815
1816     case LSHIFT_EXPR:
1817     case RSHIFT_EXPR:
1818       /* ???  We can handle partially known shift counts if we know
1819          its sign.  That way we can tell that (x << (y | 8)) & 255
1820          is zero.  */
1821       if (double_int_zero_p (r2mask))
1822         {
1823           HOST_WIDE_INT shift = r2val.low;
1824           if (code == RSHIFT_EXPR)
1825             shift = -shift;
1826           /* We need to know if we are doing a left or a right shift
1827              to properly shift in zeros for left shift and unsigned
1828              right shifts and the sign bit for signed right shifts.
1829              For signed right shifts we shift in varying in case
1830              the sign bit was varying.  */
1831           if (shift > 0)
1832             {
1833               *mask = double_int_lshift (r1mask, shift,
1834                                          TYPE_PRECISION (type), false);
1835               *val = double_int_lshift (r1val, shift,
1836                                         TYPE_PRECISION (type), false);
1837             }
1838           else if (shift < 0)
1839             {
1840               shift = -shift;
1841               *mask = double_int_rshift (r1mask, shift,
1842                                          TYPE_PRECISION (type), !uns);
1843               *val = double_int_rshift (r1val, shift,
1844                                         TYPE_PRECISION (type), !uns);
1845             }
1846           else
1847             {
1848               *mask = r1mask;
1849               *val = r1val;
1850             }
1851         }
1852       break;
1853
1854     case PLUS_EXPR:
1855     case POINTER_PLUS_EXPR:
1856       {
1857         double_int lo, hi;
1858         /* Do the addition with unknown bits set to zero, to give carry-ins of
1859            zero wherever possible.  */
1860         lo = double_int_add (double_int_and_not (r1val, r1mask),
1861                              double_int_and_not (r2val, r2mask));
1862         lo = double_int_ext (lo, TYPE_PRECISION (type), uns);
1863         /* Do the addition with unknown bits set to one, to give carry-ins of
1864            one wherever possible.  */
1865         hi = double_int_add (double_int_ior (r1val, r1mask),
1866                              double_int_ior (r2val, r2mask));
1867         hi = double_int_ext (hi, TYPE_PRECISION (type), uns);
1868         /* Each bit in the result is known if (a) the corresponding bits in
1869            both inputs are known, and (b) the carry-in to that bit position
1870            is known.  We can check condition (b) by seeing if we got the same
1871            result with minimised carries as with maximised carries.  */
1872         *mask = double_int_ior (double_int_ior (r1mask, r2mask),
1873                                 double_int_xor (lo, hi));
1874         *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1875         /* It shouldn't matter whether we choose lo or hi here.  */
1876         *val = lo;
1877         break;
1878       }
1879
1880     case MINUS_EXPR:
1881       {
1882         double_int temv, temm;
1883         bit_value_unop_1 (NEGATE_EXPR, r2type, &temv, &temm,
1884                           r2type, r2val, r2mask);
1885         bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1886                            r1type, r1val, r1mask,
1887                            r2type, temv, temm);
1888         break;
1889       }
1890
1891     case MULT_EXPR:
1892       {
1893         /* Just track trailing zeros in both operands and transfer
1894            them to the other.  */
1895         int r1tz = double_int_ctz (double_int_ior (r1val, r1mask));
1896         int r2tz = double_int_ctz (double_int_ior (r2val, r2mask));
1897         if (r1tz + r2tz >= HOST_BITS_PER_DOUBLE_INT)
1898           {
1899             *mask = double_int_zero;
1900             *val = double_int_zero;
1901           }
1902         else if (r1tz + r2tz > 0)
1903           {
1904             *mask = double_int_not (double_int_mask (r1tz + r2tz));
1905             *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1906             *val = double_int_zero;
1907           }
1908         break;
1909       }
1910
1911     case EQ_EXPR:
1912     case NE_EXPR:
1913       {
1914         double_int m = double_int_ior (r1mask, r2mask);
1915         if (!double_int_equal_p (double_int_and_not (r1val, m),
1916                                  double_int_and_not (r2val, m)))
1917           {
1918             *mask = double_int_zero;
1919             *val = ((code == EQ_EXPR) ? double_int_zero : double_int_one);
1920           }
1921         else
1922           {
1923             /* We know the result of a comparison is always one or zero.  */
1924             *mask = double_int_one;
1925             *val = double_int_zero;
1926           }
1927         break;
1928       }
1929
1930     case GE_EXPR:
1931     case GT_EXPR:
1932       {
1933         double_int tem = r1val;
1934         r1val = r2val;
1935         r2val = tem;
1936         tem = r1mask;
1937         r1mask = r2mask;
1938         r2mask = tem;
1939         code = swap_tree_comparison (code);
1940       }
1941       /* Fallthru.  */
1942     case LT_EXPR:
1943     case LE_EXPR:
1944       {
1945         int minmax, maxmin;
1946         /* If the most significant bits are not known we know nothing.  */
1947         if (double_int_negative_p (r1mask) || double_int_negative_p (r2mask))
1948           break;
1949
1950         /* If we know the most significant bits we know the values
1951            value ranges by means of treating varying bits as zero
1952            or one.  Do a cross comparison of the max/min pairs.  */
1953         maxmin = double_int_cmp (double_int_ior (r1val, r1mask),
1954                                  double_int_and_not (r2val, r2mask), uns);
1955         minmax = double_int_cmp (double_int_and_not (r1val, r1mask),
1956                                  double_int_ior (r2val, r2mask), uns);
1957         if (maxmin < 0)  /* r1 is less than r2.  */
1958           {
1959             *mask = double_int_zero;
1960             *val = double_int_one;
1961           }
1962         else if (minmax > 0)  /* r1 is not less or equal to r2.  */
1963           {
1964             *mask = double_int_zero;
1965             *val = double_int_zero;
1966           }
1967         else if (maxmin == minmax)  /* r1 and r2 are equal.  */
1968           {
1969             /* This probably should never happen as we'd have
1970                folded the thing during fully constant value folding.  */
1971             *mask = double_int_zero;
1972             *val = (code == LE_EXPR ? double_int_one :  double_int_zero);
1973           }
1974         else
1975           {
1976             /* We know the result of a comparison is always one or zero.  */
1977             *mask = double_int_one;
1978             *val = double_int_zero;
1979           }
1980         break;
1981       }
1982
1983     default:;
1984     }
1985 }
1986
1987 /* Return the propagation value when applying the operation CODE to
1988    the value RHS yielding type TYPE.  */
1989
1990 static prop_value_t
1991 bit_value_unop (enum tree_code code, tree type, tree rhs)
1992 {
1993   prop_value_t rval = get_value_for_expr (rhs, true);
1994   double_int value, mask;
1995   prop_value_t val;
1996   gcc_assert ((rval.lattice_val == CONSTANT
1997                && TREE_CODE (rval.value) == INTEGER_CST)
1998               || double_int_minus_one_p (rval.mask));
1999   bit_value_unop_1 (code, type, &value, &mask,
2000                     TREE_TYPE (rhs), value_to_double_int (rval), rval.mask);
2001   if (!double_int_minus_one_p (mask))
2002     {
2003       val.lattice_val = CONSTANT;
2004       val.mask = mask;
2005       /* ???  Delay building trees here.  */
2006       val.value = double_int_to_tree (type, value);
2007     }
2008   else
2009     {
2010       val.lattice_val = VARYING;
2011       val.value = NULL_TREE;
2012       val.mask = double_int_minus_one;
2013     }
2014   return val;
2015 }
2016
2017 /* Return the propagation value when applying the operation CODE to
2018    the values RHS1 and RHS2 yielding type TYPE.  */
2019
2020 static prop_value_t
2021 bit_value_binop (enum tree_code code, tree type, tree rhs1, tree rhs2)
2022 {
2023   prop_value_t r1val = get_value_for_expr (rhs1, true);
2024   prop_value_t r2val = get_value_for_expr (rhs2, true);
2025   double_int value, mask;
2026   prop_value_t val;
2027   gcc_assert ((r1val.lattice_val == CONSTANT
2028                && TREE_CODE (r1val.value) == INTEGER_CST)
2029               || double_int_minus_one_p (r1val.mask));
2030   gcc_assert ((r2val.lattice_val == CONSTANT
2031                && TREE_CODE (r2val.value) == INTEGER_CST)
2032               || double_int_minus_one_p (r2val.mask));
2033   bit_value_binop_1 (code, type, &value, &mask,
2034                      TREE_TYPE (rhs1), value_to_double_int (r1val), r1val.mask,
2035                      TREE_TYPE (rhs2), value_to_double_int (r2val), r2val.mask);
2036   if (!double_int_minus_one_p (mask))
2037     {
2038       val.lattice_val = CONSTANT;
2039       val.mask = mask;
2040       /* ???  Delay building trees here.  */
2041       val.value = double_int_to_tree (type, value);
2042     }
2043   else
2044     {
2045       val.lattice_val = VARYING;
2046       val.value = NULL_TREE;
2047       val.mask = double_int_minus_one;
2048     }
2049   return val;
2050 }
2051
2052 /* Evaluate statement STMT.
2053    Valid only for assignments, calls, conditionals, and switches. */
2054
2055 static prop_value_t
2056 evaluate_stmt (gimple stmt)
2057 {
2058   prop_value_t val;
2059   tree simplified = NULL_TREE;
2060   ccp_lattice_t likelyvalue = likely_value (stmt);
2061   bool is_constant = false;
2062
2063   if (dump_file && (dump_flags & TDF_DETAILS))
2064     {
2065       fprintf (dump_file, "which is likely ");
2066       switch (likelyvalue)
2067         {
2068         case CONSTANT:
2069           fprintf (dump_file, "CONSTANT");
2070           break;
2071         case UNDEFINED:
2072           fprintf (dump_file, "UNDEFINED");
2073           break;
2074         case VARYING:
2075           fprintf (dump_file, "VARYING");
2076           break;
2077         default:;
2078         }
2079       fprintf (dump_file, "\n");
2080     }
2081
2082   /* If the statement is likely to have a CONSTANT result, then try
2083      to fold the statement to determine the constant value.  */
2084   /* FIXME.  This is the only place that we call ccp_fold.
2085      Since likely_value never returns CONSTANT for calls, we will
2086      not attempt to fold them, including builtins that may profit.  */
2087   if (likelyvalue == CONSTANT)
2088     {
2089       fold_defer_overflow_warnings ();
2090       simplified = ccp_fold (stmt);
2091       is_constant = simplified && is_gimple_min_invariant (simplified);
2092       fold_undefer_overflow_warnings (is_constant, stmt, 0);
2093       if (is_constant)
2094         {
2095           /* The statement produced a constant value.  */
2096           val.lattice_val = CONSTANT;
2097           val.value = simplified;
2098           val.mask = double_int_zero;
2099         }
2100     }
2101   /* If the statement is likely to have a VARYING result, then do not
2102      bother folding the statement.  */
2103   else if (likelyvalue == VARYING)
2104     {
2105       enum gimple_code code = gimple_code (stmt);
2106       if (code == GIMPLE_ASSIGN)
2107         {
2108           enum tree_code subcode = gimple_assign_rhs_code (stmt);
2109
2110           /* Other cases cannot satisfy is_gimple_min_invariant
2111              without folding.  */
2112           if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
2113             simplified = gimple_assign_rhs1 (stmt);
2114         }
2115       else if (code == GIMPLE_SWITCH)
2116         simplified = gimple_switch_index (stmt);
2117       else
2118         /* These cannot satisfy is_gimple_min_invariant without folding.  */
2119         gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
2120       is_constant = simplified && is_gimple_min_invariant (simplified);
2121       if (is_constant)
2122         {
2123           /* The statement produced a constant value.  */
2124           val.lattice_val = CONSTANT;
2125           val.value = simplified;
2126           val.mask = double_int_zero;
2127         }
2128     }
2129
2130   /* Resort to simplification for bitwise tracking.  */
2131   if (flag_tree_bit_ccp
2132       && likelyvalue == CONSTANT
2133       && !is_constant)
2134     {
2135       enum gimple_code code = gimple_code (stmt);
2136       tree fndecl;
2137       val.lattice_val = VARYING;
2138       val.value = NULL_TREE;
2139       val.mask = double_int_minus_one;
2140       if (code == GIMPLE_ASSIGN)
2141         {
2142           enum tree_code subcode = gimple_assign_rhs_code (stmt);
2143           tree rhs1 = gimple_assign_rhs1 (stmt);
2144           switch (get_gimple_rhs_class (subcode))
2145             {
2146             case GIMPLE_SINGLE_RHS:
2147               if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2148                   || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2149                 val = get_value_for_expr (rhs1, true);
2150               break;
2151
2152             case GIMPLE_UNARY_RHS:
2153               if ((INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2154                    || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2155                   && (INTEGRAL_TYPE_P (gimple_expr_type (stmt))
2156                       || POINTER_TYPE_P (gimple_expr_type (stmt))))
2157                 val = bit_value_unop (subcode, gimple_expr_type (stmt), rhs1);
2158               break;
2159
2160             case GIMPLE_BINARY_RHS:
2161               if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2162                   || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2163                 {
2164                   tree rhs2 = gimple_assign_rhs2 (stmt);
2165                   val = bit_value_binop (subcode,
2166                                          TREE_TYPE (rhs1), rhs1, rhs2);
2167                 }
2168               break;
2169
2170             default:;
2171             }
2172         }
2173       else if (code == GIMPLE_COND)
2174         {
2175           enum tree_code code = gimple_cond_code (stmt);
2176           tree rhs1 = gimple_cond_lhs (stmt);
2177           tree rhs2 = gimple_cond_rhs (stmt);
2178           if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2179               || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2180             val = bit_value_binop (code, TREE_TYPE (rhs1), rhs1, rhs2);
2181         }
2182       else if (code == GIMPLE_CALL
2183                && (fndecl = gimple_call_fndecl (stmt))
2184                && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
2185         {
2186           switch (DECL_FUNCTION_CODE (fndecl))
2187             {
2188             case BUILT_IN_MALLOC:
2189             case BUILT_IN_REALLOC:
2190             case BUILT_IN_CALLOC:
2191               val.lattice_val = CONSTANT;
2192               val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2193               val.mask = shwi_to_double_int
2194                            (~(((HOST_WIDE_INT) MALLOC_ABI_ALIGNMENT)
2195                               / BITS_PER_UNIT - 1));
2196               break;
2197
2198             case BUILT_IN_ALLOCA:
2199               val.lattice_val = CONSTANT;
2200               val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2201               val.mask = shwi_to_double_int
2202                            (~(((HOST_WIDE_INT) BIGGEST_ALIGNMENT)
2203                               / BITS_PER_UNIT - 1));
2204               break;
2205
2206             default:;
2207             }
2208         }
2209       is_constant = (val.lattice_val == CONSTANT);
2210     }
2211
2212   if (!is_constant)
2213     {
2214       /* The statement produced a nonconstant value.  If the statement
2215          had UNDEFINED operands, then the result of the statement
2216          should be UNDEFINED.  Otherwise, the statement is VARYING.  */
2217       if (likelyvalue == UNDEFINED)
2218         {
2219           val.lattice_val = likelyvalue;
2220           val.mask = double_int_zero;
2221         }
2222       else
2223         {
2224           val.lattice_val = VARYING;
2225           val.mask = double_int_minus_one;
2226         }
2227
2228       val.value = NULL_TREE;
2229     }
2230
2231   return val;
2232 }
2233
2234 /* Fold the stmt at *GSI with CCP specific information that propagating
2235    and regular folding does not catch.  */
2236
2237 static bool
2238 ccp_fold_stmt (gimple_stmt_iterator *gsi)
2239 {
2240   gimple stmt = gsi_stmt (*gsi);
2241
2242   switch (gimple_code (stmt))
2243     {
2244     case GIMPLE_COND:
2245       {
2246         prop_value_t val;
2247         /* Statement evaluation will handle type mismatches in constants
2248            more gracefully than the final propagation.  This allows us to
2249            fold more conditionals here.  */
2250         val = evaluate_stmt (stmt);
2251         if (val.lattice_val != CONSTANT
2252             || !double_int_zero_p (val.mask))
2253           return false;
2254
2255         if (dump_file)
2256           {
2257             fprintf (dump_file, "Folding predicate ");
2258             print_gimple_expr (dump_file, stmt, 0, 0);
2259             fprintf (dump_file, " to ");
2260             print_generic_expr (dump_file, val.value, 0);
2261             fprintf (dump_file, "\n");
2262           }
2263
2264         if (integer_zerop (val.value))
2265           gimple_cond_make_false (stmt);
2266         else
2267           gimple_cond_make_true (stmt);
2268
2269         return true;
2270       }
2271
2272     case GIMPLE_CALL:
2273       {
2274         tree lhs = gimple_call_lhs (stmt);
2275         tree val;
2276         tree argt;
2277         tree callee;
2278         bool changed = false;
2279         unsigned i;
2280
2281         /* If the call was folded into a constant make sure it goes
2282            away even if we cannot propagate into all uses because of
2283            type issues.  */
2284         if (lhs
2285             && TREE_CODE (lhs) == SSA_NAME
2286             && (val = get_constant_value (lhs)))
2287           {
2288             tree new_rhs = unshare_expr (val);
2289             bool res;
2290             if (!useless_type_conversion_p (TREE_TYPE (lhs),
2291                                             TREE_TYPE (new_rhs)))
2292               new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
2293             res = update_call_from_tree (gsi, new_rhs);
2294             gcc_assert (res);
2295             return true;
2296           }
2297
2298         /* Propagate into the call arguments.  Compared to replace_uses_in
2299            this can use the argument slot types for type verification
2300            instead of the current argument type.  We also can safely
2301            drop qualifiers here as we are dealing with constants anyway.  */
2302         argt = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt))));
2303         for (i = 0; i < gimple_call_num_args (stmt) && argt;
2304              ++i, argt = TREE_CHAIN (argt))
2305           {
2306             tree arg = gimple_call_arg (stmt, i);
2307             if (TREE_CODE (arg) == SSA_NAME
2308                 && (val = get_constant_value (arg))
2309                 && useless_type_conversion_p
2310                      (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
2311                       TYPE_MAIN_VARIANT (TREE_TYPE (val))))
2312               {
2313                 gimple_call_set_arg (stmt, i, unshare_expr (val));
2314                 changed = true;
2315               }
2316           }
2317
2318         callee = gimple_call_fn (stmt);
2319         if (TREE_CODE (callee) == OBJ_TYPE_REF
2320             && TREE_CODE (OBJ_TYPE_REF_EXPR (callee)) == SSA_NAME)
2321           {
2322             tree expr = OBJ_TYPE_REF_EXPR (callee);
2323             OBJ_TYPE_REF_EXPR (callee) = valueize_op (expr);
2324             if (TREE_CODE (OBJ_TYPE_REF_EXPR (callee)) == ADDR_EXPR)
2325               {
2326                 tree t;
2327                 t = gimple_fold_obj_type_ref (callee, NULL_TREE);
2328                 if (t)
2329                   {
2330                     gimple_call_set_fn (stmt, t);
2331                     changed = true;
2332                   }
2333               }
2334             OBJ_TYPE_REF_EXPR (callee) = expr;
2335           }
2336
2337         return changed;
2338       }
2339
2340     case GIMPLE_ASSIGN:
2341       {
2342         tree lhs = gimple_assign_lhs (stmt);
2343         tree val;
2344
2345         /* If we have a load that turned out to be constant replace it
2346            as we cannot propagate into all uses in all cases.  */
2347         if (gimple_assign_single_p (stmt)
2348             && TREE_CODE (lhs) == SSA_NAME
2349             && (val = get_constant_value (lhs)))
2350           {
2351             tree rhs = unshare_expr (val);
2352             if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
2353               rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
2354             gimple_assign_set_rhs_from_tree (gsi, rhs);
2355             return true;
2356           }
2357
2358         return false;
2359       }
2360
2361     default:
2362       return false;
2363     }
2364 }
2365
2366 /* Visit the assignment statement STMT.  Set the value of its LHS to the
2367    value computed by the RHS and store LHS in *OUTPUT_P.  If STMT
2368    creates virtual definitions, set the value of each new name to that
2369    of the RHS (if we can derive a constant out of the RHS).
2370    Value-returning call statements also perform an assignment, and
2371    are handled here.  */
2372
2373 static enum ssa_prop_result
2374 visit_assignment (gimple stmt, tree *output_p)
2375 {
2376   prop_value_t val;
2377   enum ssa_prop_result retval;
2378
2379   tree lhs = gimple_get_lhs (stmt);
2380
2381   gcc_assert (gimple_code (stmt) != GIMPLE_CALL
2382               || gimple_call_lhs (stmt) != NULL_TREE);
2383
2384   if (gimple_assign_single_p (stmt)
2385       && gimple_assign_rhs_code (stmt) == SSA_NAME)
2386     /* For a simple copy operation, we copy the lattice values.  */
2387     val = *get_value (gimple_assign_rhs1 (stmt));
2388   else
2389     /* Evaluate the statement, which could be
2390        either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
2391     val = evaluate_stmt (stmt);
2392
2393   retval = SSA_PROP_NOT_INTERESTING;
2394
2395   /* Set the lattice value of the statement's output.  */
2396   if (TREE_CODE (lhs) == SSA_NAME)
2397     {
2398       /* If STMT is an assignment to an SSA_NAME, we only have one
2399          value to set.  */
2400       if (set_lattice_value (lhs, val))
2401         {
2402           *output_p = lhs;
2403           if (val.lattice_val == VARYING)
2404             retval = SSA_PROP_VARYING;
2405           else
2406             retval = SSA_PROP_INTERESTING;
2407         }
2408     }
2409
2410   return retval;
2411 }
2412
2413
2414 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
2415    if it can determine which edge will be taken.  Otherwise, return
2416    SSA_PROP_VARYING.  */
2417
2418 static enum ssa_prop_result
2419 visit_cond_stmt (gimple stmt, edge *taken_edge_p)
2420 {
2421   prop_value_t val;
2422   basic_block block;
2423
2424   block = gimple_bb (stmt);
2425   val = evaluate_stmt (stmt);
2426   if (val.lattice_val != CONSTANT
2427       || !double_int_zero_p (val.mask))
2428     return SSA_PROP_VARYING;
2429
2430   /* Find which edge out of the conditional block will be taken and add it
2431      to the worklist.  If no single edge can be determined statically,
2432      return SSA_PROP_VARYING to feed all the outgoing edges to the
2433      propagation engine.  */
2434   *taken_edge_p = find_taken_edge (block, val.value);
2435   if (*taken_edge_p)
2436     return SSA_PROP_INTERESTING;
2437   else
2438     return SSA_PROP_VARYING;
2439 }
2440
2441
2442 /* Evaluate statement STMT.  If the statement produces an output value and
2443    its evaluation changes the lattice value of its output, return
2444    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
2445    output value.
2446
2447    If STMT is a conditional branch and we can determine its truth
2448    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
2449    value, return SSA_PROP_VARYING.  */
2450
2451 static enum ssa_prop_result
2452 ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
2453 {
2454   tree def;
2455   ssa_op_iter iter;
2456
2457   if (dump_file && (dump_flags & TDF_DETAILS))
2458     {
2459       fprintf (dump_file, "\nVisiting statement:\n");
2460       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2461     }
2462
2463   switch (gimple_code (stmt))
2464     {
2465       case GIMPLE_ASSIGN:
2466         /* If the statement is an assignment that produces a single
2467            output value, evaluate its RHS to see if the lattice value of
2468            its output has changed.  */
2469         return visit_assignment (stmt, output_p);
2470
2471       case GIMPLE_CALL:
2472         /* A value-returning call also performs an assignment.  */
2473         if (gimple_call_lhs (stmt) != NULL_TREE)
2474           return visit_assignment (stmt, output_p);
2475         break;
2476
2477       case GIMPLE_COND:
2478       case GIMPLE_SWITCH:
2479         /* If STMT is a conditional branch, see if we can determine
2480            which branch will be taken.   */
2481         /* FIXME.  It appears that we should be able to optimize
2482            computed GOTOs here as well.  */
2483         return visit_cond_stmt (stmt, taken_edge_p);
2484
2485       default:
2486         break;
2487     }
2488
2489   /* Any other kind of statement is not interesting for constant
2490      propagation and, therefore, not worth simulating.  */
2491   if (dump_file && (dump_flags & TDF_DETAILS))
2492     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
2493
2494   /* Definitions made by statements other than assignments to
2495      SSA_NAMEs represent unknown modifications to their outputs.
2496      Mark them VARYING.  */
2497   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
2498     {
2499       prop_value_t v = { VARYING, NULL_TREE, { -1, (HOST_WIDE_INT) -1 } };
2500       set_lattice_value (def, v);
2501     }
2502
2503   return SSA_PROP_VARYING;
2504 }
2505
2506
2507 /* Main entry point for SSA Conditional Constant Propagation.  */
2508
2509 static unsigned int
2510 do_ssa_ccp (void)
2511 {
2512   ccp_initialize ();
2513   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
2514   if (ccp_finalize ())
2515     return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
2516   else
2517     return 0;
2518 }
2519
2520
2521 static bool
2522 gate_ccp (void)
2523 {
2524   return flag_tree_ccp != 0;
2525 }
2526
2527
2528 struct gimple_opt_pass pass_ccp =
2529 {
2530  {
2531   GIMPLE_PASS,
2532   "ccp",                                /* name */
2533   gate_ccp,                             /* gate */
2534   do_ssa_ccp,                           /* execute */
2535   NULL,                                 /* sub */
2536   NULL,                                 /* next */
2537   0,                                    /* static_pass_number */
2538   TV_TREE_CCP,                          /* tv_id */
2539   PROP_cfg | PROP_ssa,                  /* properties_required */
2540   0,                                    /* properties_provided */
2541   0,                                    /* properties_destroyed */
2542   0,                                    /* todo_flags_start */
2543   TODO_dump_func | TODO_verify_ssa
2544   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
2545  }
2546 };
2547
2548
2549
2550 /* Try to optimize out __builtin_stack_restore.  Optimize it out
2551    if there is another __builtin_stack_restore in the same basic
2552    block and no calls or ASM_EXPRs are in between, or if this block's
2553    only outgoing edge is to EXIT_BLOCK and there are no calls or
2554    ASM_EXPRs after this __builtin_stack_restore.  */
2555
2556 static tree
2557 optimize_stack_restore (gimple_stmt_iterator i)
2558 {
2559   tree callee;
2560   gimple stmt;
2561
2562   basic_block bb = gsi_bb (i);
2563   gimple call = gsi_stmt (i);
2564
2565   if (gimple_code (call) != GIMPLE_CALL
2566       || gimple_call_num_args (call) != 1
2567       || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
2568       || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
2569     return NULL_TREE;
2570
2571   for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
2572     {
2573       stmt = gsi_stmt (i);
2574       if (gimple_code (stmt) == GIMPLE_ASM)
2575         return NULL_TREE;
2576       if (gimple_code (stmt) != GIMPLE_CALL)
2577         continue;
2578
2579       callee = gimple_call_fndecl (stmt);
2580       if (!callee
2581           || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2582           /* All regular builtins are ok, just obviously not alloca.  */
2583           || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA)
2584         return NULL_TREE;
2585
2586       if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
2587         goto second_stack_restore;
2588     }
2589
2590   if (!gsi_end_p (i))
2591     return NULL_TREE;
2592
2593   /* Allow one successor of the exit block, or zero successors.  */
2594   switch (EDGE_COUNT (bb->succs))
2595     {
2596     case 0:
2597       break;
2598     case 1:
2599       if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
2600         return NULL_TREE;
2601       break;
2602     default:
2603       return NULL_TREE;
2604     }
2605  second_stack_restore:
2606
2607   /* If there's exactly one use, then zap the call to __builtin_stack_save.
2608      If there are multiple uses, then the last one should remove the call.
2609      In any case, whether the call to __builtin_stack_save can be removed
2610      or not is irrelevant to removing the call to __builtin_stack_restore.  */
2611   if (has_single_use (gimple_call_arg (call, 0)))
2612     {
2613       gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
2614       if (is_gimple_call (stack_save))
2615         {
2616           callee = gimple_call_fndecl (stack_save);
2617           if (callee
2618               && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2619               && DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
2620             {
2621               gimple_stmt_iterator stack_save_gsi;
2622               tree rhs;
2623
2624               stack_save_gsi = gsi_for_stmt (stack_save);
2625               rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
2626               update_call_from_tree (&stack_save_gsi, rhs);
2627             }
2628         }
2629     }
2630
2631   /* No effect, so the statement will be deleted.  */
2632   return integer_zero_node;
2633 }
2634
2635 /* If va_list type is a simple pointer and nothing special is needed,
2636    optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
2637    __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
2638    pointer assignment.  */
2639
2640 static tree
2641 optimize_stdarg_builtin (gimple call)
2642 {
2643   tree callee, lhs, rhs, cfun_va_list;
2644   bool va_list_simple_ptr;
2645   location_t loc = gimple_location (call);
2646
2647   if (gimple_code (call) != GIMPLE_CALL)
2648     return NULL_TREE;
2649
2650   callee = gimple_call_fndecl (call);
2651
2652   cfun_va_list = targetm.fn_abi_va_list (callee);
2653   va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
2654                        && (TREE_TYPE (cfun_va_list) == void_type_node
2655                            || TREE_TYPE (cfun_va_list) == char_type_node);
2656
2657   switch (DECL_FUNCTION_CODE (callee))
2658     {
2659     case BUILT_IN_VA_START:
2660       if (!va_list_simple_ptr
2661           || targetm.expand_builtin_va_start != NULL
2662           || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
2663         return NULL_TREE;
2664
2665       if (gimple_call_num_args (call) != 2)
2666         return NULL_TREE;
2667
2668       lhs = gimple_call_arg (call, 0);
2669       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2670           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2671              != TYPE_MAIN_VARIANT (cfun_va_list))
2672         return NULL_TREE;
2673
2674       lhs = build_fold_indirect_ref_loc (loc, lhs);
2675       rhs = build_call_expr_loc (loc, built_in_decls[BUILT_IN_NEXT_ARG],
2676                              1, integer_zero_node);
2677       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
2678       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2679
2680     case BUILT_IN_VA_COPY:
2681       if (!va_list_simple_ptr)
2682         return NULL_TREE;
2683
2684       if (gimple_call_num_args (call) != 2)
2685         return NULL_TREE;
2686
2687       lhs = gimple_call_arg (call, 0);
2688       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2689           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2690              != TYPE_MAIN_VARIANT (cfun_va_list))
2691         return NULL_TREE;
2692
2693       lhs = build_fold_indirect_ref_loc (loc, lhs);
2694       rhs = gimple_call_arg (call, 1);
2695       if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
2696           != TYPE_MAIN_VARIANT (cfun_va_list))
2697         return NULL_TREE;
2698
2699       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
2700       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2701
2702     case BUILT_IN_VA_END:
2703       /* No effect, so the statement will be deleted.  */
2704       return integer_zero_node;
2705
2706     default:
2707       gcc_unreachable ();
2708     }
2709 }
2710
2711 /* A simple pass that attempts to fold all builtin functions.  This pass
2712    is run after we've propagated as many constants as we can.  */
2713
2714 static unsigned int
2715 execute_fold_all_builtins (void)
2716 {
2717   bool cfg_changed = false;
2718   basic_block bb;
2719   unsigned int todoflags = 0;
2720
2721   FOR_EACH_BB (bb)
2722     {
2723       gimple_stmt_iterator i;
2724       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
2725         {
2726           gimple stmt, old_stmt;
2727           tree callee, result;
2728           enum built_in_function fcode;
2729
2730           stmt = gsi_stmt (i);
2731
2732           if (gimple_code (stmt) != GIMPLE_CALL)
2733             {
2734               gsi_next (&i);
2735               continue;
2736             }
2737           callee = gimple_call_fndecl (stmt);
2738           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
2739             {
2740               gsi_next (&i);
2741               continue;
2742             }
2743           fcode = DECL_FUNCTION_CODE (callee);
2744
2745           result = gimple_fold_builtin (stmt);
2746
2747           if (result)
2748             gimple_remove_stmt_histograms (cfun, stmt);
2749
2750           if (!result)
2751             switch (DECL_FUNCTION_CODE (callee))
2752               {
2753               case BUILT_IN_CONSTANT_P:
2754                 /* Resolve __builtin_constant_p.  If it hasn't been
2755                    folded to integer_one_node by now, it's fairly
2756                    certain that the value simply isn't constant.  */
2757                 result = integer_zero_node;
2758                 break;
2759
2760               case BUILT_IN_STACK_RESTORE:
2761                 result = optimize_stack_restore (i);
2762                 if (result)
2763                   break;
2764                 gsi_next (&i);
2765                 continue;
2766
2767               case BUILT_IN_VA_START:
2768               case BUILT_IN_VA_END:
2769               case BUILT_IN_VA_COPY:
2770                 /* These shouldn't be folded before pass_stdarg.  */
2771                 result = optimize_stdarg_builtin (stmt);
2772                 if (result)
2773                   break;
2774                 /* FALLTHRU */
2775
2776               default:
2777                 gsi_next (&i);
2778                 continue;
2779               }
2780
2781           if (dump_file && (dump_flags & TDF_DETAILS))
2782             {
2783               fprintf (dump_file, "Simplified\n  ");
2784               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2785             }
2786
2787           old_stmt = stmt;
2788           if (!update_call_from_tree (&i, result))
2789             {
2790               gimplify_and_update_call_from_tree (&i, result);
2791               todoflags |= TODO_update_address_taken;
2792             }
2793
2794           stmt = gsi_stmt (i);
2795           update_stmt (stmt);
2796
2797           if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
2798               && gimple_purge_dead_eh_edges (bb))
2799             cfg_changed = true;
2800
2801           if (dump_file && (dump_flags & TDF_DETAILS))
2802             {
2803               fprintf (dump_file, "to\n  ");
2804               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2805               fprintf (dump_file, "\n");
2806             }
2807
2808           /* Retry the same statement if it changed into another
2809              builtin, there might be new opportunities now.  */
2810           if (gimple_code (stmt) != GIMPLE_CALL)
2811             {
2812               gsi_next (&i);
2813               continue;
2814             }
2815           callee = gimple_call_fndecl (stmt);
2816           if (!callee
2817               || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2818               || DECL_FUNCTION_CODE (callee) == fcode)
2819             gsi_next (&i);
2820         }
2821     }
2822
2823   /* Delete unreachable blocks.  */
2824   if (cfg_changed)
2825     todoflags |= TODO_cleanup_cfg;
2826
2827   return todoflags;
2828 }
2829
2830
2831 struct gimple_opt_pass pass_fold_builtins =
2832 {
2833  {
2834   GIMPLE_PASS,
2835   "fab",                                /* name */
2836   NULL,                                 /* gate */
2837   execute_fold_all_builtins,            /* execute */
2838   NULL,                                 /* sub */
2839   NULL,                                 /* next */
2840   0,                                    /* static_pass_number */
2841   TV_NONE,                              /* tv_id */
2842   PROP_cfg | PROP_ssa,                  /* properties_required */
2843   0,                                    /* properties_provided */
2844   0,                                    /* properties_destroyed */
2845   0,                                    /* todo_flags_start */
2846   TODO_dump_func
2847     | TODO_verify_ssa
2848     | TODO_update_ssa                   /* todo_flags_finish */
2849  }
2850 };