OSDN Git Service

Minor reformatting.
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*@@ This file should be rewritten to use an arbitrary precision
23   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25   @@ The routines that translate from the ap rep should
26   @@ warn if precision et. al. is lost.
27   @@ This would also make life easier when this technology is used
28   @@ for cross-compilers.  */
29
30 /* The entry points in this file are fold, size_int_wide, size_binop
31    and force_fit_type_double.
32
33    fold takes a tree as argument and returns a simplified tree.
34
35    size_binop takes a tree code for an arithmetic operation
36    and two operands that are trees, and produces a tree for the
37    result, assuming the type comes from `sizetype'.
38
39    size_int takes an integer value, and creates a tree constant
40    with type from `sizetype'.
41
42    force_fit_type_double takes a constant, an overflowable flag and a
43    prior overflow indicator.  It forces the value to fit the type and
44    sets TREE_OVERFLOW.
45
46    Note: Since the folders get called on non-gimple code as well as
47    gimple code, we need to handle GIMPLE tuples as well as their
48    corresponding tree equivalents.  */
49
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include "flags.h"
55 #include "tree.h"
56 #include "real.h"
57 #include "fixed-value.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "target.h"
62 #include "toplev.h"
63 #include "intl.h"
64 #include "ggc.h"
65 #include "hashtab.h"
66 #include "langhooks.h"
67 #include "md5.h"
68 #include "gimple.h"
69
70 /* Nonzero if we are folding constants inside an initializer; zero
71    otherwise.  */
72 int folding_initializer = 0;
73
74 /* The following constants represent a bit based encoding of GCC's
75    comparison operators.  This encoding simplifies transformations
76    on relational comparison operators, such as AND and OR.  */
77 enum comparison_code {
78   COMPCODE_FALSE = 0,
79   COMPCODE_LT = 1,
80   COMPCODE_EQ = 2,
81   COMPCODE_LE = 3,
82   COMPCODE_GT = 4,
83   COMPCODE_LTGT = 5,
84   COMPCODE_GE = 6,
85   COMPCODE_ORD = 7,
86   COMPCODE_UNORD = 8,
87   COMPCODE_UNLT = 9,
88   COMPCODE_UNEQ = 10,
89   COMPCODE_UNLE = 11,
90   COMPCODE_UNGT = 12,
91   COMPCODE_NE = 13,
92   COMPCODE_UNGE = 14,
93   COMPCODE_TRUE = 15
94 };
95
96 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
97 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
98 static bool negate_mathfn_p (enum built_in_function);
99 static bool negate_expr_p (tree);
100 static tree negate_expr (tree);
101 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
102 static tree associate_trees (tree, tree, enum tree_code, tree);
103 static tree const_binop (enum tree_code, tree, tree, int);
104 static enum comparison_code comparison_to_compcode (enum tree_code);
105 static enum tree_code compcode_to_comparison (enum comparison_code);
106 static int operand_equal_for_comparison_p (tree, tree, tree);
107 static int twoval_comparison_p (tree, tree *, tree *, int *);
108 static tree eval_subst (tree, tree, tree, tree, tree);
109 static tree pedantic_omit_one_operand (tree, tree, tree);
110 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
111 static tree make_bit_field_ref (tree, tree, HOST_WIDE_INT, HOST_WIDE_INT, int);
112 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
113 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
114                                     enum machine_mode *, int *, int *,
115                                     tree *, tree *);
116 static int all_ones_mask_p (const_tree, int);
117 static tree sign_bit_p (tree, const_tree);
118 static int simple_operand_p (const_tree);
119 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
120 static tree range_predecessor (tree);
121 static tree range_successor (tree);
122 static tree make_range (tree, int *, tree *, tree *, bool *);
123 static tree build_range_check (tree, tree, int, tree, tree);
124 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
125                          tree);
126 static tree fold_range_test (enum tree_code, tree, tree, tree);
127 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
128 static tree unextend (tree, int, int, tree);
129 static tree fold_truthop (enum tree_code, tree, tree, tree);
130 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
131 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
132 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
133 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
134                                                  tree, tree,
135                                                  tree, tree, int);
136 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
137                                  tree, tree, tree);
138 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
139 static tree fold_div_compare (enum tree_code, tree, tree, tree);
140 static bool reorder_operands_p (const_tree, const_tree);
141 static tree fold_negate_const (tree, tree);
142 static tree fold_not_const (tree, tree);
143 static tree fold_relational_const (enum tree_code, tree, tree, tree);
144 static tree fold_convert_const (enum tree_code, tree, tree);
145
146
147 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
148    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
149    and SUM1.  Then this yields nonzero if overflow occurred during the
150    addition.
151
152    Overflow occurs if A and B have the same sign, but A and SUM differ in
153    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
154    sign.  */
155 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
156 \f
157 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
158    We do that by representing the two-word integer in 4 words, with only
159    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
160    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
161
162 #define LOWPART(x) \
163   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
164 #define HIGHPART(x) \
165   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
166 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
167
168 /* Unpack a two-word integer into 4 words.
169    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
170    WORDS points to the array of HOST_WIDE_INTs.  */
171
172 static void
173 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
174 {
175   words[0] = LOWPART (low);
176   words[1] = HIGHPART (low);
177   words[2] = LOWPART (hi);
178   words[3] = HIGHPART (hi);
179 }
180
181 /* Pack an array of 4 words into a two-word integer.
182    WORDS points to the array of words.
183    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
184
185 static void
186 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
187         HOST_WIDE_INT *hi)
188 {
189   *low = words[0] + words[1] * BASE;
190   *hi = words[2] + words[3] * BASE;
191 }
192 \f
193 /* Force the double-word integer L1, H1 to be within the range of the
194    integer type TYPE.  Stores the properly truncated and sign-extended
195    double-word integer in *LV, *HV.  Returns true if the operation
196    overflows, that is, argument and result are different.  */
197
198 int
199 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
200                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
201 {
202   unsigned HOST_WIDE_INT low0 = l1;
203   HOST_WIDE_INT high0 = h1;
204   unsigned int prec;
205   int sign_extended_type;
206
207   if (POINTER_TYPE_P (type)
208       || TREE_CODE (type) == OFFSET_TYPE)
209     prec = POINTER_SIZE;
210   else
211     prec = TYPE_PRECISION (type);
212
213   /* Size types *are* sign extended.  */
214   sign_extended_type = (!TYPE_UNSIGNED (type)
215                         || (TREE_CODE (type) == INTEGER_TYPE
216                             && TYPE_IS_SIZETYPE (type)));
217
218   /* First clear all bits that are beyond the type's precision.  */
219   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
220     ;
221   else if (prec > HOST_BITS_PER_WIDE_INT)
222     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
223   else
224     {
225       h1 = 0;
226       if (prec < HOST_BITS_PER_WIDE_INT)
227         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
228     }
229
230   /* Then do sign extension if necessary.  */
231   if (!sign_extended_type)
232     /* No sign extension */;
233   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
234     /* Correct width already.  */;
235   else if (prec > HOST_BITS_PER_WIDE_INT)
236     {
237       /* Sign extend top half? */
238       if (h1 & ((unsigned HOST_WIDE_INT)1
239                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
240         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
241     }
242   else if (prec == HOST_BITS_PER_WIDE_INT)
243     {
244       if ((HOST_WIDE_INT)l1 < 0)
245         h1 = -1;
246     }
247   else
248     {
249       /* Sign extend bottom half? */
250       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
251         {
252           h1 = -1;
253           l1 |= (HOST_WIDE_INT)(-1) << prec;
254         }
255     }
256
257   *lv = l1;
258   *hv = h1;
259
260   /* If the value didn't fit, signal overflow.  */
261   return l1 != low0 || h1 != high0;
262 }
263
264 /* We force the double-int HIGH:LOW to the range of the type TYPE by
265    sign or zero extending it.
266    OVERFLOWABLE indicates if we are interested
267    in overflow of the value, when >0 we are only interested in signed
268    overflow, for <0 we are interested in any overflow.  OVERFLOWED
269    indicates whether overflow has already occurred.  CONST_OVERFLOWED
270    indicates whether constant overflow has already occurred.  We force
271    T's value to be within range of T's type (by setting to 0 or 1 all
272    the bits outside the type's range).  We set TREE_OVERFLOWED if,
273         OVERFLOWED is nonzero,
274         or OVERFLOWABLE is >0 and signed overflow occurs
275         or OVERFLOWABLE is <0 and any overflow occurs
276    We return a new tree node for the extended double-int.  The node
277    is shared if no overflow flags are set.  */
278
279 tree
280 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
281                        HOST_WIDE_INT high, int overflowable,
282                        bool overflowed)
283 {
284   int sign_extended_type;
285   bool overflow;
286
287   /* Size types *are* sign extended.  */
288   sign_extended_type = (!TYPE_UNSIGNED (type)
289                         || (TREE_CODE (type) == INTEGER_TYPE
290                             && TYPE_IS_SIZETYPE (type)));
291
292   overflow = fit_double_type (low, high, &low, &high, type);
293
294   /* If we need to set overflow flags, return a new unshared node.  */
295   if (overflowed || overflow)
296     {
297       if (overflowed
298           || overflowable < 0
299           || (overflowable > 0 && sign_extended_type))
300         {
301           tree t = make_node (INTEGER_CST);
302           TREE_INT_CST_LOW (t) = low;
303           TREE_INT_CST_HIGH (t) = high;
304           TREE_TYPE (t) = type;
305           TREE_OVERFLOW (t) = 1;
306           return t;
307         }
308     }
309
310   /* Else build a shared node.  */
311   return build_int_cst_wide (type, low, high);
312 }
313 \f
314 /* Add two doubleword integers with doubleword result.
315    Return nonzero if the operation overflows according to UNSIGNED_P.
316    Each argument is given as two `HOST_WIDE_INT' pieces.
317    One argument is L1 and H1; the other, L2 and H2.
318    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
319
320 int
321 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
322                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
323                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
324                       bool unsigned_p)
325 {
326   unsigned HOST_WIDE_INT l;
327   HOST_WIDE_INT h;
328
329   l = l1 + l2;
330   h = h1 + h2 + (l < l1);
331
332   *lv = l;
333   *hv = h;
334
335   if (unsigned_p)
336     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
337   else
338     return OVERFLOW_SUM_SIGN (h1, h2, h);
339 }
340
341 /* Negate a doubleword integer with doubleword result.
342    Return nonzero if the operation overflows, assuming it's signed.
343    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
344    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
345
346 int
347 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
348             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
349 {
350   if (l1 == 0)
351     {
352       *lv = 0;
353       *hv = - h1;
354       return (*hv & h1) < 0;
355     }
356   else
357     {
358       *lv = -l1;
359       *hv = ~h1;
360       return 0;
361     }
362 }
363 \f
364 /* Multiply two doubleword integers with doubleword result.
365    Return nonzero if the operation overflows according to UNSIGNED_P.
366    Each argument is given as two `HOST_WIDE_INT' pieces.
367    One argument is L1 and H1; the other, L2 and H2.
368    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
369
370 int
371 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
372                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
373                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
374                       bool unsigned_p)
375 {
376   HOST_WIDE_INT arg1[4];
377   HOST_WIDE_INT arg2[4];
378   HOST_WIDE_INT prod[4 * 2];
379   unsigned HOST_WIDE_INT carry;
380   int i, j, k;
381   unsigned HOST_WIDE_INT toplow, neglow;
382   HOST_WIDE_INT tophigh, neghigh;
383
384   encode (arg1, l1, h1);
385   encode (arg2, l2, h2);
386
387   memset (prod, 0, sizeof prod);
388
389   for (i = 0; i < 4; i++)
390     {
391       carry = 0;
392       for (j = 0; j < 4; j++)
393         {
394           k = i + j;
395           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
396           carry += arg1[i] * arg2[j];
397           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
398           carry += prod[k];
399           prod[k] = LOWPART (carry);
400           carry = HIGHPART (carry);
401         }
402       prod[i + 4] = carry;
403     }
404
405   decode (prod, lv, hv);
406   decode (prod + 4, &toplow, &tophigh);
407
408   /* Unsigned overflow is immediate.  */
409   if (unsigned_p)
410     return (toplow | tophigh) != 0;
411
412   /* Check for signed overflow by calculating the signed representation of the
413      top half of the result; it should agree with the low half's sign bit.  */
414   if (h1 < 0)
415     {
416       neg_double (l2, h2, &neglow, &neghigh);
417       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
418     }
419   if (h2 < 0)
420     {
421       neg_double (l1, h1, &neglow, &neghigh);
422       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
423     }
424   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
425 }
426 \f
427 /* Shift the doubleword integer in L1, H1 left by COUNT places
428    keeping only PREC bits of result.
429    Shift right if COUNT is negative.
430    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
431    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
432
433 void
434 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
435                HOST_WIDE_INT count, unsigned int prec,
436                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
437 {
438   unsigned HOST_WIDE_INT signmask;
439
440   if (count < 0)
441     {
442       rshift_double (l1, h1, -count, prec, lv, hv, arith);
443       return;
444     }
445
446   if (SHIFT_COUNT_TRUNCATED)
447     count %= prec;
448
449   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
450     {
451       /* Shifting by the host word size is undefined according to the
452          ANSI standard, so we must handle this as a special case.  */
453       *hv = 0;
454       *lv = 0;
455     }
456   else if (count >= HOST_BITS_PER_WIDE_INT)
457     {
458       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
459       *lv = 0;
460     }
461   else
462     {
463       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
464              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
465       *lv = l1 << count;
466     }
467
468   /* Sign extend all bits that are beyond the precision.  */
469
470   signmask = -((prec > HOST_BITS_PER_WIDE_INT
471                 ? ((unsigned HOST_WIDE_INT) *hv
472                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
473                 : (*lv >> (prec - 1))) & 1);
474
475   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
476     ;
477   else if (prec >= HOST_BITS_PER_WIDE_INT)
478     {
479       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
480       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
481     }
482   else
483     {
484       *hv = signmask;
485       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
486       *lv |= signmask << prec;
487     }
488 }
489
490 /* Shift the doubleword integer in L1, H1 right by COUNT places
491    keeping only PREC bits of result.  COUNT must be positive.
492    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
493    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
494
495 void
496 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
497                HOST_WIDE_INT count, unsigned int prec,
498                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
499                int arith)
500 {
501   unsigned HOST_WIDE_INT signmask;
502
503   signmask = (arith
504               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
505               : 0);
506
507   if (SHIFT_COUNT_TRUNCATED)
508     count %= prec;
509
510   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
511     {
512       /* Shifting by the host word size is undefined according to the
513          ANSI standard, so we must handle this as a special case.  */
514       *hv = 0;
515       *lv = 0;
516     }
517   else if (count >= HOST_BITS_PER_WIDE_INT)
518     {
519       *hv = 0;
520       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
521     }
522   else
523     {
524       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
525       *lv = ((l1 >> count)
526              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
527     }
528
529   /* Zero / sign extend all bits that are beyond the precision.  */
530
531   if (count >= (HOST_WIDE_INT)prec)
532     {
533       *hv = signmask;
534       *lv = signmask;
535     }
536   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
537     ;
538   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
539     {
540       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
541       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
542     }
543   else
544     {
545       *hv = signmask;
546       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
547       *lv |= signmask << (prec - count);
548     }
549 }
550 \f
551 /* Rotate the doubleword integer in L1, H1 left by COUNT places
552    keeping only PREC bits of result.
553    Rotate right if COUNT is negative.
554    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
555
556 void
557 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
558                 HOST_WIDE_INT count, unsigned int prec,
559                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
560 {
561   unsigned HOST_WIDE_INT s1l, s2l;
562   HOST_WIDE_INT s1h, s2h;
563
564   count %= prec;
565   if (count < 0)
566     count += prec;
567
568   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
569   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
570   *lv = s1l | s2l;
571   *hv = s1h | s2h;
572 }
573
574 /* Rotate the doubleword integer in L1, H1 left by COUNT places
575    keeping only PREC bits of result.  COUNT must be positive.
576    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
577
578 void
579 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
580                 HOST_WIDE_INT count, unsigned int prec,
581                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
582 {
583   unsigned HOST_WIDE_INT s1l, s2l;
584   HOST_WIDE_INT s1h, s2h;
585
586   count %= prec;
587   if (count < 0)
588     count += prec;
589
590   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
591   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
592   *lv = s1l | s2l;
593   *hv = s1h | s2h;
594 }
595 \f
596 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
597    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
598    CODE is a tree code for a kind of division, one of
599    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
600    or EXACT_DIV_EXPR
601    It controls how the quotient is rounded to an integer.
602    Return nonzero if the operation overflows.
603    UNS nonzero says do unsigned division.  */
604
605 int
606 div_and_round_double (enum tree_code code, int uns,
607                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
608                       HOST_WIDE_INT hnum_orig,
609                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
610                       HOST_WIDE_INT hden_orig,
611                       unsigned HOST_WIDE_INT *lquo,
612                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
613                       HOST_WIDE_INT *hrem)
614 {
615   int quo_neg = 0;
616   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
617   HOST_WIDE_INT den[4], quo[4];
618   int i, j;
619   unsigned HOST_WIDE_INT work;
620   unsigned HOST_WIDE_INT carry = 0;
621   unsigned HOST_WIDE_INT lnum = lnum_orig;
622   HOST_WIDE_INT hnum = hnum_orig;
623   unsigned HOST_WIDE_INT lden = lden_orig;
624   HOST_WIDE_INT hden = hden_orig;
625   int overflow = 0;
626
627   if (hden == 0 && lden == 0)
628     overflow = 1, lden = 1;
629
630   /* Calculate quotient sign and convert operands to unsigned.  */
631   if (!uns)
632     {
633       if (hnum < 0)
634         {
635           quo_neg = ~ quo_neg;
636           /* (minimum integer) / (-1) is the only overflow case.  */
637           if (neg_double (lnum, hnum, &lnum, &hnum)
638               && ((HOST_WIDE_INT) lden & hden) == -1)
639             overflow = 1;
640         }
641       if (hden < 0)
642         {
643           quo_neg = ~ quo_neg;
644           neg_double (lden, hden, &lden, &hden);
645         }
646     }
647
648   if (hnum == 0 && hden == 0)
649     {                           /* single precision */
650       *hquo = *hrem = 0;
651       /* This unsigned division rounds toward zero.  */
652       *lquo = lnum / lden;
653       goto finish_up;
654     }
655
656   if (hnum == 0)
657     {                           /* trivial case: dividend < divisor */
658       /* hden != 0 already checked.  */
659       *hquo = *lquo = 0;
660       *hrem = hnum;
661       *lrem = lnum;
662       goto finish_up;
663     }
664
665   memset (quo, 0, sizeof quo);
666
667   memset (num, 0, sizeof num);  /* to zero 9th element */
668   memset (den, 0, sizeof den);
669
670   encode (num, lnum, hnum);
671   encode (den, lden, hden);
672
673   /* Special code for when the divisor < BASE.  */
674   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
675     {
676       /* hnum != 0 already checked.  */
677       for (i = 4 - 1; i >= 0; i--)
678         {
679           work = num[i] + carry * BASE;
680           quo[i] = work / lden;
681           carry = work % lden;
682         }
683     }
684   else
685     {
686       /* Full double precision division,
687          with thanks to Don Knuth's "Seminumerical Algorithms".  */
688       int num_hi_sig, den_hi_sig;
689       unsigned HOST_WIDE_INT quo_est, scale;
690
691       /* Find the highest nonzero divisor digit.  */
692       for (i = 4 - 1;; i--)
693         if (den[i] != 0)
694           {
695             den_hi_sig = i;
696             break;
697           }
698
699       /* Insure that the first digit of the divisor is at least BASE/2.
700          This is required by the quotient digit estimation algorithm.  */
701
702       scale = BASE / (den[den_hi_sig] + 1);
703       if (scale > 1)
704         {               /* scale divisor and dividend */
705           carry = 0;
706           for (i = 0; i <= 4 - 1; i++)
707             {
708               work = (num[i] * scale) + carry;
709               num[i] = LOWPART (work);
710               carry = HIGHPART (work);
711             }
712
713           num[4] = carry;
714           carry = 0;
715           for (i = 0; i <= 4 - 1; i++)
716             {
717               work = (den[i] * scale) + carry;
718               den[i] = LOWPART (work);
719               carry = HIGHPART (work);
720               if (den[i] != 0) den_hi_sig = i;
721             }
722         }
723
724       num_hi_sig = 4;
725
726       /* Main loop */
727       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
728         {
729           /* Guess the next quotient digit, quo_est, by dividing the first
730              two remaining dividend digits by the high order quotient digit.
731              quo_est is never low and is at most 2 high.  */
732           unsigned HOST_WIDE_INT tmp;
733
734           num_hi_sig = i + den_hi_sig + 1;
735           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
736           if (num[num_hi_sig] != den[den_hi_sig])
737             quo_est = work / den[den_hi_sig];
738           else
739             quo_est = BASE - 1;
740
741           /* Refine quo_est so it's usually correct, and at most one high.  */
742           tmp = work - quo_est * den[den_hi_sig];
743           if (tmp < BASE
744               && (den[den_hi_sig - 1] * quo_est
745                   > (tmp * BASE + num[num_hi_sig - 2])))
746             quo_est--;
747
748           /* Try QUO_EST as the quotient digit, by multiplying the
749              divisor by QUO_EST and subtracting from the remaining dividend.
750              Keep in mind that QUO_EST is the I - 1st digit.  */
751
752           carry = 0;
753           for (j = 0; j <= den_hi_sig; j++)
754             {
755               work = quo_est * den[j] + carry;
756               carry = HIGHPART (work);
757               work = num[i + j] - LOWPART (work);
758               num[i + j] = LOWPART (work);
759               carry += HIGHPART (work) != 0;
760             }
761
762           /* If quo_est was high by one, then num[i] went negative and
763              we need to correct things.  */
764           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
765             {
766               quo_est--;
767               carry = 0;                /* add divisor back in */
768               for (j = 0; j <= den_hi_sig; j++)
769                 {
770                   work = num[i + j] + den[j] + carry;
771                   carry = HIGHPART (work);
772                   num[i + j] = LOWPART (work);
773                 }
774
775               num [num_hi_sig] += carry;
776             }
777
778           /* Store the quotient digit.  */
779           quo[i] = quo_est;
780         }
781     }
782
783   decode (quo, lquo, hquo);
784
785  finish_up:
786   /* If result is negative, make it so.  */
787   if (quo_neg)
788     neg_double (*lquo, *hquo, lquo, hquo);
789
790   /* Compute trial remainder:  rem = num - (quo * den)  */
791   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
792   neg_double (*lrem, *hrem, lrem, hrem);
793   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
794
795   switch (code)
796     {
797     case TRUNC_DIV_EXPR:
798     case TRUNC_MOD_EXPR:        /* round toward zero */
799     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
800       return overflow;
801
802     case FLOOR_DIV_EXPR:
803     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
804       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
805         {
806           /* quo = quo - 1;  */
807           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
808                       lquo, hquo);
809         }
810       else
811         return overflow;
812       break;
813
814     case CEIL_DIV_EXPR:
815     case CEIL_MOD_EXPR:         /* round toward positive infinity */
816       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
817         {
818           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
819                       lquo, hquo);
820         }
821       else
822         return overflow;
823       break;
824
825     case ROUND_DIV_EXPR:
826     case ROUND_MOD_EXPR:        /* round to closest integer */
827       {
828         unsigned HOST_WIDE_INT labs_rem = *lrem;
829         HOST_WIDE_INT habs_rem = *hrem;
830         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
831         HOST_WIDE_INT habs_den = hden, htwice;
832
833         /* Get absolute values.  */
834         if (*hrem < 0)
835           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
836         if (hden < 0)
837           neg_double (lden, hden, &labs_den, &habs_den);
838
839         /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient.  */
840         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
841                     labs_rem, habs_rem, &ltwice, &htwice);
842
843         if (((unsigned HOST_WIDE_INT) habs_den
844              < (unsigned HOST_WIDE_INT) htwice)
845             || (((unsigned HOST_WIDE_INT) habs_den
846                  == (unsigned HOST_WIDE_INT) htwice)
847                 && (labs_den <= ltwice)))
848           {
849             if (*hquo < 0)
850               /* quo = quo - 1;  */
851               add_double (*lquo, *hquo,
852                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
853             else
854               /* quo = quo + 1; */
855               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
856                           lquo, hquo);
857           }
858         else
859           return overflow;
860       }
861       break;
862
863     default:
864       gcc_unreachable ();
865     }
866
867   /* Compute true remainder:  rem = num - (quo * den)  */
868   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
869   neg_double (*lrem, *hrem, lrem, hrem);
870   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
871   return overflow;
872 }
873
874 /* If ARG2 divides ARG1 with zero remainder, carries out the division
875    of type CODE and returns the quotient.
876    Otherwise returns NULL_TREE.  */
877
878 tree
879 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
880 {
881   unsigned HOST_WIDE_INT int1l, int2l;
882   HOST_WIDE_INT int1h, int2h;
883   unsigned HOST_WIDE_INT quol, reml;
884   HOST_WIDE_INT quoh, remh;
885   tree type = TREE_TYPE (arg1);
886   int uns = TYPE_UNSIGNED (type);
887
888   int1l = TREE_INT_CST_LOW (arg1);
889   int1h = TREE_INT_CST_HIGH (arg1);
890   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
891      &obj[some_exotic_number].  */
892   if (POINTER_TYPE_P (type))
893     {
894       uns = false;
895       type = signed_type_for (type);
896       fit_double_type (int1l, int1h, &int1l, &int1h,
897                        type);
898     }
899   else
900     fit_double_type (int1l, int1h, &int1l, &int1h, type);
901   int2l = TREE_INT_CST_LOW (arg2);
902   int2h = TREE_INT_CST_HIGH (arg2);
903
904   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
905                         &quol, &quoh, &reml, &remh);
906   if (remh != 0 || reml != 0)
907     return NULL_TREE;
908
909   return build_int_cst_wide (type, quol, quoh);
910 }
911 \f
912 /* This is nonzero if we should defer warnings about undefined
913    overflow.  This facility exists because these warnings are a
914    special case.  The code to estimate loop iterations does not want
915    to issue any warnings, since it works with expressions which do not
916    occur in user code.  Various bits of cleanup code call fold(), but
917    only use the result if it has certain characteristics (e.g., is a
918    constant); that code only wants to issue a warning if the result is
919    used.  */
920
921 static int fold_deferring_overflow_warnings;
922
923 /* If a warning about undefined overflow is deferred, this is the
924    warning.  Note that this may cause us to turn two warnings into
925    one, but that is fine since it is sufficient to only give one
926    warning per expression.  */
927
928 static const char* fold_deferred_overflow_warning;
929
930 /* If a warning about undefined overflow is deferred, this is the
931    level at which the warning should be emitted.  */
932
933 static enum warn_strict_overflow_code fold_deferred_overflow_code;
934
935 /* Start deferring overflow warnings.  We could use a stack here to
936    permit nested calls, but at present it is not necessary.  */
937
938 void
939 fold_defer_overflow_warnings (void)
940 {
941   ++fold_deferring_overflow_warnings;
942 }
943
944 /* Stop deferring overflow warnings.  If there is a pending warning,
945    and ISSUE is true, then issue the warning if appropriate.  STMT is
946    the statement with which the warning should be associated (used for
947    location information); STMT may be NULL.  CODE is the level of the
948    warning--a warn_strict_overflow_code value.  This function will use
949    the smaller of CODE and the deferred code when deciding whether to
950    issue the warning.  CODE may be zero to mean to always use the
951    deferred code.  */
952
953 void
954 fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
955 {
956   const char *warnmsg;
957   location_t locus;
958
959   gcc_assert (fold_deferring_overflow_warnings > 0);
960   --fold_deferring_overflow_warnings;
961   if (fold_deferring_overflow_warnings > 0)
962     {
963       if (fold_deferred_overflow_warning != NULL
964           && code != 0
965           && code < (int) fold_deferred_overflow_code)
966         fold_deferred_overflow_code = code;
967       return;
968     }
969
970   warnmsg = fold_deferred_overflow_warning;
971   fold_deferred_overflow_warning = NULL;
972
973   if (!issue || warnmsg == NULL)
974     return;
975
976   if (gimple_no_warning_p (stmt))
977     return;
978
979   /* Use the smallest code level when deciding to issue the
980      warning.  */
981   if (code == 0 || code > (int) fold_deferred_overflow_code)
982     code = fold_deferred_overflow_code;
983
984   if (!issue_strict_overflow_warning (code))
985     return;
986
987   if (stmt == NULL)
988     locus = input_location;
989   else
990     locus = gimple_location (stmt);
991   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
992 }
993
994 /* Stop deferring overflow warnings, ignoring any deferred
995    warnings.  */
996
997 void
998 fold_undefer_and_ignore_overflow_warnings (void)
999 {
1000   fold_undefer_overflow_warnings (false, NULL, 0);
1001 }
1002
1003 /* Whether we are deferring overflow warnings.  */
1004
1005 bool
1006 fold_deferring_overflow_warnings_p (void)
1007 {
1008   return fold_deferring_overflow_warnings > 0;
1009 }
1010
1011 /* This is called when we fold something based on the fact that signed
1012    overflow is undefined.  */
1013
1014 static void
1015 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1016 {
1017   if (fold_deferring_overflow_warnings > 0)
1018     {
1019       if (fold_deferred_overflow_warning == NULL
1020           || wc < fold_deferred_overflow_code)
1021         {
1022           fold_deferred_overflow_warning = gmsgid;
1023           fold_deferred_overflow_code = wc;
1024         }
1025     }
1026   else if (issue_strict_overflow_warning (wc))
1027     warning (OPT_Wstrict_overflow, gmsgid);
1028 }
1029 \f
1030 /* Return true if the built-in mathematical function specified by CODE
1031    is odd, i.e. -f(x) == f(-x).  */
1032
1033 static bool
1034 negate_mathfn_p (enum built_in_function code)
1035 {
1036   switch (code)
1037     {
1038     CASE_FLT_FN (BUILT_IN_ASIN):
1039     CASE_FLT_FN (BUILT_IN_ASINH):
1040     CASE_FLT_FN (BUILT_IN_ATAN):
1041     CASE_FLT_FN (BUILT_IN_ATANH):
1042     CASE_FLT_FN (BUILT_IN_CASIN):
1043     CASE_FLT_FN (BUILT_IN_CASINH):
1044     CASE_FLT_FN (BUILT_IN_CATAN):
1045     CASE_FLT_FN (BUILT_IN_CATANH):
1046     CASE_FLT_FN (BUILT_IN_CBRT):
1047     CASE_FLT_FN (BUILT_IN_CPROJ):
1048     CASE_FLT_FN (BUILT_IN_CSIN):
1049     CASE_FLT_FN (BUILT_IN_CSINH):
1050     CASE_FLT_FN (BUILT_IN_CTAN):
1051     CASE_FLT_FN (BUILT_IN_CTANH):
1052     CASE_FLT_FN (BUILT_IN_ERF):
1053     CASE_FLT_FN (BUILT_IN_LLROUND):
1054     CASE_FLT_FN (BUILT_IN_LROUND):
1055     CASE_FLT_FN (BUILT_IN_ROUND):
1056     CASE_FLT_FN (BUILT_IN_SIN):
1057     CASE_FLT_FN (BUILT_IN_SINH):
1058     CASE_FLT_FN (BUILT_IN_TAN):
1059     CASE_FLT_FN (BUILT_IN_TANH):
1060     CASE_FLT_FN (BUILT_IN_TRUNC):
1061       return true;
1062
1063     CASE_FLT_FN (BUILT_IN_LLRINT):
1064     CASE_FLT_FN (BUILT_IN_LRINT):
1065     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1066     CASE_FLT_FN (BUILT_IN_RINT):
1067       return !flag_rounding_math;
1068     
1069     default:
1070       break;
1071     }
1072   return false;
1073 }
1074
1075 /* Check whether we may negate an integer constant T without causing
1076    overflow.  */
1077
1078 bool
1079 may_negate_without_overflow_p (const_tree t)
1080 {
1081   unsigned HOST_WIDE_INT val;
1082   unsigned int prec;
1083   tree type;
1084
1085   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1086
1087   type = TREE_TYPE (t);
1088   if (TYPE_UNSIGNED (type))
1089     return false;
1090
1091   prec = TYPE_PRECISION (type);
1092   if (prec > HOST_BITS_PER_WIDE_INT)
1093     {
1094       if (TREE_INT_CST_LOW (t) != 0)
1095         return true;
1096       prec -= HOST_BITS_PER_WIDE_INT;
1097       val = TREE_INT_CST_HIGH (t);
1098     }
1099   else
1100     val = TREE_INT_CST_LOW (t);
1101   if (prec < HOST_BITS_PER_WIDE_INT)
1102     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1103   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1104 }
1105
1106 /* Determine whether an expression T can be cheaply negated using
1107    the function negate_expr without introducing undefined overflow.  */
1108
1109 static bool
1110 negate_expr_p (tree t)
1111 {
1112   tree type;
1113
1114   if (t == 0)
1115     return false;
1116
1117   type = TREE_TYPE (t);
1118
1119   STRIP_SIGN_NOPS (t);
1120   switch (TREE_CODE (t))
1121     {
1122     case INTEGER_CST:
1123       if (TYPE_OVERFLOW_WRAPS (type))
1124         return true;
1125
1126       /* Check that -CST will not overflow type.  */
1127       return may_negate_without_overflow_p (t);
1128     case BIT_NOT_EXPR:
1129       return (INTEGRAL_TYPE_P (type)
1130               && TYPE_OVERFLOW_WRAPS (type));
1131
1132     case FIXED_CST:
1133     case REAL_CST:
1134     case NEGATE_EXPR:
1135       return true;
1136
1137     case COMPLEX_CST:
1138       return negate_expr_p (TREE_REALPART (t))
1139              && negate_expr_p (TREE_IMAGPART (t));
1140
1141     case COMPLEX_EXPR:
1142       return negate_expr_p (TREE_OPERAND (t, 0))
1143              && negate_expr_p (TREE_OPERAND (t, 1));
1144
1145     case CONJ_EXPR:
1146       return negate_expr_p (TREE_OPERAND (t, 0));
1147
1148     case PLUS_EXPR:
1149       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1150           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1151         return false;
1152       /* -(A + B) -> (-B) - A.  */
1153       if (negate_expr_p (TREE_OPERAND (t, 1))
1154           && reorder_operands_p (TREE_OPERAND (t, 0),
1155                                  TREE_OPERAND (t, 1)))
1156         return true;
1157       /* -(A + B) -> (-A) - B.  */
1158       return negate_expr_p (TREE_OPERAND (t, 0));
1159
1160     case MINUS_EXPR:
1161       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1162       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1163              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1164              && reorder_operands_p (TREE_OPERAND (t, 0),
1165                                     TREE_OPERAND (t, 1));
1166
1167     case MULT_EXPR:
1168       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1169         break;
1170
1171       /* Fall through.  */
1172
1173     case RDIV_EXPR:
1174       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1175         return negate_expr_p (TREE_OPERAND (t, 1))
1176                || negate_expr_p (TREE_OPERAND (t, 0));
1177       break;
1178
1179     case TRUNC_DIV_EXPR:
1180     case ROUND_DIV_EXPR:
1181     case FLOOR_DIV_EXPR:
1182     case CEIL_DIV_EXPR:
1183     case EXACT_DIV_EXPR:
1184       /* In general we can't negate A / B, because if A is INT_MIN and
1185          B is 1, we may turn this into INT_MIN / -1 which is undefined
1186          and actually traps on some architectures.  But if overflow is
1187          undefined, we can negate, because - (INT_MIN / 1) is an
1188          overflow.  */
1189       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1190           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1191         break;
1192       return negate_expr_p (TREE_OPERAND (t, 1))
1193              || negate_expr_p (TREE_OPERAND (t, 0));
1194
1195     case NOP_EXPR:
1196       /* Negate -((double)float) as (double)(-float).  */
1197       if (TREE_CODE (type) == REAL_TYPE)
1198         {
1199           tree tem = strip_float_extensions (t);
1200           if (tem != t)
1201             return negate_expr_p (tem);
1202         }
1203       break;
1204
1205     case CALL_EXPR:
1206       /* Negate -f(x) as f(-x).  */
1207       if (negate_mathfn_p (builtin_mathfn_code (t)))
1208         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1209       break;
1210
1211     case RSHIFT_EXPR:
1212       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1213       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1214         {
1215           tree op1 = TREE_OPERAND (t, 1);
1216           if (TREE_INT_CST_HIGH (op1) == 0
1217               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1218                  == TREE_INT_CST_LOW (op1))
1219             return true;
1220         }
1221       break;
1222
1223     default:
1224       break;
1225     }
1226   return false;
1227 }
1228
1229 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1230    simplification is possible.
1231    If negate_expr_p would return true for T, NULL_TREE will never be
1232    returned.  */
1233
1234 static tree
1235 fold_negate_expr (tree t)
1236 {
1237   tree type = TREE_TYPE (t);
1238   tree tem;
1239
1240   switch (TREE_CODE (t))
1241     {
1242     /* Convert - (~A) to A + 1.  */
1243     case BIT_NOT_EXPR:
1244       if (INTEGRAL_TYPE_P (type))
1245         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1246                             build_int_cst (type, 1));
1247       break;
1248       
1249     case INTEGER_CST:
1250       tem = fold_negate_const (t, type);
1251       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1252           || !TYPE_OVERFLOW_TRAPS (type))
1253         return tem;
1254       break;
1255
1256     case REAL_CST:
1257       tem = fold_negate_const (t, type);
1258       /* Two's complement FP formats, such as c4x, may overflow.  */
1259       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1260         return tem;
1261       break;
1262
1263     case FIXED_CST:
1264       tem = fold_negate_const (t, type);
1265       return tem;
1266
1267     case COMPLEX_CST:
1268       {
1269         tree rpart = negate_expr (TREE_REALPART (t));
1270         tree ipart = negate_expr (TREE_IMAGPART (t));
1271
1272         if ((TREE_CODE (rpart) == REAL_CST
1273              && TREE_CODE (ipart) == REAL_CST)
1274             || (TREE_CODE (rpart) == INTEGER_CST
1275                 && TREE_CODE (ipart) == INTEGER_CST))
1276           return build_complex (type, rpart, ipart);
1277       }
1278       break;
1279
1280     case COMPLEX_EXPR:
1281       if (negate_expr_p (t))
1282         return fold_build2 (COMPLEX_EXPR, type,
1283                             fold_negate_expr (TREE_OPERAND (t, 0)),
1284                             fold_negate_expr (TREE_OPERAND (t, 1)));
1285       break;
1286       
1287     case CONJ_EXPR:
1288       if (negate_expr_p (t))
1289         return fold_build1 (CONJ_EXPR, type,
1290                             fold_negate_expr (TREE_OPERAND (t, 0)));
1291       break;
1292
1293     case NEGATE_EXPR:
1294       return TREE_OPERAND (t, 0);
1295
1296     case PLUS_EXPR:
1297       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1298           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1299         {
1300           /* -(A + B) -> (-B) - A.  */
1301           if (negate_expr_p (TREE_OPERAND (t, 1))
1302               && reorder_operands_p (TREE_OPERAND (t, 0),
1303                                      TREE_OPERAND (t, 1)))
1304             {
1305               tem = negate_expr (TREE_OPERAND (t, 1));
1306               return fold_build2 (MINUS_EXPR, type,
1307                                   tem, TREE_OPERAND (t, 0));
1308             }
1309
1310           /* -(A + B) -> (-A) - B.  */
1311           if (negate_expr_p (TREE_OPERAND (t, 0)))
1312             {
1313               tem = negate_expr (TREE_OPERAND (t, 0));
1314               return fold_build2 (MINUS_EXPR, type,
1315                                   tem, TREE_OPERAND (t, 1));
1316             }
1317         }
1318       break;
1319
1320     case MINUS_EXPR:
1321       /* - (A - B) -> B - A  */
1322       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1323           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1324           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1325         return fold_build2 (MINUS_EXPR, type,
1326                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1327       break;
1328
1329     case MULT_EXPR:
1330       if (TYPE_UNSIGNED (type))
1331         break;
1332
1333       /* Fall through.  */
1334
1335     case RDIV_EXPR:
1336       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1337         {
1338           tem = TREE_OPERAND (t, 1);
1339           if (negate_expr_p (tem))
1340             return fold_build2 (TREE_CODE (t), type,
1341                                 TREE_OPERAND (t, 0), negate_expr (tem));
1342           tem = TREE_OPERAND (t, 0);
1343           if (negate_expr_p (tem))
1344             return fold_build2 (TREE_CODE (t), type,
1345                                 negate_expr (tem), TREE_OPERAND (t, 1));
1346         }
1347       break;
1348
1349     case TRUNC_DIV_EXPR:
1350     case ROUND_DIV_EXPR:
1351     case FLOOR_DIV_EXPR:
1352     case CEIL_DIV_EXPR:
1353     case EXACT_DIV_EXPR:
1354       /* In general we can't negate A / B, because if A is INT_MIN and
1355          B is 1, we may turn this into INT_MIN / -1 which is undefined
1356          and actually traps on some architectures.  But if overflow is
1357          undefined, we can negate, because - (INT_MIN / 1) is an
1358          overflow.  */
1359       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1360         {
1361           const char * const warnmsg = G_("assuming signed overflow does not "
1362                                           "occur when negating a division");
1363           tem = TREE_OPERAND (t, 1);
1364           if (negate_expr_p (tem))
1365             {
1366               if (INTEGRAL_TYPE_P (type)
1367                   && (TREE_CODE (tem) != INTEGER_CST
1368                       || integer_onep (tem)))
1369                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1370               return fold_build2 (TREE_CODE (t), type,
1371                                   TREE_OPERAND (t, 0), negate_expr (tem));
1372             }
1373           tem = TREE_OPERAND (t, 0);
1374           if (negate_expr_p (tem))
1375             {
1376               if (INTEGRAL_TYPE_P (type)
1377                   && (TREE_CODE (tem) != INTEGER_CST
1378                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1379                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1380               return fold_build2 (TREE_CODE (t), type,
1381                                   negate_expr (tem), TREE_OPERAND (t, 1));
1382             }
1383         }
1384       break;
1385
1386     case NOP_EXPR:
1387       /* Convert -((double)float) into (double)(-float).  */
1388       if (TREE_CODE (type) == REAL_TYPE)
1389         {
1390           tem = strip_float_extensions (t);
1391           if (tem != t && negate_expr_p (tem))
1392             return fold_convert (type, negate_expr (tem));
1393         }
1394       break;
1395
1396     case CALL_EXPR:
1397       /* Negate -f(x) as f(-x).  */
1398       if (negate_mathfn_p (builtin_mathfn_code (t))
1399           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1400         {
1401           tree fndecl, arg;
1402
1403           fndecl = get_callee_fndecl (t);
1404           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1405           return build_call_expr (fndecl, 1, arg);
1406         }
1407       break;
1408
1409     case RSHIFT_EXPR:
1410       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1411       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1412         {
1413           tree op1 = TREE_OPERAND (t, 1);
1414           if (TREE_INT_CST_HIGH (op1) == 0
1415               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1416                  == TREE_INT_CST_LOW (op1))
1417             {
1418               tree ntype = TYPE_UNSIGNED (type)
1419                            ? signed_type_for (type)
1420                            : unsigned_type_for (type);
1421               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1422               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1423               return fold_convert (type, temp);
1424             }
1425         }
1426       break;
1427
1428     default:
1429       break;
1430     }
1431
1432   return NULL_TREE;
1433 }
1434
1435 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1436    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1437    return NULL_TREE. */
1438
1439 static tree
1440 negate_expr (tree t)
1441 {
1442   tree type, tem;
1443
1444   if (t == NULL_TREE)
1445     return NULL_TREE;
1446
1447   type = TREE_TYPE (t);
1448   STRIP_SIGN_NOPS (t);
1449
1450   tem = fold_negate_expr (t);
1451   if (!tem)
1452     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1453   return fold_convert (type, tem);
1454 }
1455 \f
1456 /* Split a tree IN into a constant, literal and variable parts that could be
1457    combined with CODE to make IN.  "constant" means an expression with
1458    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1459    commutative arithmetic operation.  Store the constant part into *CONP,
1460    the literal in *LITP and return the variable part.  If a part isn't
1461    present, set it to null.  If the tree does not decompose in this way,
1462    return the entire tree as the variable part and the other parts as null.
1463
1464    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1465    case, we negate an operand that was subtracted.  Except if it is a
1466    literal for which we use *MINUS_LITP instead.
1467
1468    If NEGATE_P is true, we are negating all of IN, again except a literal
1469    for which we use *MINUS_LITP instead.
1470
1471    If IN is itself a literal or constant, return it as appropriate.
1472
1473    Note that we do not guarantee that any of the three values will be the
1474    same type as IN, but they will have the same signedness and mode.  */
1475
1476 static tree
1477 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1478             tree *minus_litp, int negate_p)
1479 {
1480   tree var = 0;
1481
1482   *conp = 0;
1483   *litp = 0;
1484   *minus_litp = 0;
1485
1486   /* Strip any conversions that don't change the machine mode or signedness.  */
1487   STRIP_SIGN_NOPS (in);
1488
1489   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1490       || TREE_CODE (in) == FIXED_CST)
1491     *litp = in;
1492   else if (TREE_CODE (in) == code
1493            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1494                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1495                /* We can associate addition and subtraction together (even
1496                   though the C standard doesn't say so) for integers because
1497                   the value is not affected.  For reals, the value might be
1498                   affected, so we can't.  */
1499                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1500                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1501     {
1502       tree op0 = TREE_OPERAND (in, 0);
1503       tree op1 = TREE_OPERAND (in, 1);
1504       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1505       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1506
1507       /* First see if either of the operands is a literal, then a constant.  */
1508       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1509           || TREE_CODE (op0) == FIXED_CST)
1510         *litp = op0, op0 = 0;
1511       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1512                || TREE_CODE (op1) == FIXED_CST)
1513         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1514
1515       if (op0 != 0 && TREE_CONSTANT (op0))
1516         *conp = op0, op0 = 0;
1517       else if (op1 != 0 && TREE_CONSTANT (op1))
1518         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1519
1520       /* If we haven't dealt with either operand, this is not a case we can
1521          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1522       if (op0 != 0 && op1 != 0)
1523         var = in;
1524       else if (op0 != 0)
1525         var = op0;
1526       else
1527         var = op1, neg_var_p = neg1_p;
1528
1529       /* Now do any needed negations.  */
1530       if (neg_litp_p)
1531         *minus_litp = *litp, *litp = 0;
1532       if (neg_conp_p)
1533         *conp = negate_expr (*conp);
1534       if (neg_var_p)
1535         var = negate_expr (var);
1536     }
1537   else if (TREE_CONSTANT (in))
1538     *conp = in;
1539   else
1540     var = in;
1541
1542   if (negate_p)
1543     {
1544       if (*litp)
1545         *minus_litp = *litp, *litp = 0;
1546       else if (*minus_litp)
1547         *litp = *minus_litp, *minus_litp = 0;
1548       *conp = negate_expr (*conp);
1549       var = negate_expr (var);
1550     }
1551
1552   return var;
1553 }
1554
1555 /* Re-associate trees split by the above function.  T1 and T2 are either
1556    expressions to associate or null.  Return the new expression, if any.  If
1557    we build an operation, do it in TYPE and with CODE.  */
1558
1559 static tree
1560 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1561 {
1562   if (t1 == 0)
1563     return t2;
1564   else if (t2 == 0)
1565     return t1;
1566
1567   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1568      try to fold this since we will have infinite recursion.  But do
1569      deal with any NEGATE_EXPRs.  */
1570   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1571       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1572     {
1573       if (code == PLUS_EXPR)
1574         {
1575           if (TREE_CODE (t1) == NEGATE_EXPR)
1576             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1577                            fold_convert (type, TREE_OPERAND (t1, 0)));
1578           else if (TREE_CODE (t2) == NEGATE_EXPR)
1579             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1580                            fold_convert (type, TREE_OPERAND (t2, 0)));
1581           else if (integer_zerop (t2))
1582             return fold_convert (type, t1);
1583         }
1584       else if (code == MINUS_EXPR)
1585         {
1586           if (integer_zerop (t2))
1587             return fold_convert (type, t1);
1588         }
1589
1590       return build2 (code, type, fold_convert (type, t1),
1591                      fold_convert (type, t2));
1592     }
1593
1594   return fold_build2 (code, type, fold_convert (type, t1),
1595                       fold_convert (type, t2));
1596 }
1597 \f
1598 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1599    for use in int_const_binop, size_binop and size_diffop.  */
1600
1601 static bool
1602 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1603 {
1604   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1605     return false;
1606   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1607     return false;
1608
1609   switch (code)
1610     {
1611     case LSHIFT_EXPR:
1612     case RSHIFT_EXPR:
1613     case LROTATE_EXPR:
1614     case RROTATE_EXPR:
1615       return true;
1616
1617     default:
1618       break;
1619     }
1620
1621   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1622          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1623          && TYPE_MODE (type1) == TYPE_MODE (type2);
1624 }
1625
1626
1627 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1628    to produce a new constant.  Return NULL_TREE if we don't know how
1629    to evaluate CODE at compile-time.
1630
1631    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1632
1633 tree
1634 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1635 {
1636   unsigned HOST_WIDE_INT int1l, int2l;
1637   HOST_WIDE_INT int1h, int2h;
1638   unsigned HOST_WIDE_INT low;
1639   HOST_WIDE_INT hi;
1640   unsigned HOST_WIDE_INT garbagel;
1641   HOST_WIDE_INT garbageh;
1642   tree t;
1643   tree type = TREE_TYPE (arg1);
1644   int uns = TYPE_UNSIGNED (type);
1645   int is_sizetype
1646     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1647   int overflow = 0;
1648
1649   int1l = TREE_INT_CST_LOW (arg1);
1650   int1h = TREE_INT_CST_HIGH (arg1);
1651   int2l = TREE_INT_CST_LOW (arg2);
1652   int2h = TREE_INT_CST_HIGH (arg2);
1653
1654   switch (code)
1655     {
1656     case BIT_IOR_EXPR:
1657       low = int1l | int2l, hi = int1h | int2h;
1658       break;
1659
1660     case BIT_XOR_EXPR:
1661       low = int1l ^ int2l, hi = int1h ^ int2h;
1662       break;
1663
1664     case BIT_AND_EXPR:
1665       low = int1l & int2l, hi = int1h & int2h;
1666       break;
1667
1668     case RSHIFT_EXPR:
1669       int2l = -int2l;
1670     case LSHIFT_EXPR:
1671       /* It's unclear from the C standard whether shifts can overflow.
1672          The following code ignores overflow; perhaps a C standard
1673          interpretation ruling is needed.  */
1674       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1675                      &low, &hi, !uns);
1676       break;
1677
1678     case RROTATE_EXPR:
1679       int2l = - int2l;
1680     case LROTATE_EXPR:
1681       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1682                       &low, &hi);
1683       break;
1684
1685     case PLUS_EXPR:
1686       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1687       break;
1688
1689     case MINUS_EXPR:
1690       neg_double (int2l, int2h, &low, &hi);
1691       add_double (int1l, int1h, low, hi, &low, &hi);
1692       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1693       break;
1694
1695     case MULT_EXPR:
1696       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1697       break;
1698
1699     case TRUNC_DIV_EXPR:
1700     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1701     case EXACT_DIV_EXPR:
1702       /* This is a shortcut for a common special case.  */
1703       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1704           && !TREE_OVERFLOW (arg1)
1705           && !TREE_OVERFLOW (arg2)
1706           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1707         {
1708           if (code == CEIL_DIV_EXPR)
1709             int1l += int2l - 1;
1710
1711           low = int1l / int2l, hi = 0;
1712           break;
1713         }
1714
1715       /* ... fall through ...  */
1716
1717     case ROUND_DIV_EXPR:
1718       if (int2h == 0 && int2l == 0)
1719         return NULL_TREE;
1720       if (int2h == 0 && int2l == 1)
1721         {
1722           low = int1l, hi = int1h;
1723           break;
1724         }
1725       if (int1l == int2l && int1h == int2h
1726           && ! (int1l == 0 && int1h == 0))
1727         {
1728           low = 1, hi = 0;
1729           break;
1730         }
1731       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1732                                        &low, &hi, &garbagel, &garbageh);
1733       break;
1734
1735     case TRUNC_MOD_EXPR:
1736     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1737       /* This is a shortcut for a common special case.  */
1738       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1739           && !TREE_OVERFLOW (arg1)
1740           && !TREE_OVERFLOW (arg2)
1741           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1742         {
1743           if (code == CEIL_MOD_EXPR)
1744             int1l += int2l - 1;
1745           low = int1l % int2l, hi = 0;
1746           break;
1747         }
1748
1749       /* ... fall through ...  */
1750
1751     case ROUND_MOD_EXPR:
1752       if (int2h == 0 && int2l == 0)
1753         return NULL_TREE;
1754       overflow = div_and_round_double (code, uns,
1755                                        int1l, int1h, int2l, int2h,
1756                                        &garbagel, &garbageh, &low, &hi);
1757       break;
1758
1759     case MIN_EXPR:
1760     case MAX_EXPR:
1761       if (uns)
1762         low = (((unsigned HOST_WIDE_INT) int1h
1763                 < (unsigned HOST_WIDE_INT) int2h)
1764                || (((unsigned HOST_WIDE_INT) int1h
1765                     == (unsigned HOST_WIDE_INT) int2h)
1766                    && int1l < int2l));
1767       else
1768         low = (int1h < int2h
1769                || (int1h == int2h && int1l < int2l));
1770
1771       if (low == (code == MIN_EXPR))
1772         low = int1l, hi = int1h;
1773       else
1774         low = int2l, hi = int2h;
1775       break;
1776
1777     default:
1778       return NULL_TREE;
1779     }
1780
1781   if (notrunc)
1782     {
1783       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1784
1785       /* Propagate overflow flags ourselves.  */
1786       if (((!uns || is_sizetype) && overflow)
1787           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1788         {
1789           t = copy_node (t);
1790           TREE_OVERFLOW (t) = 1;
1791         }
1792     }
1793   else
1794     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1795                                ((!uns || is_sizetype) && overflow)
1796                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1797
1798   return t;
1799 }
1800
1801 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1802    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1803    are the same kind of constant and the same machine mode.  Return zero if
1804    combining the constants is not allowed in the current operating mode.
1805
1806    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1807
1808 static tree
1809 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1810 {
1811   /* Sanity check for the recursive cases.  */
1812   if (!arg1 || !arg2)
1813     return NULL_TREE;
1814
1815   STRIP_NOPS (arg1);
1816   STRIP_NOPS (arg2);
1817
1818   if (TREE_CODE (arg1) == INTEGER_CST)
1819     return int_const_binop (code, arg1, arg2, notrunc);
1820
1821   if (TREE_CODE (arg1) == REAL_CST)
1822     {
1823       enum machine_mode mode;
1824       REAL_VALUE_TYPE d1;
1825       REAL_VALUE_TYPE d2;
1826       REAL_VALUE_TYPE value;
1827       REAL_VALUE_TYPE result;
1828       bool inexact;
1829       tree t, type;
1830
1831       /* The following codes are handled by real_arithmetic.  */
1832       switch (code)
1833         {
1834         case PLUS_EXPR:
1835         case MINUS_EXPR:
1836         case MULT_EXPR:
1837         case RDIV_EXPR:
1838         case MIN_EXPR:
1839         case MAX_EXPR:
1840           break;
1841
1842         default:
1843           return NULL_TREE;
1844         }
1845
1846       d1 = TREE_REAL_CST (arg1);
1847       d2 = TREE_REAL_CST (arg2);
1848
1849       type = TREE_TYPE (arg1);
1850       mode = TYPE_MODE (type);
1851
1852       /* Don't perform operation if we honor signaling NaNs and
1853          either operand is a NaN.  */
1854       if (HONOR_SNANS (mode)
1855           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1856         return NULL_TREE;
1857
1858       /* Don't perform operation if it would raise a division
1859          by zero exception.  */
1860       if (code == RDIV_EXPR
1861           && REAL_VALUES_EQUAL (d2, dconst0)
1862           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1863         return NULL_TREE;
1864
1865       /* If either operand is a NaN, just return it.  Otherwise, set up
1866          for floating-point trap; we return an overflow.  */
1867       if (REAL_VALUE_ISNAN (d1))
1868         return arg1;
1869       else if (REAL_VALUE_ISNAN (d2))
1870         return arg2;
1871
1872       inexact = real_arithmetic (&value, code, &d1, &d2);
1873       real_convert (&result, mode, &value);
1874
1875       /* Don't constant fold this floating point operation if
1876          the result has overflowed and flag_trapping_math.  */
1877       if (flag_trapping_math
1878           && MODE_HAS_INFINITIES (mode)
1879           && REAL_VALUE_ISINF (result)
1880           && !REAL_VALUE_ISINF (d1)
1881           && !REAL_VALUE_ISINF (d2))
1882         return NULL_TREE;
1883
1884       /* Don't constant fold this floating point operation if the
1885          result may dependent upon the run-time rounding mode and
1886          flag_rounding_math is set, or if GCC's software emulation
1887          is unable to accurately represent the result.  */
1888       if ((flag_rounding_math
1889            || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1890           && (inexact || !real_identical (&result, &value)))
1891         return NULL_TREE;
1892
1893       t = build_real (type, result);
1894
1895       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1896       return t;
1897     }
1898
1899   if (TREE_CODE (arg1) == FIXED_CST)
1900     {
1901       FIXED_VALUE_TYPE f1;
1902       FIXED_VALUE_TYPE f2;
1903       FIXED_VALUE_TYPE result;
1904       tree t, type;
1905       int sat_p;
1906       bool overflow_p;
1907
1908       /* The following codes are handled by fixed_arithmetic.  */
1909       switch (code)
1910         {
1911         case PLUS_EXPR:
1912         case MINUS_EXPR:
1913         case MULT_EXPR:
1914         case TRUNC_DIV_EXPR:
1915           f2 = TREE_FIXED_CST (arg2);
1916           break;
1917
1918         case LSHIFT_EXPR:
1919         case RSHIFT_EXPR:
1920           f2.data.high = TREE_INT_CST_HIGH (arg2);
1921           f2.data.low = TREE_INT_CST_LOW (arg2);
1922           f2.mode = SImode;
1923           break;
1924
1925         default:
1926           return NULL_TREE;
1927         }
1928
1929       f1 = TREE_FIXED_CST (arg1);
1930       type = TREE_TYPE (arg1);
1931       sat_p = TYPE_SATURATING (type);
1932       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1933       t = build_fixed (type, result);
1934       /* Propagate overflow flags.  */
1935       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1936         TREE_OVERFLOW (t) = 1;
1937       return t;
1938     }
1939
1940   if (TREE_CODE (arg1) == COMPLEX_CST)
1941     {
1942       tree type = TREE_TYPE (arg1);
1943       tree r1 = TREE_REALPART (arg1);
1944       tree i1 = TREE_IMAGPART (arg1);
1945       tree r2 = TREE_REALPART (arg2);
1946       tree i2 = TREE_IMAGPART (arg2);
1947       tree real, imag;
1948
1949       switch (code)
1950         {
1951         case PLUS_EXPR:
1952         case MINUS_EXPR:
1953           real = const_binop (code, r1, r2, notrunc);
1954           imag = const_binop (code, i1, i2, notrunc);
1955           break;
1956
1957         case MULT_EXPR:
1958           real = const_binop (MINUS_EXPR,
1959                               const_binop (MULT_EXPR, r1, r2, notrunc),
1960                               const_binop (MULT_EXPR, i1, i2, notrunc),
1961                               notrunc);
1962           imag = const_binop (PLUS_EXPR,
1963                               const_binop (MULT_EXPR, r1, i2, notrunc),
1964                               const_binop (MULT_EXPR, i1, r2, notrunc),
1965                               notrunc);
1966           break;
1967
1968         case RDIV_EXPR:
1969           {
1970             tree magsquared
1971               = const_binop (PLUS_EXPR,
1972                              const_binop (MULT_EXPR, r2, r2, notrunc),
1973                              const_binop (MULT_EXPR, i2, i2, notrunc),
1974                              notrunc);
1975             tree t1
1976               = const_binop (PLUS_EXPR,
1977                              const_binop (MULT_EXPR, r1, r2, notrunc),
1978                              const_binop (MULT_EXPR, i1, i2, notrunc),
1979                              notrunc);
1980             tree t2
1981               = const_binop (MINUS_EXPR,
1982                              const_binop (MULT_EXPR, i1, r2, notrunc),
1983                              const_binop (MULT_EXPR, r1, i2, notrunc),
1984                              notrunc);
1985
1986             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1987               code = TRUNC_DIV_EXPR;
1988
1989             real = const_binop (code, t1, magsquared, notrunc);
1990             imag = const_binop (code, t2, magsquared, notrunc);
1991           }
1992           break;
1993
1994         default:
1995           return NULL_TREE;
1996         }
1997
1998       if (real && imag)
1999         return build_complex (type, real, imag);
2000     }
2001
2002   if (TREE_CODE (arg1) == VECTOR_CST)
2003     {
2004       tree type = TREE_TYPE(arg1);
2005       int count = TYPE_VECTOR_SUBPARTS (type), i;
2006       tree elements1, elements2, list = NULL_TREE;
2007       
2008       if(TREE_CODE(arg2) != VECTOR_CST)
2009         return NULL_TREE;
2010         
2011       elements1 = TREE_VECTOR_CST_ELTS (arg1);
2012       elements2 = TREE_VECTOR_CST_ELTS (arg2);
2013
2014       for (i = 0; i < count; i++)
2015         {
2016           tree elem1, elem2, elem;
2017           
2018           /* The trailing elements can be empty and should be treated as 0 */
2019           if(!elements1)
2020             elem1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2021           else
2022             {
2023               elem1 = TREE_VALUE(elements1);
2024               elements1 = TREE_CHAIN (elements1);
2025             }  
2026             
2027           if(!elements2)
2028             elem2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2029           else
2030             {
2031               elem2 = TREE_VALUE(elements2);
2032               elements2 = TREE_CHAIN (elements2);
2033             }
2034               
2035           elem = const_binop (code, elem1, elem2, notrunc);
2036           
2037           /* It is possible that const_binop cannot handle the given
2038             code and return NULL_TREE */
2039           if(elem == NULL_TREE)
2040             return NULL_TREE;
2041           
2042           list = tree_cons (NULL_TREE, elem, list);
2043         }
2044       return build_vector(type, nreverse(list));  
2045     }
2046   return NULL_TREE;
2047 }
2048
2049 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2050    indicates which particular sizetype to create.  */
2051
2052 tree
2053 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2054 {
2055   return build_int_cst (sizetype_tab[(int) kind], number);
2056 }
2057 \f
2058 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2059    is a tree code.  The type of the result is taken from the operands.
2060    Both must be equivalent integer types, ala int_binop_types_match_p.
2061    If the operands are constant, so is the result.  */
2062
2063 tree
2064 size_binop (enum tree_code code, tree arg0, tree arg1)
2065 {
2066   tree type = TREE_TYPE (arg0);
2067
2068   if (arg0 == error_mark_node || arg1 == error_mark_node)
2069     return error_mark_node;
2070
2071   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2072                                        TREE_TYPE (arg1)));
2073
2074   /* Handle the special case of two integer constants faster.  */
2075   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2076     {
2077       /* And some specific cases even faster than that.  */
2078       if (code == PLUS_EXPR)
2079         {
2080           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2081             return arg1;
2082           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2083             return arg0;
2084         }
2085       else if (code == MINUS_EXPR)
2086         {
2087           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2088             return arg0;
2089         }
2090       else if (code == MULT_EXPR)
2091         {
2092           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2093             return arg1;
2094         }
2095
2096       /* Handle general case of two integer constants.  */
2097       return int_const_binop (code, arg0, arg1, 0);
2098     }
2099
2100   return fold_build2 (code, type, arg0, arg1);
2101 }
2102
2103 /* Given two values, either both of sizetype or both of bitsizetype,
2104    compute the difference between the two values.  Return the value
2105    in signed type corresponding to the type of the operands.  */
2106
2107 tree
2108 size_diffop (tree arg0, tree arg1)
2109 {
2110   tree type = TREE_TYPE (arg0);
2111   tree ctype;
2112
2113   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2114                                        TREE_TYPE (arg1)));
2115
2116   /* If the type is already signed, just do the simple thing.  */
2117   if (!TYPE_UNSIGNED (type))
2118     return size_binop (MINUS_EXPR, arg0, arg1);
2119
2120   if (type == sizetype)
2121     ctype = ssizetype;
2122   else if (type == bitsizetype)
2123     ctype = sbitsizetype;
2124   else
2125     ctype = signed_type_for (type);
2126
2127   /* If either operand is not a constant, do the conversions to the signed
2128      type and subtract.  The hardware will do the right thing with any
2129      overflow in the subtraction.  */
2130   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2131     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2132                        fold_convert (ctype, arg1));
2133
2134   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2135      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2136      overflow) and negate (which can't either).  Special-case a result
2137      of zero while we're here.  */
2138   if (tree_int_cst_equal (arg0, arg1))
2139     return build_int_cst (ctype, 0);
2140   else if (tree_int_cst_lt (arg1, arg0))
2141     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2142   else
2143     return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2144                        fold_convert (ctype, size_binop (MINUS_EXPR,
2145                                                         arg1, arg0)));
2146 }
2147 \f
2148 /* A subroutine of fold_convert_const handling conversions of an
2149    INTEGER_CST to another integer type.  */
2150
2151 static tree
2152 fold_convert_const_int_from_int (tree type, const_tree arg1)
2153 {
2154   tree t;
2155
2156   /* Given an integer constant, make new constant with new type,
2157      appropriately sign-extended or truncated.  */
2158   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2159                              TREE_INT_CST_HIGH (arg1),
2160                              /* Don't set the overflow when
2161                                 converting from a pointer,  */
2162                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2163                              /* or to a sizetype with same signedness
2164                                 and the precision is unchanged.
2165                                 ???  sizetype is always sign-extended,
2166                                 but its signedness depends on the
2167                                 frontend.  Thus we see spurious overflows
2168                                 here if we do not check this.  */
2169                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2170                                    == TYPE_PRECISION (type))
2171                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2172                                       == TYPE_UNSIGNED (type))
2173                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2174                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2175                                       || (TREE_CODE (type) == INTEGER_TYPE
2176                                           && TYPE_IS_SIZETYPE (type)))),
2177                              (TREE_INT_CST_HIGH (arg1) < 0
2178                               && (TYPE_UNSIGNED (type)
2179                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2180                              | TREE_OVERFLOW (arg1));
2181
2182   return t;
2183 }
2184
2185 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2186    to an integer type.  */
2187
2188 static tree
2189 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2190 {
2191   int overflow = 0;
2192   tree t;
2193
2194   /* The following code implements the floating point to integer
2195      conversion rules required by the Java Language Specification,
2196      that IEEE NaNs are mapped to zero and values that overflow
2197      the target precision saturate, i.e. values greater than
2198      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2199      are mapped to INT_MIN.  These semantics are allowed by the
2200      C and C++ standards that simply state that the behavior of
2201      FP-to-integer conversion is unspecified upon overflow.  */
2202
2203   HOST_WIDE_INT high, low;
2204   REAL_VALUE_TYPE r;
2205   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2206
2207   switch (code)
2208     {
2209     case FIX_TRUNC_EXPR:
2210       real_trunc (&r, VOIDmode, &x);
2211       break;
2212
2213     default:
2214       gcc_unreachable ();
2215     }
2216
2217   /* If R is NaN, return zero and show we have an overflow.  */
2218   if (REAL_VALUE_ISNAN (r))
2219     {
2220       overflow = 1;
2221       high = 0;
2222       low = 0;
2223     }
2224
2225   /* See if R is less than the lower bound or greater than the
2226      upper bound.  */
2227
2228   if (! overflow)
2229     {
2230       tree lt = TYPE_MIN_VALUE (type);
2231       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2232       if (REAL_VALUES_LESS (r, l))
2233         {
2234           overflow = 1;
2235           high = TREE_INT_CST_HIGH (lt);
2236           low = TREE_INT_CST_LOW (lt);
2237         }
2238     }
2239
2240   if (! overflow)
2241     {
2242       tree ut = TYPE_MAX_VALUE (type);
2243       if (ut)
2244         {
2245           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2246           if (REAL_VALUES_LESS (u, r))
2247             {
2248               overflow = 1;
2249               high = TREE_INT_CST_HIGH (ut);
2250               low = TREE_INT_CST_LOW (ut);
2251             }
2252         }
2253     }
2254
2255   if (! overflow)
2256     REAL_VALUE_TO_INT (&low, &high, r);
2257
2258   t = force_fit_type_double (type, low, high, -1,
2259                              overflow | TREE_OVERFLOW (arg1));
2260   return t;
2261 }
2262
2263 /* A subroutine of fold_convert_const handling conversions of a
2264    FIXED_CST to an integer type.  */
2265
2266 static tree
2267 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2268 {
2269   tree t;
2270   double_int temp, temp_trunc;
2271   unsigned int mode;
2272
2273   /* Right shift FIXED_CST to temp by fbit.  */
2274   temp = TREE_FIXED_CST (arg1).data;
2275   mode = TREE_FIXED_CST (arg1).mode;
2276   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2277     {
2278       lshift_double (temp.low, temp.high,
2279                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2280                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2281
2282       /* Left shift temp to temp_trunc by fbit.  */
2283       lshift_double (temp.low, temp.high,
2284                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2285                      &temp_trunc.low, &temp_trunc.high,
2286                      SIGNED_FIXED_POINT_MODE_P (mode));
2287     }
2288   else
2289     {
2290       temp.low = 0;
2291       temp.high = 0;
2292       temp_trunc.low = 0;
2293       temp_trunc.high = 0;
2294     }
2295
2296   /* If FIXED_CST is negative, we need to round the value toward 0.
2297      By checking if the fractional bits are not zero to add 1 to temp.  */
2298   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2299       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2300     {
2301       double_int one;
2302       one.low = 1;
2303       one.high = 0;
2304       temp = double_int_add (temp, one);
2305     }
2306
2307   /* Given a fixed-point constant, make new constant with new type,
2308      appropriately sign-extended or truncated.  */
2309   t = force_fit_type_double (type, temp.low, temp.high, -1,
2310                              (temp.high < 0
2311                               && (TYPE_UNSIGNED (type)
2312                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2313                              | TREE_OVERFLOW (arg1));
2314
2315   return t;
2316 }
2317
2318 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2319    to another floating point type.  */
2320
2321 static tree
2322 fold_convert_const_real_from_real (tree type, const_tree arg1)
2323 {
2324   REAL_VALUE_TYPE value;
2325   tree t;
2326
2327   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2328   t = build_real (type, value);
2329
2330   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2331   return t;
2332 }
2333
2334 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2335    to a floating point type.  */
2336
2337 static tree
2338 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2339 {
2340   REAL_VALUE_TYPE value;
2341   tree t;
2342
2343   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2344   t = build_real (type, value);
2345
2346   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2347   return t;
2348 }
2349
2350 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2351    to another fixed-point type.  */
2352
2353 static tree
2354 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2355 {
2356   FIXED_VALUE_TYPE value;
2357   tree t;
2358   bool overflow_p;
2359
2360   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2361                               TYPE_SATURATING (type));
2362   t = build_fixed (type, value);
2363
2364   /* Propagate overflow flags.  */
2365   if (overflow_p | TREE_OVERFLOW (arg1))
2366     TREE_OVERFLOW (t) = 1;
2367   return t;
2368 }
2369
2370 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2371    to a fixed-point type.  */
2372
2373 static tree
2374 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2375 {
2376   FIXED_VALUE_TYPE value;
2377   tree t;
2378   bool overflow_p;
2379
2380   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2381                                        TREE_INT_CST (arg1),
2382                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2383                                        TYPE_SATURATING (type));
2384   t = build_fixed (type, value);
2385
2386   /* Propagate overflow flags.  */
2387   if (overflow_p | TREE_OVERFLOW (arg1))
2388     TREE_OVERFLOW (t) = 1;
2389   return t;
2390 }
2391
2392 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2393    to a fixed-point type.  */
2394
2395 static tree
2396 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2397 {
2398   FIXED_VALUE_TYPE value;
2399   tree t;
2400   bool overflow_p;
2401
2402   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2403                                         &TREE_REAL_CST (arg1),
2404                                         TYPE_SATURATING (type));
2405   t = build_fixed (type, value);
2406
2407   /* Propagate overflow flags.  */
2408   if (overflow_p | TREE_OVERFLOW (arg1))
2409     TREE_OVERFLOW (t) = 1;
2410   return t;
2411 }
2412
2413 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2414    type TYPE.  If no simplification can be done return NULL_TREE.  */
2415
2416 static tree
2417 fold_convert_const (enum tree_code code, tree type, tree arg1)
2418 {
2419   if (TREE_TYPE (arg1) == type)
2420     return arg1;
2421
2422   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
2423       || TREE_CODE (type) == OFFSET_TYPE)
2424     {
2425       if (TREE_CODE (arg1) == INTEGER_CST)
2426         return fold_convert_const_int_from_int (type, arg1);
2427       else if (TREE_CODE (arg1) == REAL_CST)
2428         return fold_convert_const_int_from_real (code, type, arg1);
2429       else if (TREE_CODE (arg1) == FIXED_CST)
2430         return fold_convert_const_int_from_fixed (type, arg1);
2431     }
2432   else if (TREE_CODE (type) == REAL_TYPE)
2433     {
2434       if (TREE_CODE (arg1) == INTEGER_CST)
2435         return build_real_from_int_cst (type, arg1);
2436       else if (TREE_CODE (arg1) == REAL_CST)
2437         return fold_convert_const_real_from_real (type, arg1);
2438       else if (TREE_CODE (arg1) == FIXED_CST)
2439         return fold_convert_const_real_from_fixed (type, arg1);
2440     }
2441   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2442     {
2443       if (TREE_CODE (arg1) == FIXED_CST)
2444         return fold_convert_const_fixed_from_fixed (type, arg1);
2445       else if (TREE_CODE (arg1) == INTEGER_CST)
2446         return fold_convert_const_fixed_from_int (type, arg1);
2447       else if (TREE_CODE (arg1) == REAL_CST)
2448         return fold_convert_const_fixed_from_real (type, arg1);
2449     }
2450   return NULL_TREE;
2451 }
2452
2453 /* Construct a vector of zero elements of vector type TYPE.  */
2454
2455 static tree
2456 build_zero_vector (tree type)
2457 {
2458   tree elem, list;
2459   int i, units;
2460
2461   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2462   units = TYPE_VECTOR_SUBPARTS (type);
2463   
2464   list = NULL_TREE;
2465   for (i = 0; i < units; i++)
2466     list = tree_cons (NULL_TREE, elem, list);
2467   return build_vector (type, list);
2468 }
2469
2470 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2471
2472 bool
2473 fold_convertible_p (const_tree type, const_tree arg)
2474 {
2475   tree orig = TREE_TYPE (arg);
2476
2477   if (type == orig)
2478     return true;
2479
2480   if (TREE_CODE (arg) == ERROR_MARK
2481       || TREE_CODE (type) == ERROR_MARK
2482       || TREE_CODE (orig) == ERROR_MARK)
2483     return false;
2484
2485   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2486     return true;
2487
2488   switch (TREE_CODE (type))
2489     {
2490     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2491     case POINTER_TYPE: case REFERENCE_TYPE:
2492     case OFFSET_TYPE:
2493       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2494           || TREE_CODE (orig) == OFFSET_TYPE)
2495         return true;
2496       return (TREE_CODE (orig) == VECTOR_TYPE
2497               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2498
2499     case REAL_TYPE:
2500     case FIXED_POINT_TYPE:
2501     case COMPLEX_TYPE:
2502     case VECTOR_TYPE:
2503     case VOID_TYPE:
2504       return TREE_CODE (type) == TREE_CODE (orig);
2505
2506     default:
2507       return false;
2508     }
2509 }
2510
2511 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2512    simple conversions in preference to calling the front-end's convert.  */
2513
2514 tree
2515 fold_convert (tree type, tree arg)
2516 {
2517   tree orig = TREE_TYPE (arg);
2518   tree tem;
2519
2520   if (type == orig)
2521     return arg;
2522
2523   if (TREE_CODE (arg) == ERROR_MARK
2524       || TREE_CODE (type) == ERROR_MARK
2525       || TREE_CODE (orig) == ERROR_MARK)
2526     return error_mark_node;
2527
2528   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2529     return fold_build1 (NOP_EXPR, type, arg);
2530
2531   switch (TREE_CODE (type))
2532     {
2533     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2534     case POINTER_TYPE: case REFERENCE_TYPE:
2535     case OFFSET_TYPE:
2536       if (TREE_CODE (arg) == INTEGER_CST)
2537         {
2538           tem = fold_convert_const (NOP_EXPR, type, arg);
2539           if (tem != NULL_TREE)
2540             return tem;
2541         }
2542       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2543           || TREE_CODE (orig) == OFFSET_TYPE)
2544         return fold_build1 (NOP_EXPR, type, arg);
2545       if (TREE_CODE (orig) == COMPLEX_TYPE)
2546         {
2547           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2548           return fold_convert (type, tem);
2549         }
2550       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2551                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2552       return fold_build1 (NOP_EXPR, type, arg);
2553
2554     case REAL_TYPE:
2555       if (TREE_CODE (arg) == INTEGER_CST)
2556         {
2557           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2558           if (tem != NULL_TREE)
2559             return tem;
2560         }
2561       else if (TREE_CODE (arg) == REAL_CST)
2562         {
2563           tem = fold_convert_const (NOP_EXPR, type, arg);
2564           if (tem != NULL_TREE)
2565             return tem;
2566         }
2567       else if (TREE_CODE (arg) == FIXED_CST)
2568         {
2569           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2570           if (tem != NULL_TREE)
2571             return tem;
2572         }
2573
2574       switch (TREE_CODE (orig))
2575         {
2576         case INTEGER_TYPE:
2577         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2578         case POINTER_TYPE: case REFERENCE_TYPE:
2579           return fold_build1 (FLOAT_EXPR, type, arg);
2580
2581         case REAL_TYPE:
2582           return fold_build1 (NOP_EXPR, type, arg);
2583
2584         case FIXED_POINT_TYPE:
2585           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2586
2587         case COMPLEX_TYPE:
2588           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2589           return fold_convert (type, tem);
2590
2591         default:
2592           gcc_unreachable ();
2593         }
2594
2595     case FIXED_POINT_TYPE:
2596       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2597           || TREE_CODE (arg) == REAL_CST)
2598         {
2599           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2600           if (tem != NULL_TREE)
2601             return tem;
2602         }
2603
2604       switch (TREE_CODE (orig))
2605         {
2606         case FIXED_POINT_TYPE:
2607         case INTEGER_TYPE:
2608         case ENUMERAL_TYPE:
2609         case BOOLEAN_TYPE:
2610         case REAL_TYPE:
2611           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2612
2613         case COMPLEX_TYPE:
2614           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2615           return fold_convert (type, tem);
2616
2617         default:
2618           gcc_unreachable ();
2619         }
2620
2621     case COMPLEX_TYPE:
2622       switch (TREE_CODE (orig))
2623         {
2624         case INTEGER_TYPE:
2625         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2626         case POINTER_TYPE: case REFERENCE_TYPE:
2627         case REAL_TYPE:
2628         case FIXED_POINT_TYPE:
2629           return build2 (COMPLEX_EXPR, type,
2630                          fold_convert (TREE_TYPE (type), arg),
2631                          fold_convert (TREE_TYPE (type), integer_zero_node));
2632         case COMPLEX_TYPE:
2633           {
2634             tree rpart, ipart;
2635
2636             if (TREE_CODE (arg) == COMPLEX_EXPR)
2637               {
2638                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2639                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2640                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2641               }
2642
2643             arg = save_expr (arg);
2644             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2645             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2646             rpart = fold_convert (TREE_TYPE (type), rpart);
2647             ipart = fold_convert (TREE_TYPE (type), ipart);
2648             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2649           }
2650
2651         default:
2652           gcc_unreachable ();
2653         }
2654
2655     case VECTOR_TYPE:
2656       if (integer_zerop (arg))
2657         return build_zero_vector (type);
2658       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2659       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2660                   || TREE_CODE (orig) == VECTOR_TYPE);
2661       return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2662
2663     case VOID_TYPE:
2664       tem = fold_ignored_result (arg);
2665       if (TREE_CODE (tem) == MODIFY_EXPR)
2666         return tem;
2667       return fold_build1 (NOP_EXPR, type, tem);
2668
2669     default:
2670       gcc_unreachable ();
2671     }
2672 }
2673 \f
2674 /* Return false if expr can be assumed not to be an lvalue, true
2675    otherwise.  */
2676
2677 static bool
2678 maybe_lvalue_p (const_tree x)
2679 {
2680   /* We only need to wrap lvalue tree codes.  */
2681   switch (TREE_CODE (x))
2682   {
2683   case VAR_DECL:
2684   case PARM_DECL:
2685   case RESULT_DECL:
2686   case LABEL_DECL:
2687   case FUNCTION_DECL:
2688   case SSA_NAME:
2689
2690   case COMPONENT_REF:
2691   case INDIRECT_REF:
2692   case ALIGN_INDIRECT_REF:
2693   case MISALIGNED_INDIRECT_REF:
2694   case ARRAY_REF:
2695   case ARRAY_RANGE_REF:
2696   case BIT_FIELD_REF:
2697   case OBJ_TYPE_REF:
2698
2699   case REALPART_EXPR:
2700   case IMAGPART_EXPR:
2701   case PREINCREMENT_EXPR:
2702   case PREDECREMENT_EXPR:
2703   case SAVE_EXPR:
2704   case TRY_CATCH_EXPR:
2705   case WITH_CLEANUP_EXPR:
2706   case COMPOUND_EXPR:
2707   case MODIFY_EXPR:
2708   case TARGET_EXPR:
2709   case COND_EXPR:
2710   case BIND_EXPR:
2711   case MIN_EXPR:
2712   case MAX_EXPR:
2713     break;
2714
2715   default:
2716     /* Assume the worst for front-end tree codes.  */
2717     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2718       break;
2719     return false;
2720   }
2721
2722   return true;
2723 }
2724
2725 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2726
2727 tree
2728 non_lvalue (tree x)
2729 {
2730   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2731      us.  */
2732   if (in_gimple_form)
2733     return x;
2734
2735   if (! maybe_lvalue_p (x))
2736     return x;
2737   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2738 }
2739
2740 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2741    Zero means allow extended lvalues.  */
2742
2743 int pedantic_lvalues;
2744
2745 /* When pedantic, return an expr equal to X but certainly not valid as a
2746    pedantic lvalue.  Otherwise, return X.  */
2747
2748 static tree
2749 pedantic_non_lvalue (tree x)
2750 {
2751   if (pedantic_lvalues)
2752     return non_lvalue (x);
2753   else
2754     return x;
2755 }
2756 \f
2757 /* Given a tree comparison code, return the code that is the logical inverse
2758    of the given code.  It is not safe to do this for floating-point
2759    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2760    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2761
2762 enum tree_code
2763 invert_tree_comparison (enum tree_code code, bool honor_nans)
2764 {
2765   if (honor_nans && flag_trapping_math)
2766     return ERROR_MARK;
2767
2768   switch (code)
2769     {
2770     case EQ_EXPR:
2771       return NE_EXPR;
2772     case NE_EXPR:
2773       return EQ_EXPR;
2774     case GT_EXPR:
2775       return honor_nans ? UNLE_EXPR : LE_EXPR;
2776     case GE_EXPR:
2777       return honor_nans ? UNLT_EXPR : LT_EXPR;
2778     case LT_EXPR:
2779       return honor_nans ? UNGE_EXPR : GE_EXPR;
2780     case LE_EXPR:
2781       return honor_nans ? UNGT_EXPR : GT_EXPR;
2782     case LTGT_EXPR:
2783       return UNEQ_EXPR;
2784     case UNEQ_EXPR:
2785       return LTGT_EXPR;
2786     case UNGT_EXPR:
2787       return LE_EXPR;
2788     case UNGE_EXPR:
2789       return LT_EXPR;
2790     case UNLT_EXPR:
2791       return GE_EXPR;
2792     case UNLE_EXPR:
2793       return GT_EXPR;
2794     case ORDERED_EXPR:
2795       return UNORDERED_EXPR;
2796     case UNORDERED_EXPR:
2797       return ORDERED_EXPR;
2798     default:
2799       gcc_unreachable ();
2800     }
2801 }
2802
2803 /* Similar, but return the comparison that results if the operands are
2804    swapped.  This is safe for floating-point.  */
2805
2806 enum tree_code
2807 swap_tree_comparison (enum tree_code code)
2808 {
2809   switch (code)
2810     {
2811     case EQ_EXPR:
2812     case NE_EXPR:
2813     case ORDERED_EXPR:
2814     case UNORDERED_EXPR:
2815     case LTGT_EXPR:
2816     case UNEQ_EXPR:
2817       return code;
2818     case GT_EXPR:
2819       return LT_EXPR;
2820     case GE_EXPR:
2821       return LE_EXPR;
2822     case LT_EXPR:
2823       return GT_EXPR;
2824     case LE_EXPR:
2825       return GE_EXPR;
2826     case UNGT_EXPR:
2827       return UNLT_EXPR;
2828     case UNGE_EXPR:
2829       return UNLE_EXPR;
2830     case UNLT_EXPR:
2831       return UNGT_EXPR;
2832     case UNLE_EXPR:
2833       return UNGE_EXPR;
2834     default:
2835       gcc_unreachable ();
2836     }
2837 }
2838
2839
2840 /* Convert a comparison tree code from an enum tree_code representation
2841    into a compcode bit-based encoding.  This function is the inverse of
2842    compcode_to_comparison.  */
2843
2844 static enum comparison_code
2845 comparison_to_compcode (enum tree_code code)
2846 {
2847   switch (code)
2848     {
2849     case LT_EXPR:
2850       return COMPCODE_LT;
2851     case EQ_EXPR:
2852       return COMPCODE_EQ;
2853     case LE_EXPR:
2854       return COMPCODE_LE;
2855     case GT_EXPR:
2856       return COMPCODE_GT;
2857     case NE_EXPR:
2858       return COMPCODE_NE;
2859     case GE_EXPR:
2860       return COMPCODE_GE;
2861     case ORDERED_EXPR:
2862       return COMPCODE_ORD;
2863     case UNORDERED_EXPR:
2864       return COMPCODE_UNORD;
2865     case UNLT_EXPR:
2866       return COMPCODE_UNLT;
2867     case UNEQ_EXPR:
2868       return COMPCODE_UNEQ;
2869     case UNLE_EXPR:
2870       return COMPCODE_UNLE;
2871     case UNGT_EXPR:
2872       return COMPCODE_UNGT;
2873     case LTGT_EXPR:
2874       return COMPCODE_LTGT;
2875     case UNGE_EXPR:
2876       return COMPCODE_UNGE;
2877     default:
2878       gcc_unreachable ();
2879     }
2880 }
2881
2882 /* Convert a compcode bit-based encoding of a comparison operator back
2883    to GCC's enum tree_code representation.  This function is the
2884    inverse of comparison_to_compcode.  */
2885
2886 static enum tree_code
2887 compcode_to_comparison (enum comparison_code code)
2888 {
2889   switch (code)
2890     {
2891     case COMPCODE_LT:
2892       return LT_EXPR;
2893     case COMPCODE_EQ:
2894       return EQ_EXPR;
2895     case COMPCODE_LE:
2896       return LE_EXPR;
2897     case COMPCODE_GT:
2898       return GT_EXPR;
2899     case COMPCODE_NE:
2900       return NE_EXPR;
2901     case COMPCODE_GE:
2902       return GE_EXPR;
2903     case COMPCODE_ORD:
2904       return ORDERED_EXPR;
2905     case COMPCODE_UNORD:
2906       return UNORDERED_EXPR;
2907     case COMPCODE_UNLT:
2908       return UNLT_EXPR;
2909     case COMPCODE_UNEQ:
2910       return UNEQ_EXPR;
2911     case COMPCODE_UNLE:
2912       return UNLE_EXPR;
2913     case COMPCODE_UNGT:
2914       return UNGT_EXPR;
2915     case COMPCODE_LTGT:
2916       return LTGT_EXPR;
2917     case COMPCODE_UNGE:
2918       return UNGE_EXPR;
2919     default:
2920       gcc_unreachable ();
2921     }
2922 }
2923
2924 /* Return a tree for the comparison which is the combination of
2925    doing the AND or OR (depending on CODE) of the two operations LCODE
2926    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2927    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2928    if this makes the transformation invalid.  */
2929
2930 tree
2931 combine_comparisons (enum tree_code code, enum tree_code lcode,
2932                      enum tree_code rcode, tree truth_type,
2933                      tree ll_arg, tree lr_arg)
2934 {
2935   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2936   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2937   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2938   enum comparison_code compcode;
2939
2940   switch (code)
2941     {
2942     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2943       compcode = lcompcode & rcompcode;
2944       break;
2945
2946     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2947       compcode = lcompcode | rcompcode;
2948       break;
2949
2950     default:
2951       return NULL_TREE;
2952     }
2953
2954   if (!honor_nans)
2955     {
2956       /* Eliminate unordered comparisons, as well as LTGT and ORD
2957          which are not used unless the mode has NaNs.  */
2958       compcode &= ~COMPCODE_UNORD;
2959       if (compcode == COMPCODE_LTGT)
2960         compcode = COMPCODE_NE;
2961       else if (compcode == COMPCODE_ORD)
2962         compcode = COMPCODE_TRUE;
2963     }
2964    else if (flag_trapping_math)
2965      {
2966         /* Check that the original operation and the optimized ones will trap
2967            under the same condition.  */
2968         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2969                      && (lcompcode != COMPCODE_EQ)
2970                      && (lcompcode != COMPCODE_ORD);
2971         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2972                      && (rcompcode != COMPCODE_EQ)
2973                      && (rcompcode != COMPCODE_ORD);
2974         bool trap = (compcode & COMPCODE_UNORD) == 0
2975                     && (compcode != COMPCODE_EQ)
2976                     && (compcode != COMPCODE_ORD);
2977
2978         /* In a short-circuited boolean expression the LHS might be
2979            such that the RHS, if evaluated, will never trap.  For
2980            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2981            if neither x nor y is NaN.  (This is a mixed blessing: for
2982            example, the expression above will never trap, hence
2983            optimizing it to x < y would be invalid).  */
2984         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2985             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2986           rtrap = false;
2987
2988         /* If the comparison was short-circuited, and only the RHS
2989            trapped, we may now generate a spurious trap.  */
2990         if (rtrap && !ltrap
2991             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2992           return NULL_TREE;
2993
2994         /* If we changed the conditions that cause a trap, we lose.  */
2995         if ((ltrap || rtrap) != trap)
2996           return NULL_TREE;
2997       }
2998
2999   if (compcode == COMPCODE_TRUE)
3000     return constant_boolean_node (true, truth_type);
3001   else if (compcode == COMPCODE_FALSE)
3002     return constant_boolean_node (false, truth_type);
3003   else
3004     return fold_build2 (compcode_to_comparison (compcode),
3005                         truth_type, ll_arg, lr_arg);
3006 }
3007 \f
3008 /* Return nonzero if two operands (typically of the same tree node)
3009    are necessarily equal.  If either argument has side-effects this
3010    function returns zero.  FLAGS modifies behavior as follows:
3011
3012    If OEP_ONLY_CONST is set, only return nonzero for constants.
3013    This function tests whether the operands are indistinguishable;
3014    it does not test whether they are equal using C's == operation.
3015    The distinction is important for IEEE floating point, because
3016    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3017    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3018
3019    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3020    even though it may hold multiple values during a function.
3021    This is because a GCC tree node guarantees that nothing else is
3022    executed between the evaluation of its "operands" (which may often
3023    be evaluated in arbitrary order).  Hence if the operands themselves
3024    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3025    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3026    unset means assuming isochronic (or instantaneous) tree equivalence.
3027    Unless comparing arbitrary expression trees, such as from different
3028    statements, this flag can usually be left unset.
3029
3030    If OEP_PURE_SAME is set, then pure functions with identical arguments
3031    are considered the same.  It is used when the caller has other ways
3032    to ensure that global memory is unchanged in between.  */
3033
3034 int
3035 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3036 {
3037   /* If either is ERROR_MARK, they aren't equal.  */
3038   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3039     return 0;
3040
3041   /* Check equality of integer constants before bailing out due to
3042      precision differences.  */
3043   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
3044     return tree_int_cst_equal (arg0, arg1);
3045
3046   /* If both types don't have the same signedness, then we can't consider
3047      them equal.  We must check this before the STRIP_NOPS calls
3048      because they may change the signedness of the arguments.  As pointers
3049      strictly don't have a signedness, require either two pointers or
3050      two non-pointers as well.  */
3051   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
3052       || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
3053     return 0;
3054
3055   /* If both types don't have the same precision, then it is not safe
3056      to strip NOPs.  */
3057   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3058     return 0;
3059
3060   STRIP_NOPS (arg0);
3061   STRIP_NOPS (arg1);
3062
3063   /* In case both args are comparisons but with different comparison
3064      code, try to swap the comparison operands of one arg to produce
3065      a match and compare that variant.  */
3066   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3067       && COMPARISON_CLASS_P (arg0)
3068       && COMPARISON_CLASS_P (arg1))
3069     {
3070       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3071
3072       if (TREE_CODE (arg0) == swap_code)
3073         return operand_equal_p (TREE_OPERAND (arg0, 0),
3074                                 TREE_OPERAND (arg1, 1), flags)
3075                && operand_equal_p (TREE_OPERAND (arg0, 1),
3076                                    TREE_OPERAND (arg1, 0), flags);
3077     }
3078
3079   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3080       /* This is needed for conversions and for COMPONENT_REF.
3081          Might as well play it safe and always test this.  */
3082       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3083       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3084       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3085     return 0;
3086
3087   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3088      We don't care about side effects in that case because the SAVE_EXPR
3089      takes care of that for us. In all other cases, two expressions are
3090      equal if they have no side effects.  If we have two identical
3091      expressions with side effects that should be treated the same due
3092      to the only side effects being identical SAVE_EXPR's, that will
3093      be detected in the recursive calls below.  */
3094   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3095       && (TREE_CODE (arg0) == SAVE_EXPR
3096           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3097     return 1;
3098
3099   /* Next handle constant cases, those for which we can return 1 even
3100      if ONLY_CONST is set.  */
3101   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3102     switch (TREE_CODE (arg0))
3103       {
3104       case INTEGER_CST:
3105         return tree_int_cst_equal (arg0, arg1);
3106
3107       case FIXED_CST:
3108         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3109                                        TREE_FIXED_CST (arg1));
3110
3111       case REAL_CST:
3112         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3113                                    TREE_REAL_CST (arg1)))
3114           return 1;
3115
3116         
3117         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3118           {
3119             /* If we do not distinguish between signed and unsigned zero,
3120                consider them equal.  */
3121             if (real_zerop (arg0) && real_zerop (arg1))
3122               return 1;
3123           }
3124         return 0;
3125
3126       case VECTOR_CST:
3127         {
3128           tree v1, v2;
3129
3130           v1 = TREE_VECTOR_CST_ELTS (arg0);
3131           v2 = TREE_VECTOR_CST_ELTS (arg1);
3132           while (v1 && v2)
3133             {
3134               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3135                                     flags))
3136                 return 0;
3137               v1 = TREE_CHAIN (v1);
3138               v2 = TREE_CHAIN (v2);
3139             }
3140
3141           return v1 == v2;
3142         }
3143
3144       case COMPLEX_CST:
3145         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3146                                  flags)
3147                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3148                                     flags));
3149
3150       case STRING_CST:
3151         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3152                 && ! memcmp (TREE_STRING_POINTER (arg0),
3153                               TREE_STRING_POINTER (arg1),
3154                               TREE_STRING_LENGTH (arg0)));
3155
3156       case ADDR_EXPR:
3157         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3158                                 0);
3159       default:
3160         break;
3161       }
3162
3163   if (flags & OEP_ONLY_CONST)
3164     return 0;
3165
3166 /* Define macros to test an operand from arg0 and arg1 for equality and a
3167    variant that allows null and views null as being different from any
3168    non-null value.  In the latter case, if either is null, the both
3169    must be; otherwise, do the normal comparison.  */
3170 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3171                                     TREE_OPERAND (arg1, N), flags)
3172
3173 #define OP_SAME_WITH_NULL(N)                            \
3174   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3175    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3176
3177   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3178     {
3179     case tcc_unary:
3180       /* Two conversions are equal only if signedness and modes match.  */
3181       switch (TREE_CODE (arg0))
3182         {
3183         CASE_CONVERT:
3184         case FIX_TRUNC_EXPR:
3185           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3186               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3187             return 0;
3188           break;
3189         default:
3190           break;
3191         }
3192
3193       return OP_SAME (0);
3194
3195
3196     case tcc_comparison:
3197     case tcc_binary:
3198       if (OP_SAME (0) && OP_SAME (1))
3199         return 1;
3200
3201       /* For commutative ops, allow the other order.  */
3202       return (commutative_tree_code (TREE_CODE (arg0))
3203               && operand_equal_p (TREE_OPERAND (arg0, 0),
3204                                   TREE_OPERAND (arg1, 1), flags)
3205               && operand_equal_p (TREE_OPERAND (arg0, 1),
3206                                   TREE_OPERAND (arg1, 0), flags));
3207
3208     case tcc_reference:
3209       /* If either of the pointer (or reference) expressions we are
3210          dereferencing contain a side effect, these cannot be equal.  */
3211       if (TREE_SIDE_EFFECTS (arg0)
3212           || TREE_SIDE_EFFECTS (arg1))
3213         return 0;
3214
3215       switch (TREE_CODE (arg0))
3216         {
3217         case INDIRECT_REF:
3218         case ALIGN_INDIRECT_REF:
3219         case MISALIGNED_INDIRECT_REF:
3220         case REALPART_EXPR:
3221         case IMAGPART_EXPR:
3222           return OP_SAME (0);
3223
3224         case ARRAY_REF:
3225         case ARRAY_RANGE_REF:
3226           /* Operands 2 and 3 may be null.
3227              Compare the array index by value if it is constant first as we
3228              may have different types but same value here.  */
3229           return (OP_SAME (0)
3230                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3231                                           TREE_OPERAND (arg1, 1))
3232                       || OP_SAME (1))
3233                   && OP_SAME_WITH_NULL (2)
3234                   && OP_SAME_WITH_NULL (3));
3235
3236         case COMPONENT_REF:
3237           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3238              may be NULL when we're called to compare MEM_EXPRs.  */
3239           return OP_SAME_WITH_NULL (0)
3240                  && OP_SAME (1)
3241                  && OP_SAME_WITH_NULL (2);
3242
3243         case BIT_FIELD_REF:
3244           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3245
3246         default:
3247           return 0;
3248         }
3249
3250     case tcc_expression:
3251       switch (TREE_CODE (arg0))
3252         {
3253         case ADDR_EXPR:
3254         case TRUTH_NOT_EXPR:
3255           return OP_SAME (0);
3256
3257         case TRUTH_ANDIF_EXPR:
3258         case TRUTH_ORIF_EXPR:
3259           return OP_SAME (0) && OP_SAME (1);
3260
3261         case TRUTH_AND_EXPR:
3262         case TRUTH_OR_EXPR:
3263         case TRUTH_XOR_EXPR:
3264           if (OP_SAME (0) && OP_SAME (1))
3265             return 1;
3266
3267           /* Otherwise take into account this is a commutative operation.  */
3268           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3269                                    TREE_OPERAND (arg1, 1), flags)
3270                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3271                                       TREE_OPERAND (arg1, 0), flags));
3272
3273         case COND_EXPR:
3274           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3275           
3276         default:
3277           return 0;
3278         }
3279
3280     case tcc_vl_exp:
3281       switch (TREE_CODE (arg0))
3282         {
3283         case CALL_EXPR:
3284           /* If the CALL_EXPRs call different functions, then they
3285              clearly can not be equal.  */
3286           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3287                                  flags))
3288             return 0;
3289
3290           {
3291             unsigned int cef = call_expr_flags (arg0);
3292             if (flags & OEP_PURE_SAME)
3293               cef &= ECF_CONST | ECF_PURE;
3294             else
3295               cef &= ECF_CONST;
3296             if (!cef)
3297               return 0;
3298           }
3299
3300           /* Now see if all the arguments are the same.  */
3301           {
3302             const_call_expr_arg_iterator iter0, iter1;
3303             const_tree a0, a1;
3304             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3305                    a1 = first_const_call_expr_arg (arg1, &iter1);
3306                  a0 && a1;
3307                  a0 = next_const_call_expr_arg (&iter0),
3308                    a1 = next_const_call_expr_arg (&iter1))
3309               if (! operand_equal_p (a0, a1, flags))
3310                 return 0;
3311
3312             /* If we get here and both argument lists are exhausted
3313                then the CALL_EXPRs are equal.  */
3314             return ! (a0 || a1);
3315           }
3316         default:
3317           return 0;
3318         }
3319
3320     case tcc_declaration:
3321       /* Consider __builtin_sqrt equal to sqrt.  */
3322       return (TREE_CODE (arg0) == FUNCTION_DECL
3323               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3324               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3325               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3326
3327     default:
3328       return 0;
3329     }
3330
3331 #undef OP_SAME
3332 #undef OP_SAME_WITH_NULL
3333 }
3334 \f
3335 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3336    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3337
3338    When in doubt, return 0.  */
3339
3340 static int
3341 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3342 {
3343   int unsignedp1, unsignedpo;
3344   tree primarg0, primarg1, primother;
3345   unsigned int correct_width;
3346
3347   if (operand_equal_p (arg0, arg1, 0))
3348     return 1;
3349
3350   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3351       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3352     return 0;
3353
3354   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3355      and see if the inner values are the same.  This removes any
3356      signedness comparison, which doesn't matter here.  */
3357   primarg0 = arg0, primarg1 = arg1;
3358   STRIP_NOPS (primarg0);
3359   STRIP_NOPS (primarg1);
3360   if (operand_equal_p (primarg0, primarg1, 0))
3361     return 1;
3362
3363   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3364      actual comparison operand, ARG0.
3365
3366      First throw away any conversions to wider types
3367      already present in the operands.  */
3368
3369   primarg1 = get_narrower (arg1, &unsignedp1);
3370   primother = get_narrower (other, &unsignedpo);
3371
3372   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3373   if (unsignedp1 == unsignedpo
3374       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3375       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3376     {
3377       tree type = TREE_TYPE (arg0);
3378
3379       /* Make sure shorter operand is extended the right way
3380          to match the longer operand.  */
3381       primarg1 = fold_convert (signed_or_unsigned_type_for
3382                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3383
3384       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3385         return 1;
3386     }
3387
3388   return 0;
3389 }
3390 \f
3391 /* See if ARG is an expression that is either a comparison or is performing
3392    arithmetic on comparisons.  The comparisons must only be comparing
3393    two different values, which will be stored in *CVAL1 and *CVAL2; if
3394    they are nonzero it means that some operands have already been found.
3395    No variables may be used anywhere else in the expression except in the
3396    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3397    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3398
3399    If this is true, return 1.  Otherwise, return zero.  */
3400
3401 static int
3402 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3403 {
3404   enum tree_code code = TREE_CODE (arg);
3405   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3406
3407   /* We can handle some of the tcc_expression cases here.  */
3408   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3409     tclass = tcc_unary;
3410   else if (tclass == tcc_expression
3411            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3412                || code == COMPOUND_EXPR))
3413     tclass = tcc_binary;
3414
3415   else if (tclass == tcc_expression && code == SAVE_EXPR
3416            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3417     {
3418       /* If we've already found a CVAL1 or CVAL2, this expression is
3419          two complex to handle.  */
3420       if (*cval1 || *cval2)
3421         return 0;
3422
3423       tclass = tcc_unary;
3424       *save_p = 1;
3425     }
3426
3427   switch (tclass)
3428     {
3429     case tcc_unary:
3430       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3431
3432     case tcc_binary:
3433       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3434               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3435                                       cval1, cval2, save_p));
3436
3437     case tcc_constant:
3438       return 1;
3439
3440     case tcc_expression:
3441       if (code == COND_EXPR)
3442         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3443                                      cval1, cval2, save_p)
3444                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3445                                         cval1, cval2, save_p)
3446                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3447                                         cval1, cval2, save_p));
3448       return 0;
3449
3450     case tcc_comparison:
3451       /* First see if we can handle the first operand, then the second.  For
3452          the second operand, we know *CVAL1 can't be zero.  It must be that
3453          one side of the comparison is each of the values; test for the
3454          case where this isn't true by failing if the two operands
3455          are the same.  */
3456
3457       if (operand_equal_p (TREE_OPERAND (arg, 0),
3458                            TREE_OPERAND (arg, 1), 0))
3459         return 0;
3460
3461       if (*cval1 == 0)
3462         *cval1 = TREE_OPERAND (arg, 0);
3463       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3464         ;
3465       else if (*cval2 == 0)
3466         *cval2 = TREE_OPERAND (arg, 0);
3467       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3468         ;
3469       else
3470         return 0;
3471
3472       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3473         ;
3474       else if (*cval2 == 0)
3475         *cval2 = TREE_OPERAND (arg, 1);
3476       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3477         ;
3478       else
3479         return 0;
3480
3481       return 1;
3482
3483     default:
3484       return 0;
3485     }
3486 }
3487 \f
3488 /* ARG is a tree that is known to contain just arithmetic operations and
3489    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3490    any occurrence of OLD0 as an operand of a comparison and likewise for
3491    NEW1 and OLD1.  */
3492
3493 static tree
3494 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3495 {
3496   tree type = TREE_TYPE (arg);
3497   enum tree_code code = TREE_CODE (arg);
3498   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3499
3500   /* We can handle some of the tcc_expression cases here.  */
3501   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3502     tclass = tcc_unary;
3503   else if (tclass == tcc_expression
3504            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3505     tclass = tcc_binary;
3506
3507   switch (tclass)
3508     {
3509     case tcc_unary:
3510       return fold_build1 (code, type,
3511                           eval_subst (TREE_OPERAND (arg, 0),
3512                                       old0, new0, old1, new1));
3513
3514     case tcc_binary:
3515       return fold_build2 (code, type,
3516                           eval_subst (TREE_OPERAND (arg, 0),
3517                                       old0, new0, old1, new1),
3518                           eval_subst (TREE_OPERAND (arg, 1),
3519                                       old0, new0, old1, new1));
3520
3521     case tcc_expression:
3522       switch (code)
3523         {
3524         case SAVE_EXPR:
3525           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3526
3527         case COMPOUND_EXPR:
3528           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3529
3530         case COND_EXPR:
3531           return fold_build3 (code, type,
3532                               eval_subst (TREE_OPERAND (arg, 0),
3533                                           old0, new0, old1, new1),
3534                               eval_subst (TREE_OPERAND (arg, 1),
3535                                           old0, new0, old1, new1),
3536                               eval_subst (TREE_OPERAND (arg, 2),
3537                                           old0, new0, old1, new1));
3538         default:
3539           break;
3540         }
3541       /* Fall through - ???  */
3542
3543     case tcc_comparison:
3544       {
3545         tree arg0 = TREE_OPERAND (arg, 0);
3546         tree arg1 = TREE_OPERAND (arg, 1);
3547
3548         /* We need to check both for exact equality and tree equality.  The
3549            former will be true if the operand has a side-effect.  In that
3550            case, we know the operand occurred exactly once.  */
3551
3552         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3553           arg0 = new0;
3554         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3555           arg0 = new1;
3556
3557         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3558           arg1 = new0;
3559         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3560           arg1 = new1;
3561
3562         return fold_build2 (code, type, arg0, arg1);
3563       }
3564
3565     default:
3566       return arg;
3567     }
3568 }
3569 \f
3570 /* Return a tree for the case when the result of an expression is RESULT
3571    converted to TYPE and OMITTED was previously an operand of the expression
3572    but is now not needed (e.g., we folded OMITTED * 0).
3573
3574    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3575    the conversion of RESULT to TYPE.  */
3576
3577 tree
3578 omit_one_operand (tree type, tree result, tree omitted)
3579 {
3580   tree t = fold_convert (type, result);
3581
3582   /* If the resulting operand is an empty statement, just return the omitted
3583      statement casted to void. */
3584   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3585     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3586
3587   if (TREE_SIDE_EFFECTS (omitted))
3588     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3589
3590   return non_lvalue (t);
3591 }
3592
3593 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3594
3595 static tree
3596 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3597 {
3598   tree t = fold_convert (type, result);
3599
3600   /* If the resulting operand is an empty statement, just return the omitted
3601      statement casted to void. */
3602   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3603     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3604
3605   if (TREE_SIDE_EFFECTS (omitted))
3606     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3607
3608   return pedantic_non_lvalue (t);
3609 }
3610
3611 /* Return a tree for the case when the result of an expression is RESULT
3612    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3613    of the expression but are now not needed.
3614
3615    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3616    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3617    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3618    just do the conversion of RESULT to TYPE.  */
3619
3620 tree
3621 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3622 {
3623   tree t = fold_convert (type, result);
3624
3625   if (TREE_SIDE_EFFECTS (omitted2))
3626     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3627   if (TREE_SIDE_EFFECTS (omitted1))
3628     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3629
3630   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3631 }
3632
3633 \f
3634 /* Return a simplified tree node for the truth-negation of ARG.  This
3635    never alters ARG itself.  We assume that ARG is an operation that
3636    returns a truth value (0 or 1).
3637
3638    FIXME: one would think we would fold the result, but it causes
3639    problems with the dominator optimizer.  */
3640
3641 tree
3642 fold_truth_not_expr (tree arg)
3643 {
3644   tree type = TREE_TYPE (arg);
3645   enum tree_code code = TREE_CODE (arg);
3646
3647   /* If this is a comparison, we can simply invert it, except for
3648      floating-point non-equality comparisons, in which case we just
3649      enclose a TRUTH_NOT_EXPR around what we have.  */
3650
3651   if (TREE_CODE_CLASS (code) == tcc_comparison)
3652     {
3653       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3654       if (FLOAT_TYPE_P (op_type)
3655           && flag_trapping_math
3656           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3657           && code != NE_EXPR && code != EQ_EXPR)
3658         return NULL_TREE;
3659       else
3660         {
3661           code = invert_tree_comparison (code,
3662                                          HONOR_NANS (TYPE_MODE (op_type)));
3663           if (code == ERROR_MARK)
3664             return NULL_TREE;
3665           else
3666             return build2 (code, type,
3667                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3668         }
3669     }
3670
3671   switch (code)
3672     {
3673     case INTEGER_CST:
3674       return constant_boolean_node (integer_zerop (arg), type);
3675
3676     case TRUTH_AND_EXPR:
3677       return build2 (TRUTH_OR_EXPR, type,
3678                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3679                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3680
3681     case TRUTH_OR_EXPR:
3682       return build2 (TRUTH_AND_EXPR, type,
3683                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3684                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3685
3686     case TRUTH_XOR_EXPR:
3687       /* Here we can invert either operand.  We invert the first operand
3688          unless the second operand is a TRUTH_NOT_EXPR in which case our
3689          result is the XOR of the first operand with the inside of the
3690          negation of the second operand.  */
3691
3692       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3693         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3694                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3695       else
3696         return build2 (TRUTH_XOR_EXPR, type,
3697                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3698                        TREE_OPERAND (arg, 1));
3699
3700     case TRUTH_ANDIF_EXPR:
3701       return build2 (TRUTH_ORIF_EXPR, type,
3702                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3703                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3704
3705     case TRUTH_ORIF_EXPR:
3706       return build2 (TRUTH_ANDIF_EXPR, type,
3707                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3708                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3709
3710     case TRUTH_NOT_EXPR:
3711       return TREE_OPERAND (arg, 0);
3712
3713     case COND_EXPR:
3714       {
3715         tree arg1 = TREE_OPERAND (arg, 1);
3716         tree arg2 = TREE_OPERAND (arg, 2);
3717         /* A COND_EXPR may have a throw as one operand, which
3718            then has void type.  Just leave void operands
3719            as they are.  */
3720         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3721                        VOID_TYPE_P (TREE_TYPE (arg1))
3722                        ? arg1 : invert_truthvalue (arg1),
3723                        VOID_TYPE_P (TREE_TYPE (arg2))
3724                        ? arg2 : invert_truthvalue (arg2));
3725       }
3726
3727     case COMPOUND_EXPR:
3728       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3729                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3730
3731     case NON_LVALUE_EXPR:
3732       return invert_truthvalue (TREE_OPERAND (arg, 0));
3733
3734     case NOP_EXPR:
3735       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3736         return build1 (TRUTH_NOT_EXPR, type, arg);
3737
3738     case CONVERT_EXPR:
3739     case FLOAT_EXPR:
3740       return build1 (TREE_CODE (arg), type,
3741                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3742
3743     case BIT_AND_EXPR:
3744       if (!integer_onep (TREE_OPERAND (arg, 1)))
3745         break;
3746       return build2 (EQ_EXPR, type, arg,
3747                      build_int_cst (type, 0));
3748
3749     case SAVE_EXPR:
3750       return build1 (TRUTH_NOT_EXPR, type, arg);
3751
3752     case CLEANUP_POINT_EXPR:
3753       return build1 (CLEANUP_POINT_EXPR, type,
3754                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3755
3756     default:
3757       break;
3758     }
3759
3760   return NULL_TREE;
3761 }
3762
3763 /* Return a simplified tree node for the truth-negation of ARG.  This
3764    never alters ARG itself.  We assume that ARG is an operation that
3765    returns a truth value (0 or 1).
3766
3767    FIXME: one would think we would fold the result, but it causes
3768    problems with the dominator optimizer.  */
3769
3770 tree
3771 invert_truthvalue (tree arg)
3772 {
3773   tree tem;
3774
3775   if (TREE_CODE (arg) == ERROR_MARK)
3776     return arg;
3777
3778   tem = fold_truth_not_expr (arg);
3779   if (!tem)
3780     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3781
3782   return tem;
3783 }
3784
3785 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3786    operands are another bit-wise operation with a common input.  If so,
3787    distribute the bit operations to save an operation and possibly two if
3788    constants are involved.  For example, convert
3789         (A | B) & (A | C) into A | (B & C)
3790    Further simplification will occur if B and C are constants.
3791
3792    If this optimization cannot be done, 0 will be returned.  */
3793
3794 static tree
3795 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3796 {
3797   tree common;
3798   tree left, right;
3799
3800   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3801       || TREE_CODE (arg0) == code
3802       || (TREE_CODE (arg0) != BIT_AND_EXPR
3803           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3804     return 0;
3805
3806   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3807     {
3808       common = TREE_OPERAND (arg0, 0);
3809       left = TREE_OPERAND (arg0, 1);
3810       right = TREE_OPERAND (arg1, 1);
3811     }
3812   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3813     {
3814       common = TREE_OPERAND (arg0, 0);
3815       left = TREE_OPERAND (arg0, 1);
3816       right = TREE_OPERAND (arg1, 0);
3817     }
3818   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3819     {
3820       common = TREE_OPERAND (arg0, 1);
3821       left = TREE_OPERAND (arg0, 0);
3822       right = TREE_OPERAND (arg1, 1);
3823     }
3824   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3825     {
3826       common = TREE_OPERAND (arg0, 1);
3827       left = TREE_OPERAND (arg0, 0);
3828       right = TREE_OPERAND (arg1, 0);
3829     }
3830   else
3831     return 0;
3832
3833   common = fold_convert (type, common);
3834   left = fold_convert (type, left);
3835   right = fold_convert (type, right);
3836   return fold_build2 (TREE_CODE (arg0), type, common,
3837                       fold_build2 (code, type, left, right));
3838 }
3839
3840 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3841    with code CODE.  This optimization is unsafe.  */
3842 static tree
3843 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3844 {
3845   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3846   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3847
3848   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3849   if (mul0 == mul1
3850       && operand_equal_p (TREE_OPERAND (arg0, 1),
3851                        TREE_OPERAND (arg1, 1), 0))
3852     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3853                         fold_build2 (code, type,
3854                                      TREE_OPERAND (arg0, 0),
3855                                      TREE_OPERAND (arg1, 0)),
3856                         TREE_OPERAND (arg0, 1));
3857
3858   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3859   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3860                        TREE_OPERAND (arg1, 0), 0)
3861       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3862       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3863     {
3864       REAL_VALUE_TYPE r0, r1;
3865       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3866       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3867       if (!mul0)
3868         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3869       if (!mul1)
3870         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3871       real_arithmetic (&r0, code, &r0, &r1);
3872       return fold_build2 (MULT_EXPR, type,
3873                           TREE_OPERAND (arg0, 0),
3874                           build_real (type, r0));
3875     }
3876
3877   return NULL_TREE;
3878 }
3879 \f
3880 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3881    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
3882
3883 static tree
3884 make_bit_field_ref (tree inner, tree type, HOST_WIDE_INT bitsize,
3885                     HOST_WIDE_INT bitpos, int unsignedp)
3886 {
3887   tree result, bftype;
3888
3889   if (bitpos == 0)
3890     {
3891       tree size = TYPE_SIZE (TREE_TYPE (inner));
3892       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3893            || POINTER_TYPE_P (TREE_TYPE (inner)))
3894           && host_integerp (size, 0) 
3895           && tree_low_cst (size, 0) == bitsize)
3896         return fold_convert (type, inner);
3897     }
3898
3899   bftype = type;
3900   if (TYPE_PRECISION (bftype) != bitsize
3901       || TYPE_UNSIGNED (bftype) == !unsignedp)
3902     bftype = build_nonstandard_integer_type (bitsize, 0);
3903
3904   result = build3 (BIT_FIELD_REF, bftype, inner,
3905                    size_int (bitsize), bitsize_int (bitpos));
3906
3907   if (bftype != type)
3908     result = fold_convert (type, result);
3909
3910   return result;
3911 }
3912
3913 /* Optimize a bit-field compare.
3914
3915    There are two cases:  First is a compare against a constant and the
3916    second is a comparison of two items where the fields are at the same
3917    bit position relative to the start of a chunk (byte, halfword, word)
3918    large enough to contain it.  In these cases we can avoid the shift
3919    implicit in bitfield extractions.
3920
3921    For constants, we emit a compare of the shifted constant with the
3922    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3923    compared.  For two fields at the same position, we do the ANDs with the
3924    similar mask and compare the result of the ANDs.
3925
3926    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3927    COMPARE_TYPE is the type of the comparison, and LHS and RHS
3928    are the left and right operands of the comparison, respectively.
3929
3930    If the optimization described above can be done, we return the resulting
3931    tree.  Otherwise we return zero.  */
3932
3933 static tree
3934 optimize_bit_field_compare (enum tree_code code, tree compare_type,
3935                             tree lhs, tree rhs)
3936 {
3937   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3938   tree type = TREE_TYPE (lhs);
3939   tree signed_type, unsigned_type;
3940   int const_p = TREE_CODE (rhs) == INTEGER_CST;
3941   enum machine_mode lmode, rmode, nmode;
3942   int lunsignedp, runsignedp;
3943   int lvolatilep = 0, rvolatilep = 0;
3944   tree linner, rinner = NULL_TREE;
3945   tree mask;
3946   tree offset;
3947
3948   /* Get all the information about the extractions being done.  If the bit size
3949      if the same as the size of the underlying object, we aren't doing an
3950      extraction at all and so can do nothing.  We also don't want to
3951      do anything if the inner expression is a PLACEHOLDER_EXPR since we
3952      then will no longer be able to replace it.  */
3953   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3954                                 &lunsignedp, &lvolatilep, false);
3955   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3956       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
3957     return 0;
3958
3959  if (!const_p)
3960    {
3961      /* If this is not a constant, we can only do something if bit positions,
3962         sizes, and signedness are the same.  */
3963      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3964                                    &runsignedp, &rvolatilep, false);
3965
3966      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3967          || lunsignedp != runsignedp || offset != 0
3968          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
3969        return 0;
3970    }
3971
3972   /* See if we can find a mode to refer to this field.  We should be able to,
3973      but fail if we can't.  */
3974   nmode = get_best_mode (lbitsize, lbitpos,
3975                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3976                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3977                                 TYPE_ALIGN (TREE_TYPE (rinner))),
3978                          word_mode, lvolatilep || rvolatilep);
3979   if (nmode == VOIDmode)
3980     return 0;
3981
3982   /* Set signed and unsigned types of the precision of this mode for the
3983      shifts below.  */
3984   signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3985   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3986
3987   /* Compute the bit position and size for the new reference and our offset
3988      within it. If the new reference is the same size as the original, we
3989      won't optimize anything, so return zero.  */
3990   nbitsize = GET_MODE_BITSIZE (nmode);
3991   nbitpos = lbitpos & ~ (nbitsize - 1);
3992   lbitpos -= nbitpos;
3993   if (nbitsize == lbitsize)
3994     return 0;
3995
3996   if (BYTES_BIG_ENDIAN)
3997     lbitpos = nbitsize - lbitsize - lbitpos;
3998
3999   /* Make the mask to be used against the extracted field.  */
4000   mask = build_int_cst_type (unsigned_type, -1);
4001   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
4002   mask = const_binop (RSHIFT_EXPR, mask,
4003                       size_int (nbitsize - lbitsize - lbitpos), 0);
4004
4005   if (! const_p)
4006     /* If not comparing with constant, just rework the comparison
4007        and return.  */
4008     return fold_build2 (code, compare_type,
4009                         fold_build2 (BIT_AND_EXPR, unsigned_type,
4010                                      make_bit_field_ref (linner,
4011                                                          unsigned_type,
4012                                                          nbitsize, nbitpos,
4013                                                          1),
4014                                      mask),
4015                         fold_build2 (BIT_AND_EXPR, unsigned_type,
4016                                      make_bit_field_ref (rinner,
4017                                                          unsigned_type,
4018                                                          nbitsize, nbitpos,
4019                                                          1),
4020                                      mask));
4021
4022   /* Otherwise, we are handling the constant case. See if the constant is too
4023      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
4024      this not only for its own sake, but to avoid having to test for this
4025      error case below.  If we didn't, we might generate wrong code.
4026
4027      For unsigned fields, the constant shifted right by the field length should
4028      be all zero.  For signed fields, the high-order bits should agree with
4029      the sign bit.  */
4030
4031   if (lunsignedp)
4032     {
4033       if (! integer_zerop (const_binop (RSHIFT_EXPR,
4034                                         fold_convert (unsigned_type, rhs),
4035                                         size_int (lbitsize), 0)))
4036         {
4037           warning (0, "comparison is always %d due to width of bit-field",
4038                    code == NE_EXPR);
4039           return constant_boolean_node (code == NE_EXPR, compare_type);
4040         }
4041     }
4042   else
4043     {
4044       tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs),
4045                               size_int (lbitsize - 1), 0);
4046       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
4047         {
4048           warning (0, "comparison is always %d due to width of bit-field",
4049                    code == NE_EXPR);
4050           return constant_boolean_node (code == NE_EXPR, compare_type);
4051         }
4052     }
4053
4054   /* Single-bit compares should always be against zero.  */
4055   if (lbitsize == 1 && ! integer_zerop (rhs))
4056     {
4057       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
4058       rhs = build_int_cst (type, 0);
4059     }
4060
4061   /* Make a new bitfield reference, shift the constant over the
4062      appropriate number of bits and mask it with the computed mask
4063      (in case this was a signed field).  If we changed it, make a new one.  */
4064   lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
4065   if (lvolatilep)
4066     {
4067       TREE_SIDE_EFFECTS (lhs) = 1;
4068       TREE_THIS_VOLATILE (lhs) = 1;
4069     }
4070
4071   rhs = const_binop (BIT_AND_EXPR,
4072                      const_binop (LSHIFT_EXPR,
4073                                   fold_convert (unsigned_type, rhs),
4074                                   size_int (lbitpos), 0),
4075                      mask, 0);
4076
4077   return build2 (code, compare_type,
4078                  build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
4079                  rhs);
4080 }
4081 \f
4082 /* Subroutine for fold_truthop: decode a field reference.
4083
4084    If EXP is a comparison reference, we return the innermost reference.
4085
4086    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
4087    set to the starting bit number.
4088
4089    If the innermost field can be completely contained in a mode-sized
4090    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
4091
4092    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
4093    otherwise it is not changed.
4094
4095    *PUNSIGNEDP is set to the signedness of the field.
4096
4097    *PMASK is set to the mask used.  This is either contained in a
4098    BIT_AND_EXPR or derived from the width of the field.
4099
4100    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
4101
4102    Return 0 if this is not a component reference or is one that we can't
4103    do anything with.  */
4104
4105 static tree
4106 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
4107                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
4108                         int *punsignedp, int *pvolatilep,
4109                         tree *pmask, tree *pand_mask)
4110 {
4111   tree outer_type = 0;
4112   tree and_mask = 0;
4113   tree mask, inner, offset;
4114   tree unsigned_type;
4115   unsigned int precision;
4116
4117   /* All the optimizations using this function assume integer fields.
4118      There are problems with FP fields since the type_for_size call
4119      below can fail for, e.g., XFmode.  */
4120   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
4121     return 0;
4122
4123   /* We are interested in the bare arrangement of bits, so strip everything
4124      that doesn't affect the machine mode.  However, record the type of the
4125      outermost expression if it may matter below.  */
4126   if (CONVERT_EXPR_P (exp)
4127       || TREE_CODE (exp) == NON_LVALUE_EXPR)
4128     outer_type = TREE_TYPE (exp);
4129   STRIP_NOPS (exp);
4130
4131   if (TREE_CODE (exp) == BIT_AND_EXPR)
4132     {
4133       and_mask = TREE_OPERAND (exp, 1);
4134       exp = TREE_OPERAND (exp, 0);
4135       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
4136       if (TREE_CODE (and_mask) != INTEGER_CST)
4137         return 0;
4138     }
4139
4140   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
4141                                punsignedp, pvolatilep, false);
4142   if ((inner == exp && and_mask == 0)
4143       || *pbitsize < 0 || offset != 0
4144       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
4145     return 0;
4146
4147   /* If the number of bits in the reference is the same as the bitsize of
4148      the outer type, then the outer type gives the signedness. Otherwise
4149      (in case of a small bitfield) the signedness is unchanged.  */
4150   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
4151     *punsignedp = TYPE_UNSIGNED (outer_type);
4152
4153   /* Compute the mask to access the bitfield.  */
4154   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
4155   precision = TYPE_PRECISION (unsigned_type);
4156
4157   mask = build_int_cst_type (unsigned_type, -1);
4158
4159   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4160   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4161
4162   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
4163   if (and_mask != 0)
4164     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
4165                         fold_convert (unsigned_type, and_mask), mask);
4166
4167   *pmask = mask;
4168   *pand_mask = and_mask;
4169   return inner;
4170 }
4171
4172 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
4173    bit positions.  */
4174
4175 static int
4176 all_ones_mask_p (const_tree mask, int size)
4177 {
4178   tree type = TREE_TYPE (mask);
4179   unsigned int precision = TYPE_PRECISION (type);
4180   tree tmask;
4181
4182   tmask = build_int_cst_type (signed_type_for (type), -1);
4183
4184   return
4185     tree_int_cst_equal (mask,
4186                         const_binop (RSHIFT_EXPR,
4187                                      const_binop (LSHIFT_EXPR, tmask,
4188                                                   size_int (precision - size),
4189                                                   0),
4190                                      size_int (precision - size), 0));
4191 }
4192
4193 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
4194    represents the sign bit of EXP's type.  If EXP represents a sign
4195    or zero extension, also test VAL against the unextended type.
4196    The return value is the (sub)expression whose sign bit is VAL,
4197    or NULL_TREE otherwise.  */
4198
4199 static tree
4200 sign_bit_p (tree exp, const_tree val)
4201 {
4202   unsigned HOST_WIDE_INT mask_lo, lo;
4203   HOST_WIDE_INT mask_hi, hi;
4204   int width;
4205   tree t;
4206
4207   /* Tree EXP must have an integral type.  */
4208   t = TREE_TYPE (exp);
4209   if (! INTEGRAL_TYPE_P (t))
4210     return NULL_TREE;
4211
4212   /* Tree VAL must be an integer constant.  */
4213   if (TREE_CODE (val) != INTEGER_CST
4214       || TREE_OVERFLOW (val))
4215     return NULL_TREE;
4216
4217   width = TYPE_PRECISION (t);
4218   if (width > HOST_BITS_PER_WIDE_INT)
4219     {
4220       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
4221       lo = 0;
4222
4223       mask_hi = ((unsigned HOST_WIDE_INT) -1
4224                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
4225       mask_lo = -1;
4226     }
4227   else
4228     {
4229       hi = 0;
4230       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
4231
4232       mask_hi = 0;
4233       mask_lo = ((unsigned HOST_WIDE_INT) -1
4234                  >> (HOST_BITS_PER_WIDE_INT - width));
4235     }
4236
4237   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
4238      treat VAL as if it were unsigned.  */
4239   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
4240       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
4241     return exp;
4242
4243   /* Handle extension from a narrower type.  */
4244   if (TREE_CODE (exp) == NOP_EXPR
4245       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4246     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4247
4248   return NULL_TREE;
4249 }
4250
4251 /* Subroutine for fold_truthop: determine if an operand is simple enough
4252    to be evaluated unconditionally.  */
4253
4254 static int
4255 simple_operand_p (const_tree exp)
4256 {
4257   /* Strip any conversions that don't change the machine mode.  */
4258   STRIP_NOPS (exp);
4259
4260   return (CONSTANT_CLASS_P (exp)
4261           || TREE_CODE (exp) == SSA_NAME
4262           || (DECL_P (exp)
4263               && ! TREE_ADDRESSABLE (exp)
4264               && ! TREE_THIS_VOLATILE (exp)
4265               && ! DECL_NONLOCAL (exp)
4266               /* Don't regard global variables as simple.  They may be
4267                  allocated in ways unknown to the compiler (shared memory,
4268                  #pragma weak, etc).  */
4269               && ! TREE_PUBLIC (exp)
4270               && ! DECL_EXTERNAL (exp)
4271               /* Loading a static variable is unduly expensive, but global
4272                  registers aren't expensive.  */
4273               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4274 }
4275 \f
4276 /* The following functions are subroutines to fold_range_test and allow it to
4277    try to change a logical combination of comparisons into a range test.
4278
4279    For example, both
4280         X == 2 || X == 3 || X == 4 || X == 5
4281    and
4282         X >= 2 && X <= 5
4283    are converted to
4284         (unsigned) (X - 2) <= 3
4285
4286    We describe each set of comparisons as being either inside or outside
4287    a range, using a variable named like IN_P, and then describe the
4288    range with a lower and upper bound.  If one of the bounds is omitted,
4289    it represents either the highest or lowest value of the type.
4290
4291    In the comments below, we represent a range by two numbers in brackets
4292    preceded by a "+" to designate being inside that range, or a "-" to
4293    designate being outside that range, so the condition can be inverted by
4294    flipping the prefix.  An omitted bound is represented by a "-".  For
4295    example, "- [-, 10]" means being outside the range starting at the lowest
4296    possible value and ending at 10, in other words, being greater than 10.
4297    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4298    always false.
4299
4300    We set up things so that the missing bounds are handled in a consistent
4301    manner so neither a missing bound nor "true" and "false" need to be
4302    handled using a special case.  */
4303
4304 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4305    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4306    and UPPER1_P are nonzero if the respective argument is an upper bound
4307    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4308    must be specified for a comparison.  ARG1 will be converted to ARG0's
4309    type if both are specified.  */
4310
4311 static tree
4312 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4313              tree arg1, int upper1_p)
4314 {
4315   tree tem;
4316   int result;
4317   int sgn0, sgn1;
4318
4319   /* If neither arg represents infinity, do the normal operation.
4320      Else, if not a comparison, return infinity.  Else handle the special
4321      comparison rules. Note that most of the cases below won't occur, but
4322      are handled for consistency.  */
4323
4324   if (arg0 != 0 && arg1 != 0)
4325     {
4326       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4327                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4328       STRIP_NOPS (tem);
4329       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4330     }
4331
4332   if (TREE_CODE_CLASS (code) != tcc_comparison)
4333     return 0;
4334
4335   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4336      for neither.  In real maths, we cannot assume open ended ranges are
4337      the same. But, this is computer arithmetic, where numbers are finite.
4338      We can therefore make the transformation of any unbounded range with
4339      the value Z, Z being greater than any representable number. This permits
4340      us to treat unbounded ranges as equal.  */
4341   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4342   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4343   switch (code)
4344     {
4345     case EQ_EXPR:
4346       result = sgn0 == sgn1;
4347       break;
4348     case NE_EXPR:
4349       result = sgn0 != sgn1;
4350       break;
4351     case LT_EXPR:
4352       result = sgn0 < sgn1;
4353       break;
4354     case LE_EXPR:
4355       result = sgn0 <= sgn1;
4356       break;
4357     case GT_EXPR:
4358       result = sgn0 > sgn1;
4359       break;
4360     case GE_EXPR:
4361       result = sgn0 >= sgn1;
4362       break;
4363     default:
4364       gcc_unreachable ();
4365     }
4366
4367   return constant_boolean_node (result, type);
4368 }
4369 \f
4370 /* Given EXP, a logical expression, set the range it is testing into
4371    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4372    actually being tested.  *PLOW and *PHIGH will be made of the same
4373    type as the returned expression.  If EXP is not a comparison, we
4374    will most likely not be returning a useful value and range.  Set
4375    *STRICT_OVERFLOW_P to true if the return value is only valid
4376    because signed overflow is undefined; otherwise, do not change
4377    *STRICT_OVERFLOW_P.  */
4378
4379 static tree
4380 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4381             bool *strict_overflow_p)
4382 {
4383   enum tree_code code;
4384   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4385   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4386   int in_p, n_in_p;
4387   tree low, high, n_low, n_high;
4388
4389   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4390      and see if we can refine the range.  Some of the cases below may not
4391      happen, but it doesn't seem worth worrying about this.  We "continue"
4392      the outer loop when we've changed something; otherwise we "break"
4393      the switch, which will "break" the while.  */
4394
4395   in_p = 0;
4396   low = high = build_int_cst (TREE_TYPE (exp), 0);
4397
4398   while (1)
4399     {
4400       code = TREE_CODE (exp);
4401       exp_type = TREE_TYPE (exp);
4402
4403       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4404         {
4405           if (TREE_OPERAND_LENGTH (exp) > 0)
4406             arg0 = TREE_OPERAND (exp, 0);
4407           if (TREE_CODE_CLASS (code) == tcc_comparison
4408               || TREE_CODE_CLASS (code) == tcc_unary
4409               || TREE_CODE_CLASS (code) == tcc_binary)
4410             arg0_type = TREE_TYPE (arg0);
4411           if (TREE_CODE_CLASS (code) == tcc_binary
4412               || TREE_CODE_CLASS (code) == tcc_comparison
4413               || (TREE_CODE_CLASS (code) == tcc_expression
4414                   && TREE_OPERAND_LENGTH (exp) > 1))
4415             arg1 = TREE_OPERAND (exp, 1);
4416         }
4417
4418       switch (code)
4419         {
4420         case TRUTH_NOT_EXPR:
4421           in_p = ! in_p, exp = arg0;
4422           continue;
4423
4424         case EQ_EXPR: case NE_EXPR:
4425         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4426           /* We can only do something if the range is testing for zero
4427              and if the second operand is an integer constant.  Note that
4428              saying something is "in" the range we make is done by
4429              complementing IN_P since it will set in the initial case of
4430              being not equal to zero; "out" is leaving it alone.  */
4431           if (low == 0 || high == 0
4432               || ! integer_zerop (low) || ! integer_zerop (high)
4433               || TREE_CODE (arg1) != INTEGER_CST)
4434             break;
4435
4436           switch (code)
4437             {
4438             case NE_EXPR:  /* - [c, c]  */
4439               low = high = arg1;
4440               break;
4441             case EQ_EXPR:  /* + [c, c]  */
4442               in_p = ! in_p, low = high = arg1;
4443               break;
4444             case GT_EXPR:  /* - [-, c] */
4445               low = 0, high = arg1;
4446               break;
4447             case GE_EXPR:  /* + [c, -] */
4448               in_p = ! in_p, low = arg1, high = 0;
4449               break;
4450             case LT_EXPR:  /* - [c, -] */
4451               low = arg1, high = 0;
4452               break;
4453             case LE_EXPR:  /* + [-, c] */
4454               in_p = ! in_p, low = 0, high = arg1;
4455               break;
4456             default:
4457               gcc_unreachable ();
4458             }
4459
4460           /* If this is an unsigned comparison, we also know that EXP is
4461              greater than or equal to zero.  We base the range tests we make
4462              on that fact, so we record it here so we can parse existing
4463              range tests.  We test arg0_type since often the return type
4464              of, e.g. EQ_EXPR, is boolean.  */
4465           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4466             {
4467               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4468                                   in_p, low, high, 1,
4469                                   build_int_cst (arg0_type, 0),
4470                                   NULL_TREE))
4471                 break;
4472
4473               in_p = n_in_p, low = n_low, high = n_high;
4474
4475               /* If the high bound is missing, but we have a nonzero low
4476                  bound, reverse the range so it goes from zero to the low bound
4477                  minus 1.  */
4478               if (high == 0 && low && ! integer_zerop (low))
4479                 {
4480                   in_p = ! in_p;
4481                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4482                                       integer_one_node, 0);
4483                   low = build_int_cst (arg0_type, 0);
4484                 }
4485             }
4486
4487           exp = arg0;
4488           continue;
4489
4490         case NEGATE_EXPR:
4491           /* (-x) IN [a,b] -> x in [-b, -a]  */
4492           n_low = range_binop (MINUS_EXPR, exp_type,
4493                                build_int_cst (exp_type, 0),
4494                                0, high, 1);
4495           n_high = range_binop (MINUS_EXPR, exp_type,
4496                                 build_int_cst (exp_type, 0),
4497                                 0, low, 0);
4498           low = n_low, high = n_high;
4499           exp = arg0;
4500           continue;
4501
4502         case BIT_NOT_EXPR:
4503           /* ~ X -> -X - 1  */
4504           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4505                         build_int_cst (exp_type, 1));
4506           continue;
4507
4508         case PLUS_EXPR:  case MINUS_EXPR:
4509           if (TREE_CODE (arg1) != INTEGER_CST)
4510             break;
4511
4512           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4513              move a constant to the other side.  */
4514           if (!TYPE_UNSIGNED (arg0_type)
4515               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4516             break;
4517
4518           /* If EXP is signed, any overflow in the computation is undefined,
4519              so we don't worry about it so long as our computations on
4520              the bounds don't overflow.  For unsigned, overflow is defined
4521              and this is exactly the right thing.  */
4522           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4523                                arg0_type, low, 0, arg1, 0);
4524           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4525                                 arg0_type, high, 1, arg1, 0);
4526           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4527               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4528             break;
4529
4530           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4531             *strict_overflow_p = true;
4532
4533           /* Check for an unsigned range which has wrapped around the maximum
4534              value thus making n_high < n_low, and normalize it.  */
4535           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4536             {
4537               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4538                                  integer_one_node, 0);
4539               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4540                                   integer_one_node, 0);
4541
4542               /* If the range is of the form +/- [ x+1, x ], we won't
4543                  be able to normalize it.  But then, it represents the
4544                  whole range or the empty set, so make it
4545                  +/- [ -, - ].  */
4546               if (tree_int_cst_equal (n_low, low)
4547                   && tree_int_cst_equal (n_high, high))
4548                 low = high = 0;
4549               else
4550                 in_p = ! in_p;
4551             }
4552           else
4553             low = n_low, high = n_high;
4554
4555           exp = arg0;
4556           continue;
4557
4558         CASE_CONVERT: case NON_LVALUE_EXPR:
4559           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4560             break;
4561
4562           if (! INTEGRAL_TYPE_P (arg0_type)
4563               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4564               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4565             break;
4566
4567           n_low = low, n_high = high;
4568
4569           if (n_low != 0)
4570             n_low = fold_convert (arg0_type, n_low);
4571
4572           if (n_high != 0)
4573             n_high = fold_convert (arg0_type, n_high);
4574
4575
4576           /* If we're converting arg0 from an unsigned type, to exp,
4577              a signed type,  we will be doing the comparison as unsigned.
4578              The tests above have already verified that LOW and HIGH
4579              are both positive.
4580
4581              So we have to ensure that we will handle large unsigned
4582              values the same way that the current signed bounds treat
4583              negative values.  */
4584
4585           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4586             {
4587               tree high_positive;
4588               tree equiv_type;
4589               /* For fixed-point modes, we need to pass the saturating flag
4590                  as the 2nd parameter.  */
4591               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4592                 equiv_type = lang_hooks.types.type_for_mode
4593                              (TYPE_MODE (arg0_type),
4594                               TYPE_SATURATING (arg0_type));
4595               else
4596                 equiv_type = lang_hooks.types.type_for_mode
4597                              (TYPE_MODE (arg0_type), 1);
4598
4599               /* A range without an upper bound is, naturally, unbounded.
4600                  Since convert would have cropped a very large value, use
4601                  the max value for the destination type.  */
4602               high_positive
4603                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4604                 : TYPE_MAX_VALUE (arg0_type);
4605
4606               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4607                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4608                                              fold_convert (arg0_type,
4609                                                            high_positive),
4610                                              build_int_cst (arg0_type, 1));
4611
4612               /* If the low bound is specified, "and" the range with the
4613                  range for which the original unsigned value will be
4614                  positive.  */
4615               if (low != 0)
4616                 {
4617                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4618                                       1, n_low, n_high, 1,
4619                                       fold_convert (arg0_type,
4620                                                     integer_zero_node),
4621                                       high_positive))
4622                     break;
4623
4624                   in_p = (n_in_p == in_p);
4625                 }
4626               else
4627                 {
4628                   /* Otherwise, "or" the range with the range of the input
4629                      that will be interpreted as negative.  */
4630                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4631                                       0, n_low, n_high, 1,
4632                                       fold_convert (arg0_type,
4633                                                     integer_zero_node),
4634                                       high_positive))
4635                     break;
4636
4637                   in_p = (in_p != n_in_p);
4638                 }
4639             }
4640
4641           exp = arg0;
4642           low = n_low, high = n_high;
4643           continue;
4644
4645         default:
4646           break;
4647         }
4648
4649       break;
4650     }
4651
4652   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4653   if (TREE_CODE (exp) == INTEGER_CST)
4654     {
4655       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4656                                                  exp, 0, low, 0))
4657                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4658                                                     exp, 1, high, 1)));
4659       low = high = 0;
4660       exp = 0;
4661     }
4662
4663   *pin_p = in_p, *plow = low, *phigh = high;
4664   return exp;
4665 }
4666 \f
4667 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4668    type, TYPE, return an expression to test if EXP is in (or out of, depending
4669    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4670
4671 static tree
4672 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4673 {
4674   tree etype = TREE_TYPE (exp);
4675   tree value;
4676
4677 #ifdef HAVE_canonicalize_funcptr_for_compare
4678   /* Disable this optimization for function pointer expressions
4679      on targets that require function pointer canonicalization.  */
4680   if (HAVE_canonicalize_funcptr_for_compare
4681       && TREE_CODE (etype) == POINTER_TYPE
4682       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4683     return NULL_TREE;
4684 #endif
4685
4686   if (! in_p)
4687     {
4688       value = build_range_check (type, exp, 1, low, high);
4689       if (value != 0)
4690         return invert_truthvalue (value);
4691
4692       return 0;
4693     }
4694
4695   if (low == 0 && high == 0)
4696     return build_int_cst (type, 1);
4697
4698   if (low == 0)
4699     return fold_build2 (LE_EXPR, type, exp,
4700                         fold_convert (etype, high));
4701
4702   if (high == 0)
4703     return fold_build2 (GE_EXPR, type, exp,
4704                         fold_convert (etype, low));
4705
4706   if (operand_equal_p (low, high, 0))
4707     return fold_build2 (EQ_EXPR, type, exp,
4708                         fold_convert (etype, low));
4709
4710   if (integer_zerop (low))
4711     {
4712       if (! TYPE_UNSIGNED (etype))
4713         {
4714           etype = unsigned_type_for (etype);
4715           high = fold_convert (etype, high);
4716           exp = fold_convert (etype, exp);
4717         }
4718       return build_range_check (type, exp, 1, 0, high);
4719     }
4720
4721   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4722   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4723     {
4724       unsigned HOST_WIDE_INT lo;
4725       HOST_WIDE_INT hi;
4726       int prec;
4727
4728       prec = TYPE_PRECISION (etype);
4729       if (prec <= HOST_BITS_PER_WIDE_INT)
4730         {
4731           hi = 0;
4732           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4733         }
4734       else
4735         {
4736           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4737           lo = (unsigned HOST_WIDE_INT) -1;
4738         }
4739
4740       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4741         {
4742           if (TYPE_UNSIGNED (etype))
4743             {
4744               tree signed_etype = signed_type_for (etype);
4745               if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4746                 etype
4747                   = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4748               else
4749                 etype = signed_etype;
4750               exp = fold_convert (etype, exp);
4751             }
4752           return fold_build2 (GT_EXPR, type, exp,
4753                               build_int_cst (etype, 0));
4754         }
4755     }
4756
4757   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4758      This requires wrap-around arithmetics for the type of the expression.  */
4759   switch (TREE_CODE (etype))
4760     {
4761     case INTEGER_TYPE:
4762       /* There is no requirement that LOW be within the range of ETYPE
4763          if the latter is a subtype.  It must, however, be within the base
4764          type of ETYPE.  So be sure we do the subtraction in that type.  */
4765       if (TREE_TYPE (etype))
4766         etype = TREE_TYPE (etype);
4767       break;
4768
4769     case ENUMERAL_TYPE:
4770     case BOOLEAN_TYPE:
4771       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4772                                               TYPE_UNSIGNED (etype));
4773       break;
4774
4775     default:
4776       break;
4777     }
4778
4779   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4780   if (TREE_CODE (etype) == INTEGER_TYPE
4781       && !TYPE_OVERFLOW_WRAPS (etype))
4782     {
4783       tree utype, minv, maxv;
4784
4785       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4786          for the type in question, as we rely on this here.  */
4787       utype = unsigned_type_for (etype);
4788       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4789       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4790                           integer_one_node, 1);
4791       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4792
4793       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4794                                       minv, 1, maxv, 1)))
4795         etype = utype;
4796       else
4797         return 0;
4798     }
4799
4800   high = fold_convert (etype, high);
4801   low = fold_convert (etype, low);
4802   exp = fold_convert (etype, exp);
4803
4804   value = const_binop (MINUS_EXPR, high, low, 0);
4805
4806
4807   if (POINTER_TYPE_P (etype))
4808     {
4809       if (value != 0 && !TREE_OVERFLOW (value))
4810         {
4811           low = fold_convert (sizetype, low);
4812           low = fold_build1 (NEGATE_EXPR, sizetype, low);
4813           return build_range_check (type,
4814                                     fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4815                                     1, build_int_cst (etype, 0), value);
4816         }
4817       return 0;
4818     }
4819
4820   if (value != 0 && !TREE_OVERFLOW (value))
4821     return build_range_check (type,
4822                               fold_build2 (MINUS_EXPR, etype, exp, low),
4823                               1, build_int_cst (etype, 0), value);
4824
4825   return 0;
4826 }
4827 \f
4828 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4829
4830 static tree
4831 range_predecessor (tree val)
4832 {
4833   tree type = TREE_TYPE (val);
4834
4835   if (INTEGRAL_TYPE_P (type)
4836       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4837     return 0;
4838   else
4839     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4840 }
4841
4842 /* Return the successor of VAL in its type, handling the infinite case.  */
4843
4844 static tree
4845 range_successor (tree val)
4846 {
4847   tree type = TREE_TYPE (val);
4848
4849   if (INTEGRAL_TYPE_P (type)
4850       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4851     return 0;
4852   else
4853     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4854 }
4855
4856 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4857    can, 0 if we can't.  Set the output range into the specified parameters.  */
4858
4859 static int
4860 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4861               tree high0, int in1_p, tree low1, tree high1)
4862 {
4863   int no_overlap;
4864   int subset;
4865   int temp;
4866   tree tem;
4867   int in_p;
4868   tree low, high;
4869   int lowequal = ((low0 == 0 && low1 == 0)
4870                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4871                                                 low0, 0, low1, 0)));
4872   int highequal = ((high0 == 0 && high1 == 0)
4873                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4874                                                  high0, 1, high1, 1)));
4875
4876   /* Make range 0 be the range that starts first, or ends last if they
4877      start at the same value.  Swap them if it isn't.  */
4878   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4879                                  low0, 0, low1, 0))
4880       || (lowequal
4881           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4882                                         high1, 1, high0, 1))))
4883     {
4884       temp = in0_p, in0_p = in1_p, in1_p = temp;
4885       tem = low0, low0 = low1, low1 = tem;
4886       tem = high0, high0 = high1, high1 = tem;
4887     }
4888
4889   /* Now flag two cases, whether the ranges are disjoint or whether the
4890      second range is totally subsumed in the first.  Note that the tests
4891      below are simplified by the ones above.  */
4892   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4893                                           high0, 1, low1, 0));
4894   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4895                                       high1, 1, high0, 1));
4896
4897   /* We now have four cases, depending on whether we are including or
4898      excluding the two ranges.  */
4899   if (in0_p && in1_p)
4900     {
4901       /* If they don't overlap, the result is false.  If the second range
4902          is a subset it is the result.  Otherwise, the range is from the start
4903          of the second to the end of the first.  */
4904       if (no_overlap)
4905         in_p = 0, low = high = 0;
4906       else if (subset)
4907         in_p = 1, low = low1, high = high1;
4908       else
4909         in_p = 1, low = low1, high = high0;
4910     }
4911
4912   else if (in0_p && ! in1_p)
4913     {
4914       /* If they don't overlap, the result is the first range.  If they are
4915          equal, the result is false.  If the second range is a subset of the
4916          first, and the ranges begin at the same place, we go from just after
4917          the end of the second range to the end of the first.  If the second
4918          range is not a subset of the first, or if it is a subset and both
4919          ranges end at the same place, the range starts at the start of the
4920          first range and ends just before the second range.
4921          Otherwise, we can't describe this as a single range.  */
4922       if (no_overlap)
4923         in_p = 1, low = low0, high = high0;
4924       else if (lowequal && highequal)
4925         in_p = 0, low = high = 0;
4926       else if (subset && lowequal)
4927         {
4928           low = range_successor (high1);
4929           high = high0;
4930           in_p = 1;
4931           if (low == 0)
4932             {
4933               /* We are in the weird situation where high0 > high1 but
4934                  high1 has no successor.  Punt.  */
4935               return 0;
4936             }
4937         }
4938       else if (! subset || highequal)
4939         {
4940           low = low0;
4941           high = range_predecessor (low1);
4942           in_p = 1;
4943           if (high == 0)
4944             {
4945               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4946               return 0;
4947             }
4948         }
4949       else
4950         return 0;
4951     }
4952
4953   else if (! in0_p && in1_p)
4954     {
4955       /* If they don't overlap, the result is the second range.  If the second
4956          is a subset of the first, the result is false.  Otherwise,
4957          the range starts just after the first range and ends at the
4958          end of the second.  */
4959       if (no_overlap)
4960         in_p = 1, low = low1, high = high1;
4961       else if (subset || highequal)
4962         in_p = 0, low = high = 0;
4963       else
4964         {
4965           low = range_successor (high0);
4966           high = high1;
4967           in_p = 1;
4968           if (low == 0)
4969             {
4970               /* high1 > high0 but high0 has no successor.  Punt.  */
4971               return 0;
4972             }
4973         }
4974     }
4975
4976   else
4977     {
4978       /* The case where we are excluding both ranges.  Here the complex case
4979          is if they don't overlap.  In that case, the only time we have a
4980          range is if they are adjacent.  If the second is a subset of the
4981          first, the result is the first.  Otherwise, the range to exclude
4982          starts at the beginning of the first range and ends at the end of the
4983          second.  */
4984       if (no_overlap)
4985         {
4986           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4987                                          range_successor (high0),
4988                                          1, low1, 0)))
4989             in_p = 0, low = low0, high = high1;
4990           else
4991             {
4992               /* Canonicalize - [min, x] into - [-, x].  */
4993               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4994                 switch (TREE_CODE (TREE_TYPE (low0)))
4995                   {
4996                   case ENUMERAL_TYPE:
4997                     if (TYPE_PRECISION (TREE_TYPE (low0))
4998                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4999                       break;
5000                     /* FALLTHROUGH */
5001                   case INTEGER_TYPE:
5002                     if (tree_int_cst_equal (low0,
5003                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
5004                       low0 = 0;
5005                     break;
5006                   case POINTER_TYPE:
5007                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
5008                         && integer_zerop (low0))
5009                       low0 = 0;
5010                     break;
5011                   default:
5012                     break;
5013                   }
5014
5015               /* Canonicalize - [x, max] into - [x, -].  */
5016               if (high1 && TREE_CODE (high1) == INTEGER_CST)
5017                 switch (TREE_CODE (TREE_TYPE (high1)))
5018                   {
5019                   case ENUMERAL_TYPE:
5020                     if (TYPE_PRECISION (TREE_TYPE (high1))
5021                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
5022                       break;
5023                     /* FALLTHROUGH */
5024                   case INTEGER_TYPE:
5025                     if (tree_int_cst_equal (high1,
5026                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
5027                       high1 = 0;
5028                     break;
5029                   case POINTER_TYPE:
5030                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
5031                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
5032                                                        high1, 1,
5033                                                        integer_one_node, 1)))
5034                       high1 = 0;
5035                     break;
5036                   default:
5037                     break;
5038                   }
5039
5040               /* The ranges might be also adjacent between the maximum and
5041                  minimum values of the given type.  For
5042                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
5043                  return + [x + 1, y - 1].  */
5044               if (low0 == 0 && high1 == 0)
5045                 {
5046                   low = range_successor (high0);
5047                   high = range_predecessor (low1);
5048                   if (low == 0 || high == 0)
5049                     return 0;
5050
5051                   in_p = 1;
5052                 }
5053               else
5054                 return 0;
5055             }
5056         }
5057       else if (subset)
5058         in_p = 0, low = low0, high = high0;
5059       else
5060         in_p = 0, low = low0, high = high1;
5061     }
5062
5063   *pin_p = in_p, *plow = low, *phigh = high;
5064   return 1;
5065 }
5066 \f
5067
5068 /* Subroutine of fold, looking inside expressions of the form
5069    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
5070    of the COND_EXPR.  This function is being used also to optimize
5071    A op B ? C : A, by reversing the comparison first.
5072
5073    Return a folded expression whose code is not a COND_EXPR
5074    anymore, or NULL_TREE if no folding opportunity is found.  */
5075
5076 static tree
5077 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
5078 {
5079   enum tree_code comp_code = TREE_CODE (arg0);
5080   tree arg00 = TREE_OPERAND (arg0, 0);
5081   tree arg01 = TREE_OPERAND (arg0, 1);
5082   tree arg1_type = TREE_TYPE (arg1);
5083   tree tem;
5084
5085   STRIP_NOPS (arg1);
5086   STRIP_NOPS (arg2);
5087
5088   /* If we have A op 0 ? A : -A, consider applying the following
5089      transformations:
5090
5091      A == 0? A : -A    same as -A
5092      A != 0? A : -A    same as A
5093      A >= 0? A : -A    same as abs (A)
5094      A > 0?  A : -A    same as abs (A)
5095      A <= 0? A : -A    same as -abs (A)
5096      A < 0?  A : -A    same as -abs (A)
5097
5098      None of these transformations work for modes with signed
5099      zeros.  If A is +/-0, the first two transformations will
5100      change the sign of the result (from +0 to -0, or vice
5101      versa).  The last four will fix the sign of the result,
5102      even though the original expressions could be positive or
5103      negative, depending on the sign of A.
5104
5105      Note that all these transformations are correct if A is
5106      NaN, since the two alternatives (A and -A) are also NaNs.  */
5107   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5108       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
5109           ? real_zerop (arg01)
5110           : integer_zerop (arg01))
5111       && ((TREE_CODE (arg2) == NEGATE_EXPR
5112            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
5113              /* In the case that A is of the form X-Y, '-A' (arg2) may
5114                 have already been folded to Y-X, check for that. */
5115           || (TREE_CODE (arg1) == MINUS_EXPR
5116               && TREE_CODE (arg2) == MINUS_EXPR
5117               && operand_equal_p (TREE_OPERAND (arg1, 0),
5118                                   TREE_OPERAND (arg2, 1), 0)
5119               && operand_equal_p (TREE_OPERAND (arg1, 1),
5120                                   TREE_OPERAND (arg2, 0), 0))))
5121     switch (comp_code)
5122       {
5123       case EQ_EXPR:
5124       case UNEQ_EXPR:
5125         tem = fold_convert (arg1_type, arg1);
5126         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
5127       case NE_EXPR:
5128       case LTGT_EXPR:
5129         return pedantic_non_lvalue (fold_convert (type, arg1));
5130       case UNGE_EXPR:
5131       case UNGT_EXPR:
5132         if (flag_trapping_math)
5133           break;
5134         /* Fall through.  */
5135       case GE_EXPR:
5136       case GT_EXPR:
5137         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5138           arg1 = fold_convert (signed_type_for
5139                                (TREE_TYPE (arg1)), arg1);
5140         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
5141         return pedantic_non_lvalue (fold_convert (type, tem));
5142       case UNLE_EXPR:
5143       case UNLT_EXPR:
5144         if (flag_trapping_math)
5145           break;
5146       case LE_EXPR:
5147       case LT_EXPR:
5148         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5149           arg1 = fold_convert (signed_type_for
5150                                (TREE_TYPE (arg1)), arg1);
5151         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
5152         return negate_expr (fold_convert (type, tem));
5153       default:
5154         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5155         break;
5156       }
5157
5158   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
5159      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
5160      both transformations are correct when A is NaN: A != 0
5161      is then true, and A == 0 is false.  */
5162
5163   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5164       && integer_zerop (arg01) && integer_zerop (arg2))
5165     {
5166       if (comp_code == NE_EXPR)
5167         return pedantic_non_lvalue (fold_convert (type, arg1));
5168       else if (comp_code == EQ_EXPR)
5169         return build_int_cst (type, 0);
5170     }
5171
5172   /* Try some transformations of A op B ? A : B.
5173
5174      A == B? A : B    same as B
5175      A != B? A : B    same as A
5176      A >= B? A : B    same as max (A, B)
5177      A > B?  A : B    same as max (B, A)
5178      A <= B? A : B    same as min (A, B)
5179      A < B?  A : B    same as min (B, A)
5180
5181      As above, these transformations don't work in the presence
5182      of signed zeros.  For example, if A and B are zeros of
5183      opposite sign, the first two transformations will change
5184      the sign of the result.  In the last four, the original
5185      expressions give different results for (A=+0, B=-0) and
5186      (A=-0, B=+0), but the transformed expressions do not.
5187
5188      The first two transformations are correct if either A or B
5189      is a NaN.  In the first transformation, the condition will
5190      be false, and B will indeed be chosen.  In the case of the
5191      second transformation, the condition A != B will be true,
5192      and A will be chosen.
5193
5194      The conversions to max() and min() are not correct if B is
5195      a number and A is not.  The conditions in the original
5196      expressions will be false, so all four give B.  The min()
5197      and max() versions would give a NaN instead.  */
5198   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5199       && operand_equal_for_comparison_p (arg01, arg2, arg00)
5200       /* Avoid these transformations if the COND_EXPR may be used
5201          as an lvalue in the C++ front-end.  PR c++/19199.  */
5202       && (in_gimple_form
5203           || (strcmp (lang_hooks.name, "GNU C++") != 0
5204               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
5205           || ! maybe_lvalue_p (arg1)
5206           || ! maybe_lvalue_p (arg2)))
5207     {
5208       tree comp_op0 = arg00;
5209       tree comp_op1 = arg01;
5210       tree comp_type = TREE_TYPE (comp_op0);
5211
5212       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
5213       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
5214         {
5215           comp_type = type;
5216           comp_op0 = arg1;
5217           comp_op1 = arg2;
5218         }
5219
5220       switch (comp_code)
5221         {
5222         case EQ_EXPR:
5223           return pedantic_non_lvalue (fold_convert (type, arg2));
5224         case NE_EXPR:
5225           return pedantic_non_lvalue (fold_convert (type, arg1));
5226         case LE_EXPR:
5227         case LT_EXPR:
5228         case UNLE_EXPR:
5229         case UNLT_EXPR:
5230           /* In C++ a ?: expression can be an lvalue, so put the
5231              operand which will be used if they are equal first
5232              so that we can convert this back to the
5233              corresponding COND_EXPR.  */
5234           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5235             {
5236               comp_op0 = fold_convert (comp_type, comp_op0);
5237               comp_op1 = fold_convert (comp_type, comp_op1);
5238               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
5239                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
5240                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
5241               return pedantic_non_lvalue (fold_convert (type, tem));
5242             }
5243           break;
5244         case GE_EXPR:
5245         case GT_EXPR:
5246         case UNGE_EXPR:
5247         case UNGT_EXPR:
5248           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5249             {
5250               comp_op0 = fold_convert (comp_type, comp_op0);
5251               comp_op1 = fold_convert (comp_type, comp_op1);
5252               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5253                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5254                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5255               return pedantic_non_lvalue (fold_convert (type, tem));
5256             }
5257           break;
5258         case UNEQ_EXPR:
5259           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5260             return pedantic_non_lvalue (fold_convert (type, arg2));
5261           break;
5262         case LTGT_EXPR:
5263           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5264             return pedantic_non_lvalue (fold_convert (type, arg1));
5265           break;
5266         default:
5267           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5268           break;
5269         }
5270     }
5271
5272   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5273      we might still be able to simplify this.  For example,
5274      if C1 is one less or one more than C2, this might have started
5275      out as a MIN or MAX and been transformed by this function.
5276      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5277
5278   if (INTEGRAL_TYPE_P (type)
5279       && TREE_CODE (arg01) == INTEGER_CST
5280       && TREE_CODE (arg2) == INTEGER_CST)
5281     switch (comp_code)
5282       {
5283       case EQ_EXPR:
5284         /* We can replace A with C1 in this case.  */
5285         arg1 = fold_convert (type, arg01);
5286         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5287
5288       case LT_EXPR:
5289         /* If C1 is C2 + 1, this is min(A, C2).  */
5290         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5291                                OEP_ONLY_CONST)
5292             && operand_equal_p (arg01,
5293                                 const_binop (PLUS_EXPR, arg2,
5294                                              build_int_cst (type, 1), 0),
5295                                 OEP_ONLY_CONST))
5296           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5297                                                    type,
5298                                                    fold_convert (type, arg1),
5299                                                    arg2));
5300         break;
5301
5302       case LE_EXPR:
5303         /* If C1 is C2 - 1, this is min(A, C2).  */
5304         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5305                                OEP_ONLY_CONST)
5306             && operand_equal_p (arg01,
5307                                 const_binop (MINUS_EXPR, arg2,
5308                                              build_int_cst (type, 1), 0),
5309                                 OEP_ONLY_CONST))
5310           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5311                                                    type,
5312                                                    fold_convert (type, arg1),
5313                                                    arg2));
5314         break;
5315
5316       case GT_EXPR:
5317         /* If C1 is C2 - 1, this is max(A, C2).  */
5318         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5319                                OEP_ONLY_CONST)
5320             && operand_equal_p (arg01,
5321                                 const_binop (MINUS_EXPR, arg2,
5322                                              build_int_cst (type, 1), 0),
5323                                 OEP_ONLY_CONST))
5324           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5325                                                    type,
5326                                                    fold_convert (type, arg1),
5327                                                    arg2));
5328         break;
5329
5330       case GE_EXPR:
5331         /* If C1 is C2 + 1, this is max(A, C2).  */
5332         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5333                                OEP_ONLY_CONST)
5334             && operand_equal_p (arg01,
5335                                 const_binop (PLUS_EXPR, arg2,
5336                                              build_int_cst (type, 1), 0),
5337                                 OEP_ONLY_CONST))
5338           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5339                                                    type,
5340                                                    fold_convert (type, arg1),
5341                                                    arg2));
5342         break;
5343       case NE_EXPR:
5344         break;
5345       default:
5346         gcc_unreachable ();
5347       }
5348
5349   return NULL_TREE;
5350 }
5351
5352
5353 \f
5354 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5355 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
5356   (BRANCH_COST (optimize_function_for_speed_p (cfun), \
5357                 false) >= 2)
5358 #endif
5359
5360 /* EXP is some logical combination of boolean tests.  See if we can
5361    merge it into some range test.  Return the new tree if so.  */
5362
5363 static tree
5364 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5365 {
5366   int or_op = (code == TRUTH_ORIF_EXPR
5367                || code == TRUTH_OR_EXPR);
5368   int in0_p, in1_p, in_p;
5369   tree low0, low1, low, high0, high1, high;
5370   bool strict_overflow_p = false;
5371   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5372   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5373   tree tem;
5374   const char * const warnmsg = G_("assuming signed overflow does not occur "
5375                                   "when simplifying range test");
5376
5377   /* If this is an OR operation, invert both sides; we will invert
5378      again at the end.  */
5379   if (or_op)
5380     in0_p = ! in0_p, in1_p = ! in1_p;
5381
5382   /* If both expressions are the same, if we can merge the ranges, and we
5383      can build the range test, return it or it inverted.  If one of the
5384      ranges is always true or always false, consider it to be the same
5385      expression as the other.  */
5386   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5387       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5388                        in1_p, low1, high1)
5389       && 0 != (tem = (build_range_check (type,
5390                                          lhs != 0 ? lhs
5391                                          : rhs != 0 ? rhs : integer_zero_node,
5392                                          in_p, low, high))))
5393     {
5394       if (strict_overflow_p)
5395         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5396       return or_op ? invert_truthvalue (tem) : tem;
5397     }
5398
5399   /* On machines where the branch cost is expensive, if this is a
5400      short-circuited branch and the underlying object on both sides
5401      is the same, make a non-short-circuit operation.  */
5402   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5403            && lhs != 0 && rhs != 0
5404            && (code == TRUTH_ANDIF_EXPR
5405                || code == TRUTH_ORIF_EXPR)
5406            && operand_equal_p (lhs, rhs, 0))
5407     {
5408       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5409          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5410          which cases we can't do this.  */
5411       if (simple_operand_p (lhs))
5412         return build2 (code == TRUTH_ANDIF_EXPR
5413                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5414                        type, op0, op1);
5415
5416       else if (lang_hooks.decls.global_bindings_p () == 0
5417                && ! CONTAINS_PLACEHOLDER_P (lhs))
5418         {
5419           tree common = save_expr (lhs);
5420
5421           if (0 != (lhs = build_range_check (type, common,
5422                                              or_op ? ! in0_p : in0_p,
5423                                              low0, high0))
5424               && (0 != (rhs = build_range_check (type, common,
5425                                                  or_op ? ! in1_p : in1_p,
5426                                                  low1, high1))))
5427             {
5428               if (strict_overflow_p)
5429                 fold_overflow_warning (warnmsg,
5430                                        WARN_STRICT_OVERFLOW_COMPARISON);
5431               return build2 (code == TRUTH_ANDIF_EXPR
5432                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5433                              type, lhs, rhs);
5434             }
5435         }
5436     }
5437
5438   return 0;
5439 }
5440 \f
5441 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5442    bit value.  Arrange things so the extra bits will be set to zero if and
5443    only if C is signed-extended to its full width.  If MASK is nonzero,
5444    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5445
5446 static tree
5447 unextend (tree c, int p, int unsignedp, tree mask)
5448 {
5449   tree type = TREE_TYPE (c);
5450   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5451   tree temp;
5452
5453   if (p == modesize || unsignedp)
5454     return c;
5455
5456   /* We work by getting just the sign bit into the low-order bit, then
5457      into the high-order bit, then sign-extend.  We then XOR that value
5458      with C.  */
5459   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5460   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5461
5462   /* We must use a signed type in order to get an arithmetic right shift.
5463      However, we must also avoid introducing accidental overflows, so that
5464      a subsequent call to integer_zerop will work.  Hence we must
5465      do the type conversion here.  At this point, the constant is either
5466      zero or one, and the conversion to a signed type can never overflow.
5467      We could get an overflow if this conversion is done anywhere else.  */
5468   if (TYPE_UNSIGNED (type))
5469     temp = fold_convert (signed_type_for (type), temp);
5470
5471   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5472   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5473   if (mask != 0)
5474     temp = const_binop (BIT_AND_EXPR, temp,
5475                         fold_convert (TREE_TYPE (c), mask), 0);
5476   /* If necessary, convert the type back to match the type of C.  */
5477   if (TYPE_UNSIGNED (type))
5478     temp = fold_convert (type, temp);
5479
5480   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5481 }
5482 \f
5483 /* Find ways of folding logical expressions of LHS and RHS:
5484    Try to merge two comparisons to the same innermost item.
5485    Look for range tests like "ch >= '0' && ch <= '9'".
5486    Look for combinations of simple terms on machines with expensive branches
5487    and evaluate the RHS unconditionally.
5488
5489    For example, if we have p->a == 2 && p->b == 4 and we can make an
5490    object large enough to span both A and B, we can do this with a comparison
5491    against the object ANDed with the a mask.
5492
5493    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5494    operations to do this with one comparison.
5495
5496    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5497    function and the one above.
5498
5499    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5500    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5501
5502    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5503    two operands.
5504
5505    We return the simplified tree or 0 if no optimization is possible.  */
5506
5507 static tree
5508 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5509 {
5510   /* If this is the "or" of two comparisons, we can do something if
5511      the comparisons are NE_EXPR.  If this is the "and", we can do something
5512      if the comparisons are EQ_EXPR.  I.e.,
5513         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5514
5515      WANTED_CODE is this operation code.  For single bit fields, we can
5516      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5517      comparison for one-bit fields.  */
5518
5519   enum tree_code wanted_code;
5520   enum tree_code lcode, rcode;
5521   tree ll_arg, lr_arg, rl_arg, rr_arg;
5522   tree ll_inner, lr_inner, rl_inner, rr_inner;
5523   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5524   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5525   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5526   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5527   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5528   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5529   enum machine_mode lnmode, rnmode;
5530   tree ll_mask, lr_mask, rl_mask, rr_mask;
5531   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5532   tree l_const, r_const;
5533   tree lntype, rntype, result;
5534   HOST_WIDE_INT first_bit, end_bit;
5535   int volatilep;
5536   tree orig_lhs = lhs, orig_rhs = rhs;
5537   enum tree_code orig_code = code;
5538
5539   /* Start by getting the comparison codes.  Fail if anything is volatile.
5540      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5541      it were surrounded with a NE_EXPR.  */
5542
5543   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5544     return 0;
5545
5546   lcode = TREE_CODE (lhs);
5547   rcode = TREE_CODE (rhs);
5548
5549   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5550     {
5551       lhs = build2 (NE_EXPR, truth_type, lhs,
5552                     build_int_cst (TREE_TYPE (lhs), 0));
5553       lcode = NE_EXPR;
5554     }
5555
5556   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5557     {
5558       rhs = build2 (NE_EXPR, truth_type, rhs,
5559                     build_int_cst (TREE_TYPE (rhs), 0));
5560       rcode = NE_EXPR;
5561     }
5562
5563   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5564       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5565     return 0;
5566
5567   ll_arg = TREE_OPERAND (lhs, 0);
5568   lr_arg = TREE_OPERAND (lhs, 1);
5569   rl_arg = TREE_OPERAND (rhs, 0);
5570   rr_arg = TREE_OPERAND (rhs, 1);
5571
5572   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5573   if (simple_operand_p (ll_arg)
5574       && simple_operand_p (lr_arg))
5575     {
5576       tree result;
5577       if (operand_equal_p (ll_arg, rl_arg, 0)
5578           && operand_equal_p (lr_arg, rr_arg, 0))
5579         {
5580           result = combine_comparisons (code, lcode, rcode,
5581                                         truth_type, ll_arg, lr_arg);
5582           if (result)
5583             return result;
5584         }
5585       else if (operand_equal_p (ll_arg, rr_arg, 0)
5586                && operand_equal_p (lr_arg, rl_arg, 0))
5587         {
5588           result = combine_comparisons (code, lcode,
5589                                         swap_tree_comparison (rcode),
5590                                         truth_type, ll_arg, lr_arg);
5591           if (result)
5592             return result;
5593         }
5594     }
5595
5596   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5597           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5598
5599   /* If the RHS can be evaluated unconditionally and its operands are
5600      simple, it wins to evaluate the RHS unconditionally on machines
5601      with expensive branches.  In this case, this isn't a comparison
5602      that can be merged.  Avoid doing this if the RHS is a floating-point
5603      comparison since those can trap.  */
5604
5605   if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5606                    false) >= 2
5607       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5608       && simple_operand_p (rl_arg)
5609       && simple_operand_p (rr_arg))
5610     {
5611       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5612       if (code == TRUTH_OR_EXPR
5613           && lcode == NE_EXPR && integer_zerop (lr_arg)
5614           && rcode == NE_EXPR && integer_zerop (rr_arg)
5615           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5616           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5617         return build2 (NE_EXPR, truth_type,
5618                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5619                                ll_arg, rl_arg),
5620                        build_int_cst (TREE_TYPE (ll_arg), 0));
5621
5622       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5623       if (code == TRUTH_AND_EXPR
5624           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5625           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5626           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5627           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5628         return build2 (EQ_EXPR, truth_type,
5629                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5630                                ll_arg, rl_arg),
5631                        build_int_cst (TREE_TYPE (ll_arg), 0));
5632
5633       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5634         {
5635           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5636             return build2 (code, truth_type, lhs, rhs);
5637           return NULL_TREE;
5638         }
5639     }
5640
5641   /* See if the comparisons can be merged.  Then get all the parameters for
5642      each side.  */
5643
5644   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5645       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5646     return 0;
5647
5648   volatilep = 0;
5649   ll_inner = decode_field_reference (ll_arg,
5650                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5651                                      &ll_unsignedp, &volatilep, &ll_mask,
5652                                      &ll_and_mask);
5653   lr_inner = decode_field_reference (lr_arg,
5654                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5655                                      &lr_unsignedp, &volatilep, &lr_mask,
5656                                      &lr_and_mask);
5657   rl_inner = decode_field_reference (rl_arg,
5658                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5659                                      &rl_unsignedp, &volatilep, &rl_mask,
5660                                      &rl_and_mask);
5661   rr_inner = decode_field_reference (rr_arg,
5662                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5663                                      &rr_unsignedp, &volatilep, &rr_mask,
5664                                      &rr_and_mask);
5665
5666   /* It must be true that the inner operation on the lhs of each
5667      comparison must be the same if we are to be able to do anything.
5668      Then see if we have constants.  If not, the same must be true for
5669      the rhs's.  */
5670   if (volatilep || ll_inner == 0 || rl_inner == 0
5671       || ! operand_equal_p (ll_inner, rl_inner, 0))
5672     return 0;
5673
5674   if (TREE_CODE (lr_arg) == INTEGER_CST
5675       && TREE_CODE (rr_arg) == INTEGER_CST)
5676     l_const = lr_arg, r_const = rr_arg;
5677   else if (lr_inner == 0 || rr_inner == 0
5678            || ! operand_equal_p (lr_inner, rr_inner, 0))
5679     return 0;
5680   else
5681     l_const = r_const = 0;
5682
5683   /* If either comparison code is not correct for our logical operation,
5684      fail.  However, we can convert a one-bit comparison against zero into
5685      the opposite comparison against that bit being set in the field.  */
5686
5687   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5688   if (lcode != wanted_code)
5689     {
5690       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5691         {
5692           /* Make the left operand unsigned, since we are only interested
5693              in the value of one bit.  Otherwise we are doing the wrong
5694              thing below.  */
5695           ll_unsignedp = 1;
5696           l_const = ll_mask;
5697         }
5698       else
5699         return 0;
5700     }
5701
5702   /* This is analogous to the code for l_const above.  */
5703   if (rcode != wanted_code)
5704     {
5705       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5706         {
5707           rl_unsignedp = 1;
5708           r_const = rl_mask;
5709         }
5710       else
5711         return 0;
5712     }
5713
5714   /* See if we can find a mode that contains both fields being compared on
5715      the left.  If we can't, fail.  Otherwise, update all constants and masks
5716      to be relative to a field of that size.  */
5717   first_bit = MIN (ll_bitpos, rl_bitpos);
5718   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5719   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5720                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5721                           volatilep);
5722   if (lnmode == VOIDmode)
5723     return 0;
5724
5725   lnbitsize = GET_MODE_BITSIZE (lnmode);
5726   lnbitpos = first_bit & ~ (lnbitsize - 1);
5727   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5728   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5729
5730   if (BYTES_BIG_ENDIAN)
5731     {
5732       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5733       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5734     }
5735
5736   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5737                          size_int (xll_bitpos), 0);
5738   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5739                          size_int (xrl_bitpos), 0);
5740
5741   if (l_const)
5742     {
5743       l_const = fold_convert (lntype, l_const);
5744       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5745       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5746       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5747                                         fold_build1 (BIT_NOT_EXPR,
5748                                                      lntype, ll_mask),
5749                                         0)))
5750         {
5751           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5752
5753           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5754         }
5755     }
5756   if (r_const)
5757     {
5758       r_const = fold_convert (lntype, r_const);
5759       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5760       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5761       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5762                                         fold_build1 (BIT_NOT_EXPR,
5763                                                      lntype, rl_mask),
5764                                         0)))
5765         {
5766           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5767
5768           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5769         }
5770     }
5771
5772   /* If the right sides are not constant, do the same for it.  Also,
5773      disallow this optimization if a size or signedness mismatch occurs
5774      between the left and right sides.  */
5775   if (l_const == 0)
5776     {
5777       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5778           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5779           /* Make sure the two fields on the right
5780              correspond to the left without being swapped.  */
5781           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5782         return 0;
5783
5784       first_bit = MIN (lr_bitpos, rr_bitpos);
5785       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5786       rnmode = get_best_mode (end_bit - first_bit, first_bit,
5787                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5788                               volatilep);
5789       if (rnmode == VOIDmode)
5790         return 0;
5791
5792       rnbitsize = GET_MODE_BITSIZE (rnmode);
5793       rnbitpos = first_bit & ~ (rnbitsize - 1);
5794       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5795       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5796
5797       if (BYTES_BIG_ENDIAN)
5798         {
5799           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5800           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5801         }
5802
5803       lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
5804                              size_int (xlr_bitpos), 0);
5805       rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
5806                              size_int (xrr_bitpos), 0);
5807
5808       /* Make a mask that corresponds to both fields being compared.
5809          Do this for both items being compared.  If the operands are the
5810          same size and the bits being compared are in the same position
5811          then we can do this by masking both and comparing the masked
5812          results.  */
5813       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5814       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
5815       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5816         {
5817           lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5818                                     ll_unsignedp || rl_unsignedp);
5819           if (! all_ones_mask_p (ll_mask, lnbitsize))
5820             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5821
5822           rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
5823                                     lr_unsignedp || rr_unsignedp);
5824           if (! all_ones_mask_p (lr_mask, rnbitsize))
5825             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5826
5827           return build2 (wanted_code, truth_type, lhs, rhs);
5828         }
5829
5830       /* There is still another way we can do something:  If both pairs of
5831          fields being compared are adjacent, we may be able to make a wider
5832          field containing them both.
5833
5834          Note that we still must mask the lhs/rhs expressions.  Furthermore,
5835          the mask must be shifted to account for the shift done by
5836          make_bit_field_ref.  */
5837       if ((ll_bitsize + ll_bitpos == rl_bitpos
5838            && lr_bitsize + lr_bitpos == rr_bitpos)
5839           || (ll_bitpos == rl_bitpos + rl_bitsize
5840               && lr_bitpos == rr_bitpos + rr_bitsize))
5841         {
5842           tree type;
5843
5844           lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
5845                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5846           rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
5847                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5848
5849           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5850                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
5851           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5852                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
5853
5854           /* Convert to the smaller type before masking out unwanted bits.  */
5855           type = lntype;
5856           if (lntype != rntype)
5857             {
5858               if (lnbitsize > rnbitsize)
5859                 {
5860                   lhs = fold_convert (rntype, lhs);
5861                   ll_mask = fold_convert (rntype, ll_mask);
5862                   type = rntype;
5863                 }
5864               else if (lnbitsize < rnbitsize)
5865                 {
5866                   rhs = fold_convert (lntype, rhs);
5867                   lr_mask = fold_convert (lntype, lr_mask);
5868                   type = lntype;
5869                 }
5870             }
5871
5872           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5873             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5874
5875           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5876             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5877
5878           return build2 (wanted_code, truth_type, lhs, rhs);
5879         }
5880
5881       return 0;
5882     }
5883
5884   /* Handle the case of comparisons with constants.  If there is something in
5885      common between the masks, those bits of the constants must be the same.
5886      If not, the condition is always false.  Test for this to avoid generating
5887      incorrect code below.  */
5888   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5889   if (! integer_zerop (result)
5890       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5891                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5892     {
5893       if (wanted_code == NE_EXPR)
5894         {
5895           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5896           return constant_boolean_node (true, truth_type);
5897         }
5898       else
5899         {
5900           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5901           return constant_boolean_node (false, truth_type);
5902         }
5903     }
5904
5905   /* Construct the expression we will return.  First get the component
5906      reference we will make.  Unless the mask is all ones the width of
5907      that field, perform the mask operation.  Then compare with the
5908      merged constant.  */
5909   result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5910                                ll_unsignedp || rl_unsignedp);
5911
5912   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5913   if (! all_ones_mask_p (ll_mask, lnbitsize))
5914     result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
5915
5916   return build2 (wanted_code, truth_type, result,
5917                  const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
5918 }
5919 \f
5920 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5921    constant.  */
5922
5923 static tree
5924 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5925 {
5926   tree arg0 = op0;
5927   enum tree_code op_code;
5928   tree comp_const;
5929   tree minmax_const;
5930   int consts_equal, consts_lt;
5931   tree inner;
5932
5933   STRIP_SIGN_NOPS (arg0);
5934
5935   op_code = TREE_CODE (arg0);
5936   minmax_const = TREE_OPERAND (arg0, 1);
5937   comp_const = fold_convert (TREE_TYPE (arg0), op1);
5938   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5939   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5940   inner = TREE_OPERAND (arg0, 0);
5941
5942   /* If something does not permit us to optimize, return the original tree.  */
5943   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5944       || TREE_CODE (comp_const) != INTEGER_CST
5945       || TREE_OVERFLOW (comp_const)
5946       || TREE_CODE (minmax_const) != INTEGER_CST
5947       || TREE_OVERFLOW (minmax_const))
5948     return NULL_TREE;
5949
5950   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5951      and GT_EXPR, doing the rest with recursive calls using logical
5952      simplifications.  */
5953   switch (code)
5954     {
5955     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5956       {
5957         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5958                                           type, op0, op1);
5959         if (tem)
5960           return invert_truthvalue (tem);
5961         return NULL_TREE;
5962       }
5963
5964     case GE_EXPR:
5965       return
5966         fold_build2 (TRUTH_ORIF_EXPR, type,
5967                      optimize_minmax_comparison
5968                      (EQ_EXPR, type, arg0, comp_const),
5969                      optimize_minmax_comparison
5970                      (GT_EXPR, type, arg0, comp_const));
5971
5972     case EQ_EXPR:
5973       if (op_code == MAX_EXPR && consts_equal)
5974         /* MAX (X, 0) == 0  ->  X <= 0  */
5975         return fold_build2 (LE_EXPR, type, inner, comp_const);
5976
5977       else if (op_code == MAX_EXPR && consts_lt)
5978         /* MAX (X, 0) == 5  ->  X == 5   */
5979         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5980
5981       else if (op_code == MAX_EXPR)
5982         /* MAX (X, 0) == -1  ->  false  */
5983         return omit_one_operand (type, integer_zero_node, inner);
5984
5985       else if (consts_equal)
5986         /* MIN (X, 0) == 0  ->  X >= 0  */
5987         return fold_build2 (GE_EXPR, type, inner, comp_const);
5988
5989       else if (consts_lt)
5990         /* MIN (X, 0) == 5  ->  false  */
5991         return omit_one_operand (type, integer_zero_node, inner);
5992
5993       else
5994         /* MIN (X, 0) == -1  ->  X == -1  */
5995         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5996
5997     case GT_EXPR:
5998       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5999         /* MAX (X, 0) > 0  ->  X > 0
6000            MAX (X, 0) > 5  ->  X > 5  */
6001         return fold_build2 (GT_EXPR, type, inner, comp_const);
6002
6003       else if (op_code == MAX_EXPR)
6004         /* MAX (X, 0) > -1  ->  true  */
6005         return omit_one_operand (type, integer_one_node, inner);
6006
6007       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
6008         /* MIN (X, 0) > 0  ->  false
6009            MIN (X, 0) > 5  ->  false  */
6010         return omit_one_operand (type, integer_zero_node, inner);
6011
6012       else
6013         /* MIN (X, 0) > -1  ->  X > -1  */
6014         return fold_build2 (GT_EXPR, type, inner, comp_const);
6015
6016     default:
6017       return NULL_TREE;
6018     }
6019 }
6020 \f
6021 /* T is an integer expression that is being multiplied, divided, or taken a
6022    modulus (CODE says which and what kind of divide or modulus) by a
6023    constant C.  See if we can eliminate that operation by folding it with
6024    other operations already in T.  WIDE_TYPE, if non-null, is a type that
6025    should be used for the computation if wider than our type.
6026
6027    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
6028    (X * 2) + (Y * 4).  We must, however, be assured that either the original
6029    expression would not overflow or that overflow is undefined for the type
6030    in the language in question.
6031
6032    If we return a non-null expression, it is an equivalent form of the
6033    original computation, but need not be in the original type.
6034
6035    We set *STRICT_OVERFLOW_P to true if the return values depends on
6036    signed overflow being undefined.  Otherwise we do not change
6037    *STRICT_OVERFLOW_P.  */
6038
6039 static tree
6040 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
6041                 bool *strict_overflow_p)
6042 {
6043   /* To avoid exponential search depth, refuse to allow recursion past
6044      three levels.  Beyond that (1) it's highly unlikely that we'll find
6045      something interesting and (2) we've probably processed it before
6046      when we built the inner expression.  */
6047
6048   static int depth;
6049   tree ret;
6050
6051   if (depth > 3)
6052     return NULL;
6053
6054   depth++;
6055   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
6056   depth--;
6057
6058   return ret;
6059 }
6060
6061 static tree
6062 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
6063                   bool *strict_overflow_p)
6064 {
6065   tree type = TREE_TYPE (t);
6066   enum tree_code tcode = TREE_CODE (t);
6067   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
6068                                    > GET_MODE_SIZE (TYPE_MODE (type)))
6069                 ? wide_type : type);
6070   tree t1, t2;
6071   int same_p = tcode == code;
6072   tree op0 = NULL_TREE, op1 = NULL_TREE;
6073   bool sub_strict_overflow_p;
6074
6075   /* Don't deal with constants of zero here; they confuse the code below.  */
6076   if (integer_zerop (c))
6077     return NULL_TREE;
6078
6079   if (TREE_CODE_CLASS (tcode) == tcc_unary)
6080     op0 = TREE_OPERAND (t, 0);
6081
6082   if (TREE_CODE_CLASS (tcode) == tcc_binary)
6083     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
6084
6085   /* Note that we need not handle conditional operations here since fold
6086      already handles those cases.  So just do arithmetic here.  */
6087   switch (tcode)
6088     {
6089     case INTEGER_CST:
6090       /* For a constant, we can always simplify if we are a multiply
6091          or (for divide and modulus) if it is a multiple of our constant.  */
6092       if (code == MULT_EXPR
6093           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
6094         return const_binop (code, fold_convert (ctype, t),
6095                             fold_convert (ctype, c), 0);
6096       break;
6097
6098     CASE_CONVERT: case NON_LVALUE_EXPR:
6099       /* If op0 is an expression ...  */
6100       if ((COMPARISON_CLASS_P (op0)
6101            || UNARY_CLASS_P (op0)
6102            || BINARY_CLASS_P (op0)
6103            || VL_EXP_CLASS_P (op0)
6104            || EXPRESSION_CLASS_P (op0))
6105           /* ... and has wrapping overflow, and its type is smaller
6106              than ctype, then we cannot pass through as widening.  */
6107           && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0))
6108                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
6109                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
6110                && (TYPE_PRECISION (ctype)
6111                    > TYPE_PRECISION (TREE_TYPE (op0))))
6112               /* ... or this is a truncation (t is narrower than op0),
6113                  then we cannot pass through this narrowing.  */
6114               || (TYPE_PRECISION (type)
6115                   < TYPE_PRECISION (TREE_TYPE (op0)))
6116               /* ... or signedness changes for division or modulus,
6117                  then we cannot pass through this conversion.  */
6118               || (code != MULT_EXPR
6119                   && (TYPE_UNSIGNED (ctype)
6120                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
6121               /* ... or has undefined overflow while the converted to
6122                  type has not, we cannot do the operation in the inner type
6123                  as that would introduce undefined overflow.  */
6124               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
6125                   && !TYPE_OVERFLOW_UNDEFINED (type))))
6126         break;
6127
6128       /* Pass the constant down and see if we can make a simplification.  If
6129          we can, replace this expression with the inner simplification for
6130          possible later conversion to our or some other type.  */
6131       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
6132           && TREE_CODE (t2) == INTEGER_CST
6133           && !TREE_OVERFLOW (t2)
6134           && (0 != (t1 = extract_muldiv (op0, t2, code,
6135                                          code == MULT_EXPR
6136                                          ? ctype : NULL_TREE,
6137                                          strict_overflow_p))))
6138         return t1;
6139       break;
6140
6141     case ABS_EXPR:
6142       /* If widening the type changes it from signed to unsigned, then we
6143          must avoid building ABS_EXPR itself as unsigned.  */
6144       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
6145         {
6146           tree cstype = (*signed_type_for) (ctype);
6147           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
6148               != 0)
6149             {
6150               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
6151               return fold_convert (ctype, t1);
6152             }
6153           break;
6154         }
6155       /* If the constant is negative, we cannot simplify this.  */
6156       if (tree_int_cst_sgn (c) == -1)
6157         break;
6158       /* FALLTHROUGH */
6159     case NEGATE_EXPR:
6160       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
6161           != 0)
6162         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
6163       break;
6164
6165     case MIN_EXPR:  case MAX_EXPR:
6166       /* If widening the type changes the signedness, then we can't perform
6167          this optimization as that changes the result.  */
6168       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6169         break;
6170
6171       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
6172       sub_strict_overflow_p = false;
6173       if ((t1 = extract_muldiv (op0, c, code, wide_type,
6174                                 &sub_strict_overflow_p)) != 0
6175           && (t2 = extract_muldiv (op1, c, code, wide_type,
6176                                    &sub_strict_overflow_p)) != 0)
6177         {
6178           if (tree_int_cst_sgn (c) < 0)
6179             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
6180           if (sub_strict_overflow_p)
6181             *strict_overflow_p = true;
6182           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6183                               fold_convert (ctype, t2));
6184         }
6185       break;
6186
6187     case LSHIFT_EXPR:  case RSHIFT_EXPR:
6188       /* If the second operand is constant, this is a multiplication
6189          or floor division, by a power of two, so we can treat it that
6190          way unless the multiplier or divisor overflows.  Signed
6191          left-shift overflow is implementation-defined rather than
6192          undefined in C90, so do not convert signed left shift into
6193          multiplication.  */
6194       if (TREE_CODE (op1) == INTEGER_CST
6195           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
6196           /* const_binop may not detect overflow correctly,
6197              so check for it explicitly here.  */
6198           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
6199           && TREE_INT_CST_HIGH (op1) == 0
6200           && 0 != (t1 = fold_convert (ctype,
6201                                       const_binop (LSHIFT_EXPR,
6202                                                    size_one_node,
6203                                                    op1, 0)))
6204           && !TREE_OVERFLOW (t1))
6205         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
6206                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
6207                                        ctype, fold_convert (ctype, op0), t1),
6208                                c, code, wide_type, strict_overflow_p);
6209       break;
6210
6211     case PLUS_EXPR:  case MINUS_EXPR:
6212       /* See if we can eliminate the operation on both sides.  If we can, we
6213          can return a new PLUS or MINUS.  If we can't, the only remaining
6214          cases where we can do anything are if the second operand is a
6215          constant.  */
6216       sub_strict_overflow_p = false;
6217       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
6218       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
6219       if (t1 != 0 && t2 != 0
6220           && (code == MULT_EXPR
6221               /* If not multiplication, we can only do this if both operands
6222                  are divisible by c.  */
6223               || (multiple_of_p (ctype, op0, c)
6224                   && multiple_of_p (ctype, op1, c))))
6225         {
6226           if (sub_strict_overflow_p)
6227             *strict_overflow_p = true;
6228           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6229                               fold_convert (ctype, t2));
6230         }
6231
6232       /* If this was a subtraction, negate OP1 and set it to be an addition.
6233          This simplifies the logic below.  */
6234       if (tcode == MINUS_EXPR)
6235         tcode = PLUS_EXPR, op1 = negate_expr (op1);
6236
6237       if (TREE_CODE (op1) != INTEGER_CST)
6238         break;
6239
6240       /* If either OP1 or C are negative, this optimization is not safe for
6241          some of the division and remainder types while for others we need
6242          to change the code.  */
6243       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
6244         {
6245           if (code == CEIL_DIV_EXPR)
6246             code = FLOOR_DIV_EXPR;
6247           else if (code == FLOOR_DIV_EXPR)
6248             code = CEIL_DIV_EXPR;
6249           else if (code != MULT_EXPR
6250                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
6251             break;
6252         }
6253
6254       /* If it's a multiply or a division/modulus operation of a multiple
6255          of our constant, do the operation and verify it doesn't overflow.  */
6256       if (code == MULT_EXPR
6257           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6258         {
6259           op1 = const_binop (code, fold_convert (ctype, op1),
6260                              fold_convert (ctype, c), 0);
6261           /* We allow the constant to overflow with wrapping semantics.  */
6262           if (op1 == 0
6263               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
6264             break;
6265         }
6266       else
6267         break;
6268
6269       /* If we have an unsigned type is not a sizetype, we cannot widen
6270          the operation since it will change the result if the original
6271          computation overflowed.  */
6272       if (TYPE_UNSIGNED (ctype)
6273           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
6274           && ctype != type)
6275         break;
6276
6277       /* If we were able to eliminate our operation from the first side,
6278          apply our operation to the second side and reform the PLUS.  */
6279       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
6280         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
6281
6282       /* The last case is if we are a multiply.  In that case, we can
6283          apply the distributive law to commute the multiply and addition
6284          if the multiplication of the constants doesn't overflow.  */
6285       if (code == MULT_EXPR)
6286         return fold_build2 (tcode, ctype,
6287                             fold_build2 (code, ctype,
6288                                          fold_convert (ctype, op0),
6289                                          fold_convert (ctype, c)),
6290                             op1);
6291
6292       break;
6293
6294     case MULT_EXPR:
6295       /* We have a special case here if we are doing something like
6296          (C * 8) % 4 since we know that's zero.  */
6297       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
6298            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
6299           /* If the multiplication can overflow we cannot optimize this.
6300              ???  Until we can properly mark individual operations as
6301              not overflowing we need to treat sizetype special here as
6302              stor-layout relies on this opimization to make
6303              DECL_FIELD_BIT_OFFSET always a constant.  */
6304           && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
6305               || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
6306                   && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
6307           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
6308           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6309         {
6310           *strict_overflow_p = true;
6311           return omit_one_operand (type, integer_zero_node, op0);
6312         }
6313
6314       /* ... fall through ...  */
6315
6316     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
6317     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
6318       /* If we can extract our operation from the LHS, do so and return a
6319          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
6320          do something only if the second operand is a constant.  */
6321       if (same_p
6322           && (t1 = extract_muldiv (op0, c, code, wide_type,
6323                                    strict_overflow_p)) != 0)
6324         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6325                             fold_convert (ctype, op1));
6326       else if (tcode == MULT_EXPR && code == MULT_EXPR
6327                && (t1 = extract_muldiv (op1, c, code, wide_type,
6328                                         strict_overflow_p)) != 0)
6329         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6330                             fold_convert (ctype, t1));
6331       else if (TREE_CODE (op1) != INTEGER_CST)
6332         return 0;
6333
6334       /* If these are the same operation types, we can associate them
6335          assuming no overflow.  */
6336       if (tcode == code
6337           && 0 != (t1 = int_const_binop (MULT_EXPR, fold_convert (ctype, op1),
6338                                          fold_convert (ctype, c), 1))
6339           && 0 != (t1 = force_fit_type_double (ctype, TREE_INT_CST_LOW (t1),
6340                                                TREE_INT_CST_HIGH (t1),
6341                                                (TYPE_UNSIGNED (ctype)
6342                                                 && tcode != MULT_EXPR) ? -1 : 1,
6343                                                TREE_OVERFLOW (t1)))
6344           && !TREE_OVERFLOW (t1))
6345         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
6346
6347       /* If these operations "cancel" each other, we have the main
6348          optimizations of this pass, which occur when either constant is a
6349          multiple of the other, in which case we replace this with either an
6350          operation or CODE or TCODE.
6351
6352          If we have an unsigned type that is not a sizetype, we cannot do
6353          this since it will change the result if the original computation
6354          overflowed.  */
6355       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
6356            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
6357           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
6358               || (tcode == MULT_EXPR
6359                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
6360                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
6361                   && code != MULT_EXPR)))
6362         {
6363           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6364             {
6365               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6366                 *strict_overflow_p = true;
6367               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6368                                   fold_convert (ctype,
6369                                                 const_binop (TRUNC_DIV_EXPR,
6370                                                              op1, c, 0)));
6371             }
6372           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
6373             {
6374               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6375                 *strict_overflow_p = true;
6376               return fold_build2 (code, ctype, fold_convert (ctype, op0),
6377                                   fold_convert (ctype,
6378                                                 const_binop (TRUNC_DIV_EXPR,
6379                                                              c, op1, 0)));
6380             }
6381         }
6382       break;
6383
6384     default:
6385       break;
6386     }
6387
6388   return 0;
6389 }
6390 \f
6391 /* Return a node which has the indicated constant VALUE (either 0 or
6392    1), and is of the indicated TYPE.  */
6393
6394 tree
6395 constant_boolean_node (int value, tree type)
6396 {
6397   if (type == integer_type_node)
6398     return value ? integer_one_node : integer_zero_node;
6399   else if (type == boolean_type_node)
6400     return value ? boolean_true_node : boolean_false_node;
6401   else
6402     return build_int_cst (type, value);
6403 }
6404
6405
6406 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6407    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6408    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6409    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6410    COND is the first argument to CODE; otherwise (as in the example
6411    given here), it is the second argument.  TYPE is the type of the
6412    original expression.  Return NULL_TREE if no simplification is
6413    possible.  */
6414
6415 static tree
6416 fold_binary_op_with_conditional_arg (enum tree_code code,
6417                                      tree type, tree op0, tree op1,
6418                                      tree cond, tree arg, int cond_first_p)
6419 {
6420   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6421   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6422   tree test, true_value, false_value;
6423   tree lhs = NULL_TREE;
6424   tree rhs = NULL_TREE;
6425
6426   /* This transformation is only worthwhile if we don't have to wrap
6427      arg in a SAVE_EXPR, and the operation can be simplified on at least
6428      one of the branches once its pushed inside the COND_EXPR.  */
6429   if (!TREE_CONSTANT (arg))
6430     return NULL_TREE;
6431
6432   if (TREE_CODE (cond) == COND_EXPR)
6433     {
6434       test = TREE_OPERAND (cond, 0);
6435       true_value = TREE_OPERAND (cond, 1);
6436       false_value = TREE_OPERAND (cond, 2);
6437       /* If this operand throws an expression, then it does not make
6438          sense to try to perform a logical or arithmetic operation
6439          involving it.  */
6440       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6441         lhs = true_value;
6442       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6443         rhs = false_value;
6444     }
6445   else
6446     {
6447       tree testtype = TREE_TYPE (cond);
6448       test = cond;
6449       true_value = constant_boolean_node (true, testtype);
6450       false_value = constant_boolean_node (false, testtype);
6451     }
6452
6453   arg = fold_convert (arg_type, arg);
6454   if (lhs == 0)
6455     {
6456       true_value = fold_convert (cond_type, true_value);
6457       if (cond_first_p)
6458         lhs = fold_build2 (code, type, true_value, arg);
6459       else
6460         lhs = fold_build2 (code, type, arg, true_value);
6461     }
6462   if (rhs == 0)
6463     {
6464       false_value = fold_convert (cond_type, false_value);
6465       if (cond_first_p)
6466         rhs = fold_build2 (code, type, false_value, arg);
6467       else
6468         rhs = fold_build2 (code, type, arg, false_value);
6469     }
6470
6471   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6472   return fold_convert (type, test);
6473 }
6474
6475 \f
6476 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6477
6478    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6479    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6480    ADDEND is the same as X.
6481
6482    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6483    and finite.  The problematic cases are when X is zero, and its mode
6484    has signed zeros.  In the case of rounding towards -infinity,
6485    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6486    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6487
6488 bool
6489 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6490 {
6491   if (!real_zerop (addend))
6492     return false;
6493
6494   /* Don't allow the fold with -fsignaling-nans.  */
6495   if (HONOR_SNANS (TYPE_MODE (type)))
6496     return false;
6497
6498   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6499   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6500     return true;
6501
6502   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6503   if (TREE_CODE (addend) == REAL_CST
6504       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6505     negate = !negate;
6506
6507   /* The mode has signed zeros, and we have to honor their sign.
6508      In this situation, there is only one case we can return true for.
6509      X - 0 is the same as X unless rounding towards -infinity is
6510      supported.  */
6511   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6512 }
6513
6514 /* Subroutine of fold() that checks comparisons of built-in math
6515    functions against real constants.
6516
6517    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6518    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6519    is the type of the result and ARG0 and ARG1 are the operands of the
6520    comparison.  ARG1 must be a TREE_REAL_CST.
6521
6522    The function returns the constant folded tree if a simplification
6523    can be made, and NULL_TREE otherwise.  */
6524
6525 static tree
6526 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6527                      tree type, tree arg0, tree arg1)
6528 {
6529   REAL_VALUE_TYPE c;
6530
6531   if (BUILTIN_SQRT_P (fcode))
6532     {
6533       tree arg = CALL_EXPR_ARG (arg0, 0);
6534       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6535
6536       c = TREE_REAL_CST (arg1);
6537       if (REAL_VALUE_NEGATIVE (c))
6538         {
6539           /* sqrt(x) < y is always false, if y is negative.  */
6540           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6541             return omit_one_operand (type, integer_zero_node, arg);
6542
6543           /* sqrt(x) > y is always true, if y is negative and we
6544              don't care about NaNs, i.e. negative values of x.  */
6545           if (code == NE_EXPR || !HONOR_NANS (mode))
6546             return omit_one_operand (type, integer_one_node, arg);
6547
6548           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6549           return fold_build2 (GE_EXPR, type, arg,
6550                               build_real (TREE_TYPE (arg), dconst0));
6551         }
6552       else if (code == GT_EXPR || code == GE_EXPR)
6553         {
6554           REAL_VALUE_TYPE c2;
6555
6556           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6557           real_convert (&c2, mode, &c2);
6558
6559           if (REAL_VALUE_ISINF (c2))
6560             {
6561               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6562               if (HONOR_INFINITIES (mode))
6563                 return fold_build2 (EQ_EXPR, type, arg,
6564                                     build_real (TREE_TYPE (arg), c2));
6565
6566               /* sqrt(x) > y is always false, when y is very large
6567                  and we don't care about infinities.  */
6568               return omit_one_operand (type, integer_zero_node, arg);
6569             }
6570
6571           /* sqrt(x) > c is the same as x > c*c.  */
6572           return fold_build2 (code, type, arg,
6573                               build_real (TREE_TYPE (arg), c2));
6574         }
6575       else if (code == LT_EXPR || code == LE_EXPR)
6576         {
6577           REAL_VALUE_TYPE c2;
6578
6579           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6580           real_convert (&c2, mode, &c2);
6581
6582           if (REAL_VALUE_ISINF (c2))
6583             {
6584               /* sqrt(x) < y is always true, when y is a very large
6585                  value and we don't care about NaNs or Infinities.  */
6586               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6587                 return omit_one_operand (type, integer_one_node, arg);
6588
6589               /* sqrt(x) < y is x != +Inf when y is very large and we
6590                  don't care about NaNs.  */
6591               if (! HONOR_NANS (mode))
6592                 return fold_build2 (NE_EXPR, type, arg,
6593                                     build_real (TREE_TYPE (arg), c2));
6594
6595               /* sqrt(x) < y is x >= 0 when y is very large and we
6596                  don't care about Infinities.  */
6597               if (! HONOR_INFINITIES (mode))
6598                 return fold_build2 (GE_EXPR, type, arg,
6599                                     build_real (TREE_TYPE (arg), dconst0));
6600
6601               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6602               if (lang_hooks.decls.global_bindings_p () != 0
6603                   || CONTAINS_PLACEHOLDER_P (arg))
6604                 return NULL_TREE;
6605
6606               arg = save_expr (arg);
6607               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6608                                   fold_build2 (GE_EXPR, type, arg,
6609                                                build_real (TREE_TYPE (arg),
6610                                                            dconst0)),
6611                                   fold_build2 (NE_EXPR, type, arg,
6612                                                build_real (TREE_TYPE (arg),
6613                                                            c2)));
6614             }
6615
6616           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6617           if (! HONOR_NANS (mode))
6618             return fold_build2 (code, type, arg,
6619                                 build_real (TREE_TYPE (arg), c2));
6620
6621           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6622           if (lang_hooks.decls.global_bindings_p () == 0
6623               && ! CONTAINS_PLACEHOLDER_P (arg))
6624             {
6625               arg = save_expr (arg);
6626               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6627                                   fold_build2 (GE_EXPR, type, arg,
6628                                                build_real (TREE_TYPE (arg),
6629                                                            dconst0)),
6630                                   fold_build2 (code, type, arg,
6631                                                build_real (TREE_TYPE (arg),
6632                                                            c2)));
6633             }
6634         }
6635     }
6636
6637   return NULL_TREE;
6638 }
6639
6640 /* Subroutine of fold() that optimizes comparisons against Infinities,
6641    either +Inf or -Inf.
6642
6643    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6644    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6645    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6646
6647    The function returns the constant folded tree if a simplification
6648    can be made, and NULL_TREE otherwise.  */
6649
6650 static tree
6651 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6652 {
6653   enum machine_mode mode;
6654   REAL_VALUE_TYPE max;
6655   tree temp;
6656   bool neg;
6657
6658   mode = TYPE_MODE (TREE_TYPE (arg0));
6659
6660   /* For negative infinity swap the sense of the comparison.  */
6661   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6662   if (neg)
6663     code = swap_tree_comparison (code);
6664
6665   switch (code)
6666     {
6667     case GT_EXPR:
6668       /* x > +Inf is always false, if with ignore sNANs.  */
6669       if (HONOR_SNANS (mode))
6670         return NULL_TREE;
6671       return omit_one_operand (type, integer_zero_node, arg0);
6672
6673     case LE_EXPR:
6674       /* x <= +Inf is always true, if we don't case about NaNs.  */
6675       if (! HONOR_NANS (mode))
6676         return omit_one_operand (type, integer_one_node, arg0);
6677
6678       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6679       if (lang_hooks.decls.global_bindings_p () == 0
6680           && ! CONTAINS_PLACEHOLDER_P (arg0))
6681         {
6682           arg0 = save_expr (arg0);
6683           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6684         }
6685       break;
6686
6687     case EQ_EXPR:
6688     case GE_EXPR:
6689       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6690       real_maxval (&max, neg, mode);
6691       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6692                           arg0, build_real (TREE_TYPE (arg0), max));
6693
6694     case LT_EXPR:
6695       /* x < +Inf is always equal to x <= DBL_MAX.  */
6696       real_maxval (&max, neg, mode);
6697       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6698                           arg0, build_real (TREE_TYPE (arg0), max));
6699
6700     case NE_EXPR:
6701       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6702       real_maxval (&max, neg, mode);
6703       if (! HONOR_NANS (mode))
6704         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6705                             arg0, build_real (TREE_TYPE (arg0), max));
6706
6707       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6708                           arg0, build_real (TREE_TYPE (arg0), max));
6709       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6710
6711     default:
6712       break;
6713     }
6714
6715   return NULL_TREE;
6716 }
6717
6718 /* Subroutine of fold() that optimizes comparisons of a division by
6719    a nonzero integer constant against an integer constant, i.e.
6720    X/C1 op C2.
6721
6722    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6723    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6724    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6725
6726    The function returns the constant folded tree if a simplification
6727    can be made, and NULL_TREE otherwise.  */
6728
6729 static tree
6730 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6731 {
6732   tree prod, tmp, hi, lo;
6733   tree arg00 = TREE_OPERAND (arg0, 0);
6734   tree arg01 = TREE_OPERAND (arg0, 1);
6735   unsigned HOST_WIDE_INT lpart;
6736   HOST_WIDE_INT hpart;
6737   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6738   bool neg_overflow;
6739   int overflow;
6740
6741   /* We have to do this the hard way to detect unsigned overflow.
6742      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6743   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6744                                    TREE_INT_CST_HIGH (arg01),
6745                                    TREE_INT_CST_LOW (arg1),
6746                                    TREE_INT_CST_HIGH (arg1),
6747                                    &lpart, &hpart, unsigned_p);
6748   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6749                                 -1, overflow);
6750   neg_overflow = false;
6751
6752   if (unsigned_p)
6753     {
6754       tmp = int_const_binop (MINUS_EXPR, arg01,
6755                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6756       lo = prod;
6757
6758       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6759       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6760                                        TREE_INT_CST_HIGH (prod),
6761                                        TREE_INT_CST_LOW (tmp),
6762                                        TREE_INT_CST_HIGH (tmp),
6763                                        &lpart, &hpart, unsigned_p);
6764       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6765                                   -1, overflow | TREE_OVERFLOW (prod));
6766     }
6767   else if (tree_int_cst_sgn (arg01) >= 0)
6768     {
6769       tmp = int_const_binop (MINUS_EXPR, arg01,
6770                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6771       switch (tree_int_cst_sgn (arg1))
6772         {
6773         case -1:
6774           neg_overflow = true;
6775           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6776           hi = prod;
6777           break;
6778
6779         case  0:
6780           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6781           hi = tmp;
6782           break;
6783
6784         case  1:
6785           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6786           lo = prod;
6787           break;
6788
6789         default:
6790           gcc_unreachable ();
6791         }
6792     }
6793   else
6794     {
6795       /* A negative divisor reverses the relational operators.  */
6796       code = swap_tree_comparison (code);
6797
6798       tmp = int_const_binop (PLUS_EXPR, arg01,
6799                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6800       switch (tree_int_cst_sgn (arg1))
6801         {
6802         case -1:
6803           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6804           lo = prod;
6805           break;
6806
6807         case  0:
6808           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6809           lo = tmp;
6810           break;
6811
6812         case  1:
6813           neg_overflow = true;
6814           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6815           hi = prod;
6816           break;
6817
6818         default:
6819           gcc_unreachable ();
6820         }
6821     }
6822
6823   switch (code)
6824     {
6825     case EQ_EXPR:
6826       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6827         return omit_one_operand (type, integer_zero_node, arg00);
6828       if (TREE_OVERFLOW (hi))
6829         return fold_build2 (GE_EXPR, type, arg00, lo);
6830       if (TREE_OVERFLOW (lo))
6831         return fold_build2 (LE_EXPR, type, arg00, hi);
6832       return build_range_check (type, arg00, 1, lo, hi);
6833
6834     case NE_EXPR:
6835       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6836         return omit_one_operand (type, integer_one_node, arg00);
6837       if (TREE_OVERFLOW (hi))
6838         return fold_build2 (LT_EXPR, type, arg00, lo);
6839       if (TREE_OVERFLOW (lo))
6840         return fold_build2 (GT_EXPR, type, arg00, hi);
6841       return build_range_check (type, arg00, 0, lo, hi);
6842
6843     case LT_EXPR:
6844       if (TREE_OVERFLOW (lo))
6845         {
6846           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6847           return omit_one_operand (type, tmp, arg00);
6848         }
6849       return fold_build2 (LT_EXPR, type, arg00, lo);
6850
6851     case LE_EXPR:
6852       if (TREE_OVERFLOW (hi))
6853         {
6854           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6855           return omit_one_operand (type, tmp, arg00);
6856         }
6857       return fold_build2 (LE_EXPR, type, arg00, hi);
6858
6859     case GT_EXPR:
6860       if (TREE_OVERFLOW (hi))
6861         {
6862           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6863           return omit_one_operand (type, tmp, arg00);
6864         }
6865       return fold_build2 (GT_EXPR, type, arg00, hi);
6866
6867     case GE_EXPR:
6868       if (TREE_OVERFLOW (lo))
6869         {
6870           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6871           return omit_one_operand (type, tmp, arg00);
6872         }
6873       return fold_build2 (GE_EXPR, type, arg00, lo);
6874
6875     default:
6876       break;
6877     }
6878
6879   return NULL_TREE;
6880 }
6881
6882
6883 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6884    equality/inequality test, then return a simplified form of the test
6885    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6886    result type.  */
6887
6888 static tree
6889 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6890                                      tree result_type)
6891 {
6892   /* If this is testing a single bit, we can optimize the test.  */
6893   if ((code == NE_EXPR || code == EQ_EXPR)
6894       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6895       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6896     {
6897       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6898          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6899       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6900
6901       if (arg00 != NULL_TREE
6902           /* This is only a win if casting to a signed type is cheap,
6903              i.e. when arg00's type is not a partial mode.  */
6904           && TYPE_PRECISION (TREE_TYPE (arg00))
6905              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6906         {
6907           tree stype = signed_type_for (TREE_TYPE (arg00));
6908           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6909                               result_type, fold_convert (stype, arg00),
6910                               build_int_cst (stype, 0));
6911         }
6912     }
6913
6914   return NULL_TREE;
6915 }
6916
6917 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6918    equality/inequality test, then return a simplified form of
6919    the test using shifts and logical operations.  Otherwise return
6920    NULL.  TYPE is the desired result type.  */
6921
6922 tree
6923 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6924                       tree result_type)
6925 {
6926   /* If this is testing a single bit, we can optimize the test.  */
6927   if ((code == NE_EXPR || code == EQ_EXPR)
6928       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6929       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6930     {
6931       tree inner = TREE_OPERAND (arg0, 0);
6932       tree type = TREE_TYPE (arg0);
6933       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6934       enum machine_mode operand_mode = TYPE_MODE (type);
6935       int ops_unsigned;
6936       tree signed_type, unsigned_type, intermediate_type;
6937       tree tem, one;
6938
6939       /* First, see if we can fold the single bit test into a sign-bit
6940          test.  */
6941       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6942                                                  result_type);
6943       if (tem)
6944         return tem;
6945
6946       /* Otherwise we have (A & C) != 0 where C is a single bit,
6947          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6948          Similarly for (A & C) == 0.  */
6949
6950       /* If INNER is a right shift of a constant and it plus BITNUM does
6951          not overflow, adjust BITNUM and INNER.  */
6952       if (TREE_CODE (inner) == RSHIFT_EXPR
6953           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6954           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6955           && bitnum < TYPE_PRECISION (type)
6956           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6957                                    bitnum - TYPE_PRECISION (type)))
6958         {
6959           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6960           inner = TREE_OPERAND (inner, 0);
6961         }
6962
6963       /* If we are going to be able to omit the AND below, we must do our
6964          operations as unsigned.  If we must use the AND, we have a choice.
6965          Normally unsigned is faster, but for some machines signed is.  */
6966 #ifdef LOAD_EXTEND_OP
6967       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6968                       && !flag_syntax_only) ? 0 : 1;
6969 #else
6970       ops_unsigned = 1;
6971 #endif
6972
6973       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6974       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6975       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6976       inner = fold_convert (intermediate_type, inner);
6977
6978       if (bitnum != 0)
6979         inner = build2 (RSHIFT_EXPR, intermediate_type,
6980                         inner, size_int (bitnum));
6981
6982       one = build_int_cst (intermediate_type, 1);
6983
6984       if (code == EQ_EXPR)
6985         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6986
6987       /* Put the AND last so it can combine with more things.  */
6988       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6989
6990       /* Make sure to return the proper type.  */
6991       inner = fold_convert (result_type, inner);
6992
6993       return inner;
6994     }
6995   return NULL_TREE;
6996 }
6997
6998 /* Check whether we are allowed to reorder operands arg0 and arg1,
6999    such that the evaluation of arg1 occurs before arg0.  */
7000
7001 static bool
7002 reorder_operands_p (const_tree arg0, const_tree arg1)
7003 {
7004   if (! flag_evaluation_order)
7005       return true;
7006   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
7007     return true;
7008   return ! TREE_SIDE_EFFECTS (arg0)
7009          && ! TREE_SIDE_EFFECTS (arg1);
7010 }
7011
7012 /* Test whether it is preferable two swap two operands, ARG0 and
7013    ARG1, for example because ARG0 is an integer constant and ARG1
7014    isn't.  If REORDER is true, only recommend swapping if we can
7015    evaluate the operands in reverse order.  */
7016
7017 bool
7018 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
7019 {
7020   STRIP_SIGN_NOPS (arg0);
7021   STRIP_SIGN_NOPS (arg1);
7022
7023   if (TREE_CODE (arg1) == INTEGER_CST)
7024     return 0;
7025   if (TREE_CODE (arg0) == INTEGER_CST)
7026     return 1;
7027
7028   if (TREE_CODE (arg1) == REAL_CST)
7029     return 0;
7030   if (TREE_CODE (arg0) == REAL_CST)
7031     return 1;
7032
7033   if (TREE_CODE (arg1) == FIXED_CST)
7034     return 0;
7035   if (TREE_CODE (arg0) == FIXED_CST)
7036     return 1;
7037
7038   if (TREE_CODE (arg1) == COMPLEX_CST)
7039     return 0;
7040   if (TREE_CODE (arg0) == COMPLEX_CST)
7041     return 1;
7042
7043   if (TREE_CONSTANT (arg1))
7044     return 0;
7045   if (TREE_CONSTANT (arg0))
7046     return 1;
7047
7048   if (optimize_function_for_size_p (cfun))
7049     return 0;
7050
7051   if (reorder && flag_evaluation_order
7052       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
7053     return 0;
7054
7055   /* It is preferable to swap two SSA_NAME to ensure a canonical form
7056      for commutative and comparison operators.  Ensuring a canonical
7057      form allows the optimizers to find additional redundancies without
7058      having to explicitly check for both orderings.  */
7059   if (TREE_CODE (arg0) == SSA_NAME
7060       && TREE_CODE (arg1) == SSA_NAME
7061       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
7062     return 1;
7063
7064   /* Put SSA_NAMEs last.  */
7065   if (TREE_CODE (arg1) == SSA_NAME)
7066     return 0;
7067   if (TREE_CODE (arg0) == SSA_NAME)
7068     return 1;
7069
7070   /* Put variables last.  */
7071   if (DECL_P (arg1))
7072     return 0;
7073   if (DECL_P (arg0))
7074     return 1;
7075
7076   return 0;
7077 }
7078
7079 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
7080    ARG0 is extended to a wider type.  */
7081
7082 static tree
7083 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
7084 {
7085   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
7086   tree arg1_unw;
7087   tree shorter_type, outer_type;
7088   tree min, max;
7089   bool above, below;
7090
7091   if (arg0_unw == arg0)
7092     return NULL_TREE;
7093   shorter_type = TREE_TYPE (arg0_unw);
7094
7095 #ifdef HAVE_canonicalize_funcptr_for_compare
7096   /* Disable this optimization if we're casting a function pointer
7097      type on targets that require function pointer canonicalization.  */
7098   if (HAVE_canonicalize_funcptr_for_compare
7099       && TREE_CODE (shorter_type) == POINTER_TYPE
7100       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
7101     return NULL_TREE;
7102 #endif
7103
7104   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
7105     return NULL_TREE;
7106
7107   arg1_unw = get_unwidened (arg1, NULL_TREE);
7108
7109   /* If possible, express the comparison in the shorter mode.  */
7110   if ((code == EQ_EXPR || code == NE_EXPR
7111        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
7112       && (TREE_TYPE (arg1_unw) == shorter_type
7113           || ((TYPE_PRECISION (shorter_type)
7114                >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
7115               && (TYPE_UNSIGNED (shorter_type)
7116                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
7117           || (TREE_CODE (arg1_unw) == INTEGER_CST
7118               && (TREE_CODE (shorter_type) == INTEGER_TYPE
7119                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
7120               && int_fits_type_p (arg1_unw, shorter_type))))
7121     return fold_build2 (code, type, arg0_unw,
7122                        fold_convert (shorter_type, arg1_unw));
7123
7124   if (TREE_CODE (arg1_unw) != INTEGER_CST
7125       || TREE_CODE (shorter_type) != INTEGER_TYPE
7126       || !int_fits_type_p (arg1_unw, shorter_type))
7127     return NULL_TREE;
7128
7129   /* If we are comparing with the integer that does not fit into the range
7130      of the shorter type, the result is known.  */
7131   outer_type = TREE_TYPE (arg1_unw);
7132   min = lower_bound_in_type (outer_type, shorter_type);
7133   max = upper_bound_in_type (outer_type, shorter_type);
7134
7135   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7136                                                    max, arg1_unw));
7137   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7138                                                    arg1_unw, min));
7139
7140   switch (code)
7141     {
7142     case EQ_EXPR:
7143       if (above || below)
7144         return omit_one_operand (type, integer_zero_node, arg0);
7145       break;
7146
7147     case NE_EXPR:
7148       if (above || below)
7149         return omit_one_operand (type, integer_one_node, arg0);
7150       break;
7151
7152     case LT_EXPR:
7153     case LE_EXPR:
7154       if (above)
7155         return omit_one_operand (type, integer_one_node, arg0);
7156       else if (below)
7157         return omit_one_operand (type, integer_zero_node, arg0);
7158
7159     case GT_EXPR:
7160     case GE_EXPR:
7161       if (above)
7162         return omit_one_operand (type, integer_zero_node, arg0);
7163       else if (below)
7164         return omit_one_operand (type, integer_one_node, arg0);
7165
7166     default:
7167       break;
7168     }
7169
7170   return NULL_TREE;
7171 }
7172
7173 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
7174    ARG0 just the signedness is changed.  */
7175
7176 static tree
7177 fold_sign_changed_comparison (enum tree_code code, tree type,
7178                               tree arg0, tree arg1)
7179 {
7180   tree arg0_inner;
7181   tree inner_type, outer_type;
7182
7183   if (!CONVERT_EXPR_P (arg0))
7184     return NULL_TREE;
7185
7186   outer_type = TREE_TYPE (arg0);
7187   arg0_inner = TREE_OPERAND (arg0, 0);
7188   inner_type = TREE_TYPE (arg0_inner);
7189
7190 #ifdef HAVE_canonicalize_funcptr_for_compare
7191   /* Disable this optimization if we're casting a function pointer
7192      type on targets that require function pointer canonicalization.  */
7193   if (HAVE_canonicalize_funcptr_for_compare
7194       && TREE_CODE (inner_type) == POINTER_TYPE
7195       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
7196     return NULL_TREE;
7197 #endif
7198
7199   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
7200     return NULL_TREE;
7201
7202   /* If the conversion is from an integral subtype to its basetype
7203      leave it alone.  */
7204   if (TREE_TYPE (inner_type) == outer_type)
7205     return NULL_TREE;
7206
7207   if (TREE_CODE (arg1) != INTEGER_CST
7208       && !(CONVERT_EXPR_P (arg1)
7209            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
7210     return NULL_TREE;
7211
7212   if ((TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
7213        || POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
7214       && code != NE_EXPR
7215       && code != EQ_EXPR)
7216     return NULL_TREE;
7217
7218   if (TREE_CODE (arg1) == INTEGER_CST)
7219     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
7220                                   TREE_INT_CST_HIGH (arg1), 0,
7221                                   TREE_OVERFLOW (arg1));
7222   else
7223     arg1 = fold_convert (inner_type, arg1);
7224
7225   return fold_build2 (code, type, arg0_inner, arg1);
7226 }
7227
7228 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
7229    step of the array.  Reconstructs s and delta in the case of s * delta
7230    being an integer constant (and thus already folded).
7231    ADDR is the address. MULT is the multiplicative expression.
7232    If the function succeeds, the new address expression is returned.  Otherwise
7233    NULL_TREE is returned.  */
7234
7235 static tree
7236 try_move_mult_to_index (tree addr, tree op1)
7237 {
7238   tree s, delta, step;
7239   tree ref = TREE_OPERAND (addr, 0), pref;
7240   tree ret, pos;
7241   tree itype;
7242   bool mdim = false;
7243
7244   /*  Strip the nops that might be added when converting op1 to sizetype. */
7245   STRIP_NOPS (op1);
7246
7247   /* Canonicalize op1 into a possibly non-constant delta
7248      and an INTEGER_CST s.  */
7249   if (TREE_CODE (op1) == MULT_EXPR)
7250     {
7251       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
7252
7253       STRIP_NOPS (arg0);
7254       STRIP_NOPS (arg1);
7255   
7256       if (TREE_CODE (arg0) == INTEGER_CST)
7257         {
7258           s = arg0;
7259           delta = arg1;
7260         }
7261       else if (TREE_CODE (arg1) == INTEGER_CST)
7262         {
7263           s = arg1;
7264           delta = arg0;
7265         }
7266       else
7267         return NULL_TREE;
7268     }
7269   else if (TREE_CODE (op1) == INTEGER_CST)
7270     {
7271       delta = op1;
7272       s = NULL_TREE;
7273     }
7274   else
7275     {
7276       /* Simulate we are delta * 1.  */
7277       delta = op1;
7278       s = integer_one_node;
7279     }
7280
7281   for (;; ref = TREE_OPERAND (ref, 0))
7282     {
7283       if (TREE_CODE (ref) == ARRAY_REF)
7284         {
7285           /* Remember if this was a multi-dimensional array.  */
7286           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
7287             mdim = true;
7288
7289           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
7290           if (! itype)
7291             continue;
7292
7293           step = array_ref_element_size (ref);
7294           if (TREE_CODE (step) != INTEGER_CST)
7295             continue;
7296
7297           if (s)
7298             {
7299               if (! tree_int_cst_equal (step, s))
7300                 continue;
7301             }
7302           else
7303             {
7304               /* Try if delta is a multiple of step.  */
7305               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
7306               if (! tmp)
7307                 continue;
7308               delta = tmp;
7309             }
7310
7311           /* Only fold here if we can verify we do not overflow one
7312              dimension of a multi-dimensional array.  */
7313           if (mdim)
7314             {
7315               tree tmp;
7316
7317               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
7318                   || !INTEGRAL_TYPE_P (itype)
7319                   || !TYPE_MAX_VALUE (itype)
7320                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
7321                 continue;
7322
7323               tmp = fold_binary (PLUS_EXPR, itype,
7324                                  fold_convert (itype,
7325                                                TREE_OPERAND (ref, 1)),
7326                                  fold_convert (itype, delta));
7327               if (!tmp
7328                   || TREE_CODE (tmp) != INTEGER_CST
7329                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
7330                 continue;
7331             }
7332
7333           break;
7334         }
7335       else
7336         mdim = false;
7337
7338       if (!handled_component_p (ref))
7339         return NULL_TREE;
7340     }
7341
7342   /* We found the suitable array reference.  So copy everything up to it,
7343      and replace the index.  */
7344
7345   pref = TREE_OPERAND (addr, 0);
7346   ret = copy_node (pref);
7347   pos = ret;
7348
7349   while (pref != ref)
7350     {
7351       pref = TREE_OPERAND (pref, 0);
7352       TREE_OPERAND (pos, 0) = copy_node (pref);
7353       pos = TREE_OPERAND (pos, 0);
7354     }
7355
7356   TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
7357                                        fold_convert (itype,
7358                                                      TREE_OPERAND (pos, 1)),
7359                                        fold_convert (itype, delta));
7360
7361   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
7362 }
7363
7364
7365 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7366    means A >= Y && A != MAX, but in this case we know that
7367    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7368
7369 static tree
7370 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
7371 {
7372   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7373
7374   if (TREE_CODE (bound) == LT_EXPR)
7375     a = TREE_OPERAND (bound, 0);
7376   else if (TREE_CODE (bound) == GT_EXPR)
7377     a = TREE_OPERAND (bound, 1);
7378   else
7379     return NULL_TREE;
7380
7381   typea = TREE_TYPE (a);
7382   if (!INTEGRAL_TYPE_P (typea)
7383       && !POINTER_TYPE_P (typea))
7384     return NULL_TREE;
7385
7386   if (TREE_CODE (ineq) == LT_EXPR)
7387     {
7388       a1 = TREE_OPERAND (ineq, 1);
7389       y = TREE_OPERAND (ineq, 0);
7390     }
7391   else if (TREE_CODE (ineq) == GT_EXPR)
7392     {
7393       a1 = TREE_OPERAND (ineq, 0);
7394       y = TREE_OPERAND (ineq, 1);
7395     }
7396   else
7397     return NULL_TREE;
7398
7399   if (TREE_TYPE (a1) != typea)
7400     return NULL_TREE;
7401
7402   if (POINTER_TYPE_P (typea))
7403     {
7404       /* Convert the pointer types into integer before taking the difference.  */
7405       tree ta = fold_convert (ssizetype, a);
7406       tree ta1 = fold_convert (ssizetype, a1);
7407       diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7408     }
7409   else
7410    diff = fold_binary (MINUS_EXPR, typea, a1, a);
7411
7412   if (!diff || !integer_onep (diff))
7413    return NULL_TREE;
7414
7415   return fold_build2 (GE_EXPR, type, a, y);
7416 }
7417
7418 /* Fold a sum or difference of at least one multiplication.
7419    Returns the folded tree or NULL if no simplification could be made.  */
7420
7421 static tree
7422 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7423 {
7424   tree arg00, arg01, arg10, arg11;
7425   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7426
7427   /* (A * C) +- (B * C) -> (A+-B) * C.
7428      (A * C) +- A -> A * (C+-1).
7429      We are most concerned about the case where C is a constant,
7430      but other combinations show up during loop reduction.  Since
7431      it is not difficult, try all four possibilities.  */
7432
7433   if (TREE_CODE (arg0) == MULT_EXPR)
7434     {
7435       arg00 = TREE_OPERAND (arg0, 0);
7436       arg01 = TREE_OPERAND (arg0, 1);
7437     }
7438   else if (TREE_CODE (arg0) == INTEGER_CST)
7439     {
7440       arg00 = build_one_cst (type);
7441       arg01 = arg0;
7442     }
7443   else
7444     {
7445       /* We cannot generate constant 1 for fract.  */
7446       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7447         return NULL_TREE;
7448       arg00 = arg0;
7449       arg01 = build_one_cst (type);
7450     }
7451   if (TREE_CODE (arg1) == MULT_EXPR)
7452     {
7453       arg10 = TREE_OPERAND (arg1, 0);
7454       arg11 = TREE_OPERAND (arg1, 1);
7455     }
7456   else if (TREE_CODE (arg1) == INTEGER_CST)
7457     {
7458       arg10 = build_one_cst (type);
7459       /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7460          the purpose of this canonicalization.  */
7461       if (TREE_INT_CST_HIGH (arg1) == -1
7462           && negate_expr_p (arg1)
7463           && code == PLUS_EXPR)
7464         {
7465           arg11 = negate_expr (arg1);
7466           code = MINUS_EXPR;
7467         }
7468       else
7469         arg11 = arg1;
7470     }
7471   else
7472     {
7473       /* We cannot generate constant 1 for fract.  */
7474       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7475         return NULL_TREE;
7476       arg10 = arg1;
7477       arg11 = build_one_cst (type);
7478     }
7479   same = NULL_TREE;
7480
7481   if (operand_equal_p (arg01, arg11, 0))
7482     same = arg01, alt0 = arg00, alt1 = arg10;
7483   else if (operand_equal_p (arg00, arg10, 0))
7484     same = arg00, alt0 = arg01, alt1 = arg11;
7485   else if (operand_equal_p (arg00, arg11, 0))
7486     same = arg00, alt0 = arg01, alt1 = arg10;
7487   else if (operand_equal_p (arg01, arg10, 0))
7488     same = arg01, alt0 = arg00, alt1 = arg11;
7489
7490   /* No identical multiplicands; see if we can find a common
7491      power-of-two factor in non-power-of-two multiplies.  This
7492      can help in multi-dimensional array access.  */
7493   else if (host_integerp (arg01, 0)
7494            && host_integerp (arg11, 0))
7495     {
7496       HOST_WIDE_INT int01, int11, tmp;
7497       bool swap = false;
7498       tree maybe_same;
7499       int01 = TREE_INT_CST_LOW (arg01);
7500       int11 = TREE_INT_CST_LOW (arg11);
7501
7502       /* Move min of absolute values to int11.  */
7503       if ((int01 >= 0 ? int01 : -int01)
7504           < (int11 >= 0 ? int11 : -int11))
7505         {
7506           tmp = int01, int01 = int11, int11 = tmp;
7507           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7508           maybe_same = arg01;
7509           swap = true;
7510         }
7511       else
7512         maybe_same = arg11;
7513
7514       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0
7515           /* The remainder should not be a constant, otherwise we
7516              end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7517              increased the number of multiplications necessary.  */
7518           && TREE_CODE (arg10) != INTEGER_CST)
7519         {
7520           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7521                               build_int_cst (TREE_TYPE (arg00),
7522                                              int01 / int11));
7523           alt1 = arg10;
7524           same = maybe_same;
7525           if (swap)
7526             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7527         }
7528     }
7529
7530   if (same)
7531     return fold_build2 (MULT_EXPR, type,
7532                         fold_build2 (code, type,
7533                                      fold_convert (type, alt0),
7534                                      fold_convert (type, alt1)),
7535                         fold_convert (type, same));
7536
7537   return NULL_TREE;
7538 }
7539
7540 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7541    specified by EXPR into the buffer PTR of length LEN bytes.
7542    Return the number of bytes placed in the buffer, or zero
7543    upon failure.  */
7544
7545 static int
7546 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7547 {
7548   tree type = TREE_TYPE (expr);
7549   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7550   int byte, offset, word, words;
7551   unsigned char value;
7552
7553   if (total_bytes > len)
7554     return 0;
7555   words = total_bytes / UNITS_PER_WORD;
7556
7557   for (byte = 0; byte < total_bytes; byte++)
7558     {
7559       int bitpos = byte * BITS_PER_UNIT;
7560       if (bitpos < HOST_BITS_PER_WIDE_INT)
7561         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7562       else
7563         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7564                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7565
7566       if (total_bytes > UNITS_PER_WORD)
7567         {
7568           word = byte / UNITS_PER_WORD;
7569           if (WORDS_BIG_ENDIAN)
7570             word = (words - 1) - word;
7571           offset = word * UNITS_PER_WORD;
7572           if (BYTES_BIG_ENDIAN)
7573             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7574           else
7575             offset += byte % UNITS_PER_WORD;
7576         }
7577       else
7578         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7579       ptr[offset] = value;
7580     }
7581   return total_bytes;
7582 }
7583
7584
7585 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7586    specified by EXPR into the buffer PTR of length LEN bytes.
7587    Return the number of bytes placed in the buffer, or zero
7588    upon failure.  */
7589
7590 static int
7591 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7592 {
7593   tree type = TREE_TYPE (expr);
7594   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7595   int byte, offset, word, words, bitpos;
7596   unsigned char value;
7597
7598   /* There are always 32 bits in each long, no matter the size of
7599      the hosts long.  We handle floating point representations with
7600      up to 192 bits.  */
7601   long tmp[6];
7602
7603   if (total_bytes > len)
7604     return 0;
7605   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7606
7607   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7608
7609   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7610        bitpos += BITS_PER_UNIT)
7611     {
7612       byte = (bitpos / BITS_PER_UNIT) & 3;
7613       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7614
7615       if (UNITS_PER_WORD < 4)
7616         {
7617           word = byte / UNITS_PER_WORD;
7618           if (WORDS_BIG_ENDIAN)
7619             word = (words - 1) - word;
7620           offset = word * UNITS_PER_WORD;
7621           if (BYTES_BIG_ENDIAN)
7622             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7623           else
7624             offset += byte % UNITS_PER_WORD;
7625         }
7626       else
7627         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7628       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7629     }
7630   return total_bytes;
7631 }
7632
7633 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7634    specified by EXPR into the buffer PTR of length LEN bytes.
7635    Return the number of bytes placed in the buffer, or zero
7636    upon failure.  */
7637
7638 static int
7639 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7640 {
7641   int rsize, isize;
7642   tree part;
7643
7644   part = TREE_REALPART (expr);
7645   rsize = native_encode_expr (part, ptr, len);
7646   if (rsize == 0)
7647     return 0;
7648   part = TREE_IMAGPART (expr);
7649   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7650   if (isize != rsize)
7651     return 0;
7652   return rsize + isize;
7653 }
7654
7655
7656 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7657    specified by EXPR into the buffer PTR of length LEN bytes.
7658    Return the number of bytes placed in the buffer, or zero
7659    upon failure.  */
7660
7661 static int
7662 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7663 {
7664   int i, size, offset, count;
7665   tree itype, elem, elements;
7666
7667   offset = 0;
7668   elements = TREE_VECTOR_CST_ELTS (expr);
7669   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7670   itype = TREE_TYPE (TREE_TYPE (expr));
7671   size = GET_MODE_SIZE (TYPE_MODE (itype));
7672   for (i = 0; i < count; i++)
7673     {
7674       if (elements)
7675         {
7676           elem = TREE_VALUE (elements);
7677           elements = TREE_CHAIN (elements);
7678         }
7679       else
7680         elem = NULL_TREE;
7681
7682       if (elem)
7683         {
7684           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7685             return 0;
7686         }
7687       else
7688         {
7689           if (offset + size > len)
7690             return 0;
7691           memset (ptr+offset, 0, size);
7692         }
7693       offset += size;
7694     }
7695   return offset;
7696 }
7697
7698
7699 /* Subroutine of native_encode_expr.  Encode the STRING_CST
7700    specified by EXPR into the buffer PTR of length LEN bytes.
7701    Return the number of bytes placed in the buffer, or zero
7702    upon failure.  */
7703
7704 static int
7705 native_encode_string (const_tree expr, unsigned char *ptr, int len)
7706 {
7707   tree type = TREE_TYPE (expr);
7708   HOST_WIDE_INT total_bytes;
7709
7710   if (TREE_CODE (type) != ARRAY_TYPE
7711       || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
7712       || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
7713       || !host_integerp (TYPE_SIZE_UNIT (type), 0))
7714     return 0;
7715   total_bytes = tree_low_cst (TYPE_SIZE_UNIT (type), 0);
7716   if (total_bytes > len)
7717     return 0;
7718   if (TREE_STRING_LENGTH (expr) < total_bytes)
7719     {
7720       memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr));
7721       memset (ptr + TREE_STRING_LENGTH (expr), 0,
7722               total_bytes - TREE_STRING_LENGTH (expr));
7723     }
7724   else
7725     memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes);
7726   return total_bytes;
7727 }
7728
7729
7730 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7731    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7732    buffer PTR of length LEN bytes.  Return the number of bytes
7733    placed in the buffer, or zero upon failure.  */
7734
7735 int
7736 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7737 {
7738   switch (TREE_CODE (expr))
7739     {
7740     case INTEGER_CST:
7741       return native_encode_int (expr, ptr, len);
7742
7743     case REAL_CST:
7744       return native_encode_real (expr, ptr, len);
7745
7746     case COMPLEX_CST:
7747       return native_encode_complex (expr, ptr, len);
7748
7749     case VECTOR_CST:
7750       return native_encode_vector (expr, ptr, len);
7751
7752     case STRING_CST:
7753       return native_encode_string (expr, ptr, len);
7754
7755     default:
7756       return 0;
7757     }
7758 }
7759
7760
7761 /* Subroutine of native_interpret_expr.  Interpret the contents of
7762    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7763    If the buffer cannot be interpreted, return NULL_TREE.  */
7764
7765 static tree
7766 native_interpret_int (tree type, const unsigned char *ptr, int len)
7767 {
7768   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7769   int byte, offset, word, words;
7770   unsigned char value;
7771   unsigned int HOST_WIDE_INT lo = 0;
7772   HOST_WIDE_INT hi = 0;
7773
7774   if (total_bytes > len)
7775     return NULL_TREE;
7776   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7777     return NULL_TREE;
7778   words = total_bytes / UNITS_PER_WORD;
7779
7780   for (byte = 0; byte < total_bytes; byte++)
7781     {
7782       int bitpos = byte * BITS_PER_UNIT;
7783       if (total_bytes > UNITS_PER_WORD)
7784         {
7785           word = byte / UNITS_PER_WORD;
7786           if (WORDS_BIG_ENDIAN)
7787             word = (words - 1) - word;
7788           offset = word * UNITS_PER_WORD;
7789           if (BYTES_BIG_ENDIAN)
7790             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7791           else
7792             offset += byte % UNITS_PER_WORD;
7793         }
7794       else
7795         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7796       value = ptr[offset];
7797
7798       if (bitpos < HOST_BITS_PER_WIDE_INT)
7799         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7800       else
7801         hi |= (unsigned HOST_WIDE_INT) value
7802               << (bitpos - HOST_BITS_PER_WIDE_INT);
7803     }
7804
7805   return build_int_cst_wide_type (type, lo, hi);
7806 }
7807
7808
7809 /* Subroutine of native_interpret_expr.  Interpret the contents of
7810    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7811    If the buffer cannot be interpreted, return NULL_TREE.  */
7812
7813 static tree
7814 native_interpret_real (tree type, const unsigned char *ptr, int len)
7815 {
7816   enum machine_mode mode = TYPE_MODE (type);
7817   int total_bytes = GET_MODE_SIZE (mode);
7818   int byte, offset, word, words, bitpos;
7819   unsigned char value;
7820   /* There are always 32 bits in each long, no matter the size of
7821      the hosts long.  We handle floating point representations with
7822      up to 192 bits.  */
7823   REAL_VALUE_TYPE r;
7824   long tmp[6];
7825
7826   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7827   if (total_bytes > len || total_bytes > 24)
7828     return NULL_TREE;
7829   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7830
7831   memset (tmp, 0, sizeof (tmp));
7832   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7833        bitpos += BITS_PER_UNIT)
7834     {
7835       byte = (bitpos / BITS_PER_UNIT) & 3;
7836       if (UNITS_PER_WORD < 4)
7837         {
7838           word = byte / UNITS_PER_WORD;
7839           if (WORDS_BIG_ENDIAN)
7840             word = (words - 1) - word;
7841           offset = word * UNITS_PER_WORD;
7842           if (BYTES_BIG_ENDIAN)
7843             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7844           else
7845             offset += byte % UNITS_PER_WORD;
7846         }
7847       else
7848         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7849       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7850
7851       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7852     }
7853
7854   real_from_target (&r, tmp, mode);
7855   return build_real (type, r);
7856 }
7857
7858
7859 /* Subroutine of native_interpret_expr.  Interpret the contents of
7860    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7861    If the buffer cannot be interpreted, return NULL_TREE.  */
7862
7863 static tree
7864 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7865 {
7866   tree etype, rpart, ipart;
7867   int size;
7868
7869   etype = TREE_TYPE (type);
7870   size = GET_MODE_SIZE (TYPE_MODE (etype));
7871   if (size * 2 > len)
7872     return NULL_TREE;
7873   rpart = native_interpret_expr (etype, ptr, size);
7874   if (!rpart)
7875     return NULL_TREE;
7876   ipart = native_interpret_expr (etype, ptr+size, size);
7877   if (!ipart)
7878     return NULL_TREE;
7879   return build_complex (type, rpart, ipart);
7880 }
7881
7882
7883 /* Subroutine of native_interpret_expr.  Interpret the contents of
7884    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7885    If the buffer cannot be interpreted, return NULL_TREE.  */
7886
7887 static tree
7888 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7889 {
7890   tree etype, elem, elements;
7891   int i, size, count;
7892
7893   etype = TREE_TYPE (type);
7894   size = GET_MODE_SIZE (TYPE_MODE (etype));
7895   count = TYPE_VECTOR_SUBPARTS (type);
7896   if (size * count > len)
7897     return NULL_TREE;
7898
7899   elements = NULL_TREE;
7900   for (i = count - 1; i >= 0; i--)
7901     {
7902       elem = native_interpret_expr (etype, ptr+(i*size), size);
7903       if (!elem)
7904         return NULL_TREE;
7905       elements = tree_cons (NULL_TREE, elem, elements);
7906     }
7907   return build_vector (type, elements);
7908 }
7909
7910
7911 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7912    the buffer PTR of length LEN as a constant of type TYPE.  For
7913    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7914    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7915    return NULL_TREE.  */
7916
7917 tree
7918 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7919 {
7920   switch (TREE_CODE (type))
7921     {
7922     case INTEGER_TYPE:
7923     case ENUMERAL_TYPE:
7924     case BOOLEAN_TYPE:
7925       return native_interpret_int (type, ptr, len);
7926
7927     case REAL_TYPE:
7928       return native_interpret_real (type, ptr, len);
7929
7930     case COMPLEX_TYPE:
7931       return native_interpret_complex (type, ptr, len);
7932
7933     case VECTOR_TYPE:
7934       return native_interpret_vector (type, ptr, len);
7935
7936     default:
7937       return NULL_TREE;
7938     }
7939 }
7940
7941
7942 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7943    TYPE at compile-time.  If we're unable to perform the conversion
7944    return NULL_TREE.  */
7945
7946 static tree
7947 fold_view_convert_expr (tree type, tree expr)
7948 {
7949   /* We support up to 512-bit values (for V8DFmode).  */
7950   unsigned char buffer[64];
7951   int len;
7952
7953   /* Check that the host and target are sane.  */
7954   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7955     return NULL_TREE;
7956
7957   len = native_encode_expr (expr, buffer, sizeof (buffer));
7958   if (len == 0)
7959     return NULL_TREE;
7960
7961   return native_interpret_expr (type, buffer, len);
7962 }
7963
7964 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7965    to avoid confusing the gimplify process.  */
7966
7967 tree
7968 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7969 {
7970   /* The size of the object is not relevant when talking about its address.  */
7971   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7972     t = TREE_OPERAND (t, 0);
7973
7974   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7975   if (TREE_CODE (t) == INDIRECT_REF
7976       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7977     {
7978       t = TREE_OPERAND (t, 0);
7979
7980       if (TREE_TYPE (t) != ptrtype)
7981         t = build1 (NOP_EXPR, ptrtype, t);
7982     }
7983   else
7984     t = build1 (ADDR_EXPR, ptrtype, t);
7985
7986   return t;
7987 }
7988
7989 /* Build an expression for the address of T.  */
7990
7991 tree
7992 build_fold_addr_expr (tree t)
7993 {
7994   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7995
7996   return build_fold_addr_expr_with_type (t, ptrtype);
7997 }
7998
7999 /* Fold a unary expression of code CODE and type TYPE with operand
8000    OP0.  Return the folded expression if folding is successful.
8001    Otherwise, return NULL_TREE.  */
8002
8003 tree
8004 fold_unary (enum tree_code code, tree type, tree op0)
8005 {
8006   tree tem;
8007   tree arg0;
8008   enum tree_code_class kind = TREE_CODE_CLASS (code);
8009
8010   gcc_assert (IS_EXPR_CODE_CLASS (kind)
8011               && TREE_CODE_LENGTH (code) == 1);
8012
8013   arg0 = op0;
8014   if (arg0)
8015     {
8016       if (CONVERT_EXPR_CODE_P (code)
8017           || code == FLOAT_EXPR || code == ABS_EXPR)
8018         {
8019           /* Don't use STRIP_NOPS, because signedness of argument type
8020              matters.  */
8021           STRIP_SIGN_NOPS (arg0);
8022         }
8023       else
8024         {
8025           /* Strip any conversions that don't change the mode.  This
8026              is safe for every expression, except for a comparison
8027              expression because its signedness is derived from its
8028              operands.
8029
8030              Note that this is done as an internal manipulation within
8031              the constant folder, in order to find the simplest
8032              representation of the arguments so that their form can be
8033              studied.  In any cases, the appropriate type conversions
8034              should be put back in the tree that will get out of the
8035              constant folder.  */
8036           STRIP_NOPS (arg0);
8037         }
8038     }
8039
8040   if (TREE_CODE_CLASS (code) == tcc_unary)
8041     {
8042       if (TREE_CODE (arg0) == COMPOUND_EXPR)
8043         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
8044                        fold_build1 (code, type,
8045                                     fold_convert (TREE_TYPE (op0),
8046                                                   TREE_OPERAND (arg0, 1))));
8047       else if (TREE_CODE (arg0) == COND_EXPR)
8048         {
8049           tree arg01 = TREE_OPERAND (arg0, 1);
8050           tree arg02 = TREE_OPERAND (arg0, 2);
8051           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
8052             arg01 = fold_build1 (code, type,
8053                                  fold_convert (TREE_TYPE (op0), arg01));
8054           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
8055             arg02 = fold_build1 (code, type,
8056                                  fold_convert (TREE_TYPE (op0), arg02));
8057           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
8058                              arg01, arg02);
8059
8060           /* If this was a conversion, and all we did was to move into
8061              inside the COND_EXPR, bring it back out.  But leave it if
8062              it is a conversion from integer to integer and the
8063              result precision is no wider than a word since such a
8064              conversion is cheap and may be optimized away by combine,
8065              while it couldn't if it were outside the COND_EXPR.  Then return
8066              so we don't get into an infinite recursion loop taking the
8067              conversion out and then back in.  */
8068
8069           if ((CONVERT_EXPR_CODE_P (code)
8070                || code == NON_LVALUE_EXPR)
8071               && TREE_CODE (tem) == COND_EXPR
8072               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
8073               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
8074               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
8075               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
8076               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
8077                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
8078               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8079                      && (INTEGRAL_TYPE_P
8080                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
8081                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
8082                   || flag_syntax_only))
8083             tem = build1 (code, type,
8084                           build3 (COND_EXPR,
8085                                   TREE_TYPE (TREE_OPERAND
8086                                              (TREE_OPERAND (tem, 1), 0)),
8087                                   TREE_OPERAND (tem, 0),
8088                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
8089                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
8090           return tem;
8091         }
8092       else if (COMPARISON_CLASS_P (arg0))
8093         {
8094           if (TREE_CODE (type) == BOOLEAN_TYPE)
8095             {
8096               arg0 = copy_node (arg0);
8097               TREE_TYPE (arg0) = type;
8098               return arg0;
8099             }
8100           else if (TREE_CODE (type) != INTEGER_TYPE)
8101             return fold_build3 (COND_EXPR, type, arg0,
8102                                 fold_build1 (code, type,
8103                                              integer_one_node),
8104                                 fold_build1 (code, type,
8105                                              integer_zero_node));
8106         }
8107    }
8108
8109   switch (code)
8110     {
8111     case PAREN_EXPR:
8112       /* Re-association barriers around constants and other re-association
8113          barriers can be removed.  */
8114       if (CONSTANT_CLASS_P (op0)
8115           || TREE_CODE (op0) == PAREN_EXPR)
8116         return fold_convert (type, op0);
8117       return NULL_TREE;
8118
8119     CASE_CONVERT:
8120     case FLOAT_EXPR:
8121     case FIX_TRUNC_EXPR:
8122       if (TREE_TYPE (op0) == type)
8123         return op0;
8124       
8125       /* If we have (type) (a CMP b) and type is an integral type, return
8126          new expression involving the new type.  */
8127       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
8128         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
8129                             TREE_OPERAND (op0, 1));
8130
8131       /* Handle cases of two conversions in a row.  */
8132       if (CONVERT_EXPR_P (op0))
8133         {
8134           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
8135           tree inter_type = TREE_TYPE (op0);
8136           int inside_int = INTEGRAL_TYPE_P (inside_type);
8137           int inside_ptr = POINTER_TYPE_P (inside_type);
8138           int inside_float = FLOAT_TYPE_P (inside_type);
8139           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
8140           unsigned int inside_prec = TYPE_PRECISION (inside_type);
8141           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
8142           int inter_int = INTEGRAL_TYPE_P (inter_type);
8143           int inter_ptr = POINTER_TYPE_P (inter_type);
8144           int inter_float = FLOAT_TYPE_P (inter_type);
8145           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
8146           unsigned int inter_prec = TYPE_PRECISION (inter_type);
8147           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
8148           int final_int = INTEGRAL_TYPE_P (type);
8149           int final_ptr = POINTER_TYPE_P (type);
8150           int final_float = FLOAT_TYPE_P (type);
8151           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
8152           unsigned int final_prec = TYPE_PRECISION (type);
8153           int final_unsignedp = TYPE_UNSIGNED (type);
8154
8155           /* In addition to the cases of two conversions in a row
8156              handled below, if we are converting something to its own
8157              type via an object of identical or wider precision, neither
8158              conversion is needed.  */
8159           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
8160               && (((inter_int || inter_ptr) && final_int)
8161                   || (inter_float && final_float))
8162               && inter_prec >= final_prec)
8163             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
8164
8165           /* Likewise, if the intermediate and initial types are either both
8166              float or both integer, we don't need the middle conversion if the
8167              former is wider than the latter and doesn't change the signedness
8168              (for integers).  Avoid this if the final type is a pointer since
8169              then we sometimes need the middle conversion.  Likewise if the
8170              final type has a precision not equal to the size of its mode.  */
8171           if (((inter_int && inside_int)
8172                || (inter_float && inside_float)
8173                || (inter_vec && inside_vec))
8174               && inter_prec >= inside_prec
8175               && (inter_float || inter_vec
8176                   || inter_unsignedp == inside_unsignedp)
8177               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8178                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
8179               && ! final_ptr
8180               && (! final_vec || inter_prec == inside_prec))
8181             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
8182
8183           /* If we have a sign-extension of a zero-extended value, we can
8184              replace that by a single zero-extension.  */
8185           if (inside_int && inter_int && final_int
8186               && inside_prec < inter_prec && inter_prec < final_prec
8187               && inside_unsignedp && !inter_unsignedp)
8188             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
8189
8190           /* Two conversions in a row are not needed unless:
8191              - some conversion is floating-point (overstrict for now), or
8192              - some conversion is a vector (overstrict for now), or
8193              - the intermediate type is narrower than both initial and
8194                final, or
8195              - the intermediate type and innermost type differ in signedness,
8196                and the outermost type is wider than the intermediate, or
8197              - the initial type is a pointer type and the precisions of the
8198                intermediate and final types differ, or
8199              - the final type is a pointer type and the precisions of the
8200                initial and intermediate types differ.  */
8201           if (! inside_float && ! inter_float && ! final_float
8202               && ! inside_vec && ! inter_vec && ! final_vec
8203               && (inter_prec >= inside_prec || inter_prec >= final_prec)
8204               && ! (inside_int && inter_int
8205                     && inter_unsignedp != inside_unsignedp
8206                     && inter_prec < final_prec)
8207               && ((inter_unsignedp && inter_prec > inside_prec)
8208                   == (final_unsignedp && final_prec > inter_prec))
8209               && ! (inside_ptr && inter_prec != final_prec)
8210               && ! (final_ptr && inside_prec != inter_prec)
8211               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8212                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
8213             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
8214         }
8215
8216       /* Handle (T *)&A.B.C for A being of type T and B and C
8217          living at offset zero.  This occurs frequently in
8218          C++ upcasting and then accessing the base.  */
8219       if (TREE_CODE (op0) == ADDR_EXPR
8220           && POINTER_TYPE_P (type)
8221           && handled_component_p (TREE_OPERAND (op0, 0)))
8222         {
8223           HOST_WIDE_INT bitsize, bitpos;
8224           tree offset;
8225           enum machine_mode mode;
8226           int unsignedp, volatilep;
8227           tree base = TREE_OPERAND (op0, 0);
8228           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
8229                                       &mode, &unsignedp, &volatilep, false);
8230           /* If the reference was to a (constant) zero offset, we can use
8231              the address of the base if it has the same base type
8232              as the result type.  */
8233           if (! offset && bitpos == 0
8234               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
8235                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
8236             return fold_convert (type, build_fold_addr_expr (base));
8237         }
8238
8239       if (TREE_CODE (op0) == MODIFY_EXPR
8240           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
8241           /* Detect assigning a bitfield.  */
8242           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
8243                && DECL_BIT_FIELD
8244                (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
8245         {
8246           /* Don't leave an assignment inside a conversion
8247              unless assigning a bitfield.  */
8248           tem = fold_build1 (code, type, TREE_OPERAND (op0, 1));
8249           /* First do the assignment, then return converted constant.  */
8250           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
8251           TREE_NO_WARNING (tem) = 1;
8252           TREE_USED (tem) = 1;
8253           return tem;
8254         }
8255
8256       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
8257          constants (if x has signed type, the sign bit cannot be set
8258          in c).  This folds extension into the BIT_AND_EXPR.
8259          ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
8260          very likely don't have maximal range for their precision and this
8261          transformation effectively doesn't preserve non-maximal ranges.  */
8262       if (TREE_CODE (type) == INTEGER_TYPE
8263           && TREE_CODE (op0) == BIT_AND_EXPR
8264           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST
8265           /* Not if the conversion is to the sub-type.  */
8266           && TREE_TYPE (type) != TREE_TYPE (op0))
8267         {
8268           tree and = op0;
8269           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
8270           int change = 0;
8271
8272           if (TYPE_UNSIGNED (TREE_TYPE (and))
8273               || (TYPE_PRECISION (type)
8274                   <= TYPE_PRECISION (TREE_TYPE (and))))
8275             change = 1;
8276           else if (TYPE_PRECISION (TREE_TYPE (and1))
8277                    <= HOST_BITS_PER_WIDE_INT
8278                    && host_integerp (and1, 1))
8279             {
8280               unsigned HOST_WIDE_INT cst;
8281
8282               cst = tree_low_cst (and1, 1);
8283               cst &= (HOST_WIDE_INT) -1
8284                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
8285               change = (cst == 0);
8286 #ifdef LOAD_EXTEND_OP
8287               if (change
8288                   && !flag_syntax_only
8289                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
8290                       == ZERO_EXTEND))
8291                 {
8292                   tree uns = unsigned_type_for (TREE_TYPE (and0));
8293                   and0 = fold_convert (uns, and0);
8294                   and1 = fold_convert (uns, and1);
8295                 }
8296 #endif
8297             }
8298           if (change)
8299             {
8300               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
8301                                            TREE_INT_CST_HIGH (and1), 0,
8302                                            TREE_OVERFLOW (and1));
8303               return fold_build2 (BIT_AND_EXPR, type,
8304                                   fold_convert (type, and0), tem);
8305             }
8306         }
8307
8308       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8309          when one of the new casts will fold away. Conservatively we assume
8310          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8311       if (POINTER_TYPE_P (type)
8312           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8313           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8314               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8315               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8316         {
8317           tree arg00 = TREE_OPERAND (arg0, 0);
8318           tree arg01 = TREE_OPERAND (arg0, 1);
8319
8320           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
8321                               fold_convert (sizetype, arg01));
8322         }
8323
8324       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8325          of the same precision, and X is an integer type not narrower than
8326          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
8327       if (INTEGRAL_TYPE_P (type)
8328           && TREE_CODE (op0) == BIT_NOT_EXPR
8329           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8330           && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8331           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8332         {
8333           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8334           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8335               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8336             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
8337         }
8338
8339       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8340          type of X and Y (integer types only).  */
8341       if (INTEGRAL_TYPE_P (type)
8342           && TREE_CODE (op0) == MULT_EXPR
8343           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8344           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8345         {
8346           /* Be careful not to introduce new overflows.  */
8347           tree mult_type;
8348           if (TYPE_OVERFLOW_WRAPS (type))
8349             mult_type = type;
8350           else
8351             mult_type = unsigned_type_for (type);
8352
8353           if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8354             {
8355               tem = fold_build2 (MULT_EXPR, mult_type,
8356                                  fold_convert (mult_type,
8357                                                TREE_OPERAND (op0, 0)),
8358                                  fold_convert (mult_type,
8359                                                TREE_OPERAND (op0, 1)));
8360               return fold_convert (type, tem);
8361             }
8362         }
8363
8364       tem = fold_convert_const (code, type, op0);
8365       return tem ? tem : NULL_TREE;
8366
8367     case FIXED_CONVERT_EXPR:
8368       tem = fold_convert_const (code, type, arg0);
8369       return tem ? tem : NULL_TREE;
8370
8371     case VIEW_CONVERT_EXPR:
8372       if (TREE_TYPE (op0) == type)
8373         return op0;
8374       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
8375         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
8376
8377       /* For integral conversions with the same precision or pointer
8378          conversions use a NOP_EXPR instead.  */
8379       if ((INTEGRAL_TYPE_P (type)
8380            || POINTER_TYPE_P (type))
8381           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8382               || POINTER_TYPE_P (TREE_TYPE (op0)))
8383           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
8384           /* Do not muck with VIEW_CONVERT_EXPRs that convert from
8385              a sub-type to its base type as generated by the Ada FE.  */
8386           && !(INTEGRAL_TYPE_P (TREE_TYPE (op0))
8387                && TREE_TYPE (TREE_TYPE (op0))))
8388         return fold_convert (type, op0);
8389
8390       /* Strip inner integral conversions that do not change the precision.  */
8391       if (CONVERT_EXPR_P (op0)
8392           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8393               || POINTER_TYPE_P (TREE_TYPE (op0)))
8394           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
8395               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
8396           && (TYPE_PRECISION (TREE_TYPE (op0))
8397               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
8398         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
8399
8400       return fold_view_convert_expr (type, op0);
8401
8402     case NEGATE_EXPR:
8403       tem = fold_negate_expr (arg0);
8404       if (tem)
8405         return fold_convert (type, tem);
8406       return NULL_TREE;
8407
8408     case ABS_EXPR:
8409       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8410         return fold_abs_const (arg0, type);
8411       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8412         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8413       /* Convert fabs((double)float) into (double)fabsf(float).  */
8414       else if (TREE_CODE (arg0) == NOP_EXPR
8415                && TREE_CODE (type) == REAL_TYPE)
8416         {
8417           tree targ0 = strip_float_extensions (arg0);
8418           if (targ0 != arg0)
8419             return fold_convert (type, fold_build1 (ABS_EXPR,
8420                                                     TREE_TYPE (targ0),
8421                                                     targ0));
8422         }
8423       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8424       else if (TREE_CODE (arg0) == ABS_EXPR)
8425         return arg0;
8426       else if (tree_expr_nonnegative_p (arg0))
8427         return arg0;
8428
8429       /* Strip sign ops from argument.  */
8430       if (TREE_CODE (type) == REAL_TYPE)
8431         {
8432           tem = fold_strip_sign_ops (arg0);
8433           if (tem)
8434             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
8435         }
8436       return NULL_TREE;
8437
8438     case CONJ_EXPR:
8439       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8440         return fold_convert (type, arg0);
8441       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8442         {
8443           tree itype = TREE_TYPE (type);
8444           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8445           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8446           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8447         }
8448       if (TREE_CODE (arg0) == COMPLEX_CST)
8449         {
8450           tree itype = TREE_TYPE (type);
8451           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8452           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8453           return build_complex (type, rpart, negate_expr (ipart));
8454         }
8455       if (TREE_CODE (arg0) == CONJ_EXPR)
8456         return fold_convert (type, TREE_OPERAND (arg0, 0));
8457       return NULL_TREE;
8458
8459     case BIT_NOT_EXPR:
8460       if (TREE_CODE (arg0) == INTEGER_CST)
8461         return fold_not_const (arg0, type);
8462       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8463         return fold_convert (type, TREE_OPERAND (arg0, 0));
8464       /* Convert ~ (-A) to A - 1.  */
8465       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8466         return fold_build2 (MINUS_EXPR, type,
8467                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8468                             build_int_cst (type, 1));
8469       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8470       else if (INTEGRAL_TYPE_P (type)
8471                && ((TREE_CODE (arg0) == MINUS_EXPR
8472                     && integer_onep (TREE_OPERAND (arg0, 1)))
8473                    || (TREE_CODE (arg0) == PLUS_EXPR
8474                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8475         return fold_build1 (NEGATE_EXPR, type,
8476                             fold_convert (type, TREE_OPERAND (arg0, 0)));
8477       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8478       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8479                && (tem = fold_unary (BIT_NOT_EXPR, type,
8480                                      fold_convert (type,
8481                                                    TREE_OPERAND (arg0, 0)))))
8482         return fold_build2 (BIT_XOR_EXPR, type, tem,
8483                             fold_convert (type, TREE_OPERAND (arg0, 1)));
8484       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8485                && (tem = fold_unary (BIT_NOT_EXPR, type,
8486                                      fold_convert (type,
8487                                                    TREE_OPERAND (arg0, 1)))))
8488         return fold_build2 (BIT_XOR_EXPR, type,
8489                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8490       /* Perform BIT_NOT_EXPR on each element individually.  */
8491       else if (TREE_CODE (arg0) == VECTOR_CST)
8492         {
8493           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8494           int count = TYPE_VECTOR_SUBPARTS (type), i;
8495
8496           for (i = 0; i < count; i++)
8497             {
8498               if (elements)
8499                 {
8500                   elem = TREE_VALUE (elements);
8501                   elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8502                   if (elem == NULL_TREE)
8503                     break;
8504                   elements = TREE_CHAIN (elements);
8505                 }
8506               else
8507                 elem = build_int_cst (TREE_TYPE (type), -1);
8508               list = tree_cons (NULL_TREE, elem, list);
8509             }
8510           if (i == count)
8511             return build_vector (type, nreverse (list));
8512         }
8513
8514       return NULL_TREE;
8515
8516     case TRUTH_NOT_EXPR:
8517       /* The argument to invert_truthvalue must have Boolean type.  */
8518       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8519           arg0 = fold_convert (boolean_type_node, arg0);
8520
8521       /* Note that the operand of this must be an int
8522          and its values must be 0 or 1.
8523          ("true" is a fixed value perhaps depending on the language,
8524          but we don't handle values other than 1 correctly yet.)  */
8525       tem = fold_truth_not_expr (arg0);
8526       if (!tem)
8527         return NULL_TREE;
8528       return fold_convert (type, tem);
8529
8530     case REALPART_EXPR:
8531       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8532         return fold_convert (type, arg0);
8533       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8534         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8535                                  TREE_OPERAND (arg0, 1));
8536       if (TREE_CODE (arg0) == COMPLEX_CST)
8537         return fold_convert (type, TREE_REALPART (arg0));
8538       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8539         {
8540           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8541           tem = fold_build2 (TREE_CODE (arg0), itype,
8542                              fold_build1 (REALPART_EXPR, itype,
8543                                           TREE_OPERAND (arg0, 0)),
8544                              fold_build1 (REALPART_EXPR, itype,
8545                                           TREE_OPERAND (arg0, 1)));
8546           return fold_convert (type, tem);
8547         }
8548       if (TREE_CODE (arg0) == CONJ_EXPR)
8549         {
8550           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8551           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8552           return fold_convert (type, tem);
8553         }
8554       if (TREE_CODE (arg0) == CALL_EXPR)
8555         {
8556           tree fn = get_callee_fndecl (arg0);
8557           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8558             switch (DECL_FUNCTION_CODE (fn))
8559               {
8560               CASE_FLT_FN (BUILT_IN_CEXPI):
8561                 fn = mathfn_built_in (type, BUILT_IN_COS);
8562                 if (fn)
8563                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8564                 break;
8565
8566               default:
8567                 break;
8568               }
8569         }
8570       return NULL_TREE;
8571
8572     case IMAGPART_EXPR:
8573       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8574         return fold_convert (type, integer_zero_node);
8575       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8576         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8577                                  TREE_OPERAND (arg0, 0));
8578       if (TREE_CODE (arg0) == COMPLEX_CST)
8579         return fold_convert (type, TREE_IMAGPART (arg0));
8580       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8581         {
8582           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8583           tem = fold_build2 (TREE_CODE (arg0), itype,
8584                              fold_build1 (IMAGPART_EXPR, itype,
8585                                           TREE_OPERAND (arg0, 0)),
8586                              fold_build1 (IMAGPART_EXPR, itype,
8587                                           TREE_OPERAND (arg0, 1)));
8588           return fold_convert (type, tem);
8589         }
8590       if (TREE_CODE (arg0) == CONJ_EXPR)
8591         {
8592           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8593           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8594           return fold_convert (type, negate_expr (tem));
8595         }
8596       if (TREE_CODE (arg0) == CALL_EXPR)
8597         {
8598           tree fn = get_callee_fndecl (arg0);
8599           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8600             switch (DECL_FUNCTION_CODE (fn))
8601               {
8602               CASE_FLT_FN (BUILT_IN_CEXPI):
8603                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8604                 if (fn)
8605                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8606                 break;
8607
8608               default:
8609                 break;
8610               }
8611         }
8612       return NULL_TREE;
8613
8614     default:
8615       return NULL_TREE;
8616     } /* switch (code) */
8617 }
8618
8619
8620 /* If the operation was a conversion do _not_ mark a resulting constant
8621    with TREE_OVERFLOW if the original constant was not.  These conversions
8622    have implementation defined behavior and retaining the TREE_OVERFLOW
8623    flag here would confuse later passes such as VRP.  */
8624 tree
8625 fold_unary_ignore_overflow (enum tree_code code, tree type, tree op0)
8626 {
8627   tree res = fold_unary (code, type, op0);
8628   if (res
8629       && TREE_CODE (res) == INTEGER_CST
8630       && TREE_CODE (op0) == INTEGER_CST
8631       && CONVERT_EXPR_CODE_P (code))
8632     TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8633
8634   return res;
8635 }
8636
8637 /* Fold a binary expression of code CODE and type TYPE with operands
8638    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8639    Return the folded expression if folding is successful.  Otherwise,
8640    return NULL_TREE.  */
8641
8642 static tree
8643 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8644 {
8645   enum tree_code compl_code;
8646
8647   if (code == MIN_EXPR)
8648     compl_code = MAX_EXPR;
8649   else if (code == MAX_EXPR)
8650     compl_code = MIN_EXPR;
8651   else
8652     gcc_unreachable ();
8653
8654   /* MIN (MAX (a, b), b) == b.  */
8655   if (TREE_CODE (op0) == compl_code
8656       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8657     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8658
8659   /* MIN (MAX (b, a), b) == b.  */
8660   if (TREE_CODE (op0) == compl_code
8661       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8662       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8663     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8664
8665   /* MIN (a, MAX (a, b)) == a.  */
8666   if (TREE_CODE (op1) == compl_code
8667       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8668       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8669     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8670
8671   /* MIN (a, MAX (b, a)) == a.  */
8672   if (TREE_CODE (op1) == compl_code
8673       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8674       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8675     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8676
8677   return NULL_TREE;
8678 }
8679
8680 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8681    by changing CODE to reduce the magnitude of constants involved in
8682    ARG0 of the comparison.
8683    Returns a canonicalized comparison tree if a simplification was
8684    possible, otherwise returns NULL_TREE.
8685    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8686    valid if signed overflow is undefined.  */
8687
8688 static tree
8689 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8690                                  tree arg0, tree arg1,
8691                                  bool *strict_overflow_p)
8692 {
8693   enum tree_code code0 = TREE_CODE (arg0);
8694   tree t, cst0 = NULL_TREE;
8695   int sgn0;
8696   bool swap = false;
8697
8698   /* Match A +- CST code arg1 and CST code arg1.  We can change the
8699      first form only if overflow is undefined.  */
8700   if (!((TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8701          /* In principle pointers also have undefined overflow behavior,
8702             but that causes problems elsewhere.  */
8703          && !POINTER_TYPE_P (TREE_TYPE (arg0))
8704          && (code0 == MINUS_EXPR
8705              || code0 == PLUS_EXPR)
8706          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8707         || code0 == INTEGER_CST))
8708     return NULL_TREE;
8709
8710   /* Identify the constant in arg0 and its sign.  */
8711   if (code0 == INTEGER_CST)
8712     cst0 = arg0;
8713   else
8714     cst0 = TREE_OPERAND (arg0, 1);
8715   sgn0 = tree_int_cst_sgn (cst0);
8716
8717   /* Overflowed constants and zero will cause problems.  */
8718   if (integer_zerop (cst0)
8719       || TREE_OVERFLOW (cst0))
8720     return NULL_TREE;
8721
8722   /* See if we can reduce the magnitude of the constant in
8723      arg0 by changing the comparison code.  */
8724   if (code0 == INTEGER_CST)
8725     {
8726       /* CST <= arg1  ->  CST-1 < arg1.  */
8727       if (code == LE_EXPR && sgn0 == 1)
8728         code = LT_EXPR;
8729       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8730       else if (code == LT_EXPR && sgn0 == -1)
8731         code = LE_EXPR;
8732       /* CST > arg1  ->  CST-1 >= arg1.  */
8733       else if (code == GT_EXPR && sgn0 == 1)
8734         code = GE_EXPR;
8735       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8736       else if (code == GE_EXPR && sgn0 == -1)
8737         code = GT_EXPR;
8738       else
8739         return NULL_TREE;
8740       /* arg1 code' CST' might be more canonical.  */
8741       swap = true;
8742     }
8743   else
8744     {
8745       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8746       if (code == LT_EXPR
8747           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8748         code = LE_EXPR;
8749       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8750       else if (code == GT_EXPR
8751                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8752         code = GE_EXPR;
8753       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8754       else if (code == LE_EXPR
8755                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8756         code = LT_EXPR;
8757       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8758       else if (code == GE_EXPR
8759                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8760         code = GT_EXPR;
8761       else
8762         return NULL_TREE;
8763       *strict_overflow_p = true;
8764     }
8765
8766   /* Now build the constant reduced in magnitude.  But not if that
8767      would produce one outside of its types range.  */
8768   if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
8769       && ((sgn0 == 1
8770            && TYPE_MIN_VALUE (TREE_TYPE (cst0))
8771            && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
8772           || (sgn0 == -1
8773               && TYPE_MAX_VALUE (TREE_TYPE (cst0))
8774               && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
8775     /* We cannot swap the comparison here as that would cause us to
8776        endlessly recurse.  */
8777     return NULL_TREE;
8778
8779   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8780                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8781   if (code0 != INTEGER_CST)
8782     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8783
8784   /* If swapping might yield to a more canonical form, do so.  */
8785   if (swap)
8786     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8787   else
8788     return fold_build2 (code, type, t, arg1);
8789 }
8790
8791 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8792    overflow further.  Try to decrease the magnitude of constants involved
8793    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8794    and put sole constants at the second argument position.
8795    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8796
8797 static tree
8798 maybe_canonicalize_comparison (enum tree_code code, tree type,
8799                                tree arg0, tree arg1)
8800 {
8801   tree t;
8802   bool strict_overflow_p;
8803   const char * const warnmsg = G_("assuming signed overflow does not occur "
8804                                   "when reducing constant in comparison");
8805
8806   /* Try canonicalization by simplifying arg0.  */
8807   strict_overflow_p = false;
8808   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8809                                        &strict_overflow_p);
8810   if (t)
8811     {
8812       if (strict_overflow_p)
8813         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8814       return t;
8815     }
8816
8817   /* Try canonicalization by simplifying arg1 using the swapped
8818      comparison.  */
8819   code = swap_tree_comparison (code);
8820   strict_overflow_p = false;
8821   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8822                                        &strict_overflow_p);
8823   if (t && strict_overflow_p)
8824     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8825   return t;
8826 }
8827
8828 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
8829    space.  This is used to avoid issuing overflow warnings for
8830    expressions like &p->x which can not wrap.  */
8831
8832 static bool
8833 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8834 {
8835   unsigned HOST_WIDE_INT offset_low, total_low;
8836   HOST_WIDE_INT size, offset_high, total_high;
8837
8838   if (!POINTER_TYPE_P (TREE_TYPE (base)))
8839     return true;
8840
8841   if (bitpos < 0)
8842     return true;
8843
8844   if (offset == NULL_TREE)
8845     {
8846       offset_low = 0;
8847       offset_high = 0;
8848     }
8849   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8850     return true;
8851   else
8852     {
8853       offset_low = TREE_INT_CST_LOW (offset);
8854       offset_high = TREE_INT_CST_HIGH (offset);
8855     }
8856
8857   if (add_double_with_sign (offset_low, offset_high,
8858                             bitpos / BITS_PER_UNIT, 0,
8859                             &total_low, &total_high,
8860                             true))
8861     return true;
8862
8863   if (total_high != 0)
8864     return true;
8865
8866   size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8867   if (size <= 0)
8868     return true;
8869
8870   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8871      array.  */
8872   if (TREE_CODE (base) == ADDR_EXPR)
8873     {
8874       HOST_WIDE_INT base_size;
8875
8876       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8877       if (base_size > 0 && size < base_size)
8878         size = base_size;
8879     }
8880
8881   return total_low > (unsigned HOST_WIDE_INT) size;
8882 }
8883
8884 /* Subroutine of fold_binary.  This routine performs all of the
8885    transformations that are common to the equality/inequality
8886    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8887    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8888    fold_binary should call fold_binary.  Fold a comparison with
8889    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8890    the folded comparison or NULL_TREE.  */
8891
8892 static tree
8893 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8894 {
8895   tree arg0, arg1, tem;
8896
8897   arg0 = op0;
8898   arg1 = op1;
8899
8900   STRIP_SIGN_NOPS (arg0);
8901   STRIP_SIGN_NOPS (arg1);
8902
8903   tem = fold_relational_const (code, type, arg0, arg1);
8904   if (tem != NULL_TREE)
8905     return tem;
8906
8907   /* If one arg is a real or integer constant, put it last.  */
8908   if (tree_swap_operands_p (arg0, arg1, true))
8909     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8910
8911   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8912   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8913       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8914           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8915           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8916       && (TREE_CODE (arg1) == INTEGER_CST
8917           && !TREE_OVERFLOW (arg1)))
8918     {
8919       tree const1 = TREE_OPERAND (arg0, 1);
8920       tree const2 = arg1;
8921       tree variable = TREE_OPERAND (arg0, 0);
8922       tree lhs;
8923       int lhs_add;
8924       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8925
8926       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8927                          TREE_TYPE (arg1), const2, const1);
8928
8929       /* If the constant operation overflowed this can be
8930          simplified as a comparison against INT_MAX/INT_MIN.  */
8931       if (TREE_CODE (lhs) == INTEGER_CST
8932           && TREE_OVERFLOW (lhs))
8933         {
8934           int const1_sgn = tree_int_cst_sgn (const1);
8935           enum tree_code code2 = code;
8936
8937           /* Get the sign of the constant on the lhs if the
8938              operation were VARIABLE + CONST1.  */
8939           if (TREE_CODE (arg0) == MINUS_EXPR)
8940             const1_sgn = -const1_sgn;
8941
8942           /* The sign of the constant determines if we overflowed
8943              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8944              Canonicalize to the INT_MIN overflow by swapping the comparison
8945              if necessary.  */
8946           if (const1_sgn == -1)
8947             code2 = swap_tree_comparison (code);
8948
8949           /* We now can look at the canonicalized case
8950                VARIABLE + 1  CODE2  INT_MIN
8951              and decide on the result.  */
8952           if (code2 == LT_EXPR
8953               || code2 == LE_EXPR
8954               || code2 == EQ_EXPR)
8955             return omit_one_operand (type, boolean_false_node, variable);
8956           else if (code2 == NE_EXPR
8957                    || code2 == GE_EXPR
8958                    || code2 == GT_EXPR)
8959             return omit_one_operand (type, boolean_true_node, variable);
8960         }
8961
8962       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8963           && (TREE_CODE (lhs) != INTEGER_CST
8964               || !TREE_OVERFLOW (lhs)))
8965         {
8966           fold_overflow_warning (("assuming signed overflow does not occur "
8967                                   "when changing X +- C1 cmp C2 to "
8968                                   "X cmp C1 +- C2"),
8969                                  WARN_STRICT_OVERFLOW_COMPARISON);
8970           return fold_build2 (code, type, variable, lhs);
8971         }
8972     }
8973
8974   /* For comparisons of pointers we can decompose it to a compile time
8975      comparison of the base objects and the offsets into the object.
8976      This requires at least one operand being an ADDR_EXPR or a
8977      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8978   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8979       && (TREE_CODE (arg0) == ADDR_EXPR
8980           || TREE_CODE (arg1) == ADDR_EXPR
8981           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8982           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8983     {
8984       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8985       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8986       enum machine_mode mode;
8987       int volatilep, unsignedp;
8988       bool indirect_base0 = false, indirect_base1 = false;
8989
8990       /* Get base and offset for the access.  Strip ADDR_EXPR for
8991          get_inner_reference, but put it back by stripping INDIRECT_REF
8992          off the base object if possible.  indirect_baseN will be true
8993          if baseN is not an address but refers to the object itself.  */
8994       base0 = arg0;
8995       if (TREE_CODE (arg0) == ADDR_EXPR)
8996         {
8997           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8998                                        &bitsize, &bitpos0, &offset0, &mode,
8999                                        &unsignedp, &volatilep, false);
9000           if (TREE_CODE (base0) == INDIRECT_REF)
9001             base0 = TREE_OPERAND (base0, 0);
9002           else
9003             indirect_base0 = true;
9004         }
9005       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9006         {
9007           base0 = TREE_OPERAND (arg0, 0);
9008           offset0 = TREE_OPERAND (arg0, 1);
9009         }
9010
9011       base1 = arg1;
9012       if (TREE_CODE (arg1) == ADDR_EXPR)
9013         {
9014           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
9015                                        &bitsize, &bitpos1, &offset1, &mode,
9016                                        &unsignedp, &volatilep, false);
9017           if (TREE_CODE (base1) == INDIRECT_REF)
9018             base1 = TREE_OPERAND (base1, 0);
9019           else
9020             indirect_base1 = true;
9021         }
9022       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9023         {
9024           base1 = TREE_OPERAND (arg1, 0);
9025           offset1 = TREE_OPERAND (arg1, 1);
9026         }
9027
9028       /* If we have equivalent bases we might be able to simplify.  */
9029       if (indirect_base0 == indirect_base1
9030           && operand_equal_p (base0, base1, 0))
9031         {
9032           /* We can fold this expression to a constant if the non-constant
9033              offset parts are equal.  */
9034           if ((offset0 == offset1
9035                || (offset0 && offset1
9036                    && operand_equal_p (offset0, offset1, 0)))
9037               && (code == EQ_EXPR
9038                   || code == NE_EXPR
9039                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
9040                 
9041             {
9042               if (code != EQ_EXPR
9043                   && code != NE_EXPR
9044                   && bitpos0 != bitpos1
9045                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9046                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9047                 fold_overflow_warning (("assuming pointer wraparound does not "
9048                                         "occur when comparing P +- C1 with "
9049                                         "P +- C2"),
9050                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
9051
9052               switch (code)
9053                 {
9054                 case EQ_EXPR:
9055                   return constant_boolean_node (bitpos0 == bitpos1, type);
9056                 case NE_EXPR:
9057                   return constant_boolean_node (bitpos0 != bitpos1, type);
9058                 case LT_EXPR:
9059                   return constant_boolean_node (bitpos0 < bitpos1, type);
9060                 case LE_EXPR:
9061                   return constant_boolean_node (bitpos0 <= bitpos1, type);
9062                 case GE_EXPR:
9063                   return constant_boolean_node (bitpos0 >= bitpos1, type);
9064                 case GT_EXPR:
9065                   return constant_boolean_node (bitpos0 > bitpos1, type);
9066                 default:;
9067                 }
9068             }
9069           /* We can simplify the comparison to a comparison of the variable
9070              offset parts if the constant offset parts are equal.
9071              Be careful to use signed size type here because otherwise we
9072              mess with array offsets in the wrong way.  This is possible
9073              because pointer arithmetic is restricted to retain within an
9074              object and overflow on pointer differences is undefined as of
9075              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
9076           else if (bitpos0 == bitpos1
9077                    && ((code == EQ_EXPR || code == NE_EXPR)
9078                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
9079             {
9080               tree signed_size_type_node;
9081               signed_size_type_node = signed_type_for (size_type_node);
9082
9083               /* By converting to signed size type we cover middle-end pointer
9084                  arithmetic which operates on unsigned pointer types of size
9085                  type size and ARRAY_REF offsets which are properly sign or
9086                  zero extended from their type in case it is narrower than
9087                  size type.  */
9088               if (offset0 == NULL_TREE)
9089                 offset0 = build_int_cst (signed_size_type_node, 0);
9090               else
9091                 offset0 = fold_convert (signed_size_type_node, offset0);
9092               if (offset1 == NULL_TREE)
9093                 offset1 = build_int_cst (signed_size_type_node, 0);
9094               else
9095                 offset1 = fold_convert (signed_size_type_node, offset1);
9096
9097               if (code != EQ_EXPR
9098                   && code != NE_EXPR
9099                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9100                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9101                 fold_overflow_warning (("assuming pointer wraparound does not "
9102                                         "occur when comparing P +- C1 with "
9103                                         "P +- C2"),
9104                                        WARN_STRICT_OVERFLOW_COMPARISON);
9105
9106               return fold_build2 (code, type, offset0, offset1);
9107             }
9108         }
9109       /* For non-equal bases we can simplify if they are addresses
9110          of local binding decls or constants.  */
9111       else if (indirect_base0 && indirect_base1
9112                /* We know that !operand_equal_p (base0, base1, 0)
9113                   because the if condition was false.  But make
9114                   sure two decls are not the same.  */
9115                && base0 != base1
9116                && TREE_CODE (arg0) == ADDR_EXPR
9117                && TREE_CODE (arg1) == ADDR_EXPR
9118                && (((TREE_CODE (base0) == VAR_DECL
9119                      || TREE_CODE (base0) == PARM_DECL)
9120                     && (targetm.binds_local_p (base0)
9121                         || CONSTANT_CLASS_P (base1)))
9122                    || CONSTANT_CLASS_P (base0))
9123                && (((TREE_CODE (base1) == VAR_DECL
9124                      || TREE_CODE (base1) == PARM_DECL)
9125                     && (targetm.binds_local_p (base1)
9126                         || CONSTANT_CLASS_P (base0)))
9127                    || CONSTANT_CLASS_P (base1)))
9128         {
9129           if (code == EQ_EXPR)
9130             return omit_two_operands (type, boolean_false_node, arg0, arg1);
9131           else if (code == NE_EXPR)
9132             return omit_two_operands (type, boolean_true_node, arg0, arg1);
9133         }
9134       /* For equal offsets we can simplify to a comparison of the
9135          base addresses.  */
9136       else if (bitpos0 == bitpos1
9137                && (indirect_base0
9138                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9139                && (indirect_base1
9140                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9141                && ((offset0 == offset1)
9142                    || (offset0 && offset1
9143                        && operand_equal_p (offset0, offset1, 0))))
9144         {
9145           if (indirect_base0)
9146             base0 = build_fold_addr_expr (base0);
9147           if (indirect_base1)
9148             base1 = build_fold_addr_expr (base1);
9149           return fold_build2 (code, type, base0, base1);
9150         }
9151     }
9152
9153   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9154      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
9155      the resulting offset is smaller in absolute value than the
9156      original one.  */
9157   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9158       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9159       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9160           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9161       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9162       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9163           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9164     {
9165       tree const1 = TREE_OPERAND (arg0, 1);
9166       tree const2 = TREE_OPERAND (arg1, 1);
9167       tree variable1 = TREE_OPERAND (arg0, 0);
9168       tree variable2 = TREE_OPERAND (arg1, 0);
9169       tree cst;
9170       const char * const warnmsg = G_("assuming signed overflow does not "
9171                                       "occur when combining constants around "
9172                                       "a comparison");
9173
9174       /* Put the constant on the side where it doesn't overflow and is
9175          of lower absolute value than before.  */
9176       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9177                              ? MINUS_EXPR : PLUS_EXPR,
9178                              const2, const1, 0);
9179       if (!TREE_OVERFLOW (cst)
9180           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
9181         {
9182           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9183           return fold_build2 (code, type,
9184                               variable1,
9185                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
9186                                            variable2, cst));
9187         }
9188
9189       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9190                              ? MINUS_EXPR : PLUS_EXPR,
9191                              const1, const2, 0);
9192       if (!TREE_OVERFLOW (cst)
9193           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
9194         {
9195           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9196           return fold_build2 (code, type,
9197                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
9198                                            variable1, cst),
9199                               variable2);
9200         }
9201     }
9202
9203   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9204      signed arithmetic case.  That form is created by the compiler
9205      often enough for folding it to be of value.  One example is in
9206      computing loop trip counts after Operator Strength Reduction.  */
9207   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9208       && TREE_CODE (arg0) == MULT_EXPR
9209       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9210           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9211       && integer_zerop (arg1))
9212     {
9213       tree const1 = TREE_OPERAND (arg0, 1);
9214       tree const2 = arg1;                       /* zero */
9215       tree variable1 = TREE_OPERAND (arg0, 0);
9216       enum tree_code cmp_code = code;
9217
9218       gcc_assert (!integer_zerop (const1));
9219
9220       fold_overflow_warning (("assuming signed overflow does not occur when "
9221                               "eliminating multiplication in comparison "
9222                               "with zero"),
9223                              WARN_STRICT_OVERFLOW_COMPARISON);
9224
9225       /* If const1 is negative we swap the sense of the comparison.  */
9226       if (tree_int_cst_sgn (const1) < 0)
9227         cmp_code = swap_tree_comparison (cmp_code);
9228
9229       return fold_build2 (cmp_code, type, variable1, const2);
9230     }
9231
9232   tem = maybe_canonicalize_comparison (code, type, op0, op1);
9233   if (tem)
9234     return tem;
9235
9236   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9237     {
9238       tree targ0 = strip_float_extensions (arg0);
9239       tree targ1 = strip_float_extensions (arg1);
9240       tree newtype = TREE_TYPE (targ0);
9241
9242       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9243         newtype = TREE_TYPE (targ1);
9244
9245       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9246       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9247         return fold_build2 (code, type, fold_convert (newtype, targ0),
9248                             fold_convert (newtype, targ1));
9249
9250       /* (-a) CMP (-b) -> b CMP a  */
9251       if (TREE_CODE (arg0) == NEGATE_EXPR
9252           && TREE_CODE (arg1) == NEGATE_EXPR)
9253         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
9254                             TREE_OPERAND (arg0, 0));
9255
9256       if (TREE_CODE (arg1) == REAL_CST)
9257         {
9258           REAL_VALUE_TYPE cst;
9259           cst = TREE_REAL_CST (arg1);
9260
9261           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
9262           if (TREE_CODE (arg0) == NEGATE_EXPR)
9263             return fold_build2 (swap_tree_comparison (code), type,
9264                                 TREE_OPERAND (arg0, 0),
9265                                 build_real (TREE_TYPE (arg1),
9266                                             REAL_VALUE_NEGATE (cst)));
9267
9268           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9269           /* a CMP (-0) -> a CMP 0  */
9270           if (REAL_VALUE_MINUS_ZERO (cst))
9271             return fold_build2 (code, type, arg0,
9272                                 build_real (TREE_TYPE (arg1), dconst0));
9273
9274           /* x != NaN is always true, other ops are always false.  */
9275           if (REAL_VALUE_ISNAN (cst)
9276               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
9277             {
9278               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9279               return omit_one_operand (type, tem, arg0);
9280             }
9281
9282           /* Fold comparisons against infinity.  */
9283           if (REAL_VALUE_ISINF (cst)
9284               && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9285             {
9286               tem = fold_inf_compare (code, type, arg0, arg1);
9287               if (tem != NULL_TREE)
9288                 return tem;
9289             }
9290         }
9291
9292       /* If this is a comparison of a real constant with a PLUS_EXPR
9293          or a MINUS_EXPR of a real constant, we can convert it into a
9294          comparison with a revised real constant as long as no overflow
9295          occurs when unsafe_math_optimizations are enabled.  */
9296       if (flag_unsafe_math_optimizations
9297           && TREE_CODE (arg1) == REAL_CST
9298           && (TREE_CODE (arg0) == PLUS_EXPR
9299               || TREE_CODE (arg0) == MINUS_EXPR)
9300           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9301           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9302                                       ? MINUS_EXPR : PLUS_EXPR,
9303                                       arg1, TREE_OPERAND (arg0, 1), 0))
9304           && !TREE_OVERFLOW (tem))
9305         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9306
9307       /* Likewise, we can simplify a comparison of a real constant with
9308          a MINUS_EXPR whose first operand is also a real constant, i.e.
9309          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
9310          floating-point types only if -fassociative-math is set.  */
9311       if (flag_associative_math
9312           && TREE_CODE (arg1) == REAL_CST
9313           && TREE_CODE (arg0) == MINUS_EXPR
9314           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9315           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9316                                       arg1, 0))
9317           && !TREE_OVERFLOW (tem))
9318         return fold_build2 (swap_tree_comparison (code), type,
9319                             TREE_OPERAND (arg0, 1), tem);
9320
9321       /* Fold comparisons against built-in math functions.  */
9322       if (TREE_CODE (arg1) == REAL_CST
9323           && flag_unsafe_math_optimizations
9324           && ! flag_errno_math)
9325         {
9326           enum built_in_function fcode = builtin_mathfn_code (arg0);
9327
9328           if (fcode != END_BUILTINS)
9329             {
9330               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
9331               if (tem != NULL_TREE)
9332                 return tem;
9333             }
9334         }
9335     }
9336
9337   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9338       && CONVERT_EXPR_P (arg0))
9339     {
9340       /* If we are widening one operand of an integer comparison,
9341          see if the other operand is similarly being widened.  Perhaps we
9342          can do the comparison in the narrower type.  */
9343       tem = fold_widened_comparison (code, type, arg0, arg1);
9344       if (tem)
9345         return tem;
9346
9347       /* Or if we are changing signedness.  */
9348       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
9349       if (tem)
9350         return tem;
9351     }
9352
9353   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9354      constant, we can simplify it.  */
9355   if (TREE_CODE (arg1) == INTEGER_CST
9356       && (TREE_CODE (arg0) == MIN_EXPR
9357           || TREE_CODE (arg0) == MAX_EXPR)
9358       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9359     {
9360       tem = optimize_minmax_comparison (code, type, op0, op1);
9361       if (tem)
9362         return tem;
9363     }
9364
9365   /* Simplify comparison of something with itself.  (For IEEE
9366      floating-point, we can only do some of these simplifications.)  */
9367   if (operand_equal_p (arg0, arg1, 0))
9368     {
9369       switch (code)
9370         {
9371         case EQ_EXPR:
9372           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9373               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9374             return constant_boolean_node (1, type);
9375           break;
9376
9377         case GE_EXPR:
9378         case LE_EXPR:
9379           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9380               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9381             return constant_boolean_node (1, type);
9382           return fold_build2 (EQ_EXPR, type, arg0, arg1);
9383
9384         case NE_EXPR:
9385           /* For NE, we can only do this simplification if integer
9386              or we don't honor IEEE floating point NaNs.  */
9387           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9388               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9389             break;
9390           /* ... fall through ...  */
9391         case GT_EXPR:
9392         case LT_EXPR:
9393           return constant_boolean_node (0, type);
9394         default:
9395           gcc_unreachable ();
9396         }
9397     }
9398
9399   /* If we are comparing an expression that just has comparisons
9400      of two integer values, arithmetic expressions of those comparisons,
9401      and constants, we can simplify it.  There are only three cases
9402      to check: the two values can either be equal, the first can be
9403      greater, or the second can be greater.  Fold the expression for
9404      those three values.  Since each value must be 0 or 1, we have
9405      eight possibilities, each of which corresponds to the constant 0
9406      or 1 or one of the six possible comparisons.
9407
9408      This handles common cases like (a > b) == 0 but also handles
9409      expressions like  ((x > y) - (y > x)) > 0, which supposedly
9410      occur in macroized code.  */
9411
9412   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9413     {
9414       tree cval1 = 0, cval2 = 0;
9415       int save_p = 0;
9416
9417       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9418           /* Don't handle degenerate cases here; they should already
9419              have been handled anyway.  */
9420           && cval1 != 0 && cval2 != 0
9421           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9422           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9423           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9424           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9425           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9426           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9427                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9428         {
9429           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9430           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9431
9432           /* We can't just pass T to eval_subst in case cval1 or cval2
9433              was the same as ARG1.  */
9434
9435           tree high_result
9436                 = fold_build2 (code, type,
9437                                eval_subst (arg0, cval1, maxval,
9438                                            cval2, minval),
9439                                arg1);
9440           tree equal_result
9441                 = fold_build2 (code, type,
9442                                eval_subst (arg0, cval1, maxval,
9443                                            cval2, maxval),
9444                                arg1);
9445           tree low_result
9446                 = fold_build2 (code, type,
9447                                eval_subst (arg0, cval1, minval,
9448                                            cval2, maxval),
9449                                arg1);
9450
9451           /* All three of these results should be 0 or 1.  Confirm they are.
9452              Then use those values to select the proper code to use.  */
9453
9454           if (TREE_CODE (high_result) == INTEGER_CST
9455               && TREE_CODE (equal_result) == INTEGER_CST
9456               && TREE_CODE (low_result) == INTEGER_CST)
9457             {
9458               /* Make a 3-bit mask with the high-order bit being the
9459                  value for `>', the next for '=', and the low for '<'.  */
9460               switch ((integer_onep (high_result) * 4)
9461                       + (integer_onep (equal_result) * 2)
9462                       + integer_onep (low_result))
9463                 {
9464                 case 0:
9465                   /* Always false.  */
9466                   return omit_one_operand (type, integer_zero_node, arg0);
9467                 case 1:
9468                   code = LT_EXPR;
9469                   break;
9470                 case 2:
9471                   code = EQ_EXPR;
9472                   break;
9473                 case 3:
9474                   code = LE_EXPR;
9475                   break;
9476                 case 4:
9477                   code = GT_EXPR;
9478                   break;
9479                 case 5:
9480                   code = NE_EXPR;
9481                   break;
9482                 case 6:
9483                   code = GE_EXPR;
9484                   break;
9485                 case 7:
9486                   /* Always true.  */
9487                   return omit_one_operand (type, integer_one_node, arg0);
9488                 }
9489
9490               if (save_p)
9491                 return save_expr (build2 (code, type, cval1, cval2));
9492               return fold_build2 (code, type, cval1, cval2);
9493             }
9494         }
9495     }
9496
9497   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9498      into a single range test.  */
9499   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9500        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9501       && TREE_CODE (arg1) == INTEGER_CST
9502       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9503       && !integer_zerop (TREE_OPERAND (arg0, 1))
9504       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9505       && !TREE_OVERFLOW (arg1))
9506     {
9507       tem = fold_div_compare (code, type, arg0, arg1);
9508       if (tem != NULL_TREE)
9509         return tem;
9510     }
9511
9512   /* Fold ~X op ~Y as Y op X.  */
9513   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9514       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9515     {
9516       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9517       return fold_build2 (code, type,
9518                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
9519                           TREE_OPERAND (arg0, 0));
9520     }
9521
9522   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9523   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9524       && TREE_CODE (arg1) == INTEGER_CST)
9525     {
9526       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9527       return fold_build2 (swap_tree_comparison (code), type,
9528                           TREE_OPERAND (arg0, 0),
9529                           fold_build1 (BIT_NOT_EXPR, cmp_type,
9530                                        fold_convert (cmp_type, arg1)));
9531     }
9532
9533   return NULL_TREE;
9534 }
9535
9536
9537 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9538    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9539    argument EXPR represents the expression "z" of type TYPE.  */
9540
9541 static tree
9542 fold_mult_zconjz (tree type, tree expr)
9543 {
9544   tree itype = TREE_TYPE (type);
9545   tree rpart, ipart, tem;
9546
9547   if (TREE_CODE (expr) == COMPLEX_EXPR)
9548     {
9549       rpart = TREE_OPERAND (expr, 0);
9550       ipart = TREE_OPERAND (expr, 1);
9551     }
9552   else if (TREE_CODE (expr) == COMPLEX_CST)
9553     {
9554       rpart = TREE_REALPART (expr);
9555       ipart = TREE_IMAGPART (expr);
9556     }
9557   else
9558     {
9559       expr = save_expr (expr);
9560       rpart = fold_build1 (REALPART_EXPR, itype, expr);
9561       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
9562     }
9563
9564   rpart = save_expr (rpart);
9565   ipart = save_expr (ipart);
9566   tem = fold_build2 (PLUS_EXPR, itype,
9567                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
9568                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
9569   return fold_build2 (COMPLEX_EXPR, type, tem,
9570                       fold_convert (itype, integer_zero_node));
9571 }
9572
9573
9574 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9575    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9576    guarantees that P and N have the same least significant log2(M) bits.
9577    N is not otherwise constrained.  In particular, N is not normalized to
9578    0 <= N < M as is common.  In general, the precise value of P is unknown.
9579    M is chosen as large as possible such that constant N can be determined.
9580
9581    Returns M and sets *RESIDUE to N.
9582
9583    If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9584    account.  This is not always possible due to PR 35705.
9585  */
9586
9587 static unsigned HOST_WIDE_INT
9588 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9589                                  bool allow_func_align)
9590 {
9591   enum tree_code code;
9592
9593   *residue = 0;
9594
9595   code = TREE_CODE (expr);
9596   if (code == ADDR_EXPR)
9597     {
9598       expr = TREE_OPERAND (expr, 0);
9599       if (handled_component_p (expr))
9600         {
9601           HOST_WIDE_INT bitsize, bitpos;
9602           tree offset;
9603           enum machine_mode mode;
9604           int unsignedp, volatilep;
9605
9606           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9607                                       &mode, &unsignedp, &volatilep, false);
9608           *residue = bitpos / BITS_PER_UNIT;
9609           if (offset)
9610             {
9611               if (TREE_CODE (offset) == INTEGER_CST)
9612                 *residue += TREE_INT_CST_LOW (offset);
9613               else
9614                 /* We don't handle more complicated offset expressions.  */
9615                 return 1;
9616             }
9617         }
9618
9619       if (DECL_P (expr)
9620           && (allow_func_align || TREE_CODE (expr) != FUNCTION_DECL))
9621         return DECL_ALIGN_UNIT (expr);
9622     }
9623   else if (code == POINTER_PLUS_EXPR)
9624     {
9625       tree op0, op1;
9626       unsigned HOST_WIDE_INT modulus;
9627       enum tree_code inner_code;
9628       
9629       op0 = TREE_OPERAND (expr, 0);
9630       STRIP_NOPS (op0);
9631       modulus = get_pointer_modulus_and_residue (op0, residue,
9632                                                  allow_func_align);
9633
9634       op1 = TREE_OPERAND (expr, 1);
9635       STRIP_NOPS (op1);
9636       inner_code = TREE_CODE (op1);
9637       if (inner_code == INTEGER_CST)
9638         {
9639           *residue += TREE_INT_CST_LOW (op1);
9640           return modulus;
9641         }
9642       else if (inner_code == MULT_EXPR)
9643         {
9644           op1 = TREE_OPERAND (op1, 1);
9645           if (TREE_CODE (op1) == INTEGER_CST)
9646             {
9647               unsigned HOST_WIDE_INT align;
9648               
9649               /* Compute the greatest power-of-2 divisor of op1.  */
9650               align = TREE_INT_CST_LOW (op1);
9651               align &= -align;
9652
9653               /* If align is non-zero and less than *modulus, replace
9654                  *modulus with align., If align is 0, then either op1 is 0
9655                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9656                  unsigned HOST_WIDE_INT.  In either case, no additional
9657                  constraint is imposed.  */
9658               if (align)
9659                 modulus = MIN (modulus, align);
9660
9661               return modulus;
9662             }
9663         }
9664     }
9665
9666     /* If we get here, we were unable to determine anything useful about the
9667        expression.  */
9668     return 1;
9669 }
9670
9671
9672 /* Fold a binary expression of code CODE and type TYPE with operands
9673    OP0 and OP1.  Return the folded expression if folding is
9674    successful.  Otherwise, return NULL_TREE.  */
9675
9676 tree
9677 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9678 {
9679   enum tree_code_class kind = TREE_CODE_CLASS (code);
9680   tree arg0, arg1, tem;
9681   tree t1 = NULL_TREE;
9682   bool strict_overflow_p;
9683
9684   gcc_assert (IS_EXPR_CODE_CLASS (kind)
9685               && TREE_CODE_LENGTH (code) == 2
9686               && op0 != NULL_TREE
9687               && op1 != NULL_TREE);
9688
9689   arg0 = op0;
9690   arg1 = op1;
9691
9692   /* Strip any conversions that don't change the mode.  This is
9693      safe for every expression, except for a comparison expression
9694      because its signedness is derived from its operands.  So, in
9695      the latter case, only strip conversions that don't change the
9696      signedness.  MIN_EXPR/MAX_EXPR also need signedness of arguments
9697      preserved.
9698
9699      Note that this is done as an internal manipulation within the
9700      constant folder, in order to find the simplest representation
9701      of the arguments so that their form can be studied.  In any
9702      cases, the appropriate type conversions should be put back in
9703      the tree that will get out of the constant folder.  */
9704
9705   if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
9706     {
9707       STRIP_SIGN_NOPS (arg0);
9708       STRIP_SIGN_NOPS (arg1);
9709     }
9710   else
9711     {
9712       STRIP_NOPS (arg0);
9713       STRIP_NOPS (arg1);
9714     }
9715
9716   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9717      constant but we can't do arithmetic on them.  */
9718   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9719       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9720       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9721       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9722       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9723       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9724     {
9725       if (kind == tcc_binary)
9726         {
9727           /* Make sure type and arg0 have the same saturating flag.  */
9728           gcc_assert (TYPE_SATURATING (type)
9729                       == TYPE_SATURATING (TREE_TYPE (arg0)));
9730           tem = const_binop (code, arg0, arg1, 0);
9731         }
9732       else if (kind == tcc_comparison)
9733         tem = fold_relational_const (code, type, arg0, arg1);
9734       else
9735         tem = NULL_TREE;
9736
9737       if (tem != NULL_TREE)
9738         {
9739           if (TREE_TYPE (tem) != type)
9740             tem = fold_convert (type, tem);
9741           return tem;
9742         }
9743     }
9744
9745   /* If this is a commutative operation, and ARG0 is a constant, move it
9746      to ARG1 to reduce the number of tests below.  */
9747   if (commutative_tree_code (code)
9748       && tree_swap_operands_p (arg0, arg1, true))
9749     return fold_build2 (code, type, op1, op0);
9750
9751   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9752
9753      First check for cases where an arithmetic operation is applied to a
9754      compound, conditional, or comparison operation.  Push the arithmetic
9755      operation inside the compound or conditional to see if any folding
9756      can then be done.  Convert comparison to conditional for this purpose.
9757      The also optimizes non-constant cases that used to be done in
9758      expand_expr.
9759
9760      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9761      one of the operands is a comparison and the other is a comparison, a
9762      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9763      code below would make the expression more complex.  Change it to a
9764      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9765      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9766
9767   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9768        || code == EQ_EXPR || code == NE_EXPR)
9769       && ((truth_value_p (TREE_CODE (arg0))
9770            && (truth_value_p (TREE_CODE (arg1))
9771                || (TREE_CODE (arg1) == BIT_AND_EXPR
9772                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9773           || (truth_value_p (TREE_CODE (arg1))
9774               && (truth_value_p (TREE_CODE (arg0))
9775                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9776                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9777     {
9778       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9779                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9780                          : TRUTH_XOR_EXPR,
9781                          boolean_type_node,
9782                          fold_convert (boolean_type_node, arg0),
9783                          fold_convert (boolean_type_node, arg1));
9784
9785       if (code == EQ_EXPR)
9786         tem = invert_truthvalue (tem);
9787
9788       return fold_convert (type, tem);
9789     }
9790
9791   if (TREE_CODE_CLASS (code) == tcc_binary
9792       || TREE_CODE_CLASS (code) == tcc_comparison)
9793     {
9794       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9795         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9796                        fold_build2 (code, type,
9797                                     fold_convert (TREE_TYPE (op0),
9798                                                   TREE_OPERAND (arg0, 1)),
9799                                     op1));
9800       if (TREE_CODE (arg1) == COMPOUND_EXPR
9801           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9802         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9803                        fold_build2 (code, type, op0,
9804                                     fold_convert (TREE_TYPE (op1),
9805                                                   TREE_OPERAND (arg1, 1))));
9806
9807       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9808         {
9809           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9810                                                      arg0, arg1, 
9811                                                      /*cond_first_p=*/1);
9812           if (tem != NULL_TREE)
9813             return tem;
9814         }
9815
9816       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9817         {
9818           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9819                                                      arg1, arg0, 
9820                                                      /*cond_first_p=*/0);
9821           if (tem != NULL_TREE)
9822             return tem;
9823         }
9824     }
9825
9826   switch (code)
9827     {
9828     case POINTER_PLUS_EXPR:
9829       /* 0 +p index -> (type)index */
9830       if (integer_zerop (arg0))
9831         return non_lvalue (fold_convert (type, arg1));
9832
9833       /* PTR +p 0 -> PTR */
9834       if (integer_zerop (arg1))
9835         return non_lvalue (fold_convert (type, arg0));
9836
9837       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
9838       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9839            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9840         return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9841                                                 fold_convert (sizetype, arg1),
9842                                                 fold_convert (sizetype, arg0)));
9843
9844       /* index +p PTR -> PTR +p index */
9845       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9846           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9847         return fold_build2 (POINTER_PLUS_EXPR, type,
9848                             fold_convert (type, arg1),
9849                             fold_convert (sizetype, arg0));
9850
9851       /* (PTR +p B) +p A -> PTR +p (B + A) */
9852       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9853         {
9854           tree inner;
9855           tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9856           tree arg00 = TREE_OPERAND (arg0, 0);
9857           inner = fold_build2 (PLUS_EXPR, sizetype,
9858                                arg01, fold_convert (sizetype, arg1));
9859           return fold_convert (type,
9860                                fold_build2 (POINTER_PLUS_EXPR,
9861                                             TREE_TYPE (arg00), arg00, inner));
9862         }
9863
9864       /* PTR_CST +p CST -> CST1 */
9865       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9866         return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9867
9868      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9869         of the array.  Loop optimizer sometimes produce this type of
9870         expressions.  */
9871       if (TREE_CODE (arg0) == ADDR_EXPR)
9872         {
9873           tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9874           if (tem)
9875             return fold_convert (type, tem);
9876         }
9877
9878       return NULL_TREE;
9879
9880     case PLUS_EXPR:
9881       /* A + (-B) -> A - B */
9882       if (TREE_CODE (arg1) == NEGATE_EXPR)
9883         return fold_build2 (MINUS_EXPR, type,
9884                             fold_convert (type, arg0),
9885                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9886       /* (-A) + B -> B - A */
9887       if (TREE_CODE (arg0) == NEGATE_EXPR
9888           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9889         return fold_build2 (MINUS_EXPR, type,
9890                             fold_convert (type, arg1),
9891                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9892
9893       if (INTEGRAL_TYPE_P (type))
9894         {
9895           /* Convert ~A + 1 to -A.  */
9896           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9897               && integer_onep (arg1))
9898             return fold_build1 (NEGATE_EXPR, type,
9899                                 fold_convert (type, TREE_OPERAND (arg0, 0)));
9900
9901           /* ~X + X is -1.  */
9902           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9903               && !TYPE_OVERFLOW_TRAPS (type))
9904             {
9905               tree tem = TREE_OPERAND (arg0, 0);
9906
9907               STRIP_NOPS (tem);
9908               if (operand_equal_p (tem, arg1, 0))
9909                 {
9910                   t1 = build_int_cst_type (type, -1);
9911                   return omit_one_operand (type, t1, arg1);
9912                 }
9913             }
9914
9915           /* X + ~X is -1.  */
9916           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9917               && !TYPE_OVERFLOW_TRAPS (type))
9918             {
9919               tree tem = TREE_OPERAND (arg1, 0);
9920
9921               STRIP_NOPS (tem);
9922               if (operand_equal_p (arg0, tem, 0))
9923                 {
9924                   t1 = build_int_cst_type (type, -1);
9925                   return omit_one_operand (type, t1, arg0);
9926                 }
9927             }
9928
9929           /* X + (X / CST) * -CST is X % CST.  */
9930           if (TREE_CODE (arg1) == MULT_EXPR
9931               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9932               && operand_equal_p (arg0,
9933                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9934             {
9935               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9936               tree cst1 = TREE_OPERAND (arg1, 1);
9937               tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9938               if (sum && integer_zerop (sum))
9939                 return fold_convert (type,
9940                                      fold_build2 (TRUNC_MOD_EXPR,
9941                                                   TREE_TYPE (arg0), arg0, cst0));
9942             }
9943         }
9944
9945       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9946          same or one.  Make sure type is not saturating.
9947          fold_plusminus_mult_expr will re-associate.  */
9948       if ((TREE_CODE (arg0) == MULT_EXPR
9949            || TREE_CODE (arg1) == MULT_EXPR)
9950           && !TYPE_SATURATING (type)
9951           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9952         {
9953           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9954           if (tem)
9955             return tem;
9956         }
9957
9958       if (! FLOAT_TYPE_P (type))
9959         {
9960           if (integer_zerop (arg1))
9961             return non_lvalue (fold_convert (type, arg0));
9962
9963           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9964              with a constant, and the two constants have no bits in common,
9965              we should treat this as a BIT_IOR_EXPR since this may produce more
9966              simplifications.  */
9967           if (TREE_CODE (arg0) == BIT_AND_EXPR
9968               && TREE_CODE (arg1) == BIT_AND_EXPR
9969               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9970               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9971               && integer_zerop (const_binop (BIT_AND_EXPR,
9972                                              TREE_OPERAND (arg0, 1),
9973                                              TREE_OPERAND (arg1, 1), 0)))
9974             {
9975               code = BIT_IOR_EXPR;
9976               goto bit_ior;
9977             }
9978
9979           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9980              (plus (plus (mult) (mult)) (foo)) so that we can
9981              take advantage of the factoring cases below.  */
9982           if (((TREE_CODE (arg0) == PLUS_EXPR
9983                 || TREE_CODE (arg0) == MINUS_EXPR)
9984                && TREE_CODE (arg1) == MULT_EXPR)
9985               || ((TREE_CODE (arg1) == PLUS_EXPR
9986                    || TREE_CODE (arg1) == MINUS_EXPR)
9987                   && TREE_CODE (arg0) == MULT_EXPR))
9988             {
9989               tree parg0, parg1, parg, marg;
9990               enum tree_code pcode;
9991
9992               if (TREE_CODE (arg1) == MULT_EXPR)
9993                 parg = arg0, marg = arg1;
9994               else
9995                 parg = arg1, marg = arg0;
9996               pcode = TREE_CODE (parg);
9997               parg0 = TREE_OPERAND (parg, 0);
9998               parg1 = TREE_OPERAND (parg, 1);
9999               STRIP_NOPS (parg0);
10000               STRIP_NOPS (parg1);
10001
10002               if (TREE_CODE (parg0) == MULT_EXPR
10003                   && TREE_CODE (parg1) != MULT_EXPR)
10004                 return fold_build2 (pcode, type,
10005                                     fold_build2 (PLUS_EXPR, type,
10006                                                  fold_convert (type, parg0),
10007                                                  fold_convert (type, marg)),
10008                                     fold_convert (type, parg1));
10009               if (TREE_CODE (parg0) != MULT_EXPR
10010                   && TREE_CODE (parg1) == MULT_EXPR)
10011                 return fold_build2 (PLUS_EXPR, type,
10012                                     fold_convert (type, parg0),
10013                                     fold_build2 (pcode, type,
10014                                                  fold_convert (type, marg),
10015                                                  fold_convert (type,
10016                                                                parg1)));
10017             }
10018         }
10019       else
10020         {
10021           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
10022           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
10023             return non_lvalue (fold_convert (type, arg0));
10024
10025           /* Likewise if the operands are reversed.  */
10026           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10027             return non_lvalue (fold_convert (type, arg1));
10028
10029           /* Convert X + -C into X - C.  */
10030           if (TREE_CODE (arg1) == REAL_CST
10031               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
10032             {
10033               tem = fold_negate_const (arg1, type);
10034               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
10035                 return fold_build2 (MINUS_EXPR, type,
10036                                     fold_convert (type, arg0),
10037                                     fold_convert (type, tem));
10038             }
10039
10040           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10041              to __complex__ ( x, y ).  This is not the same for SNaNs or
10042              if signed zeros are involved.  */
10043           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10044               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10045               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10046             {
10047               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10048               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
10049               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
10050               bool arg0rz = false, arg0iz = false;
10051               if ((arg0r && (arg0rz = real_zerop (arg0r)))
10052                   || (arg0i && (arg0iz = real_zerop (arg0i))))
10053                 {
10054                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
10055                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
10056                   if (arg0rz && arg1i && real_zerop (arg1i))
10057                     {
10058                       tree rp = arg1r ? arg1r
10059                                   : build1 (REALPART_EXPR, rtype, arg1);
10060                       tree ip = arg0i ? arg0i
10061                                   : build1 (IMAGPART_EXPR, rtype, arg0);
10062                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10063                     }
10064                   else if (arg0iz && arg1r && real_zerop (arg1r))
10065                     {
10066                       tree rp = arg0r ? arg0r
10067                                   : build1 (REALPART_EXPR, rtype, arg0);
10068                       tree ip = arg1i ? arg1i
10069                                   : build1 (IMAGPART_EXPR, rtype, arg1);
10070                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10071                     }
10072                 }
10073             }
10074
10075           if (flag_unsafe_math_optimizations
10076               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10077               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10078               && (tem = distribute_real_division (code, type, arg0, arg1)))
10079             return tem;
10080
10081           /* Convert x+x into x*2.0.  */
10082           if (operand_equal_p (arg0, arg1, 0)
10083               && SCALAR_FLOAT_TYPE_P (type))
10084             return fold_build2 (MULT_EXPR, type, arg0,
10085                                 build_real (type, dconst2));
10086
10087           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
10088              We associate floats only if the user has specified
10089              -fassociative-math.  */
10090           if (flag_associative_math
10091               && TREE_CODE (arg1) == PLUS_EXPR
10092               && TREE_CODE (arg0) != MULT_EXPR)
10093             {
10094               tree tree10 = TREE_OPERAND (arg1, 0);
10095               tree tree11 = TREE_OPERAND (arg1, 1);
10096               if (TREE_CODE (tree11) == MULT_EXPR
10097                   && TREE_CODE (tree10) == MULT_EXPR)
10098                 {
10099                   tree tree0;
10100                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
10101                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
10102                 }
10103             }
10104           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
10105              We associate floats only if the user has specified
10106              -fassociative-math.  */
10107           if (flag_associative_math
10108               && TREE_CODE (arg0) == PLUS_EXPR
10109               && TREE_CODE (arg1) != MULT_EXPR)
10110             {
10111               tree tree00 = TREE_OPERAND (arg0, 0);
10112               tree tree01 = TREE_OPERAND (arg0, 1);
10113               if (TREE_CODE (tree01) == MULT_EXPR
10114                   && TREE_CODE (tree00) == MULT_EXPR)
10115                 {
10116                   tree tree0;
10117                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
10118                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
10119                 }
10120             }
10121         }
10122
10123      bit_rotate:
10124       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10125          is a rotate of A by C1 bits.  */
10126       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10127          is a rotate of A by B bits.  */
10128       {
10129         enum tree_code code0, code1;
10130         tree rtype;
10131         code0 = TREE_CODE (arg0);
10132         code1 = TREE_CODE (arg1);
10133         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10134              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10135             && operand_equal_p (TREE_OPERAND (arg0, 0),
10136                                 TREE_OPERAND (arg1, 0), 0)
10137             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10138                 TYPE_UNSIGNED (rtype))
10139             /* Only create rotates in complete modes.  Other cases are not
10140                expanded properly.  */
10141             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
10142           {
10143             tree tree01, tree11;
10144             enum tree_code code01, code11;
10145
10146             tree01 = TREE_OPERAND (arg0, 1);
10147             tree11 = TREE_OPERAND (arg1, 1);
10148             STRIP_NOPS (tree01);
10149             STRIP_NOPS (tree11);
10150             code01 = TREE_CODE (tree01);
10151             code11 = TREE_CODE (tree11);
10152             if (code01 == INTEGER_CST
10153                 && code11 == INTEGER_CST
10154                 && TREE_INT_CST_HIGH (tree01) == 0
10155                 && TREE_INT_CST_HIGH (tree11) == 0
10156                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
10157                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10158               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
10159                              code0 == LSHIFT_EXPR ? tree01 : tree11);
10160             else if (code11 == MINUS_EXPR)
10161               {
10162                 tree tree110, tree111;
10163                 tree110 = TREE_OPERAND (tree11, 0);
10164                 tree111 = TREE_OPERAND (tree11, 1);
10165                 STRIP_NOPS (tree110);
10166                 STRIP_NOPS (tree111);
10167                 if (TREE_CODE (tree110) == INTEGER_CST
10168                     && 0 == compare_tree_int (tree110,
10169                                               TYPE_PRECISION
10170                                               (TREE_TYPE (TREE_OPERAND
10171                                                           (arg0, 0))))
10172                     && operand_equal_p (tree01, tree111, 0))
10173                   return build2 ((code0 == LSHIFT_EXPR
10174                                   ? LROTATE_EXPR
10175                                   : RROTATE_EXPR),
10176                                  type, TREE_OPERAND (arg0, 0), tree01);
10177               }
10178             else if (code01 == MINUS_EXPR)
10179               {
10180                 tree tree010, tree011;
10181                 tree010 = TREE_OPERAND (tree01, 0);
10182                 tree011 = TREE_OPERAND (tree01, 1);
10183                 STRIP_NOPS (tree010);
10184                 STRIP_NOPS (tree011);
10185                 if (TREE_CODE (tree010) == INTEGER_CST
10186                     && 0 == compare_tree_int (tree010,
10187                                               TYPE_PRECISION
10188                                               (TREE_TYPE (TREE_OPERAND
10189                                                           (arg0, 0))))
10190                     && operand_equal_p (tree11, tree011, 0))
10191                   return build2 ((code0 != LSHIFT_EXPR
10192                                   ? LROTATE_EXPR
10193                                   : RROTATE_EXPR),
10194                                  type, TREE_OPERAND (arg0, 0), tree11);
10195               }
10196           }
10197       }
10198
10199     associate:
10200       /* In most languages, can't associate operations on floats through
10201          parentheses.  Rather than remember where the parentheses were, we
10202          don't associate floats at all, unless the user has specified
10203          -fassociative-math.
10204          And, we need to make sure type is not saturating.  */
10205
10206       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10207           && !TYPE_SATURATING (type))
10208         {
10209           tree var0, con0, lit0, minus_lit0;
10210           tree var1, con1, lit1, minus_lit1;
10211           bool ok = true;
10212
10213           /* Split both trees into variables, constants, and literals.  Then
10214              associate each group together, the constants with literals,
10215              then the result with variables.  This increases the chances of
10216              literals being recombined later and of generating relocatable
10217              expressions for the sum of a constant and literal.  */
10218           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
10219           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
10220                              code == MINUS_EXPR);
10221
10222           /* With undefined overflow we can only associate constants
10223              with one variable.  */
10224           if (((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10225                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10226               && var0 && var1)
10227             {
10228               tree tmp0 = var0;
10229               tree tmp1 = var1;
10230
10231               if (TREE_CODE (tmp0) == NEGATE_EXPR)
10232                 tmp0 = TREE_OPERAND (tmp0, 0);
10233               if (TREE_CODE (tmp1) == NEGATE_EXPR)
10234                 tmp1 = TREE_OPERAND (tmp1, 0);
10235               /* The only case we can still associate with two variables
10236                  is if they are the same, modulo negation.  */
10237               if (!operand_equal_p (tmp0, tmp1, 0))
10238                 ok = false;
10239             }
10240
10241           /* Only do something if we found more than two objects.  Otherwise,
10242              nothing has changed and we risk infinite recursion.  */
10243           if (ok
10244               && (2 < ((var0 != 0) + (var1 != 0)
10245                        + (con0 != 0) + (con1 != 0)
10246                        + (lit0 != 0) + (lit1 != 0)
10247                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
10248             {
10249               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
10250               if (code == MINUS_EXPR)
10251                 code = PLUS_EXPR;
10252
10253               var0 = associate_trees (var0, var1, code, type);
10254               con0 = associate_trees (con0, con1, code, type);
10255               lit0 = associate_trees (lit0, lit1, code, type);
10256               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
10257
10258               /* Preserve the MINUS_EXPR if the negative part of the literal is
10259                  greater than the positive part.  Otherwise, the multiplicative
10260                  folding code (i.e extract_muldiv) may be fooled in case
10261                  unsigned constants are subtracted, like in the following
10262                  example: ((X*2 + 4) - 8U)/2.  */
10263               if (minus_lit0 && lit0)
10264                 {
10265                   if (TREE_CODE (lit0) == INTEGER_CST
10266                       && TREE_CODE (minus_lit0) == INTEGER_CST
10267                       && tree_int_cst_lt (lit0, minus_lit0))
10268                     {
10269                       minus_lit0 = associate_trees (minus_lit0, lit0,
10270                                                     MINUS_EXPR, type);
10271                       lit0 = 0;
10272                     }
10273                   else
10274                     {
10275                       lit0 = associate_trees (lit0, minus_lit0,
10276                                               MINUS_EXPR, type);
10277                       minus_lit0 = 0;
10278                     }
10279                 }
10280               if (minus_lit0)
10281                 {
10282                   if (con0 == 0)
10283                     return fold_convert (type,
10284                                          associate_trees (var0, minus_lit0,
10285                                                           MINUS_EXPR, type));
10286                   else
10287                     {
10288                       con0 = associate_trees (con0, minus_lit0,
10289                                               MINUS_EXPR, type);
10290                       return fold_convert (type,
10291                                            associate_trees (var0, con0,
10292                                                             PLUS_EXPR, type));
10293                     }
10294                 }
10295
10296               con0 = associate_trees (con0, lit0, code, type);
10297               return fold_convert (type, associate_trees (var0, con0,
10298                                                           code, type));
10299             }
10300         }
10301
10302       return NULL_TREE;
10303
10304     case MINUS_EXPR:
10305       /* Pointer simplifications for subtraction, simple reassociations. */
10306       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10307         {
10308           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10309           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10310               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10311             {
10312               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10313               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
10314               tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
10315               tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
10316               return fold_build2 (PLUS_EXPR, type,
10317                                   fold_build2 (MINUS_EXPR, type, arg00, arg10),
10318                                   fold_build2 (MINUS_EXPR, type, arg01, arg11));
10319             }
10320           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10321           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10322             {
10323               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10324               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
10325               tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
10326               if (tmp)
10327                 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
10328             }
10329         }
10330       /* A - (-B) -> A + B */
10331       if (TREE_CODE (arg1) == NEGATE_EXPR)
10332         return fold_build2 (PLUS_EXPR, type, op0,
10333                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10334       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
10335       if (TREE_CODE (arg0) == NEGATE_EXPR
10336           && (FLOAT_TYPE_P (type)
10337               || INTEGRAL_TYPE_P (type))
10338           && negate_expr_p (arg1)
10339           && reorder_operands_p (arg0, arg1))
10340         return fold_build2 (MINUS_EXPR, type,
10341                             fold_convert (type, negate_expr (arg1)),
10342                             fold_convert (type, TREE_OPERAND (arg0, 0)));
10343       /* Convert -A - 1 to ~A.  */
10344       if (INTEGRAL_TYPE_P (type)
10345           && TREE_CODE (arg0) == NEGATE_EXPR
10346           && integer_onep (arg1)
10347           && !TYPE_OVERFLOW_TRAPS (type))
10348         return fold_build1 (BIT_NOT_EXPR, type,
10349                             fold_convert (type, TREE_OPERAND (arg0, 0)));
10350
10351       /* Convert -1 - A to ~A.  */
10352       if (INTEGRAL_TYPE_P (type)
10353           && integer_all_onesp (arg0))
10354         return fold_build1 (BIT_NOT_EXPR, type, op1);
10355
10356
10357       /* X - (X / CST) * CST is X % CST.  */
10358       if (INTEGRAL_TYPE_P (type)
10359           && TREE_CODE (arg1) == MULT_EXPR
10360           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10361           && operand_equal_p (arg0,
10362                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10363           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10364                               TREE_OPERAND (arg1, 1), 0))
10365         return fold_convert (type,
10366                              fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10367                                           arg0, TREE_OPERAND (arg1, 1)));
10368
10369       if (! FLOAT_TYPE_P (type))
10370         {
10371           if (integer_zerop (arg0))
10372             return negate_expr (fold_convert (type, arg1));
10373           if (integer_zerop (arg1))
10374             return non_lvalue (fold_convert (type, arg0));
10375
10376           /* Fold A - (A & B) into ~B & A.  */
10377           if (!TREE_SIDE_EFFECTS (arg0)
10378               && TREE_CODE (arg1) == BIT_AND_EXPR)
10379             {
10380               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10381                 {
10382                   tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
10383                   return fold_build2 (BIT_AND_EXPR, type,
10384                                       fold_build1 (BIT_NOT_EXPR, type, arg10),
10385                                       fold_convert (type, arg0));
10386                 }
10387               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10388                 {
10389                   tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
10390                   return fold_build2 (BIT_AND_EXPR, type,
10391                                       fold_build1 (BIT_NOT_EXPR, type, arg11),
10392                                       fold_convert (type, arg0));
10393                 }
10394             }
10395
10396           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10397              any power of 2 minus 1.  */
10398           if (TREE_CODE (arg0) == BIT_AND_EXPR
10399               && TREE_CODE (arg1) == BIT_AND_EXPR
10400               && operand_equal_p (TREE_OPERAND (arg0, 0),
10401                                   TREE_OPERAND (arg1, 0), 0))
10402             {
10403               tree mask0 = TREE_OPERAND (arg0, 1);
10404               tree mask1 = TREE_OPERAND (arg1, 1);
10405               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
10406
10407               if (operand_equal_p (tem, mask1, 0))
10408                 {
10409                   tem = fold_build2 (BIT_XOR_EXPR, type,
10410                                      TREE_OPERAND (arg0, 0), mask1);
10411                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
10412                 }
10413             }
10414         }
10415
10416       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
10417       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
10418         return non_lvalue (fold_convert (type, arg0));
10419
10420       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
10421          ARG0 is zero and X + ARG0 reduces to X, since that would mean
10422          (-ARG1 + ARG0) reduces to -ARG1.  */
10423       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10424         return negate_expr (fold_convert (type, arg1));
10425
10426       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10427          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10428          signed zeros are involved.  */
10429       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10430           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10431           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10432         {
10433           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10434           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
10435           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
10436           bool arg0rz = false, arg0iz = false;
10437           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10438               || (arg0i && (arg0iz = real_zerop (arg0i))))
10439             {
10440               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
10441               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
10442               if (arg0rz && arg1i && real_zerop (arg1i))
10443                 {
10444                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
10445                                          arg1r ? arg1r
10446                                          : build1 (REALPART_EXPR, rtype, arg1));
10447                   tree ip = arg0i ? arg0i
10448                     : build1 (IMAGPART_EXPR, rtype, arg0);
10449                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10450                 }
10451               else if (arg0iz && arg1r && real_zerop (arg1r))
10452                 {
10453                   tree rp = arg0r ? arg0r
10454                     : build1 (REALPART_EXPR, rtype, arg0);
10455                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
10456                                          arg1i ? arg1i
10457                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10458                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10459                 }
10460             }
10461         }
10462
10463       /* Fold &x - &x.  This can happen from &x.foo - &x.
10464          This is unsafe for certain floats even in non-IEEE formats.
10465          In IEEE, it is unsafe because it does wrong for NaNs.
10466          Also note that operand_equal_p is always false if an operand
10467          is volatile.  */
10468
10469       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10470           && operand_equal_p (arg0, arg1, 0))
10471         return fold_convert (type, integer_zero_node);
10472
10473       /* A - B -> A + (-B) if B is easily negatable.  */
10474       if (negate_expr_p (arg1)
10475           && ((FLOAT_TYPE_P (type)
10476                /* Avoid this transformation if B is a positive REAL_CST.  */
10477                && (TREE_CODE (arg1) != REAL_CST
10478                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10479               || INTEGRAL_TYPE_P (type)))
10480         return fold_build2 (PLUS_EXPR, type,
10481                             fold_convert (type, arg0),
10482                             fold_convert (type, negate_expr (arg1)));
10483
10484       /* Try folding difference of addresses.  */
10485       {
10486         HOST_WIDE_INT diff;
10487
10488         if ((TREE_CODE (arg0) == ADDR_EXPR
10489              || TREE_CODE (arg1) == ADDR_EXPR)
10490             && ptr_difference_const (arg0, arg1, &diff))
10491           return build_int_cst_type (type, diff);
10492       }
10493
10494       /* Fold &a[i] - &a[j] to i-j.  */
10495       if (TREE_CODE (arg0) == ADDR_EXPR
10496           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10497           && TREE_CODE (arg1) == ADDR_EXPR
10498           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10499         {
10500           tree aref0 = TREE_OPERAND (arg0, 0);
10501           tree aref1 = TREE_OPERAND (arg1, 0);
10502           if (operand_equal_p (TREE_OPERAND (aref0, 0),
10503                                TREE_OPERAND (aref1, 0), 0))
10504             {
10505               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
10506               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
10507               tree esz = array_ref_element_size (aref0);
10508               tree diff = build2 (MINUS_EXPR, type, op0, op1);
10509               return fold_build2 (MULT_EXPR, type, diff,
10510                                   fold_convert (type, esz));
10511                                   
10512             }
10513         }
10514
10515       if (flag_unsafe_math_optimizations
10516           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10517           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10518           && (tem = distribute_real_division (code, type, arg0, arg1)))
10519         return tem;
10520
10521       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10522          same or one.  Make sure type is not saturating.
10523          fold_plusminus_mult_expr will re-associate.  */
10524       if ((TREE_CODE (arg0) == MULT_EXPR
10525            || TREE_CODE (arg1) == MULT_EXPR)
10526           && !TYPE_SATURATING (type)
10527           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10528         {
10529           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
10530           if (tem)
10531             return tem;
10532         }
10533
10534       goto associate;
10535
10536     case MULT_EXPR:
10537       /* (-A) * (-B) -> A * B  */
10538       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10539         return fold_build2 (MULT_EXPR, type,
10540                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10541                             fold_convert (type, negate_expr (arg1)));
10542       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10543         return fold_build2 (MULT_EXPR, type,
10544                             fold_convert (type, negate_expr (arg0)),
10545                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10546
10547       if (! FLOAT_TYPE_P (type))
10548         {
10549           if (integer_zerop (arg1))
10550             return omit_one_operand (type, arg1, arg0);
10551           if (integer_onep (arg1))
10552             return non_lvalue (fold_convert (type, arg0));
10553           /* Transform x * -1 into -x.  Make sure to do the negation
10554              on the original operand with conversions not stripped
10555              because we can only strip non-sign-changing conversions.  */
10556           if (integer_all_onesp (arg1))
10557             return fold_convert (type, negate_expr (op0));
10558           /* Transform x * -C into -x * C if x is easily negatable.  */
10559           if (TREE_CODE (arg1) == INTEGER_CST
10560               && tree_int_cst_sgn (arg1) == -1
10561               && negate_expr_p (arg0)
10562               && (tem = negate_expr (arg1)) != arg1
10563               && !TREE_OVERFLOW (tem))
10564             return fold_build2 (MULT_EXPR, type,
10565                                 fold_convert (type, negate_expr (arg0)), tem);
10566
10567           /* (a * (1 << b)) is (a << b)  */
10568           if (TREE_CODE (arg1) == LSHIFT_EXPR
10569               && integer_onep (TREE_OPERAND (arg1, 0)))
10570             return fold_build2 (LSHIFT_EXPR, type, op0,
10571                                 TREE_OPERAND (arg1, 1));
10572           if (TREE_CODE (arg0) == LSHIFT_EXPR
10573               && integer_onep (TREE_OPERAND (arg0, 0)))
10574             return fold_build2 (LSHIFT_EXPR, type, op1,
10575                                 TREE_OPERAND (arg0, 1));
10576
10577           /* (A + A) * C -> A * 2 * C  */
10578           if (TREE_CODE (arg0) == PLUS_EXPR
10579               && TREE_CODE (arg1) == INTEGER_CST
10580               && operand_equal_p (TREE_OPERAND (arg0, 0),
10581                                   TREE_OPERAND (arg0, 1), 0))
10582             return fold_build2 (MULT_EXPR, type,
10583                                 omit_one_operand (type, TREE_OPERAND (arg0, 0),
10584                                                   TREE_OPERAND (arg0, 1)),
10585                                 fold_build2 (MULT_EXPR, type,
10586                                              build_int_cst (type, 2) , arg1));
10587
10588           strict_overflow_p = false;
10589           if (TREE_CODE (arg1) == INTEGER_CST
10590               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10591                                              &strict_overflow_p)))
10592             {
10593               if (strict_overflow_p)
10594                 fold_overflow_warning (("assuming signed overflow does not "
10595                                         "occur when simplifying "
10596                                         "multiplication"),
10597                                        WARN_STRICT_OVERFLOW_MISC);
10598               return fold_convert (type, tem);
10599             }
10600
10601           /* Optimize z * conj(z) for integer complex numbers.  */
10602           if (TREE_CODE (arg0) == CONJ_EXPR
10603               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10604             return fold_mult_zconjz (type, arg1);
10605           if (TREE_CODE (arg1) == CONJ_EXPR
10606               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10607             return fold_mult_zconjz (type, arg0);
10608         }
10609       else
10610         {
10611           /* Maybe fold x * 0 to 0.  The expressions aren't the same
10612              when x is NaN, since x * 0 is also NaN.  Nor are they the
10613              same in modes with signed zeros, since multiplying a
10614              negative value by 0 gives -0, not +0.  */
10615           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10616               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10617               && real_zerop (arg1))
10618             return omit_one_operand (type, arg1, arg0);
10619           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
10620           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10621               && real_onep (arg1))
10622             return non_lvalue (fold_convert (type, arg0));
10623
10624           /* Transform x * -1.0 into -x.  */
10625           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10626               && real_minus_onep (arg1))
10627             return fold_convert (type, negate_expr (arg0));
10628
10629           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10630              the result for floating point types due to rounding so it is applied
10631              only if -fassociative-math was specify.  */
10632           if (flag_associative_math
10633               && TREE_CODE (arg0) == RDIV_EXPR
10634               && TREE_CODE (arg1) == REAL_CST
10635               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10636             {
10637               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10638                                       arg1, 0);
10639               if (tem)
10640                 return fold_build2 (RDIV_EXPR, type, tem,
10641                                     TREE_OPERAND (arg0, 1));
10642             }
10643
10644           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10645           if (operand_equal_p (arg0, arg1, 0))
10646             {
10647               tree tem = fold_strip_sign_ops (arg0);
10648               if (tem != NULL_TREE)
10649                 {
10650                   tem = fold_convert (type, tem);
10651                   return fold_build2 (MULT_EXPR, type, tem, tem);
10652                 }
10653             }
10654
10655           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10656              This is not the same for NaNs or if signed zeros are
10657              involved.  */
10658           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10659               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10660               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10661               && TREE_CODE (arg1) == COMPLEX_CST
10662               && real_zerop (TREE_REALPART (arg1)))
10663             {
10664               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10665               if (real_onep (TREE_IMAGPART (arg1)))
10666                 return fold_build2 (COMPLEX_EXPR, type,
10667                                     negate_expr (fold_build1 (IMAGPART_EXPR,
10668                                                               rtype, arg0)),
10669                                     fold_build1 (REALPART_EXPR, rtype, arg0));
10670               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10671                 return fold_build2 (COMPLEX_EXPR, type,
10672                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
10673                                     negate_expr (fold_build1 (REALPART_EXPR,
10674                                                               rtype, arg0)));
10675             }
10676
10677           /* Optimize z * conj(z) for floating point complex numbers.
10678              Guarded by flag_unsafe_math_optimizations as non-finite
10679              imaginary components don't produce scalar results.  */
10680           if (flag_unsafe_math_optimizations
10681               && TREE_CODE (arg0) == CONJ_EXPR
10682               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10683             return fold_mult_zconjz (type, arg1);
10684           if (flag_unsafe_math_optimizations
10685               && TREE_CODE (arg1) == CONJ_EXPR
10686               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10687             return fold_mult_zconjz (type, arg0);
10688
10689           if (flag_unsafe_math_optimizations)
10690             {
10691               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10692               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10693
10694               /* Optimizations of root(...)*root(...).  */
10695               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10696                 {
10697                   tree rootfn, arg;
10698                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10699                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10700
10701                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10702                   if (BUILTIN_SQRT_P (fcode0)
10703                       && operand_equal_p (arg00, arg10, 0)
10704                       && ! HONOR_SNANS (TYPE_MODE (type)))
10705                     return arg00;
10706
10707                   /* Optimize root(x)*root(y) as root(x*y).  */
10708                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10709                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10710                   return build_call_expr (rootfn, 1, arg);
10711                 }
10712
10713               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10714               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10715                 {
10716                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10717                   tree arg = fold_build2 (PLUS_EXPR, type,
10718                                           CALL_EXPR_ARG (arg0, 0),
10719                                           CALL_EXPR_ARG (arg1, 0));
10720                   return build_call_expr (expfn, 1, arg);
10721                 }
10722
10723               /* Optimizations of pow(...)*pow(...).  */
10724               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10725                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10726                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10727                 {
10728                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10729                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10730                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10731                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10732
10733                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10734                   if (operand_equal_p (arg01, arg11, 0))
10735                     {
10736                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10737                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10738                       return build_call_expr (powfn, 2, arg, arg01);
10739                     }
10740
10741                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10742                   if (operand_equal_p (arg00, arg10, 0))
10743                     {
10744                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10745                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10746                       return build_call_expr (powfn, 2, arg00, arg);
10747                     }
10748                 }
10749
10750               /* Optimize tan(x)*cos(x) as sin(x).  */
10751               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10752                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10753                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10754                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10755                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10756                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10757                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10758                                       CALL_EXPR_ARG (arg1, 0), 0))
10759                 {
10760                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10761
10762                   if (sinfn != NULL_TREE)
10763                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10764                 }
10765
10766               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10767               if (fcode1 == BUILT_IN_POW
10768                   || fcode1 == BUILT_IN_POWF
10769                   || fcode1 == BUILT_IN_POWL)
10770                 {
10771                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10772                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10773                   if (TREE_CODE (arg11) == REAL_CST
10774                       && !TREE_OVERFLOW (arg11)
10775                       && operand_equal_p (arg0, arg10, 0))
10776                     {
10777                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10778                       REAL_VALUE_TYPE c;
10779                       tree arg;
10780
10781                       c = TREE_REAL_CST (arg11);
10782                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10783                       arg = build_real (type, c);
10784                       return build_call_expr (powfn, 2, arg0, arg);
10785                     }
10786                 }
10787
10788               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10789               if (fcode0 == BUILT_IN_POW
10790                   || fcode0 == BUILT_IN_POWF
10791                   || fcode0 == BUILT_IN_POWL)
10792                 {
10793                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10794                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10795                   if (TREE_CODE (arg01) == REAL_CST
10796                       && !TREE_OVERFLOW (arg01)
10797                       && operand_equal_p (arg1, arg00, 0))
10798                     {
10799                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10800                       REAL_VALUE_TYPE c;
10801                       tree arg;
10802
10803                       c = TREE_REAL_CST (arg01);
10804                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10805                       arg = build_real (type, c);
10806                       return build_call_expr (powfn, 2, arg1, arg);
10807                     }
10808                 }
10809
10810               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
10811               if (optimize_function_for_speed_p (cfun)
10812                   && operand_equal_p (arg0, arg1, 0))
10813                 {
10814                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10815
10816                   if (powfn)
10817                     {
10818                       tree arg = build_real (type, dconst2);
10819                       return build_call_expr (powfn, 2, arg0, arg);
10820                     }
10821                 }
10822             }
10823         }
10824       goto associate;
10825
10826     case BIT_IOR_EXPR:
10827     bit_ior:
10828       if (integer_all_onesp (arg1))
10829         return omit_one_operand (type, arg1, arg0);
10830       if (integer_zerop (arg1))
10831         return non_lvalue (fold_convert (type, arg0));
10832       if (operand_equal_p (arg0, arg1, 0))
10833         return non_lvalue (fold_convert (type, arg0));
10834
10835       /* ~X | X is -1.  */
10836       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10837           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10838         {
10839           t1 = fold_convert (type, integer_zero_node);
10840           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10841           return omit_one_operand (type, t1, arg1);
10842         }
10843
10844       /* X | ~X is -1.  */
10845       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10846           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10847         {
10848           t1 = fold_convert (type, integer_zero_node);
10849           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10850           return omit_one_operand (type, t1, arg0);
10851         }
10852
10853       /* Canonicalize (X & C1) | C2.  */
10854       if (TREE_CODE (arg0) == BIT_AND_EXPR
10855           && TREE_CODE (arg1) == INTEGER_CST
10856           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10857         {
10858           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10859           int width = TYPE_PRECISION (type), w;
10860           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10861           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10862           hi2 = TREE_INT_CST_HIGH (arg1);
10863           lo2 = TREE_INT_CST_LOW (arg1);
10864
10865           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10866           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10867             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10868
10869           if (width > HOST_BITS_PER_WIDE_INT)
10870             {
10871               mhi = (unsigned HOST_WIDE_INT) -1 
10872                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10873               mlo = -1;
10874             }
10875           else
10876             {
10877               mhi = 0;
10878               mlo = (unsigned HOST_WIDE_INT) -1
10879                     >> (HOST_BITS_PER_WIDE_INT - width);
10880             }
10881
10882           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10883           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10884             return fold_build2 (BIT_IOR_EXPR, type,
10885                                 TREE_OPERAND (arg0, 0), arg1);
10886
10887           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10888              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10889              mode which allows further optimizations.  */
10890           hi1 &= mhi;
10891           lo1 &= mlo;
10892           hi2 &= mhi;
10893           lo2 &= mlo;
10894           hi3 = hi1 & ~hi2;
10895           lo3 = lo1 & ~lo2;
10896           for (w = BITS_PER_UNIT;
10897                w <= width && w <= HOST_BITS_PER_WIDE_INT;
10898                w <<= 1)
10899             {
10900               unsigned HOST_WIDE_INT mask
10901                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10902               if (((lo1 | lo2) & mask) == mask
10903                   && (lo1 & ~mask) == 0 && hi1 == 0)
10904                 {
10905                   hi3 = 0;
10906                   lo3 = mask;
10907                   break;
10908                 }
10909             }
10910           if (hi3 != hi1 || lo3 != lo1)
10911             return fold_build2 (BIT_IOR_EXPR, type,
10912                                 fold_build2 (BIT_AND_EXPR, type,
10913                                              TREE_OPERAND (arg0, 0),
10914                                              build_int_cst_wide (type,
10915                                                                  lo3, hi3)),
10916                                 arg1);
10917         }
10918
10919       /* (X & Y) | Y is (X, Y).  */
10920       if (TREE_CODE (arg0) == BIT_AND_EXPR
10921           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10922         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10923       /* (X & Y) | X is (Y, X).  */
10924       if (TREE_CODE (arg0) == BIT_AND_EXPR
10925           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10926           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10927         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10928       /* X | (X & Y) is (Y, X).  */
10929       if (TREE_CODE (arg1) == BIT_AND_EXPR
10930           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10931           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10932         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10933       /* X | (Y & X) is (Y, X).  */
10934       if (TREE_CODE (arg1) == BIT_AND_EXPR
10935           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10936           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10937         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10938
10939       t1 = distribute_bit_expr (code, type, arg0, arg1);
10940       if (t1 != NULL_TREE)
10941         return t1;
10942
10943       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10944
10945          This results in more efficient code for machines without a NAND
10946          instruction.  Combine will canonicalize to the first form
10947          which will allow use of NAND instructions provided by the
10948          backend if they exist.  */
10949       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10950           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10951         {
10952           return fold_build1 (BIT_NOT_EXPR, type,
10953                               build2 (BIT_AND_EXPR, type,
10954                                       fold_convert (type,
10955                                                     TREE_OPERAND (arg0, 0)),
10956                                       fold_convert (type,
10957                                                     TREE_OPERAND (arg1, 0))));
10958         }
10959
10960       /* See if this can be simplified into a rotate first.  If that
10961          is unsuccessful continue in the association code.  */
10962       goto bit_rotate;
10963
10964     case BIT_XOR_EXPR:
10965       if (integer_zerop (arg1))
10966         return non_lvalue (fold_convert (type, arg0));
10967       if (integer_all_onesp (arg1))
10968         return fold_build1 (BIT_NOT_EXPR, type, op0);
10969       if (operand_equal_p (arg0, arg1, 0))
10970         return omit_one_operand (type, integer_zero_node, arg0);
10971
10972       /* ~X ^ X is -1.  */
10973       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10974           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10975         {
10976           t1 = fold_convert (type, integer_zero_node);
10977           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10978           return omit_one_operand (type, t1, arg1);
10979         }
10980
10981       /* X ^ ~X is -1.  */
10982       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10983           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10984         {
10985           t1 = fold_convert (type, integer_zero_node);
10986           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10987           return omit_one_operand (type, t1, arg0);
10988         }
10989
10990       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10991          with a constant, and the two constants have no bits in common,
10992          we should treat this as a BIT_IOR_EXPR since this may produce more
10993          simplifications.  */
10994       if (TREE_CODE (arg0) == BIT_AND_EXPR
10995           && TREE_CODE (arg1) == BIT_AND_EXPR
10996           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10997           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10998           && integer_zerop (const_binop (BIT_AND_EXPR,
10999                                          TREE_OPERAND (arg0, 1),
11000                                          TREE_OPERAND (arg1, 1), 0)))
11001         {
11002           code = BIT_IOR_EXPR;
11003           goto bit_ior;
11004         }
11005
11006       /* (X | Y) ^ X -> Y & ~ X*/
11007       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11008           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11009         {
11010           tree t2 = TREE_OPERAND (arg0, 1);
11011           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
11012                             arg1);
11013           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
11014                             fold_convert (type, t1));
11015           return t1;
11016         }
11017
11018       /* (Y | X) ^ X -> Y & ~ X*/
11019       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11020           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11021         {
11022           tree t2 = TREE_OPERAND (arg0, 0);
11023           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
11024                             arg1);
11025           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
11026                             fold_convert (type, t1));
11027           return t1;
11028         }
11029
11030       /* X ^ (X | Y) -> Y & ~ X*/
11031       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11032           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11033         {
11034           tree t2 = TREE_OPERAND (arg1, 1);
11035           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
11036                             arg0);
11037           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
11038                             fold_convert (type, t1));
11039           return t1;
11040         }
11041
11042       /* X ^ (Y | X) -> Y & ~ X*/
11043       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11044           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11045         {
11046           tree t2 = TREE_OPERAND (arg1, 0);
11047           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
11048                             arg0);
11049           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
11050                             fold_convert (type, t1));
11051           return t1;
11052         }
11053         
11054       /* Convert ~X ^ ~Y to X ^ Y.  */
11055       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11056           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11057         return fold_build2 (code, type,
11058                             fold_convert (type, TREE_OPERAND (arg0, 0)),
11059                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11060
11061       /* Convert ~X ^ C to X ^ ~C.  */
11062       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11063           && TREE_CODE (arg1) == INTEGER_CST)
11064         return fold_build2 (code, type,
11065                             fold_convert (type, TREE_OPERAND (arg0, 0)),
11066                             fold_build1 (BIT_NOT_EXPR, type, arg1));
11067
11068       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
11069       if (TREE_CODE (arg0) == BIT_AND_EXPR
11070           && integer_onep (TREE_OPERAND (arg0, 1))
11071           && integer_onep (arg1))
11072         return fold_build2 (EQ_EXPR, type, arg0,
11073                             build_int_cst (TREE_TYPE (arg0), 0));
11074
11075       /* Fold (X & Y) ^ Y as ~X & Y.  */
11076       if (TREE_CODE (arg0) == BIT_AND_EXPR
11077           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11078         {
11079           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
11080           return fold_build2 (BIT_AND_EXPR, type, 
11081                               fold_build1 (BIT_NOT_EXPR, type, tem),
11082                               fold_convert (type, arg1));
11083         }
11084       /* Fold (X & Y) ^ X as ~Y & X.  */
11085       if (TREE_CODE (arg0) == BIT_AND_EXPR
11086           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11087           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11088         {
11089           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
11090           return fold_build2 (BIT_AND_EXPR, type,
11091                               fold_build1 (BIT_NOT_EXPR, type, tem),
11092                               fold_convert (type, arg1));
11093         }
11094       /* Fold X ^ (X & Y) as X & ~Y.  */
11095       if (TREE_CODE (arg1) == BIT_AND_EXPR
11096           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11097         {
11098           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
11099           return fold_build2 (BIT_AND_EXPR, type,
11100                               fold_convert (type, arg0),
11101                               fold_build1 (BIT_NOT_EXPR, type, tem));
11102         }
11103       /* Fold X ^ (Y & X) as ~Y & X.  */
11104       if (TREE_CODE (arg1) == BIT_AND_EXPR
11105           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11106           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11107         {
11108           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
11109           return fold_build2 (BIT_AND_EXPR, type,
11110                               fold_build1 (BIT_NOT_EXPR, type, tem),
11111                               fold_convert (type, arg0));
11112         }
11113
11114       /* See if this can be simplified into a rotate first.  If that
11115          is unsuccessful continue in the association code.  */
11116       goto bit_rotate;
11117
11118     case BIT_AND_EXPR:
11119       if (integer_all_onesp (arg1))
11120         return non_lvalue (fold_convert (type, arg0));
11121       if (integer_zerop (arg1))
11122         return omit_one_operand (type, arg1, arg0);
11123       if (operand_equal_p (arg0, arg1, 0))
11124         return non_lvalue (fold_convert (type, arg0));
11125
11126       /* ~X & X is always zero.  */
11127       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11128           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11129         return omit_one_operand (type, integer_zero_node, arg1);
11130
11131       /* X & ~X is always zero.  */
11132       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11133           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11134         return omit_one_operand (type, integer_zero_node, arg0);
11135
11136       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
11137       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11138           && TREE_CODE (arg1) == INTEGER_CST
11139           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11140         {
11141           tree tmp1 = fold_convert (type, arg1);
11142           tree tmp2 = fold_convert (type, TREE_OPERAND (arg0, 0));
11143           tree tmp3 = fold_convert (type, TREE_OPERAND (arg0, 1));
11144           tmp2 = fold_build2 (BIT_AND_EXPR, type, tmp2, tmp1);
11145           tmp3 = fold_build2 (BIT_AND_EXPR, type, tmp3, tmp1);
11146           return fold_convert (type,
11147                                fold_build2 (BIT_IOR_EXPR, type, tmp2, tmp3));
11148         }
11149
11150       /* (X | Y) & Y is (X, Y).  */
11151       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11152           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11153         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
11154       /* (X | Y) & X is (Y, X).  */
11155       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11156           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11157           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11158         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
11159       /* X & (X | Y) is (Y, X).  */
11160       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11161           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11162           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11163         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
11164       /* X & (Y | X) is (Y, X).  */
11165       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11166           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11167           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11168         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
11169
11170       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
11171       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11172           && integer_onep (TREE_OPERAND (arg0, 1))
11173           && integer_onep (arg1))
11174         {
11175           tem = TREE_OPERAND (arg0, 0);
11176           return fold_build2 (EQ_EXPR, type,
11177                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
11178                                            build_int_cst (TREE_TYPE (tem), 1)),
11179                               build_int_cst (TREE_TYPE (tem), 0));
11180         }
11181       /* Fold ~X & 1 as (X & 1) == 0.  */
11182       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11183           && integer_onep (arg1))
11184         {
11185           tem = TREE_OPERAND (arg0, 0);
11186           return fold_build2 (EQ_EXPR, type,
11187                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
11188                                            build_int_cst (TREE_TYPE (tem), 1)),
11189                               build_int_cst (TREE_TYPE (tem), 0));
11190         }
11191
11192       /* Fold (X ^ Y) & Y as ~X & Y.  */
11193       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11194           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11195         {
11196           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
11197           return fold_build2 (BIT_AND_EXPR, type, 
11198                               fold_build1 (BIT_NOT_EXPR, type, tem),
11199                               fold_convert (type, arg1));
11200         }
11201       /* Fold (X ^ Y) & X as ~Y & X.  */
11202       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11203           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11204           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11205         {
11206           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
11207           return fold_build2 (BIT_AND_EXPR, type,
11208                               fold_build1 (BIT_NOT_EXPR, type, tem),
11209                               fold_convert (type, arg1));
11210         }
11211       /* Fold X & (X ^ Y) as X & ~Y.  */
11212       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11213           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11214         {
11215           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
11216           return fold_build2 (BIT_AND_EXPR, type,
11217                               fold_convert (type, arg0),
11218                               fold_build1 (BIT_NOT_EXPR, type, tem));
11219         }
11220       /* Fold X & (Y ^ X) as ~Y & X.  */
11221       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11222           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11223           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11224         {
11225           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
11226           return fold_build2 (BIT_AND_EXPR, type,
11227                               fold_build1 (BIT_NOT_EXPR, type, tem),
11228                               fold_convert (type, arg0));
11229         }
11230
11231       t1 = distribute_bit_expr (code, type, arg0, arg1);
11232       if (t1 != NULL_TREE)
11233         return t1;
11234       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
11235       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11236           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11237         {
11238           unsigned int prec
11239             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11240
11241           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
11242               && (~TREE_INT_CST_LOW (arg1)
11243                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
11244             return fold_convert (type, TREE_OPERAND (arg0, 0));
11245         }
11246
11247       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11248
11249          This results in more efficient code for machines without a NOR
11250          instruction.  Combine will canonicalize to the first form
11251          which will allow use of NOR instructions provided by the
11252          backend if they exist.  */
11253       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11254           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11255         {
11256           return fold_build1 (BIT_NOT_EXPR, type,
11257                               build2 (BIT_IOR_EXPR, type,
11258                                       fold_convert (type,
11259                                                     TREE_OPERAND (arg0, 0)),
11260                                       fold_convert (type,
11261                                                     TREE_OPERAND (arg1, 0))));
11262         }
11263
11264       /* If arg0 is derived from the address of an object or function, we may
11265          be able to fold this expression using the object or function's
11266          alignment.  */
11267       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
11268         {
11269           unsigned HOST_WIDE_INT modulus, residue;
11270           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
11271
11272           modulus = get_pointer_modulus_and_residue (arg0, &residue,
11273                                                      integer_onep (arg1));
11274
11275           /* This works because modulus is a power of 2.  If this weren't the
11276              case, we'd have to replace it by its greatest power-of-2
11277              divisor: modulus & -modulus.  */
11278           if (low < modulus)
11279             return build_int_cst (type, residue & low);
11280         }
11281
11282       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11283               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11284          if the new mask might be further optimized.  */
11285       if ((TREE_CODE (arg0) == LSHIFT_EXPR
11286            || TREE_CODE (arg0) == RSHIFT_EXPR)
11287           && host_integerp (TREE_OPERAND (arg0, 1), 1)
11288           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
11289           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
11290              < TYPE_PRECISION (TREE_TYPE (arg0))
11291           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11292           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
11293         {
11294           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
11295           unsigned HOST_WIDE_INT mask
11296             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
11297           unsigned HOST_WIDE_INT newmask, zerobits = 0;
11298           tree shift_type = TREE_TYPE (arg0);
11299
11300           if (TREE_CODE (arg0) == LSHIFT_EXPR)
11301             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11302           else if (TREE_CODE (arg0) == RSHIFT_EXPR
11303                    && TYPE_PRECISION (TREE_TYPE (arg0))
11304                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
11305             {
11306               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
11307               tree arg00 = TREE_OPERAND (arg0, 0);
11308               /* See if more bits can be proven as zero because of
11309                  zero extension.  */
11310               if (TREE_CODE (arg00) == NOP_EXPR
11311                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11312                 {
11313                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11314                   if (TYPE_PRECISION (inner_type)
11315                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
11316                       && TYPE_PRECISION (inner_type) < prec)
11317                     {
11318                       prec = TYPE_PRECISION (inner_type);
11319                       /* See if we can shorten the right shift.  */
11320                       if (shiftc < prec)
11321                         shift_type = inner_type;
11322                     }
11323                 }
11324               zerobits = ~(unsigned HOST_WIDE_INT) 0;
11325               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11326               zerobits <<= prec - shiftc;
11327               /* For arithmetic shift if sign bit could be set, zerobits
11328                  can contain actually sign bits, so no transformation is
11329                  possible, unless MASK masks them all away.  In that
11330                  case the shift needs to be converted into logical shift.  */
11331               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11332                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11333                 {
11334                   if ((mask & zerobits) == 0)
11335                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
11336                   else
11337                     zerobits = 0;
11338                 }
11339             }
11340
11341           /* ((X << 16) & 0xff00) is (X, 0).  */
11342           if ((mask & zerobits) == mask)
11343             return omit_one_operand (type, build_int_cst (type, 0), arg0);
11344
11345           newmask = mask | zerobits;
11346           if (newmask != mask && (newmask & (newmask + 1)) == 0)
11347             {
11348               unsigned int prec;
11349
11350               /* Only do the transformation if NEWMASK is some integer
11351                  mode's mask.  */
11352               for (prec = BITS_PER_UNIT;
11353                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11354                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11355                   break;
11356               if (prec < HOST_BITS_PER_WIDE_INT
11357                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
11358                 {
11359                   if (shift_type != TREE_TYPE (arg0))
11360                     {
11361                       tem = fold_build2 (TREE_CODE (arg0), shift_type,
11362                                          fold_convert (shift_type,
11363                                                        TREE_OPERAND (arg0, 0)),
11364                                          TREE_OPERAND (arg0, 1));
11365                       tem = fold_convert (type, tem);
11366                     }
11367                   else
11368                     tem = op0;
11369                   return fold_build2 (BIT_AND_EXPR, type, tem,
11370                                       build_int_cst_type (TREE_TYPE (op1),
11371                                                           newmask));
11372                 }
11373             }
11374         }
11375
11376       goto associate;
11377
11378     case RDIV_EXPR:
11379       /* Don't touch a floating-point divide by zero unless the mode
11380          of the constant can represent infinity.  */
11381       if (TREE_CODE (arg1) == REAL_CST
11382           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11383           && real_zerop (arg1))
11384         return NULL_TREE;
11385
11386       /* Optimize A / A to 1.0 if we don't care about
11387          NaNs or Infinities.  Skip the transformation
11388          for non-real operands.  */
11389       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
11390           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11391           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
11392           && operand_equal_p (arg0, arg1, 0))
11393         {
11394           tree r = build_real (TREE_TYPE (arg0), dconst1);
11395
11396           return omit_two_operands (type, r, arg0, arg1);
11397         }
11398
11399       /* The complex version of the above A / A optimization.  */
11400       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11401           && operand_equal_p (arg0, arg1, 0))
11402         {
11403           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
11404           if (! HONOR_NANS (TYPE_MODE (elem_type))
11405               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
11406             {
11407               tree r = build_real (elem_type, dconst1);
11408               /* omit_two_operands will call fold_convert for us.  */
11409               return omit_two_operands (type, r, arg0, arg1);
11410             }
11411         }
11412
11413       /* (-A) / (-B) -> A / B  */
11414       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11415         return fold_build2 (RDIV_EXPR, type,
11416                             TREE_OPERAND (arg0, 0),
11417                             negate_expr (arg1));
11418       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11419         return fold_build2 (RDIV_EXPR, type,
11420                             negate_expr (arg0),
11421                             TREE_OPERAND (arg1, 0));
11422
11423       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
11424       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11425           && real_onep (arg1))
11426         return non_lvalue (fold_convert (type, arg0));
11427
11428       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
11429       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11430           && real_minus_onep (arg1))
11431         return non_lvalue (fold_convert (type, negate_expr (arg0)));
11432
11433       /* If ARG1 is a constant, we can convert this to a multiply by the
11434          reciprocal.  This does not have the same rounding properties,
11435          so only do this if -freciprocal-math.  We can actually
11436          always safely do it if ARG1 is a power of two, but it's hard to
11437          tell if it is or not in a portable manner.  */
11438       if (TREE_CODE (arg1) == REAL_CST)
11439         {
11440           if (flag_reciprocal_math
11441               && 0 != (tem = const_binop (code, build_real (type, dconst1),
11442                                           arg1, 0)))
11443             return fold_build2 (MULT_EXPR, type, arg0, tem);
11444           /* Find the reciprocal if optimizing and the result is exact.  */
11445           if (optimize)
11446             {
11447               REAL_VALUE_TYPE r;
11448               r = TREE_REAL_CST (arg1);
11449               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11450                 {
11451                   tem = build_real (type, r);
11452                   return fold_build2 (MULT_EXPR, type,
11453                                       fold_convert (type, arg0), tem);
11454                 }
11455             }
11456         }
11457       /* Convert A/B/C to A/(B*C).  */ 
11458       if (flag_reciprocal_math
11459           && TREE_CODE (arg0) == RDIV_EXPR)
11460         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11461                             fold_build2 (MULT_EXPR, type,
11462                                          TREE_OPERAND (arg0, 1), arg1));
11463
11464       /* Convert A/(B/C) to (A/B)*C.  */
11465       if (flag_reciprocal_math
11466           && TREE_CODE (arg1) == RDIV_EXPR)
11467         return fold_build2 (MULT_EXPR, type,
11468                             fold_build2 (RDIV_EXPR, type, arg0,
11469                                          TREE_OPERAND (arg1, 0)),
11470                             TREE_OPERAND (arg1, 1));
11471
11472       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11473       if (flag_reciprocal_math
11474           && TREE_CODE (arg1) == MULT_EXPR
11475           && TREE_CODE (arg0) == REAL_CST
11476           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11477         {
11478           tree tem = const_binop (RDIV_EXPR, arg0,
11479                                   TREE_OPERAND (arg1, 1), 0);
11480           if (tem)
11481             return fold_build2 (RDIV_EXPR, type, tem,
11482                                 TREE_OPERAND (arg1, 0));
11483         }
11484
11485       if (flag_unsafe_math_optimizations)
11486         {
11487           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11488           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11489
11490           /* Optimize sin(x)/cos(x) as tan(x).  */
11491           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11492                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11493                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11494               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11495                                   CALL_EXPR_ARG (arg1, 0), 0))
11496             {
11497               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11498
11499               if (tanfn != NULL_TREE)
11500                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11501             }
11502
11503           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11504           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11505                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11506                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11507               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11508                                   CALL_EXPR_ARG (arg1, 0), 0))
11509             {
11510               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11511
11512               if (tanfn != NULL_TREE)
11513                 {
11514                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11515                   return fold_build2 (RDIV_EXPR, type,
11516                                       build_real (type, dconst1), tmp);
11517                 }
11518             }
11519
11520           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11521              NaNs or Infinities.  */
11522           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11523                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11524                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11525             {
11526               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11527               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11528
11529               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11530                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11531                   && operand_equal_p (arg00, arg01, 0))
11532                 {
11533                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11534
11535                   if (cosfn != NULL_TREE)
11536                     return build_call_expr (cosfn, 1, arg00);
11537                 }
11538             }
11539
11540           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11541              NaNs or Infinities.  */
11542           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11543                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11544                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11545             {
11546               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11547               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11548
11549               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11550                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11551                   && operand_equal_p (arg00, arg01, 0))
11552                 {
11553                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11554
11555                   if (cosfn != NULL_TREE)
11556                     {
11557                       tree tmp = build_call_expr (cosfn, 1, arg00);
11558                       return fold_build2 (RDIV_EXPR, type,
11559                                           build_real (type, dconst1),
11560                                           tmp);
11561                     }
11562                 }
11563             }
11564
11565           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11566           if (fcode0 == BUILT_IN_POW
11567               || fcode0 == BUILT_IN_POWF
11568               || fcode0 == BUILT_IN_POWL)
11569             {
11570               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11571               tree arg01 = CALL_EXPR_ARG (arg0, 1);
11572               if (TREE_CODE (arg01) == REAL_CST
11573                   && !TREE_OVERFLOW (arg01)
11574                   && operand_equal_p (arg1, arg00, 0))
11575                 {
11576                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11577                   REAL_VALUE_TYPE c;
11578                   tree arg;
11579
11580                   c = TREE_REAL_CST (arg01);
11581                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11582                   arg = build_real (type, c);
11583                   return build_call_expr (powfn, 2, arg1, arg);
11584                 }
11585             }
11586
11587           /* Optimize a/root(b/c) into a*root(c/b).  */
11588           if (BUILTIN_ROOT_P (fcode1))
11589             {
11590               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11591
11592               if (TREE_CODE (rootarg) == RDIV_EXPR)
11593                 {
11594                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11595                   tree b = TREE_OPERAND (rootarg, 0);
11596                   tree c = TREE_OPERAND (rootarg, 1);
11597
11598                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11599
11600                   tmp = build_call_expr (rootfn, 1, tmp);
11601                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
11602                 }
11603             }
11604
11605           /* Optimize x/expN(y) into x*expN(-y).  */
11606           if (BUILTIN_EXPONENT_P (fcode1))
11607             {
11608               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11609               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11610               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11611               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11612             }
11613
11614           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11615           if (fcode1 == BUILT_IN_POW
11616               || fcode1 == BUILT_IN_POWF
11617               || fcode1 == BUILT_IN_POWL)
11618             {
11619               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11620               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11621               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11622               tree neg11 = fold_convert (type, negate_expr (arg11));
11623               arg1 = build_call_expr (powfn, 2, arg10, neg11);
11624               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11625             }
11626         }
11627       return NULL_TREE;
11628
11629     case TRUNC_DIV_EXPR:
11630     case FLOOR_DIV_EXPR:
11631       /* Simplify A / (B << N) where A and B are positive and B is
11632          a power of 2, to A >> (N + log2(B)).  */
11633       strict_overflow_p = false;
11634       if (TREE_CODE (arg1) == LSHIFT_EXPR
11635           && (TYPE_UNSIGNED (type)
11636               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11637         {
11638           tree sval = TREE_OPERAND (arg1, 0);
11639           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11640             {
11641               tree sh_cnt = TREE_OPERAND (arg1, 1);
11642               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11643
11644               if (strict_overflow_p)
11645                 fold_overflow_warning (("assuming signed overflow does not "
11646                                         "occur when simplifying A / (B << N)"),
11647                                        WARN_STRICT_OVERFLOW_MISC);
11648
11649               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11650                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
11651               return fold_build2 (RSHIFT_EXPR, type,
11652                                   fold_convert (type, arg0), sh_cnt);
11653             }
11654         }
11655
11656       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11657          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
11658       if (INTEGRAL_TYPE_P (type)
11659           && TYPE_UNSIGNED (type)
11660           && code == FLOOR_DIV_EXPR)
11661         return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11662
11663       /* Fall thru */
11664
11665     case ROUND_DIV_EXPR:
11666     case CEIL_DIV_EXPR:
11667     case EXACT_DIV_EXPR:
11668       if (integer_onep (arg1))
11669         return non_lvalue (fold_convert (type, arg0));
11670       if (integer_zerop (arg1))
11671         return NULL_TREE;
11672       /* X / -1 is -X.  */
11673       if (!TYPE_UNSIGNED (type)
11674           && TREE_CODE (arg1) == INTEGER_CST
11675           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11676           && TREE_INT_CST_HIGH (arg1) == -1)
11677         return fold_convert (type, negate_expr (arg0));
11678
11679       /* Convert -A / -B to A / B when the type is signed and overflow is
11680          undefined.  */
11681       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11682           && TREE_CODE (arg0) == NEGATE_EXPR
11683           && negate_expr_p (arg1))
11684         {
11685           if (INTEGRAL_TYPE_P (type))
11686             fold_overflow_warning (("assuming signed overflow does not occur "
11687                                     "when distributing negation across "
11688                                     "division"),
11689                                    WARN_STRICT_OVERFLOW_MISC);
11690           return fold_build2 (code, type,
11691                               fold_convert (type, TREE_OPERAND (arg0, 0)),
11692                               fold_convert (type, negate_expr (arg1)));
11693         }
11694       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11695           && TREE_CODE (arg1) == NEGATE_EXPR
11696           && negate_expr_p (arg0))
11697         {
11698           if (INTEGRAL_TYPE_P (type))
11699             fold_overflow_warning (("assuming signed overflow does not occur "
11700                                     "when distributing negation across "
11701                                     "division"),
11702                                    WARN_STRICT_OVERFLOW_MISC);
11703           return fold_build2 (code, type,
11704                               fold_convert (type, negate_expr (arg0)),
11705                               fold_convert (type, TREE_OPERAND (arg1, 0)));
11706         }
11707
11708       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11709          operation, EXACT_DIV_EXPR.
11710
11711          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11712          At one time others generated faster code, it's not clear if they do
11713          after the last round to changes to the DIV code in expmed.c.  */
11714       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11715           && multiple_of_p (type, arg0, arg1))
11716         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11717
11718       strict_overflow_p = false;
11719       if (TREE_CODE (arg1) == INTEGER_CST
11720           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11721                                          &strict_overflow_p)))
11722         {
11723           if (strict_overflow_p)
11724             fold_overflow_warning (("assuming signed overflow does not occur "
11725                                     "when simplifying division"),
11726                                    WARN_STRICT_OVERFLOW_MISC);
11727           return fold_convert (type, tem);
11728         }
11729
11730       return NULL_TREE;
11731
11732     case CEIL_MOD_EXPR:
11733     case FLOOR_MOD_EXPR:
11734     case ROUND_MOD_EXPR:
11735     case TRUNC_MOD_EXPR:
11736       /* X % 1 is always zero, but be sure to preserve any side
11737          effects in X.  */
11738       if (integer_onep (arg1))
11739         return omit_one_operand (type, integer_zero_node, arg0);
11740
11741       /* X % 0, return X % 0 unchanged so that we can get the
11742          proper warnings and errors.  */
11743       if (integer_zerop (arg1))
11744         return NULL_TREE;
11745
11746       /* 0 % X is always zero, but be sure to preserve any side
11747          effects in X.  Place this after checking for X == 0.  */
11748       if (integer_zerop (arg0))
11749         return omit_one_operand (type, integer_zero_node, arg1);
11750
11751       /* X % -1 is zero.  */
11752       if (!TYPE_UNSIGNED (type)
11753           && TREE_CODE (arg1) == INTEGER_CST
11754           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11755           && TREE_INT_CST_HIGH (arg1) == -1)
11756         return omit_one_operand (type, integer_zero_node, arg0);
11757
11758       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11759          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11760       strict_overflow_p = false;
11761       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11762           && (TYPE_UNSIGNED (type)
11763               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11764         {
11765           tree c = arg1;
11766           /* Also optimize A % (C << N)  where C is a power of 2,
11767              to A & ((C << N) - 1).  */
11768           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11769             c = TREE_OPERAND (arg1, 0);
11770
11771           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11772             {
11773               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11774                                        build_int_cst (TREE_TYPE (arg1), 1));
11775               if (strict_overflow_p)
11776                 fold_overflow_warning (("assuming signed overflow does not "
11777                                         "occur when simplifying "
11778                                         "X % (power of two)"),
11779                                        WARN_STRICT_OVERFLOW_MISC);
11780               return fold_build2 (BIT_AND_EXPR, type,
11781                                   fold_convert (type, arg0),
11782                                   fold_convert (type, mask));
11783             }
11784         }
11785
11786       /* X % -C is the same as X % C.  */
11787       if (code == TRUNC_MOD_EXPR
11788           && !TYPE_UNSIGNED (type)
11789           && TREE_CODE (arg1) == INTEGER_CST
11790           && !TREE_OVERFLOW (arg1)
11791           && TREE_INT_CST_HIGH (arg1) < 0
11792           && !TYPE_OVERFLOW_TRAPS (type)
11793           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
11794           && !sign_bit_p (arg1, arg1))
11795         return fold_build2 (code, type, fold_convert (type, arg0),
11796                             fold_convert (type, negate_expr (arg1)));
11797
11798       /* X % -Y is the same as X % Y.  */
11799       if (code == TRUNC_MOD_EXPR
11800           && !TYPE_UNSIGNED (type)
11801           && TREE_CODE (arg1) == NEGATE_EXPR
11802           && !TYPE_OVERFLOW_TRAPS (type))
11803         return fold_build2 (code, type, fold_convert (type, arg0),
11804                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11805
11806       if (TREE_CODE (arg1) == INTEGER_CST
11807           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11808                                          &strict_overflow_p)))
11809         {
11810           if (strict_overflow_p)
11811             fold_overflow_warning (("assuming signed overflow does not occur "
11812                                     "when simplifying modulus"),
11813                                    WARN_STRICT_OVERFLOW_MISC);
11814           return fold_convert (type, tem);
11815         }
11816
11817       return NULL_TREE;
11818
11819     case LROTATE_EXPR:
11820     case RROTATE_EXPR:
11821       if (integer_all_onesp (arg0))
11822         return omit_one_operand (type, arg0, arg1);
11823       goto shift;
11824
11825     case RSHIFT_EXPR:
11826       /* Optimize -1 >> x for arithmetic right shifts.  */
11827       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type)
11828           && tree_expr_nonnegative_p (arg1))
11829         return omit_one_operand (type, arg0, arg1);
11830       /* ... fall through ...  */
11831
11832     case LSHIFT_EXPR:
11833     shift:
11834       if (integer_zerop (arg1))
11835         return non_lvalue (fold_convert (type, arg0));
11836       if (integer_zerop (arg0))
11837         return omit_one_operand (type, arg0, arg1);
11838
11839       /* Since negative shift count is not well-defined,
11840          don't try to compute it in the compiler.  */
11841       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11842         return NULL_TREE;
11843
11844       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
11845       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11846           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11847           && host_integerp (TREE_OPERAND (arg0, 1), false)
11848           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11849         {
11850           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11851                                + TREE_INT_CST_LOW (arg1));
11852
11853           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11854              being well defined.  */
11855           if (low >= TYPE_PRECISION (type))
11856             {
11857               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11858                 low = low % TYPE_PRECISION (type);
11859               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11860                 return build_int_cst (type, 0);
11861               else
11862                 low = TYPE_PRECISION (type) - 1;
11863             }
11864
11865           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11866                               build_int_cst (type, low));
11867         }
11868
11869       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11870          into x & ((unsigned)-1 >> c) for unsigned types.  */
11871       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11872            || (TYPE_UNSIGNED (type)
11873                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11874           && host_integerp (arg1, false)
11875           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11876           && host_integerp (TREE_OPERAND (arg0, 1), false)
11877           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11878         {
11879           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11880           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11881           tree lshift;
11882           tree arg00;
11883
11884           if (low0 == low1)
11885             {
11886               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11887
11888               lshift = build_int_cst (type, -1);
11889               lshift = int_const_binop (code, lshift, arg1, 0);
11890
11891               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11892             }
11893         }
11894
11895       /* Rewrite an LROTATE_EXPR by a constant into an
11896          RROTATE_EXPR by a new constant.  */
11897       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11898         {
11899           tree tem = build_int_cst (TREE_TYPE (arg1),
11900                                     TYPE_PRECISION (type));
11901           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11902           return fold_build2 (RROTATE_EXPR, type, op0, tem);
11903         }
11904
11905       /* If we have a rotate of a bit operation with the rotate count and
11906          the second operand of the bit operation both constant,
11907          permute the two operations.  */
11908       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11909           && (TREE_CODE (arg0) == BIT_AND_EXPR
11910               || TREE_CODE (arg0) == BIT_IOR_EXPR
11911               || TREE_CODE (arg0) == BIT_XOR_EXPR)
11912           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11913         return fold_build2 (TREE_CODE (arg0), type,
11914                             fold_build2 (code, type,
11915                                          TREE_OPERAND (arg0, 0), arg1),
11916                             fold_build2 (code, type,
11917                                          TREE_OPERAND (arg0, 1), arg1));
11918
11919       /* Two consecutive rotates adding up to the precision of the
11920          type can be ignored.  */
11921       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11922           && TREE_CODE (arg0) == RROTATE_EXPR
11923           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11924           && TREE_INT_CST_HIGH (arg1) == 0
11925           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11926           && ((TREE_INT_CST_LOW (arg1)
11927                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11928               == (unsigned int) TYPE_PRECISION (type)))
11929         return TREE_OPERAND (arg0, 0);
11930
11931       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11932               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11933          if the latter can be further optimized.  */
11934       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11935           && TREE_CODE (arg0) == BIT_AND_EXPR
11936           && TREE_CODE (arg1) == INTEGER_CST
11937           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11938         {
11939           tree mask = fold_build2 (code, type,
11940                                    fold_convert (type, TREE_OPERAND (arg0, 1)),
11941                                    arg1);
11942           tree shift = fold_build2 (code, type,
11943                                     fold_convert (type, TREE_OPERAND (arg0, 0)),
11944                                     arg1);
11945           tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11946           if (tem)
11947             return tem;
11948         }
11949
11950       return NULL_TREE;
11951
11952     case MIN_EXPR:
11953       if (operand_equal_p (arg0, arg1, 0))
11954         return omit_one_operand (type, arg0, arg1);
11955       if (INTEGRAL_TYPE_P (type)
11956           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11957         return omit_one_operand (type, arg1, arg0);
11958       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11959       if (tem)
11960         return tem;
11961       goto associate;
11962
11963     case MAX_EXPR:
11964       if (operand_equal_p (arg0, arg1, 0))
11965         return omit_one_operand (type, arg0, arg1);
11966       if (INTEGRAL_TYPE_P (type)
11967           && TYPE_MAX_VALUE (type)
11968           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11969         return omit_one_operand (type, arg1, arg0);
11970       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11971       if (tem)
11972         return tem;
11973       goto associate;
11974
11975     case TRUTH_ANDIF_EXPR:
11976       /* Note that the operands of this must be ints
11977          and their values must be 0 or 1.
11978          ("true" is a fixed value perhaps depending on the language.)  */
11979       /* If first arg is constant zero, return it.  */
11980       if (integer_zerop (arg0))
11981         return fold_convert (type, arg0);
11982     case TRUTH_AND_EXPR:
11983       /* If either arg is constant true, drop it.  */
11984       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11985         return non_lvalue (fold_convert (type, arg1));
11986       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11987           /* Preserve sequence points.  */
11988           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11989         return non_lvalue (fold_convert (type, arg0));
11990       /* If second arg is constant zero, result is zero, but first arg
11991          must be evaluated.  */
11992       if (integer_zerop (arg1))
11993         return omit_one_operand (type, arg1, arg0);
11994       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11995          case will be handled here.  */
11996       if (integer_zerop (arg0))
11997         return omit_one_operand (type, arg0, arg1);
11998
11999       /* !X && X is always false.  */
12000       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12001           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12002         return omit_one_operand (type, integer_zero_node, arg1);
12003       /* X && !X is always false.  */
12004       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12005           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12006         return omit_one_operand (type, integer_zero_node, arg0);
12007
12008       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
12009          means A >= Y && A != MAX, but in this case we know that
12010          A < X <= MAX.  */
12011
12012       if (!TREE_SIDE_EFFECTS (arg0)
12013           && !TREE_SIDE_EFFECTS (arg1))
12014         {
12015           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
12016           if (tem && !operand_equal_p (tem, arg0, 0))
12017             return fold_build2 (code, type, tem, arg1);
12018
12019           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
12020           if (tem && !operand_equal_p (tem, arg1, 0))
12021             return fold_build2 (code, type, arg0, tem);
12022         }
12023
12024     truth_andor:
12025       /* We only do these simplifications if we are optimizing.  */
12026       if (!optimize)
12027         return NULL_TREE;
12028
12029       /* Check for things like (A || B) && (A || C).  We can convert this
12030          to A || (B && C).  Note that either operator can be any of the four
12031          truth and/or operations and the transformation will still be
12032          valid.   Also note that we only care about order for the
12033          ANDIF and ORIF operators.  If B contains side effects, this
12034          might change the truth-value of A.  */
12035       if (TREE_CODE (arg0) == TREE_CODE (arg1)
12036           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
12037               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
12038               || TREE_CODE (arg0) == TRUTH_AND_EXPR
12039               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
12040           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
12041         {
12042           tree a00 = TREE_OPERAND (arg0, 0);
12043           tree a01 = TREE_OPERAND (arg0, 1);
12044           tree a10 = TREE_OPERAND (arg1, 0);
12045           tree a11 = TREE_OPERAND (arg1, 1);
12046           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
12047                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
12048                              && (code == TRUTH_AND_EXPR
12049                                  || code == TRUTH_OR_EXPR));
12050
12051           if (operand_equal_p (a00, a10, 0))
12052             return fold_build2 (TREE_CODE (arg0), type, a00,
12053                                 fold_build2 (code, type, a01, a11));
12054           else if (commutative && operand_equal_p (a00, a11, 0))
12055             return fold_build2 (TREE_CODE (arg0), type, a00,
12056                                 fold_build2 (code, type, a01, a10));
12057           else if (commutative && operand_equal_p (a01, a10, 0))
12058             return fold_build2 (TREE_CODE (arg0), type, a01,
12059                                 fold_build2 (code, type, a00, a11));
12060
12061           /* This case if tricky because we must either have commutative
12062              operators or else A10 must not have side-effects.  */
12063
12064           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
12065                    && operand_equal_p (a01, a11, 0))
12066             return fold_build2 (TREE_CODE (arg0), type,
12067                                 fold_build2 (code, type, a00, a10),
12068                                 a01);
12069         }
12070
12071       /* See if we can build a range comparison.  */
12072       if (0 != (tem = fold_range_test (code, type, op0, op1)))
12073         return tem;
12074
12075       /* Check for the possibility of merging component references.  If our
12076          lhs is another similar operation, try to merge its rhs with our
12077          rhs.  Then try to merge our lhs and rhs.  */
12078       if (TREE_CODE (arg0) == code
12079           && 0 != (tem = fold_truthop (code, type,
12080                                        TREE_OPERAND (arg0, 1), arg1)))
12081         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
12082
12083       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
12084         return tem;
12085
12086       return NULL_TREE;
12087
12088     case TRUTH_ORIF_EXPR:
12089       /* Note that the operands of this must be ints
12090          and their values must be 0 or true.
12091          ("true" is a fixed value perhaps depending on the language.)  */
12092       /* If first arg is constant true, return it.  */
12093       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12094         return fold_convert (type, arg0);
12095     case TRUTH_OR_EXPR:
12096       /* If either arg is constant zero, drop it.  */
12097       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12098         return non_lvalue (fold_convert (type, arg1));
12099       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12100           /* Preserve sequence points.  */
12101           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12102         return non_lvalue (fold_convert (type, arg0));
12103       /* If second arg is constant true, result is true, but we must
12104          evaluate first arg.  */
12105       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12106         return omit_one_operand (type, arg1, arg0);
12107       /* Likewise for first arg, but note this only occurs here for
12108          TRUTH_OR_EXPR.  */
12109       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12110         return omit_one_operand (type, arg0, arg1);
12111
12112       /* !X || X is always true.  */
12113       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12114           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12115         return omit_one_operand (type, integer_one_node, arg1);
12116       /* X || !X is always true.  */
12117       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12118           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12119         return omit_one_operand (type, integer_one_node, arg0);
12120
12121       goto truth_andor;
12122
12123     case TRUTH_XOR_EXPR:
12124       /* If the second arg is constant zero, drop it.  */
12125       if (integer_zerop (arg1))
12126         return non_lvalue (fold_convert (type, arg0));
12127       /* If the second arg is constant true, this is a logical inversion.  */
12128       if (integer_onep (arg1))
12129         {
12130           /* Only call invert_truthvalue if operand is a truth value.  */
12131           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
12132             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
12133           else
12134             tem = invert_truthvalue (arg0);
12135           return non_lvalue (fold_convert (type, tem));
12136         }
12137       /* Identical arguments cancel to zero.  */
12138       if (operand_equal_p (arg0, arg1, 0))
12139         return omit_one_operand (type, integer_zero_node, arg0);
12140
12141       /* !X ^ X is always true.  */
12142       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12143           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12144         return omit_one_operand (type, integer_one_node, arg1);
12145
12146       /* X ^ !X is always true.  */
12147       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12148           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12149         return omit_one_operand (type, integer_one_node, arg0);
12150
12151       return NULL_TREE;
12152
12153     case EQ_EXPR:
12154     case NE_EXPR:
12155       tem = fold_comparison (code, type, op0, op1);
12156       if (tem != NULL_TREE)
12157         return tem;
12158
12159       /* bool_var != 0 becomes bool_var. */
12160       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12161           && code == NE_EXPR)
12162         return non_lvalue (fold_convert (type, arg0));
12163
12164       /* bool_var == 1 becomes bool_var. */
12165       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12166           && code == EQ_EXPR)
12167         return non_lvalue (fold_convert (type, arg0));
12168
12169       /* bool_var != 1 becomes !bool_var. */
12170       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12171           && code == NE_EXPR)
12172         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
12173
12174       /* bool_var == 0 becomes !bool_var. */
12175       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12176           && code == EQ_EXPR)
12177         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
12178
12179       /* If this is an equality comparison of the address of two non-weak,
12180          unaliased symbols neither of which are extern (since we do not
12181          have access to attributes for externs), then we know the result.  */
12182       if (TREE_CODE (arg0) == ADDR_EXPR
12183           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
12184           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
12185           && ! lookup_attribute ("alias",
12186                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
12187           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
12188           && TREE_CODE (arg1) == ADDR_EXPR
12189           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
12190           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
12191           && ! lookup_attribute ("alias",
12192                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
12193           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
12194         {
12195           /* We know that we're looking at the address of two
12196              non-weak, unaliased, static _DECL nodes.
12197
12198              It is both wasteful and incorrect to call operand_equal_p
12199              to compare the two ADDR_EXPR nodes.  It is wasteful in that
12200              all we need to do is test pointer equality for the arguments
12201              to the two ADDR_EXPR nodes.  It is incorrect to use
12202              operand_equal_p as that function is NOT equivalent to a
12203              C equality test.  It can in fact return false for two
12204              objects which would test as equal using the C equality
12205              operator.  */
12206           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12207           return constant_boolean_node (equal
12208                                         ? code == EQ_EXPR : code != EQ_EXPR,
12209                                         type);
12210         }
12211
12212       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
12213          a MINUS_EXPR of a constant, we can convert it into a comparison with
12214          a revised constant as long as no overflow occurs.  */
12215       if (TREE_CODE (arg1) == INTEGER_CST
12216           && (TREE_CODE (arg0) == PLUS_EXPR
12217               || TREE_CODE (arg0) == MINUS_EXPR)
12218           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12219           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
12220                                       ? MINUS_EXPR : PLUS_EXPR,
12221                                       fold_convert (TREE_TYPE (arg0), arg1),
12222                                       TREE_OPERAND (arg0, 1), 0))
12223           && !TREE_OVERFLOW (tem))
12224         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
12225
12226       /* Similarly for a NEGATE_EXPR.  */
12227       if (TREE_CODE (arg0) == NEGATE_EXPR
12228           && TREE_CODE (arg1) == INTEGER_CST
12229           && 0 != (tem = negate_expr (arg1))
12230           && TREE_CODE (tem) == INTEGER_CST
12231           && !TREE_OVERFLOW (tem))
12232         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
12233
12234       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
12235       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12236           && TREE_CODE (arg1) == INTEGER_CST
12237           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12238         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12239                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
12240                                          fold_convert (TREE_TYPE (arg0), arg1),
12241                                          TREE_OPERAND (arg0, 1)));
12242
12243       /* Transform comparisons of the form X +- Y CMP X to Y CMP 0.  */
12244       if ((TREE_CODE (arg0) == PLUS_EXPR
12245            || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12246            || TREE_CODE (arg0) == MINUS_EXPR)
12247           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12248           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12249               || POINTER_TYPE_P (TREE_TYPE (arg0))))
12250         {
12251           tree val = TREE_OPERAND (arg0, 1);
12252           return omit_two_operands (type,
12253                                     fold_build2 (code, type,
12254                                                  val,
12255                                                  build_int_cst (TREE_TYPE (val),
12256                                                                 0)),
12257                                     TREE_OPERAND (arg0, 0), arg1);
12258         }
12259
12260       /* Transform comparisons of the form C - X CMP X if C % 2 == 1.  */
12261       if (TREE_CODE (arg0) == MINUS_EXPR
12262           && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12263           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)
12264           && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1)
12265         {
12266           return omit_two_operands (type,
12267                                     code == NE_EXPR
12268                                     ? boolean_true_node : boolean_false_node,
12269                                     TREE_OPERAND (arg0, 1), arg1);
12270         }
12271
12272       /* If we have X - Y == 0, we can convert that to X == Y and similarly
12273          for !=.  Don't do this for ordered comparisons due to overflow.  */
12274       if (TREE_CODE (arg0) == MINUS_EXPR
12275           && integer_zerop (arg1))
12276         return fold_build2 (code, type,
12277                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
12278
12279       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
12280       if (TREE_CODE (arg0) == ABS_EXPR
12281           && (integer_zerop (arg1) || real_zerop (arg1)))
12282         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
12283
12284       /* If this is an EQ or NE comparison with zero and ARG0 is
12285          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
12286          two operations, but the latter can be done in one less insn
12287          on machines that have only two-operand insns or on which a
12288          constant cannot be the first operand.  */
12289       if (TREE_CODE (arg0) == BIT_AND_EXPR
12290           && integer_zerop (arg1))
12291         {
12292           tree arg00 = TREE_OPERAND (arg0, 0);
12293           tree arg01 = TREE_OPERAND (arg0, 1);
12294           if (TREE_CODE (arg00) == LSHIFT_EXPR
12295               && integer_onep (TREE_OPERAND (arg00, 0)))
12296             {
12297               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
12298                                       arg01, TREE_OPERAND (arg00, 1));
12299               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12300                                  build_int_cst (TREE_TYPE (arg0), 1));
12301               return fold_build2 (code, type,
12302                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
12303             }
12304           else if (TREE_CODE (arg01) == LSHIFT_EXPR
12305                    && integer_onep (TREE_OPERAND (arg01, 0)))
12306             {
12307               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
12308                                       arg00, TREE_OPERAND (arg01, 1));
12309               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12310                                  build_int_cst (TREE_TYPE (arg0), 1));
12311               return fold_build2 (code, type,
12312                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
12313             }
12314         }
12315
12316       /* If this is an NE or EQ comparison of zero against the result of a
12317          signed MOD operation whose second operand is a power of 2, make
12318          the MOD operation unsigned since it is simpler and equivalent.  */
12319       if (integer_zerop (arg1)
12320           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12321           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12322               || TREE_CODE (arg0) == CEIL_MOD_EXPR
12323               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12324               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12325           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12326         {
12327           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12328           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
12329                                      fold_convert (newtype,
12330                                                    TREE_OPERAND (arg0, 0)),
12331                                      fold_convert (newtype,
12332                                                    TREE_OPERAND (arg0, 1)));
12333
12334           return fold_build2 (code, type, newmod,
12335                               fold_convert (newtype, arg1));
12336         }
12337
12338       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12339          C1 is a valid shift constant, and C2 is a power of two, i.e.
12340          a single bit.  */
12341       if (TREE_CODE (arg0) == BIT_AND_EXPR
12342           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12343           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12344              == INTEGER_CST
12345           && integer_pow2p (TREE_OPERAND (arg0, 1))
12346           && integer_zerop (arg1))
12347         {
12348           tree itype = TREE_TYPE (arg0);
12349           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
12350           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12351
12352           /* Check for a valid shift count.  */
12353           if (TREE_INT_CST_HIGH (arg001) == 0
12354               && TREE_INT_CST_LOW (arg001) < prec)
12355             {
12356               tree arg01 = TREE_OPERAND (arg0, 1);
12357               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12358               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12359               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12360                  can be rewritten as (X & (C2 << C1)) != 0.  */
12361               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12362                 {
12363                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
12364                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
12365                   return fold_build2 (code, type, tem, arg1);
12366                 }
12367               /* Otherwise, for signed (arithmetic) shifts,
12368                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12369                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
12370               else if (!TYPE_UNSIGNED (itype))
12371                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12372                                     arg000, build_int_cst (itype, 0));
12373               /* Otherwise, of unsigned (logical) shifts,
12374                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12375                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
12376               else
12377                 return omit_one_operand (type,
12378                                          code == EQ_EXPR ? integer_one_node
12379                                                          : integer_zero_node,
12380                                          arg000);
12381             }
12382         }
12383
12384       /* If this is an NE comparison of zero with an AND of one, remove the
12385          comparison since the AND will give the correct value.  */
12386       if (code == NE_EXPR
12387           && integer_zerop (arg1)
12388           && TREE_CODE (arg0) == BIT_AND_EXPR
12389           && integer_onep (TREE_OPERAND (arg0, 1)))
12390         return fold_convert (type, arg0);
12391
12392       /* If we have (A & C) == C where C is a power of 2, convert this into
12393          (A & C) != 0.  Similarly for NE_EXPR.  */
12394       if (TREE_CODE (arg0) == BIT_AND_EXPR
12395           && integer_pow2p (TREE_OPERAND (arg0, 1))
12396           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12397         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12398                             arg0, fold_convert (TREE_TYPE (arg0),
12399                                                 integer_zero_node));
12400
12401       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12402          bit, then fold the expression into A < 0 or A >= 0.  */
12403       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
12404       if (tem)
12405         return tem;
12406
12407       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12408          Similarly for NE_EXPR.  */
12409       if (TREE_CODE (arg0) == BIT_AND_EXPR
12410           && TREE_CODE (arg1) == INTEGER_CST
12411           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12412         {
12413           tree notc = fold_build1 (BIT_NOT_EXPR,
12414                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
12415                                    TREE_OPERAND (arg0, 1));
12416           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
12417                                        arg1, notc);
12418           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12419           if (integer_nonzerop (dandnotc))
12420             return omit_one_operand (type, rslt, arg0);
12421         }
12422
12423       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12424          Similarly for NE_EXPR.  */
12425       if (TREE_CODE (arg0) == BIT_IOR_EXPR
12426           && TREE_CODE (arg1) == INTEGER_CST
12427           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12428         {
12429           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12430           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
12431                                        TREE_OPERAND (arg0, 1), notd);
12432           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12433           if (integer_nonzerop (candnotd))
12434             return omit_one_operand (type, rslt, arg0);
12435         }
12436
12437       /* If this is a comparison of a field, we may be able to simplify it.  */
12438       if ((TREE_CODE (arg0) == COMPONENT_REF
12439            || TREE_CODE (arg0) == BIT_FIELD_REF)
12440           /* Handle the constant case even without -O
12441              to make sure the warnings are given.  */
12442           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12443         {
12444           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
12445           if (t1)
12446             return t1;
12447         }
12448
12449       /* Optimize comparisons of strlen vs zero to a compare of the
12450          first character of the string vs zero.  To wit,
12451                 strlen(ptr) == 0   =>  *ptr == 0
12452                 strlen(ptr) != 0   =>  *ptr != 0
12453          Other cases should reduce to one of these two (or a constant)
12454          due to the return value of strlen being unsigned.  */
12455       if (TREE_CODE (arg0) == CALL_EXPR
12456           && integer_zerop (arg1))
12457         {
12458           tree fndecl = get_callee_fndecl (arg0);
12459
12460           if (fndecl
12461               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12462               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12463               && call_expr_nargs (arg0) == 1
12464               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12465             {
12466               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
12467               return fold_build2 (code, type, iref,
12468                                   build_int_cst (TREE_TYPE (iref), 0));
12469             }
12470         }
12471
12472       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12473          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12474       if (TREE_CODE (arg0) == RSHIFT_EXPR
12475           && integer_zerop (arg1)
12476           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12477         {
12478           tree arg00 = TREE_OPERAND (arg0, 0);
12479           tree arg01 = TREE_OPERAND (arg0, 1);
12480           tree itype = TREE_TYPE (arg00);
12481           if (TREE_INT_CST_HIGH (arg01) == 0
12482               && TREE_INT_CST_LOW (arg01)
12483                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12484             {
12485               if (TYPE_UNSIGNED (itype))
12486                 {
12487                   itype = signed_type_for (itype);
12488                   arg00 = fold_convert (itype, arg00);
12489                 }
12490               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12491                                   type, arg00, build_int_cst (itype, 0));
12492             }
12493         }
12494
12495       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12496       if (integer_zerop (arg1)
12497           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12498         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12499                             TREE_OPERAND (arg0, 1));
12500
12501       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12502       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12503           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12504         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12505                             build_int_cst (TREE_TYPE (arg1), 0));
12506       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12507       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12508           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12509           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12510         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
12511                             build_int_cst (TREE_TYPE (arg1), 0));
12512
12513       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12514       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12515           && TREE_CODE (arg1) == INTEGER_CST
12516           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12517         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12518                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
12519                                          TREE_OPERAND (arg0, 1), arg1));
12520
12521       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12522          (X & C) == 0 when C is a single bit.  */
12523       if (TREE_CODE (arg0) == BIT_AND_EXPR
12524           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12525           && integer_zerop (arg1)
12526           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12527         {
12528           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
12529                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12530                              TREE_OPERAND (arg0, 1));
12531           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12532                               type, tem, arg1);
12533         }
12534
12535       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12536          constant C is a power of two, i.e. a single bit.  */
12537       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12538           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12539           && integer_zerop (arg1)
12540           && integer_pow2p (TREE_OPERAND (arg0, 1))
12541           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12542                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12543         {
12544           tree arg00 = TREE_OPERAND (arg0, 0);
12545           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12546                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
12547         }
12548
12549       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12550          when is C is a power of two, i.e. a single bit.  */
12551       if (TREE_CODE (arg0) == BIT_AND_EXPR
12552           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12553           && integer_zerop (arg1)
12554           && integer_pow2p (TREE_OPERAND (arg0, 1))
12555           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12556                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12557         {
12558           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12559           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
12560                              arg000, TREE_OPERAND (arg0, 1));
12561           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12562                               tem, build_int_cst (TREE_TYPE (tem), 0));
12563         }
12564
12565       if (integer_zerop (arg1)
12566           && tree_expr_nonzero_p (arg0))
12567         {
12568           tree res = constant_boolean_node (code==NE_EXPR, type);
12569           return omit_one_operand (type, res, arg0);
12570         }
12571
12572       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12573       if (TREE_CODE (arg0) == NEGATE_EXPR
12574           && TREE_CODE (arg1) == NEGATE_EXPR)
12575         return fold_build2 (code, type,
12576                             TREE_OPERAND (arg0, 0),
12577                             TREE_OPERAND (arg1, 0));
12578
12579       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12580       if (TREE_CODE (arg0) == BIT_AND_EXPR
12581           && TREE_CODE (arg1) == BIT_AND_EXPR)
12582         {
12583           tree arg00 = TREE_OPERAND (arg0, 0);
12584           tree arg01 = TREE_OPERAND (arg0, 1);
12585           tree arg10 = TREE_OPERAND (arg1, 0);
12586           tree arg11 = TREE_OPERAND (arg1, 1);
12587           tree itype = TREE_TYPE (arg0);
12588
12589           if (operand_equal_p (arg01, arg11, 0))
12590             return fold_build2 (code, type,
12591                                 fold_build2 (BIT_AND_EXPR, itype,
12592                                              fold_build2 (BIT_XOR_EXPR, itype,
12593                                                           arg00, arg10),
12594                                              arg01),
12595                                 build_int_cst (itype, 0));
12596
12597           if (operand_equal_p (arg01, arg10, 0))
12598             return fold_build2 (code, type,
12599                                 fold_build2 (BIT_AND_EXPR, itype,
12600                                              fold_build2 (BIT_XOR_EXPR, itype,
12601                                                           arg00, arg11),
12602                                              arg01),
12603                                 build_int_cst (itype, 0));
12604
12605           if (operand_equal_p (arg00, arg11, 0))
12606             return fold_build2 (code, type,
12607                                 fold_build2 (BIT_AND_EXPR, itype,
12608                                              fold_build2 (BIT_XOR_EXPR, itype,
12609                                                           arg01, arg10),
12610                                              arg00),
12611                                 build_int_cst (itype, 0));
12612
12613           if (operand_equal_p (arg00, arg10, 0))
12614             return fold_build2 (code, type,
12615                                 fold_build2 (BIT_AND_EXPR, itype,
12616                                              fold_build2 (BIT_XOR_EXPR, itype,
12617                                                           arg01, arg11),
12618                                              arg00),
12619                                 build_int_cst (itype, 0));
12620         }
12621
12622       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12623           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12624         {
12625           tree arg00 = TREE_OPERAND (arg0, 0);
12626           tree arg01 = TREE_OPERAND (arg0, 1);
12627           tree arg10 = TREE_OPERAND (arg1, 0);
12628           tree arg11 = TREE_OPERAND (arg1, 1);
12629           tree itype = TREE_TYPE (arg0);
12630
12631           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12632              operand_equal_p guarantees no side-effects so we don't need
12633              to use omit_one_operand on Z.  */
12634           if (operand_equal_p (arg01, arg11, 0))
12635             return fold_build2 (code, type, arg00, arg10);
12636           if (operand_equal_p (arg01, arg10, 0))
12637             return fold_build2 (code, type, arg00, arg11);
12638           if (operand_equal_p (arg00, arg11, 0))
12639             return fold_build2 (code, type, arg01, arg10);
12640           if (operand_equal_p (arg00, arg10, 0))
12641             return fold_build2 (code, type, arg01, arg11);
12642
12643           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12644           if (TREE_CODE (arg01) == INTEGER_CST
12645               && TREE_CODE (arg11) == INTEGER_CST)
12646             return fold_build2 (code, type,
12647                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12648                                              fold_build2 (BIT_XOR_EXPR, itype,
12649                                                           arg01, arg11)),
12650                                 arg10);
12651         }
12652
12653       /* Attempt to simplify equality/inequality comparisons of complex
12654          values.  Only lower the comparison if the result is known or
12655          can be simplified to a single scalar comparison.  */
12656       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12657            || TREE_CODE (arg0) == COMPLEX_CST)
12658           && (TREE_CODE (arg1) == COMPLEX_EXPR
12659               || TREE_CODE (arg1) == COMPLEX_CST))
12660         {
12661           tree real0, imag0, real1, imag1;
12662           tree rcond, icond;
12663
12664           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12665             {
12666               real0 = TREE_OPERAND (arg0, 0);
12667               imag0 = TREE_OPERAND (arg0, 1);
12668             }
12669           else
12670             {
12671               real0 = TREE_REALPART (arg0);
12672               imag0 = TREE_IMAGPART (arg0);
12673             }
12674
12675           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12676             {
12677               real1 = TREE_OPERAND (arg1, 0);
12678               imag1 = TREE_OPERAND (arg1, 1);
12679             }
12680           else
12681             {
12682               real1 = TREE_REALPART (arg1);
12683               imag1 = TREE_IMAGPART (arg1);
12684             }
12685
12686           rcond = fold_binary (code, type, real0, real1);
12687           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12688             {
12689               if (integer_zerop (rcond))
12690                 {
12691                   if (code == EQ_EXPR)
12692                     return omit_two_operands (type, boolean_false_node,
12693                                               imag0, imag1);
12694                   return fold_build2 (NE_EXPR, type, imag0, imag1);
12695                 }
12696               else
12697                 {
12698                   if (code == NE_EXPR)
12699                     return omit_two_operands (type, boolean_true_node,
12700                                               imag0, imag1);
12701                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
12702                 }
12703             }
12704
12705           icond = fold_binary (code, type, imag0, imag1);
12706           if (icond && TREE_CODE (icond) == INTEGER_CST)
12707             {
12708               if (integer_zerop (icond))
12709                 {
12710                   if (code == EQ_EXPR)
12711                     return omit_two_operands (type, boolean_false_node,
12712                                               real0, real1);
12713                   return fold_build2 (NE_EXPR, type, real0, real1);
12714                 }
12715               else
12716                 {
12717                   if (code == NE_EXPR)
12718                     return omit_two_operands (type, boolean_true_node,
12719                                               real0, real1);
12720                   return fold_build2 (EQ_EXPR, type, real0, real1);
12721                 }
12722             }
12723         }
12724
12725       return NULL_TREE;
12726
12727     case LT_EXPR:
12728     case GT_EXPR:
12729     case LE_EXPR:
12730     case GE_EXPR:
12731       tem = fold_comparison (code, type, op0, op1);
12732       if (tem != NULL_TREE)
12733         return tem;
12734
12735       /* Transform comparisons of the form X +- C CMP X.  */
12736       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12737           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12738           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12739                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12740               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12741                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12742         {
12743           tree arg01 = TREE_OPERAND (arg0, 1);
12744           enum tree_code code0 = TREE_CODE (arg0);
12745           int is_positive;
12746
12747           if (TREE_CODE (arg01) == REAL_CST)
12748             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12749           else
12750             is_positive = tree_int_cst_sgn (arg01);
12751
12752           /* (X - c) > X becomes false.  */
12753           if (code == GT_EXPR
12754               && ((code0 == MINUS_EXPR && is_positive >= 0)
12755                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12756             {
12757               if (TREE_CODE (arg01) == INTEGER_CST
12758                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12759                 fold_overflow_warning (("assuming signed overflow does not "
12760                                         "occur when assuming that (X - c) > X "
12761                                         "is always false"),
12762                                        WARN_STRICT_OVERFLOW_ALL);
12763               return constant_boolean_node (0, type);
12764             }
12765
12766           /* Likewise (X + c) < X becomes false.  */
12767           if (code == LT_EXPR
12768               && ((code0 == PLUS_EXPR && is_positive >= 0)
12769                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12770             {
12771               if (TREE_CODE (arg01) == INTEGER_CST
12772                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12773                 fold_overflow_warning (("assuming signed overflow does not "
12774                                         "occur when assuming that "
12775                                         "(X + c) < X is always false"),
12776                                        WARN_STRICT_OVERFLOW_ALL);
12777               return constant_boolean_node (0, type);
12778             }
12779
12780           /* Convert (X - c) <= X to true.  */
12781           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12782               && code == LE_EXPR
12783               && ((code0 == MINUS_EXPR && is_positive >= 0)
12784                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12785             {
12786               if (TREE_CODE (arg01) == INTEGER_CST
12787                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12788                 fold_overflow_warning (("assuming signed overflow does not "
12789                                         "occur when assuming that "
12790                                         "(X - c) <= X is always true"),
12791                                        WARN_STRICT_OVERFLOW_ALL);
12792               return constant_boolean_node (1, type);
12793             }
12794
12795           /* Convert (X + c) >= X to true.  */
12796           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12797               && code == GE_EXPR
12798               && ((code0 == PLUS_EXPR && is_positive >= 0)
12799                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12800             {
12801               if (TREE_CODE (arg01) == INTEGER_CST
12802                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12803                 fold_overflow_warning (("assuming signed overflow does not "
12804                                         "occur when assuming that "
12805                                         "(X + c) >= X is always true"),
12806                                        WARN_STRICT_OVERFLOW_ALL);
12807               return constant_boolean_node (1, type);
12808             }
12809
12810           if (TREE_CODE (arg01) == INTEGER_CST)
12811             {
12812               /* Convert X + c > X and X - c < X to true for integers.  */
12813               if (code == GT_EXPR
12814                   && ((code0 == PLUS_EXPR && is_positive > 0)
12815                       || (code0 == MINUS_EXPR && is_positive < 0)))
12816                 {
12817                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12818                     fold_overflow_warning (("assuming signed overflow does "
12819                                             "not occur when assuming that "
12820                                             "(X + c) > X is always true"),
12821                                            WARN_STRICT_OVERFLOW_ALL);
12822                   return constant_boolean_node (1, type);
12823                 }
12824
12825               if (code == LT_EXPR
12826                   && ((code0 == MINUS_EXPR && is_positive > 0)
12827                       || (code0 == PLUS_EXPR && is_positive < 0)))
12828                 {
12829                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12830                     fold_overflow_warning (("assuming signed overflow does "
12831                                             "not occur when assuming that "
12832                                             "(X - c) < X is always true"),
12833                                            WARN_STRICT_OVERFLOW_ALL);
12834                   return constant_boolean_node (1, type);
12835                 }
12836
12837               /* Convert X + c <= X and X - c >= X to false for integers.  */
12838               if (code == LE_EXPR
12839                   && ((code0 == PLUS_EXPR && is_positive > 0)
12840                       || (code0 == MINUS_EXPR && is_positive < 0)))
12841                 {
12842                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12843                     fold_overflow_warning (("assuming signed overflow does "
12844                                             "not occur when assuming that "
12845                                             "(X + c) <= X is always false"),
12846                                            WARN_STRICT_OVERFLOW_ALL);
12847                   return constant_boolean_node (0, type);
12848                 }
12849
12850               if (code == GE_EXPR
12851                   && ((code0 == MINUS_EXPR && is_positive > 0)
12852                       || (code0 == PLUS_EXPR && is_positive < 0)))
12853                 {
12854                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12855                     fold_overflow_warning (("assuming signed overflow does "
12856                                             "not occur when assuming that "
12857                                             "(X - c) >= X is always false"),
12858                                            WARN_STRICT_OVERFLOW_ALL);
12859                   return constant_boolean_node (0, type);
12860                 }
12861             }
12862         }
12863
12864       /* Comparisons with the highest or lowest possible integer of
12865          the specified precision will have known values.  */
12866       {
12867         tree arg1_type = TREE_TYPE (arg1);
12868         unsigned int width = TYPE_PRECISION (arg1_type);
12869
12870         if (TREE_CODE (arg1) == INTEGER_CST
12871             && width <= 2 * HOST_BITS_PER_WIDE_INT
12872             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12873           {
12874             HOST_WIDE_INT signed_max_hi;
12875             unsigned HOST_WIDE_INT signed_max_lo;
12876             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12877
12878             if (width <= HOST_BITS_PER_WIDE_INT)
12879               {
12880                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12881                                 - 1;
12882                 signed_max_hi = 0;
12883                 max_hi = 0;
12884
12885                 if (TYPE_UNSIGNED (arg1_type))
12886                   {
12887                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12888                     min_lo = 0;
12889                     min_hi = 0;
12890                   }
12891                 else
12892                   {
12893                     max_lo = signed_max_lo;
12894                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12895                     min_hi = -1;
12896                   }
12897               }
12898             else
12899               {
12900                 width -= HOST_BITS_PER_WIDE_INT;
12901                 signed_max_lo = -1;
12902                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12903                                 - 1;
12904                 max_lo = -1;
12905                 min_lo = 0;
12906
12907                 if (TYPE_UNSIGNED (arg1_type))
12908                   {
12909                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12910                     min_hi = 0;
12911                   }
12912                 else
12913                   {
12914                     max_hi = signed_max_hi;
12915                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12916                   }
12917               }
12918
12919             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12920                 && TREE_INT_CST_LOW (arg1) == max_lo)
12921               switch (code)
12922                 {
12923                 case GT_EXPR:
12924                   return omit_one_operand (type, integer_zero_node, arg0);
12925
12926                 case GE_EXPR:
12927                   return fold_build2 (EQ_EXPR, type, op0, op1);
12928
12929                 case LE_EXPR:
12930                   return omit_one_operand (type, integer_one_node, arg0);
12931
12932                 case LT_EXPR:
12933                   return fold_build2 (NE_EXPR, type, op0, op1);
12934
12935                 /* The GE_EXPR and LT_EXPR cases above are not normally
12936                    reached because of previous transformations.  */
12937
12938                 default:
12939                   break;
12940                 }
12941             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12942                      == max_hi
12943                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12944               switch (code)
12945                 {
12946                 case GT_EXPR:
12947                   arg1 = const_binop (PLUS_EXPR, arg1,
12948                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12949                   return fold_build2 (EQ_EXPR, type,
12950                                       fold_convert (TREE_TYPE (arg1), arg0),
12951                                       arg1);
12952                 case LE_EXPR:
12953                   arg1 = const_binop (PLUS_EXPR, arg1,
12954                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12955                   return fold_build2 (NE_EXPR, type,
12956                                       fold_convert (TREE_TYPE (arg1), arg0),
12957                                       arg1);
12958                 default:
12959                   break;
12960                 }
12961             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12962                      == min_hi
12963                      && TREE_INT_CST_LOW (arg1) == min_lo)
12964               switch (code)
12965                 {
12966                 case LT_EXPR:
12967                   return omit_one_operand (type, integer_zero_node, arg0);
12968
12969                 case LE_EXPR:
12970                   return fold_build2 (EQ_EXPR, type, op0, op1);
12971
12972                 case GE_EXPR:
12973                   return omit_one_operand (type, integer_one_node, arg0);
12974
12975                 case GT_EXPR:
12976                   return fold_build2 (NE_EXPR, type, op0, op1);
12977
12978                 default:
12979                   break;
12980                 }
12981             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12982                      == min_hi
12983                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12984               switch (code)
12985                 {
12986                 case GE_EXPR:
12987                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12988                   return fold_build2 (NE_EXPR, type,
12989                                       fold_convert (TREE_TYPE (arg1), arg0),
12990                                       arg1);
12991                 case LT_EXPR:
12992                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12993                   return fold_build2 (EQ_EXPR, type,
12994                                       fold_convert (TREE_TYPE (arg1), arg0),
12995                                       arg1);
12996                 default:
12997                   break;
12998                 }
12999
13000             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
13001                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
13002                      && TYPE_UNSIGNED (arg1_type)
13003                      /* We will flip the signedness of the comparison operator
13004                         associated with the mode of arg1, so the sign bit is
13005                         specified by this mode.  Check that arg1 is the signed
13006                         max associated with this sign bit.  */
13007                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
13008                      /* signed_type does not work on pointer types.  */
13009                      && INTEGRAL_TYPE_P (arg1_type))
13010               {
13011                 /* The following case also applies to X < signed_max+1
13012                    and X >= signed_max+1 because previous transformations.  */
13013                 if (code == LE_EXPR || code == GT_EXPR)
13014                   {
13015                     tree st;
13016                     st = signed_type_for (TREE_TYPE (arg1));
13017                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
13018                                         type, fold_convert (st, arg0),
13019                                         build_int_cst (st, 0));
13020                   }
13021               }
13022           }
13023       }
13024
13025       /* If we are comparing an ABS_EXPR with a constant, we can
13026          convert all the cases into explicit comparisons, but they may
13027          well not be faster than doing the ABS and one comparison.
13028          But ABS (X) <= C is a range comparison, which becomes a subtraction
13029          and a comparison, and is probably faster.  */
13030       if (code == LE_EXPR
13031           && TREE_CODE (arg1) == INTEGER_CST
13032           && TREE_CODE (arg0) == ABS_EXPR
13033           && ! TREE_SIDE_EFFECTS (arg0)
13034           && (0 != (tem = negate_expr (arg1)))
13035           && TREE_CODE (tem) == INTEGER_CST
13036           && !TREE_OVERFLOW (tem))
13037         return fold_build2 (TRUTH_ANDIF_EXPR, type,
13038                             build2 (GE_EXPR, type,
13039                                     TREE_OPERAND (arg0, 0), tem),
13040                             build2 (LE_EXPR, type,
13041                                     TREE_OPERAND (arg0, 0), arg1));
13042
13043       /* Convert ABS_EXPR<x> >= 0 to true.  */
13044       strict_overflow_p = false;
13045       if (code == GE_EXPR
13046           && (integer_zerop (arg1)
13047               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
13048                   && real_zerop (arg1)))
13049           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13050         {
13051           if (strict_overflow_p)
13052             fold_overflow_warning (("assuming signed overflow does not occur "
13053                                     "when simplifying comparison of "
13054                                     "absolute value and zero"),
13055                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13056           return omit_one_operand (type, integer_one_node, arg0);
13057         }
13058
13059       /* Convert ABS_EXPR<x> < 0 to false.  */
13060       strict_overflow_p = false;
13061       if (code == LT_EXPR
13062           && (integer_zerop (arg1) || real_zerop (arg1))
13063           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13064         {
13065           if (strict_overflow_p)
13066             fold_overflow_warning (("assuming signed overflow does not occur "
13067                                     "when simplifying comparison of "
13068                                     "absolute value and zero"),
13069                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13070           return omit_one_operand (type, integer_zero_node, arg0);
13071         }
13072
13073       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13074          and similarly for >= into !=.  */
13075       if ((code == LT_EXPR || code == GE_EXPR)
13076           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13077           && TREE_CODE (arg1) == LSHIFT_EXPR
13078           && integer_onep (TREE_OPERAND (arg1, 0)))
13079         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13080                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13081                                TREE_OPERAND (arg1, 1)),
13082                        build_int_cst (TREE_TYPE (arg0), 0));
13083
13084       if ((code == LT_EXPR || code == GE_EXPR)
13085           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13086           && CONVERT_EXPR_P (arg1)
13087           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13088           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13089         return
13090           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13091                   fold_convert (TREE_TYPE (arg0),
13092                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13093                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
13094                                                       1))),
13095                   build_int_cst (TREE_TYPE (arg0), 0));
13096
13097       return NULL_TREE;
13098
13099     case UNORDERED_EXPR:
13100     case ORDERED_EXPR:
13101     case UNLT_EXPR:
13102     case UNLE_EXPR:
13103     case UNGT_EXPR:
13104     case UNGE_EXPR:
13105     case UNEQ_EXPR:
13106     case LTGT_EXPR:
13107       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13108         {
13109           t1 = fold_relational_const (code, type, arg0, arg1);
13110           if (t1 != NULL_TREE)
13111             return t1;
13112         }
13113
13114       /* If the first operand is NaN, the result is constant.  */
13115       if (TREE_CODE (arg0) == REAL_CST
13116           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13117           && (code != LTGT_EXPR || ! flag_trapping_math))
13118         {
13119           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13120                ? integer_zero_node
13121                : integer_one_node;
13122           return omit_one_operand (type, t1, arg1);
13123         }
13124
13125       /* If the second operand is NaN, the result is constant.  */
13126       if (TREE_CODE (arg1) == REAL_CST
13127           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13128           && (code != LTGT_EXPR || ! flag_trapping_math))
13129         {
13130           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13131                ? integer_zero_node
13132                : integer_one_node;
13133           return omit_one_operand (type, t1, arg0);
13134         }
13135
13136       /* Simplify unordered comparison of something with itself.  */
13137       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13138           && operand_equal_p (arg0, arg1, 0))
13139         return constant_boolean_node (1, type);
13140
13141       if (code == LTGT_EXPR
13142           && !flag_trapping_math
13143           && operand_equal_p (arg0, arg1, 0))
13144         return constant_boolean_node (0, type);
13145
13146       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
13147       {
13148         tree targ0 = strip_float_extensions (arg0);
13149         tree targ1 = strip_float_extensions (arg1);
13150         tree newtype = TREE_TYPE (targ0);
13151
13152         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13153           newtype = TREE_TYPE (targ1);
13154
13155         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13156           return fold_build2 (code, type, fold_convert (newtype, targ0),
13157                               fold_convert (newtype, targ1));
13158       }
13159
13160       return NULL_TREE;
13161
13162     case COMPOUND_EXPR:
13163       /* When pedantic, a compound expression can be neither an lvalue
13164          nor an integer constant expression.  */
13165       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13166         return NULL_TREE;
13167       /* Don't let (0, 0) be null pointer constant.  */
13168       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13169                                  : fold_convert (type, arg1);
13170       return pedantic_non_lvalue (tem);
13171
13172     case COMPLEX_EXPR:
13173       if ((TREE_CODE (arg0) == REAL_CST
13174            && TREE_CODE (arg1) == REAL_CST)
13175           || (TREE_CODE (arg0) == INTEGER_CST
13176               && TREE_CODE (arg1) == INTEGER_CST))
13177         return build_complex (type, arg0, arg1);
13178       return NULL_TREE;
13179
13180     case ASSERT_EXPR:
13181       /* An ASSERT_EXPR should never be passed to fold_binary.  */
13182       gcc_unreachable ();
13183
13184     default:
13185       return NULL_TREE;
13186     } /* switch (code) */
13187 }
13188
13189 /* Callback for walk_tree, looking for LABEL_EXPR.
13190    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
13191    Do not check the sub-tree of GOTO_EXPR.  */
13192
13193 static tree
13194 contains_label_1 (tree *tp,
13195                   int *walk_subtrees,
13196                   void *data ATTRIBUTE_UNUSED)
13197 {
13198   switch (TREE_CODE (*tp))
13199     {
13200     case LABEL_EXPR:
13201       return *tp;
13202     case GOTO_EXPR:
13203       *walk_subtrees = 0;
13204     /* no break */
13205     default:
13206       return NULL_TREE;
13207     }
13208 }
13209
13210 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
13211    accessible from outside the sub-tree. Returns NULL_TREE if no
13212    addressable label is found.  */
13213
13214 static bool
13215 contains_label_p (tree st)
13216 {
13217   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
13218 }
13219
13220 /* Fold a ternary expression of code CODE and type TYPE with operands
13221    OP0, OP1, and OP2.  Return the folded expression if folding is
13222    successful.  Otherwise, return NULL_TREE.  */
13223
13224 tree
13225 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
13226 {
13227   tree tem;
13228   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
13229   enum tree_code_class kind = TREE_CODE_CLASS (code);
13230
13231   gcc_assert (IS_EXPR_CODE_CLASS (kind)
13232               && TREE_CODE_LENGTH (code) == 3);
13233
13234   /* Strip any conversions that don't change the mode.  This is safe
13235      for every expression, except for a comparison expression because
13236      its signedness is derived from its operands.  So, in the latter
13237      case, only strip conversions that don't change the signedness.
13238
13239      Note that this is done as an internal manipulation within the
13240      constant folder, in order to find the simplest representation of
13241      the arguments so that their form can be studied.  In any cases,
13242      the appropriate type conversions should be put back in the tree
13243      that will get out of the constant folder.  */
13244   if (op0)
13245     {
13246       arg0 = op0;
13247       STRIP_NOPS (arg0);
13248     }
13249
13250   if (op1)
13251     {
13252       arg1 = op1;
13253       STRIP_NOPS (arg1);
13254     }
13255
13256   switch (code)
13257     {
13258     case COMPONENT_REF:
13259       if (TREE_CODE (arg0) == CONSTRUCTOR
13260           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13261         {
13262           unsigned HOST_WIDE_INT idx;
13263           tree field, value;
13264           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13265             if (field == arg1)
13266               return value;
13267         }
13268       return NULL_TREE;
13269
13270     case COND_EXPR:
13271       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13272          so all simple results must be passed through pedantic_non_lvalue.  */
13273       if (TREE_CODE (arg0) == INTEGER_CST)
13274         {
13275           tree unused_op = integer_zerop (arg0) ? op1 : op2;
13276           tem = integer_zerop (arg0) ? op2 : op1;
13277           /* Only optimize constant conditions when the selected branch
13278              has the same type as the COND_EXPR.  This avoids optimizing
13279              away "c ? x : throw", where the throw has a void type.
13280              Avoid throwing away that operand which contains label.  */
13281           if ((!TREE_SIDE_EFFECTS (unused_op)
13282                || !contains_label_p (unused_op))
13283               && (! VOID_TYPE_P (TREE_TYPE (tem))
13284                   || VOID_TYPE_P (type)))
13285             return pedantic_non_lvalue (tem);
13286           return NULL_TREE;
13287         }
13288       if (operand_equal_p (arg1, op2, 0))
13289         return pedantic_omit_one_operand (type, arg1, arg0);
13290
13291       /* If we have A op B ? A : C, we may be able to convert this to a
13292          simpler expression, depending on the operation and the values
13293          of B and C.  Signed zeros prevent all of these transformations,
13294          for reasons given above each one.
13295
13296          Also try swapping the arguments and inverting the conditional.  */
13297       if (COMPARISON_CLASS_P (arg0)
13298           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13299                                              arg1, TREE_OPERAND (arg0, 1))
13300           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
13301         {
13302           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
13303           if (tem)
13304             return tem;
13305         }
13306
13307       if (COMPARISON_CLASS_P (arg0)
13308           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13309                                              op2,
13310                                              TREE_OPERAND (arg0, 1))
13311           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
13312         {
13313           tem = fold_truth_not_expr (arg0);
13314           if (tem && COMPARISON_CLASS_P (tem))
13315             {
13316               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
13317               if (tem)
13318                 return tem;
13319             }
13320         }
13321
13322       /* If the second operand is simpler than the third, swap them
13323          since that produces better jump optimization results.  */
13324       if (truth_value_p (TREE_CODE (arg0))
13325           && tree_swap_operands_p (op1, op2, false))
13326         {
13327           /* See if this can be inverted.  If it can't, possibly because
13328              it was a floating-point inequality comparison, don't do
13329              anything.  */
13330           tem = fold_truth_not_expr (arg0);
13331           if (tem)
13332             return fold_build3 (code, type, tem, op2, op1);
13333         }
13334
13335       /* Convert A ? 1 : 0 to simply A.  */
13336       if (integer_onep (op1)
13337           && integer_zerop (op2)
13338           /* If we try to convert OP0 to our type, the
13339              call to fold will try to move the conversion inside
13340              a COND, which will recurse.  In that case, the COND_EXPR
13341              is probably the best choice, so leave it alone.  */
13342           && type == TREE_TYPE (arg0))
13343         return pedantic_non_lvalue (arg0);
13344
13345       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
13346          over COND_EXPR in cases such as floating point comparisons.  */
13347       if (integer_zerop (op1)
13348           && integer_onep (op2)
13349           && truth_value_p (TREE_CODE (arg0)))
13350         return pedantic_non_lvalue (fold_convert (type,
13351                                                   invert_truthvalue (arg0)));
13352
13353       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
13354       if (TREE_CODE (arg0) == LT_EXPR
13355           && integer_zerop (TREE_OPERAND (arg0, 1))
13356           && integer_zerop (op2)
13357           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13358         {
13359           /* sign_bit_p only checks ARG1 bits within A's precision.
13360              If <sign bit of A> has wider type than A, bits outside
13361              of A's precision in <sign bit of A> need to be checked.
13362              If they are all 0, this optimization needs to be done
13363              in unsigned A's type, if they are all 1 in signed A's type,
13364              otherwise this can't be done.  */
13365           if (TYPE_PRECISION (TREE_TYPE (tem))
13366               < TYPE_PRECISION (TREE_TYPE (arg1))
13367               && TYPE_PRECISION (TREE_TYPE (tem))
13368                  < TYPE_PRECISION (type))
13369             {
13370               unsigned HOST_WIDE_INT mask_lo;
13371               HOST_WIDE_INT mask_hi;
13372               int inner_width, outer_width;
13373               tree tem_type;
13374
13375               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13376               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13377               if (outer_width > TYPE_PRECISION (type))
13378                 outer_width = TYPE_PRECISION (type);
13379
13380               if (outer_width > HOST_BITS_PER_WIDE_INT)
13381                 {
13382                   mask_hi = ((unsigned HOST_WIDE_INT) -1
13383                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
13384                   mask_lo = -1;
13385                 }
13386               else
13387                 {
13388                   mask_hi = 0;
13389                   mask_lo = ((unsigned HOST_WIDE_INT) -1
13390                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
13391                 }
13392               if (inner_width > HOST_BITS_PER_WIDE_INT)
13393                 {
13394                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
13395                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
13396                   mask_lo = 0;
13397                 }
13398               else
13399                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
13400                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
13401
13402               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
13403                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
13404                 {
13405                   tem_type = signed_type_for (TREE_TYPE (tem));
13406                   tem = fold_convert (tem_type, tem);
13407                 }
13408               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
13409                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
13410                 {
13411                   tem_type = unsigned_type_for (TREE_TYPE (tem));
13412                   tem = fold_convert (tem_type, tem);
13413                 }
13414               else
13415                 tem = NULL;
13416             }
13417
13418           if (tem)
13419             return fold_convert (type,
13420                                  fold_build2 (BIT_AND_EXPR,
13421                                               TREE_TYPE (tem), tem,
13422                                               fold_convert (TREE_TYPE (tem),
13423                                                             arg1)));
13424         }
13425
13426       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13427          already handled above.  */
13428       if (TREE_CODE (arg0) == BIT_AND_EXPR
13429           && integer_onep (TREE_OPERAND (arg0, 1))
13430           && integer_zerop (op2)
13431           && integer_pow2p (arg1))
13432         {
13433           tree tem = TREE_OPERAND (arg0, 0);
13434           STRIP_NOPS (tem);
13435           if (TREE_CODE (tem) == RSHIFT_EXPR
13436               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13437               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13438                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13439             return fold_build2 (BIT_AND_EXPR, type,
13440                                 TREE_OPERAND (tem, 0), arg1);
13441         }
13442
13443       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13444          is probably obsolete because the first operand should be a
13445          truth value (that's why we have the two cases above), but let's
13446          leave it in until we can confirm this for all front-ends.  */
13447       if (integer_zerop (op2)
13448           && TREE_CODE (arg0) == NE_EXPR
13449           && integer_zerop (TREE_OPERAND (arg0, 1))
13450           && integer_pow2p (arg1)
13451           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13452           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13453                               arg1, OEP_ONLY_CONST))
13454         return pedantic_non_lvalue (fold_convert (type,
13455                                                   TREE_OPERAND (arg0, 0)));
13456
13457       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13458       if (integer_zerop (op2)
13459           && truth_value_p (TREE_CODE (arg0))
13460           && truth_value_p (TREE_CODE (arg1)))
13461         return fold_build2 (TRUTH_ANDIF_EXPR, type,
13462                             fold_convert (type, arg0),
13463                             arg1);
13464
13465       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13466       if (integer_onep (op2)
13467           && truth_value_p (TREE_CODE (arg0))
13468           && truth_value_p (TREE_CODE (arg1)))
13469         {
13470           /* Only perform transformation if ARG0 is easily inverted.  */
13471           tem = fold_truth_not_expr (arg0);
13472           if (tem)
13473             return fold_build2 (TRUTH_ORIF_EXPR, type,
13474                                 fold_convert (type, tem),
13475                                 arg1);
13476         }
13477
13478       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13479       if (integer_zerop (arg1)
13480           && truth_value_p (TREE_CODE (arg0))
13481           && truth_value_p (TREE_CODE (op2)))
13482         {
13483           /* Only perform transformation if ARG0 is easily inverted.  */
13484           tem = fold_truth_not_expr (arg0);
13485           if (tem)
13486             return fold_build2 (TRUTH_ANDIF_EXPR, type,
13487                                 fold_convert (type, tem),
13488                                 op2);
13489         }
13490
13491       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13492       if (integer_onep (arg1)
13493           && truth_value_p (TREE_CODE (arg0))
13494           && truth_value_p (TREE_CODE (op2)))
13495         return fold_build2 (TRUTH_ORIF_EXPR, type,
13496                             fold_convert (type, arg0),
13497                             op2);
13498
13499       return NULL_TREE;
13500
13501     case CALL_EXPR:
13502       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13503          of fold_ternary on them.  */
13504       gcc_unreachable ();
13505
13506     case BIT_FIELD_REF:
13507       if ((TREE_CODE (arg0) == VECTOR_CST
13508            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
13509           && type == TREE_TYPE (TREE_TYPE (arg0)))
13510         {
13511           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
13512           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
13513
13514           if (width != 0
13515               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
13516               && (idx % width) == 0
13517               && (idx = idx / width)
13518                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
13519             {
13520               tree elements = NULL_TREE;
13521
13522               if (TREE_CODE (arg0) == VECTOR_CST)
13523                 elements = TREE_VECTOR_CST_ELTS (arg0);
13524               else
13525                 {
13526                   unsigned HOST_WIDE_INT idx;
13527                   tree value;
13528
13529                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
13530                     elements = tree_cons (NULL_TREE, value, elements);
13531                 }
13532               while (idx-- > 0 && elements)
13533                 elements = TREE_CHAIN (elements);
13534               if (elements)
13535                 return TREE_VALUE (elements);
13536               else
13537                 return fold_convert (type, integer_zero_node);
13538             }
13539         }
13540
13541       /* A bit-field-ref that referenced the full argument can be stripped.  */
13542       if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
13543           && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_low_cst (arg1, 1)
13544           && integer_zerop (op2))
13545         return fold_convert (type, arg0);
13546
13547       return NULL_TREE;
13548
13549     default:
13550       return NULL_TREE;
13551     } /* switch (code) */
13552 }
13553
13554 /* Perform constant folding and related simplification of EXPR.
13555    The related simplifications include x*1 => x, x*0 => 0, etc.,
13556    and application of the associative law.
13557    NOP_EXPR conversions may be removed freely (as long as we
13558    are careful not to change the type of the overall expression).
13559    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13560    but we can constant-fold them if they have constant operands.  */
13561
13562 #ifdef ENABLE_FOLD_CHECKING
13563 # define fold(x) fold_1 (x)
13564 static tree fold_1 (tree);
13565 static
13566 #endif
13567 tree
13568 fold (tree expr)
13569 {
13570   const tree t = expr;
13571   enum tree_code code = TREE_CODE (t);
13572   enum tree_code_class kind = TREE_CODE_CLASS (code);
13573   tree tem;
13574
13575   /* Return right away if a constant.  */
13576   if (kind == tcc_constant)
13577     return t;
13578
13579   /* CALL_EXPR-like objects with variable numbers of operands are
13580      treated specially.  */
13581   if (kind == tcc_vl_exp)
13582     {
13583       if (code == CALL_EXPR)
13584         {
13585           tem = fold_call_expr (expr, false);
13586           return tem ? tem : expr;
13587         }
13588       return expr;
13589     }
13590
13591   if (IS_EXPR_CODE_CLASS (kind))
13592     {
13593       tree type = TREE_TYPE (t);
13594       tree op0, op1, op2;
13595
13596       switch (TREE_CODE_LENGTH (code))
13597         {
13598         case 1:
13599           op0 = TREE_OPERAND (t, 0);
13600           tem = fold_unary (code, type, op0);
13601           return tem ? tem : expr;
13602         case 2:
13603           op0 = TREE_OPERAND (t, 0);
13604           op1 = TREE_OPERAND (t, 1);
13605           tem = fold_binary (code, type, op0, op1);
13606           return tem ? tem : expr;
13607         case 3:
13608           op0 = TREE_OPERAND (t, 0);
13609           op1 = TREE_OPERAND (t, 1);
13610           op2 = TREE_OPERAND (t, 2);
13611           tem = fold_ternary (code, type, op0, op1, op2);
13612           return tem ? tem : expr;
13613         default:
13614           break;
13615         }
13616     }
13617
13618   switch (code)
13619     {
13620     case ARRAY_REF:
13621       {
13622         tree op0 = TREE_OPERAND (t, 0);
13623         tree op1 = TREE_OPERAND (t, 1);
13624
13625         if (TREE_CODE (op1) == INTEGER_CST
13626             && TREE_CODE (op0) == CONSTRUCTOR
13627             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
13628           {
13629             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
13630             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
13631             unsigned HOST_WIDE_INT begin = 0;
13632
13633             /* Find a matching index by means of a binary search.  */
13634             while (begin != end)
13635               {
13636                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
13637                 tree index = VEC_index (constructor_elt, elts, middle)->index;
13638
13639                 if (TREE_CODE (index) == INTEGER_CST
13640                     && tree_int_cst_lt (index, op1))
13641                   begin = middle + 1;
13642                 else if (TREE_CODE (index) == INTEGER_CST
13643                          && tree_int_cst_lt (op1, index))
13644                   end = middle;
13645                 else if (TREE_CODE (index) == RANGE_EXPR
13646                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
13647                   begin = middle + 1;
13648                 else if (TREE_CODE (index) == RANGE_EXPR
13649                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
13650                   end = middle;
13651                 else
13652                   return VEC_index (constructor_elt, elts, middle)->value;
13653               }
13654           }
13655
13656         return t;
13657       }
13658
13659     case CONST_DECL:
13660       return fold (DECL_INITIAL (t));
13661
13662     default:
13663       return t;
13664     } /* switch (code) */
13665 }
13666
13667 #ifdef ENABLE_FOLD_CHECKING
13668 #undef fold
13669
13670 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13671 static void fold_check_failed (const_tree, const_tree);
13672 void print_fold_checksum (const_tree);
13673
13674 /* When --enable-checking=fold, compute a digest of expr before
13675    and after actual fold call to see if fold did not accidentally
13676    change original expr.  */
13677
13678 tree
13679 fold (tree expr)
13680 {
13681   tree ret;
13682   struct md5_ctx ctx;
13683   unsigned char checksum_before[16], checksum_after[16];
13684   htab_t ht;
13685
13686   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13687   md5_init_ctx (&ctx);
13688   fold_checksum_tree (expr, &ctx, ht);
13689   md5_finish_ctx (&ctx, checksum_before);
13690   htab_empty (ht);
13691
13692   ret = fold_1 (expr);
13693
13694   md5_init_ctx (&ctx);
13695   fold_checksum_tree (expr, &ctx, ht);
13696   md5_finish_ctx (&ctx, checksum_after);
13697   htab_delete (ht);
13698
13699   if (memcmp (checksum_before, checksum_after, 16))
13700     fold_check_failed (expr, ret);
13701
13702   return ret;
13703 }
13704
13705 void
13706 print_fold_checksum (const_tree expr)
13707 {
13708   struct md5_ctx ctx;
13709   unsigned char checksum[16], cnt;
13710   htab_t ht;
13711
13712   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13713   md5_init_ctx (&ctx);
13714   fold_checksum_tree (expr, &ctx, ht);
13715   md5_finish_ctx (&ctx, checksum);
13716   htab_delete (ht);
13717   for (cnt = 0; cnt < 16; ++cnt)
13718     fprintf (stderr, "%02x", checksum[cnt]);
13719   putc ('\n', stderr);
13720 }
13721
13722 static void
13723 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13724 {
13725   internal_error ("fold check: original tree changed by fold");
13726 }
13727
13728 static void
13729 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13730 {
13731   const void **slot;
13732   enum tree_code code;
13733   union tree_node buf;
13734   int i, len;
13735   
13736 recursive_label:
13737
13738   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13739                <= sizeof (struct tree_function_decl))
13740               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13741   if (expr == NULL)
13742     return;
13743   slot = (const void **) htab_find_slot (ht, expr, INSERT);
13744   if (*slot != NULL)
13745     return;
13746   *slot = expr;
13747   code = TREE_CODE (expr);
13748   if (TREE_CODE_CLASS (code) == tcc_declaration
13749       && DECL_ASSEMBLER_NAME_SET_P (expr))
13750     {
13751       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
13752       memcpy ((char *) &buf, expr, tree_size (expr));
13753       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13754       expr = (tree) &buf;
13755     }
13756   else if (TREE_CODE_CLASS (code) == tcc_type
13757            && (TYPE_POINTER_TO (expr)
13758                || TYPE_REFERENCE_TO (expr)
13759                || TYPE_CACHED_VALUES_P (expr)
13760                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
13761                || TYPE_NEXT_VARIANT (expr)))
13762     {
13763       /* Allow these fields to be modified.  */
13764       tree tmp;
13765       memcpy ((char *) &buf, expr, tree_size (expr));
13766       expr = tmp = (tree) &buf;
13767       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13768       TYPE_POINTER_TO (tmp) = NULL;
13769       TYPE_REFERENCE_TO (tmp) = NULL;
13770       TYPE_NEXT_VARIANT (tmp) = NULL;
13771       if (TYPE_CACHED_VALUES_P (tmp))
13772         {
13773           TYPE_CACHED_VALUES_P (tmp) = 0;
13774           TYPE_CACHED_VALUES (tmp) = NULL;
13775         }
13776     }
13777   md5_process_bytes (expr, tree_size (expr), ctx);
13778   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13779   if (TREE_CODE_CLASS (code) != tcc_type
13780       && TREE_CODE_CLASS (code) != tcc_declaration
13781       && code != TREE_LIST
13782       && code != SSA_NAME)
13783     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13784   switch (TREE_CODE_CLASS (code))
13785     {
13786     case tcc_constant:
13787       switch (code)
13788         {
13789         case STRING_CST:
13790           md5_process_bytes (TREE_STRING_POINTER (expr),
13791                              TREE_STRING_LENGTH (expr), ctx);
13792           break;
13793         case COMPLEX_CST:
13794           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13795           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13796           break;
13797         case VECTOR_CST:
13798           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13799           break;
13800         default:
13801           break;
13802         }
13803       break;
13804     case tcc_exceptional:
13805       switch (code)
13806         {
13807         case TREE_LIST:
13808           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13809           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13810           expr = TREE_CHAIN (expr);
13811           goto recursive_label;
13812           break;
13813         case TREE_VEC:
13814           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13815             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13816           break;
13817         default:
13818           break;
13819         }
13820       break;
13821     case tcc_expression:
13822     case tcc_reference:
13823     case tcc_comparison:
13824     case tcc_unary:
13825     case tcc_binary:
13826     case tcc_statement:
13827     case tcc_vl_exp:
13828       len = TREE_OPERAND_LENGTH (expr);
13829       for (i = 0; i < len; ++i)
13830         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13831       break;
13832     case tcc_declaration:
13833       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13834       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13835       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13836         {
13837           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13838           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13839           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13840           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13841           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13842         }
13843       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13844         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13845           
13846       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13847         {
13848           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13849           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13850           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13851         }
13852       break;
13853     case tcc_type:
13854       if (TREE_CODE (expr) == ENUMERAL_TYPE)
13855         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13856       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13857       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13858       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13859       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13860       if (INTEGRAL_TYPE_P (expr)
13861           || SCALAR_FLOAT_TYPE_P (expr))
13862         {
13863           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13864           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13865         }
13866       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13867       if (TREE_CODE (expr) == RECORD_TYPE
13868           || TREE_CODE (expr) == UNION_TYPE
13869           || TREE_CODE (expr) == QUAL_UNION_TYPE)
13870         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13871       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13872       break;
13873     default:
13874       break;
13875     }
13876 }
13877
13878 /* Helper function for outputting the checksum of a tree T.  When
13879    debugging with gdb, you can "define mynext" to be "next" followed
13880    by "call debug_fold_checksum (op0)", then just trace down till the
13881    outputs differ.  */
13882
13883 void
13884 debug_fold_checksum (const_tree t)
13885 {
13886   int i;
13887   unsigned char checksum[16];
13888   struct md5_ctx ctx;
13889   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13890   
13891   md5_init_ctx (&ctx);
13892   fold_checksum_tree (t, &ctx, ht);
13893   md5_finish_ctx (&ctx, checksum);
13894   htab_empty (ht);
13895
13896   for (i = 0; i < 16; i++)
13897     fprintf (stderr, "%d ", checksum[i]);
13898
13899   fprintf (stderr, "\n");
13900 }
13901
13902 #endif
13903
13904 /* Fold a unary tree expression with code CODE of type TYPE with an
13905    operand OP0.  Return a folded expression if successful.  Otherwise,
13906    return a tree expression with code CODE of type TYPE with an
13907    operand OP0.  */
13908
13909 tree
13910 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13911 {
13912   tree tem;
13913 #ifdef ENABLE_FOLD_CHECKING
13914   unsigned char checksum_before[16], checksum_after[16];
13915   struct md5_ctx ctx;
13916   htab_t ht;
13917
13918   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13919   md5_init_ctx (&ctx);
13920   fold_checksum_tree (op0, &ctx, ht);
13921   md5_finish_ctx (&ctx, checksum_before);
13922   htab_empty (ht);
13923 #endif
13924   
13925   tem = fold_unary (code, type, op0);
13926   if (!tem)
13927     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13928   
13929 #ifdef ENABLE_FOLD_CHECKING
13930   md5_init_ctx (&ctx);
13931   fold_checksum_tree (op0, &ctx, ht);
13932   md5_finish_ctx (&ctx, checksum_after);
13933   htab_delete (ht);
13934
13935   if (memcmp (checksum_before, checksum_after, 16))
13936     fold_check_failed (op0, tem);
13937 #endif
13938   return tem;
13939 }
13940
13941 /* Fold a binary tree expression with code CODE of type TYPE with
13942    operands OP0 and OP1.  Return a folded expression if successful.
13943    Otherwise, return a tree expression with code CODE of type TYPE
13944    with operands OP0 and OP1.  */
13945
13946 tree
13947 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13948                   MEM_STAT_DECL)
13949 {
13950   tree tem;
13951 #ifdef ENABLE_FOLD_CHECKING
13952   unsigned char checksum_before_op0[16],
13953                 checksum_before_op1[16],
13954                 checksum_after_op0[16],
13955                 checksum_after_op1[16];
13956   struct md5_ctx ctx;
13957   htab_t ht;
13958
13959   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13960   md5_init_ctx (&ctx);
13961   fold_checksum_tree (op0, &ctx, ht);
13962   md5_finish_ctx (&ctx, checksum_before_op0);
13963   htab_empty (ht);
13964
13965   md5_init_ctx (&ctx);
13966   fold_checksum_tree (op1, &ctx, ht);
13967   md5_finish_ctx (&ctx, checksum_before_op1);
13968   htab_empty (ht);
13969 #endif
13970
13971   tem = fold_binary (code, type, op0, op1);
13972   if (!tem)
13973     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13974   
13975 #ifdef ENABLE_FOLD_CHECKING
13976   md5_init_ctx (&ctx);
13977   fold_checksum_tree (op0, &ctx, ht);
13978   md5_finish_ctx (&ctx, checksum_after_op0);
13979   htab_empty (ht);
13980
13981   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13982     fold_check_failed (op0, tem);
13983   
13984   md5_init_ctx (&ctx);
13985   fold_checksum_tree (op1, &ctx, ht);
13986   md5_finish_ctx (&ctx, checksum_after_op1);
13987   htab_delete (ht);
13988
13989   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13990     fold_check_failed (op1, tem);
13991 #endif
13992   return tem;
13993 }
13994
13995 /* Fold a ternary tree expression with code CODE of type TYPE with
13996    operands OP0, OP1, and OP2.  Return a folded expression if
13997    successful.  Otherwise, return a tree expression with code CODE of
13998    type TYPE with operands OP0, OP1, and OP2.  */
13999
14000 tree
14001 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
14002              MEM_STAT_DECL)
14003 {
14004   tree tem;
14005 #ifdef ENABLE_FOLD_CHECKING
14006   unsigned char checksum_before_op0[16],
14007                 checksum_before_op1[16],
14008                 checksum_before_op2[16],
14009                 checksum_after_op0[16],
14010                 checksum_after_op1[16],
14011                 checksum_after_op2[16];
14012   struct md5_ctx ctx;
14013   htab_t ht;
14014
14015   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14016   md5_init_ctx (&ctx);
14017   fold_checksum_tree (op0, &ctx, ht);
14018   md5_finish_ctx (&ctx, checksum_before_op0);
14019   htab_empty (ht);
14020
14021   md5_init_ctx (&ctx);
14022   fold_checksum_tree (op1, &ctx, ht);
14023   md5_finish_ctx (&ctx, checksum_before_op1);
14024   htab_empty (ht);
14025
14026   md5_init_ctx (&ctx);
14027   fold_checksum_tree (op2, &ctx, ht);
14028   md5_finish_ctx (&ctx, checksum_before_op2);
14029   htab_empty (ht);
14030 #endif
14031
14032   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14033   tem = fold_ternary (code, type, op0, op1, op2);
14034   if (!tem)
14035     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
14036       
14037 #ifdef ENABLE_FOLD_CHECKING
14038   md5_init_ctx (&ctx);
14039   fold_checksum_tree (op0, &ctx, ht);
14040   md5_finish_ctx (&ctx, checksum_after_op0);
14041   htab_empty (ht);
14042
14043   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14044     fold_check_failed (op0, tem);
14045   
14046   md5_init_ctx (&ctx);
14047   fold_checksum_tree (op1, &ctx, ht);
14048   md5_finish_ctx (&ctx, checksum_after_op1);
14049   htab_empty (ht);
14050
14051   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14052     fold_check_failed (op1, tem);
14053   
14054   md5_init_ctx (&ctx);
14055   fold_checksum_tree (op2, &ctx, ht);
14056   md5_finish_ctx (&ctx, checksum_after_op2);
14057   htab_delete (ht);
14058
14059   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14060     fold_check_failed (op2, tem);
14061 #endif
14062   return tem;
14063 }
14064
14065 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14066    arguments in ARGARRAY, and a null static chain.
14067    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
14068    of type TYPE from the given operands as constructed by build_call_array.  */
14069
14070 tree
14071 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
14072 {
14073   tree tem;
14074 #ifdef ENABLE_FOLD_CHECKING
14075   unsigned char checksum_before_fn[16],
14076                 checksum_before_arglist[16],
14077                 checksum_after_fn[16],
14078                 checksum_after_arglist[16];
14079   struct md5_ctx ctx;
14080   htab_t ht;
14081   int i;
14082
14083   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14084   md5_init_ctx (&ctx);
14085   fold_checksum_tree (fn, &ctx, ht);
14086   md5_finish_ctx (&ctx, checksum_before_fn);
14087   htab_empty (ht);
14088
14089   md5_init_ctx (&ctx);
14090   for (i = 0; i < nargs; i++)
14091     fold_checksum_tree (argarray[i], &ctx, ht);
14092   md5_finish_ctx (&ctx, checksum_before_arglist);
14093   htab_empty (ht);
14094 #endif
14095
14096   tem = fold_builtin_call_array (type, fn, nargs, argarray);
14097       
14098 #ifdef ENABLE_FOLD_CHECKING
14099   md5_init_ctx (&ctx);
14100   fold_checksum_tree (fn, &ctx, ht);
14101   md5_finish_ctx (&ctx, checksum_after_fn);
14102   htab_empty (ht);
14103
14104   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14105     fold_check_failed (fn, tem);
14106   
14107   md5_init_ctx (&ctx);
14108   for (i = 0; i < nargs; i++)
14109     fold_checksum_tree (argarray[i], &ctx, ht);
14110   md5_finish_ctx (&ctx, checksum_after_arglist);
14111   htab_delete (ht);
14112
14113   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14114     fold_check_failed (NULL_TREE, tem);
14115 #endif
14116   return tem;
14117 }
14118
14119 /* Perform constant folding and related simplification of initializer
14120    expression EXPR.  These behave identically to "fold_buildN" but ignore
14121    potential run-time traps and exceptions that fold must preserve.  */
14122
14123 #define START_FOLD_INIT \
14124   int saved_signaling_nans = flag_signaling_nans;\
14125   int saved_trapping_math = flag_trapping_math;\
14126   int saved_rounding_math = flag_rounding_math;\
14127   int saved_trapv = flag_trapv;\
14128   int saved_folding_initializer = folding_initializer;\
14129   flag_signaling_nans = 0;\
14130   flag_trapping_math = 0;\
14131   flag_rounding_math = 0;\
14132   flag_trapv = 0;\
14133   folding_initializer = 1;
14134
14135 #define END_FOLD_INIT \
14136   flag_signaling_nans = saved_signaling_nans;\
14137   flag_trapping_math = saved_trapping_math;\
14138   flag_rounding_math = saved_rounding_math;\
14139   flag_trapv = saved_trapv;\
14140   folding_initializer = saved_folding_initializer;
14141
14142 tree
14143 fold_build1_initializer (enum tree_code code, tree type, tree op)
14144 {
14145   tree result;
14146   START_FOLD_INIT;
14147
14148   result = fold_build1 (code, type, op);
14149
14150   END_FOLD_INIT;
14151   return result;
14152 }
14153
14154 tree
14155 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
14156 {
14157   tree result;
14158   START_FOLD_INIT;
14159
14160   result = fold_build2 (code, type, op0, op1);
14161
14162   END_FOLD_INIT;
14163   return result;
14164 }
14165
14166 tree
14167 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
14168                          tree op2)
14169 {
14170   tree result;
14171   START_FOLD_INIT;
14172
14173   result = fold_build3 (code, type, op0, op1, op2);
14174
14175   END_FOLD_INIT;
14176   return result;
14177 }
14178
14179 tree
14180 fold_build_call_array_initializer (tree type, tree fn,
14181                                    int nargs, tree *argarray)
14182 {
14183   tree result;
14184   START_FOLD_INIT;
14185
14186   result = fold_build_call_array (type, fn, nargs, argarray);
14187
14188   END_FOLD_INIT;
14189   return result;
14190 }
14191
14192 #undef START_FOLD_INIT
14193 #undef END_FOLD_INIT
14194
14195 /* Determine if first argument is a multiple of second argument.  Return 0 if
14196    it is not, or we cannot easily determined it to be.
14197
14198    An example of the sort of thing we care about (at this point; this routine
14199    could surely be made more general, and expanded to do what the *_DIV_EXPR's
14200    fold cases do now) is discovering that
14201
14202      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14203
14204    is a multiple of
14205
14206      SAVE_EXPR (J * 8)
14207
14208    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14209
14210    This code also handles discovering that
14211
14212      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14213
14214    is a multiple of 8 so we don't have to worry about dealing with a
14215    possible remainder.
14216
14217    Note that we *look* inside a SAVE_EXPR only to determine how it was
14218    calculated; it is not safe for fold to do much of anything else with the
14219    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14220    at run time.  For example, the latter example above *cannot* be implemented
14221    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14222    evaluation time of the original SAVE_EXPR is not necessarily the same at
14223    the time the new expression is evaluated.  The only optimization of this
14224    sort that would be valid is changing
14225
14226      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14227
14228    divided by 8 to
14229
14230      SAVE_EXPR (I) * SAVE_EXPR (J)
14231
14232    (where the same SAVE_EXPR (J) is used in the original and the
14233    transformed version).  */
14234
14235 int
14236 multiple_of_p (tree type, const_tree top, const_tree bottom)
14237 {
14238   if (operand_equal_p (top, bottom, 0))
14239     return 1;
14240
14241   if (TREE_CODE (type) != INTEGER_TYPE)
14242     return 0;
14243
14244   switch (TREE_CODE (top))
14245     {
14246     case BIT_AND_EXPR:
14247       /* Bitwise and provides a power of two multiple.  If the mask is
14248          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
14249       if (!integer_pow2p (bottom))
14250         return 0;
14251       /* FALLTHRU */
14252
14253     case MULT_EXPR:
14254       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14255               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14256
14257     case PLUS_EXPR:
14258     case MINUS_EXPR:
14259       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14260               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14261
14262     case LSHIFT_EXPR:
14263       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14264         {
14265           tree op1, t1;
14266
14267           op1 = TREE_OPERAND (top, 1);
14268           /* const_binop may not detect overflow correctly,
14269              so check for it explicitly here.  */
14270           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
14271               > TREE_INT_CST_LOW (op1)
14272               && TREE_INT_CST_HIGH (op1) == 0
14273               && 0 != (t1 = fold_convert (type,
14274                                           const_binop (LSHIFT_EXPR,
14275                                                        size_one_node,
14276                                                        op1, 0)))
14277               && !TREE_OVERFLOW (t1))
14278             return multiple_of_p (type, t1, bottom);
14279         }
14280       return 0;
14281
14282     case NOP_EXPR:
14283       /* Can't handle conversions from non-integral or wider integral type.  */
14284       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14285           || (TYPE_PRECISION (type)
14286               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14287         return 0;
14288
14289       /* .. fall through ...  */
14290
14291     case SAVE_EXPR:
14292       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14293
14294     case INTEGER_CST:
14295       if (TREE_CODE (bottom) != INTEGER_CST
14296           || integer_zerop (bottom)
14297           || (TYPE_UNSIGNED (type)
14298               && (tree_int_cst_sgn (top) < 0
14299                   || tree_int_cst_sgn (bottom) < 0)))
14300         return 0;
14301       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
14302                                              top, bottom, 0));
14303
14304     default:
14305       return 0;
14306     }
14307 }
14308
14309 /* Return true if CODE or TYPE is known to be non-negative. */
14310
14311 static bool
14312 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14313 {
14314   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14315       && truth_value_p (code))
14316     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14317        have a signed:1 type (where the value is -1 and 0).  */
14318     return true;
14319   return false;
14320 }
14321
14322 /* Return true if (CODE OP0) is known to be non-negative.  If the return
14323    value is based on the assumption that signed overflow is undefined,
14324    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14325    *STRICT_OVERFLOW_P.  */
14326
14327 bool
14328 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14329                                 bool *strict_overflow_p)
14330 {
14331   if (TYPE_UNSIGNED (type))
14332     return true;
14333
14334   switch (code)
14335     {
14336     case ABS_EXPR:
14337       /* We can't return 1 if flag_wrapv is set because
14338          ABS_EXPR<INT_MIN> = INT_MIN.  */
14339       if (!INTEGRAL_TYPE_P (type))
14340         return true;
14341       if (TYPE_OVERFLOW_UNDEFINED (type))
14342         {
14343           *strict_overflow_p = true;
14344           return true;
14345         }
14346       break;
14347
14348     case NON_LVALUE_EXPR:
14349     case FLOAT_EXPR:
14350     case FIX_TRUNC_EXPR:
14351       return tree_expr_nonnegative_warnv_p (op0,
14352                                             strict_overflow_p);
14353
14354     case NOP_EXPR:
14355       {
14356         tree inner_type = TREE_TYPE (op0);
14357         tree outer_type = type;
14358
14359         if (TREE_CODE (outer_type) == REAL_TYPE)
14360           {
14361             if (TREE_CODE (inner_type) == REAL_TYPE)
14362               return tree_expr_nonnegative_warnv_p (op0,
14363                                                     strict_overflow_p);
14364             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14365               {
14366                 if (TYPE_UNSIGNED (inner_type))
14367                   return true;
14368                 return tree_expr_nonnegative_warnv_p (op0,
14369                                                       strict_overflow_p);
14370               }
14371           }
14372         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
14373           {
14374             if (TREE_CODE (inner_type) == REAL_TYPE)
14375               return tree_expr_nonnegative_warnv_p (op0,
14376                                                     strict_overflow_p);
14377             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14378               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14379                       && TYPE_UNSIGNED (inner_type);
14380           }
14381       }
14382       break;
14383
14384     default:
14385       return tree_simple_nonnegative_warnv_p (code, type);
14386     }
14387
14388   /* We don't know sign of `t', so be conservative and return false.  */
14389   return false;
14390 }
14391
14392 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
14393    value is based on the assumption that signed overflow is undefined,
14394    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14395    *STRICT_OVERFLOW_P.  */
14396
14397 bool
14398 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14399                                       tree op1, bool *strict_overflow_p)
14400 {
14401   if (TYPE_UNSIGNED (type))
14402     return true;
14403
14404   switch (code)
14405     {
14406     case POINTER_PLUS_EXPR:
14407     case PLUS_EXPR:
14408       if (FLOAT_TYPE_P (type))
14409         return (tree_expr_nonnegative_warnv_p (op0,
14410                                                strict_overflow_p)
14411                 && tree_expr_nonnegative_warnv_p (op1,
14412                                                   strict_overflow_p));
14413
14414       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14415          both unsigned and at least 2 bits shorter than the result.  */
14416       if (TREE_CODE (type) == INTEGER_TYPE
14417           && TREE_CODE (op0) == NOP_EXPR
14418           && TREE_CODE (op1) == NOP_EXPR)
14419         {
14420           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14421           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14422           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14423               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14424             {
14425               unsigned int prec = MAX (TYPE_PRECISION (inner1),
14426                                        TYPE_PRECISION (inner2)) + 1;
14427               return prec < TYPE_PRECISION (type);
14428             }
14429         }
14430       break;
14431
14432     case MULT_EXPR:
14433       if (FLOAT_TYPE_P (type))
14434         {
14435           /* x * x for floating point x is always non-negative.  */
14436           if (operand_equal_p (op0, op1, 0))
14437             return true;
14438           return (tree_expr_nonnegative_warnv_p (op0,
14439                                                  strict_overflow_p)
14440                   && tree_expr_nonnegative_warnv_p (op1,
14441                                                     strict_overflow_p));
14442         }
14443
14444       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14445          both unsigned and their total bits is shorter than the result.  */
14446       if (TREE_CODE (type) == INTEGER_TYPE
14447           && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
14448           && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
14449         {
14450           tree inner0 = (TREE_CODE (op0) == NOP_EXPR) 
14451             ? TREE_TYPE (TREE_OPERAND (op0, 0))
14452             : TREE_TYPE (op0);
14453           tree inner1 = (TREE_CODE (op1) == NOP_EXPR) 
14454             ? TREE_TYPE (TREE_OPERAND (op1, 0))
14455             : TREE_TYPE (op1);
14456
14457           bool unsigned0 = TYPE_UNSIGNED (inner0);
14458           bool unsigned1 = TYPE_UNSIGNED (inner1);
14459
14460           if (TREE_CODE (op0) == INTEGER_CST)
14461             unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
14462
14463           if (TREE_CODE (op1) == INTEGER_CST)
14464             unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
14465
14466           if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
14467               && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
14468             {
14469               unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
14470                 ? tree_int_cst_min_precision (op0, /*unsignedp=*/true)
14471                 : TYPE_PRECISION (inner0);
14472
14473               unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
14474                 ? tree_int_cst_min_precision (op1, /*unsignedp=*/true)
14475                 : TYPE_PRECISION (inner1);
14476
14477               return precision0 + precision1 < TYPE_PRECISION (type);
14478             }
14479         }
14480       return false;
14481
14482     case BIT_AND_EXPR:
14483     case MAX_EXPR:
14484       return (tree_expr_nonnegative_warnv_p (op0,
14485                                              strict_overflow_p)
14486               || tree_expr_nonnegative_warnv_p (op1,
14487                                                 strict_overflow_p));
14488
14489     case BIT_IOR_EXPR:
14490     case BIT_XOR_EXPR:
14491     case MIN_EXPR:
14492     case RDIV_EXPR:
14493     case TRUNC_DIV_EXPR:
14494     case CEIL_DIV_EXPR:
14495     case FLOOR_DIV_EXPR:
14496     case ROUND_DIV_EXPR:
14497       return (tree_expr_nonnegative_warnv_p (op0,
14498                                              strict_overflow_p)
14499               && tree_expr_nonnegative_warnv_p (op1,
14500                                                 strict_overflow_p));
14501
14502     case TRUNC_MOD_EXPR:
14503     case CEIL_MOD_EXPR:
14504     case FLOOR_MOD_EXPR:
14505     case ROUND_MOD_EXPR:
14506       return tree_expr_nonnegative_warnv_p (op0,
14507                                             strict_overflow_p);
14508     default:
14509       return tree_simple_nonnegative_warnv_p (code, type);
14510     }
14511
14512   /* We don't know sign of `t', so be conservative and return false.  */
14513   return false;
14514 }
14515
14516 /* Return true if T is known to be non-negative.  If the return
14517    value is based on the assumption that signed overflow is undefined,
14518    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14519    *STRICT_OVERFLOW_P.  */
14520
14521 bool
14522 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14523 {
14524   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14525     return true;
14526
14527   switch (TREE_CODE (t))
14528     {
14529     case INTEGER_CST:
14530       return tree_int_cst_sgn (t) >= 0;
14531
14532     case REAL_CST:
14533       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
14534
14535     case FIXED_CST:
14536       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
14537
14538     case COND_EXPR:
14539       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14540                                              strict_overflow_p)
14541               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
14542                                                 strict_overflow_p));
14543     default:
14544       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14545                                                    TREE_TYPE (t));
14546     }
14547   /* We don't know sign of `t', so be conservative and return false.  */
14548   return false;
14549 }
14550
14551 /* Return true if T is known to be non-negative.  If the return
14552    value is based on the assumption that signed overflow is undefined,
14553    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14554    *STRICT_OVERFLOW_P.  */
14555
14556 bool
14557 tree_call_nonnegative_warnv_p (tree type, tree fndecl,
14558                                tree arg0, tree arg1, bool *strict_overflow_p)
14559 {
14560   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14561     switch (DECL_FUNCTION_CODE (fndecl))
14562       {
14563         CASE_FLT_FN (BUILT_IN_ACOS):
14564         CASE_FLT_FN (BUILT_IN_ACOSH):
14565         CASE_FLT_FN (BUILT_IN_CABS):
14566         CASE_FLT_FN (BUILT_IN_COSH):
14567         CASE_FLT_FN (BUILT_IN_ERFC):
14568         CASE_FLT_FN (BUILT_IN_EXP):
14569         CASE_FLT_FN (BUILT_IN_EXP10):
14570         CASE_FLT_FN (BUILT_IN_EXP2):
14571         CASE_FLT_FN (BUILT_IN_FABS):
14572         CASE_FLT_FN (BUILT_IN_FDIM):
14573         CASE_FLT_FN (BUILT_IN_HYPOT):
14574         CASE_FLT_FN (BUILT_IN_POW10):
14575         CASE_INT_FN (BUILT_IN_FFS):
14576         CASE_INT_FN (BUILT_IN_PARITY):
14577         CASE_INT_FN (BUILT_IN_POPCOUNT):
14578       case BUILT_IN_BSWAP32:
14579       case BUILT_IN_BSWAP64:
14580         /* Always true.  */
14581         return true;
14582
14583         CASE_FLT_FN (BUILT_IN_SQRT):
14584         /* sqrt(-0.0) is -0.0.  */
14585         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
14586           return true;
14587         return tree_expr_nonnegative_warnv_p (arg0,
14588                                               strict_overflow_p);
14589
14590         CASE_FLT_FN (BUILT_IN_ASINH):
14591         CASE_FLT_FN (BUILT_IN_ATAN):
14592         CASE_FLT_FN (BUILT_IN_ATANH):
14593         CASE_FLT_FN (BUILT_IN_CBRT):
14594         CASE_FLT_FN (BUILT_IN_CEIL):
14595         CASE_FLT_FN (BUILT_IN_ERF):
14596         CASE_FLT_FN (BUILT_IN_EXPM1):
14597         CASE_FLT_FN (BUILT_IN_FLOOR):
14598         CASE_FLT_FN (BUILT_IN_FMOD):
14599         CASE_FLT_FN (BUILT_IN_FREXP):
14600         CASE_FLT_FN (BUILT_IN_LCEIL):
14601         CASE_FLT_FN (BUILT_IN_LDEXP):
14602         CASE_FLT_FN (BUILT_IN_LFLOOR):
14603         CASE_FLT_FN (BUILT_IN_LLCEIL):
14604         CASE_FLT_FN (BUILT_IN_LLFLOOR):
14605         CASE_FLT_FN (BUILT_IN_LLRINT):
14606         CASE_FLT_FN (BUILT_IN_LLROUND):
14607         CASE_FLT_FN (BUILT_IN_LRINT):
14608         CASE_FLT_FN (BUILT_IN_LROUND):
14609         CASE_FLT_FN (BUILT_IN_MODF):
14610         CASE_FLT_FN (BUILT_IN_NEARBYINT):
14611         CASE_FLT_FN (BUILT_IN_RINT):
14612         CASE_FLT_FN (BUILT_IN_ROUND):
14613         CASE_FLT_FN (BUILT_IN_SCALB):
14614         CASE_FLT_FN (BUILT_IN_SCALBLN):
14615         CASE_FLT_FN (BUILT_IN_SCALBN):
14616         CASE_FLT_FN (BUILT_IN_SIGNBIT):
14617         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14618         CASE_FLT_FN (BUILT_IN_SINH):
14619         CASE_FLT_FN (BUILT_IN_TANH):
14620         CASE_FLT_FN (BUILT_IN_TRUNC):
14621         /* True if the 1st argument is nonnegative.  */
14622         return tree_expr_nonnegative_warnv_p (arg0,
14623                                               strict_overflow_p);
14624
14625         CASE_FLT_FN (BUILT_IN_FMAX):
14626         /* True if the 1st OR 2nd arguments are nonnegative.  */
14627         return (tree_expr_nonnegative_warnv_p (arg0,
14628                                                strict_overflow_p)
14629                 || (tree_expr_nonnegative_warnv_p (arg1,
14630                                                    strict_overflow_p)));
14631
14632         CASE_FLT_FN (BUILT_IN_FMIN):
14633         /* True if the 1st AND 2nd arguments are nonnegative.  */
14634         return (tree_expr_nonnegative_warnv_p (arg0,
14635                                                strict_overflow_p)
14636                 && (tree_expr_nonnegative_warnv_p (arg1,
14637                                                    strict_overflow_p)));
14638
14639         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14640         /* True if the 2nd argument is nonnegative.  */
14641         return tree_expr_nonnegative_warnv_p (arg1,
14642                                               strict_overflow_p);
14643
14644         CASE_FLT_FN (BUILT_IN_POWI):
14645         /* True if the 1st argument is nonnegative or the second
14646            argument is an even integer.  */
14647         if (TREE_CODE (arg1) == INTEGER_CST
14648             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
14649           return true;
14650         return tree_expr_nonnegative_warnv_p (arg0,
14651                                               strict_overflow_p);
14652
14653         CASE_FLT_FN (BUILT_IN_POW):
14654         /* True if the 1st argument is nonnegative or the second
14655            argument is an even integer valued real.  */
14656         if (TREE_CODE (arg1) == REAL_CST)
14657           {
14658             REAL_VALUE_TYPE c;
14659             HOST_WIDE_INT n;
14660
14661             c = TREE_REAL_CST (arg1);
14662             n = real_to_integer (&c);
14663             if ((n & 1) == 0)
14664               {
14665                 REAL_VALUE_TYPE cint;
14666                 real_from_integer (&cint, VOIDmode, n,
14667                                    n < 0 ? -1 : 0, 0);
14668                 if (real_identical (&c, &cint))
14669                   return true;
14670               }
14671           }
14672         return tree_expr_nonnegative_warnv_p (arg0,
14673                                               strict_overflow_p);
14674
14675       default:
14676         break;
14677       }
14678   return tree_simple_nonnegative_warnv_p (CALL_EXPR,
14679                                           type);
14680 }
14681
14682 /* Return true if T is known to be non-negative.  If the return
14683    value is based on the assumption that signed overflow is undefined,
14684    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14685    *STRICT_OVERFLOW_P.  */
14686
14687 bool
14688 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14689 {
14690   enum tree_code code = TREE_CODE (t);
14691   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14692     return true;
14693
14694   switch (code)
14695     {
14696     case TARGET_EXPR:
14697       {
14698         tree temp = TARGET_EXPR_SLOT (t);
14699         t = TARGET_EXPR_INITIAL (t);
14700
14701         /* If the initializer is non-void, then it's a normal expression
14702            that will be assigned to the slot.  */
14703         if (!VOID_TYPE_P (t))
14704           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
14705
14706         /* Otherwise, the initializer sets the slot in some way.  One common
14707            way is an assignment statement at the end of the initializer.  */
14708         while (1)
14709           {
14710             if (TREE_CODE (t) == BIND_EXPR)
14711               t = expr_last (BIND_EXPR_BODY (t));
14712             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
14713                      || TREE_CODE (t) == TRY_CATCH_EXPR)
14714               t = expr_last (TREE_OPERAND (t, 0));
14715             else if (TREE_CODE (t) == STATEMENT_LIST)
14716               t = expr_last (t);
14717             else
14718               break;
14719           }
14720         if (TREE_CODE (t) == MODIFY_EXPR
14721             && TREE_OPERAND (t, 0) == temp)
14722           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14723                                                 strict_overflow_p);
14724
14725         return false;
14726       }
14727
14728     case CALL_EXPR:
14729       {
14730         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
14731         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
14732
14733         return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
14734                                               get_callee_fndecl (t),
14735                                               arg0,
14736                                               arg1,
14737                                               strict_overflow_p);
14738       }
14739     case COMPOUND_EXPR:
14740     case MODIFY_EXPR:
14741       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14742                                             strict_overflow_p);
14743     case BIND_EXPR:
14744       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14745                                             strict_overflow_p);
14746     case SAVE_EXPR:
14747       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14748                                             strict_overflow_p);
14749
14750     default:
14751       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14752                                                    TREE_TYPE (t));
14753     }
14754
14755   /* We don't know sign of `t', so be conservative and return false.  */
14756   return false;
14757 }
14758
14759 /* Return true if T is known to be non-negative.  If the return
14760    value is based on the assumption that signed overflow is undefined,
14761    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14762    *STRICT_OVERFLOW_P.  */
14763
14764 bool
14765 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14766 {
14767   enum tree_code code;
14768   if (t == error_mark_node)
14769     return false;
14770
14771   code = TREE_CODE (t);
14772   switch (TREE_CODE_CLASS (code))
14773     {
14774     case tcc_binary:
14775     case tcc_comparison:
14776       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14777                                               TREE_TYPE (t),
14778                                               TREE_OPERAND (t, 0),
14779                                               TREE_OPERAND (t, 1),
14780                                               strict_overflow_p);
14781
14782     case tcc_unary:
14783       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14784                                              TREE_TYPE (t),
14785                                              TREE_OPERAND (t, 0),
14786                                              strict_overflow_p);
14787
14788     case tcc_constant:
14789     case tcc_declaration:
14790     case tcc_reference:
14791       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14792
14793     default:
14794       break;
14795     }
14796
14797   switch (code)
14798     {
14799     case TRUTH_AND_EXPR:
14800     case TRUTH_OR_EXPR:
14801     case TRUTH_XOR_EXPR:
14802       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14803                                               TREE_TYPE (t),
14804                                               TREE_OPERAND (t, 0),
14805                                               TREE_OPERAND (t, 1),
14806                                               strict_overflow_p);
14807     case TRUTH_NOT_EXPR:
14808       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14809                                              TREE_TYPE (t),
14810                                              TREE_OPERAND (t, 0),
14811                                              strict_overflow_p);
14812
14813     case COND_EXPR:
14814     case CONSTRUCTOR:
14815     case OBJ_TYPE_REF:
14816     case ASSERT_EXPR:
14817     case ADDR_EXPR:
14818     case WITH_SIZE_EXPR:
14819     case EXC_PTR_EXPR:
14820     case SSA_NAME:
14821     case FILTER_EXPR:
14822       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14823
14824     default:
14825       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14826     }
14827 }
14828
14829 /* Return true if `t' is known to be non-negative.  Handle warnings
14830    about undefined signed overflow.  */
14831
14832 bool
14833 tree_expr_nonnegative_p (tree t)
14834 {
14835   bool ret, strict_overflow_p;
14836
14837   strict_overflow_p = false;
14838   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14839   if (strict_overflow_p)
14840     fold_overflow_warning (("assuming signed overflow does not occur when "
14841                             "determining that expression is always "
14842                             "non-negative"),
14843                            WARN_STRICT_OVERFLOW_MISC);
14844   return ret;
14845 }
14846
14847
14848 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14849    For floating point we further ensure that T is not denormal.
14850    Similar logic is present in nonzero_address in rtlanal.h.
14851
14852    If the return value is based on the assumption that signed overflow
14853    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14854    change *STRICT_OVERFLOW_P.  */
14855
14856 bool
14857 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14858                                  bool *strict_overflow_p)
14859 {
14860   switch (code)
14861     {
14862     case ABS_EXPR:
14863       return tree_expr_nonzero_warnv_p (op0,
14864                                         strict_overflow_p);
14865
14866     case NOP_EXPR:
14867       {
14868         tree inner_type = TREE_TYPE (op0);
14869         tree outer_type = type;
14870
14871         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14872                 && tree_expr_nonzero_warnv_p (op0,
14873                                               strict_overflow_p));
14874       }
14875       break;
14876
14877     case NON_LVALUE_EXPR:
14878       return tree_expr_nonzero_warnv_p (op0,
14879                                         strict_overflow_p);
14880
14881     default:
14882       break;
14883   }
14884
14885   return false;
14886 }
14887
14888 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14889    For floating point we further ensure that T is not denormal.
14890    Similar logic is present in nonzero_address in rtlanal.h.
14891
14892    If the return value is based on the assumption that signed overflow
14893    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14894    change *STRICT_OVERFLOW_P.  */
14895
14896 bool
14897 tree_binary_nonzero_warnv_p (enum tree_code code,
14898                              tree type,
14899                              tree op0,
14900                              tree op1, bool *strict_overflow_p)
14901 {
14902   bool sub_strict_overflow_p;
14903   switch (code)
14904     {
14905     case POINTER_PLUS_EXPR:
14906     case PLUS_EXPR:
14907       if (TYPE_OVERFLOW_UNDEFINED (type))
14908         {
14909           /* With the presence of negative values it is hard
14910              to say something.  */
14911           sub_strict_overflow_p = false;
14912           if (!tree_expr_nonnegative_warnv_p (op0,
14913                                               &sub_strict_overflow_p)
14914               || !tree_expr_nonnegative_warnv_p (op1,
14915                                                  &sub_strict_overflow_p))
14916             return false;
14917           /* One of operands must be positive and the other non-negative.  */
14918           /* We don't set *STRICT_OVERFLOW_P here: even if this value
14919              overflows, on a twos-complement machine the sum of two
14920              nonnegative numbers can never be zero.  */
14921           return (tree_expr_nonzero_warnv_p (op0,
14922                                              strict_overflow_p)
14923                   || tree_expr_nonzero_warnv_p (op1,
14924                                                 strict_overflow_p));
14925         }
14926       break;
14927
14928     case MULT_EXPR:
14929       if (TYPE_OVERFLOW_UNDEFINED (type))
14930         {
14931           if (tree_expr_nonzero_warnv_p (op0,
14932                                          strict_overflow_p)
14933               && tree_expr_nonzero_warnv_p (op1,
14934                                             strict_overflow_p))
14935             {
14936               *strict_overflow_p = true;
14937               return true;
14938             }
14939         }
14940       break;
14941
14942     case MIN_EXPR:
14943       sub_strict_overflow_p = false;
14944       if (tree_expr_nonzero_warnv_p (op0,
14945                                      &sub_strict_overflow_p)
14946           && tree_expr_nonzero_warnv_p (op1,
14947                                         &sub_strict_overflow_p))
14948         {
14949           if (sub_strict_overflow_p)
14950             *strict_overflow_p = true;
14951         }
14952       break;
14953
14954     case MAX_EXPR:
14955       sub_strict_overflow_p = false;
14956       if (tree_expr_nonzero_warnv_p (op0,
14957                                      &sub_strict_overflow_p))
14958         {
14959           if (sub_strict_overflow_p)
14960             *strict_overflow_p = true;
14961
14962           /* When both operands are nonzero, then MAX must be too.  */
14963           if (tree_expr_nonzero_warnv_p (op1,
14964                                          strict_overflow_p))
14965             return true;
14966
14967           /* MAX where operand 0 is positive is positive.  */
14968           return tree_expr_nonnegative_warnv_p (op0,
14969                                                strict_overflow_p);
14970         }
14971       /* MAX where operand 1 is positive is positive.  */
14972       else if (tree_expr_nonzero_warnv_p (op1,
14973                                           &sub_strict_overflow_p)
14974                && tree_expr_nonnegative_warnv_p (op1,
14975                                                  &sub_strict_overflow_p))
14976         {
14977           if (sub_strict_overflow_p)
14978             *strict_overflow_p = true;
14979           return true;
14980         }
14981       break;
14982
14983     case BIT_IOR_EXPR:
14984       return (tree_expr_nonzero_warnv_p (op1,
14985                                          strict_overflow_p)
14986               || tree_expr_nonzero_warnv_p (op0,
14987                                             strict_overflow_p));
14988
14989     default:
14990       break;
14991   }
14992
14993   return false;
14994 }
14995
14996 /* Return true when T is an address and is known to be nonzero.
14997    For floating point we further ensure that T is not denormal.
14998    Similar logic is present in nonzero_address in rtlanal.h.
14999
15000    If the return value is based on the assumption that signed overflow
15001    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15002    change *STRICT_OVERFLOW_P.  */
15003
15004 bool
15005 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15006 {
15007   bool sub_strict_overflow_p;
15008   switch (TREE_CODE (t))
15009     {
15010     case INTEGER_CST:
15011       return !integer_zerop (t);
15012
15013     case ADDR_EXPR:
15014       {
15015         tree base = get_base_address (TREE_OPERAND (t, 0));
15016
15017         if (!base)
15018           return false;
15019
15020         /* Weak declarations may link to NULL.  */
15021         if (VAR_OR_FUNCTION_DECL_P (base))
15022           return !DECL_WEAK (base);
15023
15024         /* Constants are never weak.  */
15025         if (CONSTANT_CLASS_P (base))
15026           return true;
15027
15028         return false;
15029       }
15030
15031     case COND_EXPR:
15032       sub_strict_overflow_p = false;
15033       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15034                                      &sub_strict_overflow_p)
15035           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15036                                         &sub_strict_overflow_p))
15037         {
15038           if (sub_strict_overflow_p)
15039             *strict_overflow_p = true;
15040           return true;
15041         }
15042       break;
15043
15044     default:
15045       break;
15046     }
15047   return false;
15048 }
15049
15050 /* Return true when T is an address and is known to be nonzero.
15051    For floating point we further ensure that T is not denormal.
15052    Similar logic is present in nonzero_address in rtlanal.h.
15053
15054    If the return value is based on the assumption that signed overflow
15055    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15056    change *STRICT_OVERFLOW_P.  */
15057
15058 bool
15059 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15060 {
15061   tree type = TREE_TYPE (t);
15062   enum tree_code code;
15063
15064   /* Doing something useful for floating point would need more work.  */
15065   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
15066     return false;
15067
15068   code = TREE_CODE (t);
15069   switch (TREE_CODE_CLASS (code))
15070     {
15071     case tcc_unary:
15072       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15073                                               strict_overflow_p);
15074     case tcc_binary:
15075     case tcc_comparison:
15076       return tree_binary_nonzero_warnv_p (code, type,
15077                                                TREE_OPERAND (t, 0),
15078                                                TREE_OPERAND (t, 1),
15079                                                strict_overflow_p);
15080     case tcc_constant:
15081     case tcc_declaration:
15082     case tcc_reference:
15083       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15084
15085     default:
15086       break;
15087     }
15088
15089   switch (code)
15090     {
15091     case TRUTH_NOT_EXPR:
15092       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15093                                               strict_overflow_p);
15094
15095     case TRUTH_AND_EXPR:
15096     case TRUTH_OR_EXPR:
15097     case TRUTH_XOR_EXPR:
15098       return tree_binary_nonzero_warnv_p (code, type,
15099                                                TREE_OPERAND (t, 0),
15100                                                TREE_OPERAND (t, 1),
15101                                                strict_overflow_p);
15102
15103     case COND_EXPR:
15104     case CONSTRUCTOR:
15105     case OBJ_TYPE_REF:
15106     case ASSERT_EXPR:
15107     case ADDR_EXPR:
15108     case WITH_SIZE_EXPR:
15109     case EXC_PTR_EXPR:
15110     case SSA_NAME:
15111     case FILTER_EXPR:
15112       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15113
15114     case COMPOUND_EXPR:
15115     case MODIFY_EXPR:
15116     case BIND_EXPR:
15117       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15118                                         strict_overflow_p);
15119
15120     case SAVE_EXPR:
15121       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
15122                                         strict_overflow_p);
15123
15124     case CALL_EXPR:
15125       return alloca_call_p (t);
15126
15127     default:
15128       break;
15129     }
15130   return false;
15131 }
15132
15133 /* Return true when T is an address and is known to be nonzero.
15134    Handle warnings about undefined signed overflow.  */
15135
15136 bool
15137 tree_expr_nonzero_p (tree t)
15138 {
15139   bool ret, strict_overflow_p;
15140
15141   strict_overflow_p = false;
15142   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
15143   if (strict_overflow_p)
15144     fold_overflow_warning (("assuming signed overflow does not occur when "
15145                             "determining that expression is always "
15146                             "non-zero"),
15147                            WARN_STRICT_OVERFLOW_MISC);
15148   return ret;
15149 }
15150
15151 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15152    attempt to fold the expression to a constant without modifying TYPE,
15153    OP0 or OP1.
15154
15155    If the expression could be simplified to a constant, then return
15156    the constant.  If the expression would not be simplified to a
15157    constant, then return NULL_TREE.  */
15158
15159 tree
15160 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15161 {
15162   tree tem = fold_binary (code, type, op0, op1);
15163   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15164 }
15165
15166 /* Given the components of a unary expression CODE, TYPE and OP0,
15167    attempt to fold the expression to a constant without modifying
15168    TYPE or OP0.
15169
15170    If the expression could be simplified to a constant, then return
15171    the constant.  If the expression would not be simplified to a
15172    constant, then return NULL_TREE.  */
15173
15174 tree
15175 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15176 {
15177   tree tem = fold_unary (code, type, op0);
15178   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15179 }
15180
15181 /* If EXP represents referencing an element in a constant string
15182    (either via pointer arithmetic or array indexing), return the
15183    tree representing the value accessed, otherwise return NULL.  */
15184
15185 tree
15186 fold_read_from_constant_string (tree exp)
15187 {
15188   if ((TREE_CODE (exp) == INDIRECT_REF
15189        || TREE_CODE (exp) == ARRAY_REF)
15190       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15191     {
15192       tree exp1 = TREE_OPERAND (exp, 0);
15193       tree index;
15194       tree string;
15195
15196       if (TREE_CODE (exp) == INDIRECT_REF)
15197         string = string_constant (exp1, &index);
15198       else
15199         {
15200           tree low_bound = array_ref_low_bound (exp);
15201           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
15202
15203           /* Optimize the special-case of a zero lower bound.
15204
15205              We convert the low_bound to sizetype to avoid some problems
15206              with constant folding.  (E.g. suppose the lower bound is 1,
15207              and its mode is QI.  Without the conversion,l (ARRAY
15208              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15209              +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
15210           if (! integer_zerop (low_bound))
15211             index = size_diffop (index, fold_convert (sizetype, low_bound));
15212
15213           string = exp1;
15214         }
15215
15216       if (string
15217           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15218           && TREE_CODE (string) == STRING_CST
15219           && TREE_CODE (index) == INTEGER_CST
15220           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15221           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15222               == MODE_INT)
15223           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15224         return build_int_cst_type (TREE_TYPE (exp),
15225                                    (TREE_STRING_POINTER (string)
15226                                     [TREE_INT_CST_LOW (index)]));
15227     }
15228   return NULL;
15229 }
15230
15231 /* Return the tree for neg (ARG0) when ARG0 is known to be either
15232    an integer constant, real, or fixed-point constant.
15233
15234    TYPE is the type of the result.  */
15235
15236 static tree
15237 fold_negate_const (tree arg0, tree type)
15238 {
15239   tree t = NULL_TREE;
15240
15241   switch (TREE_CODE (arg0))
15242     {
15243     case INTEGER_CST:
15244       {
15245         unsigned HOST_WIDE_INT low;
15246         HOST_WIDE_INT high;
15247         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15248                                    TREE_INT_CST_HIGH (arg0),
15249                                    &low, &high);
15250         t = force_fit_type_double (type, low, high, 1,
15251                                    (overflow | TREE_OVERFLOW (arg0))
15252                                    && !TYPE_UNSIGNED (type));
15253         break;
15254       }
15255
15256     case REAL_CST:
15257       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15258       break;
15259
15260     case FIXED_CST:
15261       {
15262         FIXED_VALUE_TYPE f;
15263         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15264                                             &(TREE_FIXED_CST (arg0)), NULL,
15265                                             TYPE_SATURATING (type));
15266         t = build_fixed (type, f);
15267         /* Propagate overflow flags.  */
15268         if (overflow_p | TREE_OVERFLOW (arg0))
15269           TREE_OVERFLOW (t) = 1;
15270         break;
15271       }
15272
15273     default:
15274       gcc_unreachable ();
15275     }
15276
15277   return t;
15278 }
15279
15280 /* Return the tree for abs (ARG0) when ARG0 is known to be either
15281    an integer constant or real constant.
15282
15283    TYPE is the type of the result.  */
15284
15285 tree
15286 fold_abs_const (tree arg0, tree type)
15287 {
15288   tree t = NULL_TREE;
15289
15290   switch (TREE_CODE (arg0))
15291     {
15292     case INTEGER_CST:
15293       /* If the value is unsigned, then the absolute value is
15294          the same as the ordinary value.  */
15295       if (TYPE_UNSIGNED (type))
15296         t = arg0;
15297       /* Similarly, if the value is non-negative.  */
15298       else if (INT_CST_LT (integer_minus_one_node, arg0))
15299         t = arg0;
15300       /* If the value is negative, then the absolute value is
15301          its negation.  */
15302       else
15303         {
15304           unsigned HOST_WIDE_INT low;
15305           HOST_WIDE_INT high;
15306           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15307                                      TREE_INT_CST_HIGH (arg0),
15308                                      &low, &high);
15309           t = force_fit_type_double (type, low, high, -1,
15310                                      overflow | TREE_OVERFLOW (arg0));
15311         }
15312       break;
15313
15314     case REAL_CST:
15315       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15316         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15317       else
15318         t =  arg0;
15319       break;
15320
15321     default:
15322       gcc_unreachable ();
15323     }
15324
15325   return t;
15326 }
15327
15328 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
15329    constant.  TYPE is the type of the result.  */
15330
15331 static tree
15332 fold_not_const (tree arg0, tree type)
15333 {
15334   tree t = NULL_TREE;
15335
15336   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15337
15338   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
15339                              ~TREE_INT_CST_HIGH (arg0), 0,
15340                              TREE_OVERFLOW (arg0));
15341
15342   return t;
15343 }
15344
15345 /* Given CODE, a relational operator, the target type, TYPE and two
15346    constant operands OP0 and OP1, return the result of the
15347    relational operation.  If the result is not a compile time
15348    constant, then return NULL_TREE.  */
15349
15350 static tree
15351 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15352 {
15353   int result, invert;
15354
15355   /* From here on, the only cases we handle are when the result is
15356      known to be a constant.  */
15357
15358   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15359     {
15360       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15361       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15362
15363       /* Handle the cases where either operand is a NaN.  */
15364       if (real_isnan (c0) || real_isnan (c1))
15365         {
15366           switch (code)
15367             {
15368             case EQ_EXPR:
15369             case ORDERED_EXPR:
15370               result = 0;
15371               break;
15372
15373             case NE_EXPR:
15374             case UNORDERED_EXPR:
15375             case UNLT_EXPR:
15376             case UNLE_EXPR:
15377             case UNGT_EXPR:
15378             case UNGE_EXPR:
15379             case UNEQ_EXPR:
15380               result = 1;
15381               break;
15382
15383             case LT_EXPR:
15384             case LE_EXPR:
15385             case GT_EXPR:
15386             case GE_EXPR:
15387             case LTGT_EXPR:
15388               if (flag_trapping_math)
15389                 return NULL_TREE;
15390               result = 0;
15391               break;
15392
15393             default:
15394               gcc_unreachable ();
15395             }
15396
15397           return constant_boolean_node (result, type);
15398         }
15399
15400       return constant_boolean_node (real_compare (code, c0, c1), type);
15401     }
15402
15403   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15404     {
15405       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15406       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15407       return constant_boolean_node (fixed_compare (code, c0, c1), type);
15408     }
15409
15410   /* Handle equality/inequality of complex constants.  */
15411   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15412     {
15413       tree rcond = fold_relational_const (code, type,
15414                                           TREE_REALPART (op0),
15415                                           TREE_REALPART (op1));
15416       tree icond = fold_relational_const (code, type,
15417                                           TREE_IMAGPART (op0),
15418                                           TREE_IMAGPART (op1));
15419       if (code == EQ_EXPR)
15420         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
15421       else if (code == NE_EXPR)
15422         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
15423       else
15424         return NULL_TREE;
15425     }
15426
15427   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
15428
15429      To compute GT, swap the arguments and do LT.
15430      To compute GE, do LT and invert the result.
15431      To compute LE, swap the arguments, do LT and invert the result.
15432      To compute NE, do EQ and invert the result.
15433
15434      Therefore, the code below must handle only EQ and LT.  */
15435
15436   if (code == LE_EXPR || code == GT_EXPR)
15437     {
15438       tree tem = op0;
15439       op0 = op1;
15440       op1 = tem;
15441       code = swap_tree_comparison (code);
15442     }
15443
15444   /* Note that it is safe to invert for real values here because we
15445      have already handled the one case that it matters.  */
15446
15447   invert = 0;
15448   if (code == NE_EXPR || code == GE_EXPR)
15449     {
15450       invert = 1;
15451       code = invert_tree_comparison (code, false);
15452     }
15453
15454   /* Compute a result for LT or EQ if args permit;
15455      Otherwise return T.  */
15456   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15457     {
15458       if (code == EQ_EXPR)
15459         result = tree_int_cst_equal (op0, op1);
15460       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
15461         result = INT_CST_LT_UNSIGNED (op0, op1);
15462       else
15463         result = INT_CST_LT (op0, op1);
15464     }
15465   else
15466     return NULL_TREE;
15467
15468   if (invert)
15469     result ^= 1;
15470   return constant_boolean_node (result, type);
15471 }
15472
15473 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15474    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15475    itself.  */
15476
15477 tree
15478 fold_build_cleanup_point_expr (tree type, tree expr)
15479 {
15480   /* If the expression does not have side effects then we don't have to wrap
15481      it with a cleanup point expression.  */
15482   if (!TREE_SIDE_EFFECTS (expr))
15483     return expr;
15484
15485   /* If the expression is a return, check to see if the expression inside the
15486      return has no side effects or the right hand side of the modify expression
15487      inside the return. If either don't have side effects set we don't need to
15488      wrap the expression in a cleanup point expression.  Note we don't check the
15489      left hand side of the modify because it should always be a return decl.  */
15490   if (TREE_CODE (expr) == RETURN_EXPR)
15491     {
15492       tree op = TREE_OPERAND (expr, 0);
15493       if (!op || !TREE_SIDE_EFFECTS (op))
15494         return expr;
15495       op = TREE_OPERAND (op, 1);
15496       if (!TREE_SIDE_EFFECTS (op))
15497         return expr;
15498     }
15499   
15500   return build1 (CLEANUP_POINT_EXPR, type, expr);
15501 }
15502
15503 /* Given a pointer value OP0 and a type TYPE, return a simplified version
15504    of an indirection through OP0, or NULL_TREE if no simplification is
15505    possible.  */
15506
15507 tree
15508 fold_indirect_ref_1 (tree type, tree op0)
15509 {
15510   tree sub = op0;
15511   tree subtype;
15512
15513   STRIP_NOPS (sub);
15514   subtype = TREE_TYPE (sub);
15515   if (!POINTER_TYPE_P (subtype))
15516     return NULL_TREE;
15517
15518   if (TREE_CODE (sub) == ADDR_EXPR)
15519     {
15520       tree op = TREE_OPERAND (sub, 0);
15521       tree optype = TREE_TYPE (op);
15522       /* *&CONST_DECL -> to the value of the const decl.  */
15523       if (TREE_CODE (op) == CONST_DECL)
15524         return DECL_INITIAL (op);
15525       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
15526       if (type == optype)
15527         {
15528           tree fop = fold_read_from_constant_string (op);
15529           if (fop)
15530             return fop;
15531           else
15532             return op;
15533         }
15534       /* *(foo *)&fooarray => fooarray[0] */
15535       else if (TREE_CODE (optype) == ARRAY_TYPE
15536                && type == TREE_TYPE (optype))
15537         {
15538           tree type_domain = TYPE_DOMAIN (optype);
15539           tree min_val = size_zero_node;
15540           if (type_domain && TYPE_MIN_VALUE (type_domain))
15541             min_val = TYPE_MIN_VALUE (type_domain);
15542           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
15543         }
15544       /* *(foo *)&complexfoo => __real__ complexfoo */
15545       else if (TREE_CODE (optype) == COMPLEX_TYPE
15546                && type == TREE_TYPE (optype))
15547         return fold_build1 (REALPART_EXPR, type, op);
15548       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
15549       else if (TREE_CODE (optype) == VECTOR_TYPE
15550                && type == TREE_TYPE (optype))
15551         {
15552           tree part_width = TYPE_SIZE (type);
15553           tree index = bitsize_int (0);
15554           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
15555         }
15556     }
15557
15558   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15559   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15560       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15561     { 
15562       tree op00 = TREE_OPERAND (sub, 0);
15563       tree op01 = TREE_OPERAND (sub, 1);
15564       tree op00type;
15565       
15566       STRIP_NOPS (op00);
15567       op00type = TREE_TYPE (op00);
15568       if (TREE_CODE (op00) == ADDR_EXPR
15569           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
15570           && type == TREE_TYPE (TREE_TYPE (op00type)))
15571         { 
15572           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
15573           tree part_width = TYPE_SIZE (type);
15574           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
15575           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15576           tree index = bitsize_int (indexi);
15577
15578           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
15579             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
15580                                 part_width, index);
15581         
15582         }
15583     }
15584
15585
15586   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15587   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15588       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15589     {
15590       tree op00 = TREE_OPERAND (sub, 0);
15591       tree op01 = TREE_OPERAND (sub, 1);
15592       tree op00type;
15593
15594       STRIP_NOPS (op00);
15595       op00type = TREE_TYPE (op00);
15596       if (TREE_CODE (op00) == ADDR_EXPR
15597           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
15598           && type == TREE_TYPE (TREE_TYPE (op00type)))
15599         {
15600           tree size = TYPE_SIZE_UNIT (type);
15601           if (tree_int_cst_equal (size, op01))
15602             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
15603         }
15604     }
15605   
15606   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15607   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15608       && type == TREE_TYPE (TREE_TYPE (subtype)))
15609     {
15610       tree type_domain;
15611       tree min_val = size_zero_node;
15612       sub = build_fold_indirect_ref (sub);
15613       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
15614       if (type_domain && TYPE_MIN_VALUE (type_domain))
15615         min_val = TYPE_MIN_VALUE (type_domain);
15616       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
15617     }
15618
15619   return NULL_TREE;
15620 }
15621
15622 /* Builds an expression for an indirection through T, simplifying some
15623    cases.  */
15624
15625 tree
15626 build_fold_indirect_ref (tree t)
15627 {
15628   tree type = TREE_TYPE (TREE_TYPE (t));
15629   tree sub = fold_indirect_ref_1 (type, t);
15630
15631   if (sub)
15632     return sub;
15633   else
15634     return build1 (INDIRECT_REF, type, t);
15635 }
15636
15637 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
15638
15639 tree
15640 fold_indirect_ref (tree t)
15641 {
15642   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
15643
15644   if (sub)
15645     return sub;
15646   else
15647     return t;
15648 }
15649
15650 /* Strip non-trapping, non-side-effecting tree nodes from an expression
15651    whose result is ignored.  The type of the returned tree need not be
15652    the same as the original expression.  */
15653
15654 tree
15655 fold_ignored_result (tree t)
15656 {
15657   if (!TREE_SIDE_EFFECTS (t))
15658     return integer_zero_node;
15659
15660   for (;;)
15661     switch (TREE_CODE_CLASS (TREE_CODE (t)))
15662       {
15663       case tcc_unary:
15664         t = TREE_OPERAND (t, 0);
15665         break;
15666
15667       case tcc_binary:
15668       case tcc_comparison:
15669         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15670           t = TREE_OPERAND (t, 0);
15671         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15672           t = TREE_OPERAND (t, 1);
15673         else
15674           return t;
15675         break;
15676
15677       case tcc_expression:
15678         switch (TREE_CODE (t))
15679           {
15680           case COMPOUND_EXPR:
15681             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15682               return t;
15683             t = TREE_OPERAND (t, 0);
15684             break;
15685
15686           case COND_EXPR:
15687             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15688                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15689               return t;
15690             t = TREE_OPERAND (t, 0);
15691             break;
15692
15693           default:
15694             return t;
15695           }
15696         break;
15697
15698       default:
15699         return t;
15700       }
15701 }
15702
15703 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15704    This can only be applied to objects of a sizetype.  */
15705
15706 tree
15707 round_up (tree value, int divisor)
15708 {
15709   tree div = NULL_TREE;
15710
15711   gcc_assert (divisor > 0);
15712   if (divisor == 1)
15713     return value;
15714
15715   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15716      have to do anything.  Only do this when we are not given a const,
15717      because in that case, this check is more expensive than just
15718      doing it.  */
15719   if (TREE_CODE (value) != INTEGER_CST)
15720     {
15721       div = build_int_cst (TREE_TYPE (value), divisor);
15722
15723       if (multiple_of_p (TREE_TYPE (value), value, div))
15724         return value;
15725     }
15726
15727   /* If divisor is a power of two, simplify this to bit manipulation.  */
15728   if (divisor == (divisor & -divisor))
15729     {
15730       if (TREE_CODE (value) == INTEGER_CST)
15731         {
15732           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15733           unsigned HOST_WIDE_INT high;
15734           bool overflow_p;
15735
15736           if ((low & (divisor - 1)) == 0)
15737             return value;
15738
15739           overflow_p = TREE_OVERFLOW (value);
15740           high = TREE_INT_CST_HIGH (value);
15741           low &= ~(divisor - 1);
15742           low += divisor;
15743           if (low == 0)
15744             {
15745               high++;
15746               if (high == 0)
15747                 overflow_p = true;
15748             }
15749
15750           return force_fit_type_double (TREE_TYPE (value), low, high,
15751                                         -1, overflow_p);
15752         }
15753       else
15754         {
15755           tree t;
15756
15757           t = build_int_cst (TREE_TYPE (value), divisor - 1);
15758           value = size_binop (PLUS_EXPR, value, t);
15759           t = build_int_cst (TREE_TYPE (value), -divisor);
15760           value = size_binop (BIT_AND_EXPR, value, t);
15761         }
15762     }
15763   else
15764     {
15765       if (!div)
15766         div = build_int_cst (TREE_TYPE (value), divisor);
15767       value = size_binop (CEIL_DIV_EXPR, value, div);
15768       value = size_binop (MULT_EXPR, value, div);
15769     }
15770
15771   return value;
15772 }
15773
15774 /* Likewise, but round down.  */
15775
15776 tree
15777 round_down (tree value, int divisor)
15778 {
15779   tree div = NULL_TREE;
15780
15781   gcc_assert (divisor > 0);
15782   if (divisor == 1)
15783     return value;
15784
15785   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15786      have to do anything.  Only do this when we are not given a const,
15787      because in that case, this check is more expensive than just
15788      doing it.  */
15789   if (TREE_CODE (value) != INTEGER_CST)
15790     {
15791       div = build_int_cst (TREE_TYPE (value), divisor);
15792
15793       if (multiple_of_p (TREE_TYPE (value), value, div))
15794         return value;
15795     }
15796
15797   /* If divisor is a power of two, simplify this to bit manipulation.  */
15798   if (divisor == (divisor & -divisor))
15799     {
15800       tree t;
15801
15802       t = build_int_cst (TREE_TYPE (value), -divisor);
15803       value = size_binop (BIT_AND_EXPR, value, t);
15804     }
15805   else
15806     {
15807       if (!div)
15808         div = build_int_cst (TREE_TYPE (value), divisor);
15809       value = size_binop (FLOOR_DIV_EXPR, value, div);
15810       value = size_binop (MULT_EXPR, value, div);
15811     }
15812
15813   return value;
15814 }
15815
15816 /* Returns the pointer to the base of the object addressed by EXP and
15817    extracts the information about the offset of the access, storing it
15818    to PBITPOS and POFFSET.  */
15819
15820 static tree
15821 split_address_to_core_and_offset (tree exp,
15822                                   HOST_WIDE_INT *pbitpos, tree *poffset)
15823 {
15824   tree core;
15825   enum machine_mode mode;
15826   int unsignedp, volatilep;
15827   HOST_WIDE_INT bitsize;
15828
15829   if (TREE_CODE (exp) == ADDR_EXPR)
15830     {
15831       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15832                                   poffset, &mode, &unsignedp, &volatilep,
15833                                   false);
15834       core = build_fold_addr_expr (core);
15835     }
15836   else
15837     {
15838       core = exp;
15839       *pbitpos = 0;
15840       *poffset = NULL_TREE;
15841     }
15842
15843   return core;
15844 }
15845
15846 /* Returns true if addresses of E1 and E2 differ by a constant, false
15847    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
15848
15849 bool
15850 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15851 {
15852   tree core1, core2;
15853   HOST_WIDE_INT bitpos1, bitpos2;
15854   tree toffset1, toffset2, tdiff, type;
15855
15856   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15857   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15858
15859   if (bitpos1 % BITS_PER_UNIT != 0
15860       || bitpos2 % BITS_PER_UNIT != 0
15861       || !operand_equal_p (core1, core2, 0))
15862     return false;
15863
15864   if (toffset1 && toffset2)
15865     {
15866       type = TREE_TYPE (toffset1);
15867       if (type != TREE_TYPE (toffset2))
15868         toffset2 = fold_convert (type, toffset2);
15869
15870       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15871       if (!cst_and_fits_in_hwi (tdiff))
15872         return false;
15873
15874       *diff = int_cst_value (tdiff);
15875     }
15876   else if (toffset1 || toffset2)
15877     {
15878       /* If only one of the offsets is non-constant, the difference cannot
15879          be a constant.  */
15880       return false;
15881     }
15882   else
15883     *diff = 0;
15884
15885   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15886   return true;
15887 }
15888
15889 /* Simplify the floating point expression EXP when the sign of the
15890    result is not significant.  Return NULL_TREE if no simplification
15891    is possible.  */
15892
15893 tree
15894 fold_strip_sign_ops (tree exp)
15895 {
15896   tree arg0, arg1;
15897
15898   switch (TREE_CODE (exp))
15899     {
15900     case ABS_EXPR:
15901     case NEGATE_EXPR:
15902       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15903       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15904
15905     case MULT_EXPR:
15906     case RDIV_EXPR:
15907       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15908         return NULL_TREE;
15909       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15910       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15911       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15912         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15913                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
15914                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
15915       break;
15916
15917     case COMPOUND_EXPR:
15918       arg0 = TREE_OPERAND (exp, 0);
15919       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15920       if (arg1)
15921         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15922       break;
15923       
15924     case COND_EXPR:
15925       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15926       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15927       if (arg0 || arg1)
15928         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15929                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
15930                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
15931       break;
15932       
15933     case CALL_EXPR:
15934       {
15935         const enum built_in_function fcode = builtin_mathfn_code (exp);
15936         switch (fcode)
15937         {
15938         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15939           /* Strip copysign function call, return the 1st argument. */
15940           arg0 = CALL_EXPR_ARG (exp, 0);
15941           arg1 = CALL_EXPR_ARG (exp, 1);
15942           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15943
15944         default:
15945           /* Strip sign ops from the argument of "odd" math functions.  */
15946           if (negate_mathfn_p (fcode))
15947             {
15948               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15949               if (arg0)
15950                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
15951             }
15952           break;
15953         }
15954       }
15955       break;
15956
15957     default:
15958       break;
15959     }
15960   return NULL_TREE;
15961 }