OSDN Git Service

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