OSDN Git Service

PR testsuite/34168
[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
3    Free Software Foundation, Inc.
4    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
5    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
6
7 This file is part of GCC.
8    
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any
12 later version.
13    
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18    
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* Conditional constant propagation (CCP) is based on the SSA
24    propagation engine (tree-ssa-propagate.c).  Constant assignments of
25    the form VAR = CST are propagated from the assignments into uses of
26    VAR, which in turn may generate new constants.  The simulation uses
27    a four level lattice to keep track of constant values associated
28    with SSA names.  Given an SSA name V_i, it may take one of the
29    following values:
30
31         UNINITIALIZED   ->  the initial state of the value.  This value
32                             is replaced with a correct initial value
33                             the first time the value is used, so the
34                             rest of the pass does not need to care about
35                             it.  Using this value simplifies initialization
36                             of the pass, and prevents us from needlessly
37                             scanning statements that are never reached.
38
39         UNDEFINED       ->  V_i is a local variable whose definition
40                             has not been processed yet.  Therefore we
41                             don't yet know if its value is a constant
42                             or not.
43
44         CONSTANT        ->  V_i has been found to hold a constant
45                             value C.
46
47         VARYING         ->  V_i cannot take a constant value, or if it
48                             does, it is not possible to determine it
49                             at compile time.
50
51    The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
52
53    1- In ccp_visit_stmt, we are interested in assignments whose RHS
54       evaluates into a constant and conditional jumps whose predicate
55       evaluates into a boolean true or false.  When an assignment of
56       the form V_i = CONST is found, V_i's lattice value is set to
57       CONSTANT and CONST is associated with it.  This causes the
58       propagation engine to add all the SSA edges coming out the
59       assignment into the worklists, so that statements that use V_i
60       can be visited.
61
62       If the statement is a conditional with a constant predicate, we
63       mark the outgoing edges as executable or not executable
64       depending on the predicate's value.  This is then used when
65       visiting PHI nodes to know when a PHI argument can be ignored.
66       
67
68    2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
69       same constant C, then the LHS of the PHI is set to C.  This
70       evaluation is known as the "meet operation".  Since one of the
71       goals of this evaluation is to optimistically return constant
72       values as often as possible, it uses two main short cuts:
73
74       - If an argument is flowing in through a non-executable edge, it
75         is ignored.  This is useful in cases like this:
76
77                         if (PRED)
78                           a_9 = 3;
79                         else
80                           a_10 = 100;
81                         a_11 = PHI (a_9, a_10)
82
83         If PRED is known to always evaluate to false, then we can
84         assume that a_11 will always take its value from a_10, meaning
85         that instead of consider it VARYING (a_9 and a_10 have
86         different values), we can consider it CONSTANT 100.
87
88       - If an argument has an UNDEFINED value, then it does not affect
89         the outcome of the meet operation.  If a variable V_i has an
90         UNDEFINED value, it means that either its defining statement
91         hasn't been visited yet or V_i has no defining statement, in
92         which case the original symbol 'V' is being used
93         uninitialized.  Since 'V' is a local variable, the compiler
94         may assume any initial value for it.
95
96
97    After propagation, every variable V_i that ends up with a lattice
98    value of CONSTANT will have the associated constant value in the
99    array CONST_VAL[i].VALUE.  That is fed into substitute_and_fold for
100    final substitution and folding.
101
102
103    Constant propagation in stores and loads (STORE-CCP)
104    ----------------------------------------------------
105
106    While CCP has all the logic to propagate constants in GIMPLE
107    registers, it is missing the ability to associate constants with
108    stores and loads (i.e., pointer dereferences, structures and
109    global/aliased variables).  We don't keep loads and stores in
110    SSA, but we do build a factored use-def web for them (in the
111    virtual operands).
112
113    For instance, consider the following code fragment:
114
115           struct A a;
116           const int B = 42;
117
118           void foo (int i)
119           {
120             if (i > 10)
121               a.a = 42;
122             else
123               {
124                 a.b = 21;
125                 a.a = a.b + 21;
126               }
127
128             if (a.a != B)
129               never_executed ();
130           }
131
132    We should be able to deduce that the predicate 'a.a != B' is always
133    false.  To achieve this, we associate constant values to the SSA
134    names in the VDEF operands for each store.  Additionally,
135    since we also glob partial loads/stores with the base symbol, we
136    also keep track of the memory reference where the constant value
137    was stored (in the MEM_REF field of PROP_VALUE_T).  For instance,
138
139         # a_5 = VDEF <a_4>
140         a.a = 2;
141
142         # VUSE <a_5>
143         x_3 = a.b;
144
145    In the example above, CCP will associate value '2' with 'a_5', but
146    it would be wrong to replace the load from 'a.b' with '2', because
147    '2' had been stored into a.a.
148
149    Note that the initial value of virtual operands is VARYING, not
150    UNDEFINED.  Consider, for instance global variables:
151
152         int A;
153
154         foo (int i)
155         {
156           if (i_3 > 10)
157             A_4 = 3;
158           # A_5 = PHI (A_4, A_2);
159
160           # VUSE <A_5>
161           A.0_6 = A;
162
163           return A.0_6;
164         }
165
166    The value of A_2 cannot be assumed to be UNDEFINED, as it may have
167    been defined outside of foo.  If we were to assume it UNDEFINED, we
168    would erroneously optimize the above into 'return 3;'.
169
170    Though STORE-CCP is not too expensive, it does have to do more work
171    than regular CCP, so it is only enabled at -O2.  Both regular CCP
172    and STORE-CCP use the exact same algorithm.  The only distinction
173    is that when doing STORE-CCP, the boolean variable DO_STORE_CCP is
174    set to true.  This affects the evaluation of statements and PHI
175    nodes.
176
177    References:
178
179      Constant propagation with conditional branches,
180      Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
181
182      Building an Optimizing Compiler,
183      Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
184
185      Advanced Compiler Design and Implementation,
186      Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6  */
187
188 #include "config.h"
189 #include "system.h"
190 #include "coretypes.h"
191 #include "tm.h"
192 #include "tree.h"
193 #include "flags.h"
194 #include "rtl.h"
195 #include "tm_p.h"
196 #include "ggc.h"
197 #include "basic-block.h"
198 #include "output.h"
199 #include "expr.h"
200 #include "function.h"
201 #include "diagnostic.h"
202 #include "timevar.h"
203 #include "tree-dump.h"
204 #include "tree-flow.h"
205 #include "tree-pass.h"
206 #include "tree-ssa-propagate.h"
207 #include "langhooks.h"
208 #include "target.h"
209 #include "toplev.h"
210
211
212 /* Possible lattice values.  */
213 typedef enum
214 {
215   UNINITIALIZED,
216   UNDEFINED,
217   CONSTANT,
218   VARYING
219 } ccp_lattice_t;
220
221 /* Array of propagated constant values.  After propagation,
222    CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I).  If
223    the constant is held in an SSA name representing a memory store
224    (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
225    memory reference used to store (i.e., the LHS of the assignment
226    doing the store).  */
227 static prop_value_t *const_val;
228
229 /* True if we are also propagating constants in stores and loads.  */
230 static bool do_store_ccp;
231
232 /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX.  */
233
234 static void
235 dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
236 {
237   switch (val.lattice_val)
238     {
239     case UNINITIALIZED:
240       fprintf (outf, "%sUNINITIALIZED", prefix);
241       break;
242     case UNDEFINED:
243       fprintf (outf, "%sUNDEFINED", prefix);
244       break;
245     case VARYING:
246       fprintf (outf, "%sVARYING", prefix);
247       break;
248     case CONSTANT:
249       fprintf (outf, "%sCONSTANT ", prefix);
250       print_generic_expr (outf, val.value, dump_flags);
251       break;
252     default:
253       gcc_unreachable ();
254     }
255 }
256
257
258 /* Print lattice value VAL to stderr.  */
259
260 void debug_lattice_value (prop_value_t val);
261
262 void
263 debug_lattice_value (prop_value_t val)
264 {
265   dump_lattice_value (stderr, "", val);
266   fprintf (stderr, "\n");
267 }
268
269
270 /* The regular is_gimple_min_invariant does a shallow test of the object.
271    It assumes that full gimplification has happened, or will happen on the
272    object.  For a value coming from DECL_INITIAL, this is not true, so we
273    have to be more strict ourselves.  */
274
275 static bool
276 ccp_decl_initial_min_invariant (tree t)
277 {
278   if (!is_gimple_min_invariant (t))
279     return false;
280   if (TREE_CODE (t) == ADDR_EXPR)
281     {
282       /* Inline and unroll is_gimple_addressable.  */
283       while (1)
284         {
285           t = TREE_OPERAND (t, 0);
286           if (is_gimple_id (t))
287             return true;
288           if (!handled_component_p (t))
289             return false;
290         }
291     }
292   return true;
293 }
294
295 /* If SYM is a constant variable with known value, return the value.
296    NULL_TREE is returned otherwise.  */
297
298 tree
299 get_symbol_constant_value (tree sym)
300 {
301   if (TREE_STATIC (sym)
302       && TREE_READONLY (sym)
303       && !MTAG_P (sym))
304     {
305       tree val = DECL_INITIAL (sym);
306       if (val
307           && ccp_decl_initial_min_invariant (val))
308         return val;
309       /* Variables declared 'const' without an initializer
310          have zero as the intializer if they may not be
311          overridden at link or run time.  */
312       if (!val
313           && targetm.binds_local_p (sym)
314           && (INTEGRAL_TYPE_P (TREE_TYPE (sym))
315                || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym))))
316         return fold_convert (TREE_TYPE (sym), integer_zero_node);
317     }
318
319   return NULL_TREE;
320 }
321
322 /* Compute a default value for variable VAR and store it in the
323    CONST_VAL array.  The following rules are used to get default
324    values:
325
326    1- Global and static variables that are declared constant are
327       considered CONSTANT.
328
329    2- Any other value is considered UNDEFINED.  This is useful when
330       considering PHI nodes.  PHI arguments that are undefined do not
331       change the constant value of the PHI node, which allows for more
332       constants to be propagated.
333
334    3- If SSA_NAME_VALUE is set and it is a constant, its value is
335       used.
336
337    4- Variables defined by statements other than assignments and PHI
338       nodes are considered VARYING.
339
340    5- Initial values of variables that are not GIMPLE registers are
341       considered VARYING.  */
342
343 static prop_value_t
344 get_default_value (tree var)
345 {
346   tree sym = SSA_NAME_VAR (var);
347   prop_value_t val = { UNINITIALIZED, NULL_TREE, NULL_TREE };
348   tree cst_val;
349   
350   if (!do_store_ccp && !is_gimple_reg (var))
351     {
352       /* Short circuit for regular CCP.  We are not interested in any
353          non-register when DO_STORE_CCP is false.  */
354       val.lattice_val = VARYING;
355     }
356   else if (SSA_NAME_VALUE (var)
357            && is_gimple_min_invariant (SSA_NAME_VALUE (var)))
358     {
359       val.lattice_val = CONSTANT;
360       val.value = SSA_NAME_VALUE (var);
361     }
362   else if ((cst_val = get_symbol_constant_value (sym)) != NULL_TREE)
363     {
364       /* Globals and static variables declared 'const' take their
365          initial value.  */
366       val.lattice_val = CONSTANT;
367       val.value = cst_val;
368       val.mem_ref = sym;
369     }
370   else
371     {
372       tree stmt = SSA_NAME_DEF_STMT (var);
373
374       if (IS_EMPTY_STMT (stmt))
375         {
376           /* Variables defined by an empty statement are those used
377              before being initialized.  If VAR is a local variable, we
378              can assume initially that it is UNDEFINED, otherwise we must
379              consider it VARYING.  */
380           if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
381             val.lattice_val = UNDEFINED;
382           else
383             val.lattice_val = VARYING;
384         }
385       else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
386                || TREE_CODE (stmt) == PHI_NODE)
387         {
388           /* Any other variable defined by an assignment or a PHI node
389              is considered UNDEFINED.  */
390           val.lattice_val = UNDEFINED;
391         }
392       else
393         {
394           /* Otherwise, VAR will never take on a constant value.  */
395           val.lattice_val = VARYING;
396         }
397     }
398
399   return val;
400 }
401
402
403 /* Get the constant value associated with variable VAR.  */
404
405 static inline prop_value_t *
406 get_value (tree var)
407 {
408   prop_value_t *val;
409
410   if (const_val == NULL)
411     return NULL;
412
413   val = &const_val[SSA_NAME_VERSION (var)];
414   if (val->lattice_val == UNINITIALIZED)
415     *val = get_default_value (var);
416
417   return val;
418 }
419
420 /* Sets the value associated with VAR to VARYING.  */
421
422 static inline void
423 set_value_varying (tree var)
424 {
425   prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
426
427   val->lattice_val = VARYING;
428   val->value = NULL_TREE;
429   val->mem_ref = NULL_TREE;
430 }
431
432 /* For float types, modify the value of VAL to make ccp work correctly
433    for non-standard values (-0, NaN):
434
435    If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
436    If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
437      This is to fix the following problem (see PR 29921): Suppose we have
438
439      x = 0.0 * y
440
441      and we set value of y to NaN.  This causes value of x to be set to NaN.
442      When we later determine that y is in fact VARYING, fold uses the fact
443      that HONOR_NANS is false, and we try to change the value of x to 0,
444      causing an ICE.  With HONOR_NANS being false, the real appearance of
445      NaN would cause undefined behavior, though, so claiming that y (and x)
446      are UNDEFINED initially is correct.  */
447
448 static void
449 canonicalize_float_value (prop_value_t *val)
450 {
451   enum machine_mode mode;
452   tree type;
453   REAL_VALUE_TYPE d;
454
455   if (val->lattice_val != CONSTANT
456       || TREE_CODE (val->value) != REAL_CST)
457     return;
458
459   d = TREE_REAL_CST (val->value);
460   type = TREE_TYPE (val->value);
461   mode = TYPE_MODE (type);
462
463   if (!HONOR_SIGNED_ZEROS (mode)
464       && REAL_VALUE_MINUS_ZERO (d))
465     {
466       val->value = build_real (type, dconst0);
467       return;
468     }
469
470   if (!HONOR_NANS (mode)
471       && REAL_VALUE_ISNAN (d))
472     {
473       val->lattice_val = UNDEFINED;
474       val->value = NULL;
475       val->mem_ref = NULL;
476       return;
477     }
478 }
479
480 /* Set the value for variable VAR to NEW_VAL.  Return true if the new
481    value is different from VAR's previous value.  */
482
483 static bool
484 set_lattice_value (tree var, prop_value_t new_val)
485 {
486   prop_value_t *old_val = get_value (var);
487
488   canonicalize_float_value (&new_val);
489
490   /* Lattice transitions must always be monotonically increasing in
491      value.  If *OLD_VAL and NEW_VAL are the same, return false to
492      inform the caller that this was a non-transition.  */
493
494   gcc_assert (old_val->lattice_val < new_val.lattice_val
495               || (old_val->lattice_val == new_val.lattice_val
496                   && ((!old_val->value && !new_val.value)
497                       || operand_equal_p (old_val->value, new_val.value, 0))
498                   && old_val->mem_ref == new_val.mem_ref));
499
500   if (old_val->lattice_val != new_val.lattice_val)
501     {
502       if (dump_file && (dump_flags & TDF_DETAILS))
503         {
504           dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
505           fprintf (dump_file, ".  Adding SSA edges to worklist.\n");
506         }
507
508       *old_val = new_val;
509
510       gcc_assert (new_val.lattice_val != UNDEFINED);
511       return true;
512     }
513
514   return false;
515 }
516
517
518 /* Return the likely CCP lattice value for STMT.
519
520    If STMT has no operands, then return CONSTANT.
521
522    Else if undefinedness of operands of STMT cause its value to be
523    undefined, then return UNDEFINED.
524
525    Else if any operands of STMT are constants, then return CONSTANT.
526
527    Else return VARYING.  */
528
529 static ccp_lattice_t
530 likely_value (tree stmt)
531 {
532   bool has_constant_operand, has_undefined_operand, all_undefined_operands;
533   stmt_ann_t ann;
534   tree use;
535   ssa_op_iter iter;
536
537   ann = stmt_ann (stmt);
538
539   /* If the statement has volatile operands, it won't fold to a
540      constant value.  */
541   if (ann->has_volatile_ops)
542     return VARYING;
543
544   /* If we are not doing store-ccp, statements with loads
545      and/or stores will never fold into a constant.  */
546   if (!do_store_ccp
547       && !ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
548     return VARYING;
549
550
551   /* A CALL_EXPR is assumed to be varying.  NOTE: This may be overly
552      conservative, in the presence of const and pure calls.  */
553   if (get_call_expr_in (stmt) != NULL_TREE)
554     return VARYING;
555
556   /* Anything other than assignments and conditional jumps are not
557      interesting for CCP.  */
558   if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT
559       && !(TREE_CODE (stmt) == RETURN_EXPR && get_rhs (stmt) != NULL_TREE)
560       && TREE_CODE (stmt) != COND_EXPR
561       && TREE_CODE (stmt) != SWITCH_EXPR)
562     return VARYING;
563
564   if (is_gimple_min_invariant (get_rhs (stmt)))
565     return CONSTANT;
566
567   has_constant_operand = false;
568   has_undefined_operand = false;
569   all_undefined_operands = true;
570   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
571     {
572       prop_value_t *val = get_value (use);
573
574       if (val->lattice_val == UNDEFINED)
575         has_undefined_operand = true;
576       else
577         all_undefined_operands = false;
578
579       if (val->lattice_val == CONSTANT)
580         has_constant_operand = true;
581     }
582
583   /* If the operation combines operands like COMPLEX_EXPR make sure to
584      not mark the result UNDEFINED if only one part of the result is
585      undefined.  */
586   if (has_undefined_operand
587       && all_undefined_operands)
588     return UNDEFINED;
589   else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
590            && has_undefined_operand)
591     {
592       switch (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)))
593         {
594         /* Unary operators are handled with all_undefined_operands.  */
595         case PLUS_EXPR:
596         case MINUS_EXPR:
597         case POINTER_PLUS_EXPR:
598           /* Not MIN_EXPR, MAX_EXPR.  One VARYING operand may be selected.
599              Not bitwise operators, one VARYING operand may specify the
600              result completely.  Not logical operators for the same reason.
601              Not COMPLEX_EXPR as one VARYING operand makes the result partly
602              not UNDEFINED.  Not *DIV_EXPR, comparisons and shifts because
603              the undefined operand may be promoted.  */
604           return UNDEFINED;
605
606         default:
607           ;
608         }
609     }
610   /* If there was an UNDEFINED operand but the result may be not UNDEFINED
611      fall back to VARYING even if there were CONSTANT operands.  */
612   if (has_undefined_operand)
613     return VARYING;
614
615   if (has_constant_operand
616       /* We do not consider virtual operands here -- load from read-only
617          memory may have only VARYING virtual operands, but still be
618          constant.  */
619       || ZERO_SSA_OPERANDS (stmt, SSA_OP_USE))
620     return CONSTANT;
621
622   return VARYING;
623 }
624
625 /* Returns true if STMT cannot be constant.  */
626
627 static bool
628 surely_varying_stmt_p (tree stmt)
629 {
630   /* If the statement has operands that we cannot handle, it cannot be
631      constant.  */
632   if (stmt_ann (stmt)->has_volatile_ops)
633     return true;
634
635   if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
636     {
637       if (!do_store_ccp)
638         return true;
639
640       /* We can only handle simple loads and stores.  */
641       if (!stmt_makes_single_load (stmt)
642           && !stmt_makes_single_store (stmt))
643         return true;
644     }
645
646   /* If it contains a call, it is varying.  */
647   if (get_call_expr_in (stmt) != NULL_TREE)
648     return true;
649
650   /* Anything other than assignments and conditional jumps are not
651      interesting for CCP.  */
652   if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT
653       && !(TREE_CODE (stmt) == RETURN_EXPR && get_rhs (stmt) != NULL_TREE)
654       && TREE_CODE (stmt) != COND_EXPR
655       && TREE_CODE (stmt) != SWITCH_EXPR)
656     return true;
657
658   return false;
659 }
660
661 /* Initialize local data structures for CCP.  */
662
663 static void
664 ccp_initialize (void)
665 {
666   basic_block bb;
667
668   const_val = XCNEWVEC (prop_value_t, num_ssa_names);
669
670   /* Initialize simulation flags for PHI nodes and statements.  */
671   FOR_EACH_BB (bb)
672     {
673       block_stmt_iterator i;
674
675       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
676         {
677           tree stmt = bsi_stmt (i);
678           bool is_varying = surely_varying_stmt_p (stmt);
679
680           if (is_varying)
681             {
682               tree def;
683               ssa_op_iter iter;
684
685               /* If the statement will not produce a constant, mark
686                  all its outputs VARYING.  */
687               FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
688                 {
689                   if (is_varying)
690                     set_value_varying (def);
691                 }
692             }
693
694           DONT_SIMULATE_AGAIN (stmt) = is_varying;
695         }
696     }
697
698   /* Now process PHI nodes.  We never set DONT_SIMULATE_AGAIN on phi node,
699      since we do not know which edges are executable yet, except for
700      phi nodes for virtual operands when we do not do store ccp.  */
701   FOR_EACH_BB (bb)
702     {
703       tree phi;
704
705       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
706         {
707           if (!do_store_ccp && !is_gimple_reg (PHI_RESULT (phi)))
708             DONT_SIMULATE_AGAIN (phi) = true;
709           else
710             DONT_SIMULATE_AGAIN (phi) = false;
711         }
712     }
713 }
714
715
716 /* Do final substitution of propagated values, cleanup the flowgraph and
717    free allocated storage.  
718
719    Return TRUE when something was optimized.  */
720
721 static bool
722 ccp_finalize (void)
723 {
724   /* Perform substitutions based on the known constant values.  */
725   bool something_changed = substitute_and_fold (const_val, false);
726
727   free (const_val);
728   const_val = NULL;
729   return something_changed;;
730 }
731
732
733 /* Compute the meet operator between *VAL1 and *VAL2.  Store the result
734    in VAL1.
735
736                 any  M UNDEFINED   = any
737                 any  M VARYING     = VARYING
738                 Ci   M Cj          = Ci         if (i == j)
739                 Ci   M Cj          = VARYING    if (i != j)
740    */
741
742 static void
743 ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
744 {
745   if (val1->lattice_val == UNDEFINED)
746     {
747       /* UNDEFINED M any = any   */
748       *val1 = *val2;
749     }
750   else if (val2->lattice_val == UNDEFINED)
751     {
752       /* any M UNDEFINED = any
753          Nothing to do.  VAL1 already contains the value we want.  */
754       ;
755     }
756   else if (val1->lattice_val == VARYING
757            || val2->lattice_val == VARYING)
758     {
759       /* any M VARYING = VARYING.  */
760       val1->lattice_val = VARYING;
761       val1->value = NULL_TREE;
762       val1->mem_ref = NULL_TREE;
763     }
764   else if (val1->lattice_val == CONSTANT
765            && val2->lattice_val == CONSTANT
766            && simple_cst_equal (val1->value, val2->value) == 1
767            && (!do_store_ccp
768                || (val1->mem_ref && val2->mem_ref
769                    && operand_equal_p (val1->mem_ref, val2->mem_ref, 0))))
770     {
771       /* Ci M Cj = Ci           if (i == j)
772          Ci M Cj = VARYING      if (i != j)
773
774          If these two values come from memory stores, make sure that
775          they come from the same memory reference.  */
776       val1->lattice_val = CONSTANT;
777       val1->value = val1->value;
778       val1->mem_ref = val1->mem_ref;
779     }
780   else
781     {
782       /* Any other combination is VARYING.  */
783       val1->lattice_val = VARYING;
784       val1->value = NULL_TREE;
785       val1->mem_ref = NULL_TREE;
786     }
787 }
788
789
790 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
791    lattice values to determine PHI_NODE's lattice value.  The value of a
792    PHI node is determined calling ccp_lattice_meet with all the arguments
793    of the PHI node that are incoming via executable edges.  */
794
795 static enum ssa_prop_result
796 ccp_visit_phi_node (tree phi)
797 {
798   int i;
799   prop_value_t *old_val, new_val;
800
801   if (dump_file && (dump_flags & TDF_DETAILS))
802     {
803       fprintf (dump_file, "\nVisiting PHI node: ");
804       print_generic_expr (dump_file, phi, dump_flags);
805     }
806
807   old_val = get_value (PHI_RESULT (phi));
808   switch (old_val->lattice_val)
809     {
810     case VARYING:
811       return SSA_PROP_VARYING;
812
813     case CONSTANT:
814       new_val = *old_val;
815       break;
816
817     case UNDEFINED:
818       new_val.lattice_val = UNDEFINED;
819       new_val.value = NULL_TREE;
820       new_val.mem_ref = NULL_TREE;
821       break;
822
823     default:
824       gcc_unreachable ();
825     }
826
827   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
828     {
829       /* Compute the meet operator over all the PHI arguments flowing
830          through executable edges.  */
831       edge e = PHI_ARG_EDGE (phi, i);
832
833       if (dump_file && (dump_flags & TDF_DETAILS))
834         {
835           fprintf (dump_file,
836               "\n    Argument #%d (%d -> %d %sexecutable)\n",
837               i, e->src->index, e->dest->index,
838               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
839         }
840
841       /* If the incoming edge is executable, Compute the meet operator for
842          the existing value of the PHI node and the current PHI argument.  */
843       if (e->flags & EDGE_EXECUTABLE)
844         {
845           tree arg = PHI_ARG_DEF (phi, i);
846           prop_value_t arg_val;
847
848           if (is_gimple_min_invariant (arg))
849             {
850               arg_val.lattice_val = CONSTANT;
851               arg_val.value = arg;
852               arg_val.mem_ref = NULL_TREE;
853             }
854           else
855             arg_val = *(get_value (arg));
856
857           ccp_lattice_meet (&new_val, &arg_val);
858
859           if (dump_file && (dump_flags & TDF_DETAILS))
860             {
861               fprintf (dump_file, "\t");
862               print_generic_expr (dump_file, arg, dump_flags);
863               dump_lattice_value (dump_file, "\tValue: ", arg_val);
864               fprintf (dump_file, "\n");
865             }
866
867           if (new_val.lattice_val == VARYING)
868             break;
869         }
870     }
871
872   if (dump_file && (dump_flags & TDF_DETAILS))
873     {
874       dump_lattice_value (dump_file, "\n    PHI node value: ", new_val);
875       fprintf (dump_file, "\n\n");
876     }
877
878   /* Make the transition to the new value.  */
879   if (set_lattice_value (PHI_RESULT (phi), new_val))
880     {
881       if (new_val.lattice_val == VARYING)
882         return SSA_PROP_VARYING;
883       else
884         return SSA_PROP_INTERESTING;
885     }
886   else
887     return SSA_PROP_NOT_INTERESTING;
888 }
889
890
891 /* CCP specific front-end to the non-destructive constant folding
892    routines.
893
894    Attempt to simplify the RHS of STMT knowing that one or more
895    operands are constants.
896
897    If simplification is possible, return the simplified RHS,
898    otherwise return the original RHS.  */
899
900 static tree
901 ccp_fold (tree stmt)
902 {
903   tree rhs = get_rhs (stmt);
904   enum tree_code code = TREE_CODE (rhs);
905   enum tree_code_class kind = TREE_CODE_CLASS (code);
906   tree retval = NULL_TREE;
907
908   if (TREE_CODE (rhs) == SSA_NAME)
909     {
910       /* If the RHS is an SSA_NAME, return its known constant value,
911          if any.  */
912       return get_value (rhs)->value;
913     }
914   else if (do_store_ccp && stmt_makes_single_load (stmt))
915     {
916       /* If the RHS is a memory load, see if the VUSEs associated with
917          it are a valid constant for that memory load.  */
918       prop_value_t *val = get_value_loaded_by (stmt, const_val);
919       if (val && val->mem_ref)
920         {
921           if (operand_equal_p (val->mem_ref, rhs, 0))
922             return val->value;
923
924           /* If RHS is extracting REALPART_EXPR or IMAGPART_EXPR of a
925              complex type with a known constant value, return it.  */
926           if ((TREE_CODE (rhs) == REALPART_EXPR
927                || TREE_CODE (rhs) == IMAGPART_EXPR)
928               && operand_equal_p (val->mem_ref, TREE_OPERAND (rhs, 0), 0))
929             return fold_build1 (TREE_CODE (rhs), TREE_TYPE (rhs), val->value);
930         }
931       return NULL_TREE;
932     }
933
934   /* Unary operators.  Note that we know the single operand must
935      be a constant.  So this should almost always return a
936      simplified RHS.  */
937   if (kind == tcc_unary)
938     {
939       /* Handle unary operators which can appear in GIMPLE form.  */
940       tree op0 = TREE_OPERAND (rhs, 0);
941
942       /* Simplify the operand down to a constant.  */
943       if (TREE_CODE (op0) == SSA_NAME)
944         {
945           prop_value_t *val = get_value (op0);
946           if (val->lattice_val == CONSTANT)
947             op0 = get_value (op0)->value;
948         }
949
950       if ((code == NOP_EXPR || code == CONVERT_EXPR)
951           && useless_type_conversion_p (TREE_TYPE (rhs), TREE_TYPE (op0)))
952         return op0;
953       return fold_unary (code, TREE_TYPE (rhs), op0);
954     }
955
956   /* Binary and comparison operators.  We know one or both of the
957      operands are constants.  */
958   else if (kind == tcc_binary
959            || kind == tcc_comparison
960            || code == TRUTH_AND_EXPR
961            || code == TRUTH_OR_EXPR
962            || code == TRUTH_XOR_EXPR)
963     {
964       /* Handle binary and comparison operators that can appear in
965          GIMPLE form.  */
966       tree op0 = TREE_OPERAND (rhs, 0);
967       tree op1 = TREE_OPERAND (rhs, 1);
968
969       /* Simplify the operands down to constants when appropriate.  */
970       if (TREE_CODE (op0) == SSA_NAME)
971         {
972           prop_value_t *val = get_value (op0);
973           if (val->lattice_val == CONSTANT)
974             op0 = val->value;
975         }
976
977       if (TREE_CODE (op1) == SSA_NAME)
978         {
979           prop_value_t *val = get_value (op1);
980           if (val->lattice_val == CONSTANT)
981             op1 = val->value;
982         }
983
984       return fold_binary (code, TREE_TYPE (rhs), op0, op1);
985     }
986
987   else if (kind == tcc_declaration)
988     return get_symbol_constant_value (rhs);
989
990   else if (kind == tcc_reference)
991     return fold_const_aggregate_ref (rhs);
992
993   /* We may be able to fold away calls to builtin functions if their
994      arguments are constants.  */
995   else if (code == CALL_EXPR
996            && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
997            && TREE_CODE (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)) == FUNCTION_DECL
998            && DECL_BUILT_IN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
999     {
1000       if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_USE))
1001         {
1002           tree *orig, var;
1003           size_t i = 0;
1004           ssa_op_iter iter;
1005           use_operand_p var_p;
1006
1007           /* Preserve the original values of every operand.  */
1008           orig = XNEWVEC (tree,  NUM_SSA_OPERANDS (stmt, SSA_OP_USE));
1009           FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
1010             orig[i++] = var;
1011
1012           /* Substitute operands with their values and try to fold.  */
1013           replace_uses_in (stmt, NULL, const_val);
1014           retval = fold_call_expr (rhs, false);
1015
1016           /* Restore operands to their original form.  */
1017           i = 0;
1018           FOR_EACH_SSA_USE_OPERAND (var_p, stmt, iter, SSA_OP_USE)
1019             SET_USE (var_p, orig[i++]);
1020           free (orig);
1021         }
1022     }
1023   else
1024     return rhs;
1025
1026   /* If we got a simplified form, see if we need to convert its type.  */
1027   if (retval)
1028     return fold_convert (TREE_TYPE (rhs), retval);
1029
1030   /* No simplification was possible.  */
1031   return rhs;
1032 }
1033
1034
1035 /* Return the tree representing the element referenced by T if T is an
1036    ARRAY_REF or COMPONENT_REF into constant aggregates.  Return
1037    NULL_TREE otherwise.  */
1038
1039 tree
1040 fold_const_aggregate_ref (tree t)
1041 {
1042   prop_value_t *value;
1043   tree base, ctor, idx, field;
1044   unsigned HOST_WIDE_INT cnt;
1045   tree cfield, cval;
1046
1047   switch (TREE_CODE (t))
1048     {
1049     case ARRAY_REF:
1050       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1051          DECL_INITIAL.  If BASE is a nested reference into another
1052          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1053          the inner reference.  */
1054       base = TREE_OPERAND (t, 0);
1055       switch (TREE_CODE (base))
1056         {
1057         case VAR_DECL:
1058           if (!TREE_READONLY (base)
1059               || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1060               || !targetm.binds_local_p (base))
1061             return NULL_TREE;
1062
1063           ctor = DECL_INITIAL (base);
1064           break;
1065
1066         case ARRAY_REF:
1067         case COMPONENT_REF:
1068           ctor = fold_const_aggregate_ref (base);
1069           break;
1070
1071         case STRING_CST:
1072         case CONSTRUCTOR:
1073           ctor = base;
1074           break;
1075
1076         default:
1077           return NULL_TREE;
1078         }
1079
1080       if (ctor == NULL_TREE
1081           || (TREE_CODE (ctor) != CONSTRUCTOR
1082               && TREE_CODE (ctor) != STRING_CST)
1083           || !TREE_STATIC (ctor))
1084         return NULL_TREE;
1085
1086       /* Get the index.  If we have an SSA_NAME, try to resolve it
1087          with the current lattice value for the SSA_NAME.  */
1088       idx = TREE_OPERAND (t, 1);
1089       switch (TREE_CODE (idx))
1090         {
1091         case SSA_NAME:
1092           if ((value = get_value (idx))
1093               && value->lattice_val == CONSTANT
1094               && TREE_CODE (value->value) == INTEGER_CST)
1095             idx = value->value;
1096           else
1097             return NULL_TREE;
1098           break;
1099
1100         case INTEGER_CST:
1101           break;
1102
1103         default:
1104           return NULL_TREE;
1105         }
1106
1107       /* Fold read from constant string.  */
1108       if (TREE_CODE (ctor) == STRING_CST)
1109         {
1110           if ((TYPE_MODE (TREE_TYPE (t))
1111                == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1112               && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1113                   == MODE_INT)
1114               && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1115               && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
1116             return build_int_cst_type (TREE_TYPE (t),
1117                                        (TREE_STRING_POINTER (ctor)
1118                                         [TREE_INT_CST_LOW (idx)]));
1119           return NULL_TREE;
1120         }
1121
1122       /* Whoo-hoo!  I'll fold ya baby.  Yeah!  */
1123       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1124         if (tree_int_cst_equal (cfield, idx))
1125           return cval;
1126       break;
1127
1128     case COMPONENT_REF:
1129       /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
1130          DECL_INITIAL.  If BASE is a nested reference into another
1131          ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1132          the inner reference.  */
1133       base = TREE_OPERAND (t, 0);
1134       switch (TREE_CODE (base))
1135         {
1136         case VAR_DECL:
1137           if (!TREE_READONLY (base)
1138               || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1139               || !targetm.binds_local_p (base))
1140             return NULL_TREE;
1141
1142           ctor = DECL_INITIAL (base);
1143           break;
1144
1145         case ARRAY_REF:
1146         case COMPONENT_REF:
1147           ctor = fold_const_aggregate_ref (base);
1148           break;
1149
1150         default:
1151           return NULL_TREE;
1152         }
1153
1154       if (ctor == NULL_TREE
1155           || TREE_CODE (ctor) != CONSTRUCTOR
1156           || !TREE_STATIC (ctor))
1157         return NULL_TREE;
1158
1159       field = TREE_OPERAND (t, 1);
1160
1161       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1162         if (cfield == field
1163             /* FIXME: Handle bit-fields.  */
1164             && ! DECL_BIT_FIELD (cfield))
1165           return cval;
1166       break;
1167
1168     case REALPART_EXPR:
1169     case IMAGPART_EXPR:
1170       {
1171         tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1172         if (c && TREE_CODE (c) == COMPLEX_CST)
1173           return fold_build1 (TREE_CODE (t), TREE_TYPE (t), c);
1174         break;
1175       }
1176
1177     case INDIRECT_REF:
1178       {
1179         tree base = TREE_OPERAND (t, 0);
1180         if (TREE_CODE (base) == SSA_NAME
1181             && (value = get_value (base))
1182             && value->lattice_val == CONSTANT
1183             && TREE_CODE (value->value) == ADDR_EXPR)
1184           return fold_const_aggregate_ref (TREE_OPERAND (value->value, 0));
1185         break;
1186       }
1187
1188     default:
1189       break;
1190     }
1191
1192   return NULL_TREE;
1193 }
1194   
1195 /* Evaluate statement STMT.  */
1196
1197 static prop_value_t
1198 evaluate_stmt (tree stmt)
1199 {
1200   prop_value_t val;
1201   tree simplified = NULL_TREE;
1202   ccp_lattice_t likelyvalue = likely_value (stmt);
1203   bool is_constant;
1204
1205   val.mem_ref = NULL_TREE;
1206
1207   fold_defer_overflow_warnings ();
1208
1209   /* If the statement is likely to have a CONSTANT result, then try
1210      to fold the statement to determine the constant value.  */
1211   if (likelyvalue == CONSTANT)
1212     simplified = ccp_fold (stmt);
1213   /* If the statement is likely to have a VARYING result, then do not
1214      bother folding the statement.  */
1215   else if (likelyvalue == VARYING)
1216     simplified = get_rhs (stmt);
1217
1218   is_constant = simplified && is_gimple_min_invariant (simplified);
1219
1220   fold_undefer_overflow_warnings (is_constant, stmt, 0);
1221
1222   if (is_constant)
1223     {
1224       /* The statement produced a constant value.  */
1225       val.lattice_val = CONSTANT;
1226       val.value = simplified;
1227     }
1228   else
1229     {
1230       /* The statement produced a nonconstant value.  If the statement
1231          had UNDEFINED operands, then the result of the statement
1232          should be UNDEFINED.  Otherwise, the statement is VARYING.  */
1233       if (likelyvalue == UNDEFINED)
1234         val.lattice_val = likelyvalue;
1235       else
1236         val.lattice_val = VARYING;
1237
1238       val.value = NULL_TREE;
1239     }
1240
1241   return val;
1242 }
1243
1244
1245 /* Visit the assignment statement STMT.  Set the value of its LHS to the
1246    value computed by the RHS and store LHS in *OUTPUT_P.  If STMT
1247    creates virtual definitions, set the value of each new name to that
1248    of the RHS (if we can derive a constant out of the RHS).  */
1249
1250 static enum ssa_prop_result
1251 visit_assignment (tree stmt, tree *output_p)
1252 {
1253   prop_value_t val;
1254   tree lhs, rhs;
1255   enum ssa_prop_result retval;
1256
1257   lhs = GIMPLE_STMT_OPERAND (stmt, 0);
1258   rhs = GIMPLE_STMT_OPERAND (stmt, 1);
1259
1260   if (TREE_CODE (rhs) == SSA_NAME)
1261     {
1262       /* For a simple copy operation, we copy the lattice values.  */
1263       prop_value_t *nval = get_value (rhs);
1264       val = *nval;
1265     }
1266   else if (do_store_ccp && stmt_makes_single_load (stmt))
1267     {
1268       /* Same as above, but the RHS is not a gimple register and yet
1269          has a known VUSE.  If STMT is loading from the same memory
1270          location that created the SSA_NAMEs for the virtual operands,
1271          we can propagate the value on the RHS.  */
1272       prop_value_t *nval = get_value_loaded_by (stmt, const_val);
1273
1274       if (nval
1275           && nval->mem_ref
1276           && operand_equal_p (nval->mem_ref, rhs, 0))
1277         val = *nval;
1278       else
1279         val = evaluate_stmt (stmt);
1280     }
1281   else
1282     /* Evaluate the statement.  */
1283     val = evaluate_stmt (stmt);
1284
1285   /* If the original LHS was a VIEW_CONVERT_EXPR, modify the constant
1286      value to be a VIEW_CONVERT_EXPR of the old constant value.
1287
1288      ??? Also, if this was a definition of a bitfield, we need to widen
1289      the constant value into the type of the destination variable.  This
1290      should not be necessary if GCC represented bitfields properly.  */
1291   {
1292     tree orig_lhs = GIMPLE_STMT_OPERAND (stmt, 0);
1293
1294     if (TREE_CODE (orig_lhs) == VIEW_CONVERT_EXPR
1295         && val.lattice_val == CONSTANT)
1296       {
1297         tree w = fold_unary (VIEW_CONVERT_EXPR,
1298                              TREE_TYPE (TREE_OPERAND (orig_lhs, 0)),
1299                              val.value);
1300
1301         orig_lhs = TREE_OPERAND (orig_lhs, 0);
1302         if (w && is_gimple_min_invariant (w))
1303           val.value = w;
1304         else
1305           {
1306             val.lattice_val = VARYING;
1307             val.value = NULL;
1308           }
1309       }
1310
1311     if (val.lattice_val == CONSTANT
1312         && TREE_CODE (orig_lhs) == COMPONENT_REF
1313         && DECL_BIT_FIELD (TREE_OPERAND (orig_lhs, 1)))
1314       {
1315         tree w = widen_bitfield (val.value, TREE_OPERAND (orig_lhs, 1),
1316                                  orig_lhs);
1317
1318         if (w && is_gimple_min_invariant (w))
1319           val.value = w;
1320         else
1321           {
1322             val.lattice_val = VARYING;
1323             val.value = NULL_TREE;
1324             val.mem_ref = NULL_TREE;
1325           }
1326       }
1327   }
1328
1329   retval = SSA_PROP_NOT_INTERESTING;
1330
1331   /* Set the lattice value of the statement's output.  */
1332   if (TREE_CODE (lhs) == SSA_NAME)
1333     {
1334       /* If STMT is an assignment to an SSA_NAME, we only have one
1335          value to set.  */
1336       if (set_lattice_value (lhs, val))
1337         {
1338           *output_p = lhs;
1339           if (val.lattice_val == VARYING)
1340             retval = SSA_PROP_VARYING;
1341           else
1342             retval = SSA_PROP_INTERESTING;
1343         }
1344     }
1345   else if (do_store_ccp && stmt_makes_single_store (stmt))
1346     {
1347       /* Otherwise, set the names in VDEF operands to the new
1348          constant value and mark the LHS as the memory reference
1349          associated with VAL.  */
1350       ssa_op_iter i;
1351       tree vdef;
1352       bool changed;
1353
1354       /* Mark VAL as stored in the LHS of this assignment.  */
1355       if (val.lattice_val == CONSTANT)
1356         val.mem_ref = lhs;
1357
1358       /* Set the value of every VDEF to VAL.  */
1359       changed = false;
1360       FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS)
1361         {
1362           /* See PR 29801.  We may have VDEFs for read-only variables
1363              (see the handling of unmodifiable variables in
1364              add_virtual_operand); do not attempt to change their value.  */
1365           if (get_symbol_constant_value (SSA_NAME_VAR (vdef)) != NULL_TREE)
1366             continue;
1367
1368           changed |= set_lattice_value (vdef, val);
1369         }
1370       
1371       /* Note that for propagation purposes, we are only interested in
1372          visiting statements that load the exact same memory reference
1373          stored here.  Those statements will have the exact same list
1374          of virtual uses, so it is enough to set the output of this
1375          statement to be its first virtual definition.  */
1376       *output_p = first_vdef (stmt);
1377       if (changed)
1378         {
1379           if (val.lattice_val == VARYING)
1380             retval = SSA_PROP_VARYING;
1381           else 
1382             retval = SSA_PROP_INTERESTING;
1383         }
1384     }
1385
1386   return retval;
1387 }
1388
1389
1390 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
1391    if it can determine which edge will be taken.  Otherwise, return
1392    SSA_PROP_VARYING.  */
1393
1394 static enum ssa_prop_result
1395 visit_cond_stmt (tree stmt, edge *taken_edge_p)
1396 {
1397   prop_value_t val;
1398   basic_block block;
1399
1400   block = bb_for_stmt (stmt);
1401   val = evaluate_stmt (stmt);
1402
1403   /* Find which edge out of the conditional block will be taken and add it
1404      to the worklist.  If no single edge can be determined statically,
1405      return SSA_PROP_VARYING to feed all the outgoing edges to the
1406      propagation engine.  */
1407   *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
1408   if (*taken_edge_p)
1409     return SSA_PROP_INTERESTING;
1410   else
1411     return SSA_PROP_VARYING;
1412 }
1413
1414
1415 /* Evaluate statement STMT.  If the statement produces an output value and
1416    its evaluation changes the lattice value of its output, return
1417    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1418    output value.
1419    
1420    If STMT is a conditional branch and we can determine its truth
1421    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
1422    value, return SSA_PROP_VARYING.  */
1423
1424 static enum ssa_prop_result
1425 ccp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1426 {
1427   tree def;
1428   ssa_op_iter iter;
1429
1430   if (dump_file && (dump_flags & TDF_DETAILS))
1431     {
1432       fprintf (dump_file, "\nVisiting statement:\n");
1433       print_generic_stmt (dump_file, stmt, dump_flags);
1434       fprintf (dump_file, "\n");
1435     }
1436
1437   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
1438     {
1439       /* If the statement is an assignment that produces a single
1440          output value, evaluate its RHS to see if the lattice value of
1441          its output has changed.  */
1442       return visit_assignment (stmt, output_p);
1443     }
1444   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1445     {
1446       /* If STMT is a conditional branch, see if we can determine
1447          which branch will be taken.  */
1448       return visit_cond_stmt (stmt, taken_edge_p);
1449     }
1450
1451   /* Any other kind of statement is not interesting for constant
1452      propagation and, therefore, not worth simulating.  */
1453   if (dump_file && (dump_flags & TDF_DETAILS))
1454     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
1455
1456   /* Definitions made by statements other than assignments to
1457      SSA_NAMEs represent unknown modifications to their outputs.
1458      Mark them VARYING.  */
1459   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1460     {
1461       prop_value_t v = { VARYING, NULL_TREE, NULL_TREE };
1462       set_lattice_value (def, v);
1463     }
1464
1465   return SSA_PROP_VARYING;
1466 }
1467
1468
1469 /* Main entry point for SSA Conditional Constant Propagation.  */
1470
1471 static unsigned int
1472 execute_ssa_ccp (bool store_ccp)
1473 {
1474   do_store_ccp = store_ccp;
1475   ccp_initialize ();
1476   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
1477   if (ccp_finalize ())
1478     return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
1479   else
1480     return 0;
1481 }
1482
1483
1484 static unsigned int
1485 do_ssa_ccp (void)
1486 {
1487   return execute_ssa_ccp (false);
1488 }
1489
1490
1491 static bool
1492 gate_ccp (void)
1493 {
1494   return flag_tree_ccp != 0;
1495 }
1496
1497
1498 struct gimple_opt_pass pass_ccp = 
1499 {
1500  {
1501   GIMPLE_PASS,
1502   "ccp",                                /* name */
1503   gate_ccp,                             /* gate */
1504   do_ssa_ccp,                           /* execute */
1505   NULL,                                 /* sub */
1506   NULL,                                 /* next */
1507   0,                                    /* static_pass_number */
1508   TV_TREE_CCP,                          /* tv_id */
1509   PROP_cfg | PROP_ssa,                  /* properties_required */
1510   0,                                    /* properties_provided */
1511   0,                                    /* properties_destroyed */
1512   0,                                    /* todo_flags_start */
1513   TODO_dump_func | TODO_verify_ssa
1514   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1515  }
1516 };
1517
1518
1519 static unsigned int
1520 do_ssa_store_ccp (void)
1521 {
1522   /* If STORE-CCP is not enabled, we just run regular CCP.  */
1523   return execute_ssa_ccp (flag_tree_store_ccp != 0);
1524 }
1525
1526 static bool
1527 gate_store_ccp (void)
1528 {
1529   /* STORE-CCP is enabled only with -ftree-store-ccp, but when
1530      -fno-tree-store-ccp is specified, we should run regular CCP.
1531      That's why the pass is enabled with either flag.  */
1532   return flag_tree_store_ccp != 0 || flag_tree_ccp != 0;
1533 }
1534
1535
1536 struct gimple_opt_pass pass_store_ccp = 
1537 {
1538  {
1539   GIMPLE_PASS,
1540   "store_ccp",                          /* name */
1541   gate_store_ccp,                       /* gate */
1542   do_ssa_store_ccp,                     /* execute */
1543   NULL,                                 /* sub */
1544   NULL,                                 /* next */
1545   0,                                    /* static_pass_number */
1546   TV_TREE_STORE_CCP,                    /* tv_id */
1547   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
1548   0,                                    /* properties_provided */
1549   0,                                    /* properties_destroyed */
1550   0,                                    /* todo_flags_start */
1551   TODO_dump_func | TODO_verify_ssa
1552   | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1553  }
1554 };
1555
1556 /* Given a constant value VAL for bitfield FIELD, and a destination
1557    variable VAR, return VAL appropriately widened to fit into VAR.  If
1558    FIELD is wider than HOST_WIDE_INT, NULL is returned.  */
1559
1560 tree
1561 widen_bitfield (tree val, tree field, tree var)
1562 {
1563   unsigned HOST_WIDE_INT var_size, field_size;
1564   tree wide_val;
1565   unsigned HOST_WIDE_INT mask;
1566   unsigned int i;
1567
1568   /* We can only do this if the size of the type and field and VAL are
1569      all constants representable in HOST_WIDE_INT.  */
1570   if (!host_integerp (TYPE_SIZE (TREE_TYPE (var)), 1)
1571       || !host_integerp (DECL_SIZE (field), 1)
1572       || !host_integerp (val, 0))
1573     return NULL_TREE;
1574
1575   var_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (var)), 1);
1576   field_size = tree_low_cst (DECL_SIZE (field), 1);
1577
1578   /* Give up if either the bitfield or the variable are too wide.  */
1579   if (field_size > HOST_BITS_PER_WIDE_INT || var_size > HOST_BITS_PER_WIDE_INT)
1580     return NULL_TREE;
1581
1582   gcc_assert (var_size >= field_size);
1583
1584   /* If the sign bit of the value is not set or the field's type is unsigned,
1585      just mask off the high order bits of the value.  */
1586   if (DECL_UNSIGNED (field)
1587       || !(tree_low_cst (val, 0) & (((HOST_WIDE_INT)1) << (field_size - 1))))
1588     {
1589       /* Zero extension.  Build a mask with the lower 'field_size' bits
1590          set and a BIT_AND_EXPR node to clear the high order bits of
1591          the value.  */
1592       for (i = 0, mask = 0; i < field_size; i++)
1593         mask |= ((HOST_WIDE_INT) 1) << i;
1594
1595       wide_val = fold_build2 (BIT_AND_EXPR, TREE_TYPE (var), val, 
1596                               build_int_cst (TREE_TYPE (var), mask));
1597     }
1598   else
1599     {
1600       /* Sign extension.  Create a mask with the upper 'field_size'
1601          bits set and a BIT_IOR_EXPR to set the high order bits of the
1602          value.  */
1603       for (i = 0, mask = 0; i < (var_size - field_size); i++)
1604         mask |= ((HOST_WIDE_INT) 1) << (var_size - i - 1);
1605
1606       wide_val = fold_build2 (BIT_IOR_EXPR, TREE_TYPE (var), val,
1607                               build_int_cst (TREE_TYPE (var), mask));
1608     }
1609
1610   return wide_val;
1611 }
1612
1613
1614 /* A subroutine of fold_stmt_r.  Attempts to fold *(A+O) to A[X].
1615    BASE is an array type.  OFFSET is a byte displacement.  ORIG_TYPE
1616    is the desired result type.  */
1617
1618 static tree
1619 maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type,
1620                                 bool allow_negative_idx)
1621 {
1622   tree min_idx, idx, idx_type, elt_offset = integer_zero_node;
1623   tree array_type, elt_type, elt_size;
1624   tree domain_type;
1625
1626   /* If BASE is an ARRAY_REF, we can pick up another offset (this time
1627      measured in units of the size of elements type) from that ARRAY_REF).
1628      We can't do anything if either is variable.
1629
1630      The case we handle here is *(&A[N]+O).  */
1631   if (TREE_CODE (base) == ARRAY_REF)
1632     {
1633       tree low_bound = array_ref_low_bound (base);
1634
1635       elt_offset = TREE_OPERAND (base, 1);
1636       if (TREE_CODE (low_bound) != INTEGER_CST
1637           || TREE_CODE (elt_offset) != INTEGER_CST)
1638         return NULL_TREE;
1639
1640       elt_offset = int_const_binop (MINUS_EXPR, elt_offset, low_bound, 0);
1641       base = TREE_OPERAND (base, 0);
1642     }
1643
1644   /* Ignore stupid user tricks of indexing non-array variables.  */
1645   array_type = TREE_TYPE (base);
1646   if (TREE_CODE (array_type) != ARRAY_TYPE)
1647     return NULL_TREE;
1648   elt_type = TREE_TYPE (array_type);
1649   if (!useless_type_conversion_p (orig_type, elt_type))
1650     return NULL_TREE;
1651
1652   /* Use signed size type for intermediate computation on the index.  */
1653   idx_type = signed_type_for (size_type_node);
1654
1655   /* If OFFSET and ELT_OFFSET are zero, we don't care about the size of the
1656      element type (so we can use the alignment if it's not constant).
1657      Otherwise, compute the offset as an index by using a division.  If the
1658      division isn't exact, then don't do anything.  */
1659   elt_size = TYPE_SIZE_UNIT (elt_type);
1660   if (!elt_size)
1661     return NULL;
1662   if (integer_zerop (offset))
1663     {
1664       if (TREE_CODE (elt_size) != INTEGER_CST)
1665         elt_size = size_int (TYPE_ALIGN (elt_type));
1666
1667       idx = build_int_cst (idx_type, 0);
1668     }
1669   else
1670     {
1671       unsigned HOST_WIDE_INT lquo, lrem;
1672       HOST_WIDE_INT hquo, hrem;
1673       double_int soffset;
1674
1675       /* The final array offset should be signed, so we need
1676          to sign-extend the (possibly pointer) offset here
1677          and use signed division.  */
1678       soffset = double_int_sext (tree_to_double_int (offset),
1679                                  TYPE_PRECISION (TREE_TYPE (offset)));
1680       if (TREE_CODE (elt_size) != INTEGER_CST
1681           || div_and_round_double (TRUNC_DIV_EXPR, 0,
1682                                    soffset.low, soffset.high,
1683                                    TREE_INT_CST_LOW (elt_size),
1684                                    TREE_INT_CST_HIGH (elt_size),
1685                                    &lquo, &hquo, &lrem, &hrem)
1686           || lrem || hrem)
1687         return NULL_TREE;
1688
1689       idx = build_int_cst_wide (idx_type, lquo, hquo);
1690     }
1691
1692   /* Assume the low bound is zero.  If there is a domain type, get the
1693      low bound, if any, convert the index into that type, and add the
1694      low bound.  */
1695   min_idx = build_int_cst (idx_type, 0);
1696   domain_type = TYPE_DOMAIN (array_type);
1697   if (domain_type)
1698     {
1699       idx_type = domain_type;
1700       if (TYPE_MIN_VALUE (idx_type))
1701         min_idx = TYPE_MIN_VALUE (idx_type);
1702       else
1703         min_idx = fold_convert (idx_type, min_idx);
1704
1705       if (TREE_CODE (min_idx) != INTEGER_CST)
1706         return NULL_TREE;
1707
1708       elt_offset = fold_convert (idx_type, elt_offset);
1709     }
1710
1711   if (!integer_zerop (min_idx))
1712     idx = int_const_binop (PLUS_EXPR, idx, min_idx, 0);
1713   if (!integer_zerop (elt_offset))
1714     idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0);
1715
1716   /* Make sure to possibly truncate late after offsetting.  */
1717   idx = fold_convert (idx_type, idx);
1718
1719   /* We don't want to construct access past array bounds. For example
1720        char *(c[4]);
1721        c[3][2];
1722      should not be simplified into (*c)[14] or tree-vrp will
1723      give false warnings.  The same is true for
1724        struct A { long x; char d[0]; } *a;
1725        (char *)a - 4;
1726      which should be not folded to &a->d[-8].  */
1727   if (domain_type
1728       && TYPE_MAX_VALUE (domain_type) 
1729       && TREE_CODE (TYPE_MAX_VALUE (domain_type)) == INTEGER_CST)
1730     {
1731       tree up_bound = TYPE_MAX_VALUE (domain_type);
1732
1733       if (tree_int_cst_lt (up_bound, idx)
1734           /* Accesses after the end of arrays of size 0 (gcc
1735              extension) and 1 are likely intentional ("struct
1736              hack").  */
1737           && compare_tree_int (up_bound, 1) > 0)
1738         return NULL_TREE;
1739     }
1740   if (domain_type
1741       && TYPE_MIN_VALUE (domain_type))
1742     {
1743       if (!allow_negative_idx
1744           && TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST
1745           && tree_int_cst_lt (idx, TYPE_MIN_VALUE (domain_type)))
1746         return NULL_TREE;
1747     }
1748   else if (!allow_negative_idx
1749            && compare_tree_int (idx, 0) < 0)
1750     return NULL_TREE;
1751
1752   return build4 (ARRAY_REF, elt_type, base, idx, NULL_TREE, NULL_TREE);
1753 }
1754
1755
1756 /* Attempt to fold *(S+O) to S.X.
1757    BASE is a record type.  OFFSET is a byte displacement.  ORIG_TYPE
1758    is the desired result type.  */
1759
1760 static tree
1761 maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
1762                                     tree orig_type, bool base_is_ptr)
1763 {
1764   tree f, t, field_type, tail_array_field, field_offset;
1765   tree ret;
1766   tree new_base;
1767
1768   if (TREE_CODE (record_type) != RECORD_TYPE
1769       && TREE_CODE (record_type) != UNION_TYPE
1770       && TREE_CODE (record_type) != QUAL_UNION_TYPE)
1771     return NULL_TREE;
1772
1773   /* Short-circuit silly cases.  */
1774   if (useless_type_conversion_p (record_type, orig_type))
1775     return NULL_TREE;
1776
1777   tail_array_field = NULL_TREE;
1778   for (f = TYPE_FIELDS (record_type); f ; f = TREE_CHAIN (f))
1779     {
1780       int cmp;
1781
1782       if (TREE_CODE (f) != FIELD_DECL)
1783         continue;
1784       if (DECL_BIT_FIELD (f))
1785         continue;
1786
1787       if (!DECL_FIELD_OFFSET (f))
1788         continue;
1789       field_offset = byte_position (f);
1790       if (TREE_CODE (field_offset) != INTEGER_CST)
1791         continue;
1792
1793       /* ??? Java creates "interesting" fields for representing base classes.
1794          They have no name, and have no context.  With no context, we get into
1795          trouble with nonoverlapping_component_refs_p.  Skip them.  */
1796       if (!DECL_FIELD_CONTEXT (f))
1797         continue;
1798
1799       /* The previous array field isn't at the end.  */
1800       tail_array_field = NULL_TREE;
1801
1802       /* Check to see if this offset overlaps with the field.  */
1803       cmp = tree_int_cst_compare (field_offset, offset);
1804       if (cmp > 0)
1805         continue;
1806
1807       field_type = TREE_TYPE (f);
1808
1809       /* Here we exactly match the offset being checked.  If the types match,
1810          then we can return that field.  */
1811       if (cmp == 0
1812           && useless_type_conversion_p (orig_type, field_type))
1813         {
1814           if (base_is_ptr)
1815             base = build1 (INDIRECT_REF, record_type, base);
1816           t = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
1817           return t;
1818         }
1819       
1820       /* Don't care about offsets into the middle of scalars.  */
1821       if (!AGGREGATE_TYPE_P (field_type))
1822         continue;
1823
1824       /* Check for array at the end of the struct.  This is often
1825          used as for flexible array members.  We should be able to
1826          turn this into an array access anyway.  */
1827       if (TREE_CODE (field_type) == ARRAY_TYPE)
1828         tail_array_field = f;
1829
1830       /* Check the end of the field against the offset.  */
1831       if (!DECL_SIZE_UNIT (f)
1832           || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
1833         continue;
1834       t = int_const_binop (MINUS_EXPR, offset, field_offset, 1);
1835       if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
1836         continue;
1837
1838       /* If we matched, then set offset to the displacement into
1839          this field.  */
1840       if (base_is_ptr)
1841         new_base = build1 (INDIRECT_REF, record_type, base);
1842       else
1843         new_base = base;
1844       new_base = build3 (COMPONENT_REF, field_type, new_base, f, NULL_TREE);
1845
1846       /* Recurse to possibly find the match.  */
1847       ret = maybe_fold_offset_to_array_ref (new_base, t, orig_type,
1848                                             f == TYPE_FIELDS (record_type));
1849       if (ret)
1850         return ret;
1851       ret = maybe_fold_offset_to_component_ref (field_type, new_base, t,
1852                                                 orig_type, false);
1853       if (ret)
1854         return ret;
1855     }
1856
1857   if (!tail_array_field)
1858     return NULL_TREE;
1859
1860   f = tail_array_field;
1861   field_type = TREE_TYPE (f);
1862   offset = int_const_binop (MINUS_EXPR, offset, byte_position (f), 1);
1863
1864   /* If we get here, we've got an aggregate field, and a possibly 
1865      nonzero offset into them.  Recurse and hope for a valid match.  */
1866   if (base_is_ptr)
1867     base = build1 (INDIRECT_REF, record_type, base);
1868   base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
1869
1870   t = maybe_fold_offset_to_array_ref (base, offset, orig_type,
1871                                       f == TYPE_FIELDS (record_type));
1872   if (t)
1873     return t;
1874   return maybe_fold_offset_to_component_ref (field_type, base, offset,
1875                                              orig_type, false);
1876 }
1877
1878 /* Attempt to express (ORIG_TYPE)BASE+OFFSET as BASE->field_of_orig_type
1879    or BASE[index] or by combination of those. 
1880
1881    Before attempting the conversion strip off existing ADDR_EXPRs and
1882    handled component refs.  */
1883
1884 tree
1885 maybe_fold_offset_to_reference (tree base, tree offset, tree orig_type)
1886 {
1887   tree ret;
1888   tree type;
1889   bool base_is_ptr = true;
1890
1891   STRIP_NOPS (base);
1892   if (TREE_CODE (base) == ADDR_EXPR)
1893     {
1894       base_is_ptr = false;
1895
1896       base = TREE_OPERAND (base, 0);
1897
1898       /* Handle case where existing COMPONENT_REF pick e.g. wrong field of union,
1899          so it needs to be removed and new COMPONENT_REF constructed.
1900          The wrong COMPONENT_REF are often constructed by folding the
1901          (type *)&object within the expression (type *)&object+offset  */
1902       if (handled_component_p (base) && 0)
1903         {
1904           HOST_WIDE_INT sub_offset, size, maxsize;
1905           tree newbase;
1906           newbase = get_ref_base_and_extent (base, &sub_offset,
1907                                              &size, &maxsize);
1908           gcc_assert (newbase);
1909           gcc_assert (!(sub_offset & (BITS_PER_UNIT - 1)));
1910           if (size == maxsize)
1911             {
1912               base = newbase;
1913               if (sub_offset)
1914                 offset = int_const_binop (PLUS_EXPR, offset,
1915                                           build_int_cst (TREE_TYPE (offset),
1916                                           sub_offset / BITS_PER_UNIT), 1);
1917             }
1918         }
1919       if (useless_type_conversion_p (orig_type, TREE_TYPE (base))
1920           && integer_zerop (offset))
1921         return base;
1922       type = TREE_TYPE (base);
1923     }
1924   else
1925     {
1926       base_is_ptr = true;
1927       if (!POINTER_TYPE_P (TREE_TYPE (base)))
1928         return NULL_TREE;
1929       type = TREE_TYPE (TREE_TYPE (base));
1930     }
1931   ret = maybe_fold_offset_to_component_ref (type, base, offset,
1932                                             orig_type, base_is_ptr);
1933   if (!ret)
1934     {
1935       if (base_is_ptr)
1936         base = build1 (INDIRECT_REF, type, base);
1937       ret = maybe_fold_offset_to_array_ref (base, offset, orig_type, true);
1938     }
1939   return ret;
1940 }
1941
1942 /* A subroutine of fold_stmt_r.  Attempt to simplify *(BASE+OFFSET).
1943    Return the simplified expression, or NULL if nothing could be done.  */
1944
1945 static tree
1946 maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
1947 {
1948   tree t;
1949   bool volatile_p = TREE_THIS_VOLATILE (expr);
1950
1951   /* We may well have constructed a double-nested PLUS_EXPR via multiple
1952      substitutions.  Fold that down to one.  Remove NON_LVALUE_EXPRs that
1953      are sometimes added.  */
1954   base = fold (base);
1955   STRIP_TYPE_NOPS (base);
1956   TREE_OPERAND (expr, 0) = base;
1957
1958   /* One possibility is that the address reduces to a string constant.  */
1959   t = fold_read_from_constant_string (expr);
1960   if (t)
1961     return t;
1962
1963   /* Add in any offset from a POINTER_PLUS_EXPR.  */
1964   if (TREE_CODE (base) == POINTER_PLUS_EXPR)
1965     {
1966       tree offset2;
1967
1968       offset2 = TREE_OPERAND (base, 1);
1969       if (TREE_CODE (offset2) != INTEGER_CST)
1970         return NULL_TREE;
1971       base = TREE_OPERAND (base, 0);
1972
1973       offset = fold_convert (sizetype,
1974                              int_const_binop (PLUS_EXPR, offset, offset2, 1));
1975     }
1976
1977   if (TREE_CODE (base) == ADDR_EXPR)
1978     {
1979       tree base_addr = base;
1980
1981       /* Strip the ADDR_EXPR.  */
1982       base = TREE_OPERAND (base, 0);
1983
1984       /* Fold away CONST_DECL to its value, if the type is scalar.  */
1985       if (TREE_CODE (base) == CONST_DECL
1986           && ccp_decl_initial_min_invariant (DECL_INITIAL (base)))
1987         return DECL_INITIAL (base);
1988
1989       /* Try folding *(&B+O) to B.X.  */
1990       t = maybe_fold_offset_to_reference (base_addr, offset,
1991                                           TREE_TYPE (expr));
1992       if (t)
1993         {
1994           TREE_THIS_VOLATILE (t) = volatile_p;
1995           return t;
1996         }
1997     }
1998   else
1999     {
2000       /* We can get here for out-of-range string constant accesses, 
2001          such as "_"[3].  Bail out of the entire substitution search
2002          and arrange for the entire statement to be replaced by a
2003          call to __builtin_trap.  In all likelihood this will all be
2004          constant-folded away, but in the meantime we can't leave with
2005          something that get_expr_operands can't understand.  */
2006
2007       t = base;
2008       STRIP_NOPS (t);
2009       if (TREE_CODE (t) == ADDR_EXPR
2010           && TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)
2011         {
2012           /* FIXME: Except that this causes problems elsewhere with dead
2013              code not being deleted, and we die in the rtl expanders 
2014              because we failed to remove some ssa_name.  In the meantime,
2015              just return zero.  */
2016           /* FIXME2: This condition should be signaled by
2017              fold_read_from_constant_string directly, rather than 
2018              re-checking for it here.  */
2019           return integer_zero_node;
2020         }
2021
2022       /* Try folding *(B+O) to B->X.  Still an improvement.  */
2023       if (POINTER_TYPE_P (TREE_TYPE (base)))
2024         {
2025           t = maybe_fold_offset_to_reference (base, offset,
2026                                               TREE_TYPE (expr));
2027           if (t)
2028             return t;
2029         }
2030     }
2031
2032   /* Otherwise we had an offset that we could not simplify.  */
2033   return NULL_TREE;
2034 }
2035
2036
2037 /* A subroutine of fold_stmt_r.  EXPR is a POINTER_PLUS_EXPR.
2038
2039    A quaint feature extant in our address arithmetic is that there
2040    can be hidden type changes here.  The type of the result need
2041    not be the same as the type of the input pointer.
2042
2043    What we're after here is an expression of the form
2044         (T *)(&array + const)
2045    where the cast doesn't actually exist, but is implicit in the
2046    type of the POINTER_PLUS_EXPR.  We'd like to turn this into
2047         &array[x]
2048    which may be able to propagate further.  */
2049
2050 static tree
2051 maybe_fold_stmt_addition (tree expr)
2052 {
2053   tree op0 = TREE_OPERAND (expr, 0);
2054   tree op1 = TREE_OPERAND (expr, 1);
2055   tree ptr_type = TREE_TYPE (expr);
2056   tree ptd_type;
2057   tree t;
2058
2059   gcc_assert (TREE_CODE (expr) == POINTER_PLUS_EXPR);
2060
2061   /* It had better be a constant.  */
2062   if (TREE_CODE (op1) != INTEGER_CST)
2063     return NULL_TREE;
2064   /* The first operand should be an ADDR_EXPR.  */
2065   if (TREE_CODE (op0) != ADDR_EXPR)
2066     return NULL_TREE;
2067   op0 = TREE_OPERAND (op0, 0);
2068
2069   /* If the first operand is an ARRAY_REF, expand it so that we can fold
2070      the offset into it.  */
2071   while (TREE_CODE (op0) == ARRAY_REF)
2072     {
2073       tree array_obj = TREE_OPERAND (op0, 0);
2074       tree array_idx = TREE_OPERAND (op0, 1);
2075       tree elt_type = TREE_TYPE (op0);
2076       tree elt_size = TYPE_SIZE_UNIT (elt_type);
2077       tree min_idx;
2078
2079       if (TREE_CODE (array_idx) != INTEGER_CST)
2080         break;
2081       if (TREE_CODE (elt_size) != INTEGER_CST)
2082         break;
2083
2084       /* Un-bias the index by the min index of the array type.  */
2085       min_idx = TYPE_DOMAIN (TREE_TYPE (array_obj));
2086       if (min_idx)
2087         {
2088           min_idx = TYPE_MIN_VALUE (min_idx);
2089           if (min_idx)
2090             {
2091               if (TREE_CODE (min_idx) != INTEGER_CST)
2092                 break;
2093
2094               array_idx = fold_convert (TREE_TYPE (min_idx), array_idx);
2095               if (!integer_zerop (min_idx))
2096                 array_idx = int_const_binop (MINUS_EXPR, array_idx,
2097                                              min_idx, 0);
2098             }
2099         }
2100
2101       /* Convert the index to a byte offset.  */
2102       array_idx = fold_convert (sizetype, array_idx);
2103       array_idx = int_const_binop (MULT_EXPR, array_idx, elt_size, 0);
2104
2105       /* Update the operands for the next round, or for folding.  */
2106       op1 = int_const_binop (PLUS_EXPR,
2107                              array_idx, op1, 0);
2108       op0 = array_obj;
2109     }
2110
2111   ptd_type = TREE_TYPE (ptr_type);
2112   /* If we want a pointer to void, reconstruct the reference from the
2113      array element type.  A pointer to that can be trivially converted
2114      to void *.  This happens as we fold (void *)(ptr p+ off).  */
2115   if (VOID_TYPE_P (ptd_type)
2116       && TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
2117     ptd_type = TREE_TYPE (TREE_TYPE (op0));
2118
2119   /* At which point we can try some of the same things as for indirects.  */
2120   t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type, true);
2121   if (!t)
2122     t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1,
2123                                             ptd_type, false);
2124   if (t)
2125     t = build1 (ADDR_EXPR, ptr_type, t);
2126
2127   return t;
2128 }
2129
2130 /* For passing state through walk_tree into fold_stmt_r and its
2131    children.  */
2132
2133 struct fold_stmt_r_data
2134 {
2135   tree stmt;
2136   bool *changed_p;
2137   bool *inside_addr_expr_p;
2138 };
2139
2140 /* Subroutine of fold_stmt called via walk_tree.  We perform several
2141    simplifications of EXPR_P, mostly having to do with pointer arithmetic.  */
2142
2143 static tree
2144 fold_stmt_r (tree *expr_p, int *walk_subtrees, void *data)
2145 {
2146   struct fold_stmt_r_data *fold_stmt_r_data = (struct fold_stmt_r_data *) data;
2147   bool *inside_addr_expr_p = fold_stmt_r_data->inside_addr_expr_p;
2148   bool *changed_p = fold_stmt_r_data->changed_p;
2149   tree expr = *expr_p, t;
2150   bool volatile_p = TREE_THIS_VOLATILE (expr);
2151
2152   /* ??? It'd be nice if walk_tree had a pre-order option.  */
2153   switch (TREE_CODE (expr))
2154     {
2155     case INDIRECT_REF:
2156       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2157       if (t)
2158         return t;
2159       *walk_subtrees = 0;
2160
2161       t = maybe_fold_stmt_indirect (expr, TREE_OPERAND (expr, 0),
2162                                     integer_zero_node);
2163       break;
2164
2165     case NOP_EXPR:
2166       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2167       if (t)
2168         return t;
2169       *walk_subtrees = 0;
2170
2171       if (POINTER_TYPE_P (TREE_TYPE (expr))
2172           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
2173           && (t = maybe_fold_offset_to_reference
2174                       (TREE_OPERAND (expr, 0),
2175                        integer_zero_node,
2176                        TREE_TYPE (TREE_TYPE (expr)))))
2177         {
2178           tree ptr_type = build_pointer_type (TREE_TYPE (t));
2179           if (!useless_type_conversion_p (TREE_TYPE (expr), ptr_type))
2180             return NULL_TREE;
2181           t = build_fold_addr_expr_with_type (t, ptr_type);
2182         }
2183       break;
2184
2185       /* ??? Could handle more ARRAY_REFs here, as a variant of INDIRECT_REF.
2186          We'd only want to bother decomposing an existing ARRAY_REF if
2187          the base array is found to have another offset contained within.
2188          Otherwise we'd be wasting time.  */
2189     case ARRAY_REF:
2190       /* If we are not processing expressions found within an
2191          ADDR_EXPR, then we can fold constant array references.  */
2192       if (!*inside_addr_expr_p)
2193         t = fold_read_from_constant_string (expr);
2194       else
2195         t = NULL;
2196       break;
2197
2198     case ADDR_EXPR:
2199       *inside_addr_expr_p = true;
2200       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2201       *inside_addr_expr_p = false;
2202       if (t)
2203         return t;
2204       *walk_subtrees = 0;
2205
2206       /* Set TREE_INVARIANT properly so that the value is properly
2207          considered constant, and so gets propagated as expected.  */
2208       if (*changed_p)
2209         recompute_tree_invariant_for_addr_expr (expr);
2210       return NULL_TREE;
2211
2212     case POINTER_PLUS_EXPR:
2213       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2214       if (t)
2215         return t;
2216       t = walk_tree (&TREE_OPERAND (expr, 1), fold_stmt_r, data, NULL);
2217       if (t)
2218         return t;
2219       *walk_subtrees = 0;
2220
2221       t = maybe_fold_stmt_addition (expr);
2222       break;
2223
2224     case COMPONENT_REF:
2225       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2226       if (t)
2227         return t;
2228       *walk_subtrees = 0;
2229
2230       /* Make sure the FIELD_DECL is actually a field in the type on the lhs.
2231          We've already checked that the records are compatible, so we should
2232          come up with a set of compatible fields.  */
2233       {
2234         tree expr_record = TREE_TYPE (TREE_OPERAND (expr, 0));
2235         tree expr_field = TREE_OPERAND (expr, 1);
2236
2237         if (DECL_FIELD_CONTEXT (expr_field) != TYPE_MAIN_VARIANT (expr_record))
2238           {
2239             expr_field = find_compatible_field (expr_record, expr_field);
2240             TREE_OPERAND (expr, 1) = expr_field;
2241           }
2242       }
2243       break;
2244
2245     case TARGET_MEM_REF:
2246       t = maybe_fold_tmr (expr);
2247       break;
2248
2249     case COND_EXPR:
2250       if (COMPARISON_CLASS_P (TREE_OPERAND (expr, 0)))
2251         {
2252           tree op0 = TREE_OPERAND (expr, 0);
2253           tree tem;
2254           bool set;
2255
2256           fold_defer_overflow_warnings ();
2257           tem = fold_binary (TREE_CODE (op0), TREE_TYPE (op0),
2258                              TREE_OPERAND (op0, 0),
2259                              TREE_OPERAND (op0, 1));
2260           set = tem && set_rhs (expr_p, tem);
2261           fold_undefer_overflow_warnings (set, fold_stmt_r_data->stmt, 0);
2262           if (set)
2263             {
2264               t = *expr_p;
2265               break;
2266             }
2267         }
2268       return NULL_TREE;
2269
2270     default:
2271       return NULL_TREE;
2272     }
2273
2274   if (t)
2275     {
2276       /* Preserve volatileness of the original expression.  */
2277       TREE_THIS_VOLATILE (t) = volatile_p;
2278       *expr_p = t;
2279       *changed_p = true;
2280     }
2281
2282   return NULL_TREE;
2283 }
2284
2285
2286 /* Return the string length, maximum string length or maximum value of
2287    ARG in LENGTH.
2288    If ARG is an SSA name variable, follow its use-def chains.  If LENGTH
2289    is not NULL and, for TYPE == 0, its value is not equal to the length
2290    we determine or if we are unable to determine the length or value,
2291    return false.  VISITED is a bitmap of visited variables.
2292    TYPE is 0 if string length should be returned, 1 for maximum string
2293    length and 2 for maximum value ARG can have.  */
2294
2295 static bool
2296 get_maxval_strlen (tree arg, tree *length, bitmap visited, int type)
2297 {
2298   tree var, def_stmt, val;
2299   
2300   if (TREE_CODE (arg) != SSA_NAME)
2301     {
2302       if (TREE_CODE (arg) == COND_EXPR)
2303         return get_maxval_strlen (COND_EXPR_THEN (arg), length, visited, type)
2304                && get_maxval_strlen (COND_EXPR_ELSE (arg), length, visited, type);
2305       /* We can end up with &(*iftmp_1)[0] here as well, so handle it.  */
2306       else if (TREE_CODE (arg) == ADDR_EXPR
2307                && TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF
2308                && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg, 0), 1)))
2309         {
2310           tree aop0 = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
2311           if (TREE_CODE (aop0) == INDIRECT_REF
2312               && TREE_CODE (TREE_OPERAND (aop0, 0)) == SSA_NAME)
2313             return get_maxval_strlen (TREE_OPERAND (aop0, 0),
2314                                       length, visited, type);
2315         }
2316
2317       if (type == 2)
2318         {
2319           val = arg;
2320           if (TREE_CODE (val) != INTEGER_CST
2321               || tree_int_cst_sgn (val) < 0)
2322             return false;
2323         }
2324       else
2325         val = c_strlen (arg, 1);
2326       if (!val)
2327         return false;
2328
2329       if (*length)
2330         {
2331           if (type > 0)
2332             {
2333               if (TREE_CODE (*length) != INTEGER_CST
2334                   || TREE_CODE (val) != INTEGER_CST)
2335                 return false;
2336
2337               if (tree_int_cst_lt (*length, val))
2338                 *length = val;
2339               return true;
2340             }
2341           else if (simple_cst_equal (val, *length) != 1)
2342             return false;
2343         }
2344
2345       *length = val;
2346       return true;
2347     }
2348
2349   /* If we were already here, break the infinite cycle.  */
2350   if (bitmap_bit_p (visited, SSA_NAME_VERSION (arg)))
2351     return true;
2352   bitmap_set_bit (visited, SSA_NAME_VERSION (arg));
2353
2354   var = arg;
2355   def_stmt = SSA_NAME_DEF_STMT (var);
2356
2357   switch (TREE_CODE (def_stmt))
2358     {
2359       case GIMPLE_MODIFY_STMT:
2360         {
2361           tree rhs;
2362
2363           /* The RHS of the statement defining VAR must either have a
2364              constant length or come from another SSA_NAME with a constant
2365              length.  */
2366           rhs = GIMPLE_STMT_OPERAND (def_stmt, 1);
2367           STRIP_NOPS (rhs);
2368           return get_maxval_strlen (rhs, length, visited, type);
2369         }
2370
2371       case PHI_NODE:
2372         {
2373           /* All the arguments of the PHI node must have the same constant
2374              length.  */
2375           int i;
2376
2377           for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
2378             {
2379               tree arg = PHI_ARG_DEF (def_stmt, i);
2380
2381               /* If this PHI has itself as an argument, we cannot
2382                  determine the string length of this argument.  However,
2383                  if we can find a constant string length for the other
2384                  PHI args then we can still be sure that this is a
2385                  constant string length.  So be optimistic and just
2386                  continue with the next argument.  */
2387               if (arg == PHI_RESULT (def_stmt))
2388                 continue;
2389
2390               if (!get_maxval_strlen (arg, length, visited, type))
2391                 return false;
2392             }
2393
2394           return true;
2395         }
2396
2397       default:
2398         break;
2399     }
2400
2401
2402   return false;
2403 }
2404
2405
2406 /* Fold builtin call FN in statement STMT.  If it cannot be folded into a
2407    constant, return NULL_TREE.  Otherwise, return its constant value.  */
2408
2409 static tree
2410 ccp_fold_builtin (tree stmt, tree fn)
2411 {
2412   tree result, val[3];
2413   tree callee, a;
2414   int arg_mask, i, type;
2415   bitmap visited;
2416   bool ignore;
2417   call_expr_arg_iterator iter;
2418   int nargs;
2419
2420   ignore = TREE_CODE (stmt) != GIMPLE_MODIFY_STMT;
2421
2422   /* First try the generic builtin folder.  If that succeeds, return the
2423      result directly.  */
2424   result = fold_call_expr (fn, ignore);
2425   if (result)
2426     {
2427       if (ignore)
2428         STRIP_NOPS (result);
2429       return result;
2430     }
2431
2432   /* Ignore MD builtins.  */
2433   callee = get_callee_fndecl (fn);
2434   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
2435     return NULL_TREE;
2436
2437   /* If the builtin could not be folded, and it has no argument list,
2438      we're done.  */
2439   nargs = call_expr_nargs (fn);
2440   if (nargs == 0)
2441     return NULL_TREE;
2442
2443   /* Limit the work only for builtins we know how to simplify.  */
2444   switch (DECL_FUNCTION_CODE (callee))
2445     {
2446     case BUILT_IN_STRLEN:
2447     case BUILT_IN_FPUTS:
2448     case BUILT_IN_FPUTS_UNLOCKED:
2449       arg_mask = 1;
2450       type = 0;
2451       break;
2452     case BUILT_IN_STRCPY:
2453     case BUILT_IN_STRNCPY:
2454       arg_mask = 2;
2455       type = 0;
2456       break;
2457     case BUILT_IN_MEMCPY_CHK:
2458     case BUILT_IN_MEMPCPY_CHK:
2459     case BUILT_IN_MEMMOVE_CHK:
2460     case BUILT_IN_MEMSET_CHK:
2461     case BUILT_IN_STRNCPY_CHK:
2462       arg_mask = 4;
2463       type = 2;
2464       break;
2465     case BUILT_IN_STRCPY_CHK:
2466     case BUILT_IN_STPCPY_CHK:
2467       arg_mask = 2;
2468       type = 1;
2469       break;
2470     case BUILT_IN_SNPRINTF_CHK:
2471     case BUILT_IN_VSNPRINTF_CHK:
2472       arg_mask = 2;
2473       type = 2;
2474       break;
2475     default:
2476       return NULL_TREE;
2477     }
2478
2479   /* Try to use the dataflow information gathered by the CCP process.  */
2480   visited = BITMAP_ALLOC (NULL);
2481
2482   memset (val, 0, sizeof (val));
2483   init_call_expr_arg_iterator (fn, &iter);
2484   for (i = 0; arg_mask; i++, arg_mask >>= 1)
2485     {
2486       a = next_call_expr_arg (&iter);
2487       if (arg_mask & 1)
2488         {
2489           bitmap_clear (visited);
2490           if (!get_maxval_strlen (a, &val[i], visited, type))
2491             val[i] = NULL_TREE;
2492         }
2493     }
2494
2495   BITMAP_FREE (visited);
2496
2497   result = NULL_TREE;
2498   switch (DECL_FUNCTION_CODE (callee))
2499     {
2500     case BUILT_IN_STRLEN:
2501       if (val[0])
2502         {
2503           tree new_val = fold_convert (TREE_TYPE (fn), val[0]);
2504
2505           /* If the result is not a valid gimple value, or not a cast
2506              of a valid gimple value, then we can not use the result.  */
2507           if (is_gimple_val (new_val)
2508               || (is_gimple_cast (new_val)
2509                   && is_gimple_val (TREE_OPERAND (new_val, 0))))
2510             return new_val;
2511         }
2512       break;
2513
2514     case BUILT_IN_STRCPY:
2515       if (val[1] && is_gimple_val (val[1]) && nargs == 2)
2516         result = fold_builtin_strcpy (callee,
2517                                       CALL_EXPR_ARG (fn, 0),
2518                                       CALL_EXPR_ARG (fn, 1),
2519                                       val[1]);
2520       break;
2521
2522     case BUILT_IN_STRNCPY:
2523       if (val[1] && is_gimple_val (val[1]) && nargs == 3)
2524         result = fold_builtin_strncpy (callee,
2525                                        CALL_EXPR_ARG (fn, 0),
2526                                        CALL_EXPR_ARG (fn, 1),
2527                                        CALL_EXPR_ARG (fn, 2),
2528                                        val[1]);
2529       break;
2530
2531     case BUILT_IN_FPUTS:
2532       result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
2533                                    CALL_EXPR_ARG (fn, 1),
2534                                    TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 0,
2535                                    val[0]);
2536       break;
2537
2538     case BUILT_IN_FPUTS_UNLOCKED:
2539       result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
2540                                    CALL_EXPR_ARG (fn, 1),
2541                                    TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 1,
2542                                    val[0]);
2543       break;
2544
2545     case BUILT_IN_MEMCPY_CHK:
2546     case BUILT_IN_MEMPCPY_CHK:
2547     case BUILT_IN_MEMMOVE_CHK:
2548     case BUILT_IN_MEMSET_CHK:
2549       if (val[2] && is_gimple_val (val[2]))
2550         result = fold_builtin_memory_chk (callee,
2551                                           CALL_EXPR_ARG (fn, 0),
2552                                           CALL_EXPR_ARG (fn, 1),
2553                                           CALL_EXPR_ARG (fn, 2),
2554                                           CALL_EXPR_ARG (fn, 3),
2555                                           val[2], ignore,
2556                                           DECL_FUNCTION_CODE (callee));
2557       break;
2558
2559     case BUILT_IN_STRCPY_CHK:
2560     case BUILT_IN_STPCPY_CHK:
2561       if (val[1] && is_gimple_val (val[1]))
2562         result = fold_builtin_stxcpy_chk (callee,
2563                                           CALL_EXPR_ARG (fn, 0),
2564                                           CALL_EXPR_ARG (fn, 1),
2565                                           CALL_EXPR_ARG (fn, 2),
2566                                           val[1], ignore,
2567                                           DECL_FUNCTION_CODE (callee));
2568       break;
2569
2570     case BUILT_IN_STRNCPY_CHK:
2571       if (val[2] && is_gimple_val (val[2]))
2572         result = fold_builtin_strncpy_chk (CALL_EXPR_ARG (fn, 0),
2573                                            CALL_EXPR_ARG (fn, 1),
2574                                            CALL_EXPR_ARG (fn, 2),
2575                                            CALL_EXPR_ARG (fn, 3),
2576                                            val[2]);
2577       break;
2578
2579     case BUILT_IN_SNPRINTF_CHK:
2580     case BUILT_IN_VSNPRINTF_CHK:
2581       if (val[1] && is_gimple_val (val[1]))
2582         result = fold_builtin_snprintf_chk (fn, val[1],
2583                                             DECL_FUNCTION_CODE (callee));
2584       break;
2585
2586     default:
2587       gcc_unreachable ();
2588     }
2589
2590   if (result && ignore)
2591     result = fold_ignored_result (result);
2592   return result;
2593 }
2594
2595
2596 /* Fold the statement pointed to by STMT_P.  In some cases, this function may
2597    replace the whole statement with a new one.  Returns true iff folding
2598    makes any changes.  */
2599
2600 bool
2601 fold_stmt (tree *stmt_p)
2602 {
2603   tree rhs, result, stmt;
2604   struct fold_stmt_r_data fold_stmt_r_data;
2605   bool changed = false;
2606   bool inside_addr_expr = false;
2607
2608   stmt = *stmt_p;
2609
2610   fold_stmt_r_data.stmt = stmt;
2611   fold_stmt_r_data.changed_p = &changed;
2612   fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
2613
2614   /* If we replaced constants and the statement makes pointer dereferences,
2615      then we may need to fold instances of *&VAR into VAR, etc.  */
2616   if (walk_tree (stmt_p, fold_stmt_r, &fold_stmt_r_data, NULL))
2617     {
2618       *stmt_p = build_call_expr (implicit_built_in_decls[BUILT_IN_TRAP], 0);
2619       return true;
2620     }
2621
2622   rhs = get_rhs (stmt);
2623   if (!rhs)
2624     return changed;
2625   result = NULL_TREE;
2626
2627   if (TREE_CODE (rhs) == CALL_EXPR)
2628     {
2629       tree callee;
2630
2631       /* Check for builtins that CCP can handle using information not
2632          available in the generic fold routines.  */
2633       callee = get_callee_fndecl (rhs);
2634       if (callee && DECL_BUILT_IN (callee))
2635         result = ccp_fold_builtin (stmt, rhs);
2636       else
2637         {
2638           /* Check for resolvable OBJ_TYPE_REF.  The only sorts we can resolve
2639              here are when we've propagated the address of a decl into the
2640              object slot.  */
2641           /* ??? Should perhaps do this in fold proper.  However, doing it
2642              there requires that we create a new CALL_EXPR, and that requires
2643              copying EH region info to the new node.  Easier to just do it
2644              here where we can just smash the call operand. Also
2645              CALL_EXPR_RETURN_SLOT_OPT needs to be handled correctly and
2646              copied, fold_call_expr does not have not information. */
2647           callee = CALL_EXPR_FN (rhs);
2648           if (TREE_CODE (callee) == OBJ_TYPE_REF
2649               && lang_hooks.fold_obj_type_ref
2650               && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
2651               && DECL_P (TREE_OPERAND
2652                          (OBJ_TYPE_REF_OBJECT (callee), 0)))
2653             {
2654               tree t;
2655
2656               /* ??? Caution: Broken ADDR_EXPR semantics means that
2657                  looking at the type of the operand of the addr_expr
2658                  can yield an array type.  See silly exception in
2659                  check_pointer_types_r.  */
2660
2661               t = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (callee)));
2662               t = lang_hooks.fold_obj_type_ref (callee, t);
2663               if (t)
2664                 {
2665                   CALL_EXPR_FN (rhs) = t;
2666                   changed = true;
2667                 }
2668             }
2669         }
2670     }
2671   else if (TREE_CODE (rhs) == COND_EXPR)
2672     {
2673       tree temp = fold (COND_EXPR_COND (rhs));
2674       if (temp != COND_EXPR_COND (rhs))
2675         result = fold_build3 (COND_EXPR, TREE_TYPE (rhs), temp,
2676                               COND_EXPR_THEN (rhs), COND_EXPR_ELSE (rhs));
2677     }
2678
2679   /* If we couldn't fold the RHS, hand over to the generic fold routines.  */
2680   if (result == NULL_TREE)
2681     result = fold (rhs);
2682
2683   /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR that
2684      may have been added by fold, and "useless" type conversions that might
2685      now be apparent due to propagation.  */
2686   STRIP_USELESS_TYPE_CONVERSION (result);
2687
2688   if (result != rhs)
2689     changed |= set_rhs (stmt_p, result);
2690
2691   return changed;
2692 }
2693
2694 /* Perform the minimal folding on statement STMT.  Only operations like
2695    *&x created by constant propagation are handled.  The statement cannot
2696    be replaced with a new one.  */
2697
2698 bool
2699 fold_stmt_inplace (tree stmt)
2700 {
2701   tree old_stmt = stmt, rhs, new_rhs;
2702   struct fold_stmt_r_data fold_stmt_r_data;
2703   bool changed = false;
2704   bool inside_addr_expr = false;
2705
2706   fold_stmt_r_data.stmt = stmt;
2707   fold_stmt_r_data.changed_p = &changed;
2708   fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
2709
2710   walk_tree (&stmt, fold_stmt_r, &fold_stmt_r_data, NULL);
2711   gcc_assert (stmt == old_stmt);
2712
2713   rhs = get_rhs (stmt);
2714   if (!rhs || rhs == stmt)
2715     return changed;
2716
2717   new_rhs = fold (rhs);
2718   STRIP_USELESS_TYPE_CONVERSION (new_rhs);
2719   if (new_rhs == rhs)
2720     return changed;
2721
2722   changed |= set_rhs (&stmt, new_rhs);
2723   gcc_assert (stmt == old_stmt);
2724
2725   return changed;
2726 }
2727 \f
2728 /* Try to optimize out __builtin_stack_restore.  Optimize it out
2729    if there is another __builtin_stack_restore in the same basic
2730    block and no calls or ASM_EXPRs are in between, or if this block's
2731    only outgoing edge is to EXIT_BLOCK and there are no calls or
2732    ASM_EXPRs after this __builtin_stack_restore.  */
2733
2734 static tree
2735 optimize_stack_restore (basic_block bb, tree call, block_stmt_iterator i)
2736 {
2737   tree stack_save, stmt, callee;
2738
2739   if (TREE_CODE (call) != CALL_EXPR
2740       || call_expr_nargs (call) != 1
2741       || TREE_CODE (CALL_EXPR_ARG (call, 0)) != SSA_NAME
2742       || !POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (call, 0))))
2743     return NULL_TREE;
2744
2745   for (bsi_next (&i); !bsi_end_p (i); bsi_next (&i))
2746     {
2747       tree call;
2748
2749       stmt = bsi_stmt (i);
2750       if (TREE_CODE (stmt) == ASM_EXPR)
2751         return NULL_TREE;
2752       call = get_call_expr_in (stmt);
2753       if (call == NULL)
2754         continue;
2755
2756       callee = get_callee_fndecl (call);
2757       if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
2758         return NULL_TREE;
2759
2760       if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
2761         break;
2762     }
2763
2764   if (bsi_end_p (i)
2765       && (! single_succ_p (bb)
2766           || single_succ_edge (bb)->dest != EXIT_BLOCK_PTR))
2767     return NULL_TREE;
2768
2769   stack_save = SSA_NAME_DEF_STMT (CALL_EXPR_ARG (call, 0));
2770   if (TREE_CODE (stack_save) != GIMPLE_MODIFY_STMT
2771       || GIMPLE_STMT_OPERAND (stack_save, 0) != CALL_EXPR_ARG (call, 0)
2772       || TREE_CODE (GIMPLE_STMT_OPERAND (stack_save, 1)) != CALL_EXPR
2773       || tree_could_throw_p (stack_save)
2774       || !has_single_use (CALL_EXPR_ARG (call, 0)))
2775     return NULL_TREE;
2776
2777   callee = get_callee_fndecl (GIMPLE_STMT_OPERAND (stack_save, 1));
2778   if (!callee
2779       || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2780       || DECL_FUNCTION_CODE (callee) != BUILT_IN_STACK_SAVE
2781       || call_expr_nargs (GIMPLE_STMT_OPERAND (stack_save, 1)) != 0)
2782     return NULL_TREE;
2783
2784   stmt = stack_save;
2785   push_stmt_changes (&stmt);
2786   if (!set_rhs (&stmt,
2787                 build_int_cst (TREE_TYPE (CALL_EXPR_ARG (call, 0)), 0)))
2788     {
2789       discard_stmt_changes (&stmt);
2790       return NULL_TREE;
2791     }
2792   gcc_assert (stmt == stack_save);
2793   pop_stmt_changes (&stmt);
2794
2795   return integer_zero_node;
2796 }
2797 \f
2798 /* If va_list type is a simple pointer and nothing special is needed,
2799    optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
2800    __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
2801    pointer assignment.  */
2802
2803 static tree
2804 optimize_stdarg_builtin (tree call)
2805 {
2806   tree callee, lhs, rhs;
2807   bool va_list_simple_ptr;
2808
2809   if (TREE_CODE (call) != CALL_EXPR)
2810     return NULL_TREE;
2811
2812   va_list_simple_ptr = POINTER_TYPE_P (va_list_type_node)
2813                        && (TREE_TYPE (va_list_type_node) == void_type_node
2814                            || TREE_TYPE (va_list_type_node) == char_type_node);
2815
2816   callee = get_callee_fndecl (call);
2817   switch (DECL_FUNCTION_CODE (callee))
2818     {
2819     case BUILT_IN_VA_START:
2820       if (!va_list_simple_ptr
2821           || targetm.expand_builtin_va_start != NULL
2822           || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
2823         return NULL_TREE;
2824
2825       if (call_expr_nargs (call) != 2)
2826         return NULL_TREE;
2827
2828       lhs = CALL_EXPR_ARG (call, 0);
2829       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2830           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2831              != TYPE_MAIN_VARIANT (va_list_type_node))
2832         return NULL_TREE;
2833
2834       lhs = build_fold_indirect_ref (lhs);
2835       rhs = build_call_expr (built_in_decls[BUILT_IN_NEXT_ARG],
2836                              1, integer_zero_node);
2837       rhs = fold_convert (TREE_TYPE (lhs), rhs);
2838       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2839
2840     case BUILT_IN_VA_COPY:
2841       if (!va_list_simple_ptr)
2842         return NULL_TREE;
2843
2844       if (call_expr_nargs (call) != 2)
2845         return NULL_TREE;
2846
2847       lhs = CALL_EXPR_ARG (call, 0);
2848       if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2849           || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
2850              != TYPE_MAIN_VARIANT (va_list_type_node))
2851         return NULL_TREE;
2852
2853       lhs = build_fold_indirect_ref (lhs);
2854       rhs = CALL_EXPR_ARG (call, 1);
2855       if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
2856           != TYPE_MAIN_VARIANT (va_list_type_node))
2857         return NULL_TREE;
2858
2859       rhs = fold_convert (TREE_TYPE (lhs), rhs);
2860       return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2861
2862     case BUILT_IN_VA_END:
2863       return integer_zero_node;
2864
2865     default:
2866       gcc_unreachable ();
2867     }
2868 }
2869 \f
2870 /* Convert EXPR into a GIMPLE value suitable for substitution on the
2871    RHS of an assignment.  Insert the necessary statements before
2872    iterator *SI_P. 
2873    When IGNORE is set, don't worry about the return value.  */
2874
2875 static tree
2876 convert_to_gimple_builtin (block_stmt_iterator *si_p, tree expr, bool ignore)
2877 {
2878   tree_stmt_iterator ti;
2879   tree stmt = bsi_stmt (*si_p);
2880   tree tmp, stmts = NULL;
2881
2882   push_gimplify_context ();
2883   if (ignore)
2884     {
2885       tmp = build_empty_stmt ();
2886       gimplify_and_add (expr, &stmts);
2887     }
2888   else
2889     tmp = get_initialized_tmp_var (expr, &stmts, NULL);
2890   pop_gimplify_context (NULL);
2891
2892   if (EXPR_HAS_LOCATION (stmt))
2893     annotate_all_with_locus (&stmts, EXPR_LOCATION (stmt));
2894
2895   /* The replacement can expose previously unreferenced variables.  */
2896   for (ti = tsi_start (stmts); !tsi_end_p (ti); tsi_next (&ti))
2897     {
2898       tree new_stmt = tsi_stmt (ti);
2899       find_new_referenced_vars (tsi_stmt_ptr (ti));
2900       bsi_insert_before (si_p, new_stmt, BSI_NEW_STMT);
2901       mark_symbols_for_renaming (new_stmt);
2902       bsi_next (si_p);
2903     }
2904
2905   return tmp;
2906 }
2907
2908
2909 /* A simple pass that attempts to fold all builtin functions.  This pass
2910    is run after we've propagated as many constants as we can.  */
2911
2912 static unsigned int
2913 execute_fold_all_builtins (void)
2914 {
2915   bool cfg_changed = false;
2916   basic_block bb;
2917   unsigned int todoflags = 0;
2918   
2919   FOR_EACH_BB (bb)
2920     {
2921       block_stmt_iterator i;
2922       for (i = bsi_start (bb); !bsi_end_p (i); )
2923         {
2924           tree *stmtp = bsi_stmt_ptr (i);
2925           tree old_stmt = *stmtp;
2926           tree call = get_rhs (*stmtp);
2927           tree callee, result;
2928           enum built_in_function fcode;
2929
2930           if (!call || TREE_CODE (call) != CALL_EXPR)
2931             {
2932               bsi_next (&i);
2933               continue;
2934             }
2935           callee = get_callee_fndecl (call);
2936           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
2937             {
2938               bsi_next (&i);
2939               continue;
2940             }
2941           fcode = DECL_FUNCTION_CODE (callee);
2942
2943           result = ccp_fold_builtin (*stmtp, call);
2944           if (!result)
2945             switch (DECL_FUNCTION_CODE (callee))
2946               {
2947               case BUILT_IN_CONSTANT_P:
2948                 /* Resolve __builtin_constant_p.  If it hasn't been
2949                    folded to integer_one_node by now, it's fairly
2950                    certain that the value simply isn't constant.  */
2951                 result = integer_zero_node;
2952                 break;
2953
2954               case BUILT_IN_STACK_RESTORE:
2955                 result = optimize_stack_restore (bb, *stmtp, i);
2956                 if (result)
2957                   break;
2958                 bsi_next (&i);
2959                 continue;
2960
2961               case BUILT_IN_VA_START:
2962               case BUILT_IN_VA_END:
2963               case BUILT_IN_VA_COPY:
2964                 /* These shouldn't be folded before pass_stdarg.  */
2965                 result = optimize_stdarg_builtin (*stmtp);
2966                 if (result)
2967                   break;
2968                 /* FALLTHRU */
2969
2970               default:
2971                 bsi_next (&i);
2972                 continue;
2973               }
2974
2975           if (dump_file && (dump_flags & TDF_DETAILS))
2976             {
2977               fprintf (dump_file, "Simplified\n  ");
2978               print_generic_stmt (dump_file, *stmtp, dump_flags);
2979             }
2980
2981           push_stmt_changes (stmtp);
2982
2983           if (!set_rhs (stmtp, result))
2984             {
2985               result = convert_to_gimple_builtin (&i, result,
2986                                                   TREE_CODE (old_stmt)
2987                                                   != GIMPLE_MODIFY_STMT);
2988               if (result)
2989                 {
2990                   bool ok = set_rhs (stmtp, result);
2991                   gcc_assert (ok);
2992                   todoflags |= TODO_rebuild_alias;
2993                 }
2994             }
2995
2996           pop_stmt_changes (stmtp);
2997
2998           if (maybe_clean_or_replace_eh_stmt (old_stmt, *stmtp)
2999               && tree_purge_dead_eh_edges (bb))
3000             cfg_changed = true;
3001
3002           if (dump_file && (dump_flags & TDF_DETAILS))
3003             {
3004               fprintf (dump_file, "to\n  ");
3005               print_generic_stmt (dump_file, *stmtp, dump_flags);
3006               fprintf (dump_file, "\n");
3007             }
3008
3009           /* Retry the same statement if it changed into another
3010              builtin, there might be new opportunities now.  */
3011           call = get_rhs (*stmtp);
3012           if (!call || TREE_CODE (call) != CALL_EXPR)
3013             {
3014               bsi_next (&i);
3015               continue;
3016             }
3017           callee = get_callee_fndecl (call);
3018           if (!callee
3019               || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
3020               || DECL_FUNCTION_CODE (callee) == fcode)
3021             bsi_next (&i);
3022         }
3023     }
3024   
3025   /* Delete unreachable blocks.  */
3026   if (cfg_changed)
3027     todoflags |= TODO_cleanup_cfg;
3028   
3029   return todoflags;
3030 }
3031
3032
3033 struct gimple_opt_pass pass_fold_builtins = 
3034 {
3035  {
3036   GIMPLE_PASS,
3037   "fab",                                /* name */
3038   NULL,                                 /* gate */
3039   execute_fold_all_builtins,            /* execute */
3040   NULL,                                 /* sub */
3041   NULL,                                 /* next */
3042   0,                                    /* static_pass_number */
3043   0,                                    /* tv_id */
3044   PROP_cfg | PROP_ssa,                  /* properties_required */
3045   0,                                    /* properties_provided */
3046   0,                                    /* properties_destroyed */
3047   0,                                    /* todo_flags_start */
3048   TODO_dump_func
3049     | TODO_verify_ssa
3050     | TODO_update_ssa                   /* todo_flags_finish */
3051  }
3052 };