OSDN Git Service

2012-10-08 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / gimple-fold.c
1 /* Statement simplification on GIMPLE.
2    Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
3    Split out from tree-ssa-ccp.c.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "function.h"
28 #include "dumpfile.h"
29 #include "tree-flow.h"
30 #include "tree-ssa-propagate.h"
31 #include "target.h"
32 #include "gimple-fold.h"
33
34 /* Return true when DECL can be referenced from current unit.
35    FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
36    We can get declarations that are not possible to reference for various
37    reasons:
38
39      1) When analyzing C++ virtual tables.
40         C++ virtual tables do have known constructors even
41         when they are keyed to other compilation unit.
42         Those tables can contain pointers to methods and vars
43         in other units.  Those methods have both STATIC and EXTERNAL
44         set.
45      2) In WHOPR mode devirtualization might lead to reference
46         to method that was partitioned elsehwere.
47         In this case we have static VAR_DECL or FUNCTION_DECL
48         that has no corresponding callgraph/varpool node
49         declaring the body.  
50      3) COMDAT functions referred by external vtables that
51         we devirtualize only during final copmilation stage.
52         At this time we already decided that we will not output
53         the function body and thus we can't reference the symbol
54         directly.  */
55
56 static bool
57 can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
58 {
59   struct varpool_node *vnode;
60   struct cgraph_node *node;
61   symtab_node snode;
62
63   /* We will later output the initializer, so we can refer to it.
64      So we are concerned only when DECL comes from initializer of
65      external var.  */
66   if (!from_decl
67       || TREE_CODE (from_decl) != VAR_DECL
68       || !DECL_EXTERNAL (from_decl)
69       || (flag_ltrans
70           && symtab_get_node (from_decl)->symbol.in_other_partition))
71     return true;
72   /* We are concerned only about static/external vars and functions.  */
73   if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
74       || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
75     return true;
76   /* Weakrefs have somewhat confusing DECL_EXTERNAL flag set; they
77      are always safe.  */
78   if (DECL_EXTERNAL (decl)
79       && lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
80     return true;
81   /* We are folding reference from external vtable.  The vtable may reffer
82      to a symbol keyed to other compilation unit.  The other compilation
83      unit may be in separate DSO and the symbol may be hidden.  */
84   if (DECL_VISIBILITY_SPECIFIED (decl)
85       && DECL_EXTERNAL (decl)
86       && (!(snode = symtab_get_node (decl)) || !snode->symbol.in_other_partition))
87     return false;
88   /* When function is public, we always can introduce new reference.
89      Exception are the COMDAT functions where introducing a direct
90      reference imply need to include function body in the curren tunit.  */
91   if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
92     return true;
93   /* We are not at ltrans stage; so don't worry about WHOPR.
94      Also when still gimplifying all referred comdat functions will be
95      produced.
96
97      As observed in PR20991 for already optimized out comdat virtual functions
98      it may be tempting to not necessarily give up because the copy will be
99      output elsewhere when corresponding vtable is output.  
100      This is however not possible - ABI specify that COMDATs are output in
101      units where they are used and when the other unit was compiled with LTO
102      it is possible that vtable was kept public while the function itself
103      was privatized. */
104   if (!flag_ltrans && (!DECL_COMDAT (decl) || !cgraph_function_flags_ready))
105     return true;
106
107   /* OK we are seeing either COMDAT or static variable.  In this case we must
108      check that the definition is still around so we can refer it.  */
109   if (TREE_CODE (decl) == FUNCTION_DECL)
110     {
111       node = cgraph_get_node (decl);
112       /* Check that we still have function body and that we didn't took
113          the decision to eliminate offline copy of the function yet.
114          The second is important when devirtualization happens during final
115          compilation stage when making a new reference no longer makes callee
116          to be compiled.  */
117       if (!node || !node->analyzed || node->global.inlined_to)
118         {
119           gcc_checking_assert (!TREE_ASM_WRITTEN (decl));
120           return false;
121         }
122     }
123   else if (TREE_CODE (decl) == VAR_DECL)
124     {
125       vnode = varpool_get_node (decl);
126       if (!vnode || !vnode->analyzed)
127         {
128           gcc_checking_assert (!TREE_ASM_WRITTEN (decl));
129           return false;
130         }
131     }
132   return true;
133 }
134
135 /* CVAL is value taken from DECL_INITIAL of variable.  Try to transform it into
136    acceptable form for is_gimple_min_invariant.
137    FROM_DECL (if non-NULL) specify variable whose constructor contains CVAL.  */
138
139 tree
140 canonicalize_constructor_val (tree cval, tree from_decl)
141 {
142   STRIP_USELESS_TYPE_CONVERSION (cval);
143   if (TREE_CODE (cval) == POINTER_PLUS_EXPR
144       && TREE_CODE (TREE_OPERAND (cval, 1)) == INTEGER_CST)
145     {
146       tree ptr = TREE_OPERAND (cval, 0);
147       if (is_gimple_min_invariant (ptr))
148         cval = build1_loc (EXPR_LOCATION (cval),
149                            ADDR_EXPR, TREE_TYPE (ptr),
150                            fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (ptr)),
151                                         ptr,
152                                         fold_convert (ptr_type_node,
153                                                       TREE_OPERAND (cval, 1))));
154     }
155   if (TREE_CODE (cval) == ADDR_EXPR)
156     {
157       tree base = NULL_TREE;
158       if (TREE_CODE (TREE_OPERAND (cval, 0)) == COMPOUND_LITERAL_EXPR)
159         {
160           base = COMPOUND_LITERAL_EXPR_DECL (TREE_OPERAND (cval, 0));
161           if (base)
162             TREE_OPERAND (cval, 0) = base;
163         }
164       else
165         base = get_base_address (TREE_OPERAND (cval, 0));
166       if (!base)
167         return NULL_TREE;
168
169       if ((TREE_CODE (base) == VAR_DECL
170            || TREE_CODE (base) == FUNCTION_DECL)
171           && !can_refer_decl_in_current_unit_p (base, from_decl))
172         return NULL_TREE;
173       if (TREE_CODE (base) == VAR_DECL)
174         TREE_ADDRESSABLE (base) = 1;
175       else if (TREE_CODE (base) == FUNCTION_DECL)
176         {
177           /* Make sure we create a cgraph node for functions we'll reference.
178              They can be non-existent if the reference comes from an entry
179              of an external vtable for example.  */
180           cgraph_get_create_node (base);
181         }
182       /* Fixup types in global initializers.  */
183       if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
184         cval = build_fold_addr_expr (TREE_OPERAND (cval, 0));
185     }
186   return cval;
187 }
188
189 /* If SYM is a constant variable with known value, return the value.
190    NULL_TREE is returned otherwise.  */
191
192 tree
193 get_symbol_constant_value (tree sym)
194 {
195   if (const_value_known_p (sym))
196     {
197       tree val = DECL_INITIAL (sym);
198       if (val)
199         {
200           val = canonicalize_constructor_val (val, sym);
201           if (val && is_gimple_min_invariant (val))
202             return val;
203           else
204             return NULL_TREE;
205         }
206       /* Variables declared 'const' without an initializer
207          have zero as the initializer if they may not be
208          overridden at link or run time.  */
209       if (!val
210           && (INTEGRAL_TYPE_P (TREE_TYPE (sym))
211                || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym))))
212         return build_zero_cst (TREE_TYPE (sym));
213     }
214
215   return NULL_TREE;
216 }
217
218
219
220 /* Subroutine of fold_stmt.  We perform several simplifications of the
221    memory reference tree EXPR and make sure to re-gimplify them properly
222    after propagation of constant addresses.  IS_LHS is true if the
223    reference is supposed to be an lvalue.  */
224
225 static tree
226 maybe_fold_reference (tree expr, bool is_lhs)
227 {
228   tree *t = &expr;
229   tree result;
230
231   if ((TREE_CODE (expr) == VIEW_CONVERT_EXPR
232        || TREE_CODE (expr) == REALPART_EXPR
233        || TREE_CODE (expr) == IMAGPART_EXPR)
234       && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0)))
235     return fold_unary_loc (EXPR_LOCATION (expr),
236                            TREE_CODE (expr),
237                            TREE_TYPE (expr),
238                            TREE_OPERAND (expr, 0));
239   else if (TREE_CODE (expr) == BIT_FIELD_REF
240            && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0)))
241     return fold_ternary_loc (EXPR_LOCATION (expr),
242                              TREE_CODE (expr),
243                              TREE_TYPE (expr),
244                              TREE_OPERAND (expr, 0),
245                              TREE_OPERAND (expr, 1),
246                              TREE_OPERAND (expr, 2));
247
248   while (handled_component_p (*t))
249     t = &TREE_OPERAND (*t, 0);
250
251   /* Canonicalize MEM_REFs invariant address operand.  Do this first
252      to avoid feeding non-canonical MEM_REFs elsewhere.  */
253   if (TREE_CODE (*t) == MEM_REF
254       && !is_gimple_mem_ref_addr (TREE_OPERAND (*t, 0)))
255     {
256       bool volatile_p = TREE_THIS_VOLATILE (*t);
257       tree tem = fold_binary (MEM_REF, TREE_TYPE (*t),
258                               TREE_OPERAND (*t, 0),
259                               TREE_OPERAND (*t, 1));
260       if (tem)
261         {
262           TREE_THIS_VOLATILE (tem) = volatile_p;
263           *t = tem;
264           tem = maybe_fold_reference (expr, is_lhs);
265           if (tem)
266             return tem;
267           return expr;
268         }
269     }
270
271   if (!is_lhs
272       && (result = fold_const_aggregate_ref (expr))
273       && is_gimple_min_invariant (result))
274     return result;
275
276   /* Fold back MEM_REFs to reference trees.  */
277   if (TREE_CODE (*t) == MEM_REF
278       && TREE_CODE (TREE_OPERAND (*t, 0)) == ADDR_EXPR
279       && integer_zerop (TREE_OPERAND (*t, 1))
280       && (TREE_THIS_VOLATILE (*t)
281           == TREE_THIS_VOLATILE (TREE_OPERAND (TREE_OPERAND (*t, 0), 0)))
282       && !TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (*t, 1)))
283       && (TYPE_MAIN_VARIANT (TREE_TYPE (*t))
284           == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_OPERAND (*t, 1)))))
285       /* We have to look out here to not drop a required conversion
286          from the rhs to the lhs if is_lhs, but we don't have the
287          rhs here to verify that.  Thus require strict type
288          compatibility.  */
289       && types_compatible_p (TREE_TYPE (*t),
290                              TREE_TYPE (TREE_OPERAND
291                                         (TREE_OPERAND (*t, 0), 0))))
292     {
293       tree tem;
294       *t = TREE_OPERAND (TREE_OPERAND (*t, 0), 0);
295       tem = maybe_fold_reference (expr, is_lhs);
296       if (tem)
297         return tem;
298       return expr;
299     }
300   else if (TREE_CODE (*t) == TARGET_MEM_REF)
301     {
302       tree tem = maybe_fold_tmr (*t);
303       if (tem)
304         {
305           *t = tem;
306           tem = maybe_fold_reference (expr, is_lhs);
307           if (tem)
308             return tem;
309           return expr;
310         }
311     }
312
313   return NULL_TREE;
314 }
315
316
317 /* Attempt to fold an assignment statement pointed-to by SI.  Returns a
318    replacement rhs for the statement or NULL_TREE if no simplification
319    could be made.  It is assumed that the operands have been previously
320    folded.  */
321
322 static tree
323 fold_gimple_assign (gimple_stmt_iterator *si)
324 {
325   gimple stmt = gsi_stmt (*si);
326   enum tree_code subcode = gimple_assign_rhs_code (stmt);
327   location_t loc = gimple_location (stmt);
328
329   tree result = NULL_TREE;
330
331   switch (get_gimple_rhs_class (subcode))
332     {
333     case GIMPLE_SINGLE_RHS:
334       {
335         tree rhs = gimple_assign_rhs1 (stmt);
336
337         if (REFERENCE_CLASS_P (rhs))
338           return maybe_fold_reference (rhs, false);
339
340         else if (TREE_CODE (rhs) == ADDR_EXPR)
341           {
342             tree ref = TREE_OPERAND (rhs, 0);
343             tree tem = maybe_fold_reference (ref, true);
344             if (tem
345                 && TREE_CODE (tem) == MEM_REF
346                 && integer_zerop (TREE_OPERAND (tem, 1)))
347               result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (tem, 0));
348             else if (tem)
349               result = fold_convert (TREE_TYPE (rhs),
350                                      build_fold_addr_expr_loc (loc, tem));
351             else if (TREE_CODE (ref) == MEM_REF
352                      && integer_zerop (TREE_OPERAND (ref, 1)))
353               result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (ref, 0));
354           }
355
356         else if (TREE_CODE (rhs) == CONSTRUCTOR
357                  && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
358                  && (CONSTRUCTOR_NELTS (rhs)
359                      == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
360           {
361             /* Fold a constant vector CONSTRUCTOR to VECTOR_CST.  */
362             unsigned i;
363             tree val;
364
365             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
366               if (TREE_CODE (val) != INTEGER_CST
367                   && TREE_CODE (val) != REAL_CST
368                   && TREE_CODE (val) != FIXED_CST)
369                 return NULL_TREE;
370
371             return build_vector_from_ctor (TREE_TYPE (rhs),
372                                            CONSTRUCTOR_ELTS (rhs));
373           }
374
375         else if (DECL_P (rhs))
376           return unshare_expr (get_symbol_constant_value (rhs));
377
378         /* If we couldn't fold the RHS, hand over to the generic
379            fold routines.  */
380         if (result == NULL_TREE)
381           result = fold (rhs);
382
383         /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR
384            that may have been added by fold, and "useless" type
385            conversions that might now be apparent due to propagation.  */
386         STRIP_USELESS_TYPE_CONVERSION (result);
387
388         if (result != rhs && valid_gimple_rhs_p (result))
389           return result;
390
391         return NULL_TREE;
392       }
393       break;
394
395     case GIMPLE_UNARY_RHS:
396       {
397         tree rhs = gimple_assign_rhs1 (stmt);
398
399         result = fold_unary_loc (loc, subcode, gimple_expr_type (stmt), rhs);
400         if (result)
401           {
402             /* If the operation was a conversion do _not_ mark a
403                resulting constant with TREE_OVERFLOW if the original
404                constant was not.  These conversions have implementation
405                defined behavior and retaining the TREE_OVERFLOW flag
406                here would confuse later passes such as VRP.  */
407             if (CONVERT_EXPR_CODE_P (subcode)
408                 && TREE_CODE (result) == INTEGER_CST
409                 && TREE_CODE (rhs) == INTEGER_CST)
410               TREE_OVERFLOW (result) = TREE_OVERFLOW (rhs);
411
412             STRIP_USELESS_TYPE_CONVERSION (result);
413             if (valid_gimple_rhs_p (result))
414               return result;
415           }
416       }
417       break;
418
419     case GIMPLE_BINARY_RHS:
420       /* Try to canonicalize for boolean-typed X the comparisons
421          X == 0, X == 1, X != 0, and X != 1.  */
422       if (gimple_assign_rhs_code (stmt) == EQ_EXPR
423           || gimple_assign_rhs_code (stmt) == NE_EXPR)
424         {
425           tree lhs = gimple_assign_lhs (stmt);
426           tree op1 = gimple_assign_rhs1 (stmt);
427           tree op2 = gimple_assign_rhs2 (stmt);
428           tree type = TREE_TYPE (op1);
429
430           /* Check whether the comparison operands are of the same boolean
431              type as the result type is.
432              Check that second operand is an integer-constant with value
433              one or zero.  */
434           if (TREE_CODE (op2) == INTEGER_CST
435               && (integer_zerop (op2) || integer_onep (op2))
436               && useless_type_conversion_p (TREE_TYPE (lhs), type))
437             {
438               enum tree_code cmp_code = gimple_assign_rhs_code (stmt);
439               bool is_logical_not = false;
440
441               /* X == 0 and X != 1 is a logical-not.of X
442                  X == 1 and X != 0 is X  */
443               if ((cmp_code == EQ_EXPR && integer_zerop (op2))
444                   || (cmp_code == NE_EXPR && integer_onep (op2)))
445                 is_logical_not = true;
446
447               if (is_logical_not == false)
448                 result = op1;
449               /* Only for one-bit precision typed X the transformation
450                  !X -> ~X is valied.  */
451               else if (TYPE_PRECISION (type) == 1)
452                 result = build1_loc (gimple_location (stmt), BIT_NOT_EXPR,
453                                      type, op1);
454               /* Otherwise we use !X -> X ^ 1.  */
455               else
456                 result = build2_loc (gimple_location (stmt), BIT_XOR_EXPR,
457                                      type, op1, build_int_cst (type, 1));
458              
459             }
460         }
461
462       if (!result)
463         result = fold_binary_loc (loc, subcode,
464                                   TREE_TYPE (gimple_assign_lhs (stmt)),
465                                   gimple_assign_rhs1 (stmt),
466                                   gimple_assign_rhs2 (stmt));
467
468       if (result)
469         {
470           STRIP_USELESS_TYPE_CONVERSION (result);
471           if (valid_gimple_rhs_p (result))
472             return result;
473         }
474       break;
475
476     case GIMPLE_TERNARY_RHS:
477       /* Try to fold a conditional expression.  */
478       if (gimple_assign_rhs_code (stmt) == COND_EXPR)
479         {
480           tree op0 = gimple_assign_rhs1 (stmt);
481           tree tem;
482           bool set = false;
483           location_t cond_loc = gimple_location (stmt);
484
485           if (COMPARISON_CLASS_P (op0))
486             {
487               fold_defer_overflow_warnings ();
488               tem = fold_binary_loc (cond_loc,
489                                      TREE_CODE (op0), TREE_TYPE (op0),
490                                      TREE_OPERAND (op0, 0),
491                                      TREE_OPERAND (op0, 1));
492               /* This is actually a conditional expression, not a GIMPLE
493                  conditional statement, however, the valid_gimple_rhs_p
494                  test still applies.  */
495               set = (tem && is_gimple_condexpr (tem)
496                      && valid_gimple_rhs_p (tem));
497               fold_undefer_overflow_warnings (set, stmt, 0);
498             }
499           else if (is_gimple_min_invariant (op0))
500             {
501               tem = op0;
502               set = true;
503             }
504           else
505             return NULL_TREE;
506
507           if (set)
508             result = fold_build3_loc (cond_loc, COND_EXPR,
509                                       TREE_TYPE (gimple_assign_lhs (stmt)), tem,
510                                       gimple_assign_rhs2 (stmt),
511                                       gimple_assign_rhs3 (stmt));
512         }
513
514       if (!result)
515         result = fold_ternary_loc (loc, subcode,
516                                    TREE_TYPE (gimple_assign_lhs (stmt)),
517                                    gimple_assign_rhs1 (stmt),
518                                    gimple_assign_rhs2 (stmt),
519                                    gimple_assign_rhs3 (stmt));
520
521       if (result)
522         {
523           STRIP_USELESS_TYPE_CONVERSION (result);
524           if (valid_gimple_rhs_p (result))
525             return result;
526         }
527       break;
528
529     case GIMPLE_INVALID_RHS:
530       gcc_unreachable ();
531     }
532
533   return NULL_TREE;
534 }
535
536 /* Attempt to fold a conditional statement. Return true if any changes were
537    made. We only attempt to fold the condition expression, and do not perform
538    any transformation that would require alteration of the cfg.  It is
539    assumed that the operands have been previously folded.  */
540
541 static bool
542 fold_gimple_cond (gimple stmt)
543 {
544   tree result = fold_binary_loc (gimple_location (stmt),
545                              gimple_cond_code (stmt),
546                              boolean_type_node,
547                              gimple_cond_lhs (stmt),
548                              gimple_cond_rhs (stmt));
549
550   if (result)
551     {
552       STRIP_USELESS_TYPE_CONVERSION (result);
553       if (is_gimple_condexpr (result) && valid_gimple_rhs_p (result))
554         {
555           gimple_cond_set_condition_from_tree (stmt, result);
556           return true;
557         }
558     }
559
560   return false;
561 }
562
563 /* Convert EXPR into a GIMPLE value suitable for substitution on the
564    RHS of an assignment.  Insert the necessary statements before
565    iterator *SI_P.  The statement at *SI_P, which must be a GIMPLE_CALL
566    is replaced.  If the call is expected to produces a result, then it
567    is replaced by an assignment of the new RHS to the result variable.
568    If the result is to be ignored, then the call is replaced by a
569    GIMPLE_NOP.  A proper VDEF chain is retained by making the first
570    VUSE and the last VDEF of the whole sequence be the same as the replaced
571    statement and using new SSA names for stores in between.  */
572
573 void
574 gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr)
575 {
576   tree lhs;
577   gimple stmt, new_stmt;
578   gimple_stmt_iterator i;
579   gimple_seq stmts = NULL;
580   struct gimplify_ctx gctx;
581   gimple laststore;
582   tree reaching_vuse;
583
584   stmt = gsi_stmt (*si_p);
585
586   gcc_assert (is_gimple_call (stmt));
587
588   push_gimplify_context (&gctx);
589   gctx.into_ssa = gimple_in_ssa_p (cfun);
590
591   lhs = gimple_call_lhs (stmt);
592   if (lhs == NULL_TREE)
593     {
594       gimplify_and_add (expr, &stmts);
595       /* We can end up with folding a memcpy of an empty class assignment
596          which gets optimized away by C++ gimplification.  */
597       if (gimple_seq_empty_p (stmts))
598         {
599           pop_gimplify_context (NULL);
600           if (gimple_in_ssa_p (cfun))
601             {
602               unlink_stmt_vdef (stmt);
603               release_defs (stmt);
604             }
605           gsi_remove (si_p, true);
606           return;
607         }
608     }
609   else
610     {
611       tree tmp = get_initialized_tmp_var (expr, &stmts, NULL);
612       new_stmt = gimple_build_assign (lhs, tmp);
613       i = gsi_last (stmts);
614       gsi_insert_after_without_update (&i, new_stmt,
615                                        GSI_CONTINUE_LINKING);
616     }
617
618   pop_gimplify_context (NULL);
619
620   if (gimple_has_location (stmt))
621     annotate_all_with_location (stmts, gimple_location (stmt));
622
623   /* First iterate over the replacement statements backward, assigning
624      virtual operands to their defining statements.  */
625   laststore = NULL;
626   for (i = gsi_last (stmts); !gsi_end_p (i); gsi_prev (&i))
627     {
628       new_stmt = gsi_stmt (i);
629       if ((gimple_assign_single_p (new_stmt)
630            && !is_gimple_reg (gimple_assign_lhs (new_stmt)))
631           || (is_gimple_call (new_stmt)
632               && (gimple_call_flags (new_stmt)
633                   & (ECF_NOVOPS | ECF_PURE | ECF_CONST | ECF_NORETURN)) == 0))
634         {
635           tree vdef;
636           if (!laststore)
637             vdef = gimple_vdef (stmt);
638           else
639             vdef = make_ssa_name (gimple_vop (cfun), new_stmt);
640           gimple_set_vdef (new_stmt, vdef);
641           if (vdef && TREE_CODE (vdef) == SSA_NAME)
642             SSA_NAME_DEF_STMT (vdef) = new_stmt;
643           laststore = new_stmt;
644         }
645     }
646
647   /* Second iterate over the statements forward, assigning virtual
648      operands to their uses.  */
649   reaching_vuse = gimple_vuse (stmt);
650   for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
651     {
652       new_stmt = gsi_stmt (i);
653       /* If the new statement possibly has a VUSE, update it with exact SSA
654          name we know will reach this one.  */
655       if (gimple_has_mem_ops (new_stmt))
656         gimple_set_vuse (new_stmt, reaching_vuse);
657       gimple_set_modified (new_stmt, true);
658       if (gimple_vdef (new_stmt))
659         reaching_vuse = gimple_vdef (new_stmt);
660     }
661
662   /* If the new sequence does not do a store release the virtual
663      definition of the original statement.  */
664   if (reaching_vuse
665       && reaching_vuse == gimple_vuse (stmt))
666     {
667       tree vdef = gimple_vdef (stmt);
668       if (vdef
669           && TREE_CODE (vdef) == SSA_NAME)
670         {
671           unlink_stmt_vdef (stmt);
672           release_ssa_name (vdef);
673         }
674     }
675
676   /* Finally replace the original statement with the sequence.  */
677   gsi_replace_with_seq (si_p, stmts, false);
678 }
679
680 /* Return the string length, maximum string length or maximum value of
681    ARG in LENGTH.
682    If ARG is an SSA name variable, follow its use-def chains.  If LENGTH
683    is not NULL and, for TYPE == 0, its value is not equal to the length
684    we determine or if we are unable to determine the length or value,
685    return false.  VISITED is a bitmap of visited variables.
686    TYPE is 0 if string length should be returned, 1 for maximum string
687    length and 2 for maximum value ARG can have.  */
688
689 static bool
690 get_maxval_strlen (tree arg, tree *length, bitmap visited, int type)
691 {
692   tree var, val;
693   gimple def_stmt;
694
695   if (TREE_CODE (arg) != SSA_NAME)
696     {
697       /* We can end up with &(*iftmp_1)[0] here as well, so handle it.  */
698       if (TREE_CODE (arg) == ADDR_EXPR
699           && TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF
700           && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg, 0), 1)))
701         {
702           tree aop0 = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
703           if (TREE_CODE (aop0) == INDIRECT_REF
704               && TREE_CODE (TREE_OPERAND (aop0, 0)) == SSA_NAME)
705             return get_maxval_strlen (TREE_OPERAND (aop0, 0),
706                                       length, visited, type);
707         }
708
709       if (type == 2)
710         {
711           val = arg;
712           if (TREE_CODE (val) != INTEGER_CST
713               || tree_int_cst_sgn (val) < 0)
714             return false;
715         }
716       else
717         val = c_strlen (arg, 1);
718       if (!val)
719         return false;
720
721       if (*length)
722         {
723           if (type > 0)
724             {
725               if (TREE_CODE (*length) != INTEGER_CST
726                   || TREE_CODE (val) != INTEGER_CST)
727                 return false;
728
729               if (tree_int_cst_lt (*length, val))
730                 *length = val;
731               return true;
732             }
733           else if (simple_cst_equal (val, *length) != 1)
734             return false;
735         }
736
737       *length = val;
738       return true;
739     }
740
741   /* If ARG is registered for SSA update we cannot look at its defining
742      statement.  */
743   if (name_registered_for_update_p (arg))
744     return false;
745
746   /* If we were already here, break the infinite cycle.  */
747   if (!bitmap_set_bit (visited, SSA_NAME_VERSION (arg)))
748     return true;
749
750   var = arg;
751   def_stmt = SSA_NAME_DEF_STMT (var);
752
753   switch (gimple_code (def_stmt))
754     {
755       case GIMPLE_ASSIGN:
756         /* The RHS of the statement defining VAR must either have a
757            constant length or come from another SSA_NAME with a constant
758            length.  */
759         if (gimple_assign_single_p (def_stmt)
760             || gimple_assign_unary_nop_p (def_stmt))
761           {
762             tree rhs = gimple_assign_rhs1 (def_stmt);
763             return get_maxval_strlen (rhs, length, visited, type);
764           }
765         else if (gimple_assign_rhs_code (def_stmt) == COND_EXPR)
766           {
767             tree op2 = gimple_assign_rhs2 (def_stmt);
768             tree op3 = gimple_assign_rhs3 (def_stmt);
769             return get_maxval_strlen (op2, length, visited, type)
770                    && get_maxval_strlen (op3, length, visited, type);
771           }
772         return false;
773
774       case GIMPLE_PHI:
775         {
776           /* All the arguments of the PHI node must have the same constant
777              length.  */
778           unsigned i;
779
780           for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
781           {
782             tree arg = gimple_phi_arg (def_stmt, i)->def;
783
784             /* If this PHI has itself as an argument, we cannot
785                determine the string length of this argument.  However,
786                if we can find a constant string length for the other
787                PHI args then we can still be sure that this is a
788                constant string length.  So be optimistic and just
789                continue with the next argument.  */
790             if (arg == gimple_phi_result (def_stmt))
791               continue;
792
793             if (!get_maxval_strlen (arg, length, visited, type))
794               return false;
795           }
796         }
797         return true;
798
799       default:
800         return false;
801     }
802 }
803
804
805 /* Fold builtin call in statement STMT.  Returns a simplified tree.
806    We may return a non-constant expression, including another call
807    to a different function and with different arguments, e.g.,
808    substituting memcpy for strcpy when the string length is known.
809    Note that some builtins expand into inline code that may not
810    be valid in GIMPLE.  Callers must take care.  */
811
812 tree
813 gimple_fold_builtin (gimple stmt)
814 {
815   tree result, val[3];
816   tree callee, a;
817   int arg_idx, type;
818   bitmap visited;
819   bool ignore;
820   int nargs;
821   location_t loc = gimple_location (stmt);
822
823   gcc_assert (is_gimple_call (stmt));
824
825   ignore = (gimple_call_lhs (stmt) == NULL);
826
827   /* First try the generic builtin folder.  If that succeeds, return the
828      result directly.  */
829   result = fold_call_stmt (stmt, ignore);
830   if (result)
831     {
832       if (ignore)
833         STRIP_NOPS (result);
834       return result;
835     }
836
837   /* Ignore MD builtins.  */
838   callee = gimple_call_fndecl (stmt);
839   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
840     return NULL_TREE;
841
842   /* Give up for always_inline inline builtins until they are
843      inlined.  */
844   if (avoid_folding_inline_builtin (callee))
845     return NULL_TREE;
846
847   /* If the builtin could not be folded, and it has no argument list,
848      we're done.  */
849   nargs = gimple_call_num_args (stmt);
850   if (nargs == 0)
851     return NULL_TREE;
852
853   /* Limit the work only for builtins we know how to simplify.  */
854   switch (DECL_FUNCTION_CODE (callee))
855     {
856     case BUILT_IN_STRLEN:
857     case BUILT_IN_FPUTS:
858     case BUILT_IN_FPUTS_UNLOCKED:
859       arg_idx = 0;
860       type = 0;
861       break;
862     case BUILT_IN_STRCPY:
863     case BUILT_IN_STRNCPY:
864       arg_idx = 1;
865       type = 0;
866       break;
867     case BUILT_IN_MEMCPY_CHK:
868     case BUILT_IN_MEMPCPY_CHK:
869     case BUILT_IN_MEMMOVE_CHK:
870     case BUILT_IN_MEMSET_CHK:
871     case BUILT_IN_STRNCPY_CHK:
872     case BUILT_IN_STPNCPY_CHK:
873       arg_idx = 2;
874       type = 2;
875       break;
876     case BUILT_IN_STRCPY_CHK:
877     case BUILT_IN_STPCPY_CHK:
878       arg_idx = 1;
879       type = 1;
880       break;
881     case BUILT_IN_SNPRINTF_CHK:
882     case BUILT_IN_VSNPRINTF_CHK:
883       arg_idx = 1;
884       type = 2;
885       break;
886     default:
887       return NULL_TREE;
888     }
889
890   if (arg_idx >= nargs)
891     return NULL_TREE;
892
893   /* Try to use the dataflow information gathered by the CCP process.  */
894   visited = BITMAP_ALLOC (NULL);
895   bitmap_clear (visited);
896
897   memset (val, 0, sizeof (val));
898   a = gimple_call_arg (stmt, arg_idx);
899   if (!get_maxval_strlen (a, &val[arg_idx], visited, type))
900     val[arg_idx] = NULL_TREE;
901
902   BITMAP_FREE (visited);
903
904   result = NULL_TREE;
905   switch (DECL_FUNCTION_CODE (callee))
906     {
907     case BUILT_IN_STRLEN:
908       if (val[0] && nargs == 1)
909         {
910           tree new_val =
911               fold_convert (TREE_TYPE (gimple_call_lhs (stmt)), val[0]);
912
913           /* If the result is not a valid gimple value, or not a cast
914              of a valid gimple value, then we cannot use the result.  */
915           if (is_gimple_val (new_val)
916               || (CONVERT_EXPR_P (new_val)
917                   && is_gimple_val (TREE_OPERAND (new_val, 0))))
918             return new_val;
919         }
920       break;
921
922     case BUILT_IN_STRCPY:
923       if (val[1] && is_gimple_val (val[1]) && nargs == 2)
924         result = fold_builtin_strcpy (loc, callee,
925                                       gimple_call_arg (stmt, 0),
926                                       gimple_call_arg (stmt, 1),
927                                       val[1]);
928       break;
929
930     case BUILT_IN_STRNCPY:
931       if (val[1] && is_gimple_val (val[1]) && nargs == 3)
932         result = fold_builtin_strncpy (loc, callee,
933                                        gimple_call_arg (stmt, 0),
934                                        gimple_call_arg (stmt, 1),
935                                        gimple_call_arg (stmt, 2),
936                                        val[1]);
937       break;
938
939     case BUILT_IN_FPUTS:
940       if (nargs == 2)
941         result = fold_builtin_fputs (loc, gimple_call_arg (stmt, 0),
942                                      gimple_call_arg (stmt, 1),
943                                      ignore, false, val[0]);
944       break;
945
946     case BUILT_IN_FPUTS_UNLOCKED:
947       if (nargs == 2)
948         result = fold_builtin_fputs (loc, gimple_call_arg (stmt, 0),
949                                      gimple_call_arg (stmt, 1),
950                                      ignore, true, val[0]);
951       break;
952
953     case BUILT_IN_MEMCPY_CHK:
954     case BUILT_IN_MEMPCPY_CHK:
955     case BUILT_IN_MEMMOVE_CHK:
956     case BUILT_IN_MEMSET_CHK:
957       if (val[2] && is_gimple_val (val[2]) && nargs == 4)
958         result = fold_builtin_memory_chk (loc, callee,
959                                           gimple_call_arg (stmt, 0),
960                                           gimple_call_arg (stmt, 1),
961                                           gimple_call_arg (stmt, 2),
962                                           gimple_call_arg (stmt, 3),
963                                           val[2], ignore,
964                                           DECL_FUNCTION_CODE (callee));
965       break;
966
967     case BUILT_IN_STRCPY_CHK:
968     case BUILT_IN_STPCPY_CHK:
969       if (val[1] && is_gimple_val (val[1]) && nargs == 3)
970         result = fold_builtin_stxcpy_chk (loc, callee,
971                                           gimple_call_arg (stmt, 0),
972                                           gimple_call_arg (stmt, 1),
973                                           gimple_call_arg (stmt, 2),
974                                           val[1], ignore,
975                                           DECL_FUNCTION_CODE (callee));
976       break;
977
978     case BUILT_IN_STRNCPY_CHK:
979     case BUILT_IN_STPNCPY_CHK:
980       if (val[2] && is_gimple_val (val[2]) && nargs == 4)
981         result = fold_builtin_stxncpy_chk (loc, gimple_call_arg (stmt, 0),
982                                            gimple_call_arg (stmt, 1),
983                                            gimple_call_arg (stmt, 2),
984                                            gimple_call_arg (stmt, 3),
985                                            val[2], ignore,
986                                            DECL_FUNCTION_CODE (callee));
987       break;
988
989     case BUILT_IN_SNPRINTF_CHK:
990     case BUILT_IN_VSNPRINTF_CHK:
991       if (val[1] && is_gimple_val (val[1]))
992         result = gimple_fold_builtin_snprintf_chk (stmt, val[1],
993                                                    DECL_FUNCTION_CODE (callee));
994       break;
995
996     default:
997       gcc_unreachable ();
998     }
999
1000   if (result && ignore)
1001     result = fold_ignored_result (result);
1002   return result;
1003 }
1004
1005
1006 /* Return a binfo to be used for devirtualization of calls based on an object
1007    represented by a declaration (i.e. a global or automatically allocated one)
1008    or NULL if it cannot be found or is not safe.  CST is expected to be an
1009    ADDR_EXPR of such object or the function will return NULL.  Currently it is
1010    safe to use such binfo only if it has no base binfo (i.e. no ancestors).  */
1011
1012 tree
1013 gimple_extract_devirt_binfo_from_cst (tree cst)
1014 {
1015   HOST_WIDE_INT offset, size, max_size;
1016   tree base, type, expected_type, binfo;
1017   bool last_artificial = false;
1018
1019   if (!flag_devirtualize
1020       || TREE_CODE (cst) != ADDR_EXPR
1021       || TREE_CODE (TREE_TYPE (TREE_TYPE (cst))) != RECORD_TYPE)
1022     return NULL_TREE;
1023
1024   cst = TREE_OPERAND (cst, 0);
1025   expected_type = TREE_TYPE (cst);
1026   base = get_ref_base_and_extent (cst, &offset, &size, &max_size);
1027   type = TREE_TYPE (base);
1028   if (!DECL_P (base)
1029       || max_size == -1
1030       || max_size != size
1031       || TREE_CODE (type) != RECORD_TYPE)
1032     return NULL_TREE;
1033
1034   /* Find the sub-object the constant actually refers to and mark whether it is
1035      an artificial one (as opposed to a user-defined one).  */
1036   while (true)
1037     {
1038       HOST_WIDE_INT pos, size;
1039       tree fld;
1040
1041       if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (expected_type))
1042         break;
1043       if (offset < 0)
1044         return NULL_TREE;
1045
1046       for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
1047         {
1048           if (TREE_CODE (fld) != FIELD_DECL)
1049             continue;
1050
1051           pos = int_bit_position (fld);
1052           size = tree_low_cst (DECL_SIZE (fld), 1);
1053           if (pos <= offset && (pos + size) > offset)
1054             break;
1055         }
1056       if (!fld || TREE_CODE (TREE_TYPE (fld)) != RECORD_TYPE)
1057         return NULL_TREE;
1058
1059       last_artificial = DECL_ARTIFICIAL (fld);
1060       type = TREE_TYPE (fld);
1061       offset -= pos;
1062     }
1063   /* Artificial sub-objects are ancestors, we do not want to use them for
1064      devirtualization, at least not here.  */
1065   if (last_artificial)
1066     return NULL_TREE;
1067   binfo = TYPE_BINFO (type);
1068   if (!binfo || BINFO_N_BASE_BINFOS (binfo) > 0)
1069     return NULL_TREE;
1070   else
1071     return binfo;
1072 }
1073
1074 /* Attempt to fold a call statement referenced by the statement iterator GSI.
1075    The statement may be replaced by another statement, e.g., if the call
1076    simplifies to a constant value. Return true if any changes were made.
1077    It is assumed that the operands have been previously folded.  */
1078
1079 static bool
1080 gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
1081 {
1082   gimple stmt = gsi_stmt (*gsi);
1083   tree callee;
1084   bool changed = false;
1085   unsigned i;
1086
1087   /* Fold *& in call arguments.  */
1088   for (i = 0; i < gimple_call_num_args (stmt); ++i)
1089     if (REFERENCE_CLASS_P (gimple_call_arg (stmt, i)))
1090       {
1091         tree tmp = maybe_fold_reference (gimple_call_arg (stmt, i), false);
1092         if (tmp)
1093           {
1094             gimple_call_set_arg (stmt, i, tmp);
1095             changed = true;
1096           }
1097       }
1098
1099   /* Check for virtual calls that became direct calls.  */
1100   callee = gimple_call_fn (stmt);
1101   if (callee && TREE_CODE (callee) == OBJ_TYPE_REF)
1102     {
1103       if (gimple_call_addr_fndecl (OBJ_TYPE_REF_EXPR (callee)) != NULL_TREE)
1104         {
1105           gimple_call_set_fn (stmt, OBJ_TYPE_REF_EXPR (callee));
1106           changed = true;
1107         }
1108       else
1109         {
1110           tree obj = OBJ_TYPE_REF_OBJECT (callee);
1111           tree binfo = gimple_extract_devirt_binfo_from_cst (obj);
1112           if (binfo)
1113             {
1114               HOST_WIDE_INT token
1115                 = TREE_INT_CST_LOW (OBJ_TYPE_REF_TOKEN (callee));
1116               tree fndecl = gimple_get_virt_method_for_binfo (token, binfo);
1117               if (fndecl)
1118                 {
1119                   gimple_call_set_fndecl (stmt, fndecl);
1120                   changed = true;
1121                 }
1122             }
1123         }
1124     }
1125
1126   if (inplace)
1127     return changed;
1128
1129   /* Check for builtins that CCP can handle using information not
1130      available in the generic fold routines.  */
1131   callee = gimple_call_fndecl (stmt);
1132   if (callee && DECL_BUILT_IN (callee))
1133     {
1134       tree result = gimple_fold_builtin (stmt);
1135       if (result)
1136         {
1137           if (!update_call_from_tree (gsi, result))
1138             gimplify_and_update_call_from_tree (gsi, result);
1139           changed = true;
1140         }
1141     }
1142
1143   return changed;
1144 }
1145
1146 /* Worker for both fold_stmt and fold_stmt_inplace.  The INPLACE argument
1147    distinguishes both cases.  */
1148
1149 static bool
1150 fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
1151 {
1152   bool changed = false;
1153   gimple stmt = gsi_stmt (*gsi);
1154   unsigned i;
1155   gimple_stmt_iterator gsinext = *gsi;
1156   gimple next_stmt;
1157
1158   gsi_next (&gsinext);
1159   next_stmt = gsi_end_p (gsinext) ? NULL : gsi_stmt (gsinext);
1160
1161   /* Fold the main computation performed by the statement.  */
1162   switch (gimple_code (stmt))
1163     {
1164     case GIMPLE_ASSIGN:
1165       {
1166         unsigned old_num_ops = gimple_num_ops (stmt);
1167         enum tree_code subcode = gimple_assign_rhs_code (stmt);
1168         tree lhs = gimple_assign_lhs (stmt);
1169         tree new_rhs;
1170         /* First canonicalize operand order.  This avoids building new
1171            trees if this is the only thing fold would later do.  */
1172         if ((commutative_tree_code (subcode)
1173              || commutative_ternary_tree_code (subcode))
1174             && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
1175                                      gimple_assign_rhs2 (stmt), false))
1176           {
1177             tree tem = gimple_assign_rhs1 (stmt);
1178             gimple_assign_set_rhs1 (stmt, gimple_assign_rhs2 (stmt));
1179             gimple_assign_set_rhs2 (stmt, tem);
1180             changed = true;
1181           }
1182         new_rhs = fold_gimple_assign (gsi);
1183         if (new_rhs
1184             && !useless_type_conversion_p (TREE_TYPE (lhs),
1185                                            TREE_TYPE (new_rhs)))
1186           new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
1187         if (new_rhs
1188             && (!inplace
1189                 || get_gimple_rhs_num_ops (TREE_CODE (new_rhs)) < old_num_ops))
1190           {
1191             gimple_assign_set_rhs_from_tree (gsi, new_rhs);
1192             changed = true;
1193           }
1194         break;
1195       }
1196
1197     case GIMPLE_COND:
1198       changed |= fold_gimple_cond (stmt);
1199       break;
1200
1201     case GIMPLE_CALL:
1202       changed |= gimple_fold_call (gsi, inplace);
1203       break;
1204
1205     case GIMPLE_ASM:
1206       /* Fold *& in asm operands.  */
1207       {
1208         size_t noutputs;
1209         const char **oconstraints;
1210         const char *constraint;
1211         bool allows_mem, allows_reg;
1212
1213         noutputs = gimple_asm_noutputs (stmt);
1214         oconstraints = XALLOCAVEC (const char *, noutputs);
1215
1216         for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
1217           {
1218             tree link = gimple_asm_output_op (stmt, i);
1219             tree op = TREE_VALUE (link);
1220             oconstraints[i]
1221               = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1222             if (REFERENCE_CLASS_P (op)
1223                 && (op = maybe_fold_reference (op, true)) != NULL_TREE)
1224               {
1225                 TREE_VALUE (link) = op;
1226                 changed = true;
1227               }
1228           }
1229         for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
1230           {
1231             tree link = gimple_asm_input_op (stmt, i);
1232             tree op = TREE_VALUE (link);
1233             constraint
1234               = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1235             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
1236                                     oconstraints, &allows_mem, &allows_reg);
1237             if (REFERENCE_CLASS_P (op)
1238                 && (op = maybe_fold_reference (op, !allows_reg && allows_mem))
1239                    != NULL_TREE)
1240               {
1241                 TREE_VALUE (link) = op;
1242                 changed = true;
1243               }
1244           }
1245       }
1246       break;
1247
1248     case GIMPLE_DEBUG:
1249       if (gimple_debug_bind_p (stmt))
1250         {
1251           tree val = gimple_debug_bind_get_value (stmt);
1252           if (val
1253               && REFERENCE_CLASS_P (val))
1254             {
1255               tree tem = maybe_fold_reference (val, false);
1256               if (tem)
1257                 {
1258                   gimple_debug_bind_set_value (stmt, tem);
1259                   changed = true;
1260                 }
1261             }
1262           else if (val
1263                    && TREE_CODE (val) == ADDR_EXPR)
1264             {
1265               tree ref = TREE_OPERAND (val, 0);
1266               tree tem = maybe_fold_reference (ref, false);
1267               if (tem)
1268                 {
1269                   tem = build_fold_addr_expr_with_type (tem, TREE_TYPE (val));
1270                   gimple_debug_bind_set_value (stmt, tem);
1271                   changed = true;
1272                 }
1273             }
1274         }
1275       break;
1276
1277     default:;
1278     }
1279
1280   /* If stmt folds into nothing and it was the last stmt in a bb,
1281      don't call gsi_stmt.  */
1282   if (gsi_end_p (*gsi))
1283     {
1284       gcc_assert (next_stmt == NULL);
1285       return changed;
1286     }
1287
1288   stmt = gsi_stmt (*gsi);
1289
1290   /* Fold *& on the lhs.  Don't do this if stmt folded into nothing,
1291      as we'd changing the next stmt.  */
1292   if (gimple_has_lhs (stmt) && stmt != next_stmt)
1293     {
1294       tree lhs = gimple_get_lhs (stmt);
1295       if (lhs && REFERENCE_CLASS_P (lhs))
1296         {
1297           tree new_lhs = maybe_fold_reference (lhs, true);
1298           if (new_lhs)
1299             {
1300               gimple_set_lhs (stmt, new_lhs);
1301               changed = true;
1302             }
1303         }
1304     }
1305
1306   return changed;
1307 }
1308
1309 /* Fold the statement pointed to by GSI.  In some cases, this function may
1310    replace the whole statement with a new one.  Returns true iff folding
1311    makes any changes.
1312    The statement pointed to by GSI should be in valid gimple form but may
1313    be in unfolded state as resulting from for example constant propagation
1314    which can produce *&x = 0.  */
1315
1316 bool
1317 fold_stmt (gimple_stmt_iterator *gsi)
1318 {
1319   return fold_stmt_1 (gsi, false);
1320 }
1321
1322 /* Perform the minimal folding on statement *GSI.  Only operations like
1323    *&x created by constant propagation are handled.  The statement cannot
1324    be replaced with a new one.  Return true if the statement was
1325    changed, false otherwise.
1326    The statement *GSI should be in valid gimple form but may
1327    be in unfolded state as resulting from for example constant propagation
1328    which can produce *&x = 0.  */
1329
1330 bool
1331 fold_stmt_inplace (gimple_stmt_iterator *gsi)
1332 {
1333   gimple stmt = gsi_stmt (*gsi);
1334   bool changed = fold_stmt_1 (gsi, true);
1335   gcc_assert (gsi_stmt (*gsi) == stmt);
1336   return changed;
1337 }
1338
1339 /* Canonicalize and possibly invert the boolean EXPR; return NULL_TREE 
1340    if EXPR is null or we don't know how.
1341    If non-null, the result always has boolean type.  */
1342
1343 static tree
1344 canonicalize_bool (tree expr, bool invert)
1345 {
1346   if (!expr)
1347     return NULL_TREE;
1348   else if (invert)
1349     {
1350       if (integer_nonzerop (expr))
1351         return boolean_false_node;
1352       else if (integer_zerop (expr))
1353         return boolean_true_node;
1354       else if (TREE_CODE (expr) == SSA_NAME)
1355         return fold_build2 (EQ_EXPR, boolean_type_node, expr,
1356                             build_int_cst (TREE_TYPE (expr), 0));
1357       else if (TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison)
1358         return fold_build2 (invert_tree_comparison (TREE_CODE (expr), false),
1359                             boolean_type_node,
1360                             TREE_OPERAND (expr, 0),
1361                             TREE_OPERAND (expr, 1));
1362       else
1363         return NULL_TREE;
1364     }
1365   else
1366     {
1367       if (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE)
1368         return expr;
1369       if (integer_nonzerop (expr))
1370         return boolean_true_node;
1371       else if (integer_zerop (expr))
1372         return boolean_false_node;
1373       else if (TREE_CODE (expr) == SSA_NAME)
1374         return fold_build2 (NE_EXPR, boolean_type_node, expr,
1375                             build_int_cst (TREE_TYPE (expr), 0));
1376       else if (TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison)
1377         return fold_build2 (TREE_CODE (expr),
1378                             boolean_type_node,
1379                             TREE_OPERAND (expr, 0),
1380                             TREE_OPERAND (expr, 1));
1381       else
1382         return NULL_TREE;
1383     }
1384 }
1385
1386 /* Check to see if a boolean expression EXPR is logically equivalent to the
1387    comparison (OP1 CODE OP2).  Check for various identities involving
1388    SSA_NAMEs.  */
1389
1390 static bool
1391 same_bool_comparison_p (const_tree expr, enum tree_code code,
1392                         const_tree op1, const_tree op2)
1393 {
1394   gimple s;
1395
1396   /* The obvious case.  */
1397   if (TREE_CODE (expr) == code
1398       && operand_equal_p (TREE_OPERAND (expr, 0), op1, 0)
1399       && operand_equal_p (TREE_OPERAND (expr, 1), op2, 0))
1400     return true;
1401
1402   /* Check for comparing (name, name != 0) and the case where expr
1403      is an SSA_NAME with a definition matching the comparison.  */
1404   if (TREE_CODE (expr) == SSA_NAME
1405       && TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE)
1406     {
1407       if (operand_equal_p (expr, op1, 0))
1408         return ((code == NE_EXPR && integer_zerop (op2))
1409                 || (code == EQ_EXPR && integer_nonzerop (op2)));
1410       s = SSA_NAME_DEF_STMT (expr);
1411       if (is_gimple_assign (s)
1412           && gimple_assign_rhs_code (s) == code
1413           && operand_equal_p (gimple_assign_rhs1 (s), op1, 0)
1414           && operand_equal_p (gimple_assign_rhs2 (s), op2, 0))
1415         return true;
1416     }
1417
1418   /* If op1 is of the form (name != 0) or (name == 0), and the definition
1419      of name is a comparison, recurse.  */
1420   if (TREE_CODE (op1) == SSA_NAME
1421       && TREE_CODE (TREE_TYPE (op1)) == BOOLEAN_TYPE)
1422     {
1423       s = SSA_NAME_DEF_STMT (op1);
1424       if (is_gimple_assign (s)
1425           && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison)
1426         {
1427           enum tree_code c = gimple_assign_rhs_code (s);
1428           if ((c == NE_EXPR && integer_zerop (op2))
1429               || (c == EQ_EXPR && integer_nonzerop (op2)))
1430             return same_bool_comparison_p (expr, c,
1431                                            gimple_assign_rhs1 (s),
1432                                            gimple_assign_rhs2 (s));
1433           if ((c == EQ_EXPR && integer_zerop (op2))
1434               || (c == NE_EXPR && integer_nonzerop (op2)))
1435             return same_bool_comparison_p (expr,
1436                                            invert_tree_comparison (c, false),
1437                                            gimple_assign_rhs1 (s),
1438                                            gimple_assign_rhs2 (s));
1439         }
1440     }
1441   return false;
1442 }
1443
1444 /* Check to see if two boolean expressions OP1 and OP2 are logically
1445    equivalent.  */
1446
1447 static bool
1448 same_bool_result_p (const_tree op1, const_tree op2)
1449 {
1450   /* Simple cases first.  */
1451   if (operand_equal_p (op1, op2, 0))
1452     return true;
1453
1454   /* Check the cases where at least one of the operands is a comparison.
1455      These are a bit smarter than operand_equal_p in that they apply some
1456      identifies on SSA_NAMEs.  */
1457   if (TREE_CODE_CLASS (TREE_CODE (op2)) == tcc_comparison
1458       && same_bool_comparison_p (op1, TREE_CODE (op2),
1459                                  TREE_OPERAND (op2, 0),
1460                                  TREE_OPERAND (op2, 1)))
1461     return true;
1462   if (TREE_CODE_CLASS (TREE_CODE (op1)) == tcc_comparison
1463       && same_bool_comparison_p (op2, TREE_CODE (op1),
1464                                  TREE_OPERAND (op1, 0),
1465                                  TREE_OPERAND (op1, 1)))
1466     return true;
1467
1468   /* Default case.  */
1469   return false;
1470 }
1471
1472 /* Forward declarations for some mutually recursive functions.  */
1473
1474 static tree
1475 and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
1476                    enum tree_code code2, tree op2a, tree op2b);
1477 static tree
1478 and_var_with_comparison (tree var, bool invert,
1479                          enum tree_code code2, tree op2a, tree op2b);
1480 static tree
1481 and_var_with_comparison_1 (gimple stmt, 
1482                            enum tree_code code2, tree op2a, tree op2b);
1483 static tree
1484 or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
1485                   enum tree_code code2, tree op2a, tree op2b);
1486 static tree
1487 or_var_with_comparison (tree var, bool invert,
1488                         enum tree_code code2, tree op2a, tree op2b);
1489 static tree
1490 or_var_with_comparison_1 (gimple stmt, 
1491                           enum tree_code code2, tree op2a, tree op2b);
1492
1493 /* Helper function for and_comparisons_1:  try to simplify the AND of the
1494    ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
1495    If INVERT is true, invert the value of the VAR before doing the AND.
1496    Return NULL_EXPR if we can't simplify this to a single expression.  */
1497
1498 static tree
1499 and_var_with_comparison (tree var, bool invert,
1500                          enum tree_code code2, tree op2a, tree op2b)
1501 {
1502   tree t;
1503   gimple stmt = SSA_NAME_DEF_STMT (var);
1504
1505   /* We can only deal with variables whose definitions are assignments.  */
1506   if (!is_gimple_assign (stmt))
1507     return NULL_TREE;
1508   
1509   /* If we have an inverted comparison, apply DeMorgan's law and rewrite
1510      !var AND (op2a code2 op2b) => !(var OR !(op2a code2 op2b))
1511      Then we only have to consider the simpler non-inverted cases.  */
1512   if (invert)
1513     t = or_var_with_comparison_1 (stmt, 
1514                                   invert_tree_comparison (code2, false),
1515                                   op2a, op2b);
1516   else
1517     t = and_var_with_comparison_1 (stmt, code2, op2a, op2b);
1518   return canonicalize_bool (t, invert);
1519 }
1520
1521 /* Try to simplify the AND of the ssa variable defined by the assignment
1522    STMT with the comparison specified by (OP2A CODE2 OP2B).
1523    Return NULL_EXPR if we can't simplify this to a single expression.  */
1524
1525 static tree
1526 and_var_with_comparison_1 (gimple stmt,
1527                            enum tree_code code2, tree op2a, tree op2b)
1528 {
1529   tree var = gimple_assign_lhs (stmt);
1530   tree true_test_var = NULL_TREE;
1531   tree false_test_var = NULL_TREE;
1532   enum tree_code innercode = gimple_assign_rhs_code (stmt);
1533
1534   /* Check for identities like (var AND (var == 0)) => false.  */
1535   if (TREE_CODE (op2a) == SSA_NAME
1536       && TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE)
1537     {
1538       if ((code2 == NE_EXPR && integer_zerop (op2b))
1539           || (code2 == EQ_EXPR && integer_nonzerop (op2b)))
1540         {
1541           true_test_var = op2a;
1542           if (var == true_test_var)
1543             return var;
1544         }
1545       else if ((code2 == EQ_EXPR && integer_zerop (op2b))
1546                || (code2 == NE_EXPR && integer_nonzerop (op2b)))
1547         {
1548           false_test_var = op2a;
1549           if (var == false_test_var)
1550             return boolean_false_node;
1551         }
1552     }
1553
1554   /* If the definition is a comparison, recurse on it.  */
1555   if (TREE_CODE_CLASS (innercode) == tcc_comparison)
1556     {
1557       tree t = and_comparisons_1 (innercode,
1558                                   gimple_assign_rhs1 (stmt),
1559                                   gimple_assign_rhs2 (stmt),
1560                                   code2,
1561                                   op2a,
1562                                   op2b);
1563       if (t)
1564         return t;
1565     }
1566
1567   /* If the definition is an AND or OR expression, we may be able to
1568      simplify by reassociating.  */
1569   if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
1570       && (innercode == BIT_AND_EXPR || innercode == BIT_IOR_EXPR))
1571     {
1572       tree inner1 = gimple_assign_rhs1 (stmt);
1573       tree inner2 = gimple_assign_rhs2 (stmt);
1574       gimple s;
1575       tree t;
1576       tree partial = NULL_TREE;
1577       bool is_and = (innercode == BIT_AND_EXPR);
1578       
1579       /* Check for boolean identities that don't require recursive examination
1580          of inner1/inner2:
1581          inner1 AND (inner1 AND inner2) => inner1 AND inner2 => var
1582          inner1 AND (inner1 OR inner2) => inner1
1583          !inner1 AND (inner1 AND inner2) => false
1584          !inner1 AND (inner1 OR inner2) => !inner1 AND inner2
1585          Likewise for similar cases involving inner2.  */
1586       if (inner1 == true_test_var)
1587         return (is_and ? var : inner1);
1588       else if (inner2 == true_test_var)
1589         return (is_and ? var : inner2);
1590       else if (inner1 == false_test_var)
1591         return (is_and
1592                 ? boolean_false_node
1593                 : and_var_with_comparison (inner2, false, code2, op2a, op2b));
1594       else if (inner2 == false_test_var)
1595         return (is_and
1596                 ? boolean_false_node
1597                 : and_var_with_comparison (inner1, false, code2, op2a, op2b));
1598
1599       /* Next, redistribute/reassociate the AND across the inner tests.
1600          Compute the first partial result, (inner1 AND (op2a code op2b))  */
1601       if (TREE_CODE (inner1) == SSA_NAME
1602           && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner1))
1603           && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
1604           && (t = maybe_fold_and_comparisons (gimple_assign_rhs_code (s),
1605                                               gimple_assign_rhs1 (s),
1606                                               gimple_assign_rhs2 (s),
1607                                               code2, op2a, op2b)))
1608         {
1609           /* Handle the AND case, where we are reassociating:
1610              (inner1 AND inner2) AND (op2a code2 op2b)
1611              => (t AND inner2)
1612              If the partial result t is a constant, we win.  Otherwise
1613              continue on to try reassociating with the other inner test.  */
1614           if (is_and)
1615             {
1616               if (integer_onep (t))
1617                 return inner2;
1618               else if (integer_zerop (t))
1619                 return boolean_false_node;
1620             }
1621
1622           /* Handle the OR case, where we are redistributing:
1623              (inner1 OR inner2) AND (op2a code2 op2b)
1624              => (t OR (inner2 AND (op2a code2 op2b)))  */
1625           else if (integer_onep (t))
1626             return boolean_true_node;
1627
1628           /* Save partial result for later.  */
1629           partial = t;
1630         }
1631       
1632       /* Compute the second partial result, (inner2 AND (op2a code op2b)) */
1633       if (TREE_CODE (inner2) == SSA_NAME
1634           && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner2))
1635           && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
1636           && (t = maybe_fold_and_comparisons (gimple_assign_rhs_code (s),
1637                                               gimple_assign_rhs1 (s),
1638                                               gimple_assign_rhs2 (s),
1639                                               code2, op2a, op2b)))
1640         {
1641           /* Handle the AND case, where we are reassociating:
1642              (inner1 AND inner2) AND (op2a code2 op2b)
1643              => (inner1 AND t)  */
1644           if (is_and)
1645             {
1646               if (integer_onep (t))
1647                 return inner1;
1648               else if (integer_zerop (t))
1649                 return boolean_false_node;
1650               /* If both are the same, we can apply the identity
1651                  (x AND x) == x.  */
1652               else if (partial && same_bool_result_p (t, partial))
1653                 return t;
1654             }
1655
1656           /* Handle the OR case. where we are redistributing:
1657              (inner1 OR inner2) AND (op2a code2 op2b)
1658              => (t OR (inner1 AND (op2a code2 op2b)))
1659              => (t OR partial)  */
1660           else
1661             {
1662               if (integer_onep (t))
1663                 return boolean_true_node;
1664               else if (partial)
1665                 {
1666                   /* We already got a simplification for the other
1667                      operand to the redistributed OR expression.  The
1668                      interesting case is when at least one is false.
1669                      Or, if both are the same, we can apply the identity
1670                      (x OR x) == x.  */
1671                   if (integer_zerop (partial))
1672                     return t;
1673                   else if (integer_zerop (t))
1674                     return partial;
1675                   else if (same_bool_result_p (t, partial))
1676                     return t;
1677                 }
1678             }
1679         }
1680     }
1681   return NULL_TREE;
1682 }
1683
1684 /* Try to simplify the AND of two comparisons defined by
1685    (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
1686    If this can be done without constructing an intermediate value,
1687    return the resulting tree; otherwise NULL_TREE is returned.
1688    This function is deliberately asymmetric as it recurses on SSA_DEFs
1689    in the first comparison but not the second.  */
1690
1691 static tree
1692 and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
1693                    enum tree_code code2, tree op2a, tree op2b)
1694 {
1695   tree truth_type = truth_type_for (TREE_TYPE (op1a));
1696
1697   /* First check for ((x CODE1 y) AND (x CODE2 y)).  */
1698   if (operand_equal_p (op1a, op2a, 0)
1699       && operand_equal_p (op1b, op2b, 0))
1700     {
1701       /* Result will be either NULL_TREE, or a combined comparison.  */
1702       tree t = combine_comparisons (UNKNOWN_LOCATION,
1703                                     TRUTH_ANDIF_EXPR, code1, code2,
1704                                     truth_type, op1a, op1b);
1705       if (t)
1706         return t;
1707     }
1708
1709   /* Likewise the swapped case of the above.  */
1710   if (operand_equal_p (op1a, op2b, 0)
1711       && operand_equal_p (op1b, op2a, 0))
1712     {
1713       /* Result will be either NULL_TREE, or a combined comparison.  */
1714       tree t = combine_comparisons (UNKNOWN_LOCATION,
1715                                     TRUTH_ANDIF_EXPR, code1,
1716                                     swap_tree_comparison (code2),
1717                                     truth_type, op1a, op1b);
1718       if (t)
1719         return t;
1720     }
1721
1722   /* If both comparisons are of the same value against constants, we might
1723      be able to merge them.  */
1724   if (operand_equal_p (op1a, op2a, 0)
1725       && TREE_CODE (op1b) == INTEGER_CST
1726       && TREE_CODE (op2b) == INTEGER_CST)
1727     {
1728       int cmp = tree_int_cst_compare (op1b, op2b);
1729
1730       /* If we have (op1a == op1b), we should either be able to
1731          return that or FALSE, depending on whether the constant op1b
1732          also satisfies the other comparison against op2b.  */
1733       if (code1 == EQ_EXPR)
1734         {
1735           bool done = true;
1736           bool val;
1737           switch (code2)
1738             {
1739             case EQ_EXPR: val = (cmp == 0); break;
1740             case NE_EXPR: val = (cmp != 0); break;
1741             case LT_EXPR: val = (cmp < 0); break;
1742             case GT_EXPR: val = (cmp > 0); break;
1743             case LE_EXPR: val = (cmp <= 0); break;
1744             case GE_EXPR: val = (cmp >= 0); break;
1745             default: done = false;
1746             }
1747           if (done)
1748             {
1749               if (val)
1750                 return fold_build2 (code1, boolean_type_node, op1a, op1b);
1751               else
1752                 return boolean_false_node;
1753             }
1754         }
1755       /* Likewise if the second comparison is an == comparison.  */
1756       else if (code2 == EQ_EXPR)
1757         {
1758           bool done = true;
1759           bool val;
1760           switch (code1)
1761             {
1762             case EQ_EXPR: val = (cmp == 0); break;
1763             case NE_EXPR: val = (cmp != 0); break;
1764             case LT_EXPR: val = (cmp > 0); break;
1765             case GT_EXPR: val = (cmp < 0); break;
1766             case LE_EXPR: val = (cmp >= 0); break;
1767             case GE_EXPR: val = (cmp <= 0); break;
1768             default: done = false;
1769             }
1770           if (done)
1771             {
1772               if (val)
1773                 return fold_build2 (code2, boolean_type_node, op2a, op2b);
1774               else
1775                 return boolean_false_node;
1776             }
1777         }
1778
1779       /* Same business with inequality tests.  */
1780       else if (code1 == NE_EXPR)
1781         {
1782           bool val;
1783           switch (code2)
1784             {
1785             case EQ_EXPR: val = (cmp != 0); break;
1786             case NE_EXPR: val = (cmp == 0); break;
1787             case LT_EXPR: val = (cmp >= 0); break;
1788             case GT_EXPR: val = (cmp <= 0); break;
1789             case LE_EXPR: val = (cmp > 0); break;
1790             case GE_EXPR: val = (cmp < 0); break;
1791             default:
1792               val = false;
1793             }
1794           if (val)
1795             return fold_build2 (code2, boolean_type_node, op2a, op2b);
1796         }
1797       else if (code2 == NE_EXPR)
1798         {
1799           bool val;
1800           switch (code1)
1801             {
1802             case EQ_EXPR: val = (cmp == 0); break;
1803             case NE_EXPR: val = (cmp != 0); break;
1804             case LT_EXPR: val = (cmp <= 0); break;
1805             case GT_EXPR: val = (cmp >= 0); break;
1806             case LE_EXPR: val = (cmp < 0); break;
1807             case GE_EXPR: val = (cmp > 0); break;
1808             default:
1809               val = false;
1810             }
1811           if (val)
1812             return fold_build2 (code1, boolean_type_node, op1a, op1b);
1813         }
1814
1815       /* Chose the more restrictive of two < or <= comparisons.  */
1816       else if ((code1 == LT_EXPR || code1 == LE_EXPR)
1817                && (code2 == LT_EXPR || code2 == LE_EXPR))
1818         {
1819           if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR))
1820             return fold_build2 (code1, boolean_type_node, op1a, op1b);
1821           else
1822             return fold_build2 (code2, boolean_type_node, op2a, op2b);
1823         }
1824
1825       /* Likewise chose the more restrictive of two > or >= comparisons.  */
1826       else if ((code1 == GT_EXPR || code1 == GE_EXPR)
1827                && (code2 == GT_EXPR || code2 == GE_EXPR))
1828         {
1829           if ((cmp > 0) || (cmp == 0 && code1 == GT_EXPR))
1830             return fold_build2 (code1, boolean_type_node, op1a, op1b);
1831           else
1832             return fold_build2 (code2, boolean_type_node, op2a, op2b);
1833         }
1834
1835       /* Check for singleton ranges.  */
1836       else if (cmp == 0
1837                && ((code1 == LE_EXPR && code2 == GE_EXPR)
1838                    || (code1 == GE_EXPR && code2 == LE_EXPR)))
1839         return fold_build2 (EQ_EXPR, boolean_type_node, op1a, op2b);
1840
1841       /* Check for disjoint ranges. */
1842       else if (cmp <= 0
1843                && (code1 == LT_EXPR || code1 == LE_EXPR)
1844                && (code2 == GT_EXPR || code2 == GE_EXPR))
1845         return boolean_false_node;
1846       else if (cmp >= 0
1847                && (code1 == GT_EXPR || code1 == GE_EXPR)
1848                && (code2 == LT_EXPR || code2 == LE_EXPR))
1849         return boolean_false_node;
1850     }
1851
1852   /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
1853      NAME's definition is a truth value.  See if there are any simplifications
1854      that can be done against the NAME's definition.  */
1855   if (TREE_CODE (op1a) == SSA_NAME
1856       && (code1 == NE_EXPR || code1 == EQ_EXPR)
1857       && (integer_zerop (op1b) || integer_onep (op1b)))
1858     {
1859       bool invert = ((code1 == EQ_EXPR && integer_zerop (op1b))
1860                      || (code1 == NE_EXPR && integer_onep (op1b)));
1861       gimple stmt = SSA_NAME_DEF_STMT (op1a);
1862       switch (gimple_code (stmt))
1863         {
1864         case GIMPLE_ASSIGN:
1865           /* Try to simplify by copy-propagating the definition.  */
1866           return and_var_with_comparison (op1a, invert, code2, op2a, op2b);
1867
1868         case GIMPLE_PHI:
1869           /* If every argument to the PHI produces the same result when
1870              ANDed with the second comparison, we win.
1871              Do not do this unless the type is bool since we need a bool
1872              result here anyway.  */
1873           if (TREE_CODE (TREE_TYPE (op1a)) == BOOLEAN_TYPE)
1874             {
1875               tree result = NULL_TREE;
1876               unsigned i;
1877               for (i = 0; i < gimple_phi_num_args (stmt); i++)
1878                 {
1879                   tree arg = gimple_phi_arg_def (stmt, i);
1880                   
1881                   /* If this PHI has itself as an argument, ignore it.
1882                      If all the other args produce the same result,
1883                      we're still OK.  */
1884                   if (arg == gimple_phi_result (stmt))
1885                     continue;
1886                   else if (TREE_CODE (arg) == INTEGER_CST)
1887                     {
1888                       if (invert ? integer_nonzerop (arg) : integer_zerop (arg))
1889                         {
1890                           if (!result)
1891                             result = boolean_false_node;
1892                           else if (!integer_zerop (result))
1893                             return NULL_TREE;
1894                         }
1895                       else if (!result)
1896                         result = fold_build2 (code2, boolean_type_node,
1897                                               op2a, op2b);
1898                       else if (!same_bool_comparison_p (result,
1899                                                         code2, op2a, op2b))
1900                         return NULL_TREE;
1901                     }
1902                   else if (TREE_CODE (arg) == SSA_NAME
1903                            && !SSA_NAME_IS_DEFAULT_DEF (arg))
1904                     {
1905                       tree temp;
1906                       gimple def_stmt = SSA_NAME_DEF_STMT (arg);
1907                       /* In simple cases we can look through PHI nodes,
1908                          but we have to be careful with loops.
1909                          See PR49073.  */
1910                       if (! dom_info_available_p (CDI_DOMINATORS)
1911                           || gimple_bb (def_stmt) == gimple_bb (stmt)
1912                           || dominated_by_p (CDI_DOMINATORS,
1913                                              gimple_bb (def_stmt),
1914                                              gimple_bb (stmt)))
1915                         return NULL_TREE;
1916                       temp = and_var_with_comparison (arg, invert, code2,
1917                                                       op2a, op2b);
1918                       if (!temp)
1919                         return NULL_TREE;
1920                       else if (!result)
1921                         result = temp;
1922                       else if (!same_bool_result_p (result, temp))
1923                         return NULL_TREE;
1924                     }
1925                   else
1926                     return NULL_TREE;
1927                 }
1928               return result;
1929             }
1930
1931         default:
1932           break;
1933         }
1934     }
1935   return NULL_TREE;
1936 }
1937
1938 /* Try to simplify the AND of two comparisons, specified by
1939    (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
1940    If this can be simplified to a single expression (without requiring
1941    introducing more SSA variables to hold intermediate values),
1942    return the resulting tree.  Otherwise return NULL_TREE.
1943    If the result expression is non-null, it has boolean type.  */
1944
1945 tree
1946 maybe_fold_and_comparisons (enum tree_code code1, tree op1a, tree op1b,
1947                             enum tree_code code2, tree op2a, tree op2b)
1948 {
1949   tree t = and_comparisons_1 (code1, op1a, op1b, code2, op2a, op2b);
1950   if (t)
1951     return t;
1952   else
1953     return and_comparisons_1 (code2, op2a, op2b, code1, op1a, op1b);
1954 }
1955
1956 /* Helper function for or_comparisons_1:  try to simplify the OR of the
1957    ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
1958    If INVERT is true, invert the value of VAR before doing the OR.
1959    Return NULL_EXPR if we can't simplify this to a single expression.  */
1960
1961 static tree
1962 or_var_with_comparison (tree var, bool invert,
1963                         enum tree_code code2, tree op2a, tree op2b)
1964 {
1965   tree t;
1966   gimple stmt = SSA_NAME_DEF_STMT (var);
1967
1968   /* We can only deal with variables whose definitions are assignments.  */
1969   if (!is_gimple_assign (stmt))
1970     return NULL_TREE;
1971   
1972   /* If we have an inverted comparison, apply DeMorgan's law and rewrite
1973      !var OR (op2a code2 op2b) => !(var AND !(op2a code2 op2b))
1974      Then we only have to consider the simpler non-inverted cases.  */
1975   if (invert)
1976     t = and_var_with_comparison_1 (stmt, 
1977                                    invert_tree_comparison (code2, false),
1978                                    op2a, op2b);
1979   else
1980     t = or_var_with_comparison_1 (stmt, code2, op2a, op2b);
1981   return canonicalize_bool (t, invert);
1982 }
1983
1984 /* Try to simplify the OR of the ssa variable defined by the assignment
1985    STMT with the comparison specified by (OP2A CODE2 OP2B).
1986    Return NULL_EXPR if we can't simplify this to a single expression.  */
1987
1988 static tree
1989 or_var_with_comparison_1 (gimple stmt,
1990                           enum tree_code code2, tree op2a, tree op2b)
1991 {
1992   tree var = gimple_assign_lhs (stmt);
1993   tree true_test_var = NULL_TREE;
1994   tree false_test_var = NULL_TREE;
1995   enum tree_code innercode = gimple_assign_rhs_code (stmt);
1996
1997   /* Check for identities like (var OR (var != 0)) => true .  */
1998   if (TREE_CODE (op2a) == SSA_NAME
1999       && TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE)
2000     {
2001       if ((code2 == NE_EXPR && integer_zerop (op2b))
2002           || (code2 == EQ_EXPR && integer_nonzerop (op2b)))
2003         {
2004           true_test_var = op2a;
2005           if (var == true_test_var)
2006             return var;
2007         }
2008       else if ((code2 == EQ_EXPR && integer_zerop (op2b))
2009                || (code2 == NE_EXPR && integer_nonzerop (op2b)))
2010         {
2011           false_test_var = op2a;
2012           if (var == false_test_var)
2013             return boolean_true_node;
2014         }
2015     }
2016
2017   /* If the definition is a comparison, recurse on it.  */
2018   if (TREE_CODE_CLASS (innercode) == tcc_comparison)
2019     {
2020       tree t = or_comparisons_1 (innercode,
2021                                  gimple_assign_rhs1 (stmt),
2022                                  gimple_assign_rhs2 (stmt),
2023                                  code2,
2024                                  op2a,
2025                                  op2b);
2026       if (t)
2027         return t;
2028     }
2029   
2030   /* If the definition is an AND or OR expression, we may be able to
2031      simplify by reassociating.  */
2032   if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
2033       && (innercode == BIT_AND_EXPR || innercode == BIT_IOR_EXPR))
2034     {
2035       tree inner1 = gimple_assign_rhs1 (stmt);
2036       tree inner2 = gimple_assign_rhs2 (stmt);
2037       gimple s;
2038       tree t;
2039       tree partial = NULL_TREE;
2040       bool is_or = (innercode == BIT_IOR_EXPR);
2041       
2042       /* Check for boolean identities that don't require recursive examination
2043          of inner1/inner2:
2044          inner1 OR (inner1 OR inner2) => inner1 OR inner2 => var
2045          inner1 OR (inner1 AND inner2) => inner1
2046          !inner1 OR (inner1 OR inner2) => true
2047          !inner1 OR (inner1 AND inner2) => !inner1 OR inner2
2048       */
2049       if (inner1 == true_test_var)
2050         return (is_or ? var : inner1);
2051       else if (inner2 == true_test_var)
2052         return (is_or ? var : inner2);
2053       else if (inner1 == false_test_var)
2054         return (is_or
2055                 ? boolean_true_node
2056                 : or_var_with_comparison (inner2, false, code2, op2a, op2b));
2057       else if (inner2 == false_test_var)
2058         return (is_or
2059                 ? boolean_true_node
2060                 : or_var_with_comparison (inner1, false, code2, op2a, op2b));
2061       
2062       /* Next, redistribute/reassociate the OR across the inner tests.
2063          Compute the first partial result, (inner1 OR (op2a code op2b))  */
2064       if (TREE_CODE (inner1) == SSA_NAME
2065           && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner1))
2066           && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
2067           && (t = maybe_fold_or_comparisons (gimple_assign_rhs_code (s),
2068                                              gimple_assign_rhs1 (s),
2069                                              gimple_assign_rhs2 (s),
2070                                              code2, op2a, op2b)))
2071         {
2072           /* Handle the OR case, where we are reassociating:
2073              (inner1 OR inner2) OR (op2a code2 op2b)
2074              => (t OR inner2)
2075              If the partial result t is a constant, we win.  Otherwise
2076              continue on to try reassociating with the other inner test.  */
2077           if (is_or)
2078             {
2079               if (integer_onep (t))
2080                 return boolean_true_node;
2081               else if (integer_zerop (t))
2082                 return inner2;
2083             }
2084           
2085           /* Handle the AND case, where we are redistributing:
2086              (inner1 AND inner2) OR (op2a code2 op2b)
2087              => (t AND (inner2 OR (op2a code op2b)))  */
2088           else if (integer_zerop (t))
2089             return boolean_false_node;
2090
2091           /* Save partial result for later.  */
2092           partial = t;
2093         }
2094       
2095       /* Compute the second partial result, (inner2 OR (op2a code op2b)) */
2096       if (TREE_CODE (inner2) == SSA_NAME
2097           && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner2))
2098           && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
2099           && (t = maybe_fold_or_comparisons (gimple_assign_rhs_code (s),
2100                                              gimple_assign_rhs1 (s),
2101                                              gimple_assign_rhs2 (s),
2102                                              code2, op2a, op2b)))
2103         {
2104           /* Handle the OR case, where we are reassociating:
2105              (inner1 OR inner2) OR (op2a code2 op2b)
2106              => (inner1 OR t)
2107              => (t OR partial)  */
2108           if (is_or)
2109             {
2110               if (integer_zerop (t))
2111                 return inner1;
2112               else if (integer_onep (t))
2113                 return boolean_true_node;
2114               /* If both are the same, we can apply the identity
2115                  (x OR x) == x.  */
2116               else if (partial && same_bool_result_p (t, partial))
2117                 return t;
2118             }
2119           
2120           /* Handle the AND case, where we are redistributing:
2121              (inner1 AND inner2) OR (op2a code2 op2b)
2122              => (t AND (inner1 OR (op2a code2 op2b)))
2123              => (t AND partial)  */
2124           else 
2125             {
2126               if (integer_zerop (t))
2127                 return boolean_false_node;
2128               else if (partial)
2129                 {
2130                   /* We already got a simplification for the other
2131                      operand to the redistributed AND expression.  The
2132                      interesting case is when at least one is true.
2133                      Or, if both are the same, we can apply the identity
2134                      (x AND x) == x.  */
2135                   if (integer_onep (partial))
2136                     return t;
2137                   else if (integer_onep (t))
2138                     return partial;
2139                   else if (same_bool_result_p (t, partial))
2140                     return t;
2141                 }
2142             }
2143         }
2144     }
2145   return NULL_TREE;
2146 }
2147
2148 /* Try to simplify the OR of two comparisons defined by
2149    (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
2150    If this can be done without constructing an intermediate value,
2151    return the resulting tree; otherwise NULL_TREE is returned.
2152    This function is deliberately asymmetric as it recurses on SSA_DEFs
2153    in the first comparison but not the second.  */
2154
2155 static tree
2156 or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
2157                   enum tree_code code2, tree op2a, tree op2b)
2158 {
2159   tree truth_type = truth_type_for (TREE_TYPE (op1a));
2160
2161   /* First check for ((x CODE1 y) OR (x CODE2 y)).  */
2162   if (operand_equal_p (op1a, op2a, 0)
2163       && operand_equal_p (op1b, op2b, 0))
2164     {
2165       /* Result will be either NULL_TREE, or a combined comparison.  */
2166       tree t = combine_comparisons (UNKNOWN_LOCATION,
2167                                     TRUTH_ORIF_EXPR, code1, code2,
2168                                     truth_type, op1a, op1b);
2169       if (t)
2170         return t;
2171     }
2172
2173   /* Likewise the swapped case of the above.  */
2174   if (operand_equal_p (op1a, op2b, 0)
2175       && operand_equal_p (op1b, op2a, 0))
2176     {
2177       /* Result will be either NULL_TREE, or a combined comparison.  */
2178       tree t = combine_comparisons (UNKNOWN_LOCATION,
2179                                     TRUTH_ORIF_EXPR, code1,
2180                                     swap_tree_comparison (code2),
2181                                     truth_type, op1a, op1b);
2182       if (t)
2183         return t;
2184     }
2185
2186   /* If both comparisons are of the same value against constants, we might
2187      be able to merge them.  */
2188   if (operand_equal_p (op1a, op2a, 0)
2189       && TREE_CODE (op1b) == INTEGER_CST
2190       && TREE_CODE (op2b) == INTEGER_CST)
2191     {
2192       int cmp = tree_int_cst_compare (op1b, op2b);
2193
2194       /* If we have (op1a != op1b), we should either be able to
2195          return that or TRUE, depending on whether the constant op1b
2196          also satisfies the other comparison against op2b.  */
2197       if (code1 == NE_EXPR)
2198         {
2199           bool done = true;
2200           bool val;
2201           switch (code2)
2202             {
2203             case EQ_EXPR: val = (cmp == 0); break;
2204             case NE_EXPR: val = (cmp != 0); break;
2205             case LT_EXPR: val = (cmp < 0); break;
2206             case GT_EXPR: val = (cmp > 0); break;
2207             case LE_EXPR: val = (cmp <= 0); break;
2208             case GE_EXPR: val = (cmp >= 0); break;
2209             default: done = false;
2210             }
2211           if (done)
2212             {
2213               if (val)
2214                 return boolean_true_node;
2215               else
2216                 return fold_build2 (code1, boolean_type_node, op1a, op1b);
2217             }
2218         }
2219       /* Likewise if the second comparison is a != comparison.  */
2220       else if (code2 == NE_EXPR)
2221         {
2222           bool done = true;
2223           bool val;
2224           switch (code1)
2225             {
2226             case EQ_EXPR: val = (cmp == 0); break;
2227             case NE_EXPR: val = (cmp != 0); break;
2228             case LT_EXPR: val = (cmp > 0); break;
2229             case GT_EXPR: val = (cmp < 0); break;
2230             case LE_EXPR: val = (cmp >= 0); break;
2231             case GE_EXPR: val = (cmp <= 0); break;
2232             default: done = false;
2233             }
2234           if (done)
2235             {
2236               if (val)
2237                 return boolean_true_node;
2238               else
2239                 return fold_build2 (code2, boolean_type_node, op2a, op2b);
2240             }
2241         }
2242
2243       /* See if an equality test is redundant with the other comparison.  */
2244       else if (code1 == EQ_EXPR)
2245         {
2246           bool val;
2247           switch (code2)
2248             {
2249             case EQ_EXPR: val = (cmp == 0); break;
2250             case NE_EXPR: val = (cmp != 0); break;
2251             case LT_EXPR: val = (cmp < 0); break;
2252             case GT_EXPR: val = (cmp > 0); break;
2253             case LE_EXPR: val = (cmp <= 0); break;
2254             case GE_EXPR: val = (cmp >= 0); break;
2255             default:
2256               val = false;
2257             }
2258           if (val)
2259             return fold_build2 (code2, boolean_type_node, op2a, op2b);
2260         }
2261       else if (code2 == EQ_EXPR)
2262         {
2263           bool val;
2264           switch (code1)
2265             {
2266             case EQ_EXPR: val = (cmp == 0); break;
2267             case NE_EXPR: val = (cmp != 0); break;
2268             case LT_EXPR: val = (cmp > 0); break;
2269             case GT_EXPR: val = (cmp < 0); break;
2270             case LE_EXPR: val = (cmp >= 0); break;
2271             case GE_EXPR: val = (cmp <= 0); break;
2272             default:
2273               val = false;
2274             }
2275           if (val)
2276             return fold_build2 (code1, boolean_type_node, op1a, op1b);
2277         }
2278
2279       /* Chose the less restrictive of two < or <= comparisons.  */
2280       else if ((code1 == LT_EXPR || code1 == LE_EXPR)
2281                && (code2 == LT_EXPR || code2 == LE_EXPR))
2282         {
2283           if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR))
2284             return fold_build2 (code2, boolean_type_node, op2a, op2b);
2285           else
2286             return fold_build2 (code1, boolean_type_node, op1a, op1b);
2287         }
2288
2289       /* Likewise chose the less restrictive of two > or >= comparisons.  */
2290       else if ((code1 == GT_EXPR || code1 == GE_EXPR)
2291                && (code2 == GT_EXPR || code2 == GE_EXPR))
2292         {
2293           if ((cmp > 0) || (cmp == 0 && code1 == GT_EXPR))
2294             return fold_build2 (code2, boolean_type_node, op2a, op2b);
2295           else
2296             return fold_build2 (code1, boolean_type_node, op1a, op1b);
2297         }
2298
2299       /* Check for singleton ranges.  */
2300       else if (cmp == 0
2301                && ((code1 == LT_EXPR && code2 == GT_EXPR)
2302                    || (code1 == GT_EXPR && code2 == LT_EXPR)))
2303         return fold_build2 (NE_EXPR, boolean_type_node, op1a, op2b);
2304
2305       /* Check for less/greater pairs that don't restrict the range at all.  */
2306       else if (cmp >= 0
2307                && (code1 == LT_EXPR || code1 == LE_EXPR)
2308                && (code2 == GT_EXPR || code2 == GE_EXPR))
2309         return boolean_true_node;
2310       else if (cmp <= 0
2311                && (code1 == GT_EXPR || code1 == GE_EXPR)
2312                && (code2 == LT_EXPR || code2 == LE_EXPR))
2313         return boolean_true_node;
2314     }
2315
2316   /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
2317      NAME's definition is a truth value.  See if there are any simplifications
2318      that can be done against the NAME's definition.  */
2319   if (TREE_CODE (op1a) == SSA_NAME
2320       && (code1 == NE_EXPR || code1 == EQ_EXPR)
2321       && (integer_zerop (op1b) || integer_onep (op1b)))
2322     {
2323       bool invert = ((code1 == EQ_EXPR && integer_zerop (op1b))
2324                      || (code1 == NE_EXPR && integer_onep (op1b)));
2325       gimple stmt = SSA_NAME_DEF_STMT (op1a);
2326       switch (gimple_code (stmt))
2327         {
2328         case GIMPLE_ASSIGN:
2329           /* Try to simplify by copy-propagating the definition.  */
2330           return or_var_with_comparison (op1a, invert, code2, op2a, op2b);
2331
2332         case GIMPLE_PHI:
2333           /* If every argument to the PHI produces the same result when
2334              ORed with the second comparison, we win.
2335              Do not do this unless the type is bool since we need a bool
2336              result here anyway.  */
2337           if (TREE_CODE (TREE_TYPE (op1a)) == BOOLEAN_TYPE)
2338             {
2339               tree result = NULL_TREE;
2340               unsigned i;
2341               for (i = 0; i < gimple_phi_num_args (stmt); i++)
2342                 {
2343                   tree arg = gimple_phi_arg_def (stmt, i);
2344                   
2345                   /* If this PHI has itself as an argument, ignore it.
2346                      If all the other args produce the same result,
2347                      we're still OK.  */
2348                   if (arg == gimple_phi_result (stmt))
2349                     continue;
2350                   else if (TREE_CODE (arg) == INTEGER_CST)
2351                     {
2352                       if (invert ? integer_zerop (arg) : integer_nonzerop (arg))
2353                         {
2354                           if (!result)
2355                             result = boolean_true_node;
2356                           else if (!integer_onep (result))
2357                             return NULL_TREE;
2358                         }
2359                       else if (!result)
2360                         result = fold_build2 (code2, boolean_type_node,
2361                                               op2a, op2b);
2362                       else if (!same_bool_comparison_p (result,
2363                                                         code2, op2a, op2b))
2364                         return NULL_TREE;
2365                     }
2366                   else if (TREE_CODE (arg) == SSA_NAME
2367                            && !SSA_NAME_IS_DEFAULT_DEF (arg))
2368                     {
2369                       tree temp;
2370                       gimple def_stmt = SSA_NAME_DEF_STMT (arg);
2371                       /* In simple cases we can look through PHI nodes,
2372                          but we have to be careful with loops.
2373                          See PR49073.  */
2374                       if (! dom_info_available_p (CDI_DOMINATORS)
2375                           || gimple_bb (def_stmt) == gimple_bb (stmt)
2376                           || dominated_by_p (CDI_DOMINATORS,
2377                                              gimple_bb (def_stmt),
2378                                              gimple_bb (stmt)))
2379                         return NULL_TREE;
2380                       temp = or_var_with_comparison (arg, invert, code2,
2381                                                      op2a, op2b);
2382                       if (!temp)
2383                         return NULL_TREE;
2384                       else if (!result)
2385                         result = temp;
2386                       else if (!same_bool_result_p (result, temp))
2387                         return NULL_TREE;
2388                     }
2389                   else
2390                     return NULL_TREE;
2391                 }
2392               return result;
2393             }
2394
2395         default:
2396           break;
2397         }
2398     }
2399   return NULL_TREE;
2400 }
2401
2402 /* Try to simplify the OR of two comparisons, specified by
2403    (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
2404    If this can be simplified to a single expression (without requiring
2405    introducing more SSA variables to hold intermediate values),
2406    return the resulting tree.  Otherwise return NULL_TREE.
2407    If the result expression is non-null, it has boolean type.  */
2408
2409 tree
2410 maybe_fold_or_comparisons (enum tree_code code1, tree op1a, tree op1b,
2411                            enum tree_code code2, tree op2a, tree op2b)
2412 {
2413   tree t = or_comparisons_1 (code1, op1a, op1b, code2, op2a, op2b);
2414   if (t)
2415     return t;
2416   else
2417     return or_comparisons_1 (code2, op2a, op2b, code1, op1a, op1b);
2418 }
2419
2420
2421 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
2422
2423    Either NULL_TREE, a simplified but non-constant or a constant
2424    is returned.
2425
2426    ???  This should go into a gimple-fold-inline.h file to be eventually
2427    privatized with the single valueize function used in the various TUs
2428    to avoid the indirect function call overhead.  */
2429
2430 tree
2431 gimple_fold_stmt_to_constant_1 (gimple stmt, tree (*valueize) (tree))
2432 {
2433   location_t loc = gimple_location (stmt);
2434   switch (gimple_code (stmt))
2435     {
2436     case GIMPLE_ASSIGN:
2437       {
2438         enum tree_code subcode = gimple_assign_rhs_code (stmt);
2439
2440         switch (get_gimple_rhs_class (subcode))
2441           {
2442           case GIMPLE_SINGLE_RHS:
2443             {
2444               tree rhs = gimple_assign_rhs1 (stmt);
2445               enum tree_code_class kind = TREE_CODE_CLASS (subcode);
2446
2447               if (TREE_CODE (rhs) == SSA_NAME)
2448                 {
2449                   /* If the RHS is an SSA_NAME, return its known constant value,
2450                      if any.  */
2451                   return (*valueize) (rhs);
2452                 }
2453               /* Handle propagating invariant addresses into address
2454                  operations.  */
2455               else if (TREE_CODE (rhs) == ADDR_EXPR
2456                        && !is_gimple_min_invariant (rhs))
2457                 {
2458                   HOST_WIDE_INT offset = 0;
2459                   tree base;
2460                   base = get_addr_base_and_unit_offset_1 (TREE_OPERAND (rhs, 0),
2461                                                           &offset,
2462                                                           valueize);
2463                   if (base
2464                       && (CONSTANT_CLASS_P (base)
2465                           || decl_address_invariant_p (base)))
2466                     return build_invariant_address (TREE_TYPE (rhs),
2467                                                     base, offset);
2468                 }
2469               else if (TREE_CODE (rhs) == CONSTRUCTOR
2470                        && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
2471                        && (CONSTRUCTOR_NELTS (rhs)
2472                            == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
2473                 {
2474                   unsigned i;
2475                   tree val, *vec;
2476
2477                   vec = XALLOCAVEC (tree,
2478                                     TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)));
2479                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
2480                     {
2481                       val = (*valueize) (val);
2482                       if (TREE_CODE (val) == INTEGER_CST
2483                           || TREE_CODE (val) == REAL_CST
2484                           || TREE_CODE (val) == FIXED_CST)
2485                         vec[i] = val;
2486                       else
2487                         return NULL_TREE;
2488                     }
2489
2490                   return build_vector (TREE_TYPE (rhs), vec);
2491                 }
2492
2493               if (kind == tcc_reference)
2494                 {
2495                   if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
2496                        || TREE_CODE (rhs) == REALPART_EXPR
2497                        || TREE_CODE (rhs) == IMAGPART_EXPR)
2498                       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
2499                     {
2500                       tree val = (*valueize) (TREE_OPERAND (rhs, 0));
2501                       return fold_unary_loc (EXPR_LOCATION (rhs),
2502                                              TREE_CODE (rhs),
2503                                              TREE_TYPE (rhs), val);
2504                     }
2505                   else if (TREE_CODE (rhs) == BIT_FIELD_REF
2506                            && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
2507                     {
2508                       tree val = (*valueize) (TREE_OPERAND (rhs, 0));
2509                       return fold_ternary_loc (EXPR_LOCATION (rhs),
2510                                                TREE_CODE (rhs),
2511                                                TREE_TYPE (rhs), val,
2512                                                TREE_OPERAND (rhs, 1),
2513                                                TREE_OPERAND (rhs, 2));
2514                     }
2515                   else if (TREE_CODE (rhs) == MEM_REF
2516                            && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
2517                     {
2518                       tree val = (*valueize) (TREE_OPERAND (rhs, 0));
2519                       if (TREE_CODE (val) == ADDR_EXPR
2520                           && is_gimple_min_invariant (val))
2521                         {
2522                           tree tem = fold_build2 (MEM_REF, TREE_TYPE (rhs),
2523                                                   unshare_expr (val),
2524                                                   TREE_OPERAND (rhs, 1));
2525                           if (tem)
2526                             rhs = tem;
2527                         }
2528                     }
2529                   return fold_const_aggregate_ref_1 (rhs, valueize);
2530                 }
2531               else if (kind == tcc_declaration)
2532                 return get_symbol_constant_value (rhs);
2533               return rhs;
2534             }
2535
2536           case GIMPLE_UNARY_RHS:
2537             {
2538               /* Handle unary operators that can appear in GIMPLE form.
2539                  Note that we know the single operand must be a constant,
2540                  so this should almost always return a simplified RHS.  */
2541               tree lhs = gimple_assign_lhs (stmt);
2542               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
2543
2544               /* Conversions are useless for CCP purposes if they are
2545                  value-preserving.  Thus the restrictions that
2546                  useless_type_conversion_p places for restrict qualification
2547                  of pointer types should not apply here.
2548                  Substitution later will only substitute to allowed places.  */
2549               if (CONVERT_EXPR_CODE_P (subcode)
2550                   && POINTER_TYPE_P (TREE_TYPE (lhs))
2551                   && POINTER_TYPE_P (TREE_TYPE (op0))
2552                   && TYPE_ADDR_SPACE (TREE_TYPE (lhs))
2553                      == TYPE_ADDR_SPACE (TREE_TYPE (op0))
2554                   && TYPE_MODE (TREE_TYPE (lhs))
2555                      == TYPE_MODE (TREE_TYPE (op0)))
2556                 return op0;
2557
2558               return
2559                 fold_unary_ignore_overflow_loc (loc, subcode,
2560                                                 gimple_expr_type (stmt), op0);
2561             }
2562
2563           case GIMPLE_BINARY_RHS:
2564             {
2565               /* Handle binary operators that can appear in GIMPLE form.  */
2566               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
2567               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
2568
2569               /* Translate &x + CST into an invariant form suitable for
2570                  further propagation.  */
2571               if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
2572                   && TREE_CODE (op0) == ADDR_EXPR
2573                   && TREE_CODE (op1) == INTEGER_CST)
2574                 {
2575                   tree off = fold_convert (ptr_type_node, op1);
2576                   return build_fold_addr_expr_loc
2577                            (loc,
2578                             fold_build2 (MEM_REF,
2579                                          TREE_TYPE (TREE_TYPE (op0)),
2580                                          unshare_expr (op0), off));
2581                 }
2582
2583               return fold_binary_loc (loc, subcode,
2584                                       gimple_expr_type (stmt), op0, op1);
2585             }
2586
2587           case GIMPLE_TERNARY_RHS:
2588             {
2589               /* Handle ternary operators that can appear in GIMPLE form.  */
2590               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
2591               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
2592               tree op2 = (*valueize) (gimple_assign_rhs3 (stmt));
2593
2594               /* Fold embedded expressions in ternary codes.  */
2595               if ((subcode == COND_EXPR
2596                    || subcode == VEC_COND_EXPR)
2597                   && COMPARISON_CLASS_P (op0))
2598                 {
2599                   tree op00 = (*valueize) (TREE_OPERAND (op0, 0));
2600                   tree op01 = (*valueize) (TREE_OPERAND (op0, 1));
2601                   tree tem = fold_binary_loc (loc, TREE_CODE (op0),
2602                                               TREE_TYPE (op0), op00, op01);
2603                   if (tem)
2604                     op0 = tem;
2605                 }
2606
2607               return fold_ternary_loc (loc, subcode,
2608                                        gimple_expr_type (stmt), op0, op1, op2);
2609             }
2610
2611           default:
2612             gcc_unreachable ();
2613           }
2614       }
2615
2616     case GIMPLE_CALL:
2617       {
2618         tree fn;
2619
2620         if (gimple_call_internal_p (stmt))
2621           /* No folding yet for these functions.  */
2622           return NULL_TREE;
2623
2624         fn = (*valueize) (gimple_call_fn (stmt));
2625         if (TREE_CODE (fn) == ADDR_EXPR
2626             && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
2627             && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
2628           {
2629             tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
2630             tree call, retval;
2631             unsigned i;
2632             for (i = 0; i < gimple_call_num_args (stmt); ++i)
2633               args[i] = (*valueize) (gimple_call_arg (stmt, i));
2634             call = build_call_array_loc (loc,
2635                                          gimple_call_return_type (stmt),
2636                                          fn, gimple_call_num_args (stmt), args);
2637             retval = fold_call_expr (EXPR_LOCATION (call), call, false);
2638             if (retval)
2639               /* fold_call_expr wraps the result inside a NOP_EXPR.  */
2640               STRIP_NOPS (retval);
2641             return retval;
2642           }
2643         return NULL_TREE;
2644       }
2645
2646     default:
2647       return NULL_TREE;
2648     }
2649 }
2650
2651 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
2652    Returns NULL_TREE if folding to a constant is not possible, otherwise
2653    returns a constant according to is_gimple_min_invariant.  */
2654
2655 tree
2656 gimple_fold_stmt_to_constant (gimple stmt, tree (*valueize) (tree))
2657 {
2658   tree res = gimple_fold_stmt_to_constant_1 (stmt, valueize);
2659   if (res && is_gimple_min_invariant (res))
2660     return res;
2661   return NULL_TREE;
2662 }
2663
2664
2665 /* The following set of functions are supposed to fold references using
2666    their constant initializers.  */
2667
2668 static tree fold_ctor_reference (tree type, tree ctor,
2669                                  unsigned HOST_WIDE_INT offset,
2670                                  unsigned HOST_WIDE_INT size, tree);
2671
2672 /* See if we can find constructor defining value of BASE.
2673    When we know the consructor with constant offset (such as
2674    base is array[40] and we do know constructor of array), then
2675    BIT_OFFSET is adjusted accordingly.
2676
2677    As a special case, return error_mark_node when constructor
2678    is not explicitly available, but it is known to be zero
2679    such as 'static const int a;'.  */
2680 static tree
2681 get_base_constructor (tree base, HOST_WIDE_INT *bit_offset,
2682                       tree (*valueize)(tree))
2683 {
2684   HOST_WIDE_INT bit_offset2, size, max_size;
2685   if (TREE_CODE (base) == MEM_REF)
2686     {
2687       if (!integer_zerop (TREE_OPERAND (base, 1)))
2688         {
2689           if (!host_integerp (TREE_OPERAND (base, 1), 0))
2690             return NULL_TREE;
2691           *bit_offset += (mem_ref_offset (base).low
2692                           * BITS_PER_UNIT);
2693         }
2694
2695       if (valueize
2696           && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
2697         base = valueize (TREE_OPERAND (base, 0));
2698       if (!base || TREE_CODE (base) != ADDR_EXPR)
2699         return NULL_TREE;
2700       base = TREE_OPERAND (base, 0);
2701     }
2702
2703   /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
2704      DECL_INITIAL.  If BASE is a nested reference into another
2705      ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
2706      the inner reference.  */
2707   switch (TREE_CODE (base))
2708     {
2709     case VAR_DECL:
2710       if (!const_value_known_p (base))
2711         return NULL_TREE;
2712
2713       /* Fallthru.  */
2714     case CONST_DECL:
2715       if (!DECL_INITIAL (base)
2716           && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
2717         return error_mark_node;
2718       /* Do not return an error_mark_node DECL_INITIAL.  LTO uses this
2719          as special marker (_not_ zero ...) for its own purposes.  */
2720       if (DECL_INITIAL (base) == error_mark_node)
2721         return NULL_TREE;
2722       return DECL_INITIAL (base);
2723
2724     case ARRAY_REF:
2725     case COMPONENT_REF:
2726       base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size);
2727       if (max_size == -1 || size != max_size)
2728         return NULL_TREE;
2729       *bit_offset +=  bit_offset2;
2730       return get_base_constructor (base, bit_offset, valueize);
2731
2732     case STRING_CST:
2733     case CONSTRUCTOR:
2734       return base;
2735
2736     default:
2737       return NULL_TREE;
2738     }
2739 }
2740
2741 /* CTOR is STRING_CST.  Fold reference of type TYPE and size SIZE
2742    to the memory at bit OFFSET.
2743
2744    We do only simple job of folding byte accesses.  */
2745
2746 static tree
2747 fold_string_cst_ctor_reference (tree type, tree ctor,
2748                                 unsigned HOST_WIDE_INT offset,
2749                                 unsigned HOST_WIDE_INT size)
2750 {
2751   if (INTEGRAL_TYPE_P (type)
2752       && (TYPE_MODE (type)
2753           == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
2754       && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
2755           == MODE_INT)
2756       && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
2757       && size == BITS_PER_UNIT
2758       && !(offset % BITS_PER_UNIT))
2759     {
2760       offset /= BITS_PER_UNIT;
2761       if (offset < (unsigned HOST_WIDE_INT) TREE_STRING_LENGTH (ctor))
2762         return build_int_cst_type (type, (TREE_STRING_POINTER (ctor)
2763                                    [offset]));
2764       /* Folding
2765          const char a[20]="hello";
2766          return a[10];
2767
2768          might lead to offset greater than string length.  In this case we
2769          know value is either initialized to 0 or out of bounds.  Return 0
2770          in both cases.  */
2771       return build_zero_cst (type);
2772     }
2773   return NULL_TREE;
2774 }
2775
2776 /* CTOR is CONSTRUCTOR of an array type.  Fold reference of type TYPE and size
2777    SIZE to the memory at bit OFFSET.  */
2778
2779 static tree
2780 fold_array_ctor_reference (tree type, tree ctor,
2781                            unsigned HOST_WIDE_INT offset,
2782                            unsigned HOST_WIDE_INT size,
2783                            tree from_decl)
2784 {
2785   unsigned HOST_WIDE_INT cnt;
2786   tree cfield, cval;
2787   double_int low_bound, elt_size;
2788   double_int index, max_index;
2789   double_int access_index;
2790   tree domain_type = NULL_TREE, index_type = NULL_TREE;
2791   HOST_WIDE_INT inner_offset;
2792
2793   /* Compute low bound and elt size.  */
2794   if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE)
2795     domain_type = TYPE_DOMAIN (TREE_TYPE (ctor));
2796   if (domain_type && TYPE_MIN_VALUE (domain_type))
2797     {
2798       /* Static constructors for variably sized objects makes no sense.  */
2799       gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST);
2800       index_type = TREE_TYPE (TYPE_MIN_VALUE (domain_type));
2801       low_bound = tree_to_double_int (TYPE_MIN_VALUE (domain_type));
2802     }
2803   else
2804     low_bound = double_int_zero;
2805   /* Static constructors for variably sized objects makes no sense.  */
2806   gcc_assert (TREE_CODE(TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))))
2807               == INTEGER_CST);
2808   elt_size =
2809     tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))));
2810
2811
2812   /* We can handle only constantly sized accesses that are known to not
2813      be larger than size of array element.  */
2814   if (!TYPE_SIZE_UNIT (type)
2815       || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
2816       || elt_size.slt (tree_to_double_int (TYPE_SIZE_UNIT (type))))
2817     return NULL_TREE;
2818
2819   /* Compute the array index we look for.  */
2820   access_index = double_int::from_uhwi (offset / BITS_PER_UNIT)
2821                  .udiv (elt_size, TRUNC_DIV_EXPR);
2822   access_index += low_bound;
2823   if (index_type)
2824     access_index = access_index.ext (TYPE_PRECISION (index_type),
2825                                      TYPE_UNSIGNED (index_type));
2826
2827   /* And offset within the access.  */
2828   inner_offset = offset % (elt_size.to_uhwi () * BITS_PER_UNIT);
2829
2830   /* See if the array field is large enough to span whole access.  We do not
2831      care to fold accesses spanning multiple array indexes.  */
2832   if (inner_offset + size > elt_size.to_uhwi () * BITS_PER_UNIT)
2833     return NULL_TREE;
2834
2835   index = low_bound - double_int_one;
2836   if (index_type)
2837     index = index.ext (TYPE_PRECISION (index_type), TYPE_UNSIGNED (index_type));
2838
2839   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
2840     {
2841       /* Array constructor might explicitely set index, or specify range
2842          or leave index NULL meaning that it is next index after previous
2843          one.  */
2844       if (cfield)
2845         {
2846           if (TREE_CODE (cfield) == INTEGER_CST)
2847             max_index = index = tree_to_double_int (cfield);
2848           else
2849             {
2850               gcc_assert (TREE_CODE (cfield) == RANGE_EXPR);
2851               index = tree_to_double_int (TREE_OPERAND (cfield, 0));
2852               max_index = tree_to_double_int (TREE_OPERAND (cfield, 1));
2853             }
2854         }
2855       else
2856         {
2857           index += double_int_one;
2858           if (index_type)
2859             index = index.ext (TYPE_PRECISION (index_type),
2860                                TYPE_UNSIGNED (index_type));
2861           max_index = index;
2862         }
2863
2864       /* Do we have match?  */
2865       if (access_index.cmp (index, 1) >= 0
2866           && access_index.cmp (max_index, 1) <= 0)
2867         return fold_ctor_reference (type, cval, inner_offset, size,
2868                                     from_decl);
2869     }
2870   /* When memory is not explicitely mentioned in constructor,
2871      it is 0 (or out of range).  */
2872   return build_zero_cst (type);
2873 }
2874
2875 /* CTOR is CONSTRUCTOR of an aggregate or vector.
2876    Fold reference of type TYPE and size SIZE to the memory at bit OFFSET.  */
2877
2878 static tree
2879 fold_nonarray_ctor_reference (tree type, tree ctor,
2880                               unsigned HOST_WIDE_INT offset,
2881                               unsigned HOST_WIDE_INT size,
2882                               tree from_decl)
2883 {
2884   unsigned HOST_WIDE_INT cnt;
2885   tree cfield, cval;
2886
2887   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield,
2888                             cval)
2889     {
2890       tree byte_offset = DECL_FIELD_OFFSET (cfield);
2891       tree field_offset = DECL_FIELD_BIT_OFFSET (cfield);
2892       tree field_size = DECL_SIZE (cfield);
2893       double_int bitoffset;
2894       double_int byte_offset_cst = tree_to_double_int (byte_offset);
2895       double_int bits_per_unit_cst = double_int::from_uhwi (BITS_PER_UNIT);
2896       double_int bitoffset_end, access_end;
2897
2898       /* Variable sized objects in static constructors makes no sense,
2899          but field_size can be NULL for flexible array members.  */
2900       gcc_assert (TREE_CODE (field_offset) == INTEGER_CST
2901                   && TREE_CODE (byte_offset) == INTEGER_CST
2902                   && (field_size != NULL_TREE
2903                       ? TREE_CODE (field_size) == INTEGER_CST
2904                       : TREE_CODE (TREE_TYPE (cfield)) == ARRAY_TYPE));
2905
2906       /* Compute bit offset of the field.  */
2907       bitoffset = tree_to_double_int (field_offset)
2908                   + byte_offset_cst * bits_per_unit_cst;
2909       /* Compute bit offset where the field ends.  */
2910       if (field_size != NULL_TREE)
2911         bitoffset_end = bitoffset + tree_to_double_int (field_size);
2912       else
2913         bitoffset_end = double_int_zero;
2914
2915       access_end = double_int::from_uhwi (offset)
2916                    + double_int::from_uhwi (size);
2917
2918       /* Is there any overlap between [OFFSET, OFFSET+SIZE) and
2919          [BITOFFSET, BITOFFSET_END)?  */
2920       if (access_end.cmp (bitoffset, 0) > 0
2921           && (field_size == NULL_TREE
2922               || double_int::from_uhwi (offset).slt (bitoffset_end)))
2923         {
2924           double_int inner_offset = double_int::from_uhwi (offset) - bitoffset;
2925           /* We do have overlap.  Now see if field is large enough to
2926              cover the access.  Give up for accesses spanning multiple
2927              fields.  */
2928           if (access_end.cmp (bitoffset_end, 0) > 0)
2929             return NULL_TREE;
2930           if (double_int::from_uhwi (offset).slt (bitoffset))
2931             return NULL_TREE;
2932           return fold_ctor_reference (type, cval,
2933                                       inner_offset.to_uhwi (), size,
2934                                       from_decl);
2935         }
2936     }
2937   /* When memory is not explicitely mentioned in constructor, it is 0.  */
2938   return build_zero_cst (type);
2939 }
2940
2941 /* CTOR is value initializing memory, fold reference of type TYPE and size SIZE
2942    to the memory at bit OFFSET.  */
2943
2944 static tree
2945 fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
2946                      unsigned HOST_WIDE_INT size, tree from_decl)
2947 {
2948   tree ret;
2949
2950   /* We found the field with exact match.  */
2951   if (useless_type_conversion_p (type, TREE_TYPE (ctor))
2952       && !offset)
2953     return canonicalize_constructor_val (ctor, from_decl);
2954
2955   /* We are at the end of walk, see if we can view convert the
2956      result.  */
2957   if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
2958       /* VIEW_CONVERT_EXPR is defined only for matching sizes.  */
2959       && operand_equal_p (TYPE_SIZE (type),
2960                           TYPE_SIZE (TREE_TYPE (ctor)), 0))
2961     {
2962       ret = canonicalize_constructor_val (ctor, from_decl);
2963       ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
2964       if (ret)
2965         STRIP_NOPS (ret);
2966       return ret;
2967     }
2968   if (TREE_CODE (ctor) == STRING_CST)
2969     return fold_string_cst_ctor_reference (type, ctor, offset, size);
2970   if (TREE_CODE (ctor) == CONSTRUCTOR)
2971     {
2972
2973       if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE
2974           || TREE_CODE (TREE_TYPE (ctor)) == VECTOR_TYPE)
2975         return fold_array_ctor_reference (type, ctor, offset, size,
2976                                           from_decl);
2977       else
2978         return fold_nonarray_ctor_reference (type, ctor, offset, size,
2979                                              from_decl);
2980     }
2981
2982   return NULL_TREE;
2983 }
2984
2985 /* Return the tree representing the element referenced by T if T is an
2986    ARRAY_REF or COMPONENT_REF into constant aggregates valuezing SSA
2987    names using VALUEIZE.  Return NULL_TREE otherwise.  */
2988
2989 tree
2990 fold_const_aggregate_ref_1 (tree t, tree (*valueize) (tree))
2991 {
2992   tree ctor, idx, base;
2993   HOST_WIDE_INT offset, size, max_size;
2994   tree tem;
2995
2996   if (TREE_THIS_VOLATILE (t))
2997     return NULL_TREE;
2998
2999   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
3000     return get_symbol_constant_value (t);
3001
3002   tem = fold_read_from_constant_string (t);
3003   if (tem)
3004     return tem;
3005
3006   switch (TREE_CODE (t))
3007     {
3008     case ARRAY_REF:
3009     case ARRAY_RANGE_REF:
3010       /* Constant indexes are handled well by get_base_constructor.
3011          Only special case variable offsets.
3012          FIXME: This code can't handle nested references with variable indexes
3013          (they will be handled only by iteration of ccp).  Perhaps we can bring
3014          get_ref_base_and_extent here and make it use a valueize callback.  */
3015       if (TREE_CODE (TREE_OPERAND (t, 1)) == SSA_NAME
3016           && valueize
3017           && (idx = (*valueize) (TREE_OPERAND (t, 1)))
3018           && TREE_CODE (idx) == INTEGER_CST)
3019         {
3020           tree low_bound, unit_size;
3021           double_int doffset;
3022
3023           /* If the resulting bit-offset is constant, track it.  */
3024           if ((low_bound = array_ref_low_bound (t),
3025                TREE_CODE (low_bound) == INTEGER_CST)
3026               && (unit_size = array_ref_element_size (t),
3027                   host_integerp (unit_size, 1))
3028               && (doffset = (TREE_INT_CST (idx) - TREE_INT_CST (low_bound))
3029                             .sext (TYPE_PRECISION (TREE_TYPE (idx))),
3030                   doffset.fits_shwi ()))
3031             {
3032               offset = doffset.to_shwi ();
3033               offset *= TREE_INT_CST_LOW (unit_size);
3034               offset *= BITS_PER_UNIT;
3035
3036               base = TREE_OPERAND (t, 0);
3037               ctor = get_base_constructor (base, &offset, valueize);
3038               /* Empty constructor.  Always fold to 0.  */
3039               if (ctor == error_mark_node)
3040                 return build_zero_cst (TREE_TYPE (t));
3041               /* Out of bound array access.  Value is undefined,
3042                  but don't fold.  */
3043               if (offset < 0)
3044                 return NULL_TREE;
3045               /* We can not determine ctor.  */
3046               if (!ctor)
3047                 return NULL_TREE;
3048               return fold_ctor_reference (TREE_TYPE (t), ctor, offset,
3049                                           TREE_INT_CST_LOW (unit_size)
3050                                           * BITS_PER_UNIT,
3051                                           base);
3052             }
3053         }
3054       /* Fallthru.  */
3055
3056     case COMPONENT_REF:
3057     case BIT_FIELD_REF:
3058     case TARGET_MEM_REF:
3059     case MEM_REF:
3060       base = get_ref_base_and_extent (t, &offset, &size, &max_size);
3061       ctor = get_base_constructor (base, &offset, valueize);
3062
3063       /* Empty constructor.  Always fold to 0.  */
3064       if (ctor == error_mark_node)
3065         return build_zero_cst (TREE_TYPE (t));
3066       /* We do not know precise address.  */
3067       if (max_size == -1 || max_size != size)
3068         return NULL_TREE;
3069       /* We can not determine ctor.  */
3070       if (!ctor)
3071         return NULL_TREE;
3072
3073       /* Out of bound array access.  Value is undefined, but don't fold.  */
3074       if (offset < 0)
3075         return NULL_TREE;
3076
3077       return fold_ctor_reference (TREE_TYPE (t), ctor, offset, size,
3078                                   base);
3079
3080     case REALPART_EXPR:
3081     case IMAGPART_EXPR:
3082       {
3083         tree c = fold_const_aggregate_ref_1 (TREE_OPERAND (t, 0), valueize);
3084         if (c && TREE_CODE (c) == COMPLEX_CST)
3085           return fold_build1_loc (EXPR_LOCATION (t),
3086                               TREE_CODE (t), TREE_TYPE (t), c);
3087         break;
3088       }
3089
3090     default:
3091       break;
3092     }
3093
3094   return NULL_TREE;
3095 }
3096
3097 tree
3098 fold_const_aggregate_ref (tree t)
3099 {
3100   return fold_const_aggregate_ref_1 (t, NULL);
3101 }
3102
3103 /* Return a declaration of a function which an OBJ_TYPE_REF references. TOKEN
3104    is integer form of OBJ_TYPE_REF_TOKEN of the reference expression.
3105    KNOWN_BINFO carries the binfo describing the true type of
3106    OBJ_TYPE_REF_OBJECT(REF).  */
3107
3108 tree
3109 gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo)
3110 {
3111   unsigned HOST_WIDE_INT offset, size;
3112   tree v, fn, vtable;
3113
3114   vtable = v = BINFO_VTABLE (known_binfo);
3115   /* If there is no virtual methods table, leave the OBJ_TYPE_REF alone.  */
3116   if (!v)
3117     return NULL_TREE;
3118
3119   if (TREE_CODE (v) == POINTER_PLUS_EXPR)
3120     {
3121       offset = tree_low_cst (TREE_OPERAND (v, 1), 1) * BITS_PER_UNIT;
3122       v = TREE_OPERAND (v, 0);
3123     }
3124   else
3125     offset = 0;
3126
3127   if (TREE_CODE (v) != ADDR_EXPR)
3128     return NULL_TREE;
3129   v = TREE_OPERAND (v, 0);
3130
3131   if (TREE_CODE (v) != VAR_DECL
3132       || !DECL_VIRTUAL_P (v)
3133       || !DECL_INITIAL (v)
3134       || DECL_INITIAL (v) == error_mark_node)
3135     return NULL_TREE;
3136   gcc_checking_assert (TREE_CODE (TREE_TYPE (v)) == ARRAY_TYPE);
3137   size = tree_low_cst (TYPE_SIZE (TREE_TYPE (TREE_TYPE (v))), 1);
3138   offset += token * size;
3139   fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), DECL_INITIAL (v),
3140                             offset, size, vtable);
3141   if (!fn || integer_zerop (fn))
3142     return NULL_TREE;
3143   gcc_assert (TREE_CODE (fn) == ADDR_EXPR
3144               || TREE_CODE (fn) == FDESC_EXPR);
3145   fn = TREE_OPERAND (fn, 0);
3146   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
3147
3148   /* When cgraph node is missing and function is not public, we cannot
3149      devirtualize.  This can happen in WHOPR when the actual method
3150      ends up in other partition, because we found devirtualization
3151      possibility too late.  */
3152   if (!can_refer_decl_in_current_unit_p (fn, vtable))
3153     return NULL_TREE;
3154
3155   /* Make sure we create a cgraph node for functions we'll reference.
3156      They can be non-existent if the reference comes from an entry
3157      of an external vtable for example.  */
3158   cgraph_get_create_node (fn);
3159
3160   return fn;
3161 }
3162
3163 /* Return true iff VAL is a gimple expression that is known to be
3164    non-negative.  Restricted to floating-point inputs.  */
3165
3166 bool
3167 gimple_val_nonnegative_real_p (tree val)
3168 {
3169   gimple def_stmt;
3170
3171   gcc_assert (val && SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)));
3172
3173   /* Use existing logic for non-gimple trees.  */
3174   if (tree_expr_nonnegative_p (val))
3175     return true;
3176
3177   if (TREE_CODE (val) != SSA_NAME)
3178     return false;
3179
3180   /* Currently we look only at the immediately defining statement
3181      to make this determination, since recursion on defining 
3182      statements of operands can lead to quadratic behavior in the
3183      worst case.  This is expected to catch almost all occurrences
3184      in practice.  It would be possible to implement limited-depth
3185      recursion if important cases are lost.  Alternatively, passes
3186      that need this information (such as the pow/powi lowering code
3187      in the cse_sincos pass) could be revised to provide it through
3188      dataflow propagation.  */
3189
3190   def_stmt = SSA_NAME_DEF_STMT (val);
3191
3192   if (is_gimple_assign (def_stmt))
3193     {
3194       tree op0, op1;
3195
3196       /* See fold-const.c:tree_expr_nonnegative_p for additional
3197          cases that could be handled with recursion.  */
3198
3199       switch (gimple_assign_rhs_code (def_stmt))
3200         {
3201         case ABS_EXPR:
3202           /* Always true for floating-point operands.  */
3203           return true;
3204
3205         case MULT_EXPR:
3206           /* True if the two operands are identical (since we are
3207              restricted to floating-point inputs).  */
3208           op0 = gimple_assign_rhs1 (def_stmt);
3209           op1 = gimple_assign_rhs2 (def_stmt);
3210
3211           if (op0 == op1
3212               || operand_equal_p (op0, op1, 0))
3213             return true;
3214
3215         default:
3216           return false;
3217         }
3218     }
3219   else if (is_gimple_call (def_stmt))
3220     {
3221       tree fndecl = gimple_call_fndecl (def_stmt);
3222       if (fndecl
3223           && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3224         {
3225           tree arg1;
3226
3227           switch (DECL_FUNCTION_CODE (fndecl))
3228             {
3229             CASE_FLT_FN (BUILT_IN_ACOS):
3230             CASE_FLT_FN (BUILT_IN_ACOSH):
3231             CASE_FLT_FN (BUILT_IN_CABS):
3232             CASE_FLT_FN (BUILT_IN_COSH):
3233             CASE_FLT_FN (BUILT_IN_ERFC):
3234             CASE_FLT_FN (BUILT_IN_EXP):
3235             CASE_FLT_FN (BUILT_IN_EXP10):
3236             CASE_FLT_FN (BUILT_IN_EXP2):
3237             CASE_FLT_FN (BUILT_IN_FABS):
3238             CASE_FLT_FN (BUILT_IN_FDIM):
3239             CASE_FLT_FN (BUILT_IN_HYPOT):
3240             CASE_FLT_FN (BUILT_IN_POW10):
3241               return true;
3242
3243             CASE_FLT_FN (BUILT_IN_SQRT):
3244               /* sqrt(-0.0) is -0.0, and sqrt is not defined over other
3245                  nonnegative inputs.  */
3246               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (val))))
3247                 return true;
3248
3249               break;
3250
3251             CASE_FLT_FN (BUILT_IN_POWI):
3252               /* True if the second argument is an even integer.  */
3253               arg1 = gimple_call_arg (def_stmt, 1);
3254
3255               if (TREE_CODE (arg1) == INTEGER_CST
3256                   && (TREE_INT_CST_LOW (arg1) & 1) == 0)
3257                 return true;
3258
3259               break;
3260               
3261             CASE_FLT_FN (BUILT_IN_POW):
3262               /* True if the second argument is an even integer-valued
3263                  real.  */
3264               arg1 = gimple_call_arg (def_stmt, 1);
3265
3266               if (TREE_CODE (arg1) == REAL_CST)
3267                 {
3268                   REAL_VALUE_TYPE c;
3269                   HOST_WIDE_INT n;
3270
3271                   c = TREE_REAL_CST (arg1);
3272                   n = real_to_integer (&c);
3273
3274                   if ((n & 1) == 0)
3275                     {
3276                       REAL_VALUE_TYPE cint;
3277                       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3278                       if (real_identical (&c, &cint))
3279                         return true;
3280                     }
3281                 }
3282
3283               break;
3284
3285             default:
3286               return false;
3287             }
3288         }
3289     }
3290
3291   return false;
3292 }