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