OSDN Git Service

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