OSDN Git Service

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