OSDN Git Service

Fix aliasing bug that also caused memory usage problems.
[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 Free Software Foundation, Inc.
3    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
4    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7    
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12    
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17    
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* Conditional constant propagation.
24
25    References:
26
27      Constant propagation with conditional branches,
28      Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
29
30      Building an Optimizing Compiler,
31      Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
32
33      Advanced Compiler Design and Implementation,
34      Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6  */
35
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "tree.h"
41 #include "flags.h"
42 #include "rtl.h"
43 #include "tm_p.h"
44 #include "ggc.h"
45 #include "basic-block.h"
46 #include "output.h"
47 #include "errors.h"
48 #include "expr.h"
49 #include "function.h"
50 #include "diagnostic.h"
51 #include "timevar.h"
52 #include "tree-dump.h"
53 #include "tree-flow.h"
54 #include "tree-pass.h"
55 #include "tree-ssa-propagate.h"
56 #include "langhooks.h"
57
58
59 /* Possible lattice values.  */
60 typedef enum
61 {
62   UNINITIALIZED = 0,
63   UNDEFINED,
64   UNKNOWN_VAL,
65   CONSTANT,
66   VARYING
67 } latticevalue;
68
69 /* Main structure for CCP.  Contains the lattice value and, if it's a
70     constant, the constant value.  */
71 typedef struct
72 {
73   latticevalue lattice_val;
74   tree const_val;
75 } value;
76
77 /* This is used to track the current value of each variable.  */
78 static value *value_vector;
79
80
81 /* Dump lattice value VAL to file OUTF prefixed by PREFIX.  */
82
83 static void
84 dump_lattice_value (FILE *outf, const char *prefix, value val)
85 {
86   switch (val.lattice_val)
87     {
88     case UNDEFINED:
89       fprintf (outf, "%sUNDEFINED", prefix);
90       break;
91     case VARYING:
92       fprintf (outf, "%sVARYING", prefix);
93       break;
94     case UNKNOWN_VAL:
95       fprintf (outf, "%sUNKNOWN_VAL", prefix);
96       break;
97     case CONSTANT:
98       fprintf (outf, "%sCONSTANT ", prefix);
99       print_generic_expr (outf, val.const_val, dump_flags);
100       break;
101     default:
102       abort ();
103     }
104 }
105
106
107 /* Return a default value for variable VAR using the following rules:
108
109    1- Function arguments are considered VARYING.
110    
111    2- Global and static variables that are declared constant are
112       considered CONSTANT.
113
114    3- Any other virtually defined variable is considered UNKNOWN_VAL.
115
116    4- Any other value is considered UNDEFINED.  This is useful when
117       considering PHI nodes.  PHI arguments that are undefined do not
118       change the constant value of the PHI node, which allows for more
119       constants to be propagated.  */
120
121 static value
122 get_default_value (tree var)
123 {
124   value val;
125   tree sym;
126
127   if (TREE_CODE (var) == SSA_NAME)
128     sym = SSA_NAME_VAR (var);
129   else
130     {
131 #ifdef ENABLE_CHECKING
132       if (!DECL_P (var))
133         abort ();
134 #endif
135       sym = var;
136     }
137
138   val.lattice_val = UNDEFINED;
139   val.const_val = NULL_TREE;
140
141   if (TREE_CODE (sym) == PARM_DECL || TREE_THIS_VOLATILE (sym))
142     {
143       /* Function arguments and volatile variables are considered VARYING.  */
144       val.lattice_val = VARYING;
145     }
146   else if (TREE_STATIC (sym))
147     {
148       /* Globals and static variables are considered UNKNOWN_VAL,
149          unless they are declared 'const'.  */
150       if (TREE_READONLY (sym)
151           && DECL_INITIAL (sym)
152           && is_gimple_min_invariant (DECL_INITIAL (sym)))
153         {
154           val.lattice_val = CONSTANT;
155           val.const_val = DECL_INITIAL (sym);
156         }
157       else
158         {
159           val.const_val = NULL_TREE;
160           val.lattice_val = UNKNOWN_VAL;
161         }
162     }
163   else if (!is_gimple_reg (sym))
164     {
165       val.const_val = NULL_TREE;
166       val.lattice_val = UNKNOWN_VAL;
167     }
168   else
169     {
170       enum tree_code code;
171       tree stmt = SSA_NAME_DEF_STMT (var);
172
173       if (!IS_EMPTY_STMT (stmt))
174         {
175           code = TREE_CODE (stmt);
176           if (code != MODIFY_EXPR && code != PHI_NODE)
177             val.lattice_val = VARYING;
178         }
179     }
180
181   return val;
182 }
183
184
185 /* Get the constant value associated with variable VAR.  */
186
187 static value *
188 get_value (tree var)
189 {
190   value *val;
191
192 #if defined ENABLE_CHECKING
193   if (TREE_CODE (var) != SSA_NAME)
194     abort ();
195 #endif
196
197   val = &value_vector[SSA_NAME_VERSION (var)];
198   if (val->lattice_val == UNINITIALIZED)
199     *val = get_default_value (var);
200
201   return val;
202 }
203
204
205 /* Set the lattice value for variable VAR to VAL.  Return true if VAL
206    is different from VAR's previous value.  */
207
208 static bool
209 set_lattice_value (tree var, value val)
210 {
211   value *old = get_value (var);
212
213 #ifdef ENABLE_CHECKING
214   if (val.lattice_val == UNDEFINED)
215     {
216       /* CONSTANT->UNDEFINED is never a valid state transition.  */
217       if (old->lattice_val == CONSTANT)
218         abort ();
219         
220       /* UNKNOWN_VAL->UNDEFINED is never a valid state transition.  */
221       if (old->lattice_val == UNKNOWN_VAL)
222         abort ();
223
224       /* VARYING->UNDEFINED is generally not a valid state transition,
225          except for values which are initialized to VARYING.  */
226       if (old->lattice_val == VARYING
227           && get_default_value (var).lattice_val != VARYING)
228         abort ();
229     }
230   else if (val.lattice_val == CONSTANT)
231     {
232       /* VARYING -> CONSTANT is an invalid state transition, except
233          for objects which start off in a VARYING state.  */
234       if (old->lattice_val == VARYING
235           && get_default_value (var).lattice_val != VARYING)
236         abort ();
237     }
238 #endif
239
240   /* If the constant for VAR has changed, then this VAR is really varying.  */
241   if (old->lattice_val == CONSTANT
242       && val.lattice_val == CONSTANT
243       && !simple_cst_equal (old->const_val, val.const_val))
244     {
245       val.lattice_val = VARYING;
246       val.const_val = NULL_TREE;
247     }
248
249   if (old->lattice_val != val.lattice_val)
250     {
251       if (dump_file && (dump_flags & TDF_DETAILS))
252         {
253           dump_lattice_value (dump_file, "Lattice value changed to ", val);
254           fprintf (dump_file, ".  Adding definition to SSA edges.\n");
255         }
256
257       *old = val;
258       return true;
259     }
260
261   return false;
262 }
263
264
265 /* Set the lattice value for the variable VAR to VARYING.  */
266
267 static void
268 def_to_varying (tree var)
269 {
270   value val;
271   val.lattice_val = VARYING;
272   val.const_val = NULL_TREE;
273   set_lattice_value (var, val);
274 }
275
276
277 /* Return the likely latticevalue for STMT.
278
279    If STMT has no operands, then return CONSTANT.
280
281    Else if any operands of STMT are undefined, then return UNDEFINED.
282
283    Else if any operands of STMT are constants, then return CONSTANT.
284
285    Else return VARYING.  */
286
287 static latticevalue
288 likely_value (tree stmt)
289 {
290   vuse_optype vuses;
291   int found_constant = 0;
292   stmt_ann_t ann;
293   tree use;
294   ssa_op_iter iter;
295
296   /* If the statement makes aliased loads or has volatile operands, it
297      won't fold to a constant value.  */
298   ann = stmt_ann (stmt);
299   if (ann->makes_aliased_loads || ann->has_volatile_ops)
300     return VARYING;
301
302   /* A CALL_EXPR is assumed to be varying.  This may be overly conservative,
303      in the presence of const and pure calls.  */
304   if (get_call_expr_in (stmt) != NULL_TREE)
305     return VARYING;
306
307   get_stmt_operands (stmt);
308
309   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
310     {
311       value *val = get_value (use);
312
313       if (val->lattice_val == UNDEFINED)
314         return UNDEFINED;
315
316       if (val->lattice_val == CONSTANT)
317         found_constant = 1;
318     }
319     
320   vuses = VUSE_OPS (ann);
321   
322   if (NUM_VUSES (vuses))
323     {
324       tree vuse = VUSE_OP (vuses, 0);
325       value *val = get_value (vuse);
326       
327       if (val->lattice_val == UNKNOWN_VAL)
328         return UNKNOWN_VAL;
329         
330 #ifdef ENABLE_CHECKING
331   /* There should be no VUSE operands that are UNDEFINED. */
332   if (val->lattice_val == UNDEFINED)
333     abort ();
334 #endif
335         
336       if (val->lattice_val == CONSTANT)
337         found_constant = 1;
338     }
339
340   return ((found_constant || (!USE_OPS (ann) && !vuses)) ? CONSTANT : VARYING);
341 }
342
343
344 /* Function indicating whether we ought to include information for VAR
345    when calculating immediate uses.  */
346
347 static bool
348 need_imm_uses_for (tree var)
349 {
350   return get_value (var)->lattice_val != VARYING;
351 }
352
353
354 /* Initialize local data structures for CCP.  */
355
356 static void
357 ccp_initialize (void)
358 {
359   basic_block bb;
360   sbitmap is_may_def;
361
362   value_vector = (value *) xmalloc (num_ssa_names * sizeof (value));
363   memset (value_vector, 0, num_ssa_names * sizeof (value));
364
365   /* Set of SSA_NAMEs that are defined by a V_MAY_DEF.  */
366   is_may_def = sbitmap_alloc (num_ssa_names);
367   sbitmap_zero (is_may_def);
368
369   /* Initialize simulation flags for PHI nodes and statements.  */
370   FOR_EACH_BB (bb)
371     {
372       block_stmt_iterator i;
373
374       /* Mark all V_MAY_DEF operands VARYING.  */
375       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
376         {
377           bool is_varying = false;
378           tree stmt = bsi_stmt (i);
379           ssa_op_iter iter;
380           tree def;
381
382           get_stmt_operands (stmt);
383
384           /* Get the default value for each DEF and V_MUST_DEF.  */
385           FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, 
386                                      (SSA_OP_DEF | SSA_OP_VMUSTDEF))
387             {
388               if (get_value (def)->lattice_val == VARYING)
389                 is_varying = true;
390             }
391
392           /* Mark all V_MAY_DEF operands VARYING.  */
393           FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_VMAYDEF)
394             {
395               get_value (def)->lattice_val = VARYING;
396               SET_BIT (is_may_def, SSA_NAME_VERSION (def));
397             }
398
399           /* Statements other than MODIFY_EXPR, COND_EXPR and
400              SWITCH_EXPR are not interesting for constant propagation.
401              Mark them VARYING.  */
402           if (TREE_CODE (stmt) != MODIFY_EXPR
403               && TREE_CODE (stmt) != COND_EXPR
404               && TREE_CODE (stmt) != SWITCH_EXPR)
405             is_varying = true;
406
407           DONT_SIMULATE_AGAIN (stmt) = is_varying;
408         }
409     }
410
411   /* Now process PHI nodes.  */
412   FOR_EACH_BB (bb)
413     {
414       tree phi, var;
415       int x;
416
417       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
418         {
419           value *val = get_value (PHI_RESULT (phi));
420
421           for (x = 0; x < PHI_NUM_ARGS (phi); x++)
422             {
423               var = PHI_ARG_DEF (phi, x);
424
425               /* If one argument has a V_MAY_DEF, the result is
426                  VARYING.  */
427               if (TREE_CODE (var) == SSA_NAME)
428                 {
429                   if (TEST_BIT (is_may_def, SSA_NAME_VERSION (var)))
430                     {
431                       val->lattice_val = VARYING;
432                       SET_BIT (is_may_def, SSA_NAME_VERSION (PHI_RESULT (phi)));
433                       break;
434                     }
435                 }
436             }
437
438           DONT_SIMULATE_AGAIN (phi) = (val->lattice_val == VARYING);
439         }
440     }
441
442   sbitmap_free (is_may_def);
443
444   /* Compute immediate uses for variables we care about.  */
445   compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, need_imm_uses_for);
446 }
447
448
449 /* Replace USE references in statement STMT with their immediate reaching
450    definition.  Return true if at least one reference was replaced.  If
451    REPLACED_ADDRESSES_P is given, it will be set to true if an address
452    constant was replaced.  */
453
454 static bool
455 replace_uses_in (tree stmt, bool *replaced_addresses_p)
456 {
457   bool replaced = false;
458   use_operand_p use;
459   ssa_op_iter iter;
460
461   if (replaced_addresses_p)
462     *replaced_addresses_p = false;
463
464   get_stmt_operands (stmt);
465
466   FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
467     {
468       value *val = get_value (USE_FROM_PTR (use));
469
470       if (val->lattice_val == CONSTANT)
471         {
472           SET_USE (use, val->const_val);
473           replaced = true;
474           if (POINTER_TYPE_P (TREE_TYPE (USE_FROM_PTR (use))) 
475               && replaced_addresses_p)
476             *replaced_addresses_p = true;
477         }
478     }
479
480   return replaced;
481 }
482
483
484 /* Replace the VUSE references in statement STMT with its immediate reaching
485    definition.  Return true if the reference was replaced.  If
486    REPLACED_ADDRESSES_P is given, it will be set to true if an address
487    constant was replaced.  */
488
489 static bool
490 replace_vuse_in (tree stmt, bool *replaced_addresses_p)
491 {
492   bool replaced = false;
493   vuse_optype vuses;
494   use_operand_p vuse;
495   value *val;
496
497   if (replaced_addresses_p)
498     *replaced_addresses_p = false;
499
500   get_stmt_operands (stmt);
501
502   vuses = STMT_VUSE_OPS (stmt);
503
504   if (NUM_VUSES (vuses) != 1)
505     return false;
506
507   vuse = VUSE_OP_PTR (vuses, 0);
508   val = get_value (USE_FROM_PTR (vuse));
509
510   if (val->lattice_val == CONSTANT
511       && TREE_CODE (stmt) == MODIFY_EXPR
512       && DECL_P (TREE_OPERAND (stmt, 1))
513       && TREE_OPERAND (stmt, 1) == SSA_NAME_VAR (USE_FROM_PTR (vuse)))
514     {
515       TREE_OPERAND (stmt, 1) = val->const_val;
516       replaced = true;
517       if (POINTER_TYPE_P (TREE_TYPE (USE_FROM_PTR (vuse))) 
518           && replaced_addresses_p)
519         *replaced_addresses_p = true;
520     }
521
522   return replaced;
523 }
524
525
526 /* Perform final substitution and folding.  After this pass the program
527    should still be in SSA form.  */
528
529 static void
530 substitute_and_fold (void)
531 {
532   basic_block bb;
533
534   if (dump_file && (dump_flags & TDF_DETAILS))
535     fprintf (dump_file,
536              "\nSubstituing constants and folding statements\n\n");
537
538   /* Substitute constants in every statement of every basic block.  */
539   FOR_EACH_BB (bb)
540     {
541       block_stmt_iterator i;
542       tree phi;
543
544       /* Propagate our known constants into PHI nodes.  */
545       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
546         {
547           int i;
548
549           for (i = 0; i < PHI_NUM_ARGS (phi); i++)
550             {
551               value *new_val;
552               use_operand_p orig_p = PHI_ARG_DEF_PTR (phi, i);
553               tree orig = USE_FROM_PTR (orig_p);
554
555               if (! SSA_VAR_P (orig))
556                 break;
557
558               new_val = get_value (orig);
559               if (new_val->lattice_val == CONSTANT
560                   && may_propagate_copy (orig, new_val->const_val))
561                 SET_USE (orig_p, new_val->const_val);
562             }
563         }
564
565       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
566         {
567           bool replaced_address;
568           tree stmt = bsi_stmt (i);
569
570           /* Skip statements that have been folded already.  */
571           if (stmt_modified_p (stmt) || !is_exec_stmt (stmt))
572             continue;
573
574           /* Replace the statement with its folded version and mark it
575              folded.  */
576           if (dump_file && (dump_flags & TDF_DETAILS))
577             {
578               fprintf (dump_file, "Line %d: replaced ", get_lineno (stmt));
579               print_generic_stmt (dump_file, stmt, TDF_SLIM);
580             }
581
582           if (replace_uses_in (stmt, &replaced_address)
583               || replace_vuse_in (stmt, &replaced_address))
584             {
585               bool changed = fold_stmt (bsi_stmt_ptr (i));
586               stmt = bsi_stmt(i);
587               /* If we folded a builtin function, we'll likely
588                  need to rename VDEFs.  */
589               if (replaced_address || changed)
590                 {
591                   mark_new_vars_to_rename (stmt, vars_to_rename);
592                   if (maybe_clean_eh_stmt (stmt))
593                     tree_purge_dead_eh_edges (bb);
594                 }
595               else
596                 modify_stmt (stmt);
597             }
598
599           if (dump_file && (dump_flags & TDF_DETAILS))
600             {
601               fprintf (dump_file, " with ");
602               print_generic_stmt (dump_file, stmt, TDF_SLIM);
603               fprintf (dump_file, "\n");
604             }
605         }
606     }
607 }
608
609
610 /* Free allocated storage.  */
611
612 static void
613 ccp_finalize (void)
614 {
615   /* Perform substitutions based on the known constant values.  */
616   substitute_and_fold ();
617
618   /* Now cleanup any unreachable code.  */
619   cleanup_tree_cfg ();
620
621   free (value_vector);
622 }
623
624
625
626 /* Compute the meet operator between VAL1 and VAL2:
627
628                 any  M UNDEFINED     = any
629                 any  M VARYING       = VARYING
630                 any  M UNKNOWN_VAL   = UNKNOWN_VAL
631                 Ci   M Cj            = Ci       if (i == j)
632                 Ci   M Cj            = VARYING  if (i != j)  */
633 static value
634 ccp_lattice_meet (value val1, value val2)
635 {
636   value result;
637
638   /* any M UNDEFINED = any.  */
639   if (val1.lattice_val == UNDEFINED)
640     return val2;
641   else if (val2.lattice_val == UNDEFINED)
642     return val1;
643
644   /* any M VARYING = VARYING.  */
645   if (val1.lattice_val == VARYING || val2.lattice_val == VARYING)
646     {
647       result.lattice_val = VARYING;
648       result.const_val = NULL_TREE;
649       return result;
650     }
651
652   /* any M UNKNOWN_VAL = UNKNOWN_VAL.  */
653   if (val1.lattice_val == UNKNOWN_VAL 
654       || val2.lattice_val == UNKNOWN_VAL)
655     {
656       result.lattice_val = UNKNOWN_VAL;
657       result.const_val = NULL_TREE;
658       return result;
659     }
660
661   /* Ci M Cj = Ci       if (i == j)
662      Ci M Cj = VARYING  if (i != j)  */
663   if (simple_cst_equal (val1.const_val, val2.const_val) == 1)
664     {
665       result.lattice_val = CONSTANT;
666       result.const_val = val1.const_val;
667     }
668   else
669     {
670       result.lattice_val = VARYING;
671       result.const_val = NULL_TREE;
672     }
673
674   return result;
675 }
676
677
678 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
679    lattice values to determine PHI_NODE's lattice value.  The value of a
680    PHI node is determined calling ccp_lattice_meet() with all the arguments
681    of the PHI node that are incoming via executable edges.  */
682
683 static enum ssa_prop_result
684 ccp_visit_phi_node (tree phi)
685 {
686   value new_val, *old_val;
687   int i;
688
689   if (dump_file && (dump_flags & TDF_DETAILS))
690     {
691       fprintf (dump_file, "\nVisiting PHI node: ");
692       print_generic_expr (dump_file, phi, dump_flags);
693     }
694
695   old_val = get_value (PHI_RESULT (phi));
696   switch (old_val->lattice_val)
697     {
698     case VARYING:
699       return SSA_PROP_NOT_INTERESTING;
700
701     case CONSTANT:
702       new_val = *old_val;
703       break;
704
705     case UNKNOWN_VAL:
706       /* To avoid the default value of UNKNOWN_VAL overriding
707          that of its possible constant arguments, temporarily
708          set the PHI node's default lattice value to be 
709          UNDEFINED.  If the PHI node's old value was UNKNOWN_VAL and
710          the new value is UNDEFINED, then we prevent the invalid
711          transition by not calling set_lattice_value.  */
712       new_val.lattice_val = UNDEFINED;
713       new_val.const_val = NULL_TREE;
714       break;
715
716     case UNDEFINED:
717     case UNINITIALIZED:
718       new_val.lattice_val = UNDEFINED;
719       new_val.const_val = NULL_TREE;
720       break;
721
722     default:
723       abort ();
724     }
725
726   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
727     {
728       /* Compute the meet operator over all the PHI arguments.  */
729       edge e = PHI_ARG_EDGE (phi, i);
730
731       if (dump_file && (dump_flags & TDF_DETAILS))
732         {
733           fprintf (dump_file,
734               "\n    Argument #%d (%d -> %d %sexecutable)\n",
735               i, e->src->index, e->dest->index,
736               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
737         }
738
739       /* If the incoming edge is executable, Compute the meet operator for
740          the existing value of the PHI node and the current PHI argument.  */
741       if (e->flags & EDGE_EXECUTABLE)
742         {
743           tree rdef = PHI_ARG_DEF (phi, i);
744           value *rdef_val, val;
745
746           if (is_gimple_min_invariant (rdef))
747             {
748               val.lattice_val = CONSTANT;
749               val.const_val = rdef;
750               rdef_val = &val;
751             }
752           else
753             rdef_val = get_value (rdef);
754
755           new_val = ccp_lattice_meet (new_val, *rdef_val);
756
757           if (dump_file && (dump_flags & TDF_DETAILS))
758             {
759               fprintf (dump_file, "\t");
760               print_generic_expr (dump_file, rdef, dump_flags);
761               dump_lattice_value (dump_file, "\tValue: ", *rdef_val);
762               fprintf (dump_file, "\n");
763             }
764
765           if (new_val.lattice_val == VARYING)
766             break;
767         }
768     }
769
770   if (dump_file && (dump_flags & TDF_DETAILS))
771     {
772       dump_lattice_value (dump_file, "\n    PHI node value: ", new_val);
773       fprintf (dump_file, "\n\n");
774     }
775
776   /* Check for an invalid change from UNKNOWN_VAL to UNDEFINED. */
777   if (old_val->lattice_val == UNKNOWN_VAL
778       && new_val.lattice_val == UNDEFINED)
779     return SSA_PROP_NOT_INTERESTING;
780
781   /* Otherwise, make the transition to the new value.  */
782   if (set_lattice_value (PHI_RESULT (phi), new_val))
783     {
784       if (new_val.lattice_val == VARYING)
785         return SSA_PROP_VARYING;
786       else
787         return SSA_PROP_INTERESTING;
788     }
789   else
790     return SSA_PROP_NOT_INTERESTING;
791 }
792
793
794 /* CCP specific front-end to the non-destructive constant folding
795    routines.
796
797    Attempt to simplify the RHS of STMT knowing that one or more
798    operands are constants.
799
800    If simplification is possible, return the simplified RHS,
801    otherwise return the original RHS.  */
802
803 static tree
804 ccp_fold (tree stmt)
805 {
806   tree rhs = get_rhs (stmt);
807   enum tree_code code = TREE_CODE (rhs);
808   int kind = TREE_CODE_CLASS (code);
809   tree retval = NULL_TREE;
810   vuse_optype vuses;
811   
812   vuses = STMT_VUSE_OPS (stmt);
813
814   /* If the RHS is just a variable, then that variable must now have
815      a constant value that we can return directly.  */
816   if (TREE_CODE (rhs) == SSA_NAME)
817     return get_value (rhs)->const_val;
818   else if (DECL_P (rhs) 
819            && NUM_VUSES (vuses) == 1
820            && rhs == SSA_NAME_VAR (VUSE_OP (vuses, 0)))
821     return get_value (VUSE_OP (vuses, 0))->const_val;
822
823   /* Unary operators.  Note that we know the single operand must
824      be a constant.  So this should almost always return a
825      simplified RHS.  */
826   if (kind == '1')
827     {
828       /* Handle unary operators which can appear in GIMPLE form.  */
829       tree op0 = TREE_OPERAND (rhs, 0);
830
831       /* Simplify the operand down to a constant.  */
832       if (TREE_CODE (op0) == SSA_NAME)
833         {
834           value *val = get_value (op0);
835           if (val->lattice_val == CONSTANT)
836             op0 = get_value (op0)->const_val;
837         }
838
839       retval = nondestructive_fold_unary_to_constant (code,
840                                                       TREE_TYPE (rhs),
841                                                       op0);
842
843       /* If we folded, but did not create an invariant, then we can not
844          use this expression.  */
845       if (retval && ! is_gimple_min_invariant (retval))
846         return NULL;
847
848       /* If we could not fold the expression, but the arguments are all
849          constants and gimple values, then build and return the new
850          expression. 
851
852          In some cases the new expression is still something we can
853          use as a replacement for an argument.  This happens with
854          NOP conversions of types for example.
855
856          In other cases the new expression can not be used as a
857          replacement for an argument (as it would create non-gimple
858          code).  But the new expression can still be used to derive
859          other constants.  */
860       if (! retval && is_gimple_min_invariant (op0))
861         return build1 (code, TREE_TYPE (rhs), op0);
862     }
863
864   /* Binary and comparison operators.  We know one or both of the
865      operands are constants.  */
866   else if (kind == '2'
867            || kind == '<'
868            || code == TRUTH_AND_EXPR
869            || code == TRUTH_OR_EXPR
870            || code == TRUTH_XOR_EXPR)
871     {
872       /* Handle binary and comparison operators that can appear in
873          GIMPLE form.  */
874       tree op0 = TREE_OPERAND (rhs, 0);
875       tree op1 = TREE_OPERAND (rhs, 1);
876
877       /* Simplify the operands down to constants when appropriate.  */
878       if (TREE_CODE (op0) == SSA_NAME)
879         {
880           value *val = get_value (op0);
881           if (val->lattice_val == CONSTANT)
882             op0 = val->const_val;
883         }
884
885       if (TREE_CODE (op1) == SSA_NAME)
886         {
887           value *val = get_value (op1);
888           if (val->lattice_val == CONSTANT)
889             op1 = val->const_val;
890         }
891
892       retval = nondestructive_fold_binary_to_constant (code,
893                                                        TREE_TYPE (rhs),
894                                                        op0, op1);
895
896       /* If we folded, but did not create an invariant, then we can not
897          use this expression.  */
898       if (retval && ! is_gimple_min_invariant (retval))
899         return NULL;
900       
901       /* If we could not fold the expression, but the arguments are all
902          constants and gimple values, then build and return the new
903          expression. 
904
905          In some cases the new expression is still something we can
906          use as a replacement for an argument.  This happens with
907          NOP conversions of types for example.
908
909          In other cases the new expression can not be used as a
910          replacement for an argument (as it would create non-gimple
911          code).  But the new expression can still be used to derive
912          other constants.  */
913       if (! retval
914           && is_gimple_min_invariant (op0)
915           && is_gimple_min_invariant (op1))
916         return build (code, TREE_TYPE (rhs), op0, op1);
917     }
918
919   /* We may be able to fold away calls to builtin functions if their
920      arguments are constants.  */
921   else if (code == CALL_EXPR
922            && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
923            && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
924                == FUNCTION_DECL)
925            && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
926     {
927       use_optype uses = STMT_USE_OPS (stmt);
928       if (NUM_USES (uses) != 0)
929         {
930           tree *orig;
931           size_t i;
932
933           /* Preserve the original values of every operand.  */
934           orig = xmalloc (sizeof (tree) * NUM_USES (uses));
935           for (i = 0; i < NUM_USES (uses); i++)
936             orig[i] = USE_OP (uses, i);
937
938           /* Substitute operands with their values and try to fold.  */
939           replace_uses_in (stmt, NULL);
940           retval = fold_builtin (rhs, false);
941
942           /* Restore operands to their original form.  */
943           for (i = 0; i < NUM_USES (uses); i++)
944             SET_USE_OP (uses, i, orig[i]);
945           free (orig);
946         }
947     }
948   else
949     return rhs;
950
951   /* If we got a simplified form, see if we need to convert its type.  */
952   if (retval)
953     return fold_convert (TREE_TYPE (rhs), retval);
954
955   /* No simplification was possible.  */
956   return rhs;
957 }
958
959
960 /* Evaluate statement STMT.  */
961
962 static value
963 evaluate_stmt (tree stmt)
964 {
965   value val;
966   tree simplified;
967   latticevalue likelyvalue = likely_value (stmt);
968
969   /* If the statement is likely to have a CONSTANT result, then try
970      to fold the statement to determine the constant value.  */
971   if (likelyvalue == CONSTANT)
972     simplified = ccp_fold (stmt);
973   /* If the statement is likely to have a VARYING result, then do not
974      bother folding the statement.  */
975   else if (likelyvalue == VARYING)
976     simplified = get_rhs (stmt);
977   /* Otherwise the statement is likely to have an UNDEFINED value and
978      there will be nothing to do.  */
979   else
980     simplified = NULL_TREE;
981
982   if (simplified && is_gimple_min_invariant (simplified))
983     {
984       /* The statement produced a constant value.  */
985       val.lattice_val = CONSTANT;
986       val.const_val = simplified;
987     }
988   else
989     {
990       /* The statement produced a nonconstant value.  If the statement
991          had undefined or virtual operands, then the result of the 
992          statement should be undefined or virtual respectively.  
993          Else the result of the statement is VARYING.  */
994       val.lattice_val = (likelyvalue == UNDEFINED ? UNDEFINED : VARYING);
995       val.lattice_val = (likelyvalue == UNKNOWN_VAL 
996                            ? UNKNOWN_VAL : val.lattice_val);
997       val.const_val = NULL_TREE;
998     }
999
1000   return val;
1001 }
1002
1003
1004 /* Visit the assignment statement STMT.  Set the value of its LHS to the
1005    value computed by the RHS and store LHS in *OUTPUT_P.  */
1006
1007 static enum ssa_prop_result
1008 visit_assignment (tree stmt, tree *output_p)
1009 {
1010   value val;
1011   tree lhs, rhs;
1012   vuse_optype vuses;
1013   v_must_def_optype v_must_defs;
1014
1015   lhs = TREE_OPERAND (stmt, 0);
1016   rhs = TREE_OPERAND (stmt, 1);
1017   vuses = STMT_VUSE_OPS (stmt);
1018   v_must_defs = STMT_V_MUST_DEF_OPS (stmt);
1019
1020 #if defined ENABLE_CHECKING
1021   if (NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) > 0
1022       || (NUM_V_MUST_DEFS (v_must_defs) != 1
1023           && TREE_CODE (lhs) != SSA_NAME))
1024     abort ();
1025 #endif
1026
1027   /* We require the SSA version number of the lhs for the value_vector.
1028      Make sure we have it.  */
1029   if (TREE_CODE (lhs) != SSA_NAME)
1030     {
1031       /* If we make it here, then stmt only has one definition:
1032          a V_MUST_DEF.  */
1033       lhs = V_MUST_DEF_OP (v_must_defs, 0);
1034     }
1035
1036   if (TREE_CODE (rhs) == SSA_NAME)
1037     {
1038       /* For a simple copy operation, we copy the lattice values.  */
1039       value *nval = get_value (rhs);
1040       val = *nval;
1041     }
1042   else if (DECL_P (rhs) 
1043            && NUM_VUSES (vuses) == 1
1044            && rhs == SSA_NAME_VAR (VUSE_OP (vuses, 0)))
1045     {
1046       /* Same as above, but the rhs is not a gimple register and yet
1047         has a known VUSE.  */
1048       value *nval = get_value (VUSE_OP (vuses, 0));
1049       val = *nval;
1050     }
1051   else
1052     {
1053       /* Evaluate the statement.  */
1054       val = evaluate_stmt (stmt);
1055     }
1056
1057   /* FIXME: Hack.  If this was a definition of a bitfield, we need to widen
1058      the constant value into the type of the destination variable.  This
1059      should not be necessary if GCC represented bitfields properly.  */
1060   {
1061     tree lhs = TREE_OPERAND (stmt, 0);
1062     if (val.lattice_val == CONSTANT
1063         && TREE_CODE (lhs) == COMPONENT_REF
1064         && DECL_BIT_FIELD (TREE_OPERAND (lhs, 1)))
1065       {
1066         tree w = widen_bitfield (val.const_val, TREE_OPERAND (lhs, 1), lhs);
1067
1068         if (w && is_gimple_min_invariant (w))
1069           val.const_val = w;
1070         else
1071           {
1072             val.lattice_val = VARYING;
1073             val.const_val = NULL;
1074           }
1075       }
1076   }
1077
1078   /* If LHS is not a gimple register, then it cannot take on an
1079      UNDEFINED value. */
1080   if (!is_gimple_reg (SSA_NAME_VAR (lhs)) 
1081       && val.lattice_val == UNDEFINED)
1082     val.lattice_val = UNKNOWN_VAL;      
1083
1084   /* Set the lattice value of the statement's output.  */
1085   if (set_lattice_value (lhs, val))
1086     {
1087       *output_p = lhs;
1088       if (val.lattice_val == VARYING)
1089         return SSA_PROP_VARYING;
1090       else
1091         return SSA_PROP_INTERESTING;
1092     }
1093   else
1094     return SSA_PROP_NOT_INTERESTING;
1095 }
1096
1097
1098 /* Visit the conditional statement STMT.  Return SSA_PROP_INTERESTING
1099    if it can determine which edge will be taken.  Otherwise, return
1100    SSA_PROP_VARYING.  */
1101
1102 static enum ssa_prop_result
1103 visit_cond_stmt (tree stmt, edge *taken_edge_p)
1104 {
1105   value val;
1106   basic_block block;
1107
1108   block = bb_for_stmt (stmt);
1109   val = evaluate_stmt (stmt);
1110
1111   /* Find which edge out of the conditional block will be taken and add it
1112      to the worklist.  If no single edge can be determined statically,
1113      return SSA_PROP_VARYING to feed all the outgoing edges to the
1114      propagation engine.  */
1115   *taken_edge_p = find_taken_edge (block, val.const_val);
1116   if (*taken_edge_p)
1117     return SSA_PROP_INTERESTING;
1118   else
1119     return SSA_PROP_VARYING;
1120 }
1121
1122
1123 /* Evaluate statement STMT.  If the statement produces an output value and
1124    its evaluation changes the lattice value of its output, return
1125    SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1126    output value.
1127    
1128    If STMT is a conditional branch and we can determine its truth
1129    value, set *TAKEN_EDGE_P accordingly.  If STMT produces a varying
1130    value, return SSA_PROP_VARYING.  */
1131
1132 static enum ssa_prop_result
1133 ccp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1134 {
1135   stmt_ann_t ann;
1136   v_may_def_optype v_may_defs;
1137   v_must_def_optype v_must_defs;
1138   tree def;
1139   ssa_op_iter iter;
1140
1141   if (dump_file && (dump_flags & TDF_DETAILS))
1142     {
1143       fprintf (dump_file, "\nVisiting statement: ");
1144       print_generic_stmt (dump_file, stmt, TDF_SLIM);
1145       fprintf (dump_file, "\n");
1146     }
1147
1148   ann = stmt_ann (stmt);
1149
1150   v_must_defs = V_MUST_DEF_OPS (ann);
1151   v_may_defs = V_MAY_DEF_OPS (ann);
1152   if (TREE_CODE (stmt) == MODIFY_EXPR
1153       && NUM_V_MAY_DEFS (v_may_defs) == 0
1154       && (NUM_V_MUST_DEFS (v_must_defs) == 1
1155           || TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME))
1156     {
1157       /* If the statement is an assignment that produces a single
1158          output value, evaluate its RHS to see if the lattice value of
1159          its output has changed.  */
1160       return visit_assignment (stmt, output_p);
1161     }
1162   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1163     {
1164       /* If STMT is a conditional branch, see if we can determine
1165          which branch will be taken.  */
1166       return visit_cond_stmt (stmt, taken_edge_p);
1167     }
1168
1169   /* Any other kind of statement is not interesting for constant
1170      propagation and, therefore, not worth simulating.  */
1171   if (dump_file && (dump_flags & TDF_DETAILS))
1172     fprintf (dump_file, "No interesting values produced.  Marked VARYING.\n");
1173
1174   /* Definitions made by statements other than assignments to
1175      SSA_NAMEs represent unknown modifications to their outputs.
1176      Mark them VARYING.  */
1177   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1178     def_to_varying (def);
1179
1180   /* Mark all V_MAY_DEF operands VARYING.  */
1181   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_VMAYDEF)
1182     def_to_varying (def);
1183
1184   return SSA_PROP_VARYING;
1185 }
1186
1187
1188 /* Main entry point for SSA Conditional Constant Propagation.
1189
1190    [ DESCRIBE MAIN ALGORITHM HERE ]  */
1191
1192 static void
1193 execute_ssa_ccp (void)
1194 {
1195   ccp_initialize ();
1196   ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
1197   ccp_finalize ();
1198 }
1199
1200
1201 static bool
1202 gate_ccp (void)
1203 {
1204   return flag_tree_ccp != 0;
1205 }
1206
1207
1208 struct tree_opt_pass pass_ccp = 
1209 {
1210   "ccp",                                /* name */
1211   gate_ccp,                             /* gate */
1212   execute_ssa_ccp,                      /* execute */
1213   NULL,                                 /* sub */
1214   NULL,                                 /* next */
1215   0,                                    /* static_pass_number */
1216   TV_TREE_CCP,                          /* tv_id */
1217   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
1218   0,                                    /* properties_provided */
1219   0,                                    /* properties_destroyed */
1220   0,                                    /* todo_flags_start */
1221   TODO_dump_func | TODO_rename_vars
1222     | TODO_ggc_collect | TODO_verify_ssa
1223     | TODO_verify_stmts                 /* todo_flags_finish */
1224 };
1225
1226
1227 /* Given a constant value VAL for bitfield FIELD, and a destination
1228    variable VAR, return VAL appropriately widened to fit into VAR.  If
1229    FIELD is wider than HOST_WIDE_INT, NULL is returned.  */
1230
1231 tree
1232 widen_bitfield (tree val, tree field, tree var)
1233 {
1234   unsigned HOST_WIDE_INT var_size, field_size;
1235   tree wide_val;
1236   unsigned HOST_WIDE_INT mask;
1237   unsigned int i;
1238
1239   /* We can only do this if the size of the type and field and VAL are
1240      all constants representable in HOST_WIDE_INT.  */
1241   if (!host_integerp (TYPE_SIZE (TREE_TYPE (var)), 1)
1242       || !host_integerp (DECL_SIZE (field), 1)
1243       || !host_integerp (val, 0))
1244     return NULL_TREE;
1245
1246   var_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (var)), 1);
1247   field_size = tree_low_cst (DECL_SIZE (field), 1);
1248
1249   /* Give up if either the bitfield or the variable are too wide.  */
1250   if (field_size > HOST_BITS_PER_WIDE_INT || var_size > HOST_BITS_PER_WIDE_INT)
1251     return NULL_TREE;
1252
1253 #if defined ENABLE_CHECKING
1254   if (var_size < field_size)
1255     abort ();
1256 #endif
1257
1258   /* If the sign bit of the value is not set or the field's type is unsigned,
1259      just mask off the high order bits of the value.  */
1260   if (DECL_UNSIGNED (field)
1261       || !(tree_low_cst (val, 0) & (((HOST_WIDE_INT)1) << (field_size - 1))))
1262     {
1263       /* Zero extension.  Build a mask with the lower 'field_size' bits
1264          set and a BIT_AND_EXPR node to clear the high order bits of
1265          the value.  */
1266       for (i = 0, mask = 0; i < field_size; i++)
1267         mask |= ((HOST_WIDE_INT) 1) << i;
1268
1269       wide_val = build (BIT_AND_EXPR, TREE_TYPE (var), val, 
1270                         fold_convert (TREE_TYPE (var),
1271                                       build_int_cst (NULL_TREE, mask)));
1272     }
1273   else
1274     {
1275       /* Sign extension.  Create a mask with the upper 'field_size'
1276          bits set and a BIT_IOR_EXPR to set the high order bits of the
1277          value.  */
1278       for (i = 0, mask = 0; i < (var_size - field_size); i++)
1279         mask |= ((HOST_WIDE_INT) 1) << (var_size - i - 1);
1280
1281       wide_val = build (BIT_IOR_EXPR, TREE_TYPE (var), val,
1282                         fold_convert (TREE_TYPE (var),
1283                                       build_int_cst (NULL_TREE, mask)));
1284     }
1285
1286   return fold (wide_val);
1287 }
1288
1289
1290 /* A subroutine of fold_stmt_r.  Attempts to fold *(A+O) to A[X].
1291    BASE is an array type.  OFFSET is a byte displacement.  ORIG_TYPE
1292    is the desired result type.  */
1293
1294 static tree
1295 maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type)
1296 {
1297   tree min_idx, idx, elt_offset = integer_zero_node;
1298   tree array_type, elt_type, elt_size;
1299
1300   /* If BASE is an ARRAY_REF, we can pick up another offset (this time
1301      measured in units of the size of elements type) from that ARRAY_REF).
1302      We can't do anything if either is variable.
1303
1304      The case we handle here is *(&A[N]+O).  */
1305   if (TREE_CODE (base) == ARRAY_REF)
1306     {
1307       tree low_bound = array_ref_low_bound (base);
1308
1309       elt_offset = TREE_OPERAND (base, 1);
1310       if (TREE_CODE (low_bound) != INTEGER_CST
1311           || TREE_CODE (elt_offset) != INTEGER_CST)
1312         return NULL_TREE;
1313
1314       elt_offset = int_const_binop (MINUS_EXPR, elt_offset, low_bound, 0);
1315       base = TREE_OPERAND (base, 0);
1316     }
1317
1318   /* Ignore stupid user tricks of indexing non-array variables.  */
1319   array_type = TREE_TYPE (base);
1320   if (TREE_CODE (array_type) != ARRAY_TYPE)
1321     return NULL_TREE;
1322   elt_type = TREE_TYPE (array_type);
1323   if (!lang_hooks.types_compatible_p (orig_type, elt_type))
1324     return NULL_TREE;
1325         
1326   /* If OFFSET and ELT_OFFSET are zero, we don't care about the size of the
1327      element type (so we can use the alignment if it's not constant).
1328      Otherwise, compute the offset as an index by using a division.  If the
1329      division isn't exact, then don't do anything.  */
1330   elt_size = TYPE_SIZE_UNIT (elt_type);
1331   if (integer_zerop (offset))
1332     {
1333       if (TREE_CODE (elt_size) != INTEGER_CST)
1334         elt_size = size_int (TYPE_ALIGN (elt_type));
1335
1336       idx = integer_zero_node;
1337     }
1338   else
1339     {
1340       unsigned HOST_WIDE_INT lquo, lrem;
1341       HOST_WIDE_INT hquo, hrem;
1342
1343       if (TREE_CODE (elt_size) != INTEGER_CST
1344           || div_and_round_double (TRUNC_DIV_EXPR, 1,
1345                                    TREE_INT_CST_LOW (offset),
1346                                    TREE_INT_CST_HIGH (offset),
1347                                    TREE_INT_CST_LOW (elt_size),
1348                                    TREE_INT_CST_HIGH (elt_size),
1349                                    &lquo, &hquo, &lrem, &hrem)
1350           || lrem || hrem)
1351         return NULL_TREE;
1352
1353       idx = build_int_cst_wide (NULL_TREE, lquo, hquo);
1354     }
1355
1356   /* Assume the low bound is zero.  If there is a domain type, get the
1357      low bound, if any, convert the index into that type, and add the
1358      low bound.  */
1359   min_idx = integer_zero_node;
1360   if (TYPE_DOMAIN (array_type))
1361     {
1362       if (TYPE_MIN_VALUE (TYPE_DOMAIN (array_type)))
1363         min_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (array_type));
1364       else
1365         min_idx = fold_convert (TYPE_DOMAIN (array_type), min_idx);
1366
1367       if (TREE_CODE (min_idx) != INTEGER_CST)
1368         return NULL_TREE;
1369
1370       idx = fold_convert (TYPE_DOMAIN (array_type), idx);
1371       elt_offset = fold_convert (TYPE_DOMAIN (array_type), elt_offset);
1372     }
1373
1374   if (!integer_zerop (min_idx))
1375     idx = int_const_binop (PLUS_EXPR, idx, min_idx, 0);
1376   if (!integer_zerop (elt_offset))
1377     idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0);
1378
1379   return build (ARRAY_REF, orig_type, base, idx, min_idx,
1380                 size_int (tree_low_cst (elt_size, 1)
1381                           / (TYPE_ALIGN_UNIT (elt_type))));
1382 }
1383
1384
1385 /* A subroutine of fold_stmt_r.  Attempts to fold *(S+O) to S.X.
1386    BASE is a record type.  OFFSET is a byte displacement.  ORIG_TYPE
1387    is the desired result type.  */
1388 /* ??? This doesn't handle class inheritance.  */
1389
1390 static tree
1391 maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
1392                                     tree orig_type, bool base_is_ptr)
1393 {
1394   tree f, t, field_type, tail_array_field;
1395
1396   if (TREE_CODE (record_type) != RECORD_TYPE
1397       && TREE_CODE (record_type) != UNION_TYPE
1398       && TREE_CODE (record_type) != QUAL_UNION_TYPE)
1399     return NULL_TREE;
1400
1401   /* Short-circuit silly cases.  */
1402   if (lang_hooks.types_compatible_p (record_type, orig_type))
1403     return NULL_TREE;
1404
1405   tail_array_field = NULL_TREE;
1406   for (f = TYPE_FIELDS (record_type); f ; f = TREE_CHAIN (f))
1407     {
1408       int cmp;
1409
1410       if (TREE_CODE (f) != FIELD_DECL)
1411         continue;
1412       if (DECL_BIT_FIELD (f))
1413         continue;
1414       if (TREE_CODE (DECL_FIELD_OFFSET (f)) != INTEGER_CST)
1415         continue;
1416
1417       /* ??? Java creates "interesting" fields for representing base classes.
1418          They have no name, and have no context.  With no context, we get into
1419          trouble with nonoverlapping_component_refs_p.  Skip them.  */
1420       if (!DECL_FIELD_CONTEXT (f))
1421         continue;
1422
1423       /* The previous array field isn't at the end.  */
1424       tail_array_field = NULL_TREE;
1425
1426       /* Check to see if this offset overlaps with the field.  */
1427       cmp = tree_int_cst_compare (DECL_FIELD_OFFSET (f), offset);
1428       if (cmp > 0)
1429         continue;
1430
1431       field_type = TREE_TYPE (f);
1432       if (cmp < 0)
1433         {
1434           /* Don't care about offsets into the middle of scalars.  */
1435           if (!AGGREGATE_TYPE_P (field_type))
1436             continue;
1437
1438           /* Check for array at the end of the struct.  This is often
1439              used as for flexible array members.  We should be able to
1440              turn this into an array access anyway.  */
1441           if (TREE_CODE (field_type) == ARRAY_TYPE)
1442             tail_array_field = f;
1443
1444           /* Check the end of the field against the offset.  */
1445           if (!DECL_SIZE_UNIT (f)
1446               || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
1447             continue;
1448           t = int_const_binop (MINUS_EXPR, offset, DECL_FIELD_OFFSET (f), 1);
1449           if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
1450             continue;
1451
1452           /* If we matched, then set offset to the displacement into
1453              this field.  */
1454           offset = t;
1455         }
1456
1457       /* Here we exactly match the offset being checked.  If the types match,
1458          then we can return that field.  */
1459       else if (lang_hooks.types_compatible_p (orig_type, field_type))
1460         {
1461           if (base_is_ptr)
1462             base = build1 (INDIRECT_REF, record_type, base);
1463           t = build (COMPONENT_REF, field_type, base, f, NULL_TREE);
1464           return t;
1465         }
1466
1467       /* Don't care about type-punning of scalars.  */
1468       else if (!AGGREGATE_TYPE_P (field_type))
1469         return NULL_TREE;
1470
1471       goto found;
1472     }
1473
1474   if (!tail_array_field)
1475     return NULL_TREE;
1476
1477   f = tail_array_field;
1478   field_type = TREE_TYPE (f);
1479
1480  found:
1481   /* If we get here, we've got an aggregate field, and a possibly 
1482      nonzero offset into them.  Recurse and hope for a valid match.  */
1483   if (base_is_ptr)
1484     base = build1 (INDIRECT_REF, record_type, base);
1485   base = build (COMPONENT_REF, field_type, base, f, NULL_TREE);
1486
1487   t = maybe_fold_offset_to_array_ref (base, offset, orig_type);
1488   if (t)
1489     return t;
1490   return maybe_fold_offset_to_component_ref (field_type, base, offset,
1491                                              orig_type, false);
1492 }
1493
1494
1495 /* A subroutine of fold_stmt_r.  Attempt to simplify *(BASE+OFFSET).
1496    Return the simplified expression, or NULL if nothing could be done.  */
1497
1498 static tree
1499 maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
1500 {
1501   tree t;
1502
1503   /* We may well have constructed a double-nested PLUS_EXPR via multiple
1504      substitutions.  Fold that down to one.  Remove NON_LVALUE_EXPRs that
1505      are sometimes added.  */
1506   base = fold (base);
1507   STRIP_NOPS (base);
1508   TREE_OPERAND (expr, 0) = base;
1509
1510   /* One possibility is that the address reduces to a string constant.  */
1511   t = fold_read_from_constant_string (expr);
1512   if (t)
1513     return t;
1514
1515   /* Add in any offset from a PLUS_EXPR.  */
1516   if (TREE_CODE (base) == PLUS_EXPR)
1517     {
1518       tree offset2;
1519
1520       offset2 = TREE_OPERAND (base, 1);
1521       if (TREE_CODE (offset2) != INTEGER_CST)
1522         return NULL_TREE;
1523       base = TREE_OPERAND (base, 0);
1524
1525       offset = int_const_binop (PLUS_EXPR, offset, offset2, 1);
1526     }
1527
1528   if (TREE_CODE (base) == ADDR_EXPR)
1529     {
1530       /* Strip the ADDR_EXPR.  */
1531       base = TREE_OPERAND (base, 0);
1532
1533       /* Fold away CONST_DECL to its value, if the type is scalar.  */
1534       if (TREE_CODE (base) == CONST_DECL
1535           && is_gimple_min_invariant (DECL_INITIAL (base)))
1536         return DECL_INITIAL (base);
1537
1538       /* Try folding *(&B+O) to B[X].  */
1539       t = maybe_fold_offset_to_array_ref (base, offset, TREE_TYPE (expr));
1540       if (t)
1541         return t;
1542
1543       /* Try folding *(&B+O) to B.X.  */
1544       t = maybe_fold_offset_to_component_ref (TREE_TYPE (base), base, offset,
1545                                               TREE_TYPE (expr), false);
1546       if (t)
1547         return t;
1548
1549       /* Fold *&B to B.  We can only do this if EXPR is the same type
1550          as BASE.  We can't do this if EXPR is the element type of an array
1551          and BASE is the array.  */
1552       if (integer_zerop (offset)
1553           && lang_hooks.types_compatible_p (TREE_TYPE (base),
1554                                             TREE_TYPE (expr)))
1555         return base;
1556     }
1557   else
1558     {
1559       /* We can get here for out-of-range string constant accesses, 
1560          such as "_"[3].  Bail out of the entire substitution search
1561          and arrange for the entire statement to be replaced by a
1562          call to __builtin_trap.  In all likelyhood this will all be
1563          constant-folded away, but in the meantime we can't leave with
1564          something that get_expr_operands can't understand.  */
1565
1566       t = base;
1567       STRIP_NOPS (t);
1568       if (TREE_CODE (t) == ADDR_EXPR
1569           && TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)
1570         {
1571           /* FIXME: Except that this causes problems elsewhere with dead
1572              code not being deleted, and we abort in the rtl expanders 
1573              because we failed to remove some ssa_name.  In the meantime,
1574              just return zero.  */
1575           /* FIXME2: This condition should be signaled by
1576              fold_read_from_constant_string directly, rather than 
1577              re-checking for it here.  */
1578           return integer_zero_node;
1579         }
1580
1581       /* Try folding *(B+O) to B->X.  Still an improvement.  */
1582       if (POINTER_TYPE_P (TREE_TYPE (base)))
1583         {
1584           t = maybe_fold_offset_to_component_ref (TREE_TYPE (TREE_TYPE (base)),
1585                                                   base, offset,
1586                                                   TREE_TYPE (expr), true);
1587           if (t)
1588             return t;
1589         }
1590     }
1591
1592   /* Otherwise we had an offset that we could not simplify.  */
1593   return NULL_TREE;
1594 }
1595
1596
1597 /* A subroutine of fold_stmt_r.  EXPR is a PLUS_EXPR.
1598
1599    A quaint feature extant in our address arithmetic is that there
1600    can be hidden type changes here.  The type of the result need
1601    not be the same as the type of the input pointer.
1602
1603    What we're after here is an expression of the form
1604         (T *)(&array + const)
1605    where the cast doesn't actually exist, but is implicit in the
1606    type of the PLUS_EXPR.  We'd like to turn this into
1607         &array[x]
1608    which may be able to propagate further.  */
1609
1610 static tree
1611 maybe_fold_stmt_addition (tree expr)
1612 {
1613   tree op0 = TREE_OPERAND (expr, 0);
1614   tree op1 = TREE_OPERAND (expr, 1);
1615   tree ptr_type = TREE_TYPE (expr);
1616   tree ptd_type;
1617   tree t;
1618   bool subtract = (TREE_CODE (expr) == MINUS_EXPR);
1619
1620   /* We're only interested in pointer arithmetic.  */
1621   if (!POINTER_TYPE_P (ptr_type))
1622     return NULL_TREE;
1623   /* Canonicalize the integral operand to op1.  */
1624   if (INTEGRAL_TYPE_P (TREE_TYPE (op0)))
1625     {
1626       if (subtract)
1627         return NULL_TREE;
1628       t = op0, op0 = op1, op1 = t;
1629     }
1630   /* It had better be a constant.  */
1631   if (TREE_CODE (op1) != INTEGER_CST)
1632     return NULL_TREE;
1633   /* The first operand should be an ADDR_EXPR.  */
1634   if (TREE_CODE (op0) != ADDR_EXPR)
1635     return NULL_TREE;
1636   op0 = TREE_OPERAND (op0, 0);
1637
1638   /* If the first operand is an ARRAY_REF, expand it so that we can fold
1639      the offset into it.  */
1640   while (TREE_CODE (op0) == ARRAY_REF)
1641     {
1642       tree array_obj = TREE_OPERAND (op0, 0);
1643       tree array_idx = TREE_OPERAND (op0, 1);
1644       tree elt_type = TREE_TYPE (op0);
1645       tree elt_size = TYPE_SIZE_UNIT (elt_type);
1646       tree min_idx;
1647
1648       if (TREE_CODE (array_idx) != INTEGER_CST)
1649         break;
1650       if (TREE_CODE (elt_size) != INTEGER_CST)
1651         break;
1652
1653       /* Un-bias the index by the min index of the array type.  */
1654       min_idx = TYPE_DOMAIN (TREE_TYPE (array_obj));
1655       if (min_idx)
1656         {
1657           min_idx = TYPE_MIN_VALUE (min_idx);
1658           if (min_idx)
1659             {
1660               if (TREE_CODE (min_idx) != INTEGER_CST)
1661                 break;
1662
1663               array_idx = convert (TREE_TYPE (min_idx), array_idx);
1664               if (!integer_zerop (min_idx))
1665                 array_idx = int_const_binop (MINUS_EXPR, array_idx,
1666                                              min_idx, 0);
1667             }
1668         }
1669
1670       /* Convert the index to a byte offset.  */
1671       array_idx = convert (sizetype, array_idx);
1672       array_idx = int_const_binop (MULT_EXPR, array_idx, elt_size, 0);
1673
1674       /* Update the operands for the next round, or for folding.  */
1675       /* If we're manipulating unsigned types, then folding into negative
1676          values can produce incorrect results.  Particularly if the type
1677          is smaller than the width of the pointer.  */
1678       if (subtract
1679           && TYPE_UNSIGNED (TREE_TYPE (op1))
1680           && tree_int_cst_lt (array_idx, op1))
1681         return NULL;
1682       op1 = int_const_binop (subtract ? MINUS_EXPR : PLUS_EXPR,
1683                              array_idx, op1, 0);
1684       subtract = false;
1685       op0 = array_obj;
1686     }
1687
1688   /* If we weren't able to fold the subtraction into another array reference,
1689      canonicalize the integer for passing to the array and component ref
1690      simplification functions.  */
1691   if (subtract)
1692     {
1693       if (TYPE_UNSIGNED (TREE_TYPE (op1)))
1694         return NULL;
1695       op1 = fold (build1 (NEGATE_EXPR, TREE_TYPE (op1), op1));
1696       /* ??? In theory fold should always produce another integer.  */
1697       if (TREE_CODE (op1) != INTEGER_CST)
1698         return NULL;
1699     }
1700
1701   ptd_type = TREE_TYPE (ptr_type);
1702
1703   /* At which point we can try some of the same things as for indirects.  */
1704   t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type);
1705   if (!t)
1706     t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1,
1707                                             ptd_type, false);
1708   if (t)
1709     t = build1 (ADDR_EXPR, ptr_type, t);
1710
1711   return t;
1712 }
1713
1714
1715 /* Subroutine of fold_stmt called via walk_tree.  We perform several
1716    simplifications of EXPR_P, mostly having to do with pointer arithmetic.  */
1717
1718 static tree
1719 fold_stmt_r (tree *expr_p, int *walk_subtrees, void *data)
1720 {
1721   bool *changed_p = data;
1722   tree expr = *expr_p, t;
1723
1724   /* ??? It'd be nice if walk_tree had a pre-order option.  */
1725   switch (TREE_CODE (expr))
1726     {
1727     case INDIRECT_REF:
1728       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
1729       if (t)
1730         return t;
1731       *walk_subtrees = 0;
1732
1733       t = maybe_fold_stmt_indirect (expr, TREE_OPERAND (expr, 0),
1734                                     integer_zero_node);
1735       break;
1736
1737       /* ??? Could handle ARRAY_REF here, as a variant of INDIRECT_REF.
1738          We'd only want to bother decomposing an existing ARRAY_REF if
1739          the base array is found to have another offset contained within.
1740          Otherwise we'd be wasting time.  */
1741
1742     case ADDR_EXPR:
1743       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
1744       if (t)
1745         return t;
1746       *walk_subtrees = 0;
1747
1748       /* Set TREE_INVARIANT properly so that the value is properly
1749          considered constant, and so gets propagated as expected.  */
1750       if (*changed_p)
1751         recompute_tree_invarant_for_addr_expr (expr);
1752       return NULL_TREE;
1753
1754     case PLUS_EXPR:
1755     case MINUS_EXPR:
1756       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
1757       if (t)
1758         return t;
1759       t = walk_tree (&TREE_OPERAND (expr, 1), fold_stmt_r, data, NULL);
1760       if (t)
1761         return t;
1762       *walk_subtrees = 0;
1763
1764       t = maybe_fold_stmt_addition (expr);
1765       break;
1766
1767     case COMPONENT_REF:
1768       t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
1769       if (t)
1770         return t;
1771       *walk_subtrees = 0;
1772
1773       /* Make sure the FIELD_DECL is actually a field in the type on the lhs.
1774          We've already checked that the records are compatible, so we should
1775          come up with a set of compatible fields.  */
1776       {
1777         tree expr_record = TREE_TYPE (TREE_OPERAND (expr, 0));
1778         tree expr_field = TREE_OPERAND (expr, 1);
1779
1780         if (DECL_FIELD_CONTEXT (expr_field) != TYPE_MAIN_VARIANT (expr_record))
1781           {
1782             expr_field = find_compatible_field (expr_record, expr_field);
1783             TREE_OPERAND (expr, 1) = expr_field;
1784           }
1785       }
1786       break;
1787
1788     default:
1789       return NULL_TREE;
1790     }
1791
1792   if (t)
1793     {
1794       *expr_p = t;
1795       *changed_p = true;
1796     }
1797
1798   return NULL_TREE;
1799 }
1800
1801
1802 /* Return the string length of ARG in LENGTH.  If ARG is an SSA name variable,
1803    follow its use-def chains.  If LENGTH is not NULL and its value is not
1804    equal to the length we determine, or if we are unable to determine the
1805    length, return false.  VISITED is a bitmap of visited variables.  */
1806
1807 static bool
1808 get_strlen (tree arg, tree *length, bitmap visited)
1809 {
1810   tree var, def_stmt, val;
1811   
1812   if (TREE_CODE (arg) != SSA_NAME)
1813     {
1814       val = c_strlen (arg, 1);
1815       if (!val)
1816         return false;
1817
1818       if (*length && simple_cst_equal (val, *length) != 1)
1819         return false;
1820
1821       *length = val;
1822       return true;
1823     }
1824
1825   /* If we were already here, break the infinite cycle.  */
1826   if (bitmap_bit_p (visited, SSA_NAME_VERSION (arg)))
1827     return true;
1828   bitmap_set_bit (visited, SSA_NAME_VERSION (arg));
1829
1830   var = arg;
1831   def_stmt = SSA_NAME_DEF_STMT (var);
1832
1833   switch (TREE_CODE (def_stmt))
1834     {
1835       case MODIFY_EXPR:
1836         {
1837           tree len, rhs;
1838           
1839           /* The RHS of the statement defining VAR must either have a
1840              constant length or come from another SSA_NAME with a constant
1841              length.  */
1842           rhs = TREE_OPERAND (def_stmt, 1);
1843           STRIP_NOPS (rhs);
1844           if (TREE_CODE (rhs) == SSA_NAME)
1845             return get_strlen (rhs, length, visited);
1846
1847           /* See if the RHS is a constant length.  */
1848           len = c_strlen (rhs, 1);
1849           if (len)
1850             {
1851               if (*length && simple_cst_equal (len, *length) != 1)
1852                 return false;
1853
1854               *length = len;
1855               return true;
1856             }
1857
1858           break;
1859         }
1860
1861       case PHI_NODE:
1862         {
1863           /* All the arguments of the PHI node must have the same constant
1864              length.  */
1865           int i;
1866
1867           for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
1868             {
1869               tree arg = PHI_ARG_DEF (def_stmt, i);
1870
1871               /* If this PHI has itself as an argument, we cannot
1872                  determine the string length of this argument.  However,
1873                  if we can find a constant string length for the other
1874                  PHI args then we can still be sure that this is a
1875                  constant string length.  So be optimistic and just
1876                  continue with the next argument.  */
1877               if (arg == PHI_RESULT (def_stmt))
1878                 continue;
1879
1880               if (!get_strlen (arg, length, visited))
1881                 return false;
1882             }
1883
1884           return true;
1885         }
1886
1887       default:
1888         break;
1889     }
1890
1891
1892   return false;
1893 }
1894
1895
1896 /* Fold builtin call FN in statement STMT.  If it cannot be folded into a
1897    constant, return NULL_TREE.  Otherwise, return its constant value.  */
1898
1899 static tree
1900 ccp_fold_builtin (tree stmt, tree fn)
1901 {
1902   tree result, strlen_val[2];
1903   tree callee, arglist, a;
1904   int strlen_arg, i;
1905   bitmap visited;
1906   bool ignore;
1907
1908   ignore = TREE_CODE (stmt) != MODIFY_EXPR;
1909
1910   /* First try the generic builtin folder.  If that succeeds, return the
1911      result directly.  */
1912   result = fold_builtin (fn, ignore);
1913   if (result)
1914   {
1915     if (ignore)
1916       STRIP_NOPS (result);
1917     return result;
1918   }
1919
1920   /* Ignore MD builtins.  */
1921   callee = get_callee_fndecl (fn);
1922   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
1923     return NULL_TREE;
1924
1925   /* If the builtin could not be folded, and it has no argument list,
1926      we're done.  */
1927   arglist = TREE_OPERAND (fn, 1);
1928   if (!arglist)
1929     return NULL_TREE;
1930
1931   /* Limit the work only for builtins we know how to simplify.  */
1932   switch (DECL_FUNCTION_CODE (callee))
1933     {
1934     case BUILT_IN_STRLEN:
1935     case BUILT_IN_FPUTS:
1936     case BUILT_IN_FPUTS_UNLOCKED:
1937       strlen_arg = 1;
1938       break;
1939     case BUILT_IN_STRCPY:
1940     case BUILT_IN_STRNCPY:
1941       strlen_arg = 2;
1942       break;
1943     default:
1944       return NULL_TREE;
1945     }
1946
1947   /* Try to use the dataflow information gathered by the CCP process.  */
1948   visited = BITMAP_XMALLOC ();
1949
1950   memset (strlen_val, 0, sizeof (strlen_val));
1951   for (i = 0, a = arglist;
1952        strlen_arg;
1953        i++, strlen_arg >>= 1, a = TREE_CHAIN (a))
1954     if (strlen_arg & 1)
1955       {
1956         bitmap_clear (visited);
1957         if (!get_strlen (TREE_VALUE (a), &strlen_val[i], visited))
1958           strlen_val[i] = NULL_TREE;
1959       }
1960
1961   BITMAP_XFREE (visited);
1962
1963   result = NULL_TREE;
1964   switch (DECL_FUNCTION_CODE (callee))
1965     {
1966     case BUILT_IN_STRLEN:
1967       if (strlen_val[0])
1968         {
1969           tree new = fold_convert (TREE_TYPE (fn), strlen_val[0]);
1970
1971           /* If the result is not a valid gimple value, or not a cast
1972              of a valid gimple value, then we can not use the result.  */
1973           if (is_gimple_val (new)
1974               || (is_gimple_cast (new)
1975                   && is_gimple_val (TREE_OPERAND (new, 0))))
1976             return new;
1977         }
1978       break;
1979
1980     case BUILT_IN_STRCPY:
1981       if (strlen_val[1] && is_gimple_val (strlen_val[1]))
1982         result = fold_builtin_strcpy (fn, strlen_val[1]);
1983       break;
1984
1985     case BUILT_IN_STRNCPY:
1986       if (strlen_val[1] && is_gimple_val (strlen_val[1]))
1987         result = fold_builtin_strncpy (fn, strlen_val[1]);
1988       break;
1989
1990     case BUILT_IN_FPUTS:
1991       result = fold_builtin_fputs (arglist,
1992                                    TREE_CODE (stmt) != MODIFY_EXPR, 0,
1993                                    strlen_val[0]);
1994       break;
1995
1996     case BUILT_IN_FPUTS_UNLOCKED:
1997       result = fold_builtin_fputs (arglist,
1998                                    TREE_CODE (stmt) != MODIFY_EXPR, 1,
1999                                    strlen_val[0]);
2000       break;
2001
2002     default:
2003       abort ();
2004     }
2005
2006   if (result && ignore)
2007     result = fold_ignored_result (result);
2008   return result;
2009 }
2010
2011
2012 /* Fold the statement pointed by STMT_P.  In some cases, this function may
2013    replace the whole statement with a new one.  Returns true iff folding
2014    makes any changes.  */
2015
2016 bool
2017 fold_stmt (tree *stmt_p)
2018 {
2019   tree rhs, result, stmt;
2020   bool changed = false;
2021
2022   stmt = *stmt_p;
2023
2024   /* If we replaced constants and the statement makes pointer dereferences,
2025      then we may need to fold instances of *&VAR into VAR, etc.  */
2026   if (walk_tree (stmt_p, fold_stmt_r, &changed, NULL))
2027     {
2028       *stmt_p
2029         = build_function_call_expr (implicit_built_in_decls[BUILT_IN_TRAP],
2030                                     NULL);
2031       return true;
2032     }
2033
2034   rhs = get_rhs (stmt);
2035   if (!rhs)
2036     return changed;
2037   result = NULL_TREE;
2038
2039   if (TREE_CODE (rhs) == CALL_EXPR)
2040     {
2041       tree callee;
2042
2043       /* Check for builtins that CCP can handle using information not
2044          available in the generic fold routines.  */
2045       callee = get_callee_fndecl (rhs);
2046       if (callee && DECL_BUILT_IN (callee))
2047         result = ccp_fold_builtin (stmt, rhs);
2048       else
2049         {
2050           /* Check for resolvable OBJ_TYPE_REF.  The only sorts we can resolve
2051              here are when we've propagated the address of a decl into the
2052              object slot.  */
2053           /* ??? Should perhaps do this in fold proper.  However, doing it
2054              there requires that we create a new CALL_EXPR, and that requires
2055              copying EH region info to the new node.  Easier to just do it
2056              here where we can just smash the call operand.  */
2057           callee = TREE_OPERAND (rhs, 0);
2058           if (TREE_CODE (callee) == OBJ_TYPE_REF
2059               && lang_hooks.fold_obj_type_ref
2060               && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
2061               && DECL_P (TREE_OPERAND (OBJ_TYPE_REF_OBJECT (callee), 0)))
2062             {
2063               tree t;
2064
2065               /* ??? Caution: Broken ADDR_EXPR semantics means that
2066                  looking at the type of the operand of the addr_expr
2067                  can yield an array type.  See silly exception in
2068                  check_pointer_types_r.  */
2069
2070               t = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (callee)));
2071               t = lang_hooks.fold_obj_type_ref (callee, t);
2072               if (t)
2073                 {
2074                   TREE_OPERAND (rhs, 0) = t;
2075                   changed = true;
2076                 }
2077             }
2078         }
2079     }
2080
2081   /* If we couldn't fold the RHS, hand over to the generic fold routines.  */
2082   if (result == NULL_TREE)
2083     result = fold (rhs);
2084
2085   /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR that
2086      may have been added by fold, and "useless" type conversions that might
2087      now be apparent due to propagation.  */
2088   STRIP_USELESS_TYPE_CONVERSION (result);
2089
2090   if (result != rhs)
2091     changed |= set_rhs (stmt_p, result);
2092
2093   return changed;
2094 }
2095
2096 \f
2097 /* A simple pass that attempts to fold all builtin functions.  This pass
2098    is run after we've propagated as many constants as we can.  */
2099
2100 static void
2101 execute_fold_all_builtins (void)
2102 {
2103   basic_block bb;
2104   FOR_EACH_BB (bb)
2105     {
2106       block_stmt_iterator i;
2107       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
2108         {
2109           tree *stmtp = bsi_stmt_ptr (i);
2110           tree call = get_rhs (*stmtp);
2111           tree callee, result;
2112
2113           if (!call || TREE_CODE (call) != CALL_EXPR)
2114             continue;
2115           callee = get_callee_fndecl (call);
2116           if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
2117             continue;
2118
2119           result = ccp_fold_builtin (*stmtp, call);
2120           if (!result)
2121             switch (DECL_FUNCTION_CODE (callee))
2122               {
2123               case BUILT_IN_CONSTANT_P:
2124                 /* Resolve __builtin_constant_p.  If it hasn't been
2125                    folded to integer_one_node by now, it's fairly
2126                    certain that the value simply isn't constant.  */
2127                 result = integer_zero_node;
2128                 break;
2129
2130               default:
2131                 continue;
2132               }
2133
2134           if (dump_file && (dump_flags & TDF_DETAILS))
2135             {
2136               fprintf (dump_file, "Simplified\n  ");
2137               print_generic_stmt (dump_file, *stmtp, dump_flags);
2138             }
2139
2140           if (set_rhs (stmtp, result))
2141             modify_stmt (*stmtp);
2142
2143           if (dump_file && (dump_flags & TDF_DETAILS))
2144             {
2145               fprintf (dump_file, "to\n  ");
2146               print_generic_stmt (dump_file, *stmtp, dump_flags);
2147               fprintf (dump_file, "\n");
2148             }
2149         }
2150     }
2151 }
2152
2153
2154 struct tree_opt_pass pass_fold_builtins = 
2155 {
2156   "fab",                                /* name */
2157   NULL,                                 /* gate */
2158   execute_fold_all_builtins,            /* execute */
2159   NULL,                                 /* sub */
2160   NULL,                                 /* next */
2161   0,                                    /* static_pass_number */
2162   0,                                    /* tv_id */
2163   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
2164   0,                                    /* properties_provided */
2165   0,                                    /* properties_destroyed */
2166   0,                                    /* todo_flags_start */
2167   TODO_dump_func | TODO_verify_ssa      /* todo_flags_finish */
2168 };