OSDN Git Service

2013-03-06 Joel Sherrill <joel.sherrill@oarcorp.com>
[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       /* Do not return an error_mark_node DECL_INITIAL.  LTO uses this
1368          as special marker (_not_ zero ...) for its own purposes.  */
1369       if (DECL_INITIAL (base) == error_mark_node)
1370         return NULL_TREE;
1371       return DECL_INITIAL (base);
1372
1373     case ARRAY_REF:
1374     case COMPONENT_REF:
1375       base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size);
1376       if (max_size == -1 || size != max_size)
1377         return NULL_TREE;
1378       *bit_offset +=  bit_offset2;
1379       return get_base_constructor (base, bit_offset);
1380
1381     case STRING_CST:
1382     case CONSTRUCTOR:
1383       return base;
1384
1385     default:
1386       return NULL_TREE;
1387     }
1388 }
1389
1390 /* CTOR is STRING_CST.  Fold reference of type TYPE and size SIZE
1391    to the memory at bit OFFSET.  
1392
1393    We do only simple job of folding byte accesses.  */
1394
1395 static tree
1396 fold_string_cst_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
1397                                 unsigned HOST_WIDE_INT size)
1398 {
1399   if (INTEGRAL_TYPE_P (type)
1400       && (TYPE_MODE (type)
1401           == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1402       && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1403           == MODE_INT)
1404       && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1405       && size == BITS_PER_UNIT
1406       && !(offset % BITS_PER_UNIT))
1407     {
1408       offset /= BITS_PER_UNIT;
1409       if (offset < (unsigned HOST_WIDE_INT) TREE_STRING_LENGTH (ctor))
1410         return build_int_cst_type (type, (TREE_STRING_POINTER (ctor)
1411                                    [offset]));
1412       /* Folding
1413          const char a[20]="hello";
1414          return a[10];
1415
1416          might lead to offset greater than string length.  In this case we
1417          know value is either initialized to 0 or out of bounds.  Return 0
1418          in both cases.  */
1419       return build_zero_cst (type);
1420     }
1421   return NULL_TREE;
1422 }
1423
1424 /* CTOR is CONSTRUCTOR of an array type.  Fold reference of type TYPE and size
1425    SIZE to the memory at bit OFFSET.  */
1426
1427 static tree
1428 fold_array_ctor_reference (tree type, tree ctor,
1429                            unsigned HOST_WIDE_INT offset,
1430                            unsigned HOST_WIDE_INT size)
1431 {
1432   unsigned HOST_WIDE_INT cnt;
1433   tree cfield, cval;
1434   double_int low_bound, elt_size;
1435   double_int index, max_index;
1436   double_int access_index;
1437   tree domain_type = TYPE_DOMAIN (TREE_TYPE (ctor));
1438   HOST_WIDE_INT inner_offset;
1439
1440   /* Compute low bound and elt size.  */
1441   if (domain_type && TYPE_MIN_VALUE (domain_type))
1442     {
1443       /* Static constructors for variably sized objects makes no sense.  */
1444       gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST);
1445       low_bound = tree_to_double_int (TYPE_MIN_VALUE (domain_type));
1446     }
1447   else
1448     low_bound = double_int_zero;
1449   /* Static constructors for variably sized objects makes no sense.  */
1450   gcc_assert (TREE_CODE(TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))))
1451               == INTEGER_CST);
1452   elt_size =
1453     tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))));
1454
1455
1456   /* We can handle only constantly sized accesses that are known to not
1457      be larger than size of array element.  */
1458   if (!TYPE_SIZE_UNIT (type)
1459       || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
1460       || double_int_cmp (elt_size,
1461                          tree_to_double_int (TYPE_SIZE_UNIT (type)), 0) < 0)
1462     return NULL_TREE;
1463
1464   /* Compute the array index we look for.  */
1465   access_index = double_int_udiv (uhwi_to_double_int (offset / BITS_PER_UNIT),
1466                                   elt_size, TRUNC_DIV_EXPR);
1467   access_index = double_int_add (access_index, low_bound);
1468
1469   /* And offset within the access.  */
1470   inner_offset = offset % (double_int_to_uhwi (elt_size) * BITS_PER_UNIT);
1471
1472   /* See if the array field is large enough to span whole access.  We do not
1473      care to fold accesses spanning multiple array indexes.  */
1474   if (inner_offset + size > double_int_to_uhwi (elt_size) * BITS_PER_UNIT)
1475     return NULL_TREE;
1476
1477   index = double_int_sub (low_bound, double_int_one);
1478   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1479     {
1480       /* Array constructor might explicitely set index, or specify range
1481          or leave index NULL meaning that it is next index after previous
1482          one.  */
1483       if (cfield)
1484         {
1485           if (TREE_CODE (cfield) == INTEGER_CST)
1486             max_index = index = tree_to_double_int (cfield);
1487           else
1488             {
1489               gcc_assert (TREE_CODE (cfield) == RANGE_EXPR);
1490               index = tree_to_double_int (TREE_OPERAND (cfield, 0));
1491               max_index = tree_to_double_int (TREE_OPERAND (cfield, 1));
1492             }
1493         }
1494       else
1495         max_index = index = double_int_add (index, double_int_one);
1496
1497       /* Do we have match?  */
1498       if (double_int_cmp (access_index, index, 1) >= 0
1499           && double_int_cmp (access_index, max_index, 1) <= 0)
1500         return fold_ctor_reference (type, cval, inner_offset, size);
1501     }
1502   /* When memory is not explicitely mentioned in constructor,
1503      it is 0 (or out of range).  */
1504   return build_zero_cst (type);
1505 }
1506
1507 /* CTOR is CONSTRUCTOR of an aggregate or vector.
1508    Fold reference of type TYPE and size SIZE to the memory at bit OFFSET.  */
1509
1510 static tree
1511 fold_nonarray_ctor_reference (tree type, tree ctor,
1512                               unsigned HOST_WIDE_INT offset,
1513                               unsigned HOST_WIDE_INT size)
1514 {
1515   unsigned HOST_WIDE_INT cnt;
1516   tree cfield, cval;
1517
1518   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield,
1519                             cval)
1520     {
1521       tree byte_offset = DECL_FIELD_OFFSET (cfield);
1522       tree field_offset = DECL_FIELD_BIT_OFFSET (cfield);
1523       tree field_size = DECL_SIZE (cfield);
1524       double_int bitoffset;
1525       double_int byte_offset_cst = tree_to_double_int (byte_offset);
1526       double_int bits_per_unit_cst = uhwi_to_double_int (BITS_PER_UNIT);
1527       double_int bitoffset_end, access_end;
1528
1529       /* Variable sized objects in static constructors makes no sense,
1530          but field_size can be NULL for flexible array members.  */
1531       gcc_assert (TREE_CODE (field_offset) == INTEGER_CST
1532                   && TREE_CODE (byte_offset) == INTEGER_CST
1533                   && (field_size != NULL_TREE
1534                       ? TREE_CODE (field_size) == INTEGER_CST
1535                       : TREE_CODE (TREE_TYPE (cfield)) == ARRAY_TYPE));
1536
1537       /* Compute bit offset of the field.  */
1538       bitoffset = double_int_add (tree_to_double_int (field_offset),
1539                                   double_int_mul (byte_offset_cst,
1540                                                   bits_per_unit_cst));
1541       /* Compute bit offset where the field ends.  */
1542       if (field_size != NULL_TREE)
1543         bitoffset_end = double_int_add (bitoffset,
1544                                         tree_to_double_int (field_size));
1545       else
1546         bitoffset_end = double_int_zero;
1547
1548       access_end = double_int_add (uhwi_to_double_int (offset),
1549                                    uhwi_to_double_int (size));
1550
1551       /* Is there any overlap between [OFFSET, OFFSET+SIZE) and
1552          [BITOFFSET, BITOFFSET_END)?  */
1553       if (double_int_cmp (access_end, bitoffset, 0) > 0
1554           && (field_size == NULL_TREE
1555               || double_int_cmp (uhwi_to_double_int (offset),
1556                                  bitoffset_end, 0) < 0))
1557         {
1558           double_int inner_offset = double_int_sub (uhwi_to_double_int (offset),
1559                                                     bitoffset);
1560           /* We do have overlap.  Now see if field is large enough to
1561              cover the access.  Give up for accesses spanning multiple
1562              fields.  */
1563           if (double_int_cmp (access_end, bitoffset_end, 0) > 0)
1564             return NULL_TREE;
1565           if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) < 0)
1566             return NULL_TREE;
1567           return fold_ctor_reference (type, cval,
1568                                       double_int_to_uhwi (inner_offset), size);
1569         }
1570     }
1571   /* When memory is not explicitely mentioned in constructor, it is 0.  */
1572   return build_zero_cst (type);
1573 }
1574
1575 /* CTOR is value initializing memory, fold reference of type TYPE and size SIZE
1576    to the memory at bit OFFSET.  */
1577
1578 static tree
1579 fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
1580                      unsigned HOST_WIDE_INT size)
1581 {
1582   tree ret;
1583
1584   /* We found the field with exact match.  */
1585   if (useless_type_conversion_p (type, TREE_TYPE (ctor))
1586       && !offset)
1587     return canonicalize_constructor_val (ctor);
1588
1589   /* We are at the end of walk, see if we can view convert the
1590      result.  */
1591   if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
1592       /* VIEW_CONVERT_EXPR is defined only for matching sizes.  */
1593       && operand_equal_p (TYPE_SIZE (type),
1594                           TYPE_SIZE (TREE_TYPE (ctor)), 0))
1595     {
1596       ret = canonicalize_constructor_val (ctor);
1597       ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
1598       if (ret)
1599         STRIP_NOPS (ret);
1600       return ret;
1601     }
1602   if (TREE_CODE (ctor) == STRING_CST)
1603     return fold_string_cst_ctor_reference (type, ctor, offset, size);
1604   if (TREE_CODE (ctor) == CONSTRUCTOR)
1605     {
1606
1607       if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE)
1608         return fold_array_ctor_reference (type, ctor, offset, size);
1609       else
1610         return fold_nonarray_ctor_reference (type, ctor, offset, size);
1611     }
1612
1613   return NULL_TREE;
1614 }
1615
1616 /* Return the tree representing the element referenced by T if T is an
1617    ARRAY_REF or COMPONENT_REF into constant aggregates.  Return
1618    NULL_TREE otherwise.  */
1619
1620 tree
1621 fold_const_aggregate_ref (tree t)
1622 {
1623   tree ctor, idx, base;
1624   HOST_WIDE_INT offset, size, max_size;
1625   tree tem;
1626
1627   if (TREE_THIS_VOLATILE (t))
1628     return NULL_TREE;
1629
1630   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1631     return get_symbol_constant_value (t);
1632
1633   tem = fold_read_from_constant_string (t);
1634   if (tem)
1635     return tem;
1636
1637   switch (TREE_CODE (t))
1638     {
1639     case ARRAY_REF:
1640     case ARRAY_RANGE_REF:
1641       /* Constant indexes are handled well by get_base_constructor.
1642          Only special case variable offsets.
1643          FIXME: This code can't handle nested references with variable indexes
1644          (they will be handled only by iteration of ccp).  Perhaps we can bring
1645          get_ref_base_and_extent here and make it use get_constant_value.  */
1646       if (TREE_CODE (TREE_OPERAND (t, 1)) == SSA_NAME
1647           && (idx = get_constant_value (TREE_OPERAND (t, 1)))
1648           && host_integerp (idx, 0))
1649         {
1650           tree low_bound, unit_size;
1651
1652           /* If the resulting bit-offset is constant, track it.  */
1653           if ((low_bound = array_ref_low_bound (t),
1654                host_integerp (low_bound, 0))
1655               && (unit_size = array_ref_element_size (t),
1656                   host_integerp (unit_size, 1)))
1657             {
1658               offset = TREE_INT_CST_LOW (idx);
1659               offset -= TREE_INT_CST_LOW (low_bound);
1660               offset *= TREE_INT_CST_LOW (unit_size);
1661               offset *= BITS_PER_UNIT;
1662
1663               base = TREE_OPERAND (t, 0);
1664               ctor = get_base_constructor (base, &offset);
1665               /* Empty constructor.  Always fold to 0. */
1666               if (ctor == error_mark_node)
1667                 return build_zero_cst (TREE_TYPE (t));
1668               /* Out of bound array access.  Value is undefined, but don't fold. */
1669               if (offset < 0)
1670                 return NULL_TREE;
1671               /* We can not determine ctor.  */
1672               if (!ctor)
1673                 return NULL_TREE;
1674               return fold_ctor_reference (TREE_TYPE (t), ctor, offset,
1675                                           TREE_INT_CST_LOW (unit_size)
1676                                           * BITS_PER_UNIT);
1677             }
1678         }
1679       /* Fallthru.  */
1680         
1681     case COMPONENT_REF:
1682     case BIT_FIELD_REF:
1683     case TARGET_MEM_REF:
1684     case MEM_REF:
1685       base = get_ref_base_and_extent (t, &offset, &size, &max_size);
1686       ctor = get_base_constructor (base, &offset);
1687
1688       /* Empty constructor.  Always fold to 0. */
1689       if (ctor == error_mark_node)
1690         return build_zero_cst (TREE_TYPE (t));
1691       /* We do not know precise address.  */
1692       if (max_size == -1 || max_size != size)
1693         return NULL_TREE;
1694       /* We can not determine ctor.  */
1695       if (!ctor)
1696         return NULL_TREE;
1697
1698       /* Out of bound array access.  Value is undefined, but don't fold. */
1699       if (offset < 0)
1700         return NULL_TREE;
1701
1702       return fold_ctor_reference (TREE_TYPE (t), ctor, offset, size);
1703
1704     case REALPART_EXPR:
1705     case IMAGPART_EXPR:
1706       {
1707         tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1708         if (c && TREE_CODE (c) == COMPLEX_CST)
1709           return fold_build1_loc (EXPR_LOCATION (t),
1710                               TREE_CODE (t), TREE_TYPE (t), c);
1711         break;
1712       }
1713
1714     default:
1715       break;
1716     }
1717
1718   return NULL_TREE;
1719 }
1720
1721 /* Apply the operation CODE in type TYPE to the value, mask pair
1722    RVAL and RMASK representing a value of type RTYPE and set
1723    the value, mask pair *VAL and *MASK to the result.  */
1724
1725 static void
1726 bit_value_unop_1 (enum tree_code code, tree type,
1727                   double_int *val, double_int *mask,
1728                   tree rtype, double_int rval, double_int rmask)
1729 {
1730   switch (code)
1731     {
1732     case BIT_NOT_EXPR:
1733       *mask = rmask;
1734       *val = double_int_not (rval);
1735       break;
1736
1737     case NEGATE_EXPR:
1738       {
1739         double_int temv, temm;
1740         /* Return ~rval + 1.  */
1741         bit_value_unop_1 (BIT_NOT_EXPR, type, &temv, &temm, type, rval, rmask);
1742         bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1743                          type, temv, temm,
1744                          type, double_int_one, double_int_zero);
1745         break;
1746       }
1747
1748     CASE_CONVERT:
1749       {
1750         bool uns;
1751
1752         /* First extend mask and value according to the original type.  */
1753         uns = (TREE_CODE (rtype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (rtype)
1754                ? 0 : TYPE_UNSIGNED (rtype));
1755         *mask = double_int_ext (rmask, TYPE_PRECISION (rtype), uns);
1756         *val = double_int_ext (rval, TYPE_PRECISION (rtype), uns);
1757
1758         /* Then extend mask and value according to the target type.  */
1759         uns = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1760                ? 0 : TYPE_UNSIGNED (type));
1761         *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1762         *val = double_int_ext (*val, TYPE_PRECISION (type), uns);
1763         break;
1764       }
1765
1766     default:
1767       *mask = double_int_minus_one;
1768       break;
1769     }
1770 }
1771
1772 /* Apply the operation CODE in type TYPE to the value, mask pairs
1773    R1VAL, R1MASK and R2VAL, R2MASK representing a values of type R1TYPE
1774    and R2TYPE and set the value, mask pair *VAL and *MASK to the result.  */
1775
1776 static void
1777 bit_value_binop_1 (enum tree_code code, tree type,
1778                    double_int *val, double_int *mask,
1779                    tree r1type, double_int r1val, double_int r1mask,
1780                    tree r2type, double_int r2val, double_int r2mask)
1781 {
1782   bool uns = (TREE_CODE (type) == INTEGER_TYPE
1783               && TYPE_IS_SIZETYPE (type) ? 0 : TYPE_UNSIGNED (type));
1784   /* Assume we'll get a constant result.  Use an initial varying value,
1785      we fall back to varying in the end if necessary.  */
1786   *mask = double_int_minus_one;
1787   switch (code)
1788     {
1789     case BIT_AND_EXPR:
1790       /* The mask is constant where there is a known not
1791          set bit, (m1 | m2) & ((v1 | m1) & (v2 | m2)) */
1792       *mask = double_int_and (double_int_ior (r1mask, r2mask),
1793                               double_int_and (double_int_ior (r1val, r1mask),
1794                                               double_int_ior (r2val, r2mask)));
1795       *val = double_int_and (r1val, r2val);
1796       break;
1797
1798     case BIT_IOR_EXPR:
1799       /* The mask is constant where there is a known
1800          set bit, (m1 | m2) & ~((v1 & ~m1) | (v2 & ~m2)).  */
1801       *mask = double_int_and_not
1802                 (double_int_ior (r1mask, r2mask),
1803                  double_int_ior (double_int_and_not (r1val, r1mask),
1804                                  double_int_and_not (r2val, r2mask)));
1805       *val = double_int_ior (r1val, r2val);
1806       break;
1807
1808     case BIT_XOR_EXPR:
1809       /* m1 | m2  */
1810       *mask = double_int_ior (r1mask, r2mask);
1811       *val = double_int_xor (r1val, r2val);
1812       break;
1813
1814     case LROTATE_EXPR:
1815     case RROTATE_EXPR:
1816       if (double_int_zero_p (r2mask))
1817         {
1818           HOST_WIDE_INT shift = r2val.low;
1819           if (code == RROTATE_EXPR)
1820             shift = -shift;
1821           *mask = double_int_lrotate (r1mask, shift, TYPE_PRECISION (type));
1822           *val = double_int_lrotate (r1val, shift, TYPE_PRECISION (type));
1823         }
1824       break;
1825
1826     case LSHIFT_EXPR:
1827     case RSHIFT_EXPR:
1828       /* ???  We can handle partially known shift counts if we know
1829          its sign.  That way we can tell that (x << (y | 8)) & 255
1830          is zero.  */
1831       if (double_int_zero_p (r2mask))
1832         {
1833           HOST_WIDE_INT shift = r2val.low;
1834           if (code == RSHIFT_EXPR)
1835             shift = -shift;
1836           /* We need to know if we are doing a left or a right shift
1837              to properly shift in zeros for left shift and unsigned
1838              right shifts and the sign bit for signed right shifts.
1839              For signed right shifts we shift in varying in case
1840              the sign bit was varying.  */
1841           if (shift > 0)
1842             {
1843               *mask = double_int_lshift (r1mask, shift,
1844                                          TYPE_PRECISION (type), false);
1845               *val = double_int_lshift (r1val, shift,
1846                                         TYPE_PRECISION (type), false);
1847             }
1848           else if (shift < 0)
1849             {
1850               /* ???  We can have sizetype related inconsistencies in
1851                  the IL.  */
1852               if ((TREE_CODE (r1type) == INTEGER_TYPE
1853                    && (TYPE_IS_SIZETYPE (r1type)
1854                        ? 0 : TYPE_UNSIGNED (r1type))) != uns)
1855                 break;
1856
1857               shift = -shift;
1858               *mask = double_int_rshift (r1mask, shift,
1859                                          TYPE_PRECISION (type), !uns);
1860               *val = double_int_rshift (r1val, shift,
1861                                         TYPE_PRECISION (type), !uns);
1862             }
1863           else
1864             {
1865               *mask = r1mask;
1866               *val = r1val;
1867             }
1868         }
1869       break;
1870
1871     case PLUS_EXPR:
1872     case POINTER_PLUS_EXPR:
1873       {
1874         double_int lo, hi;
1875         /* Do the addition with unknown bits set to zero, to give carry-ins of
1876            zero wherever possible.  */
1877         lo = double_int_add (double_int_and_not (r1val, r1mask),
1878                              double_int_and_not (r2val, r2mask));
1879         lo = double_int_ext (lo, TYPE_PRECISION (type), uns);
1880         /* Do the addition with unknown bits set to one, to give carry-ins of
1881            one wherever possible.  */
1882         hi = double_int_add (double_int_ior (r1val, r1mask),
1883                              double_int_ior (r2val, r2mask));
1884         hi = double_int_ext (hi, TYPE_PRECISION (type), uns);
1885         /* Each bit in the result is known if (a) the corresponding bits in
1886            both inputs are known, and (b) the carry-in to that bit position
1887            is known.  We can check condition (b) by seeing if we got the same
1888            result with minimised carries as with maximised carries.  */
1889         *mask = double_int_ior (double_int_ior (r1mask, r2mask),
1890                                 double_int_xor (lo, hi));
1891         *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1892         /* It shouldn't matter whether we choose lo or hi here.  */
1893         *val = lo;
1894         break;
1895       }
1896
1897     case MINUS_EXPR:
1898       {
1899         double_int temv, temm;
1900         bit_value_unop_1 (NEGATE_EXPR, r2type, &temv, &temm,
1901                           r2type, r2val, r2mask);
1902         bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1903                            r1type, r1val, r1mask,
1904                            r2type, temv, temm);
1905         break;
1906       }
1907
1908     case MULT_EXPR:
1909       {
1910         /* Just track trailing zeros in both operands and transfer
1911            them to the other.  */
1912         int r1tz = double_int_ctz (double_int_ior (r1val, r1mask));
1913         int r2tz = double_int_ctz (double_int_ior (r2val, r2mask));
1914         if (r1tz + r2tz >= HOST_BITS_PER_DOUBLE_INT)
1915           {
1916             *mask = double_int_zero;
1917             *val = double_int_zero;
1918           }
1919         else if (r1tz + r2tz > 0)
1920           {
1921             *mask = double_int_not (double_int_mask (r1tz + r2tz));
1922             *mask = double_int_ext (*mask, TYPE_PRECISION (type), uns);
1923             *val = double_int_zero;
1924           }
1925         break;
1926       }
1927
1928     case EQ_EXPR:
1929     case NE_EXPR:
1930       {
1931         double_int m = double_int_ior (r1mask, r2mask);
1932         if (!double_int_equal_p (double_int_and_not (r1val, m),
1933                                  double_int_and_not (r2val, m)))
1934           {
1935             *mask = double_int_zero;
1936             *val = ((code == EQ_EXPR) ? double_int_zero : double_int_one);
1937           }
1938         else
1939           {
1940             /* We know the result of a comparison is always one or zero.  */
1941             *mask = double_int_one;
1942             *val = double_int_zero;
1943           }
1944         break;
1945       }
1946
1947     case GE_EXPR:
1948     case GT_EXPR:
1949       {
1950         double_int tem = r1val;
1951         r1val = r2val;
1952         r2val = tem;
1953         tem = r1mask;
1954         r1mask = r2mask;
1955         r2mask = tem;
1956         code = swap_tree_comparison (code);
1957       }
1958       /* Fallthru.  */
1959     case LT_EXPR:
1960     case LE_EXPR:
1961       {
1962         int minmax, maxmin;
1963         /* If the most significant bits are not known we know nothing.  */
1964         if (double_int_negative_p (r1mask) || double_int_negative_p (r2mask))
1965           break;
1966
1967         /* For comparisons the signedness is in the comparison operands.  */
1968         uns = (TREE_CODE (r1type) == INTEGER_TYPE
1969                && TYPE_IS_SIZETYPE (r1type) ? 0 : TYPE_UNSIGNED (r1type));
1970         /* ???  We can have sizetype related inconsistencies in the IL.  */
1971         if ((TREE_CODE (r2type) == INTEGER_TYPE
1972              && TYPE_IS_SIZETYPE (r2type) ? 0 : TYPE_UNSIGNED (r2type)) != uns)
1973           break;
1974
1975         /* If we know the most significant bits we know the values
1976            value ranges by means of treating varying bits as zero
1977            or one.  Do a cross comparison of the max/min pairs.  */
1978         maxmin = double_int_cmp (double_int_ior (r1val, r1mask),
1979                                  double_int_and_not (r2val, r2mask), uns);
1980         minmax = double_int_cmp (double_int_and_not (r1val, r1mask),
1981                                  double_int_ior (r2val, r2mask), uns);
1982         if (maxmin < 0)  /* r1 is less than r2.  */
1983           {
1984             *mask = double_int_zero;
1985             *val = double_int_one;
1986           }
1987         else if (minmax > 0)  /* r1 is not less or equal to r2.  */
1988           {
1989             *mask = double_int_zero;
1990             *val = double_int_zero;
1991           }
1992         else if (maxmin == minmax)  /* r1 and r2 are equal.  */
1993           {
1994             /* This probably should never happen as we'd have
1995                folded the thing during fully constant value folding.  */
1996             *mask = double_int_zero;
1997             *val = (code == LE_EXPR ? double_int_one :  double_int_zero);
1998           }
1999         else
2000           {
2001             /* We know the result of a comparison is always one or zero.  */
2002             *mask = double_int_one;
2003             *val = double_int_zero;
2004           }
2005         break;
2006       }
2007
2008     default:;
2009     }
2010 }
2011
2012 /* Return the propagation value when applying the operation CODE to
2013    the value RHS yielding type TYPE.  */
2014
2015 static prop_value_t
2016 bit_value_unop (enum tree_code code, tree type, tree rhs)
2017 {
2018   prop_value_t rval = get_value_for_expr (rhs, true);
2019   double_int value, mask;
2020   prop_value_t val;
2021   gcc_assert ((rval.lattice_val == CONSTANT
2022                && TREE_CODE (rval.value) == INTEGER_CST)
2023               || double_int_minus_one_p (rval.mask));
2024   bit_value_unop_1 (code, type, &value, &mask,
2025                     TREE_TYPE (rhs), value_to_double_int (rval), rval.mask);
2026   if (!double_int_minus_one_p (mask))
2027     {
2028       val.lattice_val = CONSTANT;
2029       val.mask = mask;
2030       /* ???  Delay building trees here.  */
2031       val.value = double_int_to_tree (type, value);
2032     }
2033   else
2034     {
2035       val.lattice_val = VARYING;
2036       val.value = NULL_TREE;
2037       val.mask = double_int_minus_one;
2038     }
2039   return val;
2040 }
2041
2042 /* Return the propagation value when applying the operation CODE to
2043    the values RHS1 and RHS2 yielding type TYPE.  */
2044
2045 static prop_value_t
2046 bit_value_binop (enum tree_code code, tree type, tree rhs1, tree rhs2)
2047 {
2048   prop_value_t r1val = get_value_for_expr (rhs1, true);
2049   prop_value_t r2val = get_value_for_expr (rhs2, true);
2050   double_int value, mask;
2051   prop_value_t val;
2052   gcc_assert ((r1val.lattice_val == CONSTANT
2053                && TREE_CODE (r1val.value) == INTEGER_CST)
2054               || double_int_minus_one_p (r1val.mask));
2055   gcc_assert ((r2val.lattice_val == CONSTANT
2056                && TREE_CODE (r2val.value) == INTEGER_CST)
2057               || double_int_minus_one_p (r2val.mask));
2058   bit_value_binop_1 (code, type, &value, &mask,
2059                      TREE_TYPE (rhs1), value_to_double_int (r1val), r1val.mask,
2060                      TREE_TYPE (rhs2), value_to_double_int (r2val), r2val.mask);
2061   if (!double_int_minus_one_p (mask))
2062     {
2063       val.lattice_val = CONSTANT;
2064       val.mask = mask;
2065       /* ???  Delay building trees here.  */
2066       val.value = double_int_to_tree (type, value);
2067     }
2068   else
2069     {
2070       val.lattice_val = VARYING;
2071       val.value = NULL_TREE;
2072       val.mask = double_int_minus_one;
2073     }
2074   return val;
2075 }
2076
2077 /* Evaluate statement STMT.
2078    Valid only for assignments, calls, conditionals, and switches. */
2079
2080 static prop_value_t
2081 evaluate_stmt (gimple stmt)
2082 {
2083   prop_value_t val;
2084   tree simplified = NULL_TREE;
2085   ccp_lattice_t likelyvalue = likely_value (stmt);
2086   bool is_constant = false;
2087
2088   if (dump_file && (dump_flags & TDF_DETAILS))
2089     {
2090       fprintf (dump_file, "which is likely ");
2091       switch (likelyvalue)
2092         {
2093         case CONSTANT:
2094           fprintf (dump_file, "CONSTANT");
2095           break;
2096         case UNDEFINED:
2097           fprintf (dump_file, "UNDEFINED");
2098           break;
2099         case VARYING:
2100           fprintf (dump_file, "VARYING");
2101           break;
2102         default:;
2103         }
2104       fprintf (dump_file, "\n");
2105     }
2106
2107   /* If the statement is likely to have a CONSTANT result, then try
2108      to fold the statement to determine the constant value.  */
2109   /* FIXME.  This is the only place that we call ccp_fold.
2110      Since likely_value never returns CONSTANT for calls, we will
2111      not attempt to fold them, including builtins that may profit.  */
2112   if (likelyvalue == CONSTANT)
2113     {
2114       fold_defer_overflow_warnings ();
2115       simplified = ccp_fold (stmt);
2116       is_constant = simplified && is_gimple_min_invariant (simplified);
2117       fold_undefer_overflow_warnings (is_constant, stmt, 0);
2118       if (is_constant)
2119         {
2120           /* The statement produced a constant value.  */
2121           val.lattice_val = CONSTANT;
2122           val.value = simplified;
2123           val.mask = double_int_zero;
2124         }
2125     }
2126   /* If the statement is likely to have a VARYING result, then do not
2127      bother folding the statement.  */
2128   else if (likelyvalue == VARYING)
2129     {
2130       enum gimple_code code = gimple_code (stmt);
2131       if (code == GIMPLE_ASSIGN)
2132         {
2133           enum tree_code subcode = gimple_assign_rhs_code (stmt);
2134
2135           /* Other cases cannot satisfy is_gimple_min_invariant
2136              without folding.  */
2137           if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
2138             simplified = gimple_assign_rhs1 (stmt);
2139         }
2140       else if (code == GIMPLE_SWITCH)
2141         simplified = gimple_switch_index (stmt);
2142       else
2143         /* These cannot satisfy is_gimple_min_invariant without folding.  */
2144         gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
2145       is_constant = simplified && is_gimple_min_invariant (simplified);
2146       if (is_constant)
2147         {
2148           /* The statement produced a constant value.  */
2149           val.lattice_val = CONSTANT;
2150           val.value = simplified;
2151           val.mask = double_int_zero;
2152         }
2153     }
2154
2155   /* Resort to simplification for bitwise tracking.  */
2156   if (flag_tree_bit_ccp
2157       && likelyvalue == CONSTANT
2158       && !is_constant)
2159     {
2160       enum gimple_code code = gimple_code (stmt);
2161       tree fndecl;
2162       val.lattice_val = VARYING;
2163       val.value = NULL_TREE;
2164       val.mask = double_int_minus_one;
2165       if (code == GIMPLE_ASSIGN)
2166         {
2167           enum tree_code subcode = gimple_assign_rhs_code (stmt);
2168           tree rhs1 = gimple_assign_rhs1 (stmt);
2169           switch (get_gimple_rhs_class (subcode))
2170             {
2171             case GIMPLE_SINGLE_RHS:
2172               if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2173                   || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2174                 val = get_value_for_expr (rhs1, true);
2175               break;
2176
2177             case GIMPLE_UNARY_RHS:
2178               if ((INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2179                    || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2180                   && (INTEGRAL_TYPE_P (gimple_expr_type (stmt))
2181                       || POINTER_TYPE_P (gimple_expr_type (stmt))))
2182                 val = bit_value_unop (subcode, gimple_expr_type (stmt), rhs1);
2183               break;
2184
2185             case GIMPLE_BINARY_RHS:
2186               if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2187                   || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2188                 {
2189                   tree lhs = gimple_assign_lhs (stmt);
2190                   tree rhs2 = gimple_assign_rhs2 (stmt);
2191                   val = bit_value_binop (subcode,
2192                                          TREE_TYPE (lhs), rhs1, rhs2);
2193                 }
2194               break;
2195
2196             default:;
2197             }
2198         }
2199       else if (code == GIMPLE_COND)
2200         {
2201           enum tree_code code = gimple_cond_code (stmt);
2202           tree rhs1 = gimple_cond_lhs (stmt);
2203           tree rhs2 = gimple_cond_rhs (stmt);
2204           if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2205               || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2206             val = bit_value_binop (code, TREE_TYPE (rhs1), rhs1, rhs2);
2207         }
2208       else if (code == GIMPLE_CALL
2209                && (fndecl = gimple_call_fndecl (stmt))
2210                && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
2211         {
2212           switch (DECL_FUNCTION_CODE (fndecl))
2213             {
2214             case BUILT_IN_MALLOC:
2215             case BUILT_IN_REALLOC:
2216             case BUILT_IN_CALLOC:
2217               val.lattice_val = CONSTANT;
2218               val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2219               val.mask = shwi_to_double_int
2220                            (~(((HOST_WIDE_INT) MALLOC_ABI_ALIGNMENT)
2221                               / BITS_PER_UNIT - 1));
2222               break;
2223
2224             case BUILT_IN_ALLOCA:
2225               val.lattice_val = CONSTANT;
2226               val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2227               val.mask = shwi_to_double_int
2228                            (~(((HOST_WIDE_INT) BIGGEST_ALIGNMENT)
2229                               / BITS_PER_UNIT - 1));
2230               break;
2231
2232             default:;
2233             }
2234         }
2235       is_constant = (val.lattice_val == CONSTANT);
2236     }
2237
2238   if (!is_constant)
2239     {
2240       /* The statement produced a nonconstant value.  If the statement
2241          had UNDEFINED operands, then the result of the statement
2242          should be UNDEFINED.  Otherwise, the statement is VARYING.  */
2243       if (likelyvalue == UNDEFINED)
2244         {
2245           val.lattice_val = likelyvalue;
2246           val.mask = double_int_zero;
2247         }
2248       else
2249         {
2250           val.lattice_val = VARYING;
2251           val.mask = double_int_minus_one;
2252         }
2253
2254       val.value = NULL_TREE;
2255     }
2256
2257   return val;
2258 }
2259
2260 /* Fold the stmt at *GSI with CCP specific information that propagating
2261    and regular folding does not catch.  */
2262
2263 static bool
2264 ccp_fold_stmt (gimple_stmt_iterator *gsi)
2265 {
2266   gimple stmt = gsi_stmt (*gsi);
2267
2268   switch (gimple_code (stmt))
2269     {
2270     case GIMPLE_COND:
2271       {
2272         prop_value_t val;
2273         /* Statement evaluation will handle type mismatches in constants
2274            more gracefully than the final propagation.  This allows us to
2275            fold more conditionals here.  */
2276         val = evaluate_stmt (stmt);
2277         if (val.lattice_val != CONSTANT
2278             || !double_int_zero_p (val.mask))
2279           return false;
2280
2281         if (dump_file)
2282           {
2283             fprintf (dump_file, "Folding predicate ");
2284             print_gimple_expr (dump_file, stmt, 0, 0);
2285             fprintf (dump_file, " to ");
2286             print_generic_expr (dump_file, val.value, 0);
2287             fprintf (dump_file, "\n");
2288           }
2289
2290         if (integer_zerop (val.value))
2291           gimple_cond_make_false (stmt);
2292         else
2293           gimple_cond_make_true (stmt);
2294
2295         return true;
2296       }
2297
2298     case GIMPLE_CALL:
2299       {
2300         tree lhs = gimple_call_lhs (stmt);
2301         tree val;
2302         tree argt;
2303         tree callee;
2304         bool changed = false;
2305         unsigned i;
2306
2307         /* If the call was folded into a constant make sure it goes
2308            away even if we cannot propagate into all uses because of
2309            type issues.  */
2310         if (lhs
2311             && TREE_CODE (lhs) == SSA_NAME
2312             && (val = get_constant_value (lhs)))
2313           {
2314             tree new_rhs = unshare_expr (val);
2315             bool res;
2316             if (!useless_type_conversion_p (TREE_TYPE (lhs),
2317                                             TREE_TYPE (new_rhs)))
2318               new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
2319             res = update_call_from_tree (gsi, new_rhs);
2320             gcc_assert (res);
2321             return true;
2322           }
2323
2324         /* Propagate into the call arguments.  Compared to replace_uses_in
2325            this can use the argument slot types for type verification
2326            instead of the current argument type.  We also can safely
2327            drop qualifiers here as we are dealing with constants anyway.  */
2328         argt = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt))));
2329         for (i = 0; i < gimple_call_num_args (stmt) && argt;
2330              ++i, argt = TREE_CHAIN (argt))
2331           {
2332             tree arg = gimple_call_arg (stmt, i);
2333             if (TREE_CODE (arg) == SSA_NAME
2334                 && (val = get_constant_value (arg))
2335                 && useless_type_conversion_p
2336                      (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
2337                       TYPE_MAIN_VARIANT (TREE_TYPE (val))))
2338               {
2339                 gimple_call_set_arg (stmt, i, unshare_expr (val));
2340                 changed = true;
2341               }
2342           }
2343
2344         callee = gimple_call_fn (stmt);
2345         if (TREE_CODE (callee) == OBJ_TYPE_REF
2346             && TREE_CODE (OBJ_TYPE_REF_EXPR (callee)) == SSA_NAME)
2347           {
2348             tree expr = OBJ_TYPE_REF_EXPR (callee);
2349             OBJ_TYPE_REF_EXPR (callee) = valueize_op (expr);
2350             if (gimple_fold_call (gsi, false))
2351               changed = true;
2352             OBJ_TYPE_REF_EXPR (callee) = expr;
2353           }
2354
2355         return changed;
2356       }
2357
2358     case GIMPLE_ASSIGN:
2359       {
2360         tree lhs = gimple_assign_lhs (stmt);
2361         tree val;
2362
2363         /* If we have a load that turned out to be constant replace it
2364            as we cannot propagate into all uses in all cases.  */
2365         if (gimple_assign_single_p (stmt)
2366             && TREE_CODE (lhs) == SSA_NAME
2367             && (val = get_constant_value (lhs)))
2368           {
2369             tree rhs = unshare_expr (val);
2370             if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
2371               rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
2372             gimple_assign_set_rhs_from_tree (gsi, rhs);
2373             return true;
2374           }
2375
2376         return false;
2377       }
2378
2379     default:
2380       return false;
2381     }
2382 }
2383
2384 /* Visit the assignment statement STMT.  Set the value of its LHS to the
2385    value computed by the RHS and store LHS in *OUTPUT_P.  If STMT
2386    creates virtual definitions, set the value of each new name to that
2387    of the RHS (if we can derive a constant out of the RHS).
2388    Value-returning call statements also perform an assignment, and
2389    are handled here.  */
2390
2391 static enum ssa_prop_result
2392 visit_assignment (gimple stmt, tree *output_p)
2393 {
2394   prop_value_t val;
2395   enum ssa_prop_result retval;
2396
2397   tree lhs = gimple_get_lhs (stmt);
2398
2399   gcc_assert (gimple_code (stmt) != GIMPLE_CALL
2400               || gimple_call_lhs (stmt) != NULL_TREE);
2401
2402   if (gimple_assign_single_p (stmt)
2403       && gimple_assign_rhs_code (stmt) == SSA_NAME)
2404     /* For a simple copy operation, we copy the lattice values.  */
2405     val = *get_value (gimple_assign_rhs1 (stmt));
2406   else
2407     /* Evaluate the statement, which could be
2408        either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
2409     val = evaluate_stmt (stmt);
2410
2411   retval = SSA_PROP_NOT_INTERESTING;
2412
2413   /* Set the lattice value of the statement's output.  */
2414   if (TREE_CODE (lhs) == SSA_NAME)
2415     {
2416       /* If STMT is an assignment to an SSA_NAME, we only have one
2417          value to set.  */
2418       if (set_lattice_value (lhs, val))
2419         {
2420           *output_p = lhs;
2421           if (val.lattice_val == VARYING)
2422             retval = SSA_PROP_VARYING;
2423           else
2424             retval = SSA_PROP_INTERESTING;
2425         }
2426     }
2427
2428   return retval;
2429 }
2430
2431
2432 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
2433    if it can determine which edge will be taken.  Otherwise, return
2434    SSA_PROP_VARYING.  */
2435
2436 static enum ssa_prop_result
2437 visit_cond_stmt (gimple stmt, edge *taken_edge_p)
2438 {
2439   prop_value_t val;
2440   basic_block block;
2441
2442   block = gimple_bb (stmt);
2443   val = evaluate_stmt (stmt);
2444   if (val.lattice_val != CONSTANT
2445       || !double_int_zero_p (val.mask))
2446     return SSA_PROP_VARYING;
2447
2448   /* Find which edge out of the conditional block will be taken and add it
2449      to the worklist.  If no single edge can be determined statically,
2450      return SSA_PROP_VARYING to feed all the outgoing edges to the
2451      propagation engine.  */
2452   *taken_edge_p = find_taken_edge (block, val.value);
2453   if (*taken_edge_p)
2454     return SSA_PROP_INTERESTING;
2455   else
2456     return SSA_PROP_VARYING;
2457 }
2458
2459
2460 /* Evaluate statement STMT.  If the statement produces an output value and
2461    its evaluation changes the lattice value of its output, return
2462    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
2463    output value.
2464
2465    If STMT is a conditional branch and we can determine its truth
2466    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
2467    value, return SSA_PROP_VARYING.  */
2468
2469 static enum ssa_prop_result
2470 ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
2471 {
2472   tree def;
2473   ssa_op_iter iter;
2474
2475   if (dump_file && (dump_flags & TDF_DETAILS))
2476     {
2477       fprintf (dump_file, "\nVisiting statement:\n");
2478       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2479     }
2480
2481   switch (gimple_code (stmt))
2482     {
2483       case GIMPLE_ASSIGN:
2484         /* If the statement is an assignment that produces a single
2485            output value, evaluate its RHS to see if the lattice value of
2486            its output has changed.  */
2487         return visit_assignment (stmt, output_p);
2488
2489       case GIMPLE_CALL:
2490         /* A value-returning call also performs an assignment.  */
2491         if (gimple_call_lhs (stmt) != NULL_TREE)
2492           return visit_assignment (stmt, output_p);
2493         break;
2494
2495       case GIMPLE_COND:
2496       case GIMPLE_SWITCH:
2497         /* If STMT is a conditional branch, see if we can determine
2498            which branch will be taken.   */
2499         /* FIXME.  It appears that we should be able to optimize
2500            computed GOTOs here as well.  */
2501         return visit_cond_stmt (stmt, taken_edge_p);
2502
2503       default:
2504         break;
2505     }
2506
2507   /* Any other kind of statement is not interesting for constant
2508      propagation and, therefore, not worth simulating.  */
2509   if (dump_file && (dump_flags & TDF_DETAILS))
2510     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
2511
2512   /* Definitions made by statements other than assignments to
2513      SSA_NAMEs represent unknown modifications to their outputs.
2514      Mark them VARYING.  */
2515   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
2516     {
2517       prop_value_t v = { VARYING, NULL_TREE, { -1, (HOST_WIDE_INT) -1 } };
2518       set_lattice_value (def, v);
2519     }
2520
2521   return SSA_PROP_VARYING;
2522 }
2523
2524
2525 /* Main entry point for SSA Conditional Constant Propagation.  */
2526
2527 static unsigned int
2528 do_ssa_ccp (void)
2529 {
2530   ccp_initialize ();
2531   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
2532   if (ccp_finalize ())
2533     return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
2534   else
2535     return 0;
2536 }
2537
2538
2539 static bool
2540 gate_ccp (void)
2541 {
2542   return flag_tree_ccp != 0;
2543 }
2544
2545
2546 struct gimple_opt_pass pass_ccp =
2547 {
2548  {
2549   GIMPLE_PASS,
2550   "ccp",                                /* name */
2551   gate_ccp,                             /* gate */
2552   do_ssa_ccp,                           /* execute */
2553   NULL,                                 /* sub */
2554   NULL,                                 /* next */
2555   0,                                    /* static_pass_number */
2556   TV_TREE_CCP,                          /* tv_id */
2557   PROP_cfg | PROP_ssa,                  /* properties_required */
2558   0,                                    /* properties_provided */
2559   0,                                    /* properties_destroyed */
2560   0,                                    /* todo_flags_start */
2561   TODO_dump_func | TODO_verify_ssa
2562   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
2563  }
2564 };
2565
2566
2567
2568 /* Try to optimize out __builtin_stack_restore.  Optimize it out
2569    if there is another __builtin_stack_restore in the same basic
2570    block and no calls or ASM_EXPRs are in between, or if this block's
2571    only outgoing edge is to EXIT_BLOCK and there are no calls or
2572    ASM_EXPRs after this __builtin_stack_restore.  */
2573
2574 static tree
2575 optimize_stack_restore (gimple_stmt_iterator i)
2576 {
2577   tree callee;
2578   gimple stmt;
2579
2580   basic_block bb = gsi_bb (i);
2581   gimple call = gsi_stmt (i);
2582
2583   if (gimple_code (call) != GIMPLE_CALL
2584       || gimple_call_num_args (call) != 1
2585       || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
2586       || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
2587     return NULL_TREE;
2588
2589   for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
2590     {
2591       stmt = gsi_stmt (i);
2592       if (gimple_code (stmt) == GIMPLE_ASM)
2593         return NULL_TREE;
2594       if (gimple_code (stmt) != GIMPLE_CALL)
2595         continue;
2596
2597       callee = gimple_call_fndecl (stmt);
2598       if (!callee
2599           || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2600           /* All regular builtins are ok, just obviously not alloca.  */
2601           || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA)
2602         return NULL_TREE;
2603
2604       if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
2605         goto second_stack_restore;
2606     }
2607
2608   if (!gsi_end_p (i))
2609     return NULL_TREE;
2610
2611   /* Allow one successor of the exit block, or zero successors.  */
2612   switch (EDGE_COUNT (bb->succs))
2613     {
2614     case 0:
2615       break;
2616     case 1:
2617       if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
2618         return NULL_TREE;
2619       break;
2620     default:
2621       return NULL_TREE;
2622     }
2623  second_stack_restore:
2624
2625   /* If there's exactly one use, then zap the call to __builtin_stack_save.
2626      If there are multiple uses, then the last one should remove the call.
2627      In any case, whether the call to __builtin_stack_save can be removed
2628      or not is irrelevant to removing the call to __builtin_stack_restore.  */
2629   if (has_single_use (gimple_call_arg (call, 0)))
2630     {
2631       gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
2632       if (is_gimple_call (stack_save))
2633         {
2634           callee = gimple_call_fndecl (stack_save);
2635           if (callee
2636               && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2637               && DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
2638             {
2639               gimple_stmt_iterator stack_save_gsi;
2640               tree rhs;
2641
2642               stack_save_gsi = gsi_for_stmt (stack_save);
2643               rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
2644               update_call_from_tree (&stack_save_gsi, rhs);
2645             }
2646         }
2647     }
2648
2649   /* No effect, so the statement will be deleted.  */
2650   return integer_zero_node;
2651 }
2652
2653 /* If va_list type is a simple pointer and nothing special is needed,
2654    optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
2655    __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
2656    pointer assignment.  */
2657
2658 static tree
2659 optimize_stdarg_builtin (gimple call)
2660 {
2661   tree callee, lhs, rhs, cfun_va_list;
2662   bool va_list_simple_ptr;
2663   location_t loc = gimple_location (call);
2664
2665   if (gimple_code (call) != GIMPLE_CALL)
2666     return NULL_TREE;
2667
2668   callee = gimple_call_fndecl (call);
2669
2670   cfun_va_list = targetm.fn_abi_va_list (callee);
2671   va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
2672                        && (TREE_TYPE (cfun_va_list) == void_type_node
2673                            || TREE_TYPE (cfun_va_list) == char_type_node);
2674
2675   switch (DECL_FUNCTION_CODE (callee))
2676     {
2677     case BUILT_IN_VA_START:
2678       if (!va_list_simple_ptr
2679           || targetm.expand_builtin_va_start != NULL
2680           || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
2681         return NULL_TREE;
2682
2683       if (gimple_call_num_args (call) != 2)
2684         return NULL_TREE;
2685
2686       lhs = gimple_call_arg (call, 0);
2687       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2688           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2689              != TYPE_MAIN_VARIANT (cfun_va_list))
2690         return NULL_TREE;
2691
2692       lhs = build_fold_indirect_ref_loc (loc, lhs);
2693       rhs = build_call_expr_loc (loc, built_in_decls[BUILT_IN_NEXT_ARG],
2694                              1, integer_zero_node);
2695       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
2696       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2697
2698     case BUILT_IN_VA_COPY:
2699       if (!va_list_simple_ptr)
2700         return NULL_TREE;
2701
2702       if (gimple_call_num_args (call) != 2)
2703         return NULL_TREE;
2704
2705       lhs = gimple_call_arg (call, 0);
2706       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2707           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2708              != TYPE_MAIN_VARIANT (cfun_va_list))
2709         return NULL_TREE;
2710
2711       lhs = build_fold_indirect_ref_loc (loc, lhs);
2712       rhs = gimple_call_arg (call, 1);
2713       if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
2714           != TYPE_MAIN_VARIANT (cfun_va_list))
2715         return NULL_TREE;
2716
2717       rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
2718       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2719
2720     case BUILT_IN_VA_END:
2721       /* No effect, so the statement will be deleted.  */
2722       return integer_zero_node;
2723
2724     default:
2725       gcc_unreachable ();
2726     }
2727 }
2728
2729 /* A simple pass that attempts to fold all builtin functions.  This pass
2730    is run after we've propagated as many constants as we can.  */
2731
2732 static unsigned int
2733 execute_fold_all_builtins (void)
2734 {
2735   bool cfg_changed = false;
2736   basic_block bb;
2737   unsigned int todoflags = 0;
2738
2739   FOR_EACH_BB (bb)
2740     {
2741       gimple_stmt_iterator i;
2742       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
2743         {
2744           gimple stmt, old_stmt;
2745           tree callee, result;
2746           enum built_in_function fcode;
2747
2748           stmt = gsi_stmt (i);
2749
2750           if (gimple_code (stmt) != GIMPLE_CALL)
2751             {
2752               gsi_next (&i);
2753               continue;
2754             }
2755           callee = gimple_call_fndecl (stmt);
2756           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
2757             {
2758               gsi_next (&i);
2759               continue;
2760             }
2761           fcode = DECL_FUNCTION_CODE (callee);
2762
2763           result = gimple_fold_builtin (stmt);
2764
2765           if (result)
2766             gimple_remove_stmt_histograms (cfun, stmt);
2767
2768           if (!result)
2769             switch (DECL_FUNCTION_CODE (callee))
2770               {
2771               case BUILT_IN_CONSTANT_P:
2772                 /* Resolve __builtin_constant_p.  If it hasn't been
2773                    folded to integer_one_node by now, it's fairly
2774                    certain that the value simply isn't constant.  */
2775                 result = integer_zero_node;
2776                 break;
2777
2778               case BUILT_IN_STACK_RESTORE:
2779                 result = optimize_stack_restore (i);
2780                 if (result)
2781                   break;
2782                 gsi_next (&i);
2783                 continue;
2784
2785               case BUILT_IN_VA_START:
2786               case BUILT_IN_VA_END:
2787               case BUILT_IN_VA_COPY:
2788                 /* These shouldn't be folded before pass_stdarg.  */
2789                 result = optimize_stdarg_builtin (stmt);
2790                 if (result)
2791                   break;
2792                 /* FALLTHRU */
2793
2794               default:
2795                 gsi_next (&i);
2796                 continue;
2797               }
2798
2799           if (dump_file && (dump_flags & TDF_DETAILS))
2800             {
2801               fprintf (dump_file, "Simplified\n  ");
2802               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2803             }
2804
2805           old_stmt = stmt;
2806           if (!update_call_from_tree (&i, result))
2807             {
2808               gimplify_and_update_call_from_tree (&i, result);
2809               todoflags |= TODO_update_address_taken;
2810             }
2811
2812           stmt = gsi_stmt (i);
2813           update_stmt (stmt);
2814
2815           if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
2816               && gimple_purge_dead_eh_edges (bb))
2817             cfg_changed = true;
2818
2819           if (dump_file && (dump_flags & TDF_DETAILS))
2820             {
2821               fprintf (dump_file, "to\n  ");
2822               print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2823               fprintf (dump_file, "\n");
2824             }
2825
2826           /* Retry the same statement if it changed into another
2827              builtin, there might be new opportunities now.  */
2828           if (gimple_code (stmt) != GIMPLE_CALL)
2829             {
2830               gsi_next (&i);
2831               continue;
2832             }
2833           callee = gimple_call_fndecl (stmt);
2834           if (!callee
2835               || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2836               || DECL_FUNCTION_CODE (callee) == fcode)
2837             gsi_next (&i);
2838         }
2839     }
2840
2841   /* Delete unreachable blocks.  */
2842   if (cfg_changed)
2843     todoflags |= TODO_cleanup_cfg;
2844
2845   return todoflags;
2846 }
2847
2848
2849 struct gimple_opt_pass pass_fold_builtins =
2850 {
2851  {
2852   GIMPLE_PASS,
2853   "fab",                                /* name */
2854   NULL,                                 /* gate */
2855   execute_fold_all_builtins,            /* execute */
2856   NULL,                                 /* sub */
2857   NULL,                                 /* next */
2858   0,                                    /* static_pass_number */
2859   TV_NONE,                              /* tv_id */
2860   PROP_cfg | PROP_ssa,                  /* properties_required */
2861   0,                                    /* properties_provided */
2862   0,                                    /* properties_destroyed */
2863   0,                                    /* todo_flags_start */
2864   TODO_dump_func
2865     | TODO_verify_ssa
2866     | TODO_update_ssa                   /* todo_flags_finish */
2867  }
2868 };