OSDN Git Service

814d033ffc4ffa319d7493718b0d8f0e646758d1
[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
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 2, 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 COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 /*@@ This file should be rewritten to use an arbitrary precision
24   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
25   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
26   @@ The routines that translate from the ap rep should
27   @@ warn if precision et. al. is lost.
28   @@ This would also make life easier when this technology is used
29   @@ for cross-compilers.  */
30
31 /* The entry points in this file are fold, size_int_wide, size_binop
32    and force_fit_type_double.
33
34    fold takes a tree as argument and returns a simplified tree.
35
36    size_binop takes a tree code for an arithmetic operation
37    and two operands that are trees, and produces a tree for the
38    result, assuming the type comes from `sizetype'.
39
40    size_int takes an integer value, and creates a tree constant
41    with type from `sizetype'.
42
43    force_fit_type_double takes a constant, an overflowable flag and a
44    prior overflow indicator.  It forces the value to fit the type and
45    sets TREE_OVERFLOW.
46
47    Note: Since the folders get called on non-gimple code as well as
48    gimple code, we need to handle GIMPLE tuples as well as their
49    corresponding tree equivalents.  */
50
51 #include "config.h"
52 #include "system.h"
53 #include "coretypes.h"
54 #include "tm.h"
55 #include "flags.h"
56 #include "tree.h"
57 #include "real.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "toplev.h"
62 #include "intl.h"
63 #include "ggc.h"
64 #include "hashtab.h"
65 #include "langhooks.h"
66 #include "md5.h"
67
68 /* Nonzero if we are folding constants inside an initializer; zero
69    otherwise.  */
70 int folding_initializer = 0;
71
72 /* The following constants represent a bit based encoding of GCC's
73    comparison operators.  This encoding simplifies transformations
74    on relational comparison operators, such as AND and OR.  */
75 enum comparison_code {
76   COMPCODE_FALSE = 0,
77   COMPCODE_LT = 1,
78   COMPCODE_EQ = 2,
79   COMPCODE_LE = 3,
80   COMPCODE_GT = 4,
81   COMPCODE_LTGT = 5,
82   COMPCODE_GE = 6,
83   COMPCODE_ORD = 7,
84   COMPCODE_UNORD = 8,
85   COMPCODE_UNLT = 9,
86   COMPCODE_UNEQ = 10,
87   COMPCODE_UNLE = 11,
88   COMPCODE_UNGT = 12,
89   COMPCODE_NE = 13,
90   COMPCODE_UNGE = 14,
91   COMPCODE_TRUE = 15
92 };
93
94 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
95 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
96 static bool negate_mathfn_p (enum built_in_function);
97 static bool negate_expr_p (tree);
98 static tree negate_expr (tree);
99 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
100 static tree associate_trees (tree, tree, enum tree_code, tree);
101 static tree const_binop (enum tree_code, tree, tree, int);
102 static enum comparison_code comparison_to_compcode (enum tree_code);
103 static enum tree_code compcode_to_comparison (enum comparison_code);
104 static tree combine_comparisons (enum tree_code, enum tree_code,
105                                  enum tree_code, tree, tree, tree);
106 static int truth_value_p (enum tree_code);
107 static int operand_equal_for_comparison_p (tree, tree, tree);
108 static int twoval_comparison_p (tree, tree *, tree *, int *);
109 static tree eval_subst (tree, tree, tree, tree, tree);
110 static tree pedantic_omit_one_operand (tree, tree, tree);
111 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
112 static tree make_bit_field_ref (tree, tree, int, int, int);
113 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
114 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
115                                     enum machine_mode *, int *, int *,
116                                     tree *, tree *);
117 static int all_ones_mask_p (tree, int);
118 static tree sign_bit_p (tree, tree);
119 static int simple_operand_p (tree);
120 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
121 static tree range_predecessor (tree);
122 static tree range_successor (tree);
123 static tree make_range (tree, int *, tree *, tree *, bool *);
124 static tree build_range_check (tree, tree, int, tree, tree);
125 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
126                          tree);
127 static tree fold_range_test (enum tree_code, tree, tree, tree);
128 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
129 static tree unextend (tree, int, int, tree);
130 static tree fold_truthop (enum tree_code, tree, tree, tree);
131 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
132 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
133 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
134 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
135                                                  tree, tree,
136                                                  tree, tree, int);
137 static bool fold_real_zero_addition_p (tree, tree, int);
138 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
139                                  tree, tree, tree);
140 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
141 static tree fold_div_compare (enum tree_code, tree, tree, tree);
142 static bool reorder_operands_p (tree, tree);
143 static tree fold_negate_const (tree, tree);
144 static tree fold_not_const (tree, tree);
145 static tree fold_relational_const (enum tree_code, tree, tree, tree);
146
147
148 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
149    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
150    and SUM1.  Then this yields nonzero if overflow occurred during the
151    addition.
152
153    Overflow occurs if A and B have the same sign, but A and SUM differ in
154    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
155    sign.  */
156 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
157 \f
158 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
159    We do that by representing the two-word integer in 4 words, with only
160    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
161    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
162
163 #define LOWPART(x) \
164   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
165 #define HIGHPART(x) \
166   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
167 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
168
169 /* Unpack a two-word integer into 4 words.
170    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
171    WORDS points to the array of HOST_WIDE_INTs.  */
172
173 static void
174 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
175 {
176   words[0] = LOWPART (low);
177   words[1] = HIGHPART (low);
178   words[2] = LOWPART (hi);
179   words[3] = HIGHPART (hi);
180 }
181
182 /* Pack an array of 4 words into a two-word integer.
183    WORDS points to the array of words.
184    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
185
186 static void
187 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
188         HOST_WIDE_INT *hi)
189 {
190   *low = words[0] + words[1] * BASE;
191   *hi = words[2] + words[3] * BASE;
192 }
193 \f
194 /* Force the double-word integer L1, H1 to be within the range of the
195    integer type TYPE.  Stores the properly truncated and sign-extended
196    double-word integer in *LV, *HV.  Returns true if the operation
197    overflows, that is, argument and result are different.  */
198
199 int
200 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
201                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, tree type)
202 {
203   unsigned HOST_WIDE_INT low0 = l1;
204   HOST_WIDE_INT high0 = h1;
205   unsigned int prec;
206   int sign_extended_type;
207
208   if (POINTER_TYPE_P (type)
209       || TREE_CODE (type) == OFFSET_TYPE)
210     prec = POINTER_SIZE;
211   else
212     prec = TYPE_PRECISION (type);
213
214   /* Size types *are* sign extended.  */
215   sign_extended_type = (!TYPE_UNSIGNED (type)
216                         || (TREE_CODE (type) == INTEGER_TYPE
217                             && TYPE_IS_SIZETYPE (type)));
218
219   /* First clear all bits that are beyond the type's precision.  */
220   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
221     ;
222   else if (prec > HOST_BITS_PER_WIDE_INT)
223     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
224   else
225     {
226       h1 = 0;
227       if (prec < HOST_BITS_PER_WIDE_INT)
228         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
229     }
230
231   /* Then do sign extension if necessary.  */
232   if (!sign_extended_type)
233     /* No sign extension */;
234   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
235     /* Correct width already.  */;
236   else if (prec > HOST_BITS_PER_WIDE_INT)
237     {
238       /* Sign extend top half? */
239       if (h1 & ((unsigned HOST_WIDE_INT)1
240                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
241         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
242     }
243   else if (prec == HOST_BITS_PER_WIDE_INT)
244     {
245       if ((HOST_WIDE_INT)l1 < 0)
246         h1 = -1;
247     }
248   else
249     {
250       /* Sign extend bottom half? */
251       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
252         {
253           h1 = -1;
254           l1 |= (HOST_WIDE_INT)(-1) << prec;
255         }
256     }
257
258   *lv = l1;
259   *hv = h1;
260
261   /* If the value didn't fit, signal overflow.  */
262   return l1 != low0 || h1 != high0;
263 }
264
265 /* We force the double-int HIGH:LOW to the range of the type TYPE by
266    sign or zero extending it.
267    OVERFLOWABLE indicates if we are interested
268    in overflow of the value, when >0 we are only interested in signed
269    overflow, for <0 we are interested in any overflow.  OVERFLOWED
270    indicates whether overflow has already occurred.  CONST_OVERFLOWED
271    indicates whether constant overflow has already occurred.  We force
272    T's value to be within range of T's type (by setting to 0 or 1 all
273    the bits outside the type's range).  We set TREE_OVERFLOWED if,
274         OVERFLOWED is nonzero,
275         or OVERFLOWABLE is >0 and signed overflow occurs
276         or OVERFLOWABLE is <0 and any overflow occurs
277    We return a new tree node for the extended double-int.  The node
278    is shared if no overflow flags are set.  */
279
280 tree
281 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
282                        HOST_WIDE_INT high, int overflowable,
283                        bool overflowed)
284 {
285   int sign_extended_type;
286   bool overflow;
287
288   /* Size types *are* sign extended.  */
289   sign_extended_type = (!TYPE_UNSIGNED (type)
290                         || (TREE_CODE (type) == INTEGER_TYPE
291                             && TYPE_IS_SIZETYPE (type)));
292
293   overflow = fit_double_type (low, high, &low, &high, type);
294
295   /* If we need to set overflow flags, return a new unshared node.  */
296   if (overflowed || overflow)
297     {
298       if (overflowed
299           || overflowable < 0
300           || (overflowable > 0 && sign_extended_type))
301         {
302           tree t = make_node (INTEGER_CST);
303           TREE_INT_CST_LOW (t) = low;
304           TREE_INT_CST_HIGH (t) = high;
305           TREE_TYPE (t) = type;
306           TREE_OVERFLOW (t) = 1;
307           return t;
308         }
309     }
310
311   /* Else build a shared node.  */
312   return build_int_cst_wide (type, low, high);
313 }
314 \f
315 /* Add two doubleword integers with doubleword result.
316    Return nonzero if the operation overflows according to UNSIGNED_P.
317    Each argument is given as two `HOST_WIDE_INT' pieces.
318    One argument is L1 and H1; the other, L2 and H2.
319    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
320
321 int
322 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
323                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
324                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
325                       bool unsigned_p)
326 {
327   unsigned HOST_WIDE_INT l;
328   HOST_WIDE_INT h;
329
330   l = l1 + l2;
331   h = h1 + h2 + (l < l1);
332
333   *lv = l;
334   *hv = h;
335
336   if (unsigned_p)
337     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
338   else
339     return OVERFLOW_SUM_SIGN (h1, h2, h);
340 }
341
342 /* Negate a doubleword integer with doubleword result.
343    Return nonzero if the operation overflows, assuming it's signed.
344    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
345    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
346
347 int
348 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
349             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
350 {
351   if (l1 == 0)
352     {
353       *lv = 0;
354       *hv = - h1;
355       return (*hv & h1) < 0;
356     }
357   else
358     {
359       *lv = -l1;
360       *hv = ~h1;
361       return 0;
362     }
363 }
364 \f
365 /* Multiply two doubleword integers with doubleword result.
366    Return nonzero if the operation overflows according to UNSIGNED_P.
367    Each argument is given as two `HOST_WIDE_INT' pieces.
368    One argument is L1 and H1; the other, L2 and H2.
369    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
370
371 int
372 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
373                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
374                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
375                       bool unsigned_p)
376 {
377   HOST_WIDE_INT arg1[4];
378   HOST_WIDE_INT arg2[4];
379   HOST_WIDE_INT prod[4 * 2];
380   unsigned HOST_WIDE_INT carry;
381   int i, j, k;
382   unsigned HOST_WIDE_INT toplow, neglow;
383   HOST_WIDE_INT tophigh, neghigh;
384
385   encode (arg1, l1, h1);
386   encode (arg2, l2, h2);
387
388   memset (prod, 0, sizeof prod);
389
390   for (i = 0; i < 4; i++)
391     {
392       carry = 0;
393       for (j = 0; j < 4; j++)
394         {
395           k = i + j;
396           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
397           carry += arg1[i] * arg2[j];
398           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
399           carry += prod[k];
400           prod[k] = LOWPART (carry);
401           carry = HIGHPART (carry);
402         }
403       prod[i + 4] = carry;
404     }
405
406   decode (prod, lv, hv);
407   decode (prod + 4, &toplow, &tophigh);
408
409   /* Unsigned overflow is immediate.  */
410   if (unsigned_p)
411     return (toplow | tophigh) != 0;
412
413   /* Check for signed overflow by calculating the signed representation of the
414      top half of the result; it should agree with the low half's sign bit.  */
415   if (h1 < 0)
416     {
417       neg_double (l2, h2, &neglow, &neghigh);
418       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
419     }
420   if (h2 < 0)
421     {
422       neg_double (l1, h1, &neglow, &neghigh);
423       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
424     }
425   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
426 }
427 \f
428 /* Shift the doubleword integer in L1, H1 left by COUNT places
429    keeping only PREC bits of result.
430    Shift right if COUNT is negative.
431    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
432    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
433
434 void
435 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
436                HOST_WIDE_INT count, unsigned int prec,
437                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
438 {
439   unsigned HOST_WIDE_INT signmask;
440
441   if (count < 0)
442     {
443       rshift_double (l1, h1, -count, prec, lv, hv, arith);
444       return;
445     }
446
447   if (SHIFT_COUNT_TRUNCATED)
448     count %= prec;
449
450   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
451     {
452       /* Shifting by the host word size is undefined according to the
453          ANSI standard, so we must handle this as a special case.  */
454       *hv = 0;
455       *lv = 0;
456     }
457   else if (count >= HOST_BITS_PER_WIDE_INT)
458     {
459       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
460       *lv = 0;
461     }
462   else
463     {
464       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
465              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
466       *lv = l1 << count;
467     }
468
469   /* Sign extend all bits that are beyond the precision.  */
470
471   signmask = -((prec > HOST_BITS_PER_WIDE_INT
472                 ? ((unsigned HOST_WIDE_INT) *hv
473                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
474                 : (*lv >> (prec - 1))) & 1);
475
476   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
477     ;
478   else if (prec >= HOST_BITS_PER_WIDE_INT)
479     {
480       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
481       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
482     }
483   else
484     {
485       *hv = signmask;
486       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
487       *lv |= signmask << prec;
488     }
489 }
490
491 /* Shift the doubleword integer in L1, H1 right by COUNT places
492    keeping only PREC bits of result.  COUNT must be positive.
493    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
494    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
495
496 void
497 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
498                HOST_WIDE_INT count, unsigned int prec,
499                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
500                int arith)
501 {
502   unsigned HOST_WIDE_INT signmask;
503
504   signmask = (arith
505               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
506               : 0);
507
508   if (SHIFT_COUNT_TRUNCATED)
509     count %= prec;
510
511   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
512     {
513       /* Shifting by the host word size is undefined according to the
514          ANSI standard, so we must handle this as a special case.  */
515       *hv = 0;
516       *lv = 0;
517     }
518   else if (count >= HOST_BITS_PER_WIDE_INT)
519     {
520       *hv = 0;
521       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
522     }
523   else
524     {
525       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
526       *lv = ((l1 >> count)
527              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
528     }
529
530   /* Zero / sign extend all bits that are beyond the precision.  */
531
532   if (count >= (HOST_WIDE_INT)prec)
533     {
534       *hv = signmask;
535       *lv = signmask;
536     }
537   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
538     ;
539   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
540     {
541       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
542       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
543     }
544   else
545     {
546       *hv = signmask;
547       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
548       *lv |= signmask << (prec - count);
549     }
550 }
551 \f
552 /* Rotate the doubleword integer in L1, H1 left by COUNT places
553    keeping only PREC bits of result.
554    Rotate right if COUNT is negative.
555    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
556
557 void
558 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
559                 HOST_WIDE_INT count, unsigned int prec,
560                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
561 {
562   unsigned HOST_WIDE_INT s1l, s2l;
563   HOST_WIDE_INT s1h, s2h;
564
565   count %= prec;
566   if (count < 0)
567     count += prec;
568
569   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
570   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
571   *lv = s1l | s2l;
572   *hv = s1h | s2h;
573 }
574
575 /* Rotate the doubleword integer in L1, H1 left by COUNT places
576    keeping only PREC bits of result.  COUNT must be positive.
577    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
578
579 void
580 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
581                 HOST_WIDE_INT count, unsigned int prec,
582                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
583 {
584   unsigned HOST_WIDE_INT s1l, s2l;
585   HOST_WIDE_INT s1h, s2h;
586
587   count %= prec;
588   if (count < 0)
589     count += prec;
590
591   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
592   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
593   *lv = s1l | s2l;
594   *hv = s1h | s2h;
595 }
596 \f
597 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
598    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
599    CODE is a tree code for a kind of division, one of
600    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
601    or EXACT_DIV_EXPR
602    It controls how the quotient is rounded to an integer.
603    Return nonzero if the operation overflows.
604    UNS nonzero says do unsigned division.  */
605
606 int
607 div_and_round_double (enum tree_code code, int uns,
608                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
609                       HOST_WIDE_INT hnum_orig,
610                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
611                       HOST_WIDE_INT hden_orig,
612                       unsigned HOST_WIDE_INT *lquo,
613                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
614                       HOST_WIDE_INT *hrem)
615 {
616   int quo_neg = 0;
617   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
618   HOST_WIDE_INT den[4], quo[4];
619   int i, j;
620   unsigned HOST_WIDE_INT work;
621   unsigned HOST_WIDE_INT carry = 0;
622   unsigned HOST_WIDE_INT lnum = lnum_orig;
623   HOST_WIDE_INT hnum = hnum_orig;
624   unsigned HOST_WIDE_INT lden = lden_orig;
625   HOST_WIDE_INT hden = hden_orig;
626   int overflow = 0;
627
628   if (hden == 0 && lden == 0)
629     overflow = 1, lden = 1;
630
631   /* Calculate quotient sign and convert operands to unsigned.  */
632   if (!uns)
633     {
634       if (hnum < 0)
635         {
636           quo_neg = ~ quo_neg;
637           /* (minimum integer) / (-1) is the only overflow case.  */
638           if (neg_double (lnum, hnum, &lnum, &hnum)
639               && ((HOST_WIDE_INT) lden & hden) == -1)
640             overflow = 1;
641         }
642       if (hden < 0)
643         {
644           quo_neg = ~ quo_neg;
645           neg_double (lden, hden, &lden, &hden);
646         }
647     }
648
649   if (hnum == 0 && hden == 0)
650     {                           /* single precision */
651       *hquo = *hrem = 0;
652       /* This unsigned division rounds toward zero.  */
653       *lquo = lnum / lden;
654       goto finish_up;
655     }
656
657   if (hnum == 0)
658     {                           /* trivial case: dividend < divisor */
659       /* hden != 0 already checked.  */
660       *hquo = *lquo = 0;
661       *hrem = hnum;
662       *lrem = lnum;
663       goto finish_up;
664     }
665
666   memset (quo, 0, sizeof quo);
667
668   memset (num, 0, sizeof num);  /* to zero 9th element */
669   memset (den, 0, sizeof den);
670
671   encode (num, lnum, hnum);
672   encode (den, lden, hden);
673
674   /* Special code for when the divisor < BASE.  */
675   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
676     {
677       /* hnum != 0 already checked.  */
678       for (i = 4 - 1; i >= 0; i--)
679         {
680           work = num[i] + carry * BASE;
681           quo[i] = work / lden;
682           carry = work % lden;
683         }
684     }
685   else
686     {
687       /* Full double precision division,
688          with thanks to Don Knuth's "Seminumerical Algorithms".  */
689       int num_hi_sig, den_hi_sig;
690       unsigned HOST_WIDE_INT quo_est, scale;
691
692       /* Find the highest nonzero divisor digit.  */
693       for (i = 4 - 1;; i--)
694         if (den[i] != 0)
695           {
696             den_hi_sig = i;
697             break;
698           }
699
700       /* Insure that the first digit of the divisor is at least BASE/2.
701          This is required by the quotient digit estimation algorithm.  */
702
703       scale = BASE / (den[den_hi_sig] + 1);
704       if (scale > 1)
705         {               /* scale divisor and dividend */
706           carry = 0;
707           for (i = 0; i <= 4 - 1; i++)
708             {
709               work = (num[i] * scale) + carry;
710               num[i] = LOWPART (work);
711               carry = HIGHPART (work);
712             }
713
714           num[4] = carry;
715           carry = 0;
716           for (i = 0; i <= 4 - 1; i++)
717             {
718               work = (den[i] * scale) + carry;
719               den[i] = LOWPART (work);
720               carry = HIGHPART (work);
721               if (den[i] != 0) den_hi_sig = i;
722             }
723         }
724
725       num_hi_sig = 4;
726
727       /* Main loop */
728       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
729         {
730           /* Guess the next quotient digit, quo_est, by dividing the first
731              two remaining dividend digits by the high order quotient digit.
732              quo_est is never low and is at most 2 high.  */
733           unsigned HOST_WIDE_INT tmp;
734
735           num_hi_sig = i + den_hi_sig + 1;
736           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
737           if (num[num_hi_sig] != den[den_hi_sig])
738             quo_est = work / den[den_hi_sig];
739           else
740             quo_est = BASE - 1;
741
742           /* Refine quo_est so it's usually correct, and at most one high.  */
743           tmp = work - quo_est * den[den_hi_sig];
744           if (tmp < BASE
745               && (den[den_hi_sig - 1] * quo_est
746                   > (tmp * BASE + num[num_hi_sig - 2])))
747             quo_est--;
748
749           /* Try QUO_EST as the quotient digit, by multiplying the
750              divisor by QUO_EST and subtracting from the remaining dividend.
751              Keep in mind that QUO_EST is the I - 1st digit.  */
752
753           carry = 0;
754           for (j = 0; j <= den_hi_sig; j++)
755             {
756               work = quo_est * den[j] + carry;
757               carry = HIGHPART (work);
758               work = num[i + j] - LOWPART (work);
759               num[i + j] = LOWPART (work);
760               carry += HIGHPART (work) != 0;
761             }
762
763           /* If quo_est was high by one, then num[i] went negative and
764              we need to correct things.  */
765           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
766             {
767               quo_est--;
768               carry = 0;                /* add divisor back in */
769               for (j = 0; j <= den_hi_sig; j++)
770                 {
771                   work = num[i + j] + den[j] + carry;
772                   carry = HIGHPART (work);
773                   num[i + j] = LOWPART (work);
774                 }
775
776               num [num_hi_sig] += carry;
777             }
778
779           /* Store the quotient digit.  */
780           quo[i] = quo_est;
781         }
782     }
783
784   decode (quo, lquo, hquo);
785
786  finish_up:
787   /* If result is negative, make it so.  */
788   if (quo_neg)
789     neg_double (*lquo, *hquo, lquo, hquo);
790
791   /* Compute trial remainder:  rem = num - (quo * den)  */
792   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
793   neg_double (*lrem, *hrem, lrem, hrem);
794   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
795
796   switch (code)
797     {
798     case TRUNC_DIV_EXPR:
799     case TRUNC_MOD_EXPR:        /* round toward zero */
800     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
801       return overflow;
802
803     case FLOOR_DIV_EXPR:
804     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
805       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
806         {
807           /* quo = quo - 1;  */
808           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
809                       lquo, hquo);
810         }
811       else
812         return overflow;
813       break;
814
815     case CEIL_DIV_EXPR:
816     case CEIL_MOD_EXPR:         /* round toward positive infinity */
817       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
818         {
819           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
820                       lquo, hquo);
821         }
822       else
823         return overflow;
824       break;
825
826     case ROUND_DIV_EXPR:
827     case ROUND_MOD_EXPR:        /* round to closest integer */
828       {
829         unsigned HOST_WIDE_INT labs_rem = *lrem;
830         HOST_WIDE_INT habs_rem = *hrem;
831         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
832         HOST_WIDE_INT habs_den = hden, htwice;
833
834         /* Get absolute values.  */
835         if (*hrem < 0)
836           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
837         if (hden < 0)
838           neg_double (lden, hden, &labs_den, &habs_den);
839
840         /* If (2 * abs (lrem) >= abs (lden)) */
841         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
842                     labs_rem, habs_rem, &ltwice, &htwice);
843
844         if (((unsigned HOST_WIDE_INT) habs_den
845              < (unsigned HOST_WIDE_INT) htwice)
846             || (((unsigned HOST_WIDE_INT) habs_den
847                  == (unsigned HOST_WIDE_INT) htwice)
848                 && (labs_den < ltwice)))
849           {
850             if (*hquo < 0)
851               /* quo = quo - 1;  */
852               add_double (*lquo, *hquo,
853                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
854             else
855               /* quo = quo + 1; */
856               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
857                           lquo, hquo);
858           }
859         else
860           return overflow;
861       }
862       break;
863
864     default:
865       gcc_unreachable ();
866     }
867
868   /* Compute true remainder:  rem = num - (quo * den)  */
869   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
870   neg_double (*lrem, *hrem, lrem, hrem);
871   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
872   return overflow;
873 }
874
875 /* If ARG2 divides ARG1 with zero remainder, carries out the division
876    of type CODE and returns the quotient.
877    Otherwise returns NULL_TREE.  */
878
879 static tree
880 div_if_zero_remainder (enum tree_code code, tree arg1, tree arg2)
881 {
882   unsigned HOST_WIDE_INT int1l, int2l;
883   HOST_WIDE_INT int1h, int2h;
884   unsigned HOST_WIDE_INT quol, reml;
885   HOST_WIDE_INT quoh, remh;
886   tree type = TREE_TYPE (arg1);
887   int uns = TYPE_UNSIGNED (type);
888
889   int1l = TREE_INT_CST_LOW (arg1);
890   int1h = TREE_INT_CST_HIGH (arg1);
891   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
892      &obj[some_exotic_number].  */
893   if (POINTER_TYPE_P (type))
894     {
895       uns = false;
896       type = signed_type_for (type);
897       fit_double_type (int1l, int1h, &int1l, &int1h,
898                        type);
899     }
900   else
901     fit_double_type (int1l, int1h, &int1l, &int1h, type);
902   int2l = TREE_INT_CST_LOW (arg2);
903   int2h = TREE_INT_CST_HIGH (arg2);
904
905   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
906                         &quol, &quoh, &reml, &remh);
907   if (remh != 0 || reml != 0)
908     return NULL_TREE;
909
910   return build_int_cst_wide (type, quol, quoh);
911 }
912 \f
913 /* This is nonzero if we should defer warnings about undefined
914    overflow.  This facility exists because these warnings are a
915    special case.  The code to estimate loop iterations does not want
916    to issue any warnings, since it works with expressions which do not
917    occur in user code.  Various bits of cleanup code call fold(), but
918    only use the result if it has certain characteristics (e.g., is a
919    constant); that code only wants to issue a warning if the result is
920    used.  */
921
922 static int fold_deferring_overflow_warnings;
923
924 /* If a warning about undefined overflow is deferred, this is the
925    warning.  Note that this may cause us to turn two warnings into
926    one, but that is fine since it is sufficient to only give one
927    warning per expression.  */
928
929 static const char* fold_deferred_overflow_warning;
930
931 /* If a warning about undefined overflow is deferred, this is the
932    level at which the warning should be emitted.  */
933
934 static enum warn_strict_overflow_code fold_deferred_overflow_code;
935
936 /* Start deferring overflow warnings.  We could use a stack here to
937    permit nested calls, but at present it is not necessary.  */
938
939 void
940 fold_defer_overflow_warnings (void)
941 {
942   ++fold_deferring_overflow_warnings;
943 }
944
945 /* Stop deferring overflow warnings.  If there is a pending warning,
946    and ISSUE is true, then issue the warning if appropriate.  STMT is
947    the statement with which the warning should be associated (used for
948    location information); STMT may be NULL.  CODE is the level of the
949    warning--a warn_strict_overflow_code value.  This function will use
950    the smaller of CODE and the deferred code when deciding whether to
951    issue the warning.  CODE may be zero to mean to always use the
952    deferred code.  */
953
954 void
955 fold_undefer_overflow_warnings (bool issue, tree stmt, int code)
956 {
957   const char *warnmsg;
958   location_t locus;
959
960   gcc_assert (fold_deferring_overflow_warnings > 0);
961   --fold_deferring_overflow_warnings;
962   if (fold_deferring_overflow_warnings > 0)
963     {
964       if (fold_deferred_overflow_warning != NULL
965           && code != 0
966           && code < (int) fold_deferred_overflow_code)
967         fold_deferred_overflow_code = code;
968       return;
969     }
970
971   warnmsg = fold_deferred_overflow_warning;
972   fold_deferred_overflow_warning = NULL;
973
974   if (!issue || warnmsg == NULL)
975     return;
976
977   /* Use the smallest code level when deciding to issue the
978      warning.  */
979   if (code == 0 || code > (int) fold_deferred_overflow_code)
980     code = fold_deferred_overflow_code;
981
982   if (!issue_strict_overflow_warning (code))
983     return;
984
985   if (stmt == NULL_TREE || !expr_has_location (stmt))
986     locus = input_location;
987   else
988     locus = expr_location (stmt);
989   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
990 }
991
992 /* Stop deferring overflow warnings, ignoring any deferred
993    warnings.  */
994
995 void
996 fold_undefer_and_ignore_overflow_warnings (void)
997 {
998   fold_undefer_overflow_warnings (false, NULL_TREE, 0);
999 }
1000
1001 /* Whether we are deferring overflow warnings.  */
1002
1003 bool
1004 fold_deferring_overflow_warnings_p (void)
1005 {
1006   return fold_deferring_overflow_warnings > 0;
1007 }
1008
1009 /* This is called when we fold something based on the fact that signed
1010    overflow is undefined.  */
1011
1012 static void
1013 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1014 {
1015   gcc_assert (!flag_wrapv && !flag_trapv);
1016   if (fold_deferring_overflow_warnings > 0)
1017     {
1018       if (fold_deferred_overflow_warning == NULL
1019           || wc < fold_deferred_overflow_code)
1020         {
1021           fold_deferred_overflow_warning = gmsgid;
1022           fold_deferred_overflow_code = wc;
1023         }
1024     }
1025   else if (issue_strict_overflow_warning (wc))
1026     warning (OPT_Wstrict_overflow, gmsgid);
1027 }
1028 \f
1029 /* Return true if the built-in mathematical function specified by CODE
1030    is odd, i.e. -f(x) == f(-x).  */
1031
1032 static bool
1033 negate_mathfn_p (enum built_in_function code)
1034 {
1035   switch (code)
1036     {
1037     CASE_FLT_FN (BUILT_IN_ASIN):
1038     CASE_FLT_FN (BUILT_IN_ASINH):
1039     CASE_FLT_FN (BUILT_IN_ATAN):
1040     CASE_FLT_FN (BUILT_IN_ATANH):
1041     CASE_FLT_FN (BUILT_IN_CASIN):
1042     CASE_FLT_FN (BUILT_IN_CASINH):
1043     CASE_FLT_FN (BUILT_IN_CATAN):
1044     CASE_FLT_FN (BUILT_IN_CATANH):
1045     CASE_FLT_FN (BUILT_IN_CBRT):
1046     CASE_FLT_FN (BUILT_IN_CPROJ):
1047     CASE_FLT_FN (BUILT_IN_CSIN):
1048     CASE_FLT_FN (BUILT_IN_CSINH):
1049     CASE_FLT_FN (BUILT_IN_CTAN):
1050     CASE_FLT_FN (BUILT_IN_CTANH):
1051     CASE_FLT_FN (BUILT_IN_ERF):
1052     CASE_FLT_FN (BUILT_IN_LLROUND):
1053     CASE_FLT_FN (BUILT_IN_LROUND):
1054     CASE_FLT_FN (BUILT_IN_ROUND):
1055     CASE_FLT_FN (BUILT_IN_SIN):
1056     CASE_FLT_FN (BUILT_IN_SINH):
1057     CASE_FLT_FN (BUILT_IN_TAN):
1058     CASE_FLT_FN (BUILT_IN_TANH):
1059     CASE_FLT_FN (BUILT_IN_TRUNC):
1060       return true;
1061
1062     CASE_FLT_FN (BUILT_IN_LLRINT):
1063     CASE_FLT_FN (BUILT_IN_LRINT):
1064     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1065     CASE_FLT_FN (BUILT_IN_RINT):
1066       return !flag_rounding_math;
1067     
1068     default:
1069       break;
1070     }
1071   return false;
1072 }
1073
1074 /* Check whether we may negate an integer constant T without causing
1075    overflow.  */
1076
1077 bool
1078 may_negate_without_overflow_p (tree t)
1079 {
1080   unsigned HOST_WIDE_INT val;
1081   unsigned int prec;
1082   tree type;
1083
1084   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1085
1086   type = TREE_TYPE (t);
1087   if (TYPE_UNSIGNED (type))
1088     return false;
1089
1090   prec = TYPE_PRECISION (type);
1091   if (prec > HOST_BITS_PER_WIDE_INT)
1092     {
1093       if (TREE_INT_CST_LOW (t) != 0)
1094         return true;
1095       prec -= HOST_BITS_PER_WIDE_INT;
1096       val = TREE_INT_CST_HIGH (t);
1097     }
1098   else
1099     val = TREE_INT_CST_LOW (t);
1100   if (prec < HOST_BITS_PER_WIDE_INT)
1101     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1102   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1103 }
1104
1105 /* Determine whether an expression T can be cheaply negated using
1106    the function negate_expr without introducing undefined overflow.  */
1107
1108 static bool
1109 negate_expr_p (tree t)
1110 {
1111   tree type;
1112
1113   if (t == 0)
1114     return false;
1115
1116   type = TREE_TYPE (t);
1117
1118   STRIP_SIGN_NOPS (t);
1119   switch (TREE_CODE (t))
1120     {
1121     case INTEGER_CST:
1122       if (TYPE_OVERFLOW_WRAPS (type))
1123         return true;
1124
1125       /* Check that -CST will not overflow type.  */
1126       return may_negate_without_overflow_p (t);
1127     case BIT_NOT_EXPR:
1128       return (INTEGRAL_TYPE_P (type)
1129               && TYPE_OVERFLOW_WRAPS (type));
1130
1131     case REAL_CST:
1132     case NEGATE_EXPR:
1133       return true;
1134
1135     case COMPLEX_CST:
1136       return negate_expr_p (TREE_REALPART (t))
1137              && negate_expr_p (TREE_IMAGPART (t));
1138
1139     case COMPLEX_EXPR:
1140       return negate_expr_p (TREE_OPERAND (t, 0))
1141              && negate_expr_p (TREE_OPERAND (t, 1));
1142
1143     case CONJ_EXPR:
1144       return negate_expr_p (TREE_OPERAND (t, 0));
1145
1146     case PLUS_EXPR:
1147       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1148           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1149         return false;
1150       /* -(A + B) -> (-B) - A.  */
1151       if (negate_expr_p (TREE_OPERAND (t, 1))
1152           && reorder_operands_p (TREE_OPERAND (t, 0),
1153                                  TREE_OPERAND (t, 1)))
1154         return true;
1155       /* -(A + B) -> (-A) - B.  */
1156       return negate_expr_p (TREE_OPERAND (t, 0));
1157
1158     case MINUS_EXPR:
1159       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1160       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1161              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1162              && reorder_operands_p (TREE_OPERAND (t, 0),
1163                                     TREE_OPERAND (t, 1));
1164
1165     case MULT_EXPR:
1166       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1167         break;
1168
1169       /* Fall through.  */
1170
1171     case RDIV_EXPR:
1172       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1173         return negate_expr_p (TREE_OPERAND (t, 1))
1174                || negate_expr_p (TREE_OPERAND (t, 0));
1175       break;
1176
1177     case TRUNC_DIV_EXPR:
1178     case ROUND_DIV_EXPR:
1179     case FLOOR_DIV_EXPR:
1180     case CEIL_DIV_EXPR:
1181     case EXACT_DIV_EXPR:
1182       /* In general we can't negate A / B, because if A is INT_MIN and
1183          B is 1, we may turn this into INT_MIN / -1 which is undefined
1184          and actually traps on some architectures.  But if overflow is
1185          undefined, we can negate, because - (INT_MIN / 1) is an
1186          overflow.  */
1187       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1188           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1189         break;
1190       return negate_expr_p (TREE_OPERAND (t, 1))
1191              || negate_expr_p (TREE_OPERAND (t, 0));
1192
1193     case NOP_EXPR:
1194       /* Negate -((double)float) as (double)(-float).  */
1195       if (TREE_CODE (type) == REAL_TYPE)
1196         {
1197           tree tem = strip_float_extensions (t);
1198           if (tem != t)
1199             return negate_expr_p (tem);
1200         }
1201       break;
1202
1203     case CALL_EXPR:
1204       /* Negate -f(x) as f(-x).  */
1205       if (negate_mathfn_p (builtin_mathfn_code (t)))
1206         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1207       break;
1208
1209     case RSHIFT_EXPR:
1210       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1211       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1212         {
1213           tree op1 = TREE_OPERAND (t, 1);
1214           if (TREE_INT_CST_HIGH (op1) == 0
1215               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1216                  == TREE_INT_CST_LOW (op1))
1217             return true;
1218         }
1219       break;
1220
1221     default:
1222       break;
1223     }
1224   return false;
1225 }
1226
1227 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1228    simplification is possible.
1229    If negate_expr_p would return true for T, NULL_TREE will never be
1230    returned.  */
1231
1232 static tree
1233 fold_negate_expr (tree t)
1234 {
1235   tree type = TREE_TYPE (t);
1236   tree tem;
1237
1238   switch (TREE_CODE (t))
1239     {
1240     /* Convert - (~A) to A + 1.  */
1241     case BIT_NOT_EXPR:
1242       if (INTEGRAL_TYPE_P (type))
1243         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1244                             build_int_cst (type, 1));
1245       break;
1246       
1247     case INTEGER_CST:
1248       tem = fold_negate_const (t, type);
1249       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1250           || !TYPE_OVERFLOW_TRAPS (type))
1251         return tem;
1252       break;
1253
1254     case REAL_CST:
1255       tem = fold_negate_const (t, type);
1256       /* Two's complement FP formats, such as c4x, may overflow.  */
1257       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1258         return tem;
1259       break;
1260
1261     case COMPLEX_CST:
1262       {
1263         tree rpart = negate_expr (TREE_REALPART (t));
1264         tree ipart = negate_expr (TREE_IMAGPART (t));
1265
1266         if ((TREE_CODE (rpart) == REAL_CST
1267              && TREE_CODE (ipart) == REAL_CST)
1268             || (TREE_CODE (rpart) == INTEGER_CST
1269                 && TREE_CODE (ipart) == INTEGER_CST))
1270           return build_complex (type, rpart, ipart);
1271       }
1272       break;
1273
1274     case COMPLEX_EXPR:
1275       if (negate_expr_p (t))
1276         return fold_build2 (COMPLEX_EXPR, type,
1277                             fold_negate_expr (TREE_OPERAND (t, 0)),
1278                             fold_negate_expr (TREE_OPERAND (t, 1)));
1279       break;
1280       
1281     case CONJ_EXPR:
1282       if (negate_expr_p (t))
1283         return fold_build1 (CONJ_EXPR, type,
1284                             fold_negate_expr (TREE_OPERAND (t, 0)));
1285       break;
1286
1287     case NEGATE_EXPR:
1288       return TREE_OPERAND (t, 0);
1289
1290     case PLUS_EXPR:
1291       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1292           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1293         {
1294           /* -(A + B) -> (-B) - A.  */
1295           if (negate_expr_p (TREE_OPERAND (t, 1))
1296               && reorder_operands_p (TREE_OPERAND (t, 0),
1297                                      TREE_OPERAND (t, 1)))
1298             {
1299               tem = negate_expr (TREE_OPERAND (t, 1));
1300               return fold_build2 (MINUS_EXPR, type,
1301                                   tem, TREE_OPERAND (t, 0));
1302             }
1303
1304           /* -(A + B) -> (-A) - B.  */
1305           if (negate_expr_p (TREE_OPERAND (t, 0)))
1306             {
1307               tem = negate_expr (TREE_OPERAND (t, 0));
1308               return fold_build2 (MINUS_EXPR, type,
1309                                   tem, TREE_OPERAND (t, 1));
1310             }
1311         }
1312       break;
1313
1314     case MINUS_EXPR:
1315       /* - (A - B) -> B - A  */
1316       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1317           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1318           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1319         return fold_build2 (MINUS_EXPR, type,
1320                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1321       break;
1322
1323     case MULT_EXPR:
1324       if (TYPE_UNSIGNED (type))
1325         break;
1326
1327       /* Fall through.  */
1328
1329     case RDIV_EXPR:
1330       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1331         {
1332           tem = TREE_OPERAND (t, 1);
1333           if (negate_expr_p (tem))
1334             return fold_build2 (TREE_CODE (t), type,
1335                                 TREE_OPERAND (t, 0), negate_expr (tem));
1336           tem = TREE_OPERAND (t, 0);
1337           if (negate_expr_p (tem))
1338             return fold_build2 (TREE_CODE (t), type,
1339                                 negate_expr (tem), TREE_OPERAND (t, 1));
1340         }
1341       break;
1342
1343     case TRUNC_DIV_EXPR:
1344     case ROUND_DIV_EXPR:
1345     case FLOOR_DIV_EXPR:
1346     case CEIL_DIV_EXPR:
1347     case EXACT_DIV_EXPR:
1348       /* In general we can't negate A / B, because if A is INT_MIN and
1349          B is 1, we may turn this into INT_MIN / -1 which is undefined
1350          and actually traps on some architectures.  But if overflow is
1351          undefined, we can negate, because - (INT_MIN / 1) is an
1352          overflow.  */
1353       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1354         {
1355           const char * const warnmsg = G_("assuming signed overflow does not "
1356                                           "occur when negating a division");
1357           tem = TREE_OPERAND (t, 1);
1358           if (negate_expr_p (tem))
1359             {
1360               if (INTEGRAL_TYPE_P (type)
1361                   && (TREE_CODE (tem) != INTEGER_CST
1362                       || integer_onep (tem)))
1363                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1364               return fold_build2 (TREE_CODE (t), type,
1365                                   TREE_OPERAND (t, 0), negate_expr (tem));
1366             }
1367           tem = TREE_OPERAND (t, 0);
1368           if (negate_expr_p (tem))
1369             {
1370               if (INTEGRAL_TYPE_P (type)
1371                   && (TREE_CODE (tem) != INTEGER_CST
1372                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1373                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1374               return fold_build2 (TREE_CODE (t), type,
1375                                   negate_expr (tem), TREE_OPERAND (t, 1));
1376             }
1377         }
1378       break;
1379
1380     case NOP_EXPR:
1381       /* Convert -((double)float) into (double)(-float).  */
1382       if (TREE_CODE (type) == REAL_TYPE)
1383         {
1384           tem = strip_float_extensions (t);
1385           if (tem != t && negate_expr_p (tem))
1386             return negate_expr (tem);
1387         }
1388       break;
1389
1390     case CALL_EXPR:
1391       /* Negate -f(x) as f(-x).  */
1392       if (negate_mathfn_p (builtin_mathfn_code (t))
1393           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1394         {
1395           tree fndecl, arg;
1396
1397           fndecl = get_callee_fndecl (t);
1398           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1399           return build_call_expr (fndecl, 1, arg);
1400         }
1401       break;
1402
1403     case RSHIFT_EXPR:
1404       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1405       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1406         {
1407           tree op1 = TREE_OPERAND (t, 1);
1408           if (TREE_INT_CST_HIGH (op1) == 0
1409               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1410                  == TREE_INT_CST_LOW (op1))
1411             {
1412               tree ntype = TYPE_UNSIGNED (type)
1413                            ? signed_type_for (type)
1414                            : unsigned_type_for (type);
1415               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1416               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1417               return fold_convert (type, temp);
1418             }
1419         }
1420       break;
1421
1422     default:
1423       break;
1424     }
1425
1426   return NULL_TREE;
1427 }
1428
1429 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1430    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1431    return NULL_TREE. */
1432
1433 static tree
1434 negate_expr (tree t)
1435 {
1436   tree type, tem;
1437
1438   if (t == NULL_TREE)
1439     return NULL_TREE;
1440
1441   type = TREE_TYPE (t);
1442   STRIP_SIGN_NOPS (t);
1443
1444   tem = fold_negate_expr (t);
1445   if (!tem)
1446     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1447   return fold_convert (type, tem);
1448 }
1449 \f
1450 /* Split a tree IN into a constant, literal and variable parts that could be
1451    combined with CODE to make IN.  "constant" means an expression with
1452    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1453    commutative arithmetic operation.  Store the constant part into *CONP,
1454    the literal in *LITP and return the variable part.  If a part isn't
1455    present, set it to null.  If the tree does not decompose in this way,
1456    return the entire tree as the variable part and the other parts as null.
1457
1458    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1459    case, we negate an operand that was subtracted.  Except if it is a
1460    literal for which we use *MINUS_LITP instead.
1461
1462    If NEGATE_P is true, we are negating all of IN, again except a literal
1463    for which we use *MINUS_LITP instead.
1464
1465    If IN is itself a literal or constant, return it as appropriate.
1466
1467    Note that we do not guarantee that any of the three values will be the
1468    same type as IN, but they will have the same signedness and mode.  */
1469
1470 static tree
1471 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1472             tree *minus_litp, int negate_p)
1473 {
1474   tree var = 0;
1475
1476   *conp = 0;
1477   *litp = 0;
1478   *minus_litp = 0;
1479
1480   /* Strip any conversions that don't change the machine mode or signedness.  */
1481   STRIP_SIGN_NOPS (in);
1482
1483   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
1484     *litp = in;
1485   else if (TREE_CODE (in) == code
1486            || (! FLOAT_TYPE_P (TREE_TYPE (in))
1487                /* We can associate addition and subtraction together (even
1488                   though the C standard doesn't say so) for integers because
1489                   the value is not affected.  For reals, the value might be
1490                   affected, so we can't.  */
1491                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1492                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1493     {
1494       tree op0 = TREE_OPERAND (in, 0);
1495       tree op1 = TREE_OPERAND (in, 1);
1496       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1497       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1498
1499       /* First see if either of the operands is a literal, then a constant.  */
1500       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
1501         *litp = op0, op0 = 0;
1502       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
1503         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1504
1505       if (op0 != 0 && TREE_CONSTANT (op0))
1506         *conp = op0, op0 = 0;
1507       else if (op1 != 0 && TREE_CONSTANT (op1))
1508         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1509
1510       /* If we haven't dealt with either operand, this is not a case we can
1511          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1512       if (op0 != 0 && op1 != 0)
1513         var = in;
1514       else if (op0 != 0)
1515         var = op0;
1516       else
1517         var = op1, neg_var_p = neg1_p;
1518
1519       /* Now do any needed negations.  */
1520       if (neg_litp_p)
1521         *minus_litp = *litp, *litp = 0;
1522       if (neg_conp_p)
1523         *conp = negate_expr (*conp);
1524       if (neg_var_p)
1525         var = negate_expr (var);
1526     }
1527   else if (TREE_CONSTANT (in))
1528     *conp = in;
1529   else
1530     var = in;
1531
1532   if (negate_p)
1533     {
1534       if (*litp)
1535         *minus_litp = *litp, *litp = 0;
1536       else if (*minus_litp)
1537         *litp = *minus_litp, *minus_litp = 0;
1538       *conp = negate_expr (*conp);
1539       var = negate_expr (var);
1540     }
1541
1542   return var;
1543 }
1544
1545 /* Re-associate trees split by the above function.  T1 and T2 are either
1546    expressions to associate or null.  Return the new expression, if any.  If
1547    we build an operation, do it in TYPE and with CODE.  */
1548
1549 static tree
1550 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1551 {
1552   if (t1 == 0)
1553     return t2;
1554   else if (t2 == 0)
1555     return t1;
1556
1557   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1558      try to fold this since we will have infinite recursion.  But do
1559      deal with any NEGATE_EXPRs.  */
1560   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1561       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1562     {
1563       if (code == PLUS_EXPR)
1564         {
1565           if (TREE_CODE (t1) == NEGATE_EXPR)
1566             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1567                            fold_convert (type, TREE_OPERAND (t1, 0)));
1568           else if (TREE_CODE (t2) == NEGATE_EXPR)
1569             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1570                            fold_convert (type, TREE_OPERAND (t2, 0)));
1571           else if (integer_zerop (t2))
1572             return fold_convert (type, t1);
1573         }
1574       else if (code == MINUS_EXPR)
1575         {
1576           if (integer_zerop (t2))
1577             return fold_convert (type, t1);
1578         }
1579
1580       return build2 (code, type, fold_convert (type, t1),
1581                      fold_convert (type, t2));
1582     }
1583
1584   return fold_build2 (code, type, fold_convert (type, t1),
1585                       fold_convert (type, t2));
1586 }
1587 \f
1588 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1589    for use in int_const_binop, size_binop and size_diffop.  */
1590
1591 static bool
1592 int_binop_types_match_p (enum tree_code code, tree type1, tree type2)
1593 {
1594   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1595     return false;
1596   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1597     return false;
1598
1599   switch (code)
1600     {
1601     case LSHIFT_EXPR:
1602     case RSHIFT_EXPR:
1603     case LROTATE_EXPR:
1604     case RROTATE_EXPR:
1605       return true;
1606
1607     default:
1608       break;
1609     }
1610
1611   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1612          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1613          && TYPE_MODE (type1) == TYPE_MODE (type2);
1614 }
1615
1616
1617 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1618    to produce a new constant.  Return NULL_TREE if we don't know how
1619    to evaluate CODE at compile-time.
1620
1621    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1622
1623 tree
1624 int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1625 {
1626   unsigned HOST_WIDE_INT int1l, int2l;
1627   HOST_WIDE_INT int1h, int2h;
1628   unsigned HOST_WIDE_INT low;
1629   HOST_WIDE_INT hi;
1630   unsigned HOST_WIDE_INT garbagel;
1631   HOST_WIDE_INT garbageh;
1632   tree t;
1633   tree type = TREE_TYPE (arg1);
1634   int uns = TYPE_UNSIGNED (type);
1635   int is_sizetype
1636     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1637   int overflow = 0;
1638
1639   int1l = TREE_INT_CST_LOW (arg1);
1640   int1h = TREE_INT_CST_HIGH (arg1);
1641   int2l = TREE_INT_CST_LOW (arg2);
1642   int2h = TREE_INT_CST_HIGH (arg2);
1643
1644   switch (code)
1645     {
1646     case BIT_IOR_EXPR:
1647       low = int1l | int2l, hi = int1h | int2h;
1648       break;
1649
1650     case BIT_XOR_EXPR:
1651       low = int1l ^ int2l, hi = int1h ^ int2h;
1652       break;
1653
1654     case BIT_AND_EXPR:
1655       low = int1l & int2l, hi = int1h & int2h;
1656       break;
1657
1658     case RSHIFT_EXPR:
1659       int2l = -int2l;
1660     case LSHIFT_EXPR:
1661       /* It's unclear from the C standard whether shifts can overflow.
1662          The following code ignores overflow; perhaps a C standard
1663          interpretation ruling is needed.  */
1664       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1665                      &low, &hi, !uns);
1666       break;
1667
1668     case RROTATE_EXPR:
1669       int2l = - int2l;
1670     case LROTATE_EXPR:
1671       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1672                       &low, &hi);
1673       break;
1674
1675     case PLUS_EXPR:
1676       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1677       break;
1678
1679     case MINUS_EXPR:
1680       neg_double (int2l, int2h, &low, &hi);
1681       add_double (int1l, int1h, low, hi, &low, &hi);
1682       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1683       break;
1684
1685     case MULT_EXPR:
1686       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1687       break;
1688
1689     case TRUNC_DIV_EXPR:
1690     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1691     case EXACT_DIV_EXPR:
1692       /* This is a shortcut for a common special case.  */
1693       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1694           && !TREE_OVERFLOW (arg1)
1695           && !TREE_OVERFLOW (arg2)
1696           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1697         {
1698           if (code == CEIL_DIV_EXPR)
1699             int1l += int2l - 1;
1700
1701           low = int1l / int2l, hi = 0;
1702           break;
1703         }
1704
1705       /* ... fall through ...  */
1706
1707     case ROUND_DIV_EXPR:
1708       if (int2h == 0 && int2l == 0)
1709         return NULL_TREE;
1710       if (int2h == 0 && int2l == 1)
1711         {
1712           low = int1l, hi = int1h;
1713           break;
1714         }
1715       if (int1l == int2l && int1h == int2h
1716           && ! (int1l == 0 && int1h == 0))
1717         {
1718           low = 1, hi = 0;
1719           break;
1720         }
1721       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1722                                        &low, &hi, &garbagel, &garbageh);
1723       break;
1724
1725     case TRUNC_MOD_EXPR:
1726     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1727       /* This is a shortcut for a common special case.  */
1728       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1729           && !TREE_OVERFLOW (arg1)
1730           && !TREE_OVERFLOW (arg2)
1731           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1732         {
1733           if (code == CEIL_MOD_EXPR)
1734             int1l += int2l - 1;
1735           low = int1l % int2l, hi = 0;
1736           break;
1737         }
1738
1739       /* ... fall through ...  */
1740
1741     case ROUND_MOD_EXPR:
1742       if (int2h == 0 && int2l == 0)
1743         return NULL_TREE;
1744       overflow = div_and_round_double (code, uns,
1745                                        int1l, int1h, int2l, int2h,
1746                                        &garbagel, &garbageh, &low, &hi);
1747       break;
1748
1749     case MIN_EXPR:
1750     case MAX_EXPR:
1751       if (uns)
1752         low = (((unsigned HOST_WIDE_INT) int1h
1753                 < (unsigned HOST_WIDE_INT) int2h)
1754                || (((unsigned HOST_WIDE_INT) int1h
1755                     == (unsigned HOST_WIDE_INT) int2h)
1756                    && int1l < int2l));
1757       else
1758         low = (int1h < int2h
1759                || (int1h == int2h && int1l < int2l));
1760
1761       if (low == (code == MIN_EXPR))
1762         low = int1l, hi = int1h;
1763       else
1764         low = int2l, hi = int2h;
1765       break;
1766
1767     default:
1768       return NULL_TREE;
1769     }
1770
1771   if (notrunc)
1772     {
1773       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1774
1775       /* Propagate overflow flags ourselves.  */
1776       if (((!uns || is_sizetype) && overflow)
1777           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1778         {
1779           t = copy_node (t);
1780           TREE_OVERFLOW (t) = 1;
1781         }
1782     }
1783   else
1784     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1785                                ((!uns || is_sizetype) && overflow)
1786                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1787
1788   return t;
1789 }
1790
1791 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1792    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1793    are the same kind of constant and the same machine mode.  Return zero if
1794    combining the constants is not allowed in the current operating mode.
1795
1796    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1797
1798 static tree
1799 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1800 {
1801   /* Sanity check for the recursive cases.  */
1802   if (!arg1 || !arg2)
1803     return NULL_TREE;
1804
1805   STRIP_NOPS (arg1);
1806   STRIP_NOPS (arg2);
1807
1808   if (TREE_CODE (arg1) == INTEGER_CST)
1809     return int_const_binop (code, arg1, arg2, notrunc);
1810
1811   if (TREE_CODE (arg1) == REAL_CST)
1812     {
1813       enum machine_mode mode;
1814       REAL_VALUE_TYPE d1;
1815       REAL_VALUE_TYPE d2;
1816       REAL_VALUE_TYPE value;
1817       REAL_VALUE_TYPE result;
1818       bool inexact;
1819       tree t, type;
1820
1821       /* The following codes are handled by real_arithmetic.  */
1822       switch (code)
1823         {
1824         case PLUS_EXPR:
1825         case MINUS_EXPR:
1826         case MULT_EXPR:
1827         case RDIV_EXPR:
1828         case MIN_EXPR:
1829         case MAX_EXPR:
1830           break;
1831
1832         default:
1833           return NULL_TREE;
1834         }
1835
1836       d1 = TREE_REAL_CST (arg1);
1837       d2 = TREE_REAL_CST (arg2);
1838
1839       type = TREE_TYPE (arg1);
1840       mode = TYPE_MODE (type);
1841
1842       /* Don't perform operation if we honor signaling NaNs and
1843          either operand is a NaN.  */
1844       if (HONOR_SNANS (mode)
1845           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1846         return NULL_TREE;
1847
1848       /* Don't perform operation if it would raise a division
1849          by zero exception.  */
1850       if (code == RDIV_EXPR
1851           && REAL_VALUES_EQUAL (d2, dconst0)
1852           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1853         return NULL_TREE;
1854
1855       /* If either operand is a NaN, just return it.  Otherwise, set up
1856          for floating-point trap; we return an overflow.  */
1857       if (REAL_VALUE_ISNAN (d1))
1858         return arg1;
1859       else if (REAL_VALUE_ISNAN (d2))
1860         return arg2;
1861
1862       inexact = real_arithmetic (&value, code, &d1, &d2);
1863       real_convert (&result, mode, &value);
1864
1865       /* Don't constant fold this floating point operation if
1866          the result has overflowed and flag_trapping_math.  */
1867       if (flag_trapping_math
1868           && MODE_HAS_INFINITIES (mode)
1869           && REAL_VALUE_ISINF (result)
1870           && !REAL_VALUE_ISINF (d1)
1871           && !REAL_VALUE_ISINF (d2))
1872         return NULL_TREE;
1873
1874       /* Don't constant fold this floating point operation if the
1875          result may dependent upon the run-time rounding mode and
1876          flag_rounding_math is set, or if GCC's software emulation
1877          is unable to accurately represent the result.  */
1878       if ((flag_rounding_math
1879            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1880                && !flag_unsafe_math_optimizations))
1881           && (inexact || !real_identical (&result, &value)))
1882         return NULL_TREE;
1883
1884       t = build_real (type, result);
1885
1886       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1887       return t;
1888     }
1889
1890   if (TREE_CODE (arg1) == COMPLEX_CST)
1891     {
1892       tree type = TREE_TYPE (arg1);
1893       tree r1 = TREE_REALPART (arg1);
1894       tree i1 = TREE_IMAGPART (arg1);
1895       tree r2 = TREE_REALPART (arg2);
1896       tree i2 = TREE_IMAGPART (arg2);
1897       tree real, imag;
1898
1899       switch (code)
1900         {
1901         case PLUS_EXPR:
1902         case MINUS_EXPR:
1903           real = const_binop (code, r1, r2, notrunc);
1904           imag = const_binop (code, i1, i2, notrunc);
1905           break;
1906
1907         case MULT_EXPR:
1908           real = const_binop (MINUS_EXPR,
1909                               const_binop (MULT_EXPR, r1, r2, notrunc),
1910                               const_binop (MULT_EXPR, i1, i2, notrunc),
1911                               notrunc);
1912           imag = const_binop (PLUS_EXPR,
1913                               const_binop (MULT_EXPR, r1, i2, notrunc),
1914                               const_binop (MULT_EXPR, i1, r2, notrunc),
1915                               notrunc);
1916           break;
1917
1918         case RDIV_EXPR:
1919           {
1920             tree magsquared
1921               = const_binop (PLUS_EXPR,
1922                              const_binop (MULT_EXPR, r2, r2, notrunc),
1923                              const_binop (MULT_EXPR, i2, i2, notrunc),
1924                              notrunc);
1925             tree t1
1926               = const_binop (PLUS_EXPR,
1927                              const_binop (MULT_EXPR, r1, r2, notrunc),
1928                              const_binop (MULT_EXPR, i1, i2, notrunc),
1929                              notrunc);
1930             tree t2
1931               = const_binop (MINUS_EXPR,
1932                              const_binop (MULT_EXPR, i1, r2, notrunc),
1933                              const_binop (MULT_EXPR, r1, i2, notrunc),
1934                              notrunc);
1935
1936             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1937               code = TRUNC_DIV_EXPR;
1938
1939             real = const_binop (code, t1, magsquared, notrunc);
1940             imag = const_binop (code, t2, magsquared, notrunc);
1941           }
1942           break;
1943
1944         default:
1945           return NULL_TREE;
1946         }
1947
1948       if (real && imag)
1949         return build_complex (type, real, imag);
1950     }
1951
1952   return NULL_TREE;
1953 }
1954
1955 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
1956    indicates which particular sizetype to create.  */
1957
1958 tree
1959 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1960 {
1961   return build_int_cst (sizetype_tab[(int) kind], number);
1962 }
1963 \f
1964 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1965    is a tree code.  The type of the result is taken from the operands.
1966    Both must be equivalent integer types, ala int_binop_types_match_p.
1967    If the operands are constant, so is the result.  */
1968
1969 tree
1970 size_binop (enum tree_code code, tree arg0, tree arg1)
1971 {
1972   tree type = TREE_TYPE (arg0);
1973
1974   if (arg0 == error_mark_node || arg1 == error_mark_node)
1975     return error_mark_node;
1976
1977   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
1978                                        TREE_TYPE (arg1)));
1979
1980   /* Handle the special case of two integer constants faster.  */
1981   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1982     {
1983       /* And some specific cases even faster than that.  */
1984       if (code == PLUS_EXPR)
1985         {
1986           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
1987             return arg1;
1988           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1989             return arg0;
1990         }
1991       else if (code == MINUS_EXPR)
1992         {
1993           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1994             return arg0;
1995         }
1996       else if (code == MULT_EXPR)
1997         {
1998           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
1999             return arg1;
2000         }
2001
2002       /* Handle general case of two integer constants.  */
2003       return int_const_binop (code, arg0, arg1, 0);
2004     }
2005
2006   return fold_build2 (code, type, arg0, arg1);
2007 }
2008
2009 /* Given two values, either both of sizetype or both of bitsizetype,
2010    compute the difference between the two values.  Return the value
2011    in signed type corresponding to the type of the operands.  */
2012
2013 tree
2014 size_diffop (tree arg0, tree arg1)
2015 {
2016   tree type = TREE_TYPE (arg0);
2017   tree ctype;
2018
2019   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2020                                        TREE_TYPE (arg1)));
2021
2022   /* If the type is already signed, just do the simple thing.  */
2023   if (!TYPE_UNSIGNED (type))
2024     return size_binop (MINUS_EXPR, arg0, arg1);
2025
2026   if (type == sizetype)
2027     ctype = ssizetype;
2028   else if (type == bitsizetype)
2029     ctype = sbitsizetype;
2030   else
2031     ctype = signed_type_for (type);
2032
2033   /* If either operand is not a constant, do the conversions to the signed
2034      type and subtract.  The hardware will do the right thing with any
2035      overflow in the subtraction.  */
2036   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2037     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2038                        fold_convert (ctype, arg1));
2039
2040   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2041      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2042      overflow) and negate (which can't either).  Special-case a result
2043      of zero while we're here.  */
2044   if (tree_int_cst_equal (arg0, arg1))
2045     return build_int_cst (ctype, 0);
2046   else if (tree_int_cst_lt (arg1, arg0))
2047     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2048   else
2049     return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2050                        fold_convert (ctype, size_binop (MINUS_EXPR,
2051                                                         arg1, arg0)));
2052 }
2053 \f
2054 /* A subroutine of fold_convert_const handling conversions of an
2055    INTEGER_CST to another integer type.  */
2056
2057 static tree
2058 fold_convert_const_int_from_int (tree type, tree arg1)
2059 {
2060   tree t;
2061
2062   /* Given an integer constant, make new constant with new type,
2063      appropriately sign-extended or truncated.  */
2064   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2065                              TREE_INT_CST_HIGH (arg1),
2066                              /* Don't set the overflow when
2067                                 converting a pointer  */
2068                              !POINTER_TYPE_P (TREE_TYPE (arg1)),
2069                              (TREE_INT_CST_HIGH (arg1) < 0
2070                               && (TYPE_UNSIGNED (type)
2071                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2072                              | TREE_OVERFLOW (arg1));
2073
2074   return t;
2075 }
2076
2077 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2078    to an integer type.  */
2079
2080 static tree
2081 fold_convert_const_int_from_real (enum tree_code code, tree type, tree arg1)
2082 {
2083   int overflow = 0;
2084   tree t;
2085
2086   /* The following code implements the floating point to integer
2087      conversion rules required by the Java Language Specification,
2088      that IEEE NaNs are mapped to zero and values that overflow
2089      the target precision saturate, i.e. values greater than
2090      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2091      are mapped to INT_MIN.  These semantics are allowed by the
2092      C and C++ standards that simply state that the behavior of
2093      FP-to-integer conversion is unspecified upon overflow.  */
2094
2095   HOST_WIDE_INT high, low;
2096   REAL_VALUE_TYPE r;
2097   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2098
2099   switch (code)
2100     {
2101     case FIX_TRUNC_EXPR:
2102       real_trunc (&r, VOIDmode, &x);
2103       break;
2104
2105     default:
2106       gcc_unreachable ();
2107     }
2108
2109   /* If R is NaN, return zero and show we have an overflow.  */
2110   if (REAL_VALUE_ISNAN (r))
2111     {
2112       overflow = 1;
2113       high = 0;
2114       low = 0;
2115     }
2116
2117   /* See if R is less than the lower bound or greater than the
2118      upper bound.  */
2119
2120   if (! overflow)
2121     {
2122       tree lt = TYPE_MIN_VALUE (type);
2123       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2124       if (REAL_VALUES_LESS (r, l))
2125         {
2126           overflow = 1;
2127           high = TREE_INT_CST_HIGH (lt);
2128           low = TREE_INT_CST_LOW (lt);
2129         }
2130     }
2131
2132   if (! overflow)
2133     {
2134       tree ut = TYPE_MAX_VALUE (type);
2135       if (ut)
2136         {
2137           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2138           if (REAL_VALUES_LESS (u, r))
2139             {
2140               overflow = 1;
2141               high = TREE_INT_CST_HIGH (ut);
2142               low = TREE_INT_CST_LOW (ut);
2143             }
2144         }
2145     }
2146
2147   if (! overflow)
2148     REAL_VALUE_TO_INT (&low, &high, r);
2149
2150   t = force_fit_type_double (type, low, high, -1,
2151                              overflow | TREE_OVERFLOW (arg1));
2152   return t;
2153 }
2154
2155 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2156    to another floating point type.  */
2157
2158 static tree
2159 fold_convert_const_real_from_real (tree type, tree arg1)
2160 {
2161   REAL_VALUE_TYPE value;
2162   tree t;
2163
2164   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2165   t = build_real (type, value);
2166
2167   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2168   return t;
2169 }
2170
2171 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2172    type TYPE.  If no simplification can be done return NULL_TREE.  */
2173
2174 static tree
2175 fold_convert_const (enum tree_code code, tree type, tree arg1)
2176 {
2177   if (TREE_TYPE (arg1) == type)
2178     return arg1;
2179
2180   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2181     {
2182       if (TREE_CODE (arg1) == INTEGER_CST)
2183         return fold_convert_const_int_from_int (type, arg1);
2184       else if (TREE_CODE (arg1) == REAL_CST)
2185         return fold_convert_const_int_from_real (code, type, arg1);
2186     }
2187   else if (TREE_CODE (type) == REAL_TYPE)
2188     {
2189       if (TREE_CODE (arg1) == INTEGER_CST)
2190         return build_real_from_int_cst (type, arg1);
2191       if (TREE_CODE (arg1) == REAL_CST)
2192         return fold_convert_const_real_from_real (type, arg1);
2193     }
2194   return NULL_TREE;
2195 }
2196
2197 /* Construct a vector of zero elements of vector type TYPE.  */
2198
2199 static tree
2200 build_zero_vector (tree type)
2201 {
2202   tree elem, list;
2203   int i, units;
2204
2205   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2206   units = TYPE_VECTOR_SUBPARTS (type);
2207   
2208   list = NULL_TREE;
2209   for (i = 0; i < units; i++)
2210     list = tree_cons (NULL_TREE, elem, list);
2211   return build_vector (type, list);
2212 }
2213
2214 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2215    simple conversions in preference to calling the front-end's convert.  */
2216
2217 tree
2218 fold_convert (tree type, tree arg)
2219 {
2220   tree orig = TREE_TYPE (arg);
2221   tree tem;
2222
2223   if (type == orig)
2224     return arg;
2225
2226   if (TREE_CODE (arg) == ERROR_MARK
2227       || TREE_CODE (type) == ERROR_MARK
2228       || TREE_CODE (orig) == ERROR_MARK)
2229     return error_mark_node;
2230
2231   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)
2232       || lang_hooks.types_compatible_p (TYPE_MAIN_VARIANT (type),
2233                                         TYPE_MAIN_VARIANT (orig)))
2234     return fold_build1 (NOP_EXPR, type, arg);
2235
2236   switch (TREE_CODE (type))
2237     {
2238     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2239     case POINTER_TYPE: case REFERENCE_TYPE:
2240     case OFFSET_TYPE:
2241       if (TREE_CODE (arg) == INTEGER_CST)
2242         {
2243           tem = fold_convert_const (NOP_EXPR, type, arg);
2244           if (tem != NULL_TREE)
2245             return tem;
2246         }
2247       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2248           || TREE_CODE (orig) == OFFSET_TYPE)
2249         return fold_build1 (NOP_EXPR, type, arg);
2250       if (TREE_CODE (orig) == COMPLEX_TYPE)
2251         {
2252           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2253           return fold_convert (type, tem);
2254         }
2255       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2256                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2257       return fold_build1 (NOP_EXPR, type, arg);
2258
2259     case REAL_TYPE:
2260       if (TREE_CODE (arg) == INTEGER_CST)
2261         {
2262           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2263           if (tem != NULL_TREE)
2264             return tem;
2265         }
2266       else if (TREE_CODE (arg) == REAL_CST)
2267         {
2268           tem = fold_convert_const (NOP_EXPR, type, arg);
2269           if (tem != NULL_TREE)
2270             return tem;
2271         }
2272
2273       switch (TREE_CODE (orig))
2274         {
2275         case INTEGER_TYPE:
2276         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2277         case POINTER_TYPE: case REFERENCE_TYPE:
2278           return fold_build1 (FLOAT_EXPR, type, arg);
2279
2280         case REAL_TYPE:
2281           return fold_build1 (NOP_EXPR, type, arg);
2282
2283         case COMPLEX_TYPE:
2284           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2285           return fold_convert (type, tem);
2286
2287         default:
2288           gcc_unreachable ();
2289         }
2290
2291     case COMPLEX_TYPE:
2292       switch (TREE_CODE (orig))
2293         {
2294         case INTEGER_TYPE:
2295         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2296         case POINTER_TYPE: case REFERENCE_TYPE:
2297         case REAL_TYPE:
2298           return build2 (COMPLEX_EXPR, type,
2299                          fold_convert (TREE_TYPE (type), arg),
2300                          fold_convert (TREE_TYPE (type), integer_zero_node));
2301         case COMPLEX_TYPE:
2302           {
2303             tree rpart, ipart;
2304
2305             if (TREE_CODE (arg) == COMPLEX_EXPR)
2306               {
2307                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2308                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2309                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2310               }
2311
2312             arg = save_expr (arg);
2313             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2314             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2315             rpart = fold_convert (TREE_TYPE (type), rpart);
2316             ipart = fold_convert (TREE_TYPE (type), ipart);
2317             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2318           }
2319
2320         default:
2321           gcc_unreachable ();
2322         }
2323
2324     case VECTOR_TYPE:
2325       if (integer_zerop (arg))
2326         return build_zero_vector (type);
2327       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2328       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2329                   || TREE_CODE (orig) == VECTOR_TYPE);
2330       return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2331
2332     case VOID_TYPE:
2333       tem = fold_ignored_result (arg);
2334       if (TREE_CODE (tem) == GIMPLE_MODIFY_STMT)
2335         return tem;
2336       return fold_build1 (NOP_EXPR, type, tem);
2337
2338     default:
2339       gcc_unreachable ();
2340     }
2341 }
2342 \f
2343 /* Return false if expr can be assumed not to be an lvalue, true
2344    otherwise.  */
2345
2346 static bool
2347 maybe_lvalue_p (tree x)
2348 {
2349   /* We only need to wrap lvalue tree codes.  */
2350   switch (TREE_CODE (x))
2351   {
2352   case VAR_DECL:
2353   case PARM_DECL:
2354   case RESULT_DECL:
2355   case LABEL_DECL:
2356   case FUNCTION_DECL:
2357   case SSA_NAME:
2358
2359   case COMPONENT_REF:
2360   case INDIRECT_REF:
2361   case ALIGN_INDIRECT_REF:
2362   case MISALIGNED_INDIRECT_REF:
2363   case ARRAY_REF:
2364   case ARRAY_RANGE_REF:
2365   case BIT_FIELD_REF:
2366   case OBJ_TYPE_REF:
2367
2368   case REALPART_EXPR:
2369   case IMAGPART_EXPR:
2370   case PREINCREMENT_EXPR:
2371   case PREDECREMENT_EXPR:
2372   case SAVE_EXPR:
2373   case TRY_CATCH_EXPR:
2374   case WITH_CLEANUP_EXPR:
2375   case COMPOUND_EXPR:
2376   case MODIFY_EXPR:
2377   case GIMPLE_MODIFY_STMT:
2378   case TARGET_EXPR:
2379   case COND_EXPR:
2380   case BIND_EXPR:
2381   case MIN_EXPR:
2382   case MAX_EXPR:
2383     break;
2384
2385   default:
2386     /* Assume the worst for front-end tree codes.  */
2387     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2388       break;
2389     return false;
2390   }
2391
2392   return true;
2393 }
2394
2395 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2396
2397 tree
2398 non_lvalue (tree x)
2399 {
2400   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2401      us.  */
2402   if (in_gimple_form)
2403     return x;
2404
2405   if (! maybe_lvalue_p (x))
2406     return x;
2407   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2408 }
2409
2410 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2411    Zero means allow extended lvalues.  */
2412
2413 int pedantic_lvalues;
2414
2415 /* When pedantic, return an expr equal to X but certainly not valid as a
2416    pedantic lvalue.  Otherwise, return X.  */
2417
2418 static tree
2419 pedantic_non_lvalue (tree x)
2420 {
2421   if (pedantic_lvalues)
2422     return non_lvalue (x);
2423   else
2424     return x;
2425 }
2426 \f
2427 /* Given a tree comparison code, return the code that is the logical inverse
2428    of the given code.  It is not safe to do this for floating-point
2429    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2430    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2431
2432 enum tree_code
2433 invert_tree_comparison (enum tree_code code, bool honor_nans)
2434 {
2435   if (honor_nans && flag_trapping_math)
2436     return ERROR_MARK;
2437
2438   switch (code)
2439     {
2440     case EQ_EXPR:
2441       return NE_EXPR;
2442     case NE_EXPR:
2443       return EQ_EXPR;
2444     case GT_EXPR:
2445       return honor_nans ? UNLE_EXPR : LE_EXPR;
2446     case GE_EXPR:
2447       return honor_nans ? UNLT_EXPR : LT_EXPR;
2448     case LT_EXPR:
2449       return honor_nans ? UNGE_EXPR : GE_EXPR;
2450     case LE_EXPR:
2451       return honor_nans ? UNGT_EXPR : GT_EXPR;
2452     case LTGT_EXPR:
2453       return UNEQ_EXPR;
2454     case UNEQ_EXPR:
2455       return LTGT_EXPR;
2456     case UNGT_EXPR:
2457       return LE_EXPR;
2458     case UNGE_EXPR:
2459       return LT_EXPR;
2460     case UNLT_EXPR:
2461       return GE_EXPR;
2462     case UNLE_EXPR:
2463       return GT_EXPR;
2464     case ORDERED_EXPR:
2465       return UNORDERED_EXPR;
2466     case UNORDERED_EXPR:
2467       return ORDERED_EXPR;
2468     default:
2469       gcc_unreachable ();
2470     }
2471 }
2472
2473 /* Similar, but return the comparison that results if the operands are
2474    swapped.  This is safe for floating-point.  */
2475
2476 enum tree_code
2477 swap_tree_comparison (enum tree_code code)
2478 {
2479   switch (code)
2480     {
2481     case EQ_EXPR:
2482     case NE_EXPR:
2483     case ORDERED_EXPR:
2484     case UNORDERED_EXPR:
2485     case LTGT_EXPR:
2486     case UNEQ_EXPR:
2487       return code;
2488     case GT_EXPR:
2489       return LT_EXPR;
2490     case GE_EXPR:
2491       return LE_EXPR;
2492     case LT_EXPR:
2493       return GT_EXPR;
2494     case LE_EXPR:
2495       return GE_EXPR;
2496     case UNGT_EXPR:
2497       return UNLT_EXPR;
2498     case UNGE_EXPR:
2499       return UNLE_EXPR;
2500     case UNLT_EXPR:
2501       return UNGT_EXPR;
2502     case UNLE_EXPR:
2503       return UNGE_EXPR;
2504     default:
2505       gcc_unreachable ();
2506     }
2507 }
2508
2509
2510 /* Convert a comparison tree code from an enum tree_code representation
2511    into a compcode bit-based encoding.  This function is the inverse of
2512    compcode_to_comparison.  */
2513
2514 static enum comparison_code
2515 comparison_to_compcode (enum tree_code code)
2516 {
2517   switch (code)
2518     {
2519     case LT_EXPR:
2520       return COMPCODE_LT;
2521     case EQ_EXPR:
2522       return COMPCODE_EQ;
2523     case LE_EXPR:
2524       return COMPCODE_LE;
2525     case GT_EXPR:
2526       return COMPCODE_GT;
2527     case NE_EXPR:
2528       return COMPCODE_NE;
2529     case GE_EXPR:
2530       return COMPCODE_GE;
2531     case ORDERED_EXPR:
2532       return COMPCODE_ORD;
2533     case UNORDERED_EXPR:
2534       return COMPCODE_UNORD;
2535     case UNLT_EXPR:
2536       return COMPCODE_UNLT;
2537     case UNEQ_EXPR:
2538       return COMPCODE_UNEQ;
2539     case UNLE_EXPR:
2540       return COMPCODE_UNLE;
2541     case UNGT_EXPR:
2542       return COMPCODE_UNGT;
2543     case LTGT_EXPR:
2544       return COMPCODE_LTGT;
2545     case UNGE_EXPR:
2546       return COMPCODE_UNGE;
2547     default:
2548       gcc_unreachable ();
2549     }
2550 }
2551
2552 /* Convert a compcode bit-based encoding of a comparison operator back
2553    to GCC's enum tree_code representation.  This function is the
2554    inverse of comparison_to_compcode.  */
2555
2556 static enum tree_code
2557 compcode_to_comparison (enum comparison_code code)
2558 {
2559   switch (code)
2560     {
2561     case COMPCODE_LT:
2562       return LT_EXPR;
2563     case COMPCODE_EQ:
2564       return EQ_EXPR;
2565     case COMPCODE_LE:
2566       return LE_EXPR;
2567     case COMPCODE_GT:
2568       return GT_EXPR;
2569     case COMPCODE_NE:
2570       return NE_EXPR;
2571     case COMPCODE_GE:
2572       return GE_EXPR;
2573     case COMPCODE_ORD:
2574       return ORDERED_EXPR;
2575     case COMPCODE_UNORD:
2576       return UNORDERED_EXPR;
2577     case COMPCODE_UNLT:
2578       return UNLT_EXPR;
2579     case COMPCODE_UNEQ:
2580       return UNEQ_EXPR;
2581     case COMPCODE_UNLE:
2582       return UNLE_EXPR;
2583     case COMPCODE_UNGT:
2584       return UNGT_EXPR;
2585     case COMPCODE_LTGT:
2586       return LTGT_EXPR;
2587     case COMPCODE_UNGE:
2588       return UNGE_EXPR;
2589     default:
2590       gcc_unreachable ();
2591     }
2592 }
2593
2594 /* Return a tree for the comparison which is the combination of
2595    doing the AND or OR (depending on CODE) of the two operations LCODE
2596    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2597    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2598    if this makes the transformation invalid.  */
2599
2600 tree
2601 combine_comparisons (enum tree_code code, enum tree_code lcode,
2602                      enum tree_code rcode, tree truth_type,
2603                      tree ll_arg, tree lr_arg)
2604 {
2605   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2606   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2607   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2608   enum comparison_code compcode;
2609
2610   switch (code)
2611     {
2612     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2613       compcode = lcompcode & rcompcode;
2614       break;
2615
2616     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2617       compcode = lcompcode | rcompcode;
2618       break;
2619
2620     default:
2621       return NULL_TREE;
2622     }
2623
2624   if (!honor_nans)
2625     {
2626       /* Eliminate unordered comparisons, as well as LTGT and ORD
2627          which are not used unless the mode has NaNs.  */
2628       compcode &= ~COMPCODE_UNORD;
2629       if (compcode == COMPCODE_LTGT)
2630         compcode = COMPCODE_NE;
2631       else if (compcode == COMPCODE_ORD)
2632         compcode = COMPCODE_TRUE;
2633     }
2634    else if (flag_trapping_math)
2635      {
2636         /* Check that the original operation and the optimized ones will trap
2637            under the same condition.  */
2638         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2639                      && (lcompcode != COMPCODE_EQ)
2640                      && (lcompcode != COMPCODE_ORD);
2641         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2642                      && (rcompcode != COMPCODE_EQ)
2643                      && (rcompcode != COMPCODE_ORD);
2644         bool trap = (compcode & COMPCODE_UNORD) == 0
2645                     && (compcode != COMPCODE_EQ)
2646                     && (compcode != COMPCODE_ORD);
2647
2648         /* In a short-circuited boolean expression the LHS might be
2649            such that the RHS, if evaluated, will never trap.  For
2650            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2651            if neither x nor y is NaN.  (This is a mixed blessing: for
2652            example, the expression above will never trap, hence
2653            optimizing it to x < y would be invalid).  */
2654         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2655             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2656           rtrap = false;
2657
2658         /* If the comparison was short-circuited, and only the RHS
2659            trapped, we may now generate a spurious trap.  */
2660         if (rtrap && !ltrap
2661             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2662           return NULL_TREE;
2663
2664         /* If we changed the conditions that cause a trap, we lose.  */
2665         if ((ltrap || rtrap) != trap)
2666           return NULL_TREE;
2667       }
2668
2669   if (compcode == COMPCODE_TRUE)
2670     return constant_boolean_node (true, truth_type);
2671   else if (compcode == COMPCODE_FALSE)
2672     return constant_boolean_node (false, truth_type);
2673   else
2674     return fold_build2 (compcode_to_comparison (compcode),
2675                         truth_type, ll_arg, lr_arg);
2676 }
2677
2678 /* Return nonzero if CODE is a tree code that represents a truth value.  */
2679
2680 static int
2681 truth_value_p (enum tree_code code)
2682 {
2683   return (TREE_CODE_CLASS (code) == tcc_comparison
2684           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2685           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2686           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2687 }
2688 \f
2689 /* Return nonzero if two operands (typically of the same tree node)
2690    are necessarily equal.  If either argument has side-effects this
2691    function returns zero.  FLAGS modifies behavior as follows:
2692
2693    If OEP_ONLY_CONST is set, only return nonzero for constants.
2694    This function tests whether the operands are indistinguishable;
2695    it does not test whether they are equal using C's == operation.
2696    The distinction is important for IEEE floating point, because
2697    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2698    (2) two NaNs may be indistinguishable, but NaN!=NaN.
2699
2700    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2701    even though it may hold multiple values during a function.
2702    This is because a GCC tree node guarantees that nothing else is
2703    executed between the evaluation of its "operands" (which may often
2704    be evaluated in arbitrary order).  Hence if the operands themselves
2705    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2706    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
2707    unset means assuming isochronic (or instantaneous) tree equivalence.
2708    Unless comparing arbitrary expression trees, such as from different
2709    statements, this flag can usually be left unset.
2710
2711    If OEP_PURE_SAME is set, then pure functions with identical arguments
2712    are considered the same.  It is used when the caller has other ways
2713    to ensure that global memory is unchanged in between.  */
2714
2715 int
2716 operand_equal_p (tree arg0, tree arg1, unsigned int flags)
2717 {
2718   /* If either is ERROR_MARK, they aren't equal.  */
2719   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
2720     return 0;
2721
2722   /* If both types don't have the same signedness, then we can't consider
2723      them equal.  We must check this before the STRIP_NOPS calls
2724      because they may change the signedness of the arguments.  */
2725   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2726     return 0;
2727
2728   /* If both types don't have the same precision, then it is not safe
2729      to strip NOPs.  */
2730   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
2731     return 0;
2732
2733   STRIP_NOPS (arg0);
2734   STRIP_NOPS (arg1);
2735
2736   /* In case both args are comparisons but with different comparison
2737      code, try to swap the comparison operands of one arg to produce
2738      a match and compare that variant.  */
2739   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2740       && COMPARISON_CLASS_P (arg0)
2741       && COMPARISON_CLASS_P (arg1))
2742     {
2743       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
2744
2745       if (TREE_CODE (arg0) == swap_code)
2746         return operand_equal_p (TREE_OPERAND (arg0, 0),
2747                                 TREE_OPERAND (arg1, 1), flags)
2748                && operand_equal_p (TREE_OPERAND (arg0, 1),
2749                                    TREE_OPERAND (arg1, 0), flags);
2750     }
2751
2752   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2753       /* This is needed for conversions and for COMPONENT_REF.
2754          Might as well play it safe and always test this.  */
2755       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2756       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2757       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2758     return 0;
2759
2760   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2761      We don't care about side effects in that case because the SAVE_EXPR
2762      takes care of that for us. In all other cases, two expressions are
2763      equal if they have no side effects.  If we have two identical
2764      expressions with side effects that should be treated the same due
2765      to the only side effects being identical SAVE_EXPR's, that will
2766      be detected in the recursive calls below.  */
2767   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2768       && (TREE_CODE (arg0) == SAVE_EXPR
2769           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2770     return 1;
2771
2772   /* Next handle constant cases, those for which we can return 1 even
2773      if ONLY_CONST is set.  */
2774   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2775     switch (TREE_CODE (arg0))
2776       {
2777       case INTEGER_CST:
2778         return tree_int_cst_equal (arg0, arg1);
2779
2780       case REAL_CST:
2781         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2782                                    TREE_REAL_CST (arg1)))
2783           return 1;
2784
2785         
2786         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
2787           {
2788             /* If we do not distinguish between signed and unsigned zero,
2789                consider them equal.  */
2790             if (real_zerop (arg0) && real_zerop (arg1))
2791               return 1;
2792           }
2793         return 0;
2794
2795       case VECTOR_CST:
2796         {
2797           tree v1, v2;
2798
2799           v1 = TREE_VECTOR_CST_ELTS (arg0);
2800           v2 = TREE_VECTOR_CST_ELTS (arg1);
2801           while (v1 && v2)
2802             {
2803               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
2804                                     flags))
2805                 return 0;
2806               v1 = TREE_CHAIN (v1);
2807               v2 = TREE_CHAIN (v2);
2808             }
2809
2810           return v1 == v2;
2811         }
2812
2813       case COMPLEX_CST:
2814         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2815                                  flags)
2816                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2817                                     flags));
2818
2819       case STRING_CST:
2820         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2821                 && ! memcmp (TREE_STRING_POINTER (arg0),
2822                               TREE_STRING_POINTER (arg1),
2823                               TREE_STRING_LENGTH (arg0)));
2824
2825       case ADDR_EXPR:
2826         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2827                                 0);
2828       default:
2829         break;
2830       }
2831
2832   if (flags & OEP_ONLY_CONST)
2833     return 0;
2834
2835 /* Define macros to test an operand from arg0 and arg1 for equality and a
2836    variant that allows null and views null as being different from any
2837    non-null value.  In the latter case, if either is null, the both
2838    must be; otherwise, do the normal comparison.  */
2839 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
2840                                     TREE_OPERAND (arg1, N), flags)
2841
2842 #define OP_SAME_WITH_NULL(N)                            \
2843   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
2844    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2845
2846   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2847     {
2848     case tcc_unary:
2849       /* Two conversions are equal only if signedness and modes match.  */
2850       switch (TREE_CODE (arg0))
2851         {
2852         case NOP_EXPR:
2853         case CONVERT_EXPR:
2854         case FIX_TRUNC_EXPR:
2855           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2856               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2857             return 0;
2858           break;
2859         default:
2860           break;
2861         }
2862
2863       return OP_SAME (0);
2864
2865
2866     case tcc_comparison:
2867     case tcc_binary:
2868       if (OP_SAME (0) && OP_SAME (1))
2869         return 1;
2870
2871       /* For commutative ops, allow the other order.  */
2872       return (commutative_tree_code (TREE_CODE (arg0))
2873               && operand_equal_p (TREE_OPERAND (arg0, 0),
2874                                   TREE_OPERAND (arg1, 1), flags)
2875               && operand_equal_p (TREE_OPERAND (arg0, 1),
2876                                   TREE_OPERAND (arg1, 0), flags));
2877
2878     case tcc_reference:
2879       /* If either of the pointer (or reference) expressions we are
2880          dereferencing contain a side effect, these cannot be equal.  */
2881       if (TREE_SIDE_EFFECTS (arg0)
2882           || TREE_SIDE_EFFECTS (arg1))
2883         return 0;
2884
2885       switch (TREE_CODE (arg0))
2886         {
2887         case INDIRECT_REF:
2888         case ALIGN_INDIRECT_REF:
2889         case MISALIGNED_INDIRECT_REF:
2890         case REALPART_EXPR:
2891         case IMAGPART_EXPR:
2892           return OP_SAME (0);
2893
2894         case ARRAY_REF:
2895         case ARRAY_RANGE_REF:
2896           /* Operands 2 and 3 may be null.
2897              Compare the array index by value if it is constant first as we
2898              may have different types but same value here.  */
2899           return (OP_SAME (0)
2900                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
2901                                           TREE_OPERAND (arg1, 1))
2902                       || OP_SAME (1))
2903                   && OP_SAME_WITH_NULL (2)
2904                   && OP_SAME_WITH_NULL (3));
2905
2906         case COMPONENT_REF:
2907           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
2908              may be NULL when we're called to compare MEM_EXPRs.  */
2909           return OP_SAME_WITH_NULL (0)
2910                  && OP_SAME (1)
2911                  && OP_SAME_WITH_NULL (2);
2912
2913         case BIT_FIELD_REF:
2914           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
2915
2916         default:
2917           return 0;
2918         }
2919
2920     case tcc_expression:
2921       switch (TREE_CODE (arg0))
2922         {
2923         case ADDR_EXPR:
2924         case TRUTH_NOT_EXPR:
2925           return OP_SAME (0);
2926
2927         case TRUTH_ANDIF_EXPR:
2928         case TRUTH_ORIF_EXPR:
2929           return OP_SAME (0) && OP_SAME (1);
2930
2931         case TRUTH_AND_EXPR:
2932         case TRUTH_OR_EXPR:
2933         case TRUTH_XOR_EXPR:
2934           if (OP_SAME (0) && OP_SAME (1))
2935             return 1;
2936
2937           /* Otherwise take into account this is a commutative operation.  */
2938           return (operand_equal_p (TREE_OPERAND (arg0, 0),
2939                                    TREE_OPERAND (arg1, 1), flags)
2940                   && operand_equal_p (TREE_OPERAND (arg0, 1),
2941                                       TREE_OPERAND (arg1, 0), flags));
2942
2943         default:
2944           return 0;
2945         }
2946
2947     case tcc_vl_exp:
2948       switch (TREE_CODE (arg0))
2949         {
2950         case CALL_EXPR:
2951           /* If the CALL_EXPRs call different functions, then they
2952              clearly can not be equal.  */
2953           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
2954                                  flags))
2955             return 0;
2956
2957           {
2958             unsigned int cef = call_expr_flags (arg0);
2959             if (flags & OEP_PURE_SAME)
2960               cef &= ECF_CONST | ECF_PURE;
2961             else
2962               cef &= ECF_CONST;
2963             if (!cef)
2964               return 0;
2965           }
2966
2967           /* Now see if all the arguments are the same.  */
2968           {
2969             call_expr_arg_iterator iter0, iter1;
2970             tree a0, a1;
2971             for (a0 = first_call_expr_arg (arg0, &iter0),
2972                    a1 = first_call_expr_arg (arg1, &iter1);
2973                  a0 && a1;
2974                  a0 = next_call_expr_arg (&iter0),
2975                    a1 = next_call_expr_arg (&iter1))
2976               if (! operand_equal_p (a0, a1, flags))
2977                 return 0;
2978
2979             /* If we get here and both argument lists are exhausted
2980                then the CALL_EXPRs are equal.  */
2981             return ! (a0 || a1);
2982           }
2983         default:
2984           return 0;
2985         }
2986
2987     case tcc_declaration:
2988       /* Consider __builtin_sqrt equal to sqrt.  */
2989       return (TREE_CODE (arg0) == FUNCTION_DECL
2990               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2991               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2992               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
2993
2994     default:
2995       return 0;
2996     }
2997
2998 #undef OP_SAME
2999 #undef OP_SAME_WITH_NULL
3000 }
3001 \f
3002 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3003    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3004
3005    When in doubt, return 0.  */
3006
3007 static int
3008 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3009 {
3010   int unsignedp1, unsignedpo;
3011   tree primarg0, primarg1, primother;
3012   unsigned int correct_width;
3013
3014   if (operand_equal_p (arg0, arg1, 0))
3015     return 1;
3016
3017   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3018       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3019     return 0;
3020
3021   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3022      and see if the inner values are the same.  This removes any
3023      signedness comparison, which doesn't matter here.  */
3024   primarg0 = arg0, primarg1 = arg1;
3025   STRIP_NOPS (primarg0);
3026   STRIP_NOPS (primarg1);
3027   if (operand_equal_p (primarg0, primarg1, 0))
3028     return 1;
3029
3030   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3031      actual comparison operand, ARG0.
3032
3033      First throw away any conversions to wider types
3034      already present in the operands.  */
3035
3036   primarg1 = get_narrower (arg1, &unsignedp1);
3037   primother = get_narrower (other, &unsignedpo);
3038
3039   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3040   if (unsignedp1 == unsignedpo
3041       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3042       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3043     {
3044       tree type = TREE_TYPE (arg0);
3045
3046       /* Make sure shorter operand is extended the right way
3047          to match the longer operand.  */
3048       primarg1 = fold_convert (signed_or_unsigned_type_for
3049                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3050
3051       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3052         return 1;
3053     }
3054
3055   return 0;
3056 }
3057 \f
3058 /* See if ARG is an expression that is either a comparison or is performing
3059    arithmetic on comparisons.  The comparisons must only be comparing
3060    two different values, which will be stored in *CVAL1 and *CVAL2; if
3061    they are nonzero it means that some operands have already been found.
3062    No variables may be used anywhere else in the expression except in the
3063    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3064    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3065
3066    If this is true, return 1.  Otherwise, return zero.  */
3067
3068 static int
3069 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3070 {
3071   enum tree_code code = TREE_CODE (arg);
3072   enum tree_code_class class = TREE_CODE_CLASS (code);
3073
3074   /* We can handle some of the tcc_expression cases here.  */
3075   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3076     class = tcc_unary;
3077   else if (class == tcc_expression
3078            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3079                || code == COMPOUND_EXPR))
3080     class = tcc_binary;
3081
3082   else if (class == tcc_expression && code == SAVE_EXPR
3083            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3084     {
3085       /* If we've already found a CVAL1 or CVAL2, this expression is
3086          two complex to handle.  */
3087       if (*cval1 || *cval2)
3088         return 0;
3089
3090       class = tcc_unary;
3091       *save_p = 1;
3092     }
3093
3094   switch (class)
3095     {
3096     case tcc_unary:
3097       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3098
3099     case tcc_binary:
3100       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3101               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3102                                       cval1, cval2, save_p));
3103
3104     case tcc_constant:
3105       return 1;
3106
3107     case tcc_expression:
3108       if (code == COND_EXPR)
3109         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3110                                      cval1, cval2, save_p)
3111                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3112                                         cval1, cval2, save_p)
3113                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3114                                         cval1, cval2, save_p));
3115       return 0;
3116
3117     case tcc_comparison:
3118       /* First see if we can handle the first operand, then the second.  For
3119          the second operand, we know *CVAL1 can't be zero.  It must be that
3120          one side of the comparison is each of the values; test for the
3121          case where this isn't true by failing if the two operands
3122          are the same.  */
3123
3124       if (operand_equal_p (TREE_OPERAND (arg, 0),
3125                            TREE_OPERAND (arg, 1), 0))
3126         return 0;
3127
3128       if (*cval1 == 0)
3129         *cval1 = TREE_OPERAND (arg, 0);
3130       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3131         ;
3132       else if (*cval2 == 0)
3133         *cval2 = TREE_OPERAND (arg, 0);
3134       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3135         ;
3136       else
3137         return 0;
3138
3139       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3140         ;
3141       else if (*cval2 == 0)
3142         *cval2 = TREE_OPERAND (arg, 1);
3143       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3144         ;
3145       else
3146         return 0;
3147
3148       return 1;
3149
3150     default:
3151       return 0;
3152     }
3153 }
3154 \f
3155 /* ARG is a tree that is known to contain just arithmetic operations and
3156    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3157    any occurrence of OLD0 as an operand of a comparison and likewise for
3158    NEW1 and OLD1.  */
3159
3160 static tree
3161 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3162 {
3163   tree type = TREE_TYPE (arg);
3164   enum tree_code code = TREE_CODE (arg);
3165   enum tree_code_class class = TREE_CODE_CLASS (code);
3166
3167   /* We can handle some of the tcc_expression cases here.  */
3168   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3169     class = tcc_unary;
3170   else if (class == tcc_expression
3171            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3172     class = tcc_binary;
3173
3174   switch (class)
3175     {
3176     case tcc_unary:
3177       return fold_build1 (code, type,
3178                           eval_subst (TREE_OPERAND (arg, 0),
3179                                       old0, new0, old1, new1));
3180
3181     case tcc_binary:
3182       return fold_build2 (code, type,
3183                           eval_subst (TREE_OPERAND (arg, 0),
3184                                       old0, new0, old1, new1),
3185                           eval_subst (TREE_OPERAND (arg, 1),
3186                                       old0, new0, old1, new1));
3187
3188     case tcc_expression:
3189       switch (code)
3190         {
3191         case SAVE_EXPR:
3192           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3193
3194         case COMPOUND_EXPR:
3195           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3196
3197         case COND_EXPR:
3198           return fold_build3 (code, type,
3199                               eval_subst (TREE_OPERAND (arg, 0),
3200                                           old0, new0, old1, new1),
3201                               eval_subst (TREE_OPERAND (arg, 1),
3202                                           old0, new0, old1, new1),
3203                               eval_subst (TREE_OPERAND (arg, 2),
3204                                           old0, new0, old1, new1));
3205         default:
3206           break;
3207         }
3208       /* Fall through - ???  */
3209
3210     case tcc_comparison:
3211       {
3212         tree arg0 = TREE_OPERAND (arg, 0);
3213         tree arg1 = TREE_OPERAND (arg, 1);
3214
3215         /* We need to check both for exact equality and tree equality.  The
3216            former will be true if the operand has a side-effect.  In that
3217            case, we know the operand occurred exactly once.  */
3218
3219         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3220           arg0 = new0;
3221         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3222           arg0 = new1;
3223
3224         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3225           arg1 = new0;
3226         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3227           arg1 = new1;
3228
3229         return fold_build2 (code, type, arg0, arg1);
3230       }
3231
3232     default:
3233       return arg;
3234     }
3235 }
3236 \f
3237 /* Return a tree for the case when the result of an expression is RESULT
3238    converted to TYPE and OMITTED was previously an operand of the expression
3239    but is now not needed (e.g., we folded OMITTED * 0).
3240
3241    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3242    the conversion of RESULT to TYPE.  */
3243
3244 tree
3245 omit_one_operand (tree type, tree result, tree omitted)
3246 {
3247   tree t = fold_convert (type, result);
3248
3249   if (TREE_SIDE_EFFECTS (omitted))
3250     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3251
3252   return non_lvalue (t);
3253 }
3254
3255 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3256
3257 static tree
3258 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3259 {
3260   tree t = fold_convert (type, result);
3261
3262   if (TREE_SIDE_EFFECTS (omitted))
3263     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3264
3265   return pedantic_non_lvalue (t);
3266 }
3267
3268 /* Return a tree for the case when the result of an expression is RESULT
3269    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3270    of the expression but are now not needed.
3271
3272    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3273    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3274    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3275    just do the conversion of RESULT to TYPE.  */
3276
3277 tree
3278 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3279 {
3280   tree t = fold_convert (type, result);
3281
3282   if (TREE_SIDE_EFFECTS (omitted2))
3283     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3284   if (TREE_SIDE_EFFECTS (omitted1))
3285     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3286
3287   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3288 }
3289
3290 \f
3291 /* Return a simplified tree node for the truth-negation of ARG.  This
3292    never alters ARG itself.  We assume that ARG is an operation that
3293    returns a truth value (0 or 1).
3294
3295    FIXME: one would think we would fold the result, but it causes
3296    problems with the dominator optimizer.  */
3297
3298 tree
3299 fold_truth_not_expr (tree arg)
3300 {
3301   tree type = TREE_TYPE (arg);
3302   enum tree_code code = TREE_CODE (arg);
3303
3304   /* If this is a comparison, we can simply invert it, except for
3305      floating-point non-equality comparisons, in which case we just
3306      enclose a TRUTH_NOT_EXPR around what we have.  */
3307
3308   if (TREE_CODE_CLASS (code) == tcc_comparison)
3309     {
3310       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3311       if (FLOAT_TYPE_P (op_type)
3312           && flag_trapping_math
3313           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3314           && code != NE_EXPR && code != EQ_EXPR)
3315         return NULL_TREE;
3316       else
3317         {
3318           code = invert_tree_comparison (code,
3319                                          HONOR_NANS (TYPE_MODE (op_type)));
3320           if (code == ERROR_MARK)
3321             return NULL_TREE;
3322           else
3323             return build2 (code, type,
3324                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3325         }
3326     }
3327
3328   switch (code)
3329     {
3330     case INTEGER_CST:
3331       return constant_boolean_node (integer_zerop (arg), type);
3332
3333     case TRUTH_AND_EXPR:
3334       return build2 (TRUTH_OR_EXPR, type,
3335                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3336                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3337
3338     case TRUTH_OR_EXPR:
3339       return build2 (TRUTH_AND_EXPR, type,
3340                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3341                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3342
3343     case TRUTH_XOR_EXPR:
3344       /* Here we can invert either operand.  We invert the first operand
3345          unless the second operand is a TRUTH_NOT_EXPR in which case our
3346          result is the XOR of the first operand with the inside of the
3347          negation of the second operand.  */
3348
3349       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3350         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3351                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3352       else
3353         return build2 (TRUTH_XOR_EXPR, type,
3354                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3355                        TREE_OPERAND (arg, 1));
3356
3357     case TRUTH_ANDIF_EXPR:
3358       return build2 (TRUTH_ORIF_EXPR, type,
3359                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3360                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3361
3362     case TRUTH_ORIF_EXPR:
3363       return build2 (TRUTH_ANDIF_EXPR, type,
3364                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3365                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3366
3367     case TRUTH_NOT_EXPR:
3368       return TREE_OPERAND (arg, 0);
3369
3370     case COND_EXPR:
3371       {
3372         tree arg1 = TREE_OPERAND (arg, 1);
3373         tree arg2 = TREE_OPERAND (arg, 2);
3374         /* A COND_EXPR may have a throw as one operand, which
3375            then has void type.  Just leave void operands
3376            as they are.  */
3377         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3378                        VOID_TYPE_P (TREE_TYPE (arg1))
3379                        ? arg1 : invert_truthvalue (arg1),
3380                        VOID_TYPE_P (TREE_TYPE (arg2))
3381                        ? arg2 : invert_truthvalue (arg2));
3382       }
3383
3384     case COMPOUND_EXPR:
3385       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3386                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3387
3388     case NON_LVALUE_EXPR:
3389       return invert_truthvalue (TREE_OPERAND (arg, 0));
3390
3391     case NOP_EXPR:
3392       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3393         return build1 (TRUTH_NOT_EXPR, type, arg);
3394
3395     case CONVERT_EXPR:
3396     case FLOAT_EXPR:
3397       return build1 (TREE_CODE (arg), type,
3398                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3399
3400     case BIT_AND_EXPR:
3401       if (!integer_onep (TREE_OPERAND (arg, 1)))
3402         break;
3403       return build2 (EQ_EXPR, type, arg,
3404                      build_int_cst (type, 0));
3405
3406     case SAVE_EXPR:
3407       return build1 (TRUTH_NOT_EXPR, type, arg);
3408
3409     case CLEANUP_POINT_EXPR:
3410       return build1 (CLEANUP_POINT_EXPR, type,
3411                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3412
3413     default:
3414       break;
3415     }
3416
3417   return NULL_TREE;
3418 }
3419
3420 /* Return a simplified tree node for the truth-negation of ARG.  This
3421    never alters ARG itself.  We assume that ARG is an operation that
3422    returns a truth value (0 or 1).
3423
3424    FIXME: one would think we would fold the result, but it causes
3425    problems with the dominator optimizer.  */
3426
3427 tree
3428 invert_truthvalue (tree arg)
3429 {
3430   tree tem;
3431
3432   if (TREE_CODE (arg) == ERROR_MARK)
3433     return arg;
3434
3435   tem = fold_truth_not_expr (arg);
3436   if (!tem)
3437     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3438
3439   return tem;
3440 }
3441
3442 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3443    operands are another bit-wise operation with a common input.  If so,
3444    distribute the bit operations to save an operation and possibly two if
3445    constants are involved.  For example, convert
3446         (A | B) & (A | C) into A | (B & C)
3447    Further simplification will occur if B and C are constants.
3448
3449    If this optimization cannot be done, 0 will be returned.  */
3450
3451 static tree
3452 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3453 {
3454   tree common;
3455   tree left, right;
3456
3457   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3458       || TREE_CODE (arg0) == code
3459       || (TREE_CODE (arg0) != BIT_AND_EXPR
3460           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3461     return 0;
3462
3463   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3464     {
3465       common = TREE_OPERAND (arg0, 0);
3466       left = TREE_OPERAND (arg0, 1);
3467       right = TREE_OPERAND (arg1, 1);
3468     }
3469   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3470     {
3471       common = TREE_OPERAND (arg0, 0);
3472       left = TREE_OPERAND (arg0, 1);
3473       right = TREE_OPERAND (arg1, 0);
3474     }
3475   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3476     {
3477       common = TREE_OPERAND (arg0, 1);
3478       left = TREE_OPERAND (arg0, 0);
3479       right = TREE_OPERAND (arg1, 1);
3480     }
3481   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3482     {
3483       common = TREE_OPERAND (arg0, 1);
3484       left = TREE_OPERAND (arg0, 0);
3485       right = TREE_OPERAND (arg1, 0);
3486     }
3487   else
3488     return 0;
3489
3490   return fold_build2 (TREE_CODE (arg0), type, common,
3491                       fold_build2 (code, type, left, right));
3492 }
3493
3494 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3495    with code CODE.  This optimization is unsafe.  */
3496 static tree
3497 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3498 {
3499   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3500   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3501
3502   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3503   if (mul0 == mul1
3504       && operand_equal_p (TREE_OPERAND (arg0, 1),
3505                        TREE_OPERAND (arg1, 1), 0))
3506     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3507                         fold_build2 (code, type,
3508                                      TREE_OPERAND (arg0, 0),
3509                                      TREE_OPERAND (arg1, 0)),
3510                         TREE_OPERAND (arg0, 1));
3511
3512   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3513   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3514                        TREE_OPERAND (arg1, 0), 0)
3515       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3516       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3517     {
3518       REAL_VALUE_TYPE r0, r1;
3519       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3520       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3521       if (!mul0)
3522         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3523       if (!mul1)
3524         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3525       real_arithmetic (&r0, code, &r0, &r1);
3526       return fold_build2 (MULT_EXPR, type,
3527                           TREE_OPERAND (arg0, 0),
3528                           build_real (type, r0));
3529     }
3530
3531   return NULL_TREE;
3532 }
3533 \f
3534 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3535    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
3536
3537 static tree
3538 make_bit_field_ref (tree inner, tree type, int bitsize, int bitpos,
3539                     int unsignedp)
3540 {
3541   tree result;
3542
3543   if (bitpos == 0)
3544     {
3545       tree size = TYPE_SIZE (TREE_TYPE (inner));
3546       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3547            || POINTER_TYPE_P (TREE_TYPE (inner)))
3548           && host_integerp (size, 0) 
3549           && tree_low_cst (size, 0) == bitsize)
3550         return fold_convert (type, inner);
3551     }
3552
3553   result = build3 (BIT_FIELD_REF, type, inner,
3554                    size_int (bitsize), bitsize_int (bitpos));
3555
3556   BIT_FIELD_REF_UNSIGNED (result) = unsignedp;
3557
3558   return result;
3559 }
3560
3561 /* Optimize a bit-field compare.
3562
3563    There are two cases:  First is a compare against a constant and the
3564    second is a comparison of two items where the fields are at the same
3565    bit position relative to the start of a chunk (byte, halfword, word)
3566    large enough to contain it.  In these cases we can avoid the shift
3567    implicit in bitfield extractions.
3568
3569    For constants, we emit a compare of the shifted constant with the
3570    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3571    compared.  For two fields at the same position, we do the ANDs with the
3572    similar mask and compare the result of the ANDs.
3573
3574    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3575    COMPARE_TYPE is the type of the comparison, and LHS and RHS
3576    are the left and right operands of the comparison, respectively.
3577
3578    If the optimization described above can be done, we return the resulting
3579    tree.  Otherwise we return zero.  */
3580
3581 static tree
3582 optimize_bit_field_compare (enum tree_code code, tree compare_type,
3583                             tree lhs, tree rhs)
3584 {
3585   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3586   tree type = TREE_TYPE (lhs);
3587   tree signed_type, unsigned_type;
3588   int const_p = TREE_CODE (rhs) == INTEGER_CST;
3589   enum machine_mode lmode, rmode, nmode;
3590   int lunsignedp, runsignedp;
3591   int lvolatilep = 0, rvolatilep = 0;
3592   tree linner, rinner = NULL_TREE;
3593   tree mask;
3594   tree offset;
3595
3596   /* Get all the information about the extractions being done.  If the bit size
3597      if the same as the size of the underlying object, we aren't doing an
3598      extraction at all and so can do nothing.  We also don't want to
3599      do anything if the inner expression is a PLACEHOLDER_EXPR since we
3600      then will no longer be able to replace it.  */
3601   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3602                                 &lunsignedp, &lvolatilep, false);
3603   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3604       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
3605     return 0;
3606
3607  if (!const_p)
3608    {
3609      /* If this is not a constant, we can only do something if bit positions,
3610         sizes, and signedness are the same.  */
3611      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3612                                    &runsignedp, &rvolatilep, false);
3613
3614      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3615          || lunsignedp != runsignedp || offset != 0
3616          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
3617        return 0;
3618    }
3619
3620   /* See if we can find a mode to refer to this field.  We should be able to,
3621      but fail if we can't.  */
3622   nmode = get_best_mode (lbitsize, lbitpos,
3623                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3624                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3625                                 TYPE_ALIGN (TREE_TYPE (rinner))),
3626                          word_mode, lvolatilep || rvolatilep);
3627   if (nmode == VOIDmode)
3628     return 0;
3629
3630   /* Set signed and unsigned types of the precision of this mode for the
3631      shifts below.  */
3632   signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3633   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3634
3635   /* Compute the bit position and size for the new reference and our offset
3636      within it. If the new reference is the same size as the original, we
3637      won't optimize anything, so return zero.  */
3638   nbitsize = GET_MODE_BITSIZE (nmode);
3639   nbitpos = lbitpos & ~ (nbitsize - 1);
3640   lbitpos -= nbitpos;
3641   if (nbitsize == lbitsize)
3642     return 0;
3643
3644   if (BYTES_BIG_ENDIAN)
3645     lbitpos = nbitsize - lbitsize - lbitpos;
3646
3647   /* Make the mask to be used against the extracted field.  */
3648   mask = build_int_cst_type (unsigned_type, -1);
3649   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
3650   mask = const_binop (RSHIFT_EXPR, mask,
3651                       size_int (nbitsize - lbitsize - lbitpos), 0);
3652
3653   if (! const_p)
3654     /* If not comparing with constant, just rework the comparison
3655        and return.  */
3656     return fold_build2 (code, compare_type,
3657                         fold_build2 (BIT_AND_EXPR, unsigned_type,
3658                                      make_bit_field_ref (linner,
3659                                                          unsigned_type,
3660                                                          nbitsize, nbitpos,
3661                                                          1),
3662                                      mask),
3663                         fold_build2 (BIT_AND_EXPR, unsigned_type,
3664                                      make_bit_field_ref (rinner,
3665                                                          unsigned_type,
3666                                                          nbitsize, nbitpos,
3667                                                          1),
3668                                      mask));
3669
3670   /* Otherwise, we are handling the constant case. See if the constant is too
3671      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
3672      this not only for its own sake, but to avoid having to test for this
3673      error case below.  If we didn't, we might generate wrong code.
3674
3675      For unsigned fields, the constant shifted right by the field length should
3676      be all zero.  For signed fields, the high-order bits should agree with
3677      the sign bit.  */
3678
3679   if (lunsignedp)
3680     {
3681       if (! integer_zerop (const_binop (RSHIFT_EXPR,
3682                                         fold_convert (unsigned_type, rhs),
3683                                         size_int (lbitsize), 0)))
3684         {
3685           warning (0, "comparison is always %d due to width of bit-field",
3686                    code == NE_EXPR);
3687           return constant_boolean_node (code == NE_EXPR, compare_type);
3688         }
3689     }
3690   else
3691     {
3692       tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs),
3693                               size_int (lbitsize - 1), 0);
3694       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
3695         {
3696           warning (0, "comparison is always %d due to width of bit-field",
3697                    code == NE_EXPR);
3698           return constant_boolean_node (code == NE_EXPR, compare_type);
3699         }
3700     }
3701
3702   /* Single-bit compares should always be against zero.  */
3703   if (lbitsize == 1 && ! integer_zerop (rhs))
3704     {
3705       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3706       rhs = build_int_cst (type, 0);
3707     }
3708
3709   /* Make a new bitfield reference, shift the constant over the
3710      appropriate number of bits and mask it with the computed mask
3711      (in case this was a signed field).  If we changed it, make a new one.  */
3712   lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
3713   if (lvolatilep)
3714     {
3715       TREE_SIDE_EFFECTS (lhs) = 1;
3716       TREE_THIS_VOLATILE (lhs) = 1;
3717     }
3718
3719   rhs = const_binop (BIT_AND_EXPR,
3720                      const_binop (LSHIFT_EXPR,
3721                                   fold_convert (unsigned_type, rhs),
3722                                   size_int (lbitpos), 0),
3723                      mask, 0);
3724
3725   return build2 (code, compare_type,
3726                  build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
3727                  rhs);
3728 }
3729 \f
3730 /* Subroutine for fold_truthop: decode a field reference.
3731
3732    If EXP is a comparison reference, we return the innermost reference.
3733
3734    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3735    set to the starting bit number.
3736
3737    If the innermost field can be completely contained in a mode-sized
3738    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3739
3740    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3741    otherwise it is not changed.
3742
3743    *PUNSIGNEDP is set to the signedness of the field.
3744
3745    *PMASK is set to the mask used.  This is either contained in a
3746    BIT_AND_EXPR or derived from the width of the field.
3747
3748    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3749
3750    Return 0 if this is not a component reference or is one that we can't
3751    do anything with.  */
3752
3753 static tree
3754 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3755                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3756                         int *punsignedp, int *pvolatilep,
3757                         tree *pmask, tree *pand_mask)
3758 {
3759   tree outer_type = 0;
3760   tree and_mask = 0;
3761   tree mask, inner, offset;
3762   tree unsigned_type;
3763   unsigned int precision;
3764
3765   /* All the optimizations using this function assume integer fields.
3766      There are problems with FP fields since the type_for_size call
3767      below can fail for, e.g., XFmode.  */
3768   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3769     return 0;
3770
3771   /* We are interested in the bare arrangement of bits, so strip everything
3772      that doesn't affect the machine mode.  However, record the type of the
3773      outermost expression if it may matter below.  */
3774   if (TREE_CODE (exp) == NOP_EXPR
3775       || TREE_CODE (exp) == CONVERT_EXPR
3776       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3777     outer_type = TREE_TYPE (exp);
3778   STRIP_NOPS (exp);
3779
3780   if (TREE_CODE (exp) == BIT_AND_EXPR)
3781     {
3782       and_mask = TREE_OPERAND (exp, 1);
3783       exp = TREE_OPERAND (exp, 0);
3784       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3785       if (TREE_CODE (and_mask) != INTEGER_CST)
3786         return 0;
3787     }
3788
3789   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3790                                punsignedp, pvolatilep, false);
3791   if ((inner == exp && and_mask == 0)
3792       || *pbitsize < 0 || offset != 0
3793       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3794     return 0;
3795
3796   /* If the number of bits in the reference is the same as the bitsize of
3797      the outer type, then the outer type gives the signedness. Otherwise
3798      (in case of a small bitfield) the signedness is unchanged.  */
3799   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3800     *punsignedp = TYPE_UNSIGNED (outer_type);
3801
3802   /* Compute the mask to access the bitfield.  */
3803   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3804   precision = TYPE_PRECISION (unsigned_type);
3805
3806   mask = build_int_cst_type (unsigned_type, -1);
3807
3808   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3809   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3810
3811   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3812   if (and_mask != 0)
3813     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3814                         fold_convert (unsigned_type, and_mask), mask);
3815
3816   *pmask = mask;
3817   *pand_mask = and_mask;
3818   return inner;
3819 }
3820
3821 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3822    bit positions.  */
3823
3824 static int
3825 all_ones_mask_p (tree mask, int size)
3826 {
3827   tree type = TREE_TYPE (mask);
3828   unsigned int precision = TYPE_PRECISION (type);
3829   tree tmask;
3830
3831   tmask = build_int_cst_type (signed_type_for (type), -1);
3832
3833   return
3834     tree_int_cst_equal (mask,
3835                         const_binop (RSHIFT_EXPR,
3836                                      const_binop (LSHIFT_EXPR, tmask,
3837                                                   size_int (precision - size),
3838                                                   0),
3839                                      size_int (precision - size), 0));
3840 }
3841
3842 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3843    represents the sign bit of EXP's type.  If EXP represents a sign
3844    or zero extension, also test VAL against the unextended type.
3845    The return value is the (sub)expression whose sign bit is VAL,
3846    or NULL_TREE otherwise.  */
3847
3848 static tree
3849 sign_bit_p (tree exp, tree val)
3850 {
3851   unsigned HOST_WIDE_INT mask_lo, lo;
3852   HOST_WIDE_INT mask_hi, hi;
3853   int width;
3854   tree t;
3855
3856   /* Tree EXP must have an integral type.  */
3857   t = TREE_TYPE (exp);
3858   if (! INTEGRAL_TYPE_P (t))
3859     return NULL_TREE;
3860
3861   /* Tree VAL must be an integer constant.  */
3862   if (TREE_CODE (val) != INTEGER_CST
3863       || TREE_OVERFLOW (val))
3864     return NULL_TREE;
3865
3866   width = TYPE_PRECISION (t);
3867   if (width > HOST_BITS_PER_WIDE_INT)
3868     {
3869       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3870       lo = 0;
3871
3872       mask_hi = ((unsigned HOST_WIDE_INT) -1
3873                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3874       mask_lo = -1;
3875     }
3876   else
3877     {
3878       hi = 0;
3879       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3880
3881       mask_hi = 0;
3882       mask_lo = ((unsigned HOST_WIDE_INT) -1
3883                  >> (HOST_BITS_PER_WIDE_INT - width));
3884     }
3885
3886   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3887      treat VAL as if it were unsigned.  */
3888   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3889       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3890     return exp;
3891
3892   /* Handle extension from a narrower type.  */
3893   if (TREE_CODE (exp) == NOP_EXPR
3894       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3895     return sign_bit_p (TREE_OPERAND (exp, 0), val);
3896
3897   return NULL_TREE;
3898 }
3899
3900 /* Subroutine for fold_truthop: determine if an operand is simple enough
3901    to be evaluated unconditionally.  */
3902
3903 static int
3904 simple_operand_p (tree exp)
3905 {
3906   /* Strip any conversions that don't change the machine mode.  */
3907   STRIP_NOPS (exp);
3908
3909   return (CONSTANT_CLASS_P (exp)
3910           || TREE_CODE (exp) == SSA_NAME
3911           || (DECL_P (exp)
3912               && ! TREE_ADDRESSABLE (exp)
3913               && ! TREE_THIS_VOLATILE (exp)
3914               && ! DECL_NONLOCAL (exp)
3915               /* Don't regard global variables as simple.  They may be
3916                  allocated in ways unknown to the compiler (shared memory,
3917                  #pragma weak, etc).  */
3918               && ! TREE_PUBLIC (exp)
3919               && ! DECL_EXTERNAL (exp)
3920               /* Loading a static variable is unduly expensive, but global
3921                  registers aren't expensive.  */
3922               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
3923 }
3924 \f
3925 /* The following functions are subroutines to fold_range_test and allow it to
3926    try to change a logical combination of comparisons into a range test.
3927
3928    For example, both
3929         X == 2 || X == 3 || X == 4 || X == 5
3930    and
3931         X >= 2 && X <= 5
3932    are converted to
3933         (unsigned) (X - 2) <= 3
3934
3935    We describe each set of comparisons as being either inside or outside
3936    a range, using a variable named like IN_P, and then describe the
3937    range with a lower and upper bound.  If one of the bounds is omitted,
3938    it represents either the highest or lowest value of the type.
3939
3940    In the comments below, we represent a range by two numbers in brackets
3941    preceded by a "+" to designate being inside that range, or a "-" to
3942    designate being outside that range, so the condition can be inverted by
3943    flipping the prefix.  An omitted bound is represented by a "-".  For
3944    example, "- [-, 10]" means being outside the range starting at the lowest
3945    possible value and ending at 10, in other words, being greater than 10.
3946    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
3947    always false.
3948
3949    We set up things so that the missing bounds are handled in a consistent
3950    manner so neither a missing bound nor "true" and "false" need to be
3951    handled using a special case.  */
3952
3953 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
3954    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
3955    and UPPER1_P are nonzero if the respective argument is an upper bound
3956    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
3957    must be specified for a comparison.  ARG1 will be converted to ARG0's
3958    type if both are specified.  */
3959
3960 static tree
3961 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
3962              tree arg1, int upper1_p)
3963 {
3964   tree tem;
3965   int result;
3966   int sgn0, sgn1;
3967
3968   /* If neither arg represents infinity, do the normal operation.
3969      Else, if not a comparison, return infinity.  Else handle the special
3970      comparison rules. Note that most of the cases below won't occur, but
3971      are handled for consistency.  */
3972
3973   if (arg0 != 0 && arg1 != 0)
3974     {
3975       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
3976                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
3977       STRIP_NOPS (tem);
3978       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
3979     }
3980
3981   if (TREE_CODE_CLASS (code) != tcc_comparison)
3982     return 0;
3983
3984   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
3985      for neither.  In real maths, we cannot assume open ended ranges are
3986      the same. But, this is computer arithmetic, where numbers are finite.
3987      We can therefore make the transformation of any unbounded range with
3988      the value Z, Z being greater than any representable number. This permits
3989      us to treat unbounded ranges as equal.  */
3990   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
3991   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
3992   switch (code)
3993     {
3994     case EQ_EXPR:
3995       result = sgn0 == sgn1;
3996       break;
3997     case NE_EXPR:
3998       result = sgn0 != sgn1;
3999       break;
4000     case LT_EXPR:
4001       result = sgn0 < sgn1;
4002       break;
4003     case LE_EXPR:
4004       result = sgn0 <= sgn1;
4005       break;
4006     case GT_EXPR:
4007       result = sgn0 > sgn1;
4008       break;
4009     case GE_EXPR:
4010       result = sgn0 >= sgn1;
4011       break;
4012     default:
4013       gcc_unreachable ();
4014     }
4015
4016   return constant_boolean_node (result, type);
4017 }
4018 \f
4019 /* Given EXP, a logical expression, set the range it is testing into
4020    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4021    actually being tested.  *PLOW and *PHIGH will be made of the same
4022    type as the returned expression.  If EXP is not a comparison, we
4023    will most likely not be returning a useful value and range.  Set
4024    *STRICT_OVERFLOW_P to true if the return value is only valid
4025    because signed overflow is undefined; otherwise, do not change
4026    *STRICT_OVERFLOW_P.  */
4027
4028 static tree
4029 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4030             bool *strict_overflow_p)
4031 {
4032   enum tree_code code;
4033   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4034   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4035   int in_p, n_in_p;
4036   tree low, high, n_low, n_high;
4037
4038   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4039      and see if we can refine the range.  Some of the cases below may not
4040      happen, but it doesn't seem worth worrying about this.  We "continue"
4041      the outer loop when we've changed something; otherwise we "break"
4042      the switch, which will "break" the while.  */
4043
4044   in_p = 0;
4045   low = high = build_int_cst (TREE_TYPE (exp), 0);
4046
4047   while (1)
4048     {
4049       code = TREE_CODE (exp);
4050       exp_type = TREE_TYPE (exp);
4051
4052       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4053         {
4054           if (TREE_OPERAND_LENGTH (exp) > 0)
4055             arg0 = TREE_OPERAND (exp, 0);
4056           if (TREE_CODE_CLASS (code) == tcc_comparison
4057               || TREE_CODE_CLASS (code) == tcc_unary
4058               || TREE_CODE_CLASS (code) == tcc_binary)
4059             arg0_type = TREE_TYPE (arg0);
4060           if (TREE_CODE_CLASS (code) == tcc_binary
4061               || TREE_CODE_CLASS (code) == tcc_comparison
4062               || (TREE_CODE_CLASS (code) == tcc_expression
4063                   && TREE_OPERAND_LENGTH (exp) > 1))
4064             arg1 = TREE_OPERAND (exp, 1);
4065         }
4066
4067       switch (code)
4068         {
4069         case TRUTH_NOT_EXPR:
4070           in_p = ! in_p, exp = arg0;
4071           continue;
4072
4073         case EQ_EXPR: case NE_EXPR:
4074         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4075           /* We can only do something if the range is testing for zero
4076              and if the second operand is an integer constant.  Note that
4077              saying something is "in" the range we make is done by
4078              complementing IN_P since it will set in the initial case of
4079              being not equal to zero; "out" is leaving it alone.  */
4080           if (low == 0 || high == 0
4081               || ! integer_zerop (low) || ! integer_zerop (high)
4082               || TREE_CODE (arg1) != INTEGER_CST)
4083             break;
4084
4085           switch (code)
4086             {
4087             case NE_EXPR:  /* - [c, c]  */
4088               low = high = arg1;
4089               break;
4090             case EQ_EXPR:  /* + [c, c]  */
4091               in_p = ! in_p, low = high = arg1;
4092               break;
4093             case GT_EXPR:  /* - [-, c] */
4094               low = 0, high = arg1;
4095               break;
4096             case GE_EXPR:  /* + [c, -] */
4097               in_p = ! in_p, low = arg1, high = 0;
4098               break;
4099             case LT_EXPR:  /* - [c, -] */
4100               low = arg1, high = 0;
4101               break;
4102             case LE_EXPR:  /* + [-, c] */
4103               in_p = ! in_p, low = 0, high = arg1;
4104               break;
4105             default:
4106               gcc_unreachable ();
4107             }
4108
4109           /* If this is an unsigned comparison, we also know that EXP is
4110              greater than or equal to zero.  We base the range tests we make
4111              on that fact, so we record it here so we can parse existing
4112              range tests.  We test arg0_type since often the return type
4113              of, e.g. EQ_EXPR, is boolean.  */
4114           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4115             {
4116               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4117                                   in_p, low, high, 1,
4118                                   build_int_cst (arg0_type, 0),
4119                                   NULL_TREE))
4120                 break;
4121
4122               in_p = n_in_p, low = n_low, high = n_high;
4123
4124               /* If the high bound is missing, but we have a nonzero low
4125                  bound, reverse the range so it goes from zero to the low bound
4126                  minus 1.  */
4127               if (high == 0 && low && ! integer_zerop (low))
4128                 {
4129                   in_p = ! in_p;
4130                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4131                                       integer_one_node, 0);
4132                   low = build_int_cst (arg0_type, 0);
4133                 }
4134             }
4135
4136           exp = arg0;
4137           continue;
4138
4139         case NEGATE_EXPR:
4140           /* (-x) IN [a,b] -> x in [-b, -a]  */
4141           n_low = range_binop (MINUS_EXPR, exp_type,
4142                                build_int_cst (exp_type, 0),
4143                                0, high, 1);
4144           n_high = range_binop (MINUS_EXPR, exp_type,
4145                                 build_int_cst (exp_type, 0),
4146                                 0, low, 0);
4147           low = n_low, high = n_high;
4148           exp = arg0;
4149           continue;
4150
4151         case BIT_NOT_EXPR:
4152           /* ~ X -> -X - 1  */
4153           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4154                         build_int_cst (exp_type, 1));
4155           continue;
4156
4157         case PLUS_EXPR:  case MINUS_EXPR:
4158           if (TREE_CODE (arg1) != INTEGER_CST)
4159             break;
4160
4161           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4162              move a constant to the other side.  */
4163           if (!TYPE_UNSIGNED (arg0_type)
4164               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4165             break;
4166
4167           /* If EXP is signed, any overflow in the computation is undefined,
4168              so we don't worry about it so long as our computations on
4169              the bounds don't overflow.  For unsigned, overflow is defined
4170              and this is exactly the right thing.  */
4171           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4172                                arg0_type, low, 0, arg1, 0);
4173           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4174                                 arg0_type, high, 1, arg1, 0);
4175           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4176               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4177             break;
4178
4179           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4180             *strict_overflow_p = true;
4181
4182           /* Check for an unsigned range which has wrapped around the maximum
4183              value thus making n_high < n_low, and normalize it.  */
4184           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4185             {
4186               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4187                                  integer_one_node, 0);
4188               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4189                                   integer_one_node, 0);
4190
4191               /* If the range is of the form +/- [ x+1, x ], we won't
4192                  be able to normalize it.  But then, it represents the
4193                  whole range or the empty set, so make it
4194                  +/- [ -, - ].  */
4195               if (tree_int_cst_equal (n_low, low)
4196                   && tree_int_cst_equal (n_high, high))
4197                 low = high = 0;
4198               else
4199                 in_p = ! in_p;
4200             }
4201           else
4202             low = n_low, high = n_high;
4203
4204           exp = arg0;
4205           continue;
4206
4207         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
4208           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4209             break;
4210
4211           if (! INTEGRAL_TYPE_P (arg0_type)
4212               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4213               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4214             break;
4215
4216           n_low = low, n_high = high;
4217
4218           if (n_low != 0)
4219             n_low = fold_convert (arg0_type, n_low);
4220
4221           if (n_high != 0)
4222             n_high = fold_convert (arg0_type, n_high);
4223
4224
4225           /* If we're converting arg0 from an unsigned type, to exp,
4226              a signed type,  we will be doing the comparison as unsigned.
4227              The tests above have already verified that LOW and HIGH
4228              are both positive.
4229
4230              So we have to ensure that we will handle large unsigned
4231              values the same way that the current signed bounds treat
4232              negative values.  */
4233
4234           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4235             {
4236               tree high_positive;
4237               tree equiv_type = lang_hooks.types.type_for_mode
4238                 (TYPE_MODE (arg0_type), 1);
4239
4240               /* A range without an upper bound is, naturally, unbounded.
4241                  Since convert would have cropped a very large value, use
4242                  the max value for the destination type.  */
4243               high_positive
4244                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4245                 : TYPE_MAX_VALUE (arg0_type);
4246
4247               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4248                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4249                                              fold_convert (arg0_type,
4250                                                            high_positive),
4251                                              build_int_cst (arg0_type, 1));
4252
4253               /* If the low bound is specified, "and" the range with the
4254                  range for which the original unsigned value will be
4255                  positive.  */
4256               if (low != 0)
4257                 {
4258                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4259                                       1, n_low, n_high, 1,
4260                                       fold_convert (arg0_type,
4261                                                     integer_zero_node),
4262                                       high_positive))
4263                     break;
4264
4265                   in_p = (n_in_p == in_p);
4266                 }
4267               else
4268                 {
4269                   /* Otherwise, "or" the range with the range of the input
4270                      that will be interpreted as negative.  */
4271                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4272                                       0, n_low, n_high, 1,
4273                                       fold_convert (arg0_type,
4274                                                     integer_zero_node),
4275                                       high_positive))
4276                     break;
4277
4278                   in_p = (in_p != n_in_p);
4279                 }
4280             }
4281
4282           exp = arg0;
4283           low = n_low, high = n_high;
4284           continue;
4285
4286         default:
4287           break;
4288         }
4289
4290       break;
4291     }
4292
4293   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4294   if (TREE_CODE (exp) == INTEGER_CST)
4295     {
4296       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4297                                                  exp, 0, low, 0))
4298                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4299                                                     exp, 1, high, 1)));
4300       low = high = 0;
4301       exp = 0;
4302     }
4303
4304   *pin_p = in_p, *plow = low, *phigh = high;
4305   return exp;
4306 }
4307 \f
4308 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4309    type, TYPE, return an expression to test if EXP is in (or out of, depending
4310    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4311
4312 static tree
4313 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4314 {
4315   tree etype = TREE_TYPE (exp);
4316   tree value;
4317
4318 #ifdef HAVE_canonicalize_funcptr_for_compare
4319   /* Disable this optimization for function pointer expressions
4320      on targets that require function pointer canonicalization.  */
4321   if (HAVE_canonicalize_funcptr_for_compare
4322       && TREE_CODE (etype) == POINTER_TYPE
4323       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4324     return NULL_TREE;
4325 #endif
4326
4327   if (! in_p)
4328     {
4329       value = build_range_check (type, exp, 1, low, high);
4330       if (value != 0)
4331         return invert_truthvalue (value);
4332
4333       return 0;
4334     }
4335
4336   if (low == 0 && high == 0)
4337     return build_int_cst (type, 1);
4338
4339   if (low == 0)
4340     return fold_build2 (LE_EXPR, type, exp,
4341                         fold_convert (etype, high));
4342
4343   if (high == 0)
4344     return fold_build2 (GE_EXPR, type, exp,
4345                         fold_convert (etype, low));
4346
4347   if (operand_equal_p (low, high, 0))
4348     return fold_build2 (EQ_EXPR, type, exp,
4349                         fold_convert (etype, low));
4350
4351   if (integer_zerop (low))
4352     {
4353       if (! TYPE_UNSIGNED (etype))
4354         {
4355           etype = unsigned_type_for (etype);
4356           high = fold_convert (etype, high);
4357           exp = fold_convert (etype, exp);
4358         }
4359       return build_range_check (type, exp, 1, 0, high);
4360     }
4361
4362   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4363   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4364     {
4365       unsigned HOST_WIDE_INT lo;
4366       HOST_WIDE_INT hi;
4367       int prec;
4368
4369       prec = TYPE_PRECISION (etype);
4370       if (prec <= HOST_BITS_PER_WIDE_INT)
4371         {
4372           hi = 0;
4373           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4374         }
4375       else
4376         {
4377           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4378           lo = (unsigned HOST_WIDE_INT) -1;
4379         }
4380
4381       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4382         {
4383           if (TYPE_UNSIGNED (etype))
4384             {
4385               etype = signed_type_for (etype);
4386               exp = fold_convert (etype, exp);
4387             }
4388           return fold_build2 (GT_EXPR, type, exp,
4389                               build_int_cst (etype, 0));
4390         }
4391     }
4392
4393   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4394      This requires wrap-around arithmetics for the type of the expression.  */
4395   switch (TREE_CODE (etype))
4396     {
4397     case INTEGER_TYPE:
4398       /* There is no requirement that LOW be within the range of ETYPE
4399          if the latter is a subtype.  It must, however, be within the base
4400          type of ETYPE.  So be sure we do the subtraction in that type.  */
4401       if (TREE_TYPE (etype))
4402         etype = TREE_TYPE (etype);
4403       break;
4404
4405     case ENUMERAL_TYPE:
4406     case BOOLEAN_TYPE:
4407       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4408                                               TYPE_UNSIGNED (etype));
4409       break;
4410
4411     default:
4412       break;
4413     }
4414
4415   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4416   if (TREE_CODE (etype) == INTEGER_TYPE
4417       && !TYPE_OVERFLOW_WRAPS (etype))
4418     {
4419       tree utype, minv, maxv;
4420
4421       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4422          for the type in question, as we rely on this here.  */
4423       utype = unsigned_type_for (etype);
4424       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4425       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4426                           integer_one_node, 1);
4427       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4428
4429       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4430                                       minv, 1, maxv, 1)))
4431         etype = utype;
4432       else
4433         return 0;
4434     }
4435
4436   high = fold_convert (etype, high);
4437   low = fold_convert (etype, low);
4438   exp = fold_convert (etype, exp);
4439
4440   value = const_binop (MINUS_EXPR, high, low, 0);
4441
4442   if (value != 0 && !TREE_OVERFLOW (value))
4443     return build_range_check (type,
4444                               fold_build2 (MINUS_EXPR, etype, exp, low),
4445                               1, build_int_cst (etype, 0), value);
4446
4447   return 0;
4448 }
4449 \f
4450 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4451
4452 static tree
4453 range_predecessor (tree val)
4454 {
4455   tree type = TREE_TYPE (val);
4456
4457   if (INTEGRAL_TYPE_P (type)
4458       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4459     return 0;
4460   else
4461     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4462 }
4463
4464 /* Return the successor of VAL in its type, handling the infinite case.  */
4465
4466 static tree
4467 range_successor (tree val)
4468 {
4469   tree type = TREE_TYPE (val);
4470
4471   if (INTEGRAL_TYPE_P (type)
4472       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4473     return 0;
4474   else
4475     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4476 }
4477
4478 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4479    can, 0 if we can't.  Set the output range into the specified parameters.  */
4480
4481 static int
4482 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4483               tree high0, int in1_p, tree low1, tree high1)
4484 {
4485   int no_overlap;
4486   int subset;
4487   int temp;
4488   tree tem;
4489   int in_p;
4490   tree low, high;
4491   int lowequal = ((low0 == 0 && low1 == 0)
4492                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4493                                                 low0, 0, low1, 0)));
4494   int highequal = ((high0 == 0 && high1 == 0)
4495                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4496                                                  high0, 1, high1, 1)));
4497
4498   /* Make range 0 be the range that starts first, or ends last if they
4499      start at the same value.  Swap them if it isn't.  */
4500   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4501                                  low0, 0, low1, 0))
4502       || (lowequal
4503           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4504                                         high1, 1, high0, 1))))
4505     {
4506       temp = in0_p, in0_p = in1_p, in1_p = temp;
4507       tem = low0, low0 = low1, low1 = tem;
4508       tem = high0, high0 = high1, high1 = tem;
4509     }
4510
4511   /* Now flag two cases, whether the ranges are disjoint or whether the
4512      second range is totally subsumed in the first.  Note that the tests
4513      below are simplified by the ones above.  */
4514   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4515                                           high0, 1, low1, 0));
4516   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4517                                       high1, 1, high0, 1));
4518
4519   /* We now have four cases, depending on whether we are including or
4520      excluding the two ranges.  */
4521   if (in0_p && in1_p)
4522     {
4523       /* If they don't overlap, the result is false.  If the second range
4524          is a subset it is the result.  Otherwise, the range is from the start
4525          of the second to the end of the first.  */
4526       if (no_overlap)
4527         in_p = 0, low = high = 0;
4528       else if (subset)
4529         in_p = 1, low = low1, high = high1;
4530       else
4531         in_p = 1, low = low1, high = high0;
4532     }
4533
4534   else if (in0_p && ! in1_p)
4535     {
4536       /* If they don't overlap, the result is the first range.  If they are
4537          equal, the result is false.  If the second range is a subset of the
4538          first, and the ranges begin at the same place, we go from just after
4539          the end of the second range to the end of the first.  If the second
4540          range is not a subset of the first, or if it is a subset and both
4541          ranges end at the same place, the range starts at the start of the
4542          first range and ends just before the second range.
4543          Otherwise, we can't describe this as a single range.  */
4544       if (no_overlap)
4545         in_p = 1, low = low0, high = high0;
4546       else if (lowequal && highequal)
4547         in_p = 0, low = high = 0;
4548       else if (subset && lowequal)
4549         {
4550           low = range_successor (high1);
4551           high = high0;
4552           in_p = 1;
4553           if (low == 0)
4554             {
4555               /* We are in the weird situation where high0 > high1 but
4556                  high1 has no successor.  Punt.  */
4557               return 0;
4558             }
4559         }
4560       else if (! subset || highequal)
4561         {
4562           low = low0;
4563           high = range_predecessor (low1);
4564           in_p = 1;
4565           if (high == 0)
4566             {
4567               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4568               return 0;
4569             }
4570         }
4571       else
4572         return 0;
4573     }
4574
4575   else if (! in0_p && in1_p)
4576     {
4577       /* If they don't overlap, the result is the second range.  If the second
4578          is a subset of the first, the result is false.  Otherwise,
4579          the range starts just after the first range and ends at the
4580          end of the second.  */
4581       if (no_overlap)
4582         in_p = 1, low = low1, high = high1;
4583       else if (subset || highequal)
4584         in_p = 0, low = high = 0;
4585       else
4586         {
4587           low = range_successor (high0);
4588           high = high1;
4589           in_p = 1;
4590           if (low == 0)
4591             {
4592               /* high1 > high0 but high0 has no successor.  Punt.  */
4593               return 0;
4594             }
4595         }
4596     }
4597
4598   else
4599     {
4600       /* The case where we are excluding both ranges.  Here the complex case
4601          is if they don't overlap.  In that case, the only time we have a
4602          range is if they are adjacent.  If the second is a subset of the
4603          first, the result is the first.  Otherwise, the range to exclude
4604          starts at the beginning of the first range and ends at the end of the
4605          second.  */
4606       if (no_overlap)
4607         {
4608           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4609                                          range_successor (high0),
4610                                          1, low1, 0)))
4611             in_p = 0, low = low0, high = high1;
4612           else
4613             {
4614               /* Canonicalize - [min, x] into - [-, x].  */
4615               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4616                 switch (TREE_CODE (TREE_TYPE (low0)))
4617                   {
4618                   case ENUMERAL_TYPE:
4619                     if (TYPE_PRECISION (TREE_TYPE (low0))
4620                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4621                       break;
4622                     /* FALLTHROUGH */
4623                   case INTEGER_TYPE:
4624                     if (tree_int_cst_equal (low0,
4625                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4626                       low0 = 0;
4627                     break;
4628                   case POINTER_TYPE:
4629                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4630                         && integer_zerop (low0))
4631                       low0 = 0;
4632                     break;
4633                   default:
4634                     break;
4635                   }
4636
4637               /* Canonicalize - [x, max] into - [x, -].  */
4638               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4639                 switch (TREE_CODE (TREE_TYPE (high1)))
4640                   {
4641                   case ENUMERAL_TYPE:
4642                     if (TYPE_PRECISION (TREE_TYPE (high1))
4643                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4644                       break;
4645                     /* FALLTHROUGH */
4646                   case INTEGER_TYPE:
4647                     if (tree_int_cst_equal (high1,
4648                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4649                       high1 = 0;
4650                     break;
4651                   case POINTER_TYPE:
4652                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4653                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4654                                                        high1, 1,
4655                                                        integer_one_node, 1)))
4656                       high1 = 0;
4657                     break;
4658                   default:
4659                     break;
4660                   }
4661
4662               /* The ranges might be also adjacent between the maximum and
4663                  minimum values of the given type.  For
4664                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4665                  return + [x + 1, y - 1].  */
4666               if (low0 == 0 && high1 == 0)
4667                 {
4668                   low = range_successor (high0);
4669                   high = range_predecessor (low1);
4670                   if (low == 0 || high == 0)
4671                     return 0;
4672
4673                   in_p = 1;
4674                 }
4675               else
4676                 return 0;
4677             }
4678         }
4679       else if (subset)
4680         in_p = 0, low = low0, high = high0;
4681       else
4682         in_p = 0, low = low0, high = high1;
4683     }
4684
4685   *pin_p = in_p, *plow = low, *phigh = high;
4686   return 1;
4687 }
4688 \f
4689
4690 /* Subroutine of fold, looking inside expressions of the form
4691    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4692    of the COND_EXPR.  This function is being used also to optimize
4693    A op B ? C : A, by reversing the comparison first.
4694
4695    Return a folded expression whose code is not a COND_EXPR
4696    anymore, or NULL_TREE if no folding opportunity is found.  */
4697
4698 static tree
4699 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4700 {
4701   enum tree_code comp_code = TREE_CODE (arg0);
4702   tree arg00 = TREE_OPERAND (arg0, 0);
4703   tree arg01 = TREE_OPERAND (arg0, 1);
4704   tree arg1_type = TREE_TYPE (arg1);
4705   tree tem;
4706
4707   STRIP_NOPS (arg1);
4708   STRIP_NOPS (arg2);
4709
4710   /* If we have A op 0 ? A : -A, consider applying the following
4711      transformations:
4712
4713      A == 0? A : -A    same as -A
4714      A != 0? A : -A    same as A
4715      A >= 0? A : -A    same as abs (A)
4716      A > 0?  A : -A    same as abs (A)
4717      A <= 0? A : -A    same as -abs (A)
4718      A < 0?  A : -A    same as -abs (A)
4719
4720      None of these transformations work for modes with signed
4721      zeros.  If A is +/-0, the first two transformations will
4722      change the sign of the result (from +0 to -0, or vice
4723      versa).  The last four will fix the sign of the result,
4724      even though the original expressions could be positive or
4725      negative, depending on the sign of A.
4726
4727      Note that all these transformations are correct if A is
4728      NaN, since the two alternatives (A and -A) are also NaNs.  */
4729   if ((FLOAT_TYPE_P (TREE_TYPE (arg01))
4730        ? real_zerop (arg01)
4731        : integer_zerop (arg01))
4732       && ((TREE_CODE (arg2) == NEGATE_EXPR
4733            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4734              /* In the case that A is of the form X-Y, '-A' (arg2) may
4735                 have already been folded to Y-X, check for that. */
4736           || (TREE_CODE (arg1) == MINUS_EXPR
4737               && TREE_CODE (arg2) == MINUS_EXPR
4738               && operand_equal_p (TREE_OPERAND (arg1, 0),
4739                                   TREE_OPERAND (arg2, 1), 0)
4740               && operand_equal_p (TREE_OPERAND (arg1, 1),
4741                                   TREE_OPERAND (arg2, 0), 0))))
4742     switch (comp_code)
4743       {
4744       case EQ_EXPR:
4745       case UNEQ_EXPR:
4746         tem = fold_convert (arg1_type, arg1);
4747         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4748       case NE_EXPR:
4749       case LTGT_EXPR:
4750         return pedantic_non_lvalue (fold_convert (type, arg1));
4751       case UNGE_EXPR:
4752       case UNGT_EXPR:
4753         if (flag_trapping_math)
4754           break;
4755         /* Fall through.  */
4756       case GE_EXPR:
4757       case GT_EXPR:
4758         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4759           arg1 = fold_convert (signed_type_for
4760                                (TREE_TYPE (arg1)), arg1);
4761         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4762         return pedantic_non_lvalue (fold_convert (type, tem));
4763       case UNLE_EXPR:
4764       case UNLT_EXPR:
4765         if (flag_trapping_math)
4766           break;
4767       case LE_EXPR:
4768       case LT_EXPR:
4769         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4770           arg1 = fold_convert (signed_type_for
4771                                (TREE_TYPE (arg1)), arg1);
4772         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4773         return negate_expr (fold_convert (type, tem));
4774       default:
4775         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4776         break;
4777       }
4778
4779   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4780      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4781      both transformations are correct when A is NaN: A != 0
4782      is then true, and A == 0 is false.  */
4783
4784   if (integer_zerop (arg01) && integer_zerop (arg2))
4785     {
4786       if (comp_code == NE_EXPR)
4787         return pedantic_non_lvalue (fold_convert (type, arg1));
4788       else if (comp_code == EQ_EXPR)
4789         return build_int_cst (type, 0);
4790     }
4791
4792   /* Try some transformations of A op B ? A : B.
4793
4794      A == B? A : B    same as B
4795      A != B? A : B    same as A
4796      A >= B? A : B    same as max (A, B)
4797      A > B?  A : B    same as max (B, A)
4798      A <= B? A : B    same as min (A, B)
4799      A < B?  A : B    same as min (B, A)
4800
4801      As above, these transformations don't work in the presence
4802      of signed zeros.  For example, if A and B are zeros of
4803      opposite sign, the first two transformations will change
4804      the sign of the result.  In the last four, the original
4805      expressions give different results for (A=+0, B=-0) and
4806      (A=-0, B=+0), but the transformed expressions do not.
4807
4808      The first two transformations are correct if either A or B
4809      is a NaN.  In the first transformation, the condition will
4810      be false, and B will indeed be chosen.  In the case of the
4811      second transformation, the condition A != B will be true,
4812      and A will be chosen.
4813
4814      The conversions to max() and min() are not correct if B is
4815      a number and A is not.  The conditions in the original
4816      expressions will be false, so all four give B.  The min()
4817      and max() versions would give a NaN instead.  */
4818   if (operand_equal_for_comparison_p (arg01, arg2, arg00)
4819       /* Avoid these transformations if the COND_EXPR may be used
4820          as an lvalue in the C++ front-end.  PR c++/19199.  */
4821       && (in_gimple_form
4822           || (strcmp (lang_hooks.name, "GNU C++") != 0
4823               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4824           || ! maybe_lvalue_p (arg1)
4825           || ! maybe_lvalue_p (arg2)))
4826     {
4827       tree comp_op0 = arg00;
4828       tree comp_op1 = arg01;
4829       tree comp_type = TREE_TYPE (comp_op0);
4830
4831       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4832       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4833         {
4834           comp_type = type;
4835           comp_op0 = arg1;
4836           comp_op1 = arg2;
4837         }
4838
4839       switch (comp_code)
4840         {
4841         case EQ_EXPR:
4842           return pedantic_non_lvalue (fold_convert (type, arg2));
4843         case NE_EXPR:
4844           return pedantic_non_lvalue (fold_convert (type, arg1));
4845         case LE_EXPR:
4846         case LT_EXPR:
4847         case UNLE_EXPR:
4848         case UNLT_EXPR:
4849           /* In C++ a ?: expression can be an lvalue, so put the
4850              operand which will be used if they are equal first
4851              so that we can convert this back to the
4852              corresponding COND_EXPR.  */
4853           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4854             {
4855               comp_op0 = fold_convert (comp_type, comp_op0);
4856               comp_op1 = fold_convert (comp_type, comp_op1);
4857               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4858                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4859                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4860               return pedantic_non_lvalue (fold_convert (type, tem));
4861             }
4862           break;
4863         case GE_EXPR:
4864         case GT_EXPR:
4865         case UNGE_EXPR:
4866         case UNGT_EXPR:
4867           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4868             {
4869               comp_op0 = fold_convert (comp_type, comp_op0);
4870               comp_op1 = fold_convert (comp_type, comp_op1);
4871               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4872                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
4873                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
4874               return pedantic_non_lvalue (fold_convert (type, tem));
4875             }
4876           break;
4877         case UNEQ_EXPR:
4878           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4879             return pedantic_non_lvalue (fold_convert (type, arg2));
4880           break;
4881         case LTGT_EXPR:
4882           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4883             return pedantic_non_lvalue (fold_convert (type, arg1));
4884           break;
4885         default:
4886           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4887           break;
4888         }
4889     }
4890
4891   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4892      we might still be able to simplify this.  For example,
4893      if C1 is one less or one more than C2, this might have started
4894      out as a MIN or MAX and been transformed by this function.
4895      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
4896
4897   if (INTEGRAL_TYPE_P (type)
4898       && TREE_CODE (arg01) == INTEGER_CST
4899       && TREE_CODE (arg2) == INTEGER_CST)
4900     switch (comp_code)
4901       {
4902       case EQ_EXPR:
4903         /* We can replace A with C1 in this case.  */
4904         arg1 = fold_convert (type, arg01);
4905         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
4906
4907       case LT_EXPR:
4908         /* If C1 is C2 + 1, this is min(A, C2).  */
4909         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4910                                OEP_ONLY_CONST)
4911             && operand_equal_p (arg01,
4912                                 const_binop (PLUS_EXPR, arg2,
4913                                              build_int_cst (type, 1), 0),
4914                                 OEP_ONLY_CONST))
4915           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4916                                                    type, arg1, arg2));
4917         break;
4918
4919       case LE_EXPR:
4920         /* If C1 is C2 - 1, this is min(A, C2).  */
4921         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4922                                OEP_ONLY_CONST)
4923             && operand_equal_p (arg01,
4924                                 const_binop (MINUS_EXPR, arg2,
4925                                              build_int_cst (type, 1), 0),
4926                                 OEP_ONLY_CONST))
4927           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4928                                                    type, arg1, arg2));
4929         break;
4930
4931       case GT_EXPR:
4932         /* If C1 is C2 - 1, this is max(A, C2).  */
4933         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4934                                OEP_ONLY_CONST)
4935             && operand_equal_p (arg01,
4936                                 const_binop (MINUS_EXPR, arg2,
4937                                              build_int_cst (type, 1), 0),
4938                                 OEP_ONLY_CONST))
4939           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4940                                                    type, arg1, arg2));
4941         break;
4942
4943       case GE_EXPR:
4944         /* If C1 is C2 + 1, this is max(A, C2).  */
4945         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4946                                OEP_ONLY_CONST)
4947             && operand_equal_p (arg01,
4948                                 const_binop (PLUS_EXPR, arg2,
4949                                              build_int_cst (type, 1), 0),
4950                                 OEP_ONLY_CONST))
4951           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4952                                                    type, arg1, arg2));
4953         break;
4954       case NE_EXPR:
4955         break;
4956       default:
4957         gcc_unreachable ();
4958       }
4959
4960   return NULL_TREE;
4961 }
4962
4963
4964 \f
4965 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4966 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
4967 #endif
4968
4969 /* EXP is some logical combination of boolean tests.  See if we can
4970    merge it into some range test.  Return the new tree if so.  */
4971
4972 static tree
4973 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
4974 {
4975   int or_op = (code == TRUTH_ORIF_EXPR
4976                || code == TRUTH_OR_EXPR);
4977   int in0_p, in1_p, in_p;
4978   tree low0, low1, low, high0, high1, high;
4979   bool strict_overflow_p = false;
4980   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
4981   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
4982   tree tem;
4983   const char * const warnmsg = G_("assuming signed overflow does not occur "
4984                                   "when simplifying range test");
4985
4986   /* If this is an OR operation, invert both sides; we will invert
4987      again at the end.  */
4988   if (or_op)
4989     in0_p = ! in0_p, in1_p = ! in1_p;
4990
4991   /* If both expressions are the same, if we can merge the ranges, and we
4992      can build the range test, return it or it inverted.  If one of the
4993      ranges is always true or always false, consider it to be the same
4994      expression as the other.  */
4995   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
4996       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4997                        in1_p, low1, high1)
4998       && 0 != (tem = (build_range_check (type,
4999                                          lhs != 0 ? lhs
5000                                          : rhs != 0 ? rhs : integer_zero_node,
5001                                          in_p, low, high))))
5002     {
5003       if (strict_overflow_p)
5004         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5005       return or_op ? invert_truthvalue (tem) : tem;
5006     }
5007
5008   /* On machines where the branch cost is expensive, if this is a
5009      short-circuited branch and the underlying object on both sides
5010      is the same, make a non-short-circuit operation.  */
5011   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5012            && lhs != 0 && rhs != 0
5013            && (code == TRUTH_ANDIF_EXPR
5014                || code == TRUTH_ORIF_EXPR)
5015            && operand_equal_p (lhs, rhs, 0))
5016     {
5017       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5018          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5019          which cases we can't do this.  */
5020       if (simple_operand_p (lhs))
5021         return build2 (code == TRUTH_ANDIF_EXPR
5022                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5023                        type, op0, op1);
5024
5025       else if (lang_hooks.decls.global_bindings_p () == 0
5026                && ! CONTAINS_PLACEHOLDER_P (lhs))
5027         {
5028           tree common = save_expr (lhs);
5029
5030           if (0 != (lhs = build_range_check (type, common,
5031                                              or_op ? ! in0_p : in0_p,
5032                                              low0, high0))
5033               && (0 != (rhs = build_range_check (type, common,
5034                                                  or_op ? ! in1_p : in1_p,
5035                                                  low1, high1))))
5036             {
5037               if (strict_overflow_p)
5038                 fold_overflow_warning (warnmsg,
5039                                        WARN_STRICT_OVERFLOW_COMPARISON);
5040               return build2 (code == TRUTH_ANDIF_EXPR
5041                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5042                              type, lhs, rhs);
5043             }
5044         }
5045     }
5046
5047   return 0;
5048 }
5049 \f
5050 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5051    bit value.  Arrange things so the extra bits will be set to zero if and
5052    only if C is signed-extended to its full width.  If MASK is nonzero,
5053    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5054
5055 static tree
5056 unextend (tree c, int p, int unsignedp, tree mask)
5057 {
5058   tree type = TREE_TYPE (c);
5059   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5060   tree temp;
5061
5062   if (p == modesize || unsignedp)
5063     return c;
5064
5065   /* We work by getting just the sign bit into the low-order bit, then
5066      into the high-order bit, then sign-extend.  We then XOR that value
5067      with C.  */
5068   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5069   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5070
5071   /* We must use a signed type in order to get an arithmetic right shift.
5072      However, we must also avoid introducing accidental overflows, so that
5073      a subsequent call to integer_zerop will work.  Hence we must
5074      do the type conversion here.  At this point, the constant is either
5075      zero or one, and the conversion to a signed type can never overflow.
5076      We could get an overflow if this conversion is done anywhere else.  */
5077   if (TYPE_UNSIGNED (type))
5078     temp = fold_convert (signed_type_for (type), temp);
5079
5080   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5081   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5082   if (mask != 0)
5083     temp = const_binop (BIT_AND_EXPR, temp,
5084                         fold_convert (TREE_TYPE (c), mask), 0);
5085   /* If necessary, convert the type back to match the type of C.  */
5086   if (TYPE_UNSIGNED (type))
5087     temp = fold_convert (type, temp);
5088
5089   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5090 }
5091 \f
5092 /* Find ways of folding logical expressions of LHS and RHS:
5093    Try to merge two comparisons to the same innermost item.
5094    Look for range tests like "ch >= '0' && ch <= '9'".
5095    Look for combinations of simple terms on machines with expensive branches
5096    and evaluate the RHS unconditionally.
5097
5098    For example, if we have p->a == 2 && p->b == 4 and we can make an
5099    object large enough to span both A and B, we can do this with a comparison
5100    against the object ANDed with the a mask.
5101
5102    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5103    operations to do this with one comparison.
5104
5105    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5106    function and the one above.
5107
5108    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5109    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5110
5111    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5112    two operands.
5113
5114    We return the simplified tree or 0 if no optimization is possible.  */
5115
5116 static tree
5117 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5118 {
5119   /* If this is the "or" of two comparisons, we can do something if
5120      the comparisons are NE_EXPR.  If this is the "and", we can do something
5121      if the comparisons are EQ_EXPR.  I.e.,
5122         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5123
5124      WANTED_CODE is this operation code.  For single bit fields, we can
5125      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5126      comparison for one-bit fields.  */
5127
5128   enum tree_code wanted_code;
5129   enum tree_code lcode, rcode;
5130   tree ll_arg, lr_arg, rl_arg, rr_arg;
5131   tree ll_inner, lr_inner, rl_inner, rr_inner;
5132   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5133   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5134   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5135   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5136   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5137   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5138   enum machine_mode lnmode, rnmode;
5139   tree ll_mask, lr_mask, rl_mask, rr_mask;
5140   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5141   tree l_const, r_const;
5142   tree lntype, rntype, result;
5143   int first_bit, end_bit;
5144   int volatilep;
5145   tree orig_lhs = lhs, orig_rhs = rhs;
5146   enum tree_code orig_code = code;
5147
5148   /* Start by getting the comparison codes.  Fail if anything is volatile.
5149      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5150      it were surrounded with a NE_EXPR.  */
5151
5152   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5153     return 0;
5154
5155   lcode = TREE_CODE (lhs);
5156   rcode = TREE_CODE (rhs);
5157
5158   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5159     {
5160       lhs = build2 (NE_EXPR, truth_type, lhs,
5161                     build_int_cst (TREE_TYPE (lhs), 0));
5162       lcode = NE_EXPR;
5163     }
5164
5165   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5166     {
5167       rhs = build2 (NE_EXPR, truth_type, rhs,
5168                     build_int_cst (TREE_TYPE (rhs), 0));
5169       rcode = NE_EXPR;
5170     }
5171
5172   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5173       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5174     return 0;
5175
5176   ll_arg = TREE_OPERAND (lhs, 0);
5177   lr_arg = TREE_OPERAND (lhs, 1);
5178   rl_arg = TREE_OPERAND (rhs, 0);
5179   rr_arg = TREE_OPERAND (rhs, 1);
5180
5181   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5182   if (simple_operand_p (ll_arg)
5183       && simple_operand_p (lr_arg))
5184     {
5185       tree result;
5186       if (operand_equal_p (ll_arg, rl_arg, 0)
5187           && operand_equal_p (lr_arg, rr_arg, 0))
5188         {
5189           result = combine_comparisons (code, lcode, rcode,
5190                                         truth_type, ll_arg, lr_arg);
5191           if (result)
5192             return result;
5193         }
5194       else if (operand_equal_p (ll_arg, rr_arg, 0)
5195                && operand_equal_p (lr_arg, rl_arg, 0))
5196         {
5197           result = combine_comparisons (code, lcode,
5198                                         swap_tree_comparison (rcode),
5199                                         truth_type, ll_arg, lr_arg);
5200           if (result)
5201             return result;
5202         }
5203     }
5204
5205   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5206           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5207
5208   /* If the RHS can be evaluated unconditionally and its operands are
5209      simple, it wins to evaluate the RHS unconditionally on machines
5210      with expensive branches.  In this case, this isn't a comparison
5211      that can be merged.  Avoid doing this if the RHS is a floating-point
5212      comparison since those can trap.  */
5213
5214   if (BRANCH_COST >= 2
5215       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5216       && simple_operand_p (rl_arg)
5217       && simple_operand_p (rr_arg))
5218     {
5219       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5220       if (code == TRUTH_OR_EXPR
5221           && lcode == NE_EXPR && integer_zerop (lr_arg)
5222           && rcode == NE_EXPR && integer_zerop (rr_arg)
5223           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5224         return build2 (NE_EXPR, truth_type,
5225                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5226                                ll_arg, rl_arg),
5227                        build_int_cst (TREE_TYPE (ll_arg), 0));
5228
5229       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5230       if (code == TRUTH_AND_EXPR
5231           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5232           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5233           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5234         return build2 (EQ_EXPR, truth_type,
5235                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5236                                ll_arg, rl_arg),
5237                        build_int_cst (TREE_TYPE (ll_arg), 0));
5238
5239       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5240         {
5241           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5242             return build2 (code, truth_type, lhs, rhs);
5243           return NULL_TREE;
5244         }
5245     }
5246
5247   /* See if the comparisons can be merged.  Then get all the parameters for
5248      each side.  */
5249
5250   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5251       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5252     return 0;
5253
5254   volatilep = 0;
5255   ll_inner = decode_field_reference (ll_arg,
5256                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5257                                      &ll_unsignedp, &volatilep, &ll_mask,
5258                                      &ll_and_mask);
5259   lr_inner = decode_field_reference (lr_arg,
5260                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5261                                      &lr_unsignedp, &volatilep, &lr_mask,
5262                                      &lr_and_mask);
5263   rl_inner = decode_field_reference (rl_arg,
5264                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5265                                      &rl_unsignedp, &volatilep, &rl_mask,
5266                                      &rl_and_mask);
5267   rr_inner = decode_field_reference (rr_arg,
5268                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5269                                      &rr_unsignedp, &volatilep, &rr_mask,
5270                                      &rr_and_mask);
5271
5272   /* It must be true that the inner operation on the lhs of each
5273      comparison must be the same if we are to be able to do anything.
5274      Then see if we have constants.  If not, the same must be true for
5275      the rhs's.  */
5276   if (volatilep || ll_inner == 0 || rl_inner == 0
5277       || ! operand_equal_p (ll_inner, rl_inner, 0))
5278     return 0;
5279
5280   if (TREE_CODE (lr_arg) == INTEGER_CST
5281       && TREE_CODE (rr_arg) == INTEGER_CST)
5282     l_const = lr_arg, r_const = rr_arg;
5283   else if (lr_inner == 0 || rr_inner == 0
5284            || ! operand_equal_p (lr_inner, rr_inner, 0))
5285     return 0;
5286   else
5287     l_const = r_const = 0;
5288
5289   /* If either comparison code is not correct for our logical operation,
5290      fail.  However, we can convert a one-bit comparison against zero into
5291      the opposite comparison against that bit being set in the field.  */
5292
5293   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5294   if (lcode != wanted_code)
5295     {
5296       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5297         {
5298           /* Make the left operand unsigned, since we are only interested
5299              in the value of one bit.  Otherwise we are doing the wrong
5300              thing below.  */
5301           ll_unsignedp = 1;
5302           l_const = ll_mask;
5303         }
5304       else
5305         return 0;
5306     }
5307
5308   /* This is analogous to the code for l_const above.  */
5309   if (rcode != wanted_code)
5310     {
5311       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5312         {
5313           rl_unsignedp = 1;
5314           r_const = rl_mask;
5315         }
5316       else
5317         return 0;
5318     }
5319
5320   /* See if we can find a mode that contains both fields being compared on
5321      the left.  If we can't, fail.  Otherwise, update all constants and masks
5322      to be relative to a field of that size.  */
5323   first_bit = MIN (ll_bitpos, rl_bitpos);
5324   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5325   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5326                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5327                           volatilep);
5328   if (lnmode == VOIDmode)
5329     return 0;
5330
5331   lnbitsize = GET_MODE_BITSIZE (lnmode);
5332   lnbitpos = first_bit & ~ (lnbitsize - 1);
5333   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5334   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5335
5336   if (BYTES_BIG_ENDIAN)
5337     {
5338       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5339       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5340     }
5341
5342   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5343                          size_int (xll_bitpos), 0);
5344   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5345                          size_int (xrl_bitpos), 0);
5346
5347   if (l_const)
5348     {
5349       l_const = fold_convert (lntype, l_const);
5350       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5351       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5352       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5353                                         fold_build1 (BIT_NOT_EXPR,
5354                                                      lntype, ll_mask),
5355                                         0)))
5356         {
5357           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5358
5359           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5360         }
5361     }
5362   if (r_const)
5363     {
5364       r_const = fold_convert (lntype, r_const);
5365       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5366       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5367       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5368                                         fold_build1 (BIT_NOT_EXPR,
5369                                                      lntype, rl_mask),
5370                                         0)))
5371         {
5372           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5373
5374           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5375         }
5376     }
5377
5378   /* If the right sides are not constant, do the same for it.  Also,
5379      disallow this optimization if a size or signedness mismatch occurs
5380      between the left and right sides.  */
5381   if (l_const == 0)
5382     {
5383       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5384           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5385           /* Make sure the two fields on the right
5386              correspond to the left without being swapped.  */
5387           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5388         return 0;
5389
5390       first_bit = MIN (lr_bitpos, rr_bitpos);
5391       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5392       rnmode = get_best_mode (end_bit - first_bit, first_bit,
5393                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5394                               volatilep);
5395       if (rnmode == VOIDmode)
5396         return 0;
5397
5398       rnbitsize = GET_MODE_BITSIZE (rnmode);
5399       rnbitpos = first_bit & ~ (rnbitsize - 1);
5400       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5401       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5402
5403       if (BYTES_BIG_ENDIAN)
5404         {
5405           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5406           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5407         }
5408
5409       lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
5410                              size_int (xlr_bitpos), 0);
5411       rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
5412                              size_int (xrr_bitpos), 0);
5413
5414       /* Make a mask that corresponds to both fields being compared.
5415          Do this for both items being compared.  If the operands are the
5416          same size and the bits being compared are in the same position
5417          then we can do this by masking both and comparing the masked
5418          results.  */
5419       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5420       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
5421       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5422         {
5423           lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5424                                     ll_unsignedp || rl_unsignedp);
5425           if (! all_ones_mask_p (ll_mask, lnbitsize))
5426             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5427
5428           rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
5429                                     lr_unsignedp || rr_unsignedp);
5430           if (! all_ones_mask_p (lr_mask, rnbitsize))
5431             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5432
5433           return build2 (wanted_code, truth_type, lhs, rhs);
5434         }
5435
5436       /* There is still another way we can do something:  If both pairs of
5437          fields being compared are adjacent, we may be able to make a wider
5438          field containing them both.
5439
5440          Note that we still must mask the lhs/rhs expressions.  Furthermore,
5441          the mask must be shifted to account for the shift done by
5442          make_bit_field_ref.  */
5443       if ((ll_bitsize + ll_bitpos == rl_bitpos
5444            && lr_bitsize + lr_bitpos == rr_bitpos)
5445           || (ll_bitpos == rl_bitpos + rl_bitsize
5446               && lr_bitpos == rr_bitpos + rr_bitsize))
5447         {
5448           tree type;
5449
5450           lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
5451                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5452           rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
5453                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5454
5455           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5456                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
5457           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5458                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
5459
5460           /* Convert to the smaller type before masking out unwanted bits.  */
5461           type = lntype;
5462           if (lntype != rntype)
5463             {
5464               if (lnbitsize > rnbitsize)
5465                 {
5466                   lhs = fold_convert (rntype, lhs);
5467                   ll_mask = fold_convert (rntype, ll_mask);
5468                   type = rntype;
5469                 }
5470               else if (lnbitsize < rnbitsize)
5471                 {
5472                   rhs = fold_convert (lntype, rhs);
5473                   lr_mask = fold_convert (lntype, lr_mask);
5474                   type = lntype;
5475                 }
5476             }
5477
5478           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5479             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5480
5481           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5482             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5483
5484           return build2 (wanted_code, truth_type, lhs, rhs);
5485         }
5486
5487       return 0;
5488     }
5489
5490   /* Handle the case of comparisons with constants.  If there is something in
5491      common between the masks, those bits of the constants must be the same.
5492      If not, the condition is always false.  Test for this to avoid generating
5493      incorrect code below.  */
5494   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5495   if (! integer_zerop (result)
5496       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5497                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5498     {
5499       if (wanted_code == NE_EXPR)
5500         {
5501           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5502           return constant_boolean_node (true, truth_type);
5503         }
5504       else
5505         {
5506           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5507           return constant_boolean_node (false, truth_type);
5508         }
5509     }
5510
5511   /* Construct the expression we will return.  First get the component
5512      reference we will make.  Unless the mask is all ones the width of
5513      that field, perform the mask operation.  Then compare with the
5514      merged constant.  */
5515   result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5516                                ll_unsignedp || rl_unsignedp);
5517
5518   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5519   if (! all_ones_mask_p (ll_mask, lnbitsize))
5520     result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
5521
5522   return build2 (wanted_code, truth_type, result,
5523                  const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
5524 }
5525 \f
5526 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5527    constant.  */
5528
5529 static tree
5530 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5531 {
5532   tree arg0 = op0;
5533   enum tree_code op_code;
5534   tree comp_const = op1;
5535   tree minmax_const;
5536   int consts_equal, consts_lt;
5537   tree inner;
5538
5539   STRIP_SIGN_NOPS (arg0);
5540
5541   op_code = TREE_CODE (arg0);
5542   minmax_const = TREE_OPERAND (arg0, 1);
5543   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5544   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5545   inner = TREE_OPERAND (arg0, 0);
5546
5547   /* If something does not permit us to optimize, return the original tree.  */
5548   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5549       || TREE_CODE (comp_const) != INTEGER_CST
5550       || TREE_OVERFLOW (comp_const)
5551       || TREE_CODE (minmax_const) != INTEGER_CST
5552       || TREE_OVERFLOW (minmax_const))
5553     return NULL_TREE;
5554
5555   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5556      and GT_EXPR, doing the rest with recursive calls using logical
5557      simplifications.  */
5558   switch (code)
5559     {
5560     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5561       {
5562         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5563                                           type, op0, op1);
5564         if (tem)
5565           return invert_truthvalue (tem);
5566         return NULL_TREE;
5567       }
5568
5569     case GE_EXPR:
5570       return
5571         fold_build2 (TRUTH_ORIF_EXPR, type,
5572                      optimize_minmax_comparison
5573                      (EQ_EXPR, type, arg0, comp_const),
5574                      optimize_minmax_comparison
5575                      (GT_EXPR, type, arg0, comp_const));
5576
5577     case EQ_EXPR:
5578       if (op_code == MAX_EXPR && consts_equal)
5579         /* MAX (X, 0) == 0  ->  X <= 0  */
5580         return fold_build2 (LE_EXPR, type, inner, comp_const);
5581
5582       else if (op_code == MAX_EXPR && consts_lt)
5583         /* MAX (X, 0) == 5  ->  X == 5   */
5584         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5585
5586       else if (op_code == MAX_EXPR)
5587         /* MAX (X, 0) == -1  ->  false  */
5588         return omit_one_operand (type, integer_zero_node, inner);
5589
5590       else if (consts_equal)
5591         /* MIN (X, 0) == 0  ->  X >= 0  */
5592         return fold_build2 (GE_EXPR, type, inner, comp_const);
5593
5594       else if (consts_lt)
5595         /* MIN (X, 0) == 5  ->  false  */
5596         return omit_one_operand (type, integer_zero_node, inner);
5597
5598       else
5599         /* MIN (X, 0) == -1  ->  X == -1  */
5600         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5601
5602     case GT_EXPR:
5603       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5604         /* MAX (X, 0) > 0  ->  X > 0
5605            MAX (X, 0) > 5  ->  X > 5  */
5606         return fold_build2 (GT_EXPR, type, inner, comp_const);
5607
5608       else if (op_code == MAX_EXPR)
5609         /* MAX (X, 0) > -1  ->  true  */
5610         return omit_one_operand (type, integer_one_node, inner);
5611
5612       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5613         /* MIN (X, 0) > 0  ->  false
5614            MIN (X, 0) > 5  ->  false  */
5615         return omit_one_operand (type, integer_zero_node, inner);
5616
5617       else
5618         /* MIN (X, 0) > -1  ->  X > -1  */
5619         return fold_build2 (GT_EXPR, type, inner, comp_const);
5620
5621     default:
5622       return NULL_TREE;
5623     }
5624 }
5625 \f
5626 /* T is an integer expression that is being multiplied, divided, or taken a
5627    modulus (CODE says which and what kind of divide or modulus) by a
5628    constant C.  See if we can eliminate that operation by folding it with
5629    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5630    should be used for the computation if wider than our type.
5631
5632    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5633    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5634    expression would not overflow or that overflow is undefined for the type
5635    in the language in question.
5636
5637    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5638    the machine has a multiply-accumulate insn or that this is part of an
5639    addressing calculation.
5640
5641    If we return a non-null expression, it is an equivalent form of the
5642    original computation, but need not be in the original type.
5643
5644    We set *STRICT_OVERFLOW_P to true if the return values depends on
5645    signed overflow being undefined.  Otherwise we do not change
5646    *STRICT_OVERFLOW_P.  */
5647
5648 static tree
5649 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5650                 bool *strict_overflow_p)
5651 {
5652   /* To avoid exponential search depth, refuse to allow recursion past
5653      three levels.  Beyond that (1) it's highly unlikely that we'll find
5654      something interesting and (2) we've probably processed it before
5655      when we built the inner expression.  */
5656
5657   static int depth;
5658   tree ret;
5659
5660   if (depth > 3)
5661     return NULL;
5662
5663   depth++;
5664   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5665   depth--;
5666
5667   return ret;
5668 }
5669
5670 static tree
5671 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5672                   bool *strict_overflow_p)
5673 {
5674   tree type = TREE_TYPE (t);
5675   enum tree_code tcode = TREE_CODE (t);
5676   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5677                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5678                 ? wide_type : type);
5679   tree t1, t2;
5680   int same_p = tcode == code;
5681   tree op0 = NULL_TREE, op1 = NULL_TREE;
5682   bool sub_strict_overflow_p;
5683
5684   /* Don't deal with constants of zero here; they confuse the code below.  */
5685   if (integer_zerop (c))
5686     return NULL_TREE;
5687
5688   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5689     op0 = TREE_OPERAND (t, 0);
5690
5691   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5692     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5693
5694   /* Note that we need not handle conditional operations here since fold
5695      already handles those cases.  So just do arithmetic here.  */
5696   switch (tcode)
5697     {
5698     case INTEGER_CST:
5699       /* For a constant, we can always simplify if we are a multiply
5700          or (for divide and modulus) if it is a multiple of our constant.  */
5701       if (code == MULT_EXPR
5702           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5703         return const_binop (code, fold_convert (ctype, t),
5704                             fold_convert (ctype, c), 0);
5705       break;
5706
5707     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5708       /* If op0 is an expression ...  */
5709       if ((COMPARISON_CLASS_P (op0)
5710            || UNARY_CLASS_P (op0)
5711            || BINARY_CLASS_P (op0)
5712            || VL_EXP_CLASS_P (op0)
5713            || EXPRESSION_CLASS_P (op0))
5714           /* ... and is unsigned, and its type is smaller than ctype,
5715              then we cannot pass through as widening.  */
5716           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5717                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5718                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5719                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5720                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5721               /* ... or this is a truncation (t is narrower than op0),
5722                  then we cannot pass through this narrowing.  */
5723               || (GET_MODE_SIZE (TYPE_MODE (type))
5724                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5725               /* ... or signedness changes for division or modulus,
5726                  then we cannot pass through this conversion.  */
5727               || (code != MULT_EXPR
5728                   && (TYPE_UNSIGNED (ctype)
5729                       != TYPE_UNSIGNED (TREE_TYPE (op0))))))
5730         break;
5731
5732       /* Pass the constant down and see if we can make a simplification.  If
5733          we can, replace this expression with the inner simplification for
5734          possible later conversion to our or some other type.  */
5735       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5736           && TREE_CODE (t2) == INTEGER_CST
5737           && !TREE_OVERFLOW (t2)
5738           && (0 != (t1 = extract_muldiv (op0, t2, code,
5739                                          code == MULT_EXPR
5740                                          ? ctype : NULL_TREE,
5741                                          strict_overflow_p))))
5742         return t1;
5743       break;
5744
5745     case ABS_EXPR:
5746       /* If widening the type changes it from signed to unsigned, then we
5747          must avoid building ABS_EXPR itself as unsigned.  */
5748       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5749         {
5750           tree cstype = (*signed_type_for) (ctype);
5751           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5752               != 0)
5753             {
5754               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5755               return fold_convert (ctype, t1);
5756             }
5757           break;
5758         }
5759       /* FALLTHROUGH */
5760     case NEGATE_EXPR:
5761       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5762           != 0)
5763         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5764       break;
5765
5766     case MIN_EXPR:  case MAX_EXPR:
5767       /* If widening the type changes the signedness, then we can't perform
5768          this optimization as that changes the result.  */
5769       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5770         break;
5771
5772       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5773       sub_strict_overflow_p = false;
5774       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5775                                 &sub_strict_overflow_p)) != 0
5776           && (t2 = extract_muldiv (op1, c, code, wide_type,
5777                                    &sub_strict_overflow_p)) != 0)
5778         {
5779           if (tree_int_cst_sgn (c) < 0)
5780             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5781           if (sub_strict_overflow_p)
5782             *strict_overflow_p = true;
5783           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5784                               fold_convert (ctype, t2));
5785         }
5786       break;
5787
5788     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5789       /* If the second operand is constant, this is a multiplication
5790          or floor division, by a power of two, so we can treat it that
5791          way unless the multiplier or divisor overflows.  Signed
5792          left-shift overflow is implementation-defined rather than
5793          undefined in C90, so do not convert signed left shift into
5794          multiplication.  */
5795       if (TREE_CODE (op1) == INTEGER_CST
5796           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5797           /* const_binop may not detect overflow correctly,
5798              so check for it explicitly here.  */
5799           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5800           && TREE_INT_CST_HIGH (op1) == 0
5801           && 0 != (t1 = fold_convert (ctype,
5802                                       const_binop (LSHIFT_EXPR,
5803                                                    size_one_node,
5804                                                    op1, 0)))
5805           && !TREE_OVERFLOW (t1))
5806         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5807                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5808                                        ctype, fold_convert (ctype, op0), t1),
5809                                c, code, wide_type, strict_overflow_p);
5810       break;
5811
5812     case PLUS_EXPR:  case MINUS_EXPR:
5813       /* See if we can eliminate the operation on both sides.  If we can, we
5814          can return a new PLUS or MINUS.  If we can't, the only remaining
5815          cases where we can do anything are if the second operand is a
5816          constant.  */
5817       sub_strict_overflow_p = false;
5818       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5819       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5820       if (t1 != 0 && t2 != 0
5821           && (code == MULT_EXPR
5822               /* If not multiplication, we can only do this if both operands
5823                  are divisible by c.  */
5824               || (multiple_of_p (ctype, op0, c)
5825                   && multiple_of_p (ctype, op1, c))))
5826         {
5827           if (sub_strict_overflow_p)
5828             *strict_overflow_p = true;
5829           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5830                               fold_convert (ctype, t2));
5831         }
5832
5833       /* If this was a subtraction, negate OP1 and set it to be an addition.
5834          This simplifies the logic below.  */
5835       if (tcode == MINUS_EXPR)
5836         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5837
5838       if (TREE_CODE (op1) != INTEGER_CST)
5839         break;
5840
5841       /* If either OP1 or C are negative, this optimization is not safe for
5842          some of the division and remainder types while for others we need
5843          to change the code.  */
5844       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5845         {
5846           if (code == CEIL_DIV_EXPR)
5847             code = FLOOR_DIV_EXPR;
5848           else if (code == FLOOR_DIV_EXPR)
5849             code = CEIL_DIV_EXPR;
5850           else if (code != MULT_EXPR
5851                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5852             break;
5853         }
5854
5855       /* If it's a multiply or a division/modulus operation of a multiple
5856          of our constant, do the operation and verify it doesn't overflow.  */
5857       if (code == MULT_EXPR
5858           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5859         {
5860           op1 = const_binop (code, fold_convert (ctype, op1),
5861                              fold_convert (ctype, c), 0);
5862           /* We allow the constant to overflow with wrapping semantics.  */
5863           if (op1 == 0
5864               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5865             break;
5866         }
5867       else
5868         break;
5869
5870       /* If we have an unsigned type is not a sizetype, we cannot widen
5871          the operation since it will change the result if the original
5872          computation overflowed.  */
5873       if (TYPE_UNSIGNED (ctype)
5874           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5875           && ctype != type)
5876         break;
5877
5878       /* If we were able to eliminate our operation from the first side,
5879          apply our operation to the second side and reform the PLUS.  */
5880       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5881         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5882
5883       /* The last case is if we are a multiply.  In that case, we can
5884          apply the distributive law to commute the multiply and addition
5885          if the multiplication of the constants doesn't overflow.  */
5886       if (code == MULT_EXPR)
5887         return fold_build2 (tcode, ctype,
5888                             fold_build2 (code, ctype,
5889                                          fold_convert (ctype, op0),
5890                                          fold_convert (ctype, c)),
5891                             op1);
5892
5893       break;
5894
5895     case MULT_EXPR:
5896       /* We have a special case here if we are doing something like
5897          (C * 8) % 4 since we know that's zero.  */
5898       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5899            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5900           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5901           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5902         return omit_one_operand (type, integer_zero_node, op0);
5903
5904       /* ... fall through ...  */
5905
5906     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5907     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5908       /* If we can extract our operation from the LHS, do so and return a
5909          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5910          do something only if the second operand is a constant.  */
5911       if (same_p
5912           && (t1 = extract_muldiv (op0, c, code, wide_type,
5913                                    strict_overflow_p)) != 0)
5914         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5915                             fold_convert (ctype, op1));
5916       else if (tcode == MULT_EXPR && code == MULT_EXPR
5917                && (t1 = extract_muldiv (op1, c, code, wide_type,
5918                                         strict_overflow_p)) != 0)
5919         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5920                             fold_convert (ctype, t1));
5921       else if (TREE_CODE (op1) != INTEGER_CST)
5922         return 0;
5923
5924       /* If these are the same operation types, we can associate them
5925          assuming no overflow.  */
5926       if (tcode == code
5927           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5928                                      fold_convert (ctype, c), 0))
5929           && !TREE_OVERFLOW (t1))
5930         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5931
5932       /* If these operations "cancel" each other, we have the main
5933          optimizations of this pass, which occur when either constant is a
5934          multiple of the other, in which case we replace this with either an
5935          operation or CODE or TCODE.
5936
5937          If we have an unsigned type that is not a sizetype, we cannot do
5938          this since it will change the result if the original computation
5939          overflowed.  */
5940       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5941            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5942           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5943               || (tcode == MULT_EXPR
5944                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5945                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
5946         {
5947           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5948             {
5949               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5950                 *strict_overflow_p = true;
5951               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5952                                   fold_convert (ctype,
5953                                                 const_binop (TRUNC_DIV_EXPR,
5954                                                              op1, c, 0)));
5955             }
5956           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5957             {
5958               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5959                 *strict_overflow_p = true;
5960               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5961                                   fold_convert (ctype,
5962                                                 const_binop (TRUNC_DIV_EXPR,
5963                                                              c, op1, 0)));
5964             }
5965         }
5966       break;
5967
5968     default:
5969       break;
5970     }
5971
5972   return 0;
5973 }
5974 \f
5975 /* Return a node which has the indicated constant VALUE (either 0 or
5976    1), and is of the indicated TYPE.  */
5977
5978 tree
5979 constant_boolean_node (int value, tree type)
5980 {
5981   if (type == integer_type_node)
5982     return value ? integer_one_node : integer_zero_node;
5983   else if (type == boolean_type_node)
5984     return value ? boolean_true_node : boolean_false_node;
5985   else
5986     return build_int_cst (type, value);
5987 }
5988
5989
5990 /* Return true if expr looks like an ARRAY_REF and set base and
5991    offset to the appropriate trees.  If there is no offset,
5992    offset is set to NULL_TREE.  Base will be canonicalized to
5993    something you can get the element type from using
5994    TREE_TYPE (TREE_TYPE (base)).  Offset will be the offset
5995    in bytes to the base.  */
5996
5997 static bool
5998 extract_array_ref (tree expr, tree *base, tree *offset)
5999 {
6000   /* One canonical form is a PLUS_EXPR with the first
6001      argument being an ADDR_EXPR with a possible NOP_EXPR
6002      attached.  */
6003   if (TREE_CODE (expr) == PLUS_EXPR)
6004     {
6005       tree op0 = TREE_OPERAND (expr, 0);
6006       tree inner_base, dummy1;
6007       /* Strip NOP_EXPRs here because the C frontends and/or
6008          folders present us (int *)&x.a + 4B possibly.  */
6009       STRIP_NOPS (op0);
6010       if (extract_array_ref (op0, &inner_base, &dummy1))
6011         {
6012           *base = inner_base;
6013           if (dummy1 == NULL_TREE)
6014             *offset = TREE_OPERAND (expr, 1);
6015           else
6016             *offset = fold_build2 (PLUS_EXPR, TREE_TYPE (expr),
6017                                    dummy1, TREE_OPERAND (expr, 1));
6018           return true;
6019         }
6020     }
6021   /* Other canonical form is an ADDR_EXPR of an ARRAY_REF,
6022      which we transform into an ADDR_EXPR with appropriate
6023      offset.  For other arguments to the ADDR_EXPR we assume
6024      zero offset and as such do not care about the ADDR_EXPR
6025      type and strip possible nops from it.  */
6026   else if (TREE_CODE (expr) == ADDR_EXPR)
6027     {
6028       tree op0 = TREE_OPERAND (expr, 0);
6029       if (TREE_CODE (op0) == ARRAY_REF)
6030         {
6031           tree idx = TREE_OPERAND (op0, 1);
6032           *base = TREE_OPERAND (op0, 0);
6033           *offset = fold_build2 (MULT_EXPR, TREE_TYPE (idx), idx,
6034                                  array_ref_element_size (op0)); 
6035         }
6036       else
6037         {
6038           /* Handle array-to-pointer decay as &a.  */
6039           if (TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
6040             *base = TREE_OPERAND (expr, 0);
6041           else
6042             *base = expr;
6043           *offset = NULL_TREE;
6044         }
6045       return true;
6046     }
6047   /* The next canonical form is a VAR_DECL with POINTER_TYPE.  */
6048   else if (SSA_VAR_P (expr)
6049            && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
6050     {
6051       *base = expr;
6052       *offset = NULL_TREE;
6053       return true;
6054     }
6055
6056   return false;
6057 }
6058
6059
6060 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6061    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6062    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6063    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6064    COND is the first argument to CODE; otherwise (as in the example
6065    given here), it is the second argument.  TYPE is the type of the
6066    original expression.  Return NULL_TREE if no simplification is
6067    possible.  */
6068
6069 static tree
6070 fold_binary_op_with_conditional_arg (enum tree_code code,
6071                                      tree type, tree op0, tree op1,
6072                                      tree cond, tree arg, int cond_first_p)
6073 {
6074   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6075   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6076   tree test, true_value, false_value;
6077   tree lhs = NULL_TREE;
6078   tree rhs = NULL_TREE;
6079
6080   /* This transformation is only worthwhile if we don't have to wrap
6081      arg in a SAVE_EXPR, and the operation can be simplified on at least
6082      one of the branches once its pushed inside the COND_EXPR.  */
6083   if (!TREE_CONSTANT (arg))
6084     return NULL_TREE;
6085
6086   if (TREE_CODE (cond) == COND_EXPR)
6087     {
6088       test = TREE_OPERAND (cond, 0);
6089       true_value = TREE_OPERAND (cond, 1);
6090       false_value = TREE_OPERAND (cond, 2);
6091       /* If this operand throws an expression, then it does not make
6092          sense to try to perform a logical or arithmetic operation
6093          involving it.  */
6094       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6095         lhs = true_value;
6096       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6097         rhs = false_value;
6098     }
6099   else
6100     {
6101       tree testtype = TREE_TYPE (cond);
6102       test = cond;
6103       true_value = constant_boolean_node (true, testtype);
6104       false_value = constant_boolean_node (false, testtype);
6105     }
6106
6107   arg = fold_convert (arg_type, arg);
6108   if (lhs == 0)
6109     {
6110       true_value = fold_convert (cond_type, true_value);
6111       if (cond_first_p)
6112         lhs = fold_build2 (code, type, true_value, arg);
6113       else
6114         lhs = fold_build2 (code, type, arg, true_value);
6115     }
6116   if (rhs == 0)
6117     {
6118       false_value = fold_convert (cond_type, false_value);
6119       if (cond_first_p)
6120         rhs = fold_build2 (code, type, false_value, arg);
6121       else
6122         rhs = fold_build2 (code, type, arg, false_value);
6123     }
6124
6125   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6126   return fold_convert (type, test);
6127 }
6128
6129 \f
6130 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6131
6132    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6133    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6134    ADDEND is the same as X.
6135
6136    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6137    and finite.  The problematic cases are when X is zero, and its mode
6138    has signed zeros.  In the case of rounding towards -infinity,
6139    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6140    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6141
6142 static bool
6143 fold_real_zero_addition_p (tree type, tree addend, int negate)
6144 {
6145   if (!real_zerop (addend))
6146     return false;
6147
6148   /* Don't allow the fold with -fsignaling-nans.  */
6149   if (HONOR_SNANS (TYPE_MODE (type)))
6150     return false;
6151
6152   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6153   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6154     return true;
6155
6156   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6157   if (TREE_CODE (addend) == REAL_CST
6158       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6159     negate = !negate;
6160
6161   /* The mode has signed zeros, and we have to honor their sign.
6162      In this situation, there is only one case we can return true for.
6163      X - 0 is the same as X unless rounding towards -infinity is
6164      supported.  */
6165   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6166 }
6167
6168 /* Subroutine of fold() that checks comparisons of built-in math
6169    functions against real constants.
6170
6171    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6172    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6173    is the type of the result and ARG0 and ARG1 are the operands of the
6174    comparison.  ARG1 must be a TREE_REAL_CST.
6175
6176    The function returns the constant folded tree if a simplification
6177    can be made, and NULL_TREE otherwise.  */
6178
6179 static tree
6180 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6181                      tree type, tree arg0, tree arg1)
6182 {
6183   REAL_VALUE_TYPE c;
6184
6185   if (BUILTIN_SQRT_P (fcode))
6186     {
6187       tree arg = CALL_EXPR_ARG (arg0, 0);
6188       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6189
6190       c = TREE_REAL_CST (arg1);
6191       if (REAL_VALUE_NEGATIVE (c))
6192         {
6193           /* sqrt(x) < y is always false, if y is negative.  */
6194           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6195             return omit_one_operand (type, integer_zero_node, arg);
6196
6197           /* sqrt(x) > y is always true, if y is negative and we
6198              don't care about NaNs, i.e. negative values of x.  */
6199           if (code == NE_EXPR || !HONOR_NANS (mode))
6200             return omit_one_operand (type, integer_one_node, arg);
6201
6202           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6203           return fold_build2 (GE_EXPR, type, arg,
6204                               build_real (TREE_TYPE (arg), dconst0));
6205         }
6206       else if (code == GT_EXPR || code == GE_EXPR)
6207         {
6208           REAL_VALUE_TYPE c2;
6209
6210           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6211           real_convert (&c2, mode, &c2);
6212
6213           if (REAL_VALUE_ISINF (c2))
6214             {
6215               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6216               if (HONOR_INFINITIES (mode))
6217                 return fold_build2 (EQ_EXPR, type, arg,
6218                                     build_real (TREE_TYPE (arg), c2));
6219
6220               /* sqrt(x) > y is always false, when y is very large
6221                  and we don't care about infinities.  */
6222               return omit_one_operand (type, integer_zero_node, arg);
6223             }
6224
6225           /* sqrt(x) > c is the same as x > c*c.  */
6226           return fold_build2 (code, type, arg,
6227                               build_real (TREE_TYPE (arg), c2));
6228         }
6229       else if (code == LT_EXPR || code == LE_EXPR)
6230         {
6231           REAL_VALUE_TYPE c2;
6232
6233           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6234           real_convert (&c2, mode, &c2);
6235
6236           if (REAL_VALUE_ISINF (c2))
6237             {
6238               /* sqrt(x) < y is always true, when y is a very large
6239                  value and we don't care about NaNs or Infinities.  */
6240               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6241                 return omit_one_operand (type, integer_one_node, arg);
6242
6243               /* sqrt(x) < y is x != +Inf when y is very large and we
6244                  don't care about NaNs.  */
6245               if (! HONOR_NANS (mode))
6246                 return fold_build2 (NE_EXPR, type, arg,
6247                                     build_real (TREE_TYPE (arg), c2));
6248
6249               /* sqrt(x) < y is x >= 0 when y is very large and we
6250                  don't care about Infinities.  */
6251               if (! HONOR_INFINITIES (mode))
6252                 return fold_build2 (GE_EXPR, type, arg,
6253                                     build_real (TREE_TYPE (arg), dconst0));
6254
6255               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6256               if (lang_hooks.decls.global_bindings_p () != 0
6257                   || CONTAINS_PLACEHOLDER_P (arg))
6258                 return NULL_TREE;
6259
6260               arg = save_expr (arg);
6261               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6262                                   fold_build2 (GE_EXPR, type, arg,
6263                                                build_real (TREE_TYPE (arg),
6264                                                            dconst0)),
6265                                   fold_build2 (NE_EXPR, type, arg,
6266                                                build_real (TREE_TYPE (arg),
6267                                                            c2)));
6268             }
6269
6270           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6271           if (! HONOR_NANS (mode))
6272             return fold_build2 (code, type, arg,
6273                                 build_real (TREE_TYPE (arg), c2));
6274
6275           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6276           if (lang_hooks.decls.global_bindings_p () == 0
6277               && ! CONTAINS_PLACEHOLDER_P (arg))
6278             {
6279               arg = save_expr (arg);
6280               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6281                                   fold_build2 (GE_EXPR, type, arg,
6282                                                build_real (TREE_TYPE (arg),
6283                                                            dconst0)),
6284                                   fold_build2 (code, type, arg,
6285                                                build_real (TREE_TYPE (arg),
6286                                                            c2)));
6287             }
6288         }
6289     }
6290
6291   return NULL_TREE;
6292 }
6293
6294 /* Subroutine of fold() that optimizes comparisons against Infinities,
6295    either +Inf or -Inf.
6296
6297    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6298    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6299    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6300
6301    The function returns the constant folded tree if a simplification
6302    can be made, and NULL_TREE otherwise.  */
6303
6304 static tree
6305 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6306 {
6307   enum machine_mode mode;
6308   REAL_VALUE_TYPE max;
6309   tree temp;
6310   bool neg;
6311
6312   mode = TYPE_MODE (TREE_TYPE (arg0));
6313
6314   /* For negative infinity swap the sense of the comparison.  */
6315   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6316   if (neg)
6317     code = swap_tree_comparison (code);
6318
6319   switch (code)
6320     {
6321     case GT_EXPR:
6322       /* x > +Inf is always false, if with ignore sNANs.  */
6323       if (HONOR_SNANS (mode))
6324         return NULL_TREE;
6325       return omit_one_operand (type, integer_zero_node, arg0);
6326
6327     case LE_EXPR:
6328       /* x <= +Inf is always true, if we don't case about NaNs.  */
6329       if (! HONOR_NANS (mode))
6330         return omit_one_operand (type, integer_one_node, arg0);
6331
6332       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6333       if (lang_hooks.decls.global_bindings_p () == 0
6334           && ! CONTAINS_PLACEHOLDER_P (arg0))
6335         {
6336           arg0 = save_expr (arg0);
6337           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6338         }
6339       break;
6340
6341     case EQ_EXPR:
6342     case GE_EXPR:
6343       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6344       real_maxval (&max, neg, mode);
6345       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6346                           arg0, build_real (TREE_TYPE (arg0), max));
6347
6348     case LT_EXPR:
6349       /* x < +Inf is always equal to x <= DBL_MAX.  */
6350       real_maxval (&max, neg, mode);
6351       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6352                           arg0, build_real (TREE_TYPE (arg0), max));
6353
6354     case NE_EXPR:
6355       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6356       real_maxval (&max, neg, mode);
6357       if (! HONOR_NANS (mode))
6358         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6359                             arg0, build_real (TREE_TYPE (arg0), max));
6360
6361       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6362                           arg0, build_real (TREE_TYPE (arg0), max));
6363       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6364
6365     default:
6366       break;
6367     }
6368
6369   return NULL_TREE;
6370 }
6371
6372 /* Subroutine of fold() that optimizes comparisons of a division by
6373    a nonzero integer constant against an integer constant, i.e.
6374    X/C1 op C2.
6375
6376    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6377    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6378    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6379
6380    The function returns the constant folded tree if a simplification
6381    can be made, and NULL_TREE otherwise.  */
6382
6383 static tree
6384 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6385 {
6386   tree prod, tmp, hi, lo;
6387   tree arg00 = TREE_OPERAND (arg0, 0);
6388   tree arg01 = TREE_OPERAND (arg0, 1);
6389   unsigned HOST_WIDE_INT lpart;
6390   HOST_WIDE_INT hpart;
6391   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6392   bool neg_overflow;
6393   int overflow;
6394
6395   /* We have to do this the hard way to detect unsigned overflow.
6396      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6397   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6398                                    TREE_INT_CST_HIGH (arg01),
6399                                    TREE_INT_CST_LOW (arg1),
6400                                    TREE_INT_CST_HIGH (arg1),
6401                                    &lpart, &hpart, unsigned_p);
6402   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6403                                 -1, overflow);
6404   neg_overflow = false;
6405
6406   if (unsigned_p)
6407     {
6408       tmp = int_const_binop (MINUS_EXPR, arg01,
6409                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6410       lo = prod;
6411
6412       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6413       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6414                                        TREE_INT_CST_HIGH (prod),
6415                                        TREE_INT_CST_LOW (tmp),
6416                                        TREE_INT_CST_HIGH (tmp),
6417                                        &lpart, &hpart, unsigned_p);
6418       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6419                                   -1, overflow | TREE_OVERFLOW (prod));
6420     }
6421   else if (tree_int_cst_sgn (arg01) >= 0)
6422     {
6423       tmp = int_const_binop (MINUS_EXPR, arg01,
6424                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6425       switch (tree_int_cst_sgn (arg1))
6426         {
6427         case -1:
6428           neg_overflow = true;
6429           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6430           hi = prod;
6431           break;
6432
6433         case  0:
6434           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6435           hi = tmp;
6436           break;
6437
6438         case  1:
6439           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6440           lo = prod;
6441           break;
6442
6443         default:
6444           gcc_unreachable ();
6445         }
6446     }
6447   else
6448     {
6449       /* A negative divisor reverses the relational operators.  */
6450       code = swap_tree_comparison (code);
6451
6452       tmp = int_const_binop (PLUS_EXPR, arg01,
6453                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6454       switch (tree_int_cst_sgn (arg1))
6455         {
6456         case -1:
6457           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6458           lo = prod;
6459           break;
6460
6461         case  0:
6462           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6463           lo = tmp;
6464           break;
6465
6466         case  1:
6467           neg_overflow = true;
6468           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6469           hi = prod;
6470           break;
6471
6472         default:
6473           gcc_unreachable ();
6474         }
6475     }
6476
6477   switch (code)
6478     {
6479     case EQ_EXPR:
6480       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6481         return omit_one_operand (type, integer_zero_node, arg00);
6482       if (TREE_OVERFLOW (hi))
6483         return fold_build2 (GE_EXPR, type, arg00, lo);
6484       if (TREE_OVERFLOW (lo))
6485         return fold_build2 (LE_EXPR, type, arg00, hi);
6486       return build_range_check (type, arg00, 1, lo, hi);
6487
6488     case NE_EXPR:
6489       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6490         return omit_one_operand (type, integer_one_node, arg00);
6491       if (TREE_OVERFLOW (hi))
6492         return fold_build2 (LT_EXPR, type, arg00, lo);
6493       if (TREE_OVERFLOW (lo))
6494         return fold_build2 (GT_EXPR, type, arg00, hi);
6495       return build_range_check (type, arg00, 0, lo, hi);
6496
6497     case LT_EXPR:
6498       if (TREE_OVERFLOW (lo))
6499         {
6500           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6501           return omit_one_operand (type, tmp, arg00);
6502         }
6503       return fold_build2 (LT_EXPR, type, arg00, lo);
6504
6505     case LE_EXPR:
6506       if (TREE_OVERFLOW (hi))
6507         {
6508           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6509           return omit_one_operand (type, tmp, arg00);
6510         }
6511       return fold_build2 (LE_EXPR, type, arg00, hi);
6512
6513     case GT_EXPR:
6514       if (TREE_OVERFLOW (hi))
6515         {
6516           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6517           return omit_one_operand (type, tmp, arg00);
6518         }
6519       return fold_build2 (GT_EXPR, type, arg00, hi);
6520
6521     case GE_EXPR:
6522       if (TREE_OVERFLOW (lo))
6523         {
6524           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6525           return omit_one_operand (type, tmp, arg00);
6526         }
6527       return fold_build2 (GE_EXPR, type, arg00, lo);
6528
6529     default:
6530       break;
6531     }
6532
6533   return NULL_TREE;
6534 }
6535
6536
6537 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6538    equality/inequality test, then return a simplified form of the test
6539    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6540    result type.  */
6541
6542 static tree
6543 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6544                                      tree result_type)
6545 {
6546   /* If this is testing a single bit, we can optimize the test.  */
6547   if ((code == NE_EXPR || code == EQ_EXPR)
6548       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6549       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6550     {
6551       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6552          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6553       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6554
6555       if (arg00 != NULL_TREE
6556           /* This is only a win if casting to a signed type is cheap,
6557              i.e. when arg00's type is not a partial mode.  */
6558           && TYPE_PRECISION (TREE_TYPE (arg00))
6559              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6560         {
6561           tree stype = signed_type_for (TREE_TYPE (arg00));
6562           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6563                               result_type, fold_convert (stype, arg00),
6564                               build_int_cst (stype, 0));
6565         }
6566     }
6567
6568   return NULL_TREE;
6569 }
6570
6571 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6572    equality/inequality test, then return a simplified form of
6573    the test using shifts and logical operations.  Otherwise return
6574    NULL.  TYPE is the desired result type.  */
6575
6576 tree
6577 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6578                       tree result_type)
6579 {
6580   /* If this is testing a single bit, we can optimize the test.  */
6581   if ((code == NE_EXPR || code == EQ_EXPR)
6582       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6583       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6584     {
6585       tree inner = TREE_OPERAND (arg0, 0);
6586       tree type = TREE_TYPE (arg0);
6587       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6588       enum machine_mode operand_mode = TYPE_MODE (type);
6589       int ops_unsigned;
6590       tree signed_type, unsigned_type, intermediate_type;
6591       tree tem, one;
6592
6593       /* First, see if we can fold the single bit test into a sign-bit
6594          test.  */
6595       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6596                                                  result_type);
6597       if (tem)
6598         return tem;
6599
6600       /* Otherwise we have (A & C) != 0 where C is a single bit,
6601          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6602          Similarly for (A & C) == 0.  */
6603
6604       /* If INNER is a right shift of a constant and it plus BITNUM does
6605          not overflow, adjust BITNUM and INNER.  */
6606       if (TREE_CODE (inner) == RSHIFT_EXPR
6607           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6608           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6609           && bitnum < TYPE_PRECISION (type)
6610           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6611                                    bitnum - TYPE_PRECISION (type)))
6612         {
6613           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6614           inner = TREE_OPERAND (inner, 0);
6615         }
6616
6617       /* If we are going to be able to omit the AND below, we must do our
6618          operations as unsigned.  If we must use the AND, we have a choice.
6619          Normally unsigned is faster, but for some machines signed is.  */
6620 #ifdef LOAD_EXTEND_OP
6621       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6622                       && !flag_syntax_only) ? 0 : 1;
6623 #else
6624       ops_unsigned = 1;
6625 #endif
6626
6627       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6628       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6629       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6630       inner = fold_convert (intermediate_type, inner);
6631
6632       if (bitnum != 0)
6633         inner = build2 (RSHIFT_EXPR, intermediate_type,
6634                         inner, size_int (bitnum));
6635
6636       one = build_int_cst (intermediate_type, 1);
6637
6638       if (code == EQ_EXPR)
6639         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6640
6641       /* Put the AND last so it can combine with more things.  */
6642       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6643
6644       /* Make sure to return the proper type.  */
6645       inner = fold_convert (result_type, inner);
6646
6647       return inner;
6648     }
6649   return NULL_TREE;
6650 }
6651
6652 /* Check whether we are allowed to reorder operands arg0 and arg1,
6653    such that the evaluation of arg1 occurs before arg0.  */
6654
6655 static bool
6656 reorder_operands_p (tree arg0, tree arg1)
6657 {
6658   if (! flag_evaluation_order)
6659       return true;
6660   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6661     return true;
6662   return ! TREE_SIDE_EFFECTS (arg0)
6663          && ! TREE_SIDE_EFFECTS (arg1);
6664 }
6665
6666 /* Test whether it is preferable two swap two operands, ARG0 and
6667    ARG1, for example because ARG0 is an integer constant and ARG1
6668    isn't.  If REORDER is true, only recommend swapping if we can
6669    evaluate the operands in reverse order.  */
6670
6671 bool
6672 tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
6673 {
6674   STRIP_SIGN_NOPS (arg0);
6675   STRIP_SIGN_NOPS (arg1);
6676
6677   if (TREE_CODE (arg1) == INTEGER_CST)
6678     return 0;
6679   if (TREE_CODE (arg0) == INTEGER_CST)
6680     return 1;
6681
6682   if (TREE_CODE (arg1) == REAL_CST)
6683     return 0;
6684   if (TREE_CODE (arg0) == REAL_CST)
6685     return 1;
6686
6687   if (TREE_CODE (arg1) == COMPLEX_CST)
6688     return 0;
6689   if (TREE_CODE (arg0) == COMPLEX_CST)
6690     return 1;
6691
6692   if (TREE_CONSTANT (arg1))
6693     return 0;
6694   if (TREE_CONSTANT (arg0))
6695     return 1;
6696
6697   if (optimize_size)
6698     return 0;
6699
6700   if (reorder && flag_evaluation_order
6701       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6702     return 0;
6703
6704   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6705      for commutative and comparison operators.  Ensuring a canonical
6706      form allows the optimizers to find additional redundancies without
6707      having to explicitly check for both orderings.  */
6708   if (TREE_CODE (arg0) == SSA_NAME
6709       && TREE_CODE (arg1) == SSA_NAME
6710       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6711     return 1;
6712
6713   /* Put SSA_NAMEs last.  */
6714   if (TREE_CODE (arg1) == SSA_NAME)
6715     return 0;
6716   if (TREE_CODE (arg0) == SSA_NAME)
6717     return 1;
6718
6719   /* Put variables last.  */
6720   if (DECL_P (arg1))
6721     return 0;
6722   if (DECL_P (arg0))
6723     return 1;
6724
6725   return 0;
6726 }
6727
6728 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6729    ARG0 is extended to a wider type.  */
6730
6731 static tree
6732 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6733 {
6734   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6735   tree arg1_unw;
6736   tree shorter_type, outer_type;
6737   tree min, max;
6738   bool above, below;
6739
6740   if (arg0_unw == arg0)
6741     return NULL_TREE;
6742   shorter_type = TREE_TYPE (arg0_unw);
6743
6744 #ifdef HAVE_canonicalize_funcptr_for_compare
6745   /* Disable this optimization if we're casting a function pointer
6746      type on targets that require function pointer canonicalization.  */
6747   if (HAVE_canonicalize_funcptr_for_compare
6748       && TREE_CODE (shorter_type) == POINTER_TYPE
6749       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6750     return NULL_TREE;
6751 #endif
6752
6753   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6754     return NULL_TREE;
6755
6756   arg1_unw = get_unwidened (arg1, shorter_type);
6757
6758   /* If possible, express the comparison in the shorter mode.  */
6759   if ((code == EQ_EXPR || code == NE_EXPR
6760        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6761       && (TREE_TYPE (arg1_unw) == shorter_type
6762           || (TREE_CODE (arg1_unw) == INTEGER_CST
6763               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6764                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6765               && int_fits_type_p (arg1_unw, shorter_type))))
6766     return fold_build2 (code, type, arg0_unw,
6767                        fold_convert (shorter_type, arg1_unw));
6768
6769   if (TREE_CODE (arg1_unw) != INTEGER_CST
6770       || TREE_CODE (shorter_type) != INTEGER_TYPE
6771       || !int_fits_type_p (arg1_unw, shorter_type))
6772     return NULL_TREE;
6773
6774   /* If we are comparing with the integer that does not fit into the range
6775      of the shorter type, the result is known.  */
6776   outer_type = TREE_TYPE (arg1_unw);
6777   min = lower_bound_in_type (outer_type, shorter_type);
6778   max = upper_bound_in_type (outer_type, shorter_type);
6779
6780   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6781                                                    max, arg1_unw));
6782   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6783                                                    arg1_unw, min));
6784
6785   switch (code)
6786     {
6787     case EQ_EXPR:
6788       if (above || below)
6789         return omit_one_operand (type, integer_zero_node, arg0);
6790       break;
6791
6792     case NE_EXPR:
6793       if (above || below)
6794         return omit_one_operand (type, integer_one_node, arg0);
6795       break;
6796
6797     case LT_EXPR:
6798     case LE_EXPR:
6799       if (above)
6800         return omit_one_operand (type, integer_one_node, arg0);
6801       else if (below)
6802         return omit_one_operand (type, integer_zero_node, arg0);
6803
6804     case GT_EXPR:
6805     case GE_EXPR:
6806       if (above)
6807         return omit_one_operand (type, integer_zero_node, arg0);
6808       else if (below)
6809         return omit_one_operand (type, integer_one_node, arg0);
6810
6811     default:
6812       break;
6813     }
6814
6815   return NULL_TREE;
6816 }
6817
6818 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6819    ARG0 just the signedness is changed.  */
6820
6821 static tree
6822 fold_sign_changed_comparison (enum tree_code code, tree type,
6823                               tree arg0, tree arg1)
6824 {
6825   tree arg0_inner;
6826   tree inner_type, outer_type;
6827
6828   if (TREE_CODE (arg0) != NOP_EXPR
6829       && TREE_CODE (arg0) != CONVERT_EXPR)
6830     return NULL_TREE;
6831
6832   outer_type = TREE_TYPE (arg0);
6833   arg0_inner = TREE_OPERAND (arg0, 0);
6834   inner_type = TREE_TYPE (arg0_inner);
6835
6836 #ifdef HAVE_canonicalize_funcptr_for_compare
6837   /* Disable this optimization if we're casting a function pointer
6838      type on targets that require function pointer canonicalization.  */
6839   if (HAVE_canonicalize_funcptr_for_compare
6840       && TREE_CODE (inner_type) == POINTER_TYPE
6841       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6842     return NULL_TREE;
6843 #endif
6844
6845   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6846     return NULL_TREE;
6847
6848   if (TREE_CODE (arg1) != INTEGER_CST
6849       && !((TREE_CODE (arg1) == NOP_EXPR
6850             || TREE_CODE (arg1) == CONVERT_EXPR)
6851            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6852     return NULL_TREE;
6853
6854   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6855       && code != NE_EXPR
6856       && code != EQ_EXPR)
6857     return NULL_TREE;
6858
6859   if (TREE_CODE (arg1) == INTEGER_CST)
6860     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6861                                   TREE_INT_CST_HIGH (arg1), 0,
6862                                   TREE_OVERFLOW (arg1));
6863   else
6864     arg1 = fold_convert (inner_type, arg1);
6865
6866   return fold_build2 (code, type, arg0_inner, arg1);
6867 }
6868
6869 /* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6870    step of the array.  Reconstructs s and delta in the case of s * delta
6871    being an integer constant (and thus already folded).
6872    ADDR is the address. MULT is the multiplicative expression.
6873    If the function succeeds, the new address expression is returned.  Otherwise
6874    NULL_TREE is returned.  */
6875
6876 static tree
6877 try_move_mult_to_index (enum tree_code code, tree addr, tree op1)
6878 {
6879   tree s, delta, step;
6880   tree ref = TREE_OPERAND (addr, 0), pref;
6881   tree ret, pos;
6882   tree itype;
6883   bool mdim = false;
6884
6885   /* Canonicalize op1 into a possibly non-constant delta
6886      and an INTEGER_CST s.  */
6887   if (TREE_CODE (op1) == MULT_EXPR)
6888     {
6889       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6890
6891       STRIP_NOPS (arg0);
6892       STRIP_NOPS (arg1);
6893   
6894       if (TREE_CODE (arg0) == INTEGER_CST)
6895         {
6896           s = arg0;
6897           delta = arg1;
6898         }
6899       else if (TREE_CODE (arg1) == INTEGER_CST)
6900         {
6901           s = arg1;
6902           delta = arg0;
6903         }
6904       else
6905         return NULL_TREE;
6906     }
6907   else if (TREE_CODE (op1) == INTEGER_CST)
6908     {
6909       delta = op1;
6910       s = NULL_TREE;
6911     }
6912   else
6913     {
6914       /* Simulate we are delta * 1.  */
6915       delta = op1;
6916       s = integer_one_node;
6917     }
6918
6919   for (;; ref = TREE_OPERAND (ref, 0))
6920     {
6921       if (TREE_CODE (ref) == ARRAY_REF)
6922         {
6923           /* Remember if this was a multi-dimensional array.  */
6924           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6925             mdim = true;
6926
6927           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6928           if (! itype)
6929             continue;
6930
6931           step = array_ref_element_size (ref);
6932           if (TREE_CODE (step) != INTEGER_CST)
6933             continue;
6934
6935           if (s)
6936             {
6937               if (! tree_int_cst_equal (step, s))
6938                 continue;
6939             }
6940           else
6941             {
6942               /* Try if delta is a multiple of step.  */
6943               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6944               if (! tmp)
6945                 continue;
6946               delta = tmp;
6947             }
6948
6949           /* Only fold here if we can verify we do not overflow one
6950              dimension of a multi-dimensional array.  */
6951           if (mdim)
6952             {
6953               tree tmp;
6954
6955               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6956                   || !INTEGRAL_TYPE_P (itype)
6957                   || !TYPE_MAX_VALUE (itype)
6958                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6959                 continue;
6960
6961               tmp = fold_binary (code, itype,
6962                                  fold_convert (itype,
6963                                                TREE_OPERAND (ref, 1)),
6964                                  fold_convert (itype, delta));
6965               if (!tmp
6966                   || TREE_CODE (tmp) != INTEGER_CST
6967                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6968                 continue;
6969             }
6970
6971           break;
6972         }
6973       else
6974         mdim = false;
6975
6976       if (!handled_component_p (ref))
6977         return NULL_TREE;
6978     }
6979
6980   /* We found the suitable array reference.  So copy everything up to it,
6981      and replace the index.  */
6982
6983   pref = TREE_OPERAND (addr, 0);
6984   ret = copy_node (pref);
6985   pos = ret;
6986
6987   while (pref != ref)
6988     {
6989       pref = TREE_OPERAND (pref, 0);
6990       TREE_OPERAND (pos, 0) = copy_node (pref);
6991       pos = TREE_OPERAND (pos, 0);
6992     }
6993
6994   TREE_OPERAND (pos, 1) = fold_build2 (code, itype,
6995                                        fold_convert (itype,
6996                                                      TREE_OPERAND (pos, 1)),
6997                                        fold_convert (itype, delta));
6998
6999   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
7000 }
7001
7002
7003 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7004    means A >= Y && A != MAX, but in this case we know that
7005    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7006
7007 static tree
7008 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
7009 {
7010   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7011
7012   if (TREE_CODE (bound) == LT_EXPR)
7013     a = TREE_OPERAND (bound, 0);
7014   else if (TREE_CODE (bound) == GT_EXPR)
7015     a = TREE_OPERAND (bound, 1);
7016   else
7017     return NULL_TREE;
7018
7019   typea = TREE_TYPE (a);
7020   if (!INTEGRAL_TYPE_P (typea)
7021       && !POINTER_TYPE_P (typea))
7022     return NULL_TREE;
7023
7024   if (TREE_CODE (ineq) == LT_EXPR)
7025     {
7026       a1 = TREE_OPERAND (ineq, 1);
7027       y = TREE_OPERAND (ineq, 0);
7028     }
7029   else if (TREE_CODE (ineq) == GT_EXPR)
7030     {
7031       a1 = TREE_OPERAND (ineq, 0);
7032       y = TREE_OPERAND (ineq, 1);
7033     }
7034   else
7035     return NULL_TREE;
7036
7037   if (TREE_TYPE (a1) != typea)
7038     return NULL_TREE;
7039
7040   diff = fold_build2 (MINUS_EXPR, typea, a1, a);
7041   if (!integer_onep (diff))
7042     return NULL_TREE;
7043
7044   return fold_build2 (GE_EXPR, type, a, y);
7045 }
7046
7047 /* Fold a sum or difference of at least one multiplication.
7048    Returns the folded tree or NULL if no simplification could be made.  */
7049
7050 static tree
7051 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7052 {
7053   tree arg00, arg01, arg10, arg11;
7054   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7055
7056   /* (A * C) +- (B * C) -> (A+-B) * C.
7057      (A * C) +- A -> A * (C+-1).
7058      We are most concerned about the case where C is a constant,
7059      but other combinations show up during loop reduction.  Since
7060      it is not difficult, try all four possibilities.  */
7061
7062   if (TREE_CODE (arg0) == MULT_EXPR)
7063     {
7064       arg00 = TREE_OPERAND (arg0, 0);
7065       arg01 = TREE_OPERAND (arg0, 1);
7066     }
7067   else
7068     {
7069       arg00 = arg0;
7070       arg01 = build_one_cst (type);
7071     }
7072   if (TREE_CODE (arg1) == MULT_EXPR)
7073     {
7074       arg10 = TREE_OPERAND (arg1, 0);
7075       arg11 = TREE_OPERAND (arg1, 1);
7076     }
7077   else
7078     {
7079       arg10 = arg1;
7080       arg11 = build_one_cst (type);
7081     }
7082   same = NULL_TREE;
7083
7084   if (operand_equal_p (arg01, arg11, 0))
7085     same = arg01, alt0 = arg00, alt1 = arg10;
7086   else if (operand_equal_p (arg00, arg10, 0))
7087     same = arg00, alt0 = arg01, alt1 = arg11;
7088   else if (operand_equal_p (arg00, arg11, 0))
7089     same = arg00, alt0 = arg01, alt1 = arg10;
7090   else if (operand_equal_p (arg01, arg10, 0))
7091     same = arg01, alt0 = arg00, alt1 = arg11;
7092
7093   /* No identical multiplicands; see if we can find a common
7094      power-of-two factor in non-power-of-two multiplies.  This
7095      can help in multi-dimensional array access.  */
7096   else if (host_integerp (arg01, 0)
7097            && host_integerp (arg11, 0))
7098     {
7099       HOST_WIDE_INT int01, int11, tmp;
7100       bool swap = false;
7101       tree maybe_same;
7102       int01 = TREE_INT_CST_LOW (arg01);
7103       int11 = TREE_INT_CST_LOW (arg11);
7104
7105       /* Move min of absolute values to int11.  */
7106       if ((int01 >= 0 ? int01 : -int01)
7107           < (int11 >= 0 ? int11 : -int11))
7108         {
7109           tmp = int01, int01 = int11, int11 = tmp;
7110           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7111           maybe_same = arg01;
7112           swap = true;
7113         }
7114       else
7115         maybe_same = arg11;
7116
7117       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7118         {
7119           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7120                               build_int_cst (TREE_TYPE (arg00),
7121                                              int01 / int11));
7122           alt1 = arg10;
7123           same = maybe_same;
7124           if (swap)
7125             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7126         }
7127     }
7128
7129   if (same)
7130     return fold_build2 (MULT_EXPR, type,
7131                         fold_build2 (code, type,
7132                                      fold_convert (type, alt0),
7133                                      fold_convert (type, alt1)),
7134                         fold_convert (type, same));
7135
7136   return NULL_TREE;
7137 }
7138
7139 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7140    specified by EXPR into the buffer PTR of length LEN bytes.
7141    Return the number of bytes placed in the buffer, or zero
7142    upon failure.  */
7143
7144 static int
7145 native_encode_int (tree expr, unsigned char *ptr, int len)
7146 {
7147   tree type = TREE_TYPE (expr);
7148   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7149   int byte, offset, word, words;
7150   unsigned char value;
7151
7152   if (total_bytes > len)
7153     return 0;
7154   words = total_bytes / UNITS_PER_WORD;
7155
7156   for (byte = 0; byte < total_bytes; byte++)
7157     {
7158       int bitpos = byte * BITS_PER_UNIT;
7159       if (bitpos < HOST_BITS_PER_WIDE_INT)
7160         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7161       else
7162         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7163                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7164
7165       if (total_bytes > UNITS_PER_WORD)
7166         {
7167           word = byte / UNITS_PER_WORD;
7168           if (WORDS_BIG_ENDIAN)
7169             word = (words - 1) - word;
7170           offset = word * UNITS_PER_WORD;
7171           if (BYTES_BIG_ENDIAN)
7172             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7173           else
7174             offset += byte % UNITS_PER_WORD;
7175         }
7176       else
7177         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7178       ptr[offset] = value;
7179     }
7180   return total_bytes;
7181 }
7182
7183
7184 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7185    specified by EXPR into the buffer PTR of length LEN bytes.
7186    Return the number of bytes placed in the buffer, or zero
7187    upon failure.  */
7188
7189 static int
7190 native_encode_real (tree expr, unsigned char *ptr, int len)
7191 {
7192   tree type = TREE_TYPE (expr);
7193   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7194   int byte, offset, word, words, bitpos;
7195   unsigned char value;
7196
7197   /* There are always 32 bits in each long, no matter the size of
7198      the hosts long.  We handle floating point representations with
7199      up to 192 bits.  */
7200   long tmp[6];
7201
7202   if (total_bytes > len)
7203     return 0;
7204   words = 32 / UNITS_PER_WORD;
7205
7206   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7207
7208   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7209        bitpos += BITS_PER_UNIT)
7210     {
7211       byte = (bitpos / BITS_PER_UNIT) & 3;
7212       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7213
7214       if (UNITS_PER_WORD < 4)
7215         {
7216           word = byte / UNITS_PER_WORD;
7217           if (WORDS_BIG_ENDIAN)
7218             word = (words - 1) - word;
7219           offset = word * UNITS_PER_WORD;
7220           if (BYTES_BIG_ENDIAN)
7221             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7222           else
7223             offset += byte % UNITS_PER_WORD;
7224         }
7225       else
7226         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7227       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7228     }
7229   return total_bytes;
7230 }
7231
7232 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7233    specified by EXPR into the buffer PTR of length LEN bytes.
7234    Return the number of bytes placed in the buffer, or zero
7235    upon failure.  */
7236
7237 static int
7238 native_encode_complex (tree expr, unsigned char *ptr, int len)
7239 {
7240   int rsize, isize;
7241   tree part;
7242
7243   part = TREE_REALPART (expr);
7244   rsize = native_encode_expr (part, ptr, len);
7245   if (rsize == 0)
7246     return 0;
7247   part = TREE_IMAGPART (expr);
7248   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7249   if (isize != rsize)
7250     return 0;
7251   return rsize + isize;
7252 }
7253
7254
7255 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7256    specified by EXPR into the buffer PTR of length LEN bytes.
7257    Return the number of bytes placed in the buffer, or zero
7258    upon failure.  */
7259
7260 static int
7261 native_encode_vector (tree expr, unsigned char *ptr, int len)
7262 {
7263   int i, size, offset, count;
7264   tree itype, elem, elements;
7265
7266   offset = 0;
7267   elements = TREE_VECTOR_CST_ELTS (expr);
7268   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7269   itype = TREE_TYPE (TREE_TYPE (expr));
7270   size = GET_MODE_SIZE (TYPE_MODE (itype));
7271   for (i = 0; i < count; i++)
7272     {
7273       if (elements)
7274         {
7275           elem = TREE_VALUE (elements);
7276           elements = TREE_CHAIN (elements);
7277         }
7278       else
7279         elem = NULL_TREE;
7280
7281       if (elem)
7282         {
7283           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7284             return 0;
7285         }
7286       else
7287         {
7288           if (offset + size > len)
7289             return 0;
7290           memset (ptr+offset, 0, size);
7291         }
7292       offset += size;
7293     }
7294   return offset;
7295 }
7296
7297
7298 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7299    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7300    buffer PTR of length LEN bytes.  Return the number of bytes
7301    placed in the buffer, or zero upon failure.  */
7302
7303 int
7304 native_encode_expr (tree expr, unsigned char *ptr, int len)
7305 {
7306   switch (TREE_CODE (expr))
7307     {
7308     case INTEGER_CST:
7309       return native_encode_int (expr, ptr, len);
7310
7311     case REAL_CST:
7312       return native_encode_real (expr, ptr, len);
7313
7314     case COMPLEX_CST:
7315       return native_encode_complex (expr, ptr, len);
7316
7317     case VECTOR_CST:
7318       return native_encode_vector (expr, ptr, len);
7319
7320     default:
7321       return 0;
7322     }
7323 }
7324
7325
7326 /* Subroutine of native_interpret_expr.  Interpret the contents of
7327    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7328    If the buffer cannot be interpreted, return NULL_TREE.  */
7329
7330 static tree
7331 native_interpret_int (tree type, unsigned char *ptr, int len)
7332 {
7333   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7334   int byte, offset, word, words;
7335   unsigned char value;
7336   unsigned int HOST_WIDE_INT lo = 0;
7337   HOST_WIDE_INT hi = 0;
7338
7339   if (total_bytes > len)
7340     return NULL_TREE;
7341   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7342     return NULL_TREE;
7343   words = total_bytes / UNITS_PER_WORD;
7344
7345   for (byte = 0; byte < total_bytes; byte++)
7346     {
7347       int bitpos = byte * BITS_PER_UNIT;
7348       if (total_bytes > UNITS_PER_WORD)
7349         {
7350           word = byte / UNITS_PER_WORD;
7351           if (WORDS_BIG_ENDIAN)
7352             word = (words - 1) - word;
7353           offset = word * UNITS_PER_WORD;
7354           if (BYTES_BIG_ENDIAN)
7355             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7356           else
7357             offset += byte % UNITS_PER_WORD;
7358         }
7359       else
7360         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7361       value = ptr[offset];
7362
7363       if (bitpos < HOST_BITS_PER_WIDE_INT)
7364         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7365       else
7366         hi |= (unsigned HOST_WIDE_INT) value
7367               << (bitpos - HOST_BITS_PER_WIDE_INT);
7368     }
7369
7370   return build_int_cst_wide_type (type, lo, hi);
7371 }
7372
7373
7374 /* Subroutine of native_interpret_expr.  Interpret the contents of
7375    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7376    If the buffer cannot be interpreted, return NULL_TREE.  */
7377
7378 static tree
7379 native_interpret_real (tree type, unsigned char *ptr, int len)
7380 {
7381   enum machine_mode mode = TYPE_MODE (type);
7382   int total_bytes = GET_MODE_SIZE (mode);
7383   int byte, offset, word, words, bitpos;
7384   unsigned char value;
7385   /* There are always 32 bits in each long, no matter the size of
7386      the hosts long.  We handle floating point representations with
7387      up to 192 bits.  */
7388   REAL_VALUE_TYPE r;
7389   long tmp[6];
7390
7391   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7392   if (total_bytes > len || total_bytes > 24)
7393     return NULL_TREE;
7394   words = 32 / UNITS_PER_WORD;
7395
7396   memset (tmp, 0, sizeof (tmp));
7397   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7398        bitpos += BITS_PER_UNIT)
7399     {
7400       byte = (bitpos / BITS_PER_UNIT) & 3;
7401       if (UNITS_PER_WORD < 4)
7402         {
7403           word = byte / UNITS_PER_WORD;
7404           if (WORDS_BIG_ENDIAN)
7405             word = (words - 1) - word;
7406           offset = word * UNITS_PER_WORD;
7407           if (BYTES_BIG_ENDIAN)
7408             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7409           else
7410             offset += byte % UNITS_PER_WORD;
7411         }
7412       else
7413         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7414       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7415
7416       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7417     }
7418
7419   real_from_target (&r, tmp, mode);
7420   return build_real (type, r);
7421 }
7422
7423
7424 /* Subroutine of native_interpret_expr.  Interpret the contents of
7425    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7426    If the buffer cannot be interpreted, return NULL_TREE.  */
7427
7428 static tree
7429 native_interpret_complex (tree type, unsigned char *ptr, int len)
7430 {
7431   tree etype, rpart, ipart;
7432   int size;
7433
7434   etype = TREE_TYPE (type);
7435   size = GET_MODE_SIZE (TYPE_MODE (etype));
7436   if (size * 2 > len)
7437     return NULL_TREE;
7438   rpart = native_interpret_expr (etype, ptr, size);
7439   if (!rpart)
7440     return NULL_TREE;
7441   ipart = native_interpret_expr (etype, ptr+size, size);
7442   if (!ipart)
7443     return NULL_TREE;
7444   return build_complex (type, rpart, ipart);
7445 }
7446
7447
7448 /* Subroutine of native_interpret_expr.  Interpret the contents of
7449    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7450    If the buffer cannot be interpreted, return NULL_TREE.  */
7451
7452 static tree
7453 native_interpret_vector (tree type, unsigned char *ptr, int len)
7454 {
7455   tree etype, elem, elements;
7456   int i, size, count;
7457
7458   etype = TREE_TYPE (type);
7459   size = GET_MODE_SIZE (TYPE_MODE (etype));
7460   count = TYPE_VECTOR_SUBPARTS (type);
7461   if (size * count > len)
7462     return NULL_TREE;
7463
7464   elements = NULL_TREE;
7465   for (i = count - 1; i >= 0; i--)
7466     {
7467       elem = native_interpret_expr (etype, ptr+(i*size), size);
7468       if (!elem)
7469         return NULL_TREE;
7470       elements = tree_cons (NULL_TREE, elem, elements);
7471     }
7472   return build_vector (type, elements);
7473 }
7474
7475
7476 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7477    the buffer PTR of length LEN as a constant of type TYPE.  For
7478    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7479    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7480    return NULL_TREE.  */
7481
7482 tree
7483 native_interpret_expr (tree type, unsigned char *ptr, int len)
7484 {
7485   switch (TREE_CODE (type))
7486     {
7487     case INTEGER_TYPE:
7488     case ENUMERAL_TYPE:
7489     case BOOLEAN_TYPE:
7490       return native_interpret_int (type, ptr, len);
7491
7492     case REAL_TYPE:
7493       return native_interpret_real (type, ptr, len);
7494
7495     case COMPLEX_TYPE:
7496       return native_interpret_complex (type, ptr, len);
7497
7498     case VECTOR_TYPE:
7499       return native_interpret_vector (type, ptr, len);
7500
7501     default:
7502       return NULL_TREE;
7503     }
7504 }
7505
7506
7507 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7508    TYPE at compile-time.  If we're unable to perform the conversion
7509    return NULL_TREE.  */
7510
7511 static tree
7512 fold_view_convert_expr (tree type, tree expr)
7513 {
7514   /* We support up to 512-bit values (for V8DFmode).  */
7515   unsigned char buffer[64];
7516   int len;
7517
7518   /* Check that the host and target are sane.  */
7519   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7520     return NULL_TREE;
7521
7522   len = native_encode_expr (expr, buffer, sizeof (buffer));
7523   if (len == 0)
7524     return NULL_TREE;
7525
7526   return native_interpret_expr (type, buffer, len);
7527 }
7528
7529
7530 /* Fold a unary expression of code CODE and type TYPE with operand
7531    OP0.  Return the folded expression if folding is successful.
7532    Otherwise, return NULL_TREE.  */
7533
7534 tree
7535 fold_unary (enum tree_code code, tree type, tree op0)
7536 {
7537   tree tem;
7538   tree arg0;
7539   enum tree_code_class kind = TREE_CODE_CLASS (code);
7540
7541   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7542               && TREE_CODE_LENGTH (code) == 1);
7543
7544   arg0 = op0;
7545   if (arg0)
7546     {
7547       if (code == NOP_EXPR || code == CONVERT_EXPR
7548           || code == FLOAT_EXPR || code == ABS_EXPR)
7549         {
7550           /* Don't use STRIP_NOPS, because signedness of argument type
7551              matters.  */
7552           STRIP_SIGN_NOPS (arg0);
7553         }
7554       else
7555         {
7556           /* Strip any conversions that don't change the mode.  This
7557              is safe for every expression, except for a comparison
7558              expression because its signedness is derived from its
7559              operands.
7560
7561              Note that this is done as an internal manipulation within
7562              the constant folder, in order to find the simplest
7563              representation of the arguments so that their form can be
7564              studied.  In any cases, the appropriate type conversions
7565              should be put back in the tree that will get out of the
7566              constant folder.  */
7567           STRIP_NOPS (arg0);
7568         }
7569     }
7570
7571   if (TREE_CODE_CLASS (code) == tcc_unary)
7572     {
7573       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7574         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7575                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7576       else if (TREE_CODE (arg0) == COND_EXPR)
7577         {
7578           tree arg01 = TREE_OPERAND (arg0, 1);
7579           tree arg02 = TREE_OPERAND (arg0, 2);
7580           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7581             arg01 = fold_build1 (code, type, arg01);
7582           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7583             arg02 = fold_build1 (code, type, arg02);
7584           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7585                              arg01, arg02);
7586
7587           /* If this was a conversion, and all we did was to move into
7588              inside the COND_EXPR, bring it back out.  But leave it if
7589              it is a conversion from integer to integer and the
7590              result precision is no wider than a word since such a
7591              conversion is cheap and may be optimized away by combine,
7592              while it couldn't if it were outside the COND_EXPR.  Then return
7593              so we don't get into an infinite recursion loop taking the
7594              conversion out and then back in.  */
7595
7596           if ((code == NOP_EXPR || code == CONVERT_EXPR
7597                || code == NON_LVALUE_EXPR)
7598               && TREE_CODE (tem) == COND_EXPR
7599               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7600               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7601               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7602               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7603               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7604                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7605               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7606                      && (INTEGRAL_TYPE_P
7607                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7608                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7609                   || flag_syntax_only))
7610             tem = build1 (code, type,
7611                           build3 (COND_EXPR,
7612                                   TREE_TYPE (TREE_OPERAND
7613                                              (TREE_OPERAND (tem, 1), 0)),
7614                                   TREE_OPERAND (tem, 0),
7615                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7616                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7617           return tem;
7618         }
7619       else if (COMPARISON_CLASS_P (arg0))
7620         {
7621           if (TREE_CODE (type) == BOOLEAN_TYPE)
7622             {
7623               arg0 = copy_node (arg0);
7624               TREE_TYPE (arg0) = type;
7625               return arg0;
7626             }
7627           else if (TREE_CODE (type) != INTEGER_TYPE)
7628             return fold_build3 (COND_EXPR, type, arg0,
7629                                 fold_build1 (code, type,
7630                                              integer_one_node),
7631                                 fold_build1 (code, type,
7632                                              integer_zero_node));
7633         }
7634    }
7635
7636   switch (code)
7637     {
7638     case NOP_EXPR:
7639     case FLOAT_EXPR:
7640     case CONVERT_EXPR:
7641     case FIX_TRUNC_EXPR:
7642       if (TREE_TYPE (op0) == type)
7643         return op0;
7644       
7645       /* If we have (type) (a CMP b) and type is an integral type, return
7646          new expression involving the new type.  */
7647       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7648         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7649                             TREE_OPERAND (op0, 1));
7650
7651       /* Handle cases of two conversions in a row.  */
7652       if (TREE_CODE (op0) == NOP_EXPR
7653           || TREE_CODE (op0) == CONVERT_EXPR)
7654         {
7655           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7656           tree inter_type = TREE_TYPE (op0);
7657           int inside_int = INTEGRAL_TYPE_P (inside_type);
7658           int inside_ptr = POINTER_TYPE_P (inside_type);
7659           int inside_float = FLOAT_TYPE_P (inside_type);
7660           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7661           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7662           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7663           int inter_int = INTEGRAL_TYPE_P (inter_type);
7664           int inter_ptr = POINTER_TYPE_P (inter_type);
7665           int inter_float = FLOAT_TYPE_P (inter_type);
7666           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7667           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7668           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7669           int final_int = INTEGRAL_TYPE_P (type);
7670           int final_ptr = POINTER_TYPE_P (type);
7671           int final_float = FLOAT_TYPE_P (type);
7672           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7673           unsigned int final_prec = TYPE_PRECISION (type);
7674           int final_unsignedp = TYPE_UNSIGNED (type);
7675
7676           /* In addition to the cases of two conversions in a row
7677              handled below, if we are converting something to its own
7678              type via an object of identical or wider precision, neither
7679              conversion is needed.  */
7680           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7681               && (((inter_int || inter_ptr) && final_int)
7682                   || (inter_float && final_float))
7683               && inter_prec >= final_prec)
7684             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7685
7686           /* Likewise, if the intermediate and final types are either both
7687              float or both integer, we don't need the middle conversion if
7688              it is wider than the final type and doesn't change the signedness
7689              (for integers).  Avoid this if the final type is a pointer
7690              since then we sometimes need the inner conversion.  Likewise if
7691              the outer has a precision not equal to the size of its mode.  */
7692           if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
7693                || (inter_float && inside_float)
7694                || (inter_vec && inside_vec))
7695               && inter_prec >= inside_prec
7696               && (inter_float || inter_vec
7697                   || inter_unsignedp == inside_unsignedp)
7698               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7699                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7700               && ! final_ptr
7701               && (! final_vec || inter_prec == inside_prec))
7702             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7703
7704           /* If we have a sign-extension of a zero-extended value, we can
7705              replace that by a single zero-extension.  */
7706           if (inside_int && inter_int && final_int
7707               && inside_prec < inter_prec && inter_prec < final_prec
7708               && inside_unsignedp && !inter_unsignedp)
7709             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7710
7711           /* Two conversions in a row are not needed unless:
7712              - some conversion is floating-point (overstrict for now), or
7713              - some conversion is a vector (overstrict for now), or
7714              - the intermediate type is narrower than both initial and
7715                final, or
7716              - the intermediate type and innermost type differ in signedness,
7717                and the outermost type is wider than the intermediate, or
7718              - the initial type is a pointer type and the precisions of the
7719                intermediate and final types differ, or
7720              - the final type is a pointer type and the precisions of the
7721                initial and intermediate types differ.
7722              - the final type is a pointer type and the initial type not
7723              - the initial type is a pointer to an array and the final type
7724                not.  */
7725           if (! inside_float && ! inter_float && ! final_float
7726               && ! inside_vec && ! inter_vec && ! final_vec
7727               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7728               && ! (inside_int && inter_int
7729                     && inter_unsignedp != inside_unsignedp
7730                     && inter_prec < final_prec)
7731               && ((inter_unsignedp && inter_prec > inside_prec)
7732                   == (final_unsignedp && final_prec > inter_prec))
7733               && ! (inside_ptr && inter_prec != final_prec)
7734               && ! (final_ptr && inside_prec != inter_prec)
7735               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7736                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7737               && final_ptr == inside_ptr
7738               && ! (inside_ptr
7739                     && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
7740                     && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
7741             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7742         }
7743
7744       /* Handle (T *)&A.B.C for A being of type T and B and C
7745          living at offset zero.  This occurs frequently in
7746          C++ upcasting and then accessing the base.  */
7747       if (TREE_CODE (op0) == ADDR_EXPR
7748           && POINTER_TYPE_P (type)
7749           && handled_component_p (TREE_OPERAND (op0, 0)))
7750         {
7751           HOST_WIDE_INT bitsize, bitpos;
7752           tree offset;
7753           enum machine_mode mode;
7754           int unsignedp, volatilep;
7755           tree base = TREE_OPERAND (op0, 0);
7756           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7757                                       &mode, &unsignedp, &volatilep, false);
7758           /* If the reference was to a (constant) zero offset, we can use
7759              the address of the base if it has the same base type
7760              as the result type.  */
7761           if (! offset && bitpos == 0
7762               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7763                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7764             return fold_convert (type, build_fold_addr_expr (base));
7765         }
7766
7767       if ((TREE_CODE (op0) == MODIFY_EXPR
7768            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7769           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7770           /* Detect assigning a bitfield.  */
7771           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7772                && DECL_BIT_FIELD
7773                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7774         {
7775           /* Don't leave an assignment inside a conversion
7776              unless assigning a bitfield.  */
7777           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7778           /* First do the assignment, then return converted constant.  */
7779           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7780           TREE_NO_WARNING (tem) = 1;
7781           TREE_USED (tem) = 1;
7782           return tem;
7783         }
7784
7785       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7786          constants (if x has signed type, the sign bit cannot be set
7787          in c).  This folds extension into the BIT_AND_EXPR.  */
7788       if (INTEGRAL_TYPE_P (type)
7789           && TREE_CODE (type) != BOOLEAN_TYPE
7790           && TREE_CODE (op0) == BIT_AND_EXPR
7791           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7792         {
7793           tree and = op0;
7794           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7795           int change = 0;
7796
7797           if (TYPE_UNSIGNED (TREE_TYPE (and))
7798               || (TYPE_PRECISION (type)
7799                   <= TYPE_PRECISION (TREE_TYPE (and))))
7800             change = 1;
7801           else if (TYPE_PRECISION (TREE_TYPE (and1))
7802                    <= HOST_BITS_PER_WIDE_INT
7803                    && host_integerp (and1, 1))
7804             {
7805               unsigned HOST_WIDE_INT cst;
7806
7807               cst = tree_low_cst (and1, 1);
7808               cst &= (HOST_WIDE_INT) -1
7809                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7810               change = (cst == 0);
7811 #ifdef LOAD_EXTEND_OP
7812               if (change
7813                   && !flag_syntax_only
7814                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7815                       == ZERO_EXTEND))
7816                 {
7817                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7818                   and0 = fold_convert (uns, and0);
7819                   and1 = fold_convert (uns, and1);
7820                 }
7821 #endif
7822             }
7823           if (change)
7824             {
7825               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7826                                            TREE_INT_CST_HIGH (and1), 0,
7827                                            TREE_OVERFLOW (and1));
7828               return fold_build2 (BIT_AND_EXPR, type,
7829                                   fold_convert (type, and0), tem);
7830             }
7831         }
7832
7833       /* Convert (T1)(X op Y) into ((T1)X op (T1)Y), for pointer type,
7834          when one of the new casts will fold away. Conservatively we assume
7835          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST.  */
7836       if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE (arg0))
7837           && BINARY_CLASS_P (arg0)
7838           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7839               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7840               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7841         {
7842           tree arg00 = TREE_OPERAND (arg0, 0);
7843           tree arg01 = TREE_OPERAND (arg0, 1);
7844
7845           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7846                               fold_convert (type, arg01));
7847         }
7848
7849       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7850          of the same precision, and X is an integer type not narrower than
7851          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7852       if (INTEGRAL_TYPE_P (type)
7853           && TREE_CODE (op0) == BIT_NOT_EXPR
7854           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7855           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7856               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7857           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7858         {
7859           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7860           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7861               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7862             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7863         }
7864
7865       tem = fold_convert_const (code, type, op0);
7866       return tem ? tem : NULL_TREE;
7867
7868     case VIEW_CONVERT_EXPR:
7869       if (TREE_TYPE (op0) == type)
7870         return op0;
7871       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7872         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7873       return fold_view_convert_expr (type, op0);
7874
7875     case NEGATE_EXPR:
7876       tem = fold_negate_expr (arg0);
7877       if (tem)
7878         return fold_convert (type, tem);
7879       return NULL_TREE;
7880
7881     case ABS_EXPR:
7882       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7883         return fold_abs_const (arg0, type);
7884       else if (TREE_CODE (arg0) == NEGATE_EXPR)
7885         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7886       /* Convert fabs((double)float) into (double)fabsf(float).  */
7887       else if (TREE_CODE (arg0) == NOP_EXPR
7888                && TREE_CODE (type) == REAL_TYPE)
7889         {
7890           tree targ0 = strip_float_extensions (arg0);
7891           if (targ0 != arg0)
7892             return fold_convert (type, fold_build1 (ABS_EXPR,
7893                                                     TREE_TYPE (targ0),
7894                                                     targ0));
7895         }
7896       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
7897       else if (TREE_CODE (arg0) == ABS_EXPR)
7898         return arg0;
7899       else if (tree_expr_nonnegative_p (arg0))
7900         return arg0;
7901
7902       /* Strip sign ops from argument.  */
7903       if (TREE_CODE (type) == REAL_TYPE)
7904         {
7905           tem = fold_strip_sign_ops (arg0);
7906           if (tem)
7907             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7908         }
7909       return NULL_TREE;
7910
7911     case CONJ_EXPR:
7912       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7913         return fold_convert (type, arg0);
7914       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7915         {
7916           tree itype = TREE_TYPE (type);
7917           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
7918           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
7919           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
7920         }
7921       if (TREE_CODE (arg0) == COMPLEX_CST)
7922         {
7923           tree itype = TREE_TYPE (type);
7924           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
7925           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
7926           return build_complex (type, rpart, negate_expr (ipart));
7927         }
7928       if (TREE_CODE (arg0) == CONJ_EXPR)
7929         return fold_convert (type, TREE_OPERAND (arg0, 0));
7930       return NULL_TREE;
7931
7932     case BIT_NOT_EXPR:
7933       if (TREE_CODE (arg0) == INTEGER_CST)
7934         return fold_not_const (arg0, type);
7935       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7936         return TREE_OPERAND (arg0, 0);
7937       /* Convert ~ (-A) to A - 1.  */
7938       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7939         return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7940                             build_int_cst (type, 1));
7941       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
7942       else if (INTEGRAL_TYPE_P (type)
7943                && ((TREE_CODE (arg0) == MINUS_EXPR
7944                     && integer_onep (TREE_OPERAND (arg0, 1)))
7945                    || (TREE_CODE (arg0) == PLUS_EXPR
7946                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7947         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7948       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
7949       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7950                && (tem = fold_unary (BIT_NOT_EXPR, type,
7951                                      fold_convert (type,
7952                                                    TREE_OPERAND (arg0, 0)))))
7953         return fold_build2 (BIT_XOR_EXPR, type, tem,
7954                             fold_convert (type, TREE_OPERAND (arg0, 1)));
7955       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7956                && (tem = fold_unary (BIT_NOT_EXPR, type,
7957                                      fold_convert (type,
7958                                                    TREE_OPERAND (arg0, 1)))))
7959         return fold_build2 (BIT_XOR_EXPR, type,
7960                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
7961
7962       return NULL_TREE;
7963
7964     case TRUTH_NOT_EXPR:
7965       /* The argument to invert_truthvalue must have Boolean type.  */
7966       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7967           arg0 = fold_convert (boolean_type_node, arg0);
7968
7969       /* Note that the operand of this must be an int
7970          and its values must be 0 or 1.
7971          ("true" is a fixed value perhaps depending on the language,
7972          but we don't handle values other than 1 correctly yet.)  */
7973       tem = fold_truth_not_expr (arg0);
7974       if (!tem)
7975         return NULL_TREE;
7976       return fold_convert (type, tem);
7977
7978     case REALPART_EXPR:
7979       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7980         return fold_convert (type, arg0);
7981       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7982         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7983                                  TREE_OPERAND (arg0, 1));
7984       if (TREE_CODE (arg0) == COMPLEX_CST)
7985         return fold_convert (type, TREE_REALPART (arg0));
7986       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7987         {
7988           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7989           tem = fold_build2 (TREE_CODE (arg0), itype,
7990                              fold_build1 (REALPART_EXPR, itype,
7991                                           TREE_OPERAND (arg0, 0)),
7992                              fold_build1 (REALPART_EXPR, itype,
7993                                           TREE_OPERAND (arg0, 1)));
7994           return fold_convert (type, tem);
7995         }
7996       if (TREE_CODE (arg0) == CONJ_EXPR)
7997         {
7998           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7999           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8000           return fold_convert (type, tem);
8001         }
8002       if (TREE_CODE (arg0) == CALL_EXPR)
8003         {
8004           tree fn = get_callee_fndecl (arg0);
8005           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8006             switch (DECL_FUNCTION_CODE (fn))
8007               {
8008               CASE_FLT_FN (BUILT_IN_CEXPI):
8009                 fn = mathfn_built_in (type, BUILT_IN_COS);
8010                 if (fn)
8011                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8012                 break;
8013
8014               default:
8015                 break;
8016               }
8017         }
8018       return NULL_TREE;
8019
8020     case IMAGPART_EXPR:
8021       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8022         return fold_convert (type, integer_zero_node);
8023       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8024         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8025                                  TREE_OPERAND (arg0, 0));
8026       if (TREE_CODE (arg0) == COMPLEX_CST)
8027         return fold_convert (type, TREE_IMAGPART (arg0));
8028       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8029         {
8030           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8031           tem = fold_build2 (TREE_CODE (arg0), itype,
8032                              fold_build1 (IMAGPART_EXPR, itype,
8033                                           TREE_OPERAND (arg0, 0)),
8034                              fold_build1 (IMAGPART_EXPR, itype,
8035                                           TREE_OPERAND (arg0, 1)));
8036           return fold_convert (type, tem);
8037         }
8038       if (TREE_CODE (arg0) == CONJ_EXPR)
8039         {
8040           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8041           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8042           return fold_convert (type, negate_expr (tem));
8043         }
8044       if (TREE_CODE (arg0) == CALL_EXPR)
8045         {
8046           tree fn = get_callee_fndecl (arg0);
8047           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8048             switch (DECL_FUNCTION_CODE (fn))
8049               {
8050               CASE_FLT_FN (BUILT_IN_CEXPI):
8051                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8052                 if (fn)
8053                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8054                 break;
8055
8056               default:
8057                 break;
8058               }
8059         }
8060       return NULL_TREE;
8061
8062     default:
8063       return NULL_TREE;
8064     } /* switch (code) */
8065 }
8066
8067 /* Fold a binary expression of code CODE and type TYPE with operands
8068    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8069    Return the folded expression if folding is successful.  Otherwise,
8070    return NULL_TREE.  */
8071
8072 static tree
8073 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8074 {
8075   enum tree_code compl_code;
8076
8077   if (code == MIN_EXPR)
8078     compl_code = MAX_EXPR;
8079   else if (code == MAX_EXPR)
8080     compl_code = MIN_EXPR;
8081   else
8082     gcc_unreachable ();
8083
8084   /* MIN (MAX (a, b), b) == b.  */
8085   if (TREE_CODE (op0) == compl_code
8086       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8087     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8088
8089   /* MIN (MAX (b, a), b) == b.  */
8090   if (TREE_CODE (op0) == compl_code
8091       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8092       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8093     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8094
8095   /* MIN (a, MAX (a, b)) == a.  */
8096   if (TREE_CODE (op1) == compl_code
8097       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8098       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8099     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8100
8101   /* MIN (a, MAX (b, a)) == a.  */
8102   if (TREE_CODE (op1) == compl_code
8103       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8104       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8105     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8106
8107   return NULL_TREE;
8108 }
8109
8110 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8111    by changing CODE to reduce the magnitude of constants involved in
8112    ARG0 of the comparison.
8113    Returns a canonicalized comparison tree if a simplification was
8114    possible, otherwise returns NULL_TREE.
8115    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8116    valid if signed overflow is undefined.  */
8117
8118 static tree
8119 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8120                                  tree arg0, tree arg1,
8121                                  bool *strict_overflow_p)
8122 {
8123   enum tree_code code0 = TREE_CODE (arg0);
8124   tree t, cst0 = NULL_TREE;
8125   int sgn0;
8126   bool swap = false;
8127
8128   /* Match A +- CST code arg1 and CST code arg1.  */
8129   if (!(((code0 == MINUS_EXPR
8130           || code0 == PLUS_EXPR)
8131          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8132         || code0 == INTEGER_CST))
8133     return NULL_TREE;
8134
8135   /* Identify the constant in arg0 and its sign.  */
8136   if (code0 == INTEGER_CST)
8137     cst0 = arg0;
8138   else
8139     cst0 = TREE_OPERAND (arg0, 1);
8140   sgn0 = tree_int_cst_sgn (cst0);
8141
8142   /* Overflowed constants and zero will cause problems.  */
8143   if (integer_zerop (cst0)
8144       || TREE_OVERFLOW (cst0))
8145     return NULL_TREE;
8146
8147   /* See if we can reduce the magnitude of the constant in
8148      arg0 by changing the comparison code.  */
8149   if (code0 == INTEGER_CST)
8150     {
8151       /* CST <= arg1  ->  CST-1 < arg1.  */
8152       if (code == LE_EXPR && sgn0 == 1)
8153         code = LT_EXPR;
8154       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8155       else if (code == LT_EXPR && sgn0 == -1)
8156         code = LE_EXPR;
8157       /* CST > arg1  ->  CST-1 >= arg1.  */
8158       else if (code == GT_EXPR && sgn0 == 1)
8159         code = GE_EXPR;
8160       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8161       else if (code == GE_EXPR && sgn0 == -1)
8162         code = GT_EXPR;
8163       else
8164         return NULL_TREE;
8165       /* arg1 code' CST' might be more canonical.  */
8166       swap = true;
8167     }
8168   else
8169     {
8170       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8171       if (code == LT_EXPR
8172           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8173         code = LE_EXPR;
8174       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8175       else if (code == GT_EXPR
8176                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8177         code = GE_EXPR;
8178       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8179       else if (code == LE_EXPR
8180                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8181         code = LT_EXPR;
8182       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8183       else if (code == GE_EXPR
8184                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8185         code = GT_EXPR;
8186       else
8187         return NULL_TREE;
8188       *strict_overflow_p = true;
8189     }
8190
8191   /* Now build the constant reduced in magnitude.  */
8192   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8193                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8194   if (code0 != INTEGER_CST)
8195     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8196
8197   /* If swapping might yield to a more canonical form, do so.  */
8198   if (swap)
8199     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8200   else
8201     return fold_build2 (code, type, t, arg1);
8202 }
8203
8204 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8205    overflow further.  Try to decrease the magnitude of constants involved
8206    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8207    and put sole constants at the second argument position.
8208    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8209
8210 static tree
8211 maybe_canonicalize_comparison (enum tree_code code, tree type,
8212                                tree arg0, tree arg1)
8213 {
8214   tree t;
8215   bool strict_overflow_p;
8216   const char * const warnmsg = G_("assuming signed overflow does not occur "
8217                                   "when reducing constant in comparison");
8218
8219   /* In principle pointers also have undefined overflow behavior,
8220      but that causes problems elsewhere.  */
8221   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8222       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8223     return NULL_TREE;
8224
8225   /* Try canonicalization by simplifying arg0.  */
8226   strict_overflow_p = false;
8227   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8228                                        &strict_overflow_p);
8229   if (t)
8230     {
8231       if (strict_overflow_p)
8232         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8233       return t;
8234     }
8235
8236   /* Try canonicalization by simplifying arg1 using the swapped
8237      comparison.  */
8238   code = swap_tree_comparison (code);
8239   strict_overflow_p = false;
8240   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8241                                        &strict_overflow_p);
8242   if (t && strict_overflow_p)
8243     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8244   return t;
8245 }
8246
8247 /* Subroutine of fold_binary.  This routine performs all of the
8248    transformations that are common to the equality/inequality
8249    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8250    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8251    fold_binary should call fold_binary.  Fold a comparison with
8252    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8253    the folded comparison or NULL_TREE.  */
8254
8255 static tree
8256 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8257 {
8258   tree arg0, arg1, tem;
8259
8260   arg0 = op0;
8261   arg1 = op1;
8262
8263   STRIP_SIGN_NOPS (arg0);
8264   STRIP_SIGN_NOPS (arg1);
8265
8266   tem = fold_relational_const (code, type, arg0, arg1);
8267   if (tem != NULL_TREE)
8268     return tem;
8269
8270   /* If one arg is a real or integer constant, put it last.  */
8271   if (tree_swap_operands_p (arg0, arg1, true))
8272     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8273
8274   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8275   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8276       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8277           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8278           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8279       && (TREE_CODE (arg1) == INTEGER_CST
8280           && !TREE_OVERFLOW (arg1)))
8281     {
8282       tree const1 = TREE_OPERAND (arg0, 1);
8283       tree const2 = arg1;
8284       tree variable = TREE_OPERAND (arg0, 0);
8285       tree lhs;
8286       int lhs_add;
8287       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8288
8289       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8290                          TREE_TYPE (arg1), const2, const1);
8291
8292       /* If the constant operation overflowed this can be
8293          simplified as a comparison against INT_MAX/INT_MIN.  */
8294       if (TREE_CODE (lhs) == INTEGER_CST
8295           && TREE_OVERFLOW (lhs))
8296         {
8297           int const1_sgn = tree_int_cst_sgn (const1);
8298           enum tree_code code2 = code;
8299
8300           /* Get the sign of the constant on the lhs if the
8301              operation were VARIABLE + CONST1.  */
8302           if (TREE_CODE (arg0) == MINUS_EXPR)
8303             const1_sgn = -const1_sgn;
8304
8305           /* The sign of the constant determines if we overflowed
8306              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8307              Canonicalize to the INT_MIN overflow by swapping the comparison
8308              if necessary.  */
8309           if (const1_sgn == -1)
8310             code2 = swap_tree_comparison (code);
8311
8312           /* We now can look at the canonicalized case
8313                VARIABLE + 1  CODE2  INT_MIN
8314              and decide on the result.  */
8315           if (code2 == LT_EXPR
8316               || code2 == LE_EXPR
8317               || code2 == EQ_EXPR)
8318             return omit_one_operand (type, boolean_false_node, variable);
8319           else if (code2 == NE_EXPR
8320                    || code2 == GE_EXPR
8321                    || code2 == GT_EXPR)
8322             return omit_one_operand (type, boolean_true_node, variable);
8323         }
8324
8325       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8326           && (TREE_CODE (lhs) != INTEGER_CST
8327               || !TREE_OVERFLOW (lhs)))
8328         {
8329           fold_overflow_warning (("assuming signed overflow does not occur "
8330                                   "when changing X +- C1 cmp C2 to "
8331                                   "X cmp C1 +- C2"),
8332                                  WARN_STRICT_OVERFLOW_COMPARISON);
8333           return fold_build2 (code, type, variable, lhs);
8334         }
8335     }
8336
8337   /* For comparisons of pointers we can decompose it to a compile time
8338      comparison of the base objects and the offsets into the object.
8339      This requires at least one operand being an ADDR_EXPR to do more
8340      than the operand_equal_p test below.  */
8341   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8342       && (TREE_CODE (arg0) == ADDR_EXPR
8343           || TREE_CODE (arg1) == ADDR_EXPR))
8344     {
8345       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8346       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8347       enum machine_mode mode;
8348       int volatilep, unsignedp;
8349       bool indirect_base0 = false;
8350
8351       /* Get base and offset for the access.  Strip ADDR_EXPR for
8352          get_inner_reference, but put it back by stripping INDIRECT_REF
8353          off the base object if possible.  */
8354       base0 = arg0;
8355       if (TREE_CODE (arg0) == ADDR_EXPR)
8356         {
8357           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8358                                        &bitsize, &bitpos0, &offset0, &mode,
8359                                        &unsignedp, &volatilep, false);
8360           if (TREE_CODE (base0) == INDIRECT_REF)
8361             base0 = TREE_OPERAND (base0, 0);
8362           else
8363             indirect_base0 = true;
8364         }
8365
8366       base1 = arg1;
8367       if (TREE_CODE (arg1) == ADDR_EXPR)
8368         {
8369           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8370                                        &bitsize, &bitpos1, &offset1, &mode,
8371                                        &unsignedp, &volatilep, false);
8372           /* We have to make sure to have an indirect/non-indirect base1
8373              just the same as we did for base0.  */
8374           if (TREE_CODE (base1) == INDIRECT_REF
8375               && !indirect_base0)
8376             base1 = TREE_OPERAND (base1, 0);
8377           else if (!indirect_base0)
8378             base1 = NULL_TREE;
8379         }
8380       else if (indirect_base0)
8381         base1 = NULL_TREE;
8382
8383       /* If we have equivalent bases we might be able to simplify.  */
8384       if (base0 && base1
8385           && operand_equal_p (base0, base1, 0))
8386         {
8387           /* We can fold this expression to a constant if the non-constant
8388              offset parts are equal.  */
8389           if (offset0 == offset1
8390               || (offset0 && offset1
8391                   && operand_equal_p (offset0, offset1, 0)))
8392             {
8393               switch (code)
8394                 {
8395                 case EQ_EXPR:
8396                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8397                 case NE_EXPR:
8398                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8399                 case LT_EXPR:
8400                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8401                 case LE_EXPR:
8402                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8403                 case GE_EXPR:
8404                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8405                 case GT_EXPR:
8406                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8407                 default:;
8408                 }
8409             }
8410           /* We can simplify the comparison to a comparison of the variable
8411              offset parts if the constant offset parts are equal.
8412              Be careful to use signed size type here because otherwise we
8413              mess with array offsets in the wrong way.  This is possible
8414              because pointer arithmetic is restricted to retain within an
8415              object and overflow on pointer differences is undefined as of
8416              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8417           else if (bitpos0 == bitpos1)
8418             {
8419               tree signed_size_type_node;
8420               signed_size_type_node = signed_type_for (size_type_node);
8421
8422               /* By converting to signed size type we cover middle-end pointer
8423                  arithmetic which operates on unsigned pointer types of size
8424                  type size and ARRAY_REF offsets which are properly sign or
8425                  zero extended from their type in case it is narrower than
8426                  size type.  */
8427               if (offset0 == NULL_TREE)
8428                 offset0 = build_int_cst (signed_size_type_node, 0);
8429               else
8430                 offset0 = fold_convert (signed_size_type_node, offset0);
8431               if (offset1 == NULL_TREE)
8432                 offset1 = build_int_cst (signed_size_type_node, 0);
8433               else
8434                 offset1 = fold_convert (signed_size_type_node, offset1);
8435
8436               return fold_build2 (code, type, offset0, offset1);
8437             }
8438         }
8439     }
8440
8441   /* If this is a comparison of two exprs that look like an ARRAY_REF of the
8442      same object, then we can fold this to a comparison of the two offsets in
8443      signed size type.  This is possible because pointer arithmetic is
8444      restricted to retain within an object and overflow on pointer differences
8445      is undefined as of 6.5.6/8 and /9 with respect to the signed ptrdiff_t.
8446
8447      We check flag_wrapv directly because pointers types are unsigned,
8448      and therefore TYPE_OVERFLOW_WRAPS returns true for them.  That is
8449      normally what we want to avoid certain odd overflow cases, but
8450      not here.  */
8451   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8452       && !flag_wrapv
8453       && !TYPE_OVERFLOW_TRAPS (TREE_TYPE (arg0)))
8454     {
8455       tree base0, offset0, base1, offset1;
8456
8457       if (extract_array_ref (arg0, &base0, &offset0)
8458           && extract_array_ref (arg1, &base1, &offset1)
8459           && operand_equal_p (base0, base1, 0))
8460         {
8461           tree signed_size_type_node;
8462           signed_size_type_node = signed_type_for (size_type_node);
8463
8464           /* By converting to signed size type we cover middle-end pointer
8465              arithmetic which operates on unsigned pointer types of size
8466              type size and ARRAY_REF offsets which are properly sign or
8467              zero extended from their type in case it is narrower than
8468              size type.  */
8469           if (offset0 == NULL_TREE)
8470             offset0 = build_int_cst (signed_size_type_node, 0);
8471           else
8472             offset0 = fold_convert (signed_size_type_node, offset0);
8473           if (offset1 == NULL_TREE)
8474             offset1 = build_int_cst (signed_size_type_node, 0);
8475           else
8476             offset1 = fold_convert (signed_size_type_node, offset1);
8477
8478           return fold_build2 (code, type, offset0, offset1);
8479         }
8480     }
8481
8482   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8483      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8484      the resulting offset is smaller in absolute value than the
8485      original one.  */
8486   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8487       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8488       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8489           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8490       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8491       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8492           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8493     {
8494       tree const1 = TREE_OPERAND (arg0, 1);
8495       tree const2 = TREE_OPERAND (arg1, 1);
8496       tree variable1 = TREE_OPERAND (arg0, 0);
8497       tree variable2 = TREE_OPERAND (arg1, 0);
8498       tree cst;
8499       const char * const warnmsg = G_("assuming signed overflow does not "
8500                                       "occur when combining constants around "
8501                                       "a comparison");
8502
8503       /* Put the constant on the side where it doesn't overflow and is
8504          of lower absolute value than before.  */
8505       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8506                              ? MINUS_EXPR : PLUS_EXPR,
8507                              const2, const1, 0);
8508       if (!TREE_OVERFLOW (cst)
8509           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8510         {
8511           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8512           return fold_build2 (code, type,
8513                               variable1,
8514                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8515                                            variable2, cst));
8516         }
8517
8518       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8519                              ? MINUS_EXPR : PLUS_EXPR,
8520                              const1, const2, 0);
8521       if (!TREE_OVERFLOW (cst)
8522           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8523         {
8524           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8525           return fold_build2 (code, type,
8526                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8527                                            variable1, cst),
8528                               variable2);
8529         }
8530     }
8531
8532   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8533      signed arithmetic case.  That form is created by the compiler
8534      often enough for folding it to be of value.  One example is in
8535      computing loop trip counts after Operator Strength Reduction.  */
8536   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8537       && TREE_CODE (arg0) == MULT_EXPR
8538       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8539           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8540       && integer_zerop (arg1))
8541     {
8542       tree const1 = TREE_OPERAND (arg0, 1);
8543       tree const2 = arg1;                       /* zero */
8544       tree variable1 = TREE_OPERAND (arg0, 0);
8545       enum tree_code cmp_code = code;
8546
8547       gcc_assert (!integer_zerop (const1));
8548
8549       fold_overflow_warning (("assuming signed overflow does not occur when "
8550                               "eliminating multiplication in comparison "
8551                               "with zero"),
8552                              WARN_STRICT_OVERFLOW_COMPARISON);
8553
8554       /* If const1 is negative we swap the sense of the comparison.  */
8555       if (tree_int_cst_sgn (const1) < 0)
8556         cmp_code = swap_tree_comparison (cmp_code);
8557
8558       return fold_build2 (cmp_code, type, variable1, const2);
8559     }
8560
8561   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8562   if (tem)
8563     return tem;
8564
8565   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8566     {
8567       tree targ0 = strip_float_extensions (arg0);
8568       tree targ1 = strip_float_extensions (arg1);
8569       tree newtype = TREE_TYPE (targ0);
8570
8571       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8572         newtype = TREE_TYPE (targ1);
8573
8574       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8575       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8576         return fold_build2 (code, type, fold_convert (newtype, targ0),
8577                             fold_convert (newtype, targ1));
8578
8579       /* (-a) CMP (-b) -> b CMP a  */
8580       if (TREE_CODE (arg0) == NEGATE_EXPR
8581           && TREE_CODE (arg1) == NEGATE_EXPR)
8582         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8583                             TREE_OPERAND (arg0, 0));
8584
8585       if (TREE_CODE (arg1) == REAL_CST)
8586         {
8587           REAL_VALUE_TYPE cst;
8588           cst = TREE_REAL_CST (arg1);
8589
8590           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8591           if (TREE_CODE (arg0) == NEGATE_EXPR)
8592             return fold_build2 (swap_tree_comparison (code), type,
8593                                 TREE_OPERAND (arg0, 0),
8594                                 build_real (TREE_TYPE (arg1),
8595                                             REAL_VALUE_NEGATE (cst)));
8596
8597           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8598           /* a CMP (-0) -> a CMP 0  */
8599           if (REAL_VALUE_MINUS_ZERO (cst))
8600             return fold_build2 (code, type, arg0,
8601                                 build_real (TREE_TYPE (arg1), dconst0));
8602
8603           /* x != NaN is always true, other ops are always false.  */
8604           if (REAL_VALUE_ISNAN (cst)
8605               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8606             {
8607               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8608               return omit_one_operand (type, tem, arg0);
8609             }
8610
8611           /* Fold comparisons against infinity.  */
8612           if (REAL_VALUE_ISINF (cst))
8613             {
8614               tem = fold_inf_compare (code, type, arg0, arg1);
8615               if (tem != NULL_TREE)
8616                 return tem;
8617             }
8618         }
8619
8620       /* If this is a comparison of a real constant with a PLUS_EXPR
8621          or a MINUS_EXPR of a real constant, we can convert it into a
8622          comparison with a revised real constant as long as no overflow
8623          occurs when unsafe_math_optimizations are enabled.  */
8624       if (flag_unsafe_math_optimizations
8625           && TREE_CODE (arg1) == REAL_CST
8626           && (TREE_CODE (arg0) == PLUS_EXPR
8627               || TREE_CODE (arg0) == MINUS_EXPR)
8628           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8629           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8630                                       ? MINUS_EXPR : PLUS_EXPR,
8631                                       arg1, TREE_OPERAND (arg0, 1), 0))
8632           && !TREE_OVERFLOW (tem))
8633         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8634
8635       /* Likewise, we can simplify a comparison of a real constant with
8636          a MINUS_EXPR whose first operand is also a real constant, i.e.
8637          (c1 - x) < c2 becomes x > c1-c2.  */
8638       if (flag_unsafe_math_optimizations
8639           && TREE_CODE (arg1) == REAL_CST
8640           && TREE_CODE (arg0) == MINUS_EXPR
8641           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8642           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8643                                       arg1, 0))
8644           && !TREE_OVERFLOW (tem))
8645         return fold_build2 (swap_tree_comparison (code), type,
8646                             TREE_OPERAND (arg0, 1), tem);
8647
8648       /* Fold comparisons against built-in math functions.  */
8649       if (TREE_CODE (arg1) == REAL_CST
8650           && flag_unsafe_math_optimizations
8651           && ! flag_errno_math)
8652         {
8653           enum built_in_function fcode = builtin_mathfn_code (arg0);
8654
8655           if (fcode != END_BUILTINS)
8656             {
8657               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8658               if (tem != NULL_TREE)
8659                 return tem;
8660             }
8661         }
8662     }
8663
8664   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8665       && (TREE_CODE (arg0) == NOP_EXPR
8666           || TREE_CODE (arg0) == CONVERT_EXPR))
8667     {
8668       /* If we are widening one operand of an integer comparison,
8669          see if the other operand is similarly being widened.  Perhaps we
8670          can do the comparison in the narrower type.  */
8671       tem = fold_widened_comparison (code, type, arg0, arg1);
8672       if (tem)
8673         return tem;
8674
8675       /* Or if we are changing signedness.  */
8676       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8677       if (tem)
8678         return tem;
8679     }
8680
8681   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8682      constant, we can simplify it.  */
8683   if (TREE_CODE (arg1) == INTEGER_CST
8684       && (TREE_CODE (arg0) == MIN_EXPR
8685           || TREE_CODE (arg0) == MAX_EXPR)
8686       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8687     {
8688       tem = optimize_minmax_comparison (code, type, op0, op1);
8689       if (tem)
8690         return tem;
8691     }
8692
8693   /* Simplify comparison of something with itself.  (For IEEE
8694      floating-point, we can only do some of these simplifications.)  */
8695   if (operand_equal_p (arg0, arg1, 0))
8696     {
8697       switch (code)
8698         {
8699         case EQ_EXPR:
8700           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8701               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8702             return constant_boolean_node (1, type);
8703           break;
8704
8705         case GE_EXPR:
8706         case LE_EXPR:
8707           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8708               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8709             return constant_boolean_node (1, type);
8710           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8711
8712         case NE_EXPR:
8713           /* For NE, we can only do this simplification if integer
8714              or we don't honor IEEE floating point NaNs.  */
8715           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8716               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8717             break;
8718           /* ... fall through ...  */
8719         case GT_EXPR:
8720         case LT_EXPR:
8721           return constant_boolean_node (0, type);
8722         default:
8723           gcc_unreachable ();
8724         }
8725     }
8726
8727   /* If we are comparing an expression that just has comparisons
8728      of two integer values, arithmetic expressions of those comparisons,
8729      and constants, we can simplify it.  There are only three cases
8730      to check: the two values can either be equal, the first can be
8731      greater, or the second can be greater.  Fold the expression for
8732      those three values.  Since each value must be 0 or 1, we have
8733      eight possibilities, each of which corresponds to the constant 0
8734      or 1 or one of the six possible comparisons.
8735
8736      This handles common cases like (a > b) == 0 but also handles
8737      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8738      occur in macroized code.  */
8739
8740   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8741     {
8742       tree cval1 = 0, cval2 = 0;
8743       int save_p = 0;
8744
8745       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8746           /* Don't handle degenerate cases here; they should already
8747              have been handled anyway.  */
8748           && cval1 != 0 && cval2 != 0
8749           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8750           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8751           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8752           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8753           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8754           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8755                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8756         {
8757           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8758           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8759
8760           /* We can't just pass T to eval_subst in case cval1 or cval2
8761              was the same as ARG1.  */
8762
8763           tree high_result
8764                 = fold_build2 (code, type,
8765                                eval_subst (arg0, cval1, maxval,
8766                                            cval2, minval),
8767                                arg1);
8768           tree equal_result
8769                 = fold_build2 (code, type,
8770                                eval_subst (arg0, cval1, maxval,
8771                                            cval2, maxval),
8772                                arg1);
8773           tree low_result
8774                 = fold_build2 (code, type,
8775                                eval_subst (arg0, cval1, minval,
8776                                            cval2, maxval),
8777                                arg1);
8778
8779           /* All three of these results should be 0 or 1.  Confirm they are.
8780              Then use those values to select the proper code to use.  */
8781
8782           if (TREE_CODE (high_result) == INTEGER_CST
8783               && TREE_CODE (equal_result) == INTEGER_CST
8784               && TREE_CODE (low_result) == INTEGER_CST)
8785             {
8786               /* Make a 3-bit mask with the high-order bit being the
8787                  value for `>', the next for '=', and the low for '<'.  */
8788               switch ((integer_onep (high_result) * 4)
8789                       + (integer_onep (equal_result) * 2)
8790                       + integer_onep (low_result))
8791                 {
8792                 case 0:
8793                   /* Always false.  */
8794                   return omit_one_operand (type, integer_zero_node, arg0);
8795                 case 1:
8796                   code = LT_EXPR;
8797                   break;
8798                 case 2:
8799                   code = EQ_EXPR;
8800                   break;
8801                 case 3:
8802                   code = LE_EXPR;
8803                   break;
8804                 case 4:
8805                   code = GT_EXPR;
8806                   break;
8807                 case 5:
8808                   code = NE_EXPR;
8809                   break;
8810                 case 6:
8811                   code = GE_EXPR;
8812                   break;
8813                 case 7:
8814                   /* Always true.  */
8815                   return omit_one_operand (type, integer_one_node, arg0);
8816                 }
8817
8818               if (save_p)
8819                 return save_expr (build2 (code, type, cval1, cval2));
8820               return fold_build2 (code, type, cval1, cval2);
8821             }
8822         }
8823     }
8824
8825   /* Fold a comparison of the address of COMPONENT_REFs with the same
8826      type and component to a comparison of the address of the base
8827      object.  In short, &x->a OP &y->a to x OP y and
8828      &x->a OP &y.a to x OP &y  */
8829   if (TREE_CODE (arg0) == ADDR_EXPR
8830       && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8831       && TREE_CODE (arg1) == ADDR_EXPR
8832       && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8833     {
8834       tree cref0 = TREE_OPERAND (arg0, 0);
8835       tree cref1 = TREE_OPERAND (arg1, 0);
8836       if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8837         {
8838           tree op0 = TREE_OPERAND (cref0, 0);
8839           tree op1 = TREE_OPERAND (cref1, 0);
8840           return fold_build2 (code, type,
8841                               build_fold_addr_expr (op0),
8842                               build_fold_addr_expr (op1));
8843         }
8844     }
8845
8846   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8847      into a single range test.  */
8848   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8849        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8850       && TREE_CODE (arg1) == INTEGER_CST
8851       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8852       && !integer_zerop (TREE_OPERAND (arg0, 1))
8853       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8854       && !TREE_OVERFLOW (arg1))
8855     {
8856       tem = fold_div_compare (code, type, arg0, arg1);
8857       if (tem != NULL_TREE)
8858         return tem;
8859     }
8860
8861   /* Fold ~X op ~Y as Y op X.  */
8862   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8863       && TREE_CODE (arg1) == BIT_NOT_EXPR)
8864     {
8865       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8866       return fold_build2 (code, type,
8867                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8868                           TREE_OPERAND (arg0, 0));
8869     }
8870
8871   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
8872   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8873       && TREE_CODE (arg1) == INTEGER_CST)
8874     {
8875       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8876       return fold_build2 (swap_tree_comparison (code), type,
8877                           TREE_OPERAND (arg0, 0),
8878                           fold_build1 (BIT_NOT_EXPR, cmp_type,
8879                                        fold_convert (cmp_type, arg1)));
8880     }
8881
8882   return NULL_TREE;
8883 }
8884
8885
8886 /* Subroutine of fold_binary.  Optimize complex multiplications of the
8887    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
8888    argument EXPR represents the expression "z" of type TYPE.  */
8889
8890 static tree
8891 fold_mult_zconjz (tree type, tree expr)
8892 {
8893   tree itype = TREE_TYPE (type);
8894   tree rpart, ipart, tem;
8895
8896   if (TREE_CODE (expr) == COMPLEX_EXPR)
8897     {
8898       rpart = TREE_OPERAND (expr, 0);
8899       ipart = TREE_OPERAND (expr, 1);
8900     }
8901   else if (TREE_CODE (expr) == COMPLEX_CST)
8902     {
8903       rpart = TREE_REALPART (expr);
8904       ipart = TREE_IMAGPART (expr);
8905     }
8906   else
8907     {
8908       expr = save_expr (expr);
8909       rpart = fold_build1 (REALPART_EXPR, itype, expr);
8910       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8911     }
8912
8913   rpart = save_expr (rpart);
8914   ipart = save_expr (ipart);
8915   tem = fold_build2 (PLUS_EXPR, itype,
8916                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
8917                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
8918   return fold_build2 (COMPLEX_EXPR, type, tem,
8919                       fold_convert (itype, integer_zero_node));
8920 }
8921
8922
8923 /* Fold a binary expression of code CODE and type TYPE with operands
8924    OP0 and OP1.  Return the folded expression if folding is
8925    successful.  Otherwise, return NULL_TREE.  */
8926
8927 tree
8928 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
8929 {
8930   enum tree_code_class kind = TREE_CODE_CLASS (code);
8931   tree arg0, arg1, tem;
8932   tree t1 = NULL_TREE;
8933   bool strict_overflow_p;
8934
8935   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
8936                || IS_GIMPLE_STMT_CODE_CLASS (kind))
8937               && TREE_CODE_LENGTH (code) == 2
8938               && op0 != NULL_TREE
8939               && op1 != NULL_TREE);
8940
8941   arg0 = op0;
8942   arg1 = op1;
8943
8944   /* Strip any conversions that don't change the mode.  This is
8945      safe for every expression, except for a comparison expression
8946      because its signedness is derived from its operands.  So, in
8947      the latter case, only strip conversions that don't change the
8948      signedness.
8949
8950      Note that this is done as an internal manipulation within the
8951      constant folder, in order to find the simplest representation
8952      of the arguments so that their form can be studied.  In any
8953      cases, the appropriate type conversions should be put back in
8954      the tree that will get out of the constant folder.  */
8955
8956   if (kind == tcc_comparison)
8957     {
8958       STRIP_SIGN_NOPS (arg0);
8959       STRIP_SIGN_NOPS (arg1);
8960     }
8961   else
8962     {
8963       STRIP_NOPS (arg0);
8964       STRIP_NOPS (arg1);
8965     }
8966
8967   /* Note that TREE_CONSTANT isn't enough: static var addresses are
8968      constant but we can't do arithmetic on them.  */
8969   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
8970       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
8971       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
8972       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
8973     {
8974       if (kind == tcc_binary)
8975         tem = const_binop (code, arg0, arg1, 0);
8976       else if (kind == tcc_comparison)
8977         tem = fold_relational_const (code, type, arg0, arg1);
8978       else
8979         tem = NULL_TREE;
8980
8981       if (tem != NULL_TREE)
8982         {
8983           if (TREE_TYPE (tem) != type)
8984             tem = fold_convert (type, tem);
8985           return tem;
8986         }
8987     }
8988
8989   /* If this is a commutative operation, and ARG0 is a constant, move it
8990      to ARG1 to reduce the number of tests below.  */
8991   if (commutative_tree_code (code)
8992       && tree_swap_operands_p (arg0, arg1, true))
8993     return fold_build2 (code, type, op1, op0);
8994
8995   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
8996
8997      First check for cases where an arithmetic operation is applied to a
8998      compound, conditional, or comparison operation.  Push the arithmetic
8999      operation inside the compound or conditional to see if any folding
9000      can then be done.  Convert comparison to conditional for this purpose.
9001      The also optimizes non-constant cases that used to be done in
9002      expand_expr.
9003
9004      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9005      one of the operands is a comparison and the other is a comparison, a
9006      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9007      code below would make the expression more complex.  Change it to a
9008      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9009      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9010
9011   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9012        || code == EQ_EXPR || code == NE_EXPR)
9013       && ((truth_value_p (TREE_CODE (arg0))
9014            && (truth_value_p (TREE_CODE (arg1))
9015                || (TREE_CODE (arg1) == BIT_AND_EXPR
9016                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9017           || (truth_value_p (TREE_CODE (arg1))
9018               && (truth_value_p (TREE_CODE (arg0))
9019                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9020                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9021     {
9022       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9023                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9024                          : TRUTH_XOR_EXPR,
9025                          boolean_type_node,
9026                          fold_convert (boolean_type_node, arg0),
9027                          fold_convert (boolean_type_node, arg1));
9028
9029       if (code == EQ_EXPR)
9030         tem = invert_truthvalue (tem);
9031
9032       return fold_convert (type, tem);
9033     }
9034
9035   if (TREE_CODE_CLASS (code) == tcc_binary
9036       || TREE_CODE_CLASS (code) == tcc_comparison)
9037     {
9038       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9039         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9040                        fold_build2 (code, type,
9041                                     TREE_OPERAND (arg0, 1), op1));
9042       if (TREE_CODE (arg1) == COMPOUND_EXPR
9043           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9044         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9045                        fold_build2 (code, type,
9046                                     op0, TREE_OPERAND (arg1, 1)));
9047
9048       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9049         {
9050           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9051                                                      arg0, arg1, 
9052                                                      /*cond_first_p=*/1);
9053           if (tem != NULL_TREE)
9054             return tem;
9055         }
9056
9057       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9058         {
9059           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9060                                                      arg1, arg0, 
9061                                                      /*cond_first_p=*/0);
9062           if (tem != NULL_TREE)
9063             return tem;
9064         }
9065     }
9066
9067   switch (code)
9068     {
9069     case PLUS_EXPR:
9070       /* A + (-B) -> A - B */
9071       if (TREE_CODE (arg1) == NEGATE_EXPR)
9072         return fold_build2 (MINUS_EXPR, type,
9073                             fold_convert (type, arg0),
9074                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9075       /* (-A) + B -> B - A */
9076       if (TREE_CODE (arg0) == NEGATE_EXPR
9077           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9078         return fold_build2 (MINUS_EXPR, type,
9079                             fold_convert (type, arg1),
9080                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9081       /* Convert ~A + 1 to -A.  */
9082       if (INTEGRAL_TYPE_P (type)
9083           && TREE_CODE (arg0) == BIT_NOT_EXPR
9084           && integer_onep (arg1))
9085         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9086
9087       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9088          same or one.  */
9089       if ((TREE_CODE (arg0) == MULT_EXPR
9090            || TREE_CODE (arg1) == MULT_EXPR)
9091           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9092         {
9093           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9094           if (tem)
9095             return tem;
9096         }
9097
9098       if (! FLOAT_TYPE_P (type))
9099         {
9100           if (integer_zerop (arg1))
9101             return non_lvalue (fold_convert (type, arg0));
9102
9103           /* ~X + X is -1.  */
9104           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9105               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9106               && !TYPE_OVERFLOW_TRAPS (type))
9107             {
9108               t1 = build_int_cst_type (type, -1);
9109               return omit_one_operand (type, t1, arg1);
9110             }
9111
9112           /* X + ~X is -1.  */
9113           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9114               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
9115               && !TYPE_OVERFLOW_TRAPS (type))
9116             {
9117               t1 = build_int_cst_type (type, -1);
9118               return omit_one_operand (type, t1, arg0);
9119           }
9120
9121           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9122              with a constant, and the two constants have no bits in common,
9123              we should treat this as a BIT_IOR_EXPR since this may produce more
9124              simplifications.  */
9125           if (TREE_CODE (arg0) == BIT_AND_EXPR
9126               && TREE_CODE (arg1) == BIT_AND_EXPR
9127               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9128               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9129               && integer_zerop (const_binop (BIT_AND_EXPR,
9130                                              TREE_OPERAND (arg0, 1),
9131                                              TREE_OPERAND (arg1, 1), 0)))
9132             {
9133               code = BIT_IOR_EXPR;
9134               goto bit_ior;
9135             }
9136
9137           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9138              (plus (plus (mult) (mult)) (foo)) so that we can
9139              take advantage of the factoring cases below.  */
9140           if (((TREE_CODE (arg0) == PLUS_EXPR
9141                 || TREE_CODE (arg0) == MINUS_EXPR)
9142                && TREE_CODE (arg1) == MULT_EXPR)
9143               || ((TREE_CODE (arg1) == PLUS_EXPR
9144                    || TREE_CODE (arg1) == MINUS_EXPR)
9145                   && TREE_CODE (arg0) == MULT_EXPR))
9146             {
9147               tree parg0, parg1, parg, marg;
9148               enum tree_code pcode;
9149
9150               if (TREE_CODE (arg1) == MULT_EXPR)
9151                 parg = arg0, marg = arg1;
9152               else
9153                 parg = arg1, marg = arg0;
9154               pcode = TREE_CODE (parg);
9155               parg0 = TREE_OPERAND (parg, 0);
9156               parg1 = TREE_OPERAND (parg, 1);
9157               STRIP_NOPS (parg0);
9158               STRIP_NOPS (parg1);
9159
9160               if (TREE_CODE (parg0) == MULT_EXPR
9161                   && TREE_CODE (parg1) != MULT_EXPR)
9162                 return fold_build2 (pcode, type,
9163                                     fold_build2 (PLUS_EXPR, type,
9164                                                  fold_convert (type, parg0),
9165                                                  fold_convert (type, marg)),
9166                                     fold_convert (type, parg1));
9167               if (TREE_CODE (parg0) != MULT_EXPR
9168                   && TREE_CODE (parg1) == MULT_EXPR)
9169                 return fold_build2 (PLUS_EXPR, type,
9170                                     fold_convert (type, parg0),
9171                                     fold_build2 (pcode, type,
9172                                                  fold_convert (type, marg),
9173                                                  fold_convert (type,
9174                                                                parg1)));
9175             }
9176
9177           /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
9178              of the array.  Loop optimizer sometimes produce this type of
9179              expressions.  */
9180           if (TREE_CODE (arg0) == ADDR_EXPR)
9181             {
9182               tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
9183               if (tem)
9184                 return fold_convert (type, tem);
9185             }
9186           else if (TREE_CODE (arg1) == ADDR_EXPR)
9187             {
9188               tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
9189               if (tem)
9190                 return fold_convert (type, tem);
9191             }
9192         }
9193       else
9194         {
9195           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9196           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9197             return non_lvalue (fold_convert (type, arg0));
9198
9199           /* Likewise if the operands are reversed.  */
9200           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9201             return non_lvalue (fold_convert (type, arg1));
9202
9203           /* Convert X + -C into X - C.  */
9204           if (TREE_CODE (arg1) == REAL_CST
9205               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9206             {
9207               tem = fold_negate_const (arg1, type);
9208               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9209                 return fold_build2 (MINUS_EXPR, type,
9210                                     fold_convert (type, arg0),
9211                                     fold_convert (type, tem));
9212             }
9213
9214           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9215              to __complex__ ( x, y ).  This is not the same for SNaNs or
9216              if signed zeros are involved.  */
9217           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9218               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9219               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9220             {
9221               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9222               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9223               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9224               bool arg0rz = false, arg0iz = false;
9225               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9226                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9227                 {
9228                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9229                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9230                   if (arg0rz && arg1i && real_zerop (arg1i))
9231                     {
9232                       tree rp = arg1r ? arg1r
9233                                   : build1 (REALPART_EXPR, rtype, arg1);
9234                       tree ip = arg0i ? arg0i
9235                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9236                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9237                     }
9238                   else if (arg0iz && arg1r && real_zerop (arg1r))
9239                     {
9240                       tree rp = arg0r ? arg0r
9241                                   : build1 (REALPART_EXPR, rtype, arg0);
9242                       tree ip = arg1i ? arg1i
9243                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9244                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9245                     }
9246                 }
9247             }
9248
9249           if (flag_unsafe_math_optimizations
9250               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9251               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9252               && (tem = distribute_real_division (code, type, arg0, arg1)))
9253             return tem;
9254
9255           /* Convert x+x into x*2.0.  */
9256           if (operand_equal_p (arg0, arg1, 0)
9257               && SCALAR_FLOAT_TYPE_P (type))
9258             return fold_build2 (MULT_EXPR, type, arg0,
9259                                 build_real (type, dconst2));
9260
9261           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  */
9262           if (flag_unsafe_math_optimizations
9263               && TREE_CODE (arg1) == PLUS_EXPR
9264               && TREE_CODE (arg0) != MULT_EXPR)
9265             {
9266               tree tree10 = TREE_OPERAND (arg1, 0);
9267               tree tree11 = TREE_OPERAND (arg1, 1);
9268               if (TREE_CODE (tree11) == MULT_EXPR
9269                   && TREE_CODE (tree10) == MULT_EXPR)
9270                 {
9271                   tree tree0;
9272                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9273                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9274                 }
9275             }
9276           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  */
9277           if (flag_unsafe_math_optimizations
9278               && TREE_CODE (arg0) == PLUS_EXPR
9279               && TREE_CODE (arg1) != MULT_EXPR)
9280             {
9281               tree tree00 = TREE_OPERAND (arg0, 0);
9282               tree tree01 = TREE_OPERAND (arg0, 1);
9283               if (TREE_CODE (tree01) == MULT_EXPR
9284                   && TREE_CODE (tree00) == MULT_EXPR)
9285                 {
9286                   tree tree0;
9287                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9288                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9289                 }
9290             }
9291         }
9292
9293      bit_rotate:
9294       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9295          is a rotate of A by C1 bits.  */
9296       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9297          is a rotate of A by B bits.  */
9298       {
9299         enum tree_code code0, code1;
9300         code0 = TREE_CODE (arg0);
9301         code1 = TREE_CODE (arg1);
9302         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9303              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9304             && operand_equal_p (TREE_OPERAND (arg0, 0),
9305                                 TREE_OPERAND (arg1, 0), 0)
9306             && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
9307           {
9308             tree tree01, tree11;
9309             enum tree_code code01, code11;
9310
9311             tree01 = TREE_OPERAND (arg0, 1);
9312             tree11 = TREE_OPERAND (arg1, 1);
9313             STRIP_NOPS (tree01);
9314             STRIP_NOPS (tree11);
9315             code01 = TREE_CODE (tree01);
9316             code11 = TREE_CODE (tree11);
9317             if (code01 == INTEGER_CST
9318                 && code11 == INTEGER_CST
9319                 && TREE_INT_CST_HIGH (tree01) == 0
9320                 && TREE_INT_CST_HIGH (tree11) == 0
9321                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9322                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9323               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9324                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9325             else if (code11 == MINUS_EXPR)
9326               {
9327                 tree tree110, tree111;
9328                 tree110 = TREE_OPERAND (tree11, 0);
9329                 tree111 = TREE_OPERAND (tree11, 1);
9330                 STRIP_NOPS (tree110);
9331                 STRIP_NOPS (tree111);
9332                 if (TREE_CODE (tree110) == INTEGER_CST
9333                     && 0 == compare_tree_int (tree110,
9334                                               TYPE_PRECISION
9335                                               (TREE_TYPE (TREE_OPERAND
9336                                                           (arg0, 0))))
9337                     && operand_equal_p (tree01, tree111, 0))
9338                   return build2 ((code0 == LSHIFT_EXPR
9339                                   ? LROTATE_EXPR
9340                                   : RROTATE_EXPR),
9341                                  type, TREE_OPERAND (arg0, 0), tree01);
9342               }
9343             else if (code01 == MINUS_EXPR)
9344               {
9345                 tree tree010, tree011;
9346                 tree010 = TREE_OPERAND (tree01, 0);
9347                 tree011 = TREE_OPERAND (tree01, 1);
9348                 STRIP_NOPS (tree010);
9349                 STRIP_NOPS (tree011);
9350                 if (TREE_CODE (tree010) == INTEGER_CST
9351                     && 0 == compare_tree_int (tree010,
9352                                               TYPE_PRECISION
9353                                               (TREE_TYPE (TREE_OPERAND
9354                                                           (arg0, 0))))
9355                     && operand_equal_p (tree11, tree011, 0))
9356                   return build2 ((code0 != LSHIFT_EXPR
9357                                   ? LROTATE_EXPR
9358                                   : RROTATE_EXPR),
9359                                  type, TREE_OPERAND (arg0, 0), tree11);
9360               }
9361           }
9362       }
9363
9364     associate:
9365       /* In most languages, can't associate operations on floats through
9366          parentheses.  Rather than remember where the parentheses were, we
9367          don't associate floats at all, unless the user has specified
9368          -funsafe-math-optimizations.  */
9369
9370       if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9371         {
9372           tree var0, con0, lit0, minus_lit0;
9373           tree var1, con1, lit1, minus_lit1;
9374           bool ok = true;
9375
9376           /* Split both trees into variables, constants, and literals.  Then
9377              associate each group together, the constants with literals,
9378              then the result with variables.  This increases the chances of
9379              literals being recombined later and of generating relocatable
9380              expressions for the sum of a constant and literal.  */
9381           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9382           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9383                              code == MINUS_EXPR);
9384
9385           /* With undefined overflow we can only associate constants
9386              with one variable.  */
9387           if ((POINTER_TYPE_P (type)
9388                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9389               && var0 && var1)
9390             {
9391               tree tmp0 = var0;
9392               tree tmp1 = var1;
9393
9394               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9395                 tmp0 = TREE_OPERAND (tmp0, 0);
9396               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9397                 tmp1 = TREE_OPERAND (tmp1, 0);
9398               /* The only case we can still associate with two variables
9399                  is if they are the same, modulo negation.  */
9400               if (!operand_equal_p (tmp0, tmp1, 0))
9401                 ok = false;
9402             }
9403
9404           /* Only do something if we found more than two objects.  Otherwise,
9405              nothing has changed and we risk infinite recursion.  */
9406           if (ok
9407               && (2 < ((var0 != 0) + (var1 != 0)
9408                        + (con0 != 0) + (con1 != 0)
9409                        + (lit0 != 0) + (lit1 != 0)
9410                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9411             {
9412               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9413               if (code == MINUS_EXPR)
9414                 code = PLUS_EXPR;
9415
9416               var0 = associate_trees (var0, var1, code, type);
9417               con0 = associate_trees (con0, con1, code, type);
9418               lit0 = associate_trees (lit0, lit1, code, type);
9419               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9420
9421               /* Preserve the MINUS_EXPR if the negative part of the literal is
9422                  greater than the positive part.  Otherwise, the multiplicative
9423                  folding code (i.e extract_muldiv) may be fooled in case
9424                  unsigned constants are subtracted, like in the following
9425                  example: ((X*2 + 4) - 8U)/2.  */
9426               if (minus_lit0 && lit0)
9427                 {
9428                   if (TREE_CODE (lit0) == INTEGER_CST
9429                       && TREE_CODE (minus_lit0) == INTEGER_CST
9430                       && tree_int_cst_lt (lit0, minus_lit0))
9431                     {
9432                       minus_lit0 = associate_trees (minus_lit0, lit0,
9433                                                     MINUS_EXPR, type);
9434                       lit0 = 0;
9435                     }
9436                   else
9437                     {
9438                       lit0 = associate_trees (lit0, minus_lit0,
9439                                               MINUS_EXPR, type);
9440                       minus_lit0 = 0;
9441                     }
9442                 }
9443               if (minus_lit0)
9444                 {
9445                   if (con0 == 0)
9446                     return fold_convert (type,
9447                                          associate_trees (var0, minus_lit0,
9448                                                           MINUS_EXPR, type));
9449                   else
9450                     {
9451                       con0 = associate_trees (con0, minus_lit0,
9452                                               MINUS_EXPR, type);
9453                       return fold_convert (type,
9454                                            associate_trees (var0, con0,
9455                                                             PLUS_EXPR, type));
9456                     }
9457                 }
9458
9459               con0 = associate_trees (con0, lit0, code, type);
9460               return fold_convert (type, associate_trees (var0, con0,
9461                                                           code, type));
9462             }
9463         }
9464
9465       return NULL_TREE;
9466
9467     case MINUS_EXPR:
9468       /* A - (-B) -> A + B */
9469       if (TREE_CODE (arg1) == NEGATE_EXPR)
9470         return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
9471       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9472       if (TREE_CODE (arg0) == NEGATE_EXPR
9473           && (FLOAT_TYPE_P (type)
9474               || INTEGRAL_TYPE_P (type))
9475           && negate_expr_p (arg1)
9476           && reorder_operands_p (arg0, arg1))
9477         return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
9478                             TREE_OPERAND (arg0, 0));
9479       /* Convert -A - 1 to ~A.  */
9480       if (INTEGRAL_TYPE_P (type)
9481           && TREE_CODE (arg0) == NEGATE_EXPR
9482           && integer_onep (arg1)
9483           && !TYPE_OVERFLOW_TRAPS (type))
9484         return fold_build1 (BIT_NOT_EXPR, type,
9485                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9486
9487       /* Convert -1 - A to ~A.  */
9488       if (INTEGRAL_TYPE_P (type)
9489           && integer_all_onesp (arg0))
9490         return fold_build1 (BIT_NOT_EXPR, type, op1);
9491
9492       if (! FLOAT_TYPE_P (type))
9493         {
9494           if (integer_zerop (arg0))
9495             return negate_expr (fold_convert (type, arg1));
9496           if (integer_zerop (arg1))
9497             return non_lvalue (fold_convert (type, arg0));
9498
9499           /* Fold A - (A & B) into ~B & A.  */
9500           if (!TREE_SIDE_EFFECTS (arg0)
9501               && TREE_CODE (arg1) == BIT_AND_EXPR)
9502             {
9503               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9504                 return fold_build2 (BIT_AND_EXPR, type,
9505                                     fold_build1 (BIT_NOT_EXPR, type,
9506                                                  TREE_OPERAND (arg1, 0)),
9507                                     arg0);
9508               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9509                 return fold_build2 (BIT_AND_EXPR, type,
9510                                     fold_build1 (BIT_NOT_EXPR, type,
9511                                                  TREE_OPERAND (arg1, 1)),
9512                                     arg0);
9513             }
9514
9515           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9516              any power of 2 minus 1.  */
9517           if (TREE_CODE (arg0) == BIT_AND_EXPR
9518               && TREE_CODE (arg1) == BIT_AND_EXPR
9519               && operand_equal_p (TREE_OPERAND (arg0, 0),
9520                                   TREE_OPERAND (arg1, 0), 0))
9521             {
9522               tree mask0 = TREE_OPERAND (arg0, 1);
9523               tree mask1 = TREE_OPERAND (arg1, 1);
9524               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9525
9526               if (operand_equal_p (tem, mask1, 0))
9527                 {
9528                   tem = fold_build2 (BIT_XOR_EXPR, type,
9529                                      TREE_OPERAND (arg0, 0), mask1);
9530                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9531                 }
9532             }
9533         }
9534
9535       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9536       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9537         return non_lvalue (fold_convert (type, arg0));
9538
9539       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9540          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9541          (-ARG1 + ARG0) reduces to -ARG1.  */
9542       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9543         return negate_expr (fold_convert (type, arg1));
9544
9545       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9546          __complex__ ( x, -y ).  This is not the same for SNaNs or if
9547          signed zeros are involved.  */
9548       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9549           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9550           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9551         {
9552           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9553           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9554           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9555           bool arg0rz = false, arg0iz = false;
9556           if ((arg0r && (arg0rz = real_zerop (arg0r)))
9557               || (arg0i && (arg0iz = real_zerop (arg0i))))
9558             {
9559               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9560               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9561               if (arg0rz && arg1i && real_zerop (arg1i))
9562                 {
9563                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
9564                                          arg1r ? arg1r
9565                                          : build1 (REALPART_EXPR, rtype, arg1));
9566                   tree ip = arg0i ? arg0i
9567                     : build1 (IMAGPART_EXPR, rtype, arg0);
9568                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9569                 }
9570               else if (arg0iz && arg1r && real_zerop (arg1r))
9571                 {
9572                   tree rp = arg0r ? arg0r
9573                     : build1 (REALPART_EXPR, rtype, arg0);
9574                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
9575                                          arg1i ? arg1i
9576                                          : build1 (IMAGPART_EXPR, rtype, arg1));
9577                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9578                 }
9579             }
9580         }
9581
9582       /* Fold &x - &x.  This can happen from &x.foo - &x.
9583          This is unsafe for certain floats even in non-IEEE formats.
9584          In IEEE, it is unsafe because it does wrong for NaNs.
9585          Also note that operand_equal_p is always false if an operand
9586          is volatile.  */
9587
9588       if ((! FLOAT_TYPE_P (type)
9589            || (flag_unsafe_math_optimizations
9590                && !HONOR_NANS (TYPE_MODE (type))
9591                && !HONOR_INFINITIES (TYPE_MODE (type))))
9592           && operand_equal_p (arg0, arg1, 0))
9593         return fold_convert (type, integer_zero_node);
9594
9595       /* A - B -> A + (-B) if B is easily negatable.  */
9596       if (negate_expr_p (arg1)
9597           && ((FLOAT_TYPE_P (type)
9598                /* Avoid this transformation if B is a positive REAL_CST.  */
9599                && (TREE_CODE (arg1) != REAL_CST
9600                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9601               || INTEGRAL_TYPE_P (type)))
9602         return fold_build2 (PLUS_EXPR, type,
9603                             fold_convert (type, arg0),
9604                             fold_convert (type, negate_expr (arg1)));
9605
9606       /* Try folding difference of addresses.  */
9607       {
9608         HOST_WIDE_INT diff;
9609
9610         if ((TREE_CODE (arg0) == ADDR_EXPR
9611              || TREE_CODE (arg1) == ADDR_EXPR)
9612             && ptr_difference_const (arg0, arg1, &diff))
9613           return build_int_cst_type (type, diff);
9614       }
9615
9616       /* Fold &a[i] - &a[j] to i-j.  */
9617       if (TREE_CODE (arg0) == ADDR_EXPR
9618           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9619           && TREE_CODE (arg1) == ADDR_EXPR
9620           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9621         {
9622           tree aref0 = TREE_OPERAND (arg0, 0);
9623           tree aref1 = TREE_OPERAND (arg1, 0);
9624           if (operand_equal_p (TREE_OPERAND (aref0, 0),
9625                                TREE_OPERAND (aref1, 0), 0))
9626             {
9627               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9628               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9629               tree esz = array_ref_element_size (aref0);
9630               tree diff = build2 (MINUS_EXPR, type, op0, op1);
9631               return fold_build2 (MULT_EXPR, type, diff,
9632                                   fold_convert (type, esz));
9633                                   
9634             }
9635         }
9636
9637       /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
9638          of the array.  Loop optimizer sometimes produce this type of
9639          expressions.  */
9640       if (TREE_CODE (arg0) == ADDR_EXPR)
9641         {
9642           tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
9643           if (tem)
9644             return fold_convert (type, tem);
9645         }
9646
9647       if (flag_unsafe_math_optimizations
9648           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9649           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9650           && (tem = distribute_real_division (code, type, arg0, arg1)))
9651         return tem;
9652
9653       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9654          same or one.  */
9655       if ((TREE_CODE (arg0) == MULT_EXPR
9656            || TREE_CODE (arg1) == MULT_EXPR)
9657           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9658         {
9659           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9660           if (tem)
9661             return tem;
9662         }
9663
9664       goto associate;
9665
9666     case MULT_EXPR:
9667       /* (-A) * (-B) -> A * B  */
9668       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9669         return fold_build2 (MULT_EXPR, type,
9670                             fold_convert (type, TREE_OPERAND (arg0, 0)),
9671                             fold_convert (type, negate_expr (arg1)));
9672       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9673         return fold_build2 (MULT_EXPR, type,
9674                             fold_convert (type, negate_expr (arg0)),
9675                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9676
9677       if (! FLOAT_TYPE_P (type))
9678         {
9679           if (integer_zerop (arg1))
9680             return omit_one_operand (type, arg1, arg0);
9681           if (integer_onep (arg1))
9682             return non_lvalue (fold_convert (type, arg0));
9683           /* Transform x * -1 into -x.  */
9684           if (integer_all_onesp (arg1))
9685             return fold_convert (type, negate_expr (arg0));
9686           /* Transform x * -C into -x * C if x is easily negatable.  */
9687           if (TREE_CODE (arg1) == INTEGER_CST
9688               && tree_int_cst_sgn (arg1) == -1
9689               && negate_expr_p (arg0)
9690               && (tem = negate_expr (arg1)) != arg1
9691               && !TREE_OVERFLOW (tem))
9692             return fold_build2 (MULT_EXPR, type,
9693                                 negate_expr (arg0), tem);
9694
9695           /* (a * (1 << b)) is (a << b)  */
9696           if (TREE_CODE (arg1) == LSHIFT_EXPR
9697               && integer_onep (TREE_OPERAND (arg1, 0)))
9698             return fold_build2 (LSHIFT_EXPR, type, arg0,
9699                                 TREE_OPERAND (arg1, 1));
9700           if (TREE_CODE (arg0) == LSHIFT_EXPR
9701               && integer_onep (TREE_OPERAND (arg0, 0)))
9702             return fold_build2 (LSHIFT_EXPR, type, arg1,
9703                                 TREE_OPERAND (arg0, 1));
9704
9705           strict_overflow_p = false;
9706           if (TREE_CODE (arg1) == INTEGER_CST
9707               && 0 != (tem = extract_muldiv (op0,
9708                                              fold_convert (type, arg1),
9709                                              code, NULL_TREE,
9710                                              &strict_overflow_p)))
9711             {
9712               if (strict_overflow_p)
9713                 fold_overflow_warning (("assuming signed overflow does not "
9714                                         "occur when simplifying "
9715                                         "multiplication"),
9716                                        WARN_STRICT_OVERFLOW_MISC);
9717               return fold_convert (type, tem);
9718             }
9719
9720           /* Optimize z * conj(z) for integer complex numbers.  */
9721           if (TREE_CODE (arg0) == CONJ_EXPR
9722               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9723             return fold_mult_zconjz (type, arg1);
9724           if (TREE_CODE (arg1) == CONJ_EXPR
9725               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9726             return fold_mult_zconjz (type, arg0);
9727         }
9728       else
9729         {
9730           /* Maybe fold x * 0 to 0.  The expressions aren't the same
9731              when x is NaN, since x * 0 is also NaN.  Nor are they the
9732              same in modes with signed zeros, since multiplying a
9733              negative value by 0 gives -0, not +0.  */
9734           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9735               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9736               && real_zerop (arg1))
9737             return omit_one_operand (type, arg1, arg0);
9738           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
9739           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9740               && real_onep (arg1))
9741             return non_lvalue (fold_convert (type, arg0));
9742
9743           /* Transform x * -1.0 into -x.  */
9744           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9745               && real_minus_onep (arg1))
9746             return fold_convert (type, negate_expr (arg0));
9747
9748           /* Convert (C1/X)*C2 into (C1*C2)/X.  */
9749           if (flag_unsafe_math_optimizations
9750               && TREE_CODE (arg0) == RDIV_EXPR
9751               && TREE_CODE (arg1) == REAL_CST
9752               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
9753             {
9754               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
9755                                       arg1, 0);
9756               if (tem)
9757                 return fold_build2 (RDIV_EXPR, type, tem,
9758                                     TREE_OPERAND (arg0, 1));
9759             }
9760
9761           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
9762           if (operand_equal_p (arg0, arg1, 0))
9763             {
9764               tree tem = fold_strip_sign_ops (arg0);
9765               if (tem != NULL_TREE)
9766                 {
9767                   tem = fold_convert (type, tem);
9768                   return fold_build2 (MULT_EXPR, type, tem, tem);
9769                 }
9770             }
9771
9772           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
9773              This is not the same for NaNs or if signed zeros are
9774              involved.  */
9775           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9776               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9777               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
9778               && TREE_CODE (arg1) == COMPLEX_CST
9779               && real_zerop (TREE_REALPART (arg1)))
9780             {
9781               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9782               if (real_onep (TREE_IMAGPART (arg1)))
9783                 return fold_build2 (COMPLEX_EXPR, type,
9784                                     negate_expr (fold_build1 (IMAGPART_EXPR,
9785                                                               rtype, arg0)),
9786                                     fold_build1 (REALPART_EXPR, rtype, arg0));
9787               else if (real_minus_onep (TREE_IMAGPART (arg1)))
9788                 return fold_build2 (COMPLEX_EXPR, type,
9789                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
9790                                     negate_expr (fold_build1 (REALPART_EXPR,
9791                                                               rtype, arg0)));
9792             }
9793
9794           /* Optimize z * conj(z) for floating point complex numbers.
9795              Guarded by flag_unsafe_math_optimizations as non-finite
9796              imaginary components don't produce scalar results.  */
9797           if (flag_unsafe_math_optimizations
9798               && TREE_CODE (arg0) == CONJ_EXPR
9799               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9800             return fold_mult_zconjz (type, arg1);
9801           if (flag_unsafe_math_optimizations
9802               && TREE_CODE (arg1) == CONJ_EXPR
9803               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9804             return fold_mult_zconjz (type, arg0);
9805
9806           if (flag_unsafe_math_optimizations)
9807             {
9808               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
9809               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
9810
9811               /* Optimizations of root(...)*root(...).  */
9812               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
9813                 {
9814                   tree rootfn, arg;
9815                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9816                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9817
9818                   /* Optimize sqrt(x)*sqrt(x) as x.  */
9819                   if (BUILTIN_SQRT_P (fcode0)
9820                       && operand_equal_p (arg00, arg10, 0)
9821                       && ! HONOR_SNANS (TYPE_MODE (type)))
9822                     return arg00;
9823
9824                   /* Optimize root(x)*root(y) as root(x*y).  */
9825                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9826                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9827                   return build_call_expr (rootfn, 1, arg);
9828                 }
9829
9830               /* Optimize expN(x)*expN(y) as expN(x+y).  */
9831               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
9832                 {
9833                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9834                   tree arg = fold_build2 (PLUS_EXPR, type,
9835                                           CALL_EXPR_ARG (arg0, 0),
9836                                           CALL_EXPR_ARG (arg1, 0));
9837                   return build_call_expr (expfn, 1, arg);
9838                 }
9839
9840               /* Optimizations of pow(...)*pow(...).  */
9841               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
9842                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
9843                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
9844                 {
9845                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9846                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9847                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9848                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9849
9850                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
9851                   if (operand_equal_p (arg01, arg11, 0))
9852                     {
9853                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9854                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9855                       return build_call_expr (powfn, 2, arg, arg01);
9856                     }
9857
9858                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
9859                   if (operand_equal_p (arg00, arg10, 0))
9860                     {
9861                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9862                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
9863                       return build_call_expr (powfn, 2, arg00, arg);
9864                     }
9865                 }
9866
9867               /* Optimize tan(x)*cos(x) as sin(x).  */
9868               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
9869                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
9870                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
9871                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
9872                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
9873                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
9874                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
9875                                       CALL_EXPR_ARG (arg1, 0), 0))
9876                 {
9877                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
9878
9879                   if (sinfn != NULL_TREE)
9880                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
9881                 }
9882
9883               /* Optimize x*pow(x,c) as pow(x,c+1).  */
9884               if (fcode1 == BUILT_IN_POW
9885                   || fcode1 == BUILT_IN_POWF
9886                   || fcode1 == BUILT_IN_POWL)
9887                 {
9888                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9889                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9890                   if (TREE_CODE (arg11) == REAL_CST
9891                       && !TREE_OVERFLOW (arg11)
9892                       && operand_equal_p (arg0, arg10, 0))
9893                     {
9894                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
9895                       REAL_VALUE_TYPE c;
9896                       tree arg;
9897
9898                       c = TREE_REAL_CST (arg11);
9899                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9900                       arg = build_real (type, c);
9901                       return build_call_expr (powfn, 2, arg0, arg);
9902                     }
9903                 }
9904
9905               /* Optimize pow(x,c)*x as pow(x,c+1).  */
9906               if (fcode0 == BUILT_IN_POW
9907                   || fcode0 == BUILT_IN_POWF
9908                   || fcode0 == BUILT_IN_POWL)
9909                 {
9910                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9911                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9912                   if (TREE_CODE (arg01) == REAL_CST
9913                       && !TREE_OVERFLOW (arg01)
9914                       && operand_equal_p (arg1, arg00, 0))
9915                     {
9916                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9917                       REAL_VALUE_TYPE c;
9918                       tree arg;
9919
9920                       c = TREE_REAL_CST (arg01);
9921                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9922                       arg = build_real (type, c);
9923                       return build_call_expr (powfn, 2, arg1, arg);
9924                     }
9925                 }
9926
9927               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
9928               if (! optimize_size
9929                   && operand_equal_p (arg0, arg1, 0))
9930                 {
9931                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
9932
9933                   if (powfn)
9934                     {
9935                       tree arg = build_real (type, dconst2);
9936                       return build_call_expr (powfn, 2, arg0, arg);
9937                     }
9938                 }
9939             }
9940         }
9941       goto associate;
9942
9943     case BIT_IOR_EXPR:
9944     bit_ior:
9945       if (integer_all_onesp (arg1))
9946         return omit_one_operand (type, arg1, arg0);
9947       if (integer_zerop (arg1))
9948         return non_lvalue (fold_convert (type, arg0));
9949       if (operand_equal_p (arg0, arg1, 0))
9950         return non_lvalue (fold_convert (type, arg0));
9951
9952       /* ~X | X is -1.  */
9953       if (TREE_CODE (arg0) == BIT_NOT_EXPR
9954           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9955         {
9956           t1 = build_int_cst_type (type, -1);
9957           return omit_one_operand (type, t1, arg1);
9958         }
9959
9960       /* X | ~X is -1.  */
9961       if (TREE_CODE (arg1) == BIT_NOT_EXPR
9962           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9963         {
9964           t1 = build_int_cst_type (type, -1);
9965           return omit_one_operand (type, t1, arg0);
9966         }
9967
9968       /* Canonicalize (X & C1) | C2.  */
9969       if (TREE_CODE (arg0) == BIT_AND_EXPR
9970           && TREE_CODE (arg1) == INTEGER_CST
9971           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9972         {
9973           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, mlo, mhi;
9974           int width = TYPE_PRECISION (type);
9975           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
9976           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
9977           hi2 = TREE_INT_CST_HIGH (arg1);
9978           lo2 = TREE_INT_CST_LOW (arg1);
9979
9980           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
9981           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
9982             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
9983
9984           if (width > HOST_BITS_PER_WIDE_INT)
9985             {
9986               mhi = (unsigned HOST_WIDE_INT) -1 
9987                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
9988               mlo = -1;
9989             }
9990           else
9991             {
9992               mhi = 0;
9993               mlo = (unsigned HOST_WIDE_INT) -1
9994                     >> (HOST_BITS_PER_WIDE_INT - width);
9995             }
9996
9997           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
9998           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
9999             return fold_build2 (BIT_IOR_EXPR, type,
10000                                 TREE_OPERAND (arg0, 0), arg1);
10001
10002           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2.  */
10003           hi1 &= mhi;
10004           lo1 &= mlo;
10005           if ((hi1 & ~hi2) != hi1 || (lo1 & ~lo2) != lo1)
10006             return fold_build2 (BIT_IOR_EXPR, type,
10007                                 fold_build2 (BIT_AND_EXPR, type,
10008                                              TREE_OPERAND (arg0, 0),
10009                                              build_int_cst_wide (type,
10010                                                                  lo1 & ~lo2,
10011                                                                  hi1 & ~hi2)),
10012                                 arg1);
10013         }
10014
10015       /* (X & Y) | Y is (X, Y).  */
10016       if (TREE_CODE (arg0) == BIT_AND_EXPR
10017           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10018         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10019       /* (X & Y) | X is (Y, X).  */
10020       if (TREE_CODE (arg0) == BIT_AND_EXPR
10021           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10022           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10023         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10024       /* X | (X & Y) is (Y, X).  */
10025       if (TREE_CODE (arg1) == BIT_AND_EXPR
10026           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10027           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10028         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10029       /* X | (Y & X) is (Y, X).  */
10030       if (TREE_CODE (arg1) == BIT_AND_EXPR
10031           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10032           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10033         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10034
10035       t1 = distribute_bit_expr (code, type, arg0, arg1);
10036       if (t1 != NULL_TREE)
10037         return t1;
10038
10039       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10040
10041          This results in more efficient code for machines without a NAND
10042          instruction.  Combine will canonicalize to the first form
10043          which will allow use of NAND instructions provided by the
10044          backend if they exist.  */
10045       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10046           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10047         {
10048           return fold_build1 (BIT_NOT_EXPR, type,
10049                               build2 (BIT_AND_EXPR, type,
10050                                       TREE_OPERAND (arg0, 0),
10051                                       TREE_OPERAND (arg1, 0)));
10052         }
10053
10054       /* See if this can be simplified into a rotate first.  If that
10055          is unsuccessful continue in the association code.  */
10056       goto bit_rotate;
10057
10058     case BIT_XOR_EXPR:
10059       if (integer_zerop (arg1))
10060         return non_lvalue (fold_convert (type, arg0));
10061       if (integer_all_onesp (arg1))
10062         return fold_build1 (BIT_NOT_EXPR, type, arg0);
10063       if (operand_equal_p (arg0, arg1, 0))
10064         return omit_one_operand (type, integer_zero_node, arg0);
10065
10066       /* ~X ^ X is -1.  */
10067       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10068           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10069         {
10070           t1 = build_int_cst_type (type, -1);
10071           return omit_one_operand (type, t1, arg1);
10072         }
10073
10074       /* X ^ ~X is -1.  */
10075       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10076           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10077         {
10078           t1 = build_int_cst_type (type, -1);
10079           return omit_one_operand (type, t1, arg0);
10080         }
10081
10082       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10083          with a constant, and the two constants have no bits in common,
10084          we should treat this as a BIT_IOR_EXPR since this may produce more
10085          simplifications.  */
10086       if (TREE_CODE (arg0) == BIT_AND_EXPR
10087           && TREE_CODE (arg1) == BIT_AND_EXPR
10088           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10089           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10090           && integer_zerop (const_binop (BIT_AND_EXPR,
10091                                          TREE_OPERAND (arg0, 1),
10092                                          TREE_OPERAND (arg1, 1), 0)))
10093         {
10094           code = BIT_IOR_EXPR;
10095           goto bit_ior;
10096         }
10097
10098       /* (X | Y) ^ X -> Y & ~ X*/
10099       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10100           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10101         {
10102           tree t2 = TREE_OPERAND (arg0, 1);
10103           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10104                             arg1);
10105           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10106                             fold_convert (type, t1));
10107           return t1;
10108         }
10109
10110       /* (Y | X) ^ X -> Y & ~ X*/
10111       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10112           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10113         {
10114           tree t2 = TREE_OPERAND (arg0, 0);
10115           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10116                             arg1);
10117           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10118                             fold_convert (type, t1));
10119           return t1;
10120         }
10121
10122       /* X ^ (X | Y) -> Y & ~ X*/
10123       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10124           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10125         {
10126           tree t2 = TREE_OPERAND (arg1, 1);
10127           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10128                             arg0);
10129           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10130                             fold_convert (type, t1));
10131           return t1;
10132         }
10133
10134       /* X ^ (Y | X) -> Y & ~ X*/
10135       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10136           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10137         {
10138           tree t2 = TREE_OPERAND (arg1, 0);
10139           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10140                             arg0);
10141           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10142                             fold_convert (type, t1));
10143           return t1;
10144         }
10145         
10146       /* Convert ~X ^ ~Y to X ^ Y.  */
10147       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10148           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10149         return fold_build2 (code, type,
10150                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10151                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10152
10153       /* Convert ~X ^ C to X ^ ~C.  */
10154       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10155           && TREE_CODE (arg1) == INTEGER_CST)
10156         return fold_build2 (code, type,
10157                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10158                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10159
10160       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10161       if (TREE_CODE (arg0) == BIT_AND_EXPR
10162           && integer_onep (TREE_OPERAND (arg0, 1))
10163           && integer_onep (arg1))
10164         return fold_build2 (EQ_EXPR, type, arg0,
10165                             build_int_cst (TREE_TYPE (arg0), 0));
10166
10167       /* Fold (X & Y) ^ Y as ~X & Y.  */
10168       if (TREE_CODE (arg0) == BIT_AND_EXPR
10169           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10170         {
10171           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10172           return fold_build2 (BIT_AND_EXPR, type, 
10173                               fold_build1 (BIT_NOT_EXPR, type, tem),
10174                               fold_convert (type, arg1));
10175         }
10176       /* Fold (X & Y) ^ X as ~Y & X.  */
10177       if (TREE_CODE (arg0) == BIT_AND_EXPR
10178           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10179           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10180         {
10181           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10182           return fold_build2 (BIT_AND_EXPR, type,
10183                               fold_build1 (BIT_NOT_EXPR, type, tem),
10184                               fold_convert (type, arg1));
10185         }
10186       /* Fold X ^ (X & Y) as X & ~Y.  */
10187       if (TREE_CODE (arg1) == BIT_AND_EXPR
10188           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10189         {
10190           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10191           return fold_build2 (BIT_AND_EXPR, type,
10192                               fold_convert (type, arg0),
10193                               fold_build1 (BIT_NOT_EXPR, type, tem));
10194         }
10195       /* Fold X ^ (Y & X) as ~Y & X.  */
10196       if (TREE_CODE (arg1) == BIT_AND_EXPR
10197           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10198           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10199         {
10200           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10201           return fold_build2 (BIT_AND_EXPR, type,
10202                               fold_build1 (BIT_NOT_EXPR, type, tem),
10203                               fold_convert (type, arg0));
10204         }
10205
10206       /* See if this can be simplified into a rotate first.  If that
10207          is unsuccessful continue in the association code.  */
10208       goto bit_rotate;
10209
10210     case BIT_AND_EXPR:
10211       if (integer_all_onesp (arg1))
10212         return non_lvalue (fold_convert (type, arg0));
10213       if (integer_zerop (arg1))
10214         return omit_one_operand (type, arg1, arg0);
10215       if (operand_equal_p (arg0, arg1, 0))
10216         return non_lvalue (fold_convert (type, arg0));
10217
10218       /* ~X & X is always zero.  */
10219       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10220           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10221         return omit_one_operand (type, integer_zero_node, arg1);
10222
10223       /* X & ~X is always zero.  */
10224       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10225           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10226         return omit_one_operand (type, integer_zero_node, arg0);
10227
10228       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10229       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10230           && TREE_CODE (arg1) == INTEGER_CST
10231           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10232         return fold_build2 (BIT_IOR_EXPR, type,
10233                             fold_build2 (BIT_AND_EXPR, type,
10234                                          TREE_OPERAND (arg0, 0), arg1),
10235                             fold_build2 (BIT_AND_EXPR, type,
10236                                          TREE_OPERAND (arg0, 1), arg1));
10237
10238       /* (X | Y) & Y is (X, Y).  */
10239       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10240           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10241         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10242       /* (X | Y) & X is (Y, X).  */
10243       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10244           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10245           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10246         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10247       /* X & (X | Y) is (Y, X).  */
10248       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10249           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10250           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10251         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10252       /* X & (Y | X) is (Y, X).  */
10253       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10254           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10255           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10256         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10257
10258       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10259       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10260           && integer_onep (TREE_OPERAND (arg0, 1))
10261           && integer_onep (arg1))
10262         {
10263           tem = TREE_OPERAND (arg0, 0);
10264           return fold_build2 (EQ_EXPR, type,
10265                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10266                                            build_int_cst (TREE_TYPE (tem), 1)),
10267                               build_int_cst (TREE_TYPE (tem), 0));
10268         }
10269       /* Fold ~X & 1 as (X & 1) == 0.  */
10270       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10271           && integer_onep (arg1))
10272         {
10273           tem = TREE_OPERAND (arg0, 0);
10274           return fold_build2 (EQ_EXPR, type,
10275                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10276                                            build_int_cst (TREE_TYPE (tem), 1)),
10277                               build_int_cst (TREE_TYPE (tem), 0));
10278         }
10279
10280       /* Fold (X ^ Y) & Y as ~X & Y.  */
10281       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10282           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10283         {
10284           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10285           return fold_build2 (BIT_AND_EXPR, type, 
10286                               fold_build1 (BIT_NOT_EXPR, type, tem),
10287                               fold_convert (type, arg1));
10288         }
10289       /* Fold (X ^ Y) & X as ~Y & X.  */
10290       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10291           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10292           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10293         {
10294           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10295           return fold_build2 (BIT_AND_EXPR, type,
10296                               fold_build1 (BIT_NOT_EXPR, type, tem),
10297                               fold_convert (type, arg1));
10298         }
10299       /* Fold X & (X ^ Y) as X & ~Y.  */
10300       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10301           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10302         {
10303           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10304           return fold_build2 (BIT_AND_EXPR, type,
10305                               fold_convert (type, arg0),
10306                               fold_build1 (BIT_NOT_EXPR, type, tem));
10307         }
10308       /* Fold X & (Y ^ X) as ~Y & X.  */
10309       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10310           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10311           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10312         {
10313           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10314           return fold_build2 (BIT_AND_EXPR, type,
10315                               fold_build1 (BIT_NOT_EXPR, type, tem),
10316                               fold_convert (type, arg0));
10317         }
10318
10319       t1 = distribute_bit_expr (code, type, arg0, arg1);
10320       if (t1 != NULL_TREE)
10321         return t1;
10322       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10323       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10324           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10325         {
10326           unsigned int prec
10327             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10328
10329           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10330               && (~TREE_INT_CST_LOW (arg1)
10331                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10332             return fold_convert (type, TREE_OPERAND (arg0, 0));
10333         }
10334
10335       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10336
10337          This results in more efficient code for machines without a NOR
10338          instruction.  Combine will canonicalize to the first form
10339          which will allow use of NOR instructions provided by the
10340          backend if they exist.  */
10341       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10342           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10343         {
10344           return fold_build1 (BIT_NOT_EXPR, type,
10345                               build2 (BIT_IOR_EXPR, type,
10346                                       TREE_OPERAND (arg0, 0),
10347                                       TREE_OPERAND (arg1, 0)));
10348         }
10349
10350       goto associate;
10351
10352     case RDIV_EXPR:
10353       /* Don't touch a floating-point divide by zero unless the mode
10354          of the constant can represent infinity.  */
10355       if (TREE_CODE (arg1) == REAL_CST
10356           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10357           && real_zerop (arg1))
10358         return NULL_TREE;
10359
10360       /* Optimize A / A to 1.0 if we don't care about
10361          NaNs or Infinities.  Skip the transformation
10362          for non-real operands.  */
10363       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10364           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10365           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10366           && operand_equal_p (arg0, arg1, 0))
10367         {
10368           tree r = build_real (TREE_TYPE (arg0), dconst1);
10369
10370           return omit_two_operands (type, r, arg0, arg1);
10371         }
10372
10373       /* The complex version of the above A / A optimization.  */
10374       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10375           && operand_equal_p (arg0, arg1, 0))
10376         {
10377           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10378           if (! HONOR_NANS (TYPE_MODE (elem_type))
10379               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10380             {
10381               tree r = build_real (elem_type, dconst1);
10382               /* omit_two_operands will call fold_convert for us.  */
10383               return omit_two_operands (type, r, arg0, arg1);
10384             }
10385         }
10386
10387       /* (-A) / (-B) -> A / B  */
10388       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10389         return fold_build2 (RDIV_EXPR, type,
10390                             TREE_OPERAND (arg0, 0),
10391                             negate_expr (arg1));
10392       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10393         return fold_build2 (RDIV_EXPR, type,
10394                             negate_expr (arg0),
10395                             TREE_OPERAND (arg1, 0));
10396
10397       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10398       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10399           && real_onep (arg1))
10400         return non_lvalue (fold_convert (type, arg0));
10401
10402       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10403       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10404           && real_minus_onep (arg1))
10405         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10406
10407       /* If ARG1 is a constant, we can convert this to a multiply by the
10408          reciprocal.  This does not have the same rounding properties,
10409          so only do this if -funsafe-math-optimizations.  We can actually
10410          always safely do it if ARG1 is a power of two, but it's hard to
10411          tell if it is or not in a portable manner.  */
10412       if (TREE_CODE (arg1) == REAL_CST)
10413         {
10414           if (flag_unsafe_math_optimizations
10415               && 0 != (tem = const_binop (code, build_real (type, dconst1),
10416                                           arg1, 0)))
10417             return fold_build2 (MULT_EXPR, type, arg0, tem);
10418           /* Find the reciprocal if optimizing and the result is exact.  */
10419           if (optimize)
10420             {
10421               REAL_VALUE_TYPE r;
10422               r = TREE_REAL_CST (arg1);
10423               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10424                 {
10425                   tem = build_real (type, r);
10426                   return fold_build2 (MULT_EXPR, type,
10427                                       fold_convert (type, arg0), tem);
10428                 }
10429             }
10430         }
10431       /* Convert A/B/C to A/(B*C).  */
10432       if (flag_unsafe_math_optimizations
10433           && TREE_CODE (arg0) == RDIV_EXPR)
10434         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10435                             fold_build2 (MULT_EXPR, type,
10436                                          TREE_OPERAND (arg0, 1), arg1));
10437
10438       /* Convert A/(B/C) to (A/B)*C.  */
10439       if (flag_unsafe_math_optimizations
10440           && TREE_CODE (arg1) == RDIV_EXPR)
10441         return fold_build2 (MULT_EXPR, type,
10442                             fold_build2 (RDIV_EXPR, type, arg0,
10443                                          TREE_OPERAND (arg1, 0)),
10444                             TREE_OPERAND (arg1, 1));
10445
10446       /* Convert C1/(X*C2) into (C1/C2)/X.  */
10447       if (flag_unsafe_math_optimizations
10448           && TREE_CODE (arg1) == MULT_EXPR
10449           && TREE_CODE (arg0) == REAL_CST
10450           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10451         {
10452           tree tem = const_binop (RDIV_EXPR, arg0,
10453                                   TREE_OPERAND (arg1, 1), 0);
10454           if (tem)
10455             return fold_build2 (RDIV_EXPR, type, tem,
10456                                 TREE_OPERAND (arg1, 0));
10457         }
10458
10459       if (flag_unsafe_math_optimizations)
10460         {
10461           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10462           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10463
10464           /* Optimize sin(x)/cos(x) as tan(x).  */
10465           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10466                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10467                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10468               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10469                                   CALL_EXPR_ARG (arg1, 0), 0))
10470             {
10471               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10472
10473               if (tanfn != NULL_TREE)
10474                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10475             }
10476
10477           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
10478           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10479                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10480                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10481               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10482                                   CALL_EXPR_ARG (arg1, 0), 0))
10483             {
10484               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10485
10486               if (tanfn != NULL_TREE)
10487                 {
10488                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10489                   return fold_build2 (RDIV_EXPR, type,
10490                                       build_real (type, dconst1), tmp);
10491                 }
10492             }
10493
10494           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10495              NaNs or Infinities.  */
10496           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10497                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10498                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
10499             {
10500               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10501               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10502
10503               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10504                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10505                   && operand_equal_p (arg00, arg01, 0))
10506                 {
10507                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10508
10509                   if (cosfn != NULL_TREE)
10510                     return build_call_expr (cosfn, 1, arg00);
10511                 }
10512             }
10513
10514           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
10515              NaNs or Infinities.  */
10516           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
10517                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
10518                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
10519             {
10520               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10521               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10522
10523               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10524                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10525                   && operand_equal_p (arg00, arg01, 0))
10526                 {
10527                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10528
10529                   if (cosfn != NULL_TREE)
10530                     {
10531                       tree tmp = build_call_expr (cosfn, 1, arg00);
10532                       return fold_build2 (RDIV_EXPR, type,
10533                                           build_real (type, dconst1),
10534                                           tmp);
10535                     }
10536                 }
10537             }
10538
10539           /* Optimize pow(x,c)/x as pow(x,c-1).  */
10540           if (fcode0 == BUILT_IN_POW
10541               || fcode0 == BUILT_IN_POWF
10542               || fcode0 == BUILT_IN_POWL)
10543             {
10544               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10545               tree arg01 = CALL_EXPR_ARG (arg0, 1);
10546               if (TREE_CODE (arg01) == REAL_CST
10547                   && !TREE_OVERFLOW (arg01)
10548                   && operand_equal_p (arg1, arg00, 0))
10549                 {
10550                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10551                   REAL_VALUE_TYPE c;
10552                   tree arg;
10553
10554                   c = TREE_REAL_CST (arg01);
10555                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
10556                   arg = build_real (type, c);
10557                   return build_call_expr (powfn, 2, arg1, arg);
10558                 }
10559             }
10560
10561           /* Optimize a/root(b/c) into a*root(c/b).  */
10562           if (BUILTIN_ROOT_P (fcode1))
10563             {
10564               tree rootarg = CALL_EXPR_ARG (arg1, 0);
10565
10566               if (TREE_CODE (rootarg) == RDIV_EXPR)
10567                 {
10568                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10569                   tree b = TREE_OPERAND (rootarg, 0);
10570                   tree c = TREE_OPERAND (rootarg, 1);
10571
10572                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
10573
10574                   tmp = build_call_expr (rootfn, 1, tmp);
10575                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
10576                 }
10577             }
10578
10579           /* Optimize x/expN(y) into x*expN(-y).  */
10580           if (BUILTIN_EXPONENT_P (fcode1))
10581             {
10582               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10583               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
10584               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
10585               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10586             }
10587
10588           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
10589           if (fcode1 == BUILT_IN_POW
10590               || fcode1 == BUILT_IN_POWF
10591               || fcode1 == BUILT_IN_POWL)
10592             {
10593               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10594               tree arg10 = CALL_EXPR_ARG (arg1, 0);
10595               tree arg11 = CALL_EXPR_ARG (arg1, 1);
10596               tree neg11 = fold_convert (type, negate_expr (arg11));
10597               arg1 = build_call_expr (powfn, 2, arg10, neg11);
10598               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10599             }
10600         }
10601       return NULL_TREE;
10602
10603     case TRUNC_DIV_EXPR:
10604     case FLOOR_DIV_EXPR:
10605       /* Simplify A / (B << N) where A and B are positive and B is
10606          a power of 2, to A >> (N + log2(B)).  */
10607       strict_overflow_p = false;
10608       if (TREE_CODE (arg1) == LSHIFT_EXPR
10609           && (TYPE_UNSIGNED (type)
10610               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10611         {
10612           tree sval = TREE_OPERAND (arg1, 0);
10613           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
10614             {
10615               tree sh_cnt = TREE_OPERAND (arg1, 1);
10616               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
10617
10618               if (strict_overflow_p)
10619                 fold_overflow_warning (("assuming signed overflow does not "
10620                                         "occur when simplifying A / (B << N)"),
10621                                        WARN_STRICT_OVERFLOW_MISC);
10622
10623               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
10624                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
10625               return fold_build2 (RSHIFT_EXPR, type,
10626                                   fold_convert (type, arg0), sh_cnt);
10627             }
10628         }
10629       /* Fall thru */
10630
10631     case ROUND_DIV_EXPR:
10632     case CEIL_DIV_EXPR:
10633     case EXACT_DIV_EXPR:
10634       if (integer_onep (arg1))
10635         return non_lvalue (fold_convert (type, arg0));
10636       if (integer_zerop (arg1))
10637         return NULL_TREE;
10638       /* X / -1 is -X.  */
10639       if (!TYPE_UNSIGNED (type)
10640           && TREE_CODE (arg1) == INTEGER_CST
10641           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10642           && TREE_INT_CST_HIGH (arg1) == -1)
10643         return fold_convert (type, negate_expr (arg0));
10644
10645       /* Convert -A / -B to A / B when the type is signed and overflow is
10646          undefined.  */
10647       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10648           && TREE_CODE (arg0) == NEGATE_EXPR
10649           && negate_expr_p (arg1))
10650         {
10651           if (INTEGRAL_TYPE_P (type))
10652             fold_overflow_warning (("assuming signed overflow does not occur "
10653                                     "when distributing negation across "
10654                                     "division"),
10655                                    WARN_STRICT_OVERFLOW_MISC);
10656           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10657                               negate_expr (arg1));
10658         }
10659       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10660           && TREE_CODE (arg1) == NEGATE_EXPR
10661           && negate_expr_p (arg0))
10662         {
10663           if (INTEGRAL_TYPE_P (type))
10664             fold_overflow_warning (("assuming signed overflow does not occur "
10665                                     "when distributing negation across "
10666                                     "division"),
10667                                    WARN_STRICT_OVERFLOW_MISC);
10668           return fold_build2 (code, type, negate_expr (arg0),
10669                               TREE_OPERAND (arg1, 0));
10670         }
10671
10672       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
10673          operation, EXACT_DIV_EXPR.
10674
10675          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
10676          At one time others generated faster code, it's not clear if they do
10677          after the last round to changes to the DIV code in expmed.c.  */
10678       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
10679           && multiple_of_p (type, arg0, arg1))
10680         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
10681
10682       strict_overflow_p = false;
10683       if (TREE_CODE (arg1) == INTEGER_CST
10684           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10685                                          &strict_overflow_p)))
10686         {
10687           if (strict_overflow_p)
10688             fold_overflow_warning (("assuming signed overflow does not occur "
10689                                     "when simplifying division"),
10690                                    WARN_STRICT_OVERFLOW_MISC);
10691           return fold_convert (type, tem);
10692         }
10693
10694       return NULL_TREE;
10695
10696     case CEIL_MOD_EXPR:
10697     case FLOOR_MOD_EXPR:
10698     case ROUND_MOD_EXPR:
10699     case TRUNC_MOD_EXPR:
10700       /* X % 1 is always zero, but be sure to preserve any side
10701          effects in X.  */
10702       if (integer_onep (arg1))
10703         return omit_one_operand (type, integer_zero_node, arg0);
10704
10705       /* X % 0, return X % 0 unchanged so that we can get the
10706          proper warnings and errors.  */
10707       if (integer_zerop (arg1))
10708         return NULL_TREE;
10709
10710       /* 0 % X is always zero, but be sure to preserve any side
10711          effects in X.  Place this after checking for X == 0.  */
10712       if (integer_zerop (arg0))
10713         return omit_one_operand (type, integer_zero_node, arg1);
10714
10715       /* X % -1 is zero.  */
10716       if (!TYPE_UNSIGNED (type)
10717           && TREE_CODE (arg1) == INTEGER_CST
10718           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10719           && TREE_INT_CST_HIGH (arg1) == -1)
10720         return omit_one_operand (type, integer_zero_node, arg0);
10721
10722       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
10723          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
10724       strict_overflow_p = false;
10725       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
10726           && (TYPE_UNSIGNED (type)
10727               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10728         {
10729           tree c = arg1;
10730           /* Also optimize A % (C << N)  where C is a power of 2,
10731              to A & ((C << N) - 1).  */
10732           if (TREE_CODE (arg1) == LSHIFT_EXPR)
10733             c = TREE_OPERAND (arg1, 0);
10734
10735           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
10736             {
10737               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
10738                                        build_int_cst (TREE_TYPE (arg1), 1));
10739               if (strict_overflow_p)
10740                 fold_overflow_warning (("assuming signed overflow does not "
10741                                         "occur when simplifying "
10742                                         "X % (power of two)"),
10743                                        WARN_STRICT_OVERFLOW_MISC);
10744               return fold_build2 (BIT_AND_EXPR, type,
10745                                   fold_convert (type, arg0),
10746                                   fold_convert (type, mask));
10747             }
10748         }
10749
10750       /* X % -C is the same as X % C.  */
10751       if (code == TRUNC_MOD_EXPR
10752           && !TYPE_UNSIGNED (type)
10753           && TREE_CODE (arg1) == INTEGER_CST
10754           && !TREE_OVERFLOW (arg1)
10755           && TREE_INT_CST_HIGH (arg1) < 0
10756           && !TYPE_OVERFLOW_TRAPS (type)
10757           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
10758           && !sign_bit_p (arg1, arg1))
10759         return fold_build2 (code, type, fold_convert (type, arg0),
10760                             fold_convert (type, negate_expr (arg1)));
10761
10762       /* X % -Y is the same as X % Y.  */
10763       if (code == TRUNC_MOD_EXPR
10764           && !TYPE_UNSIGNED (type)
10765           && TREE_CODE (arg1) == NEGATE_EXPR
10766           && !TYPE_OVERFLOW_TRAPS (type))
10767         return fold_build2 (code, type, fold_convert (type, arg0),
10768                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10769
10770       if (TREE_CODE (arg1) == INTEGER_CST
10771           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10772                                          &strict_overflow_p)))
10773         {
10774           if (strict_overflow_p)
10775             fold_overflow_warning (("assuming signed overflow does not occur "
10776                                     "when simplifying modulos"),
10777                                    WARN_STRICT_OVERFLOW_MISC);
10778           return fold_convert (type, tem);
10779         }
10780
10781       return NULL_TREE;
10782
10783     case LROTATE_EXPR:
10784     case RROTATE_EXPR:
10785       if (integer_all_onesp (arg0))
10786         return omit_one_operand (type, arg0, arg1);
10787       goto shift;
10788
10789     case RSHIFT_EXPR:
10790       /* Optimize -1 >> x for arithmetic right shifts.  */
10791       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
10792         return omit_one_operand (type, arg0, arg1);
10793       /* ... fall through ...  */
10794
10795     case LSHIFT_EXPR:
10796     shift:
10797       if (integer_zerop (arg1))
10798         return non_lvalue (fold_convert (type, arg0));
10799       if (integer_zerop (arg0))
10800         return omit_one_operand (type, arg0, arg1);
10801
10802       /* Since negative shift count is not well-defined,
10803          don't try to compute it in the compiler.  */
10804       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
10805         return NULL_TREE;
10806
10807       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
10808       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
10809           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10810           && host_integerp (TREE_OPERAND (arg0, 1), false)
10811           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10812         {
10813           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
10814                                + TREE_INT_CST_LOW (arg1));
10815
10816           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
10817              being well defined.  */
10818           if (low >= TYPE_PRECISION (type))
10819             {
10820               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
10821                 low = low % TYPE_PRECISION (type);
10822               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
10823                 return build_int_cst (type, 0);
10824               else
10825                 low = TYPE_PRECISION (type) - 1;
10826             }
10827
10828           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10829                               build_int_cst (type, low));
10830         }
10831
10832       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
10833          into x & ((unsigned)-1 >> c) for unsigned types.  */
10834       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
10835            || (TYPE_UNSIGNED (type)
10836                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
10837           && host_integerp (arg1, false)
10838           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10839           && host_integerp (TREE_OPERAND (arg0, 1), false)
10840           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10841         {
10842           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10843           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
10844           tree lshift;
10845           tree arg00;
10846
10847           if (low0 == low1)
10848             {
10849               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10850
10851               lshift = build_int_cst (type, -1);
10852               lshift = int_const_binop (code, lshift, arg1, 0);
10853
10854               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
10855             }
10856         }
10857
10858       /* Rewrite an LROTATE_EXPR by a constant into an
10859          RROTATE_EXPR by a new constant.  */
10860       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
10861         {
10862           tree tem = build_int_cst (TREE_TYPE (arg1),
10863                                     GET_MODE_BITSIZE (TYPE_MODE (type)));
10864           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
10865           return fold_build2 (RROTATE_EXPR, type, arg0, tem);
10866         }
10867
10868       /* If we have a rotate of a bit operation with the rotate count and
10869          the second operand of the bit operation both constant,
10870          permute the two operations.  */
10871       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10872           && (TREE_CODE (arg0) == BIT_AND_EXPR
10873               || TREE_CODE (arg0) == BIT_IOR_EXPR
10874               || TREE_CODE (arg0) == BIT_XOR_EXPR)
10875           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10876         return fold_build2 (TREE_CODE (arg0), type,
10877                             fold_build2 (code, type,
10878                                          TREE_OPERAND (arg0, 0), arg1),
10879                             fold_build2 (code, type,
10880                                          TREE_OPERAND (arg0, 1), arg1));
10881
10882       /* Two consecutive rotates adding up to the width of the mode can
10883          be ignored.  */
10884       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10885           && TREE_CODE (arg0) == RROTATE_EXPR
10886           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10887           && TREE_INT_CST_HIGH (arg1) == 0
10888           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
10889           && ((TREE_INT_CST_LOW (arg1)
10890                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
10891               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
10892         return TREE_OPERAND (arg0, 0);
10893
10894       return NULL_TREE;
10895
10896     case MIN_EXPR:
10897       if (operand_equal_p (arg0, arg1, 0))
10898         return omit_one_operand (type, arg0, arg1);
10899       if (INTEGRAL_TYPE_P (type)
10900           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
10901         return omit_one_operand (type, arg1, arg0);
10902       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
10903       if (tem)
10904         return tem;
10905       goto associate;
10906
10907     case MAX_EXPR:
10908       if (operand_equal_p (arg0, arg1, 0))
10909         return omit_one_operand (type, arg0, arg1);
10910       if (INTEGRAL_TYPE_P (type)
10911           && TYPE_MAX_VALUE (type)
10912           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
10913         return omit_one_operand (type, arg1, arg0);
10914       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
10915       if (tem)
10916         return tem;
10917       goto associate;
10918
10919     case TRUTH_ANDIF_EXPR:
10920       /* Note that the operands of this must be ints
10921          and their values must be 0 or 1.
10922          ("true" is a fixed value perhaps depending on the language.)  */
10923       /* If first arg is constant zero, return it.  */
10924       if (integer_zerop (arg0))
10925         return fold_convert (type, arg0);
10926     case TRUTH_AND_EXPR:
10927       /* If either arg is constant true, drop it.  */
10928       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10929         return non_lvalue (fold_convert (type, arg1));
10930       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
10931           /* Preserve sequence points.  */
10932           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
10933         return non_lvalue (fold_convert (type, arg0));
10934       /* If second arg is constant zero, result is zero, but first arg
10935          must be evaluated.  */
10936       if (integer_zerop (arg1))
10937         return omit_one_operand (type, arg1, arg0);
10938       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
10939          case will be handled here.  */
10940       if (integer_zerop (arg0))
10941         return omit_one_operand (type, arg0, arg1);
10942
10943       /* !X && X is always false.  */
10944       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10945           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10946         return omit_one_operand (type, integer_zero_node, arg1);
10947       /* X && !X is always false.  */
10948       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10949           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10950         return omit_one_operand (type, integer_zero_node, arg0);
10951
10952       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
10953          means A >= Y && A != MAX, but in this case we know that
10954          A < X <= MAX.  */
10955
10956       if (!TREE_SIDE_EFFECTS (arg0)
10957           && !TREE_SIDE_EFFECTS (arg1))
10958         {
10959           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
10960           if (tem && !operand_equal_p (tem, arg0, 0))
10961             return fold_build2 (code, type, tem, arg1);
10962
10963           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
10964           if (tem && !operand_equal_p (tem, arg1, 0))
10965             return fold_build2 (code, type, arg0, tem);
10966         }
10967
10968     truth_andor:
10969       /* We only do these simplifications if we are optimizing.  */
10970       if (!optimize)
10971         return NULL_TREE;
10972
10973       /* Check for things like (A || B) && (A || C).  We can convert this
10974          to A || (B && C).  Note that either operator can be any of the four
10975          truth and/or operations and the transformation will still be
10976          valid.   Also note that we only care about order for the
10977          ANDIF and ORIF operators.  If B contains side effects, this
10978          might change the truth-value of A.  */
10979       if (TREE_CODE (arg0) == TREE_CODE (arg1)
10980           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
10981               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
10982               || TREE_CODE (arg0) == TRUTH_AND_EXPR
10983               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
10984           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
10985         {
10986           tree a00 = TREE_OPERAND (arg0, 0);
10987           tree a01 = TREE_OPERAND (arg0, 1);
10988           tree a10 = TREE_OPERAND (arg1, 0);
10989           tree a11 = TREE_OPERAND (arg1, 1);
10990           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
10991                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
10992                              && (code == TRUTH_AND_EXPR
10993                                  || code == TRUTH_OR_EXPR));
10994
10995           if (operand_equal_p (a00, a10, 0))
10996             return fold_build2 (TREE_CODE (arg0), type, a00,
10997                                 fold_build2 (code, type, a01, a11));
10998           else if (commutative && operand_equal_p (a00, a11, 0))
10999             return fold_build2 (TREE_CODE (arg0), type, a00,
11000                                 fold_build2 (code, type, a01, a10));
11001           else if (commutative && operand_equal_p (a01, a10, 0))
11002             return fold_build2 (TREE_CODE (arg0), type, a01,
11003                                 fold_build2 (code, type, a00, a11));
11004
11005           /* This case if tricky because we must either have commutative
11006              operators or else A10 must not have side-effects.  */
11007
11008           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11009                    && operand_equal_p (a01, a11, 0))
11010             return fold_build2 (TREE_CODE (arg0), type,
11011                                 fold_build2 (code, type, a00, a10),
11012                                 a01);
11013         }
11014
11015       /* See if we can build a range comparison.  */
11016       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11017         return tem;
11018
11019       /* Check for the possibility of merging component references.  If our
11020          lhs is another similar operation, try to merge its rhs with our
11021          rhs.  Then try to merge our lhs and rhs.  */
11022       if (TREE_CODE (arg0) == code
11023           && 0 != (tem = fold_truthop (code, type,
11024                                        TREE_OPERAND (arg0, 1), arg1)))
11025         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11026
11027       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11028         return tem;
11029
11030       return NULL_TREE;
11031
11032     case TRUTH_ORIF_EXPR:
11033       /* Note that the operands of this must be ints
11034          and their values must be 0 or true.
11035          ("true" is a fixed value perhaps depending on the language.)  */
11036       /* If first arg is constant true, return it.  */
11037       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11038         return fold_convert (type, arg0);
11039     case TRUTH_OR_EXPR:
11040       /* If either arg is constant zero, drop it.  */
11041       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11042         return non_lvalue (fold_convert (type, arg1));
11043       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11044           /* Preserve sequence points.  */
11045           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11046         return non_lvalue (fold_convert (type, arg0));
11047       /* If second arg is constant true, result is true, but we must
11048          evaluate first arg.  */
11049       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11050         return omit_one_operand (type, arg1, arg0);
11051       /* Likewise for first arg, but note this only occurs here for
11052          TRUTH_OR_EXPR.  */
11053       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11054         return omit_one_operand (type, arg0, arg1);
11055
11056       /* !X || X is always true.  */
11057       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11058           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11059         return omit_one_operand (type, integer_one_node, arg1);
11060       /* X || !X is always true.  */
11061       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11062           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11063         return omit_one_operand (type, integer_one_node, arg0);
11064
11065       goto truth_andor;
11066
11067     case TRUTH_XOR_EXPR:
11068       /* If the second arg is constant zero, drop it.  */
11069       if (integer_zerop (arg1))
11070         return non_lvalue (fold_convert (type, arg0));
11071       /* If the second arg is constant true, this is a logical inversion.  */
11072       if (integer_onep (arg1))
11073         {
11074           /* Only call invert_truthvalue if operand is a truth value.  */
11075           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11076             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11077           else
11078             tem = invert_truthvalue (arg0);
11079           return non_lvalue (fold_convert (type, tem));
11080         }
11081       /* Identical arguments cancel to zero.  */
11082       if (operand_equal_p (arg0, arg1, 0))
11083         return omit_one_operand (type, integer_zero_node, arg0);
11084
11085       /* !X ^ X is always true.  */
11086       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11087           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11088         return omit_one_operand (type, integer_one_node, arg1);
11089
11090       /* X ^ !X is always true.  */
11091       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11092           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11093         return omit_one_operand (type, integer_one_node, arg0);
11094
11095       return NULL_TREE;
11096
11097     case EQ_EXPR:
11098     case NE_EXPR:
11099       tem = fold_comparison (code, type, op0, op1);
11100       if (tem != NULL_TREE)
11101         return tem;
11102
11103       /* bool_var != 0 becomes bool_var. */
11104       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11105           && code == NE_EXPR)
11106         return non_lvalue (fold_convert (type, arg0));
11107
11108       /* bool_var == 1 becomes bool_var. */
11109       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11110           && code == EQ_EXPR)
11111         return non_lvalue (fold_convert (type, arg0));
11112
11113       /* bool_var != 1 becomes !bool_var. */
11114       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11115           && code == NE_EXPR)
11116         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11117
11118       /* bool_var == 0 becomes !bool_var. */
11119       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11120           && code == EQ_EXPR)
11121         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11122
11123       /* If this is an equality comparison of the address of two non-weak,
11124          unaliased symbols neither of which are extern (since we do not
11125          have access to attributes for externs), then we know the result.  */
11126       if (TREE_CODE (arg0) == ADDR_EXPR
11127           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11128           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11129           && ! lookup_attribute ("alias",
11130                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11131           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11132           && TREE_CODE (arg1) == ADDR_EXPR
11133           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11134           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11135           && ! lookup_attribute ("alias",
11136                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11137           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11138         {
11139           /* We know that we're looking at the address of two
11140              non-weak, unaliased, static _DECL nodes.
11141
11142              It is both wasteful and incorrect to call operand_equal_p
11143              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11144              all we need to do is test pointer equality for the arguments
11145              to the two ADDR_EXPR nodes.  It is incorrect to use
11146              operand_equal_p as that function is NOT equivalent to a
11147              C equality test.  It can in fact return false for two
11148              objects which would test as equal using the C equality
11149              operator.  */
11150           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11151           return constant_boolean_node (equal
11152                                         ? code == EQ_EXPR : code != EQ_EXPR,
11153                                         type);
11154         }
11155
11156       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11157          a MINUS_EXPR of a constant, we can convert it into a comparison with
11158          a revised constant as long as no overflow occurs.  */
11159       if (TREE_CODE (arg1) == INTEGER_CST
11160           && (TREE_CODE (arg0) == PLUS_EXPR
11161               || TREE_CODE (arg0) == MINUS_EXPR)
11162           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11163           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11164                                       ? MINUS_EXPR : PLUS_EXPR,
11165                                       fold_convert (TREE_TYPE (arg0), arg1),
11166                                       TREE_OPERAND (arg0, 1), 0))
11167           && !TREE_OVERFLOW (tem))
11168         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11169
11170       /* Similarly for a NEGATE_EXPR.  */
11171       if (TREE_CODE (arg0) == NEGATE_EXPR
11172           && TREE_CODE (arg1) == INTEGER_CST
11173           && 0 != (tem = negate_expr (arg1))
11174           && TREE_CODE (tem) == INTEGER_CST
11175           && !TREE_OVERFLOW (tem))
11176         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11177
11178       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11179       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11180           && TREE_CODE (arg1) == INTEGER_CST
11181           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11182         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11183                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11184                                          fold_convert (TREE_TYPE (arg0), arg1),
11185                                          TREE_OPERAND (arg0, 1)));
11186
11187       /* Transform comparisons of the form X +- C CMP X.  */
11188       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11189           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11190           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11191           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11192               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11193         {
11194           tree cst = TREE_OPERAND (arg0, 1);
11195
11196           if (code == EQ_EXPR
11197               && !integer_zerop (cst))
11198             return omit_two_operands (type, boolean_false_node,
11199                                       TREE_OPERAND (arg0, 0), arg1);
11200           else
11201             return omit_two_operands (type, boolean_true_node,
11202                                       TREE_OPERAND (arg0, 0), arg1);
11203         }
11204
11205       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11206          for !=.  Don't do this for ordered comparisons due to overflow.  */
11207       if (TREE_CODE (arg0) == MINUS_EXPR
11208           && integer_zerop (arg1))
11209         return fold_build2 (code, type,
11210                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11211
11212       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11213       if (TREE_CODE (arg0) == ABS_EXPR
11214           && (integer_zerop (arg1) || real_zerop (arg1)))
11215         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11216
11217       /* If this is an EQ or NE comparison with zero and ARG0 is
11218          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11219          two operations, but the latter can be done in one less insn
11220          on machines that have only two-operand insns or on which a
11221          constant cannot be the first operand.  */
11222       if (TREE_CODE (arg0) == BIT_AND_EXPR
11223           && integer_zerop (arg1))
11224         {
11225           tree arg00 = TREE_OPERAND (arg0, 0);
11226           tree arg01 = TREE_OPERAND (arg0, 1);
11227           if (TREE_CODE (arg00) == LSHIFT_EXPR
11228               && integer_onep (TREE_OPERAND (arg00, 0)))
11229             return
11230               fold_build2 (code, type,
11231                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11232                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11233                                            arg01, TREE_OPERAND (arg00, 1)),
11234                                    fold_convert (TREE_TYPE (arg0),
11235                                                  integer_one_node)),
11236                            arg1);
11237           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
11238                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
11239             return
11240               fold_build2 (code, type,
11241                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11242                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11243                                            arg00, TREE_OPERAND (arg01, 1)),
11244                                    fold_convert (TREE_TYPE (arg0),
11245                                                  integer_one_node)),
11246                            arg1);
11247         }
11248
11249       /* If this is an NE or EQ comparison of zero against the result of a
11250          signed MOD operation whose second operand is a power of 2, make
11251          the MOD operation unsigned since it is simpler and equivalent.  */
11252       if (integer_zerop (arg1)
11253           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11254           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11255               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11256               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11257               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11258           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11259         {
11260           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11261           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11262                                      fold_convert (newtype,
11263                                                    TREE_OPERAND (arg0, 0)),
11264                                      fold_convert (newtype,
11265                                                    TREE_OPERAND (arg0, 1)));
11266
11267           return fold_build2 (code, type, newmod,
11268                               fold_convert (newtype, arg1));
11269         }
11270
11271       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11272          C1 is a valid shift constant, and C2 is a power of two, i.e.
11273          a single bit.  */
11274       if (TREE_CODE (arg0) == BIT_AND_EXPR
11275           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11276           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11277              == INTEGER_CST
11278           && integer_pow2p (TREE_OPERAND (arg0, 1))
11279           && integer_zerop (arg1))
11280         {
11281           tree itype = TREE_TYPE (arg0);
11282           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11283           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11284
11285           /* Check for a valid shift count.  */
11286           if (TREE_INT_CST_HIGH (arg001) == 0
11287               && TREE_INT_CST_LOW (arg001) < prec)
11288             {
11289               tree arg01 = TREE_OPERAND (arg0, 1);
11290               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11291               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11292               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11293                  can be rewritten as (X & (C2 << C1)) != 0.  */
11294               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11295                 {
11296                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11297                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11298                   return fold_build2 (code, type, tem, arg1);
11299                 }
11300               /* Otherwise, for signed (arithmetic) shifts,
11301                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11302                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11303               else if (!TYPE_UNSIGNED (itype))
11304                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11305                                     arg000, build_int_cst (itype, 0));
11306               /* Otherwise, of unsigned (logical) shifts,
11307                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11308                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11309               else
11310                 return omit_one_operand (type,
11311                                          code == EQ_EXPR ? integer_one_node
11312                                                          : integer_zero_node,
11313                                          arg000);
11314             }
11315         }
11316
11317       /* If this is an NE comparison of zero with an AND of one, remove the
11318          comparison since the AND will give the correct value.  */
11319       if (code == NE_EXPR
11320           && integer_zerop (arg1)
11321           && TREE_CODE (arg0) == BIT_AND_EXPR
11322           && integer_onep (TREE_OPERAND (arg0, 1)))
11323         return fold_convert (type, arg0);
11324
11325       /* If we have (A & C) == C where C is a power of 2, convert this into
11326          (A & C) != 0.  Similarly for NE_EXPR.  */
11327       if (TREE_CODE (arg0) == BIT_AND_EXPR
11328           && integer_pow2p (TREE_OPERAND (arg0, 1))
11329           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11330         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11331                             arg0, fold_convert (TREE_TYPE (arg0),
11332                                                 integer_zero_node));
11333
11334       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11335          bit, then fold the expression into A < 0 or A >= 0.  */
11336       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11337       if (tem)
11338         return tem;
11339
11340       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11341          Similarly for NE_EXPR.  */
11342       if (TREE_CODE (arg0) == BIT_AND_EXPR
11343           && TREE_CODE (arg1) == INTEGER_CST
11344           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11345         {
11346           tree notc = fold_build1 (BIT_NOT_EXPR,
11347                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11348                                    TREE_OPERAND (arg0, 1));
11349           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11350                                        arg1, notc);
11351           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11352           if (integer_nonzerop (dandnotc))
11353             return omit_one_operand (type, rslt, arg0);
11354         }
11355
11356       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11357          Similarly for NE_EXPR.  */
11358       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11359           && TREE_CODE (arg1) == INTEGER_CST
11360           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11361         {
11362           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11363           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11364                                        TREE_OPERAND (arg0, 1), notd);
11365           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11366           if (integer_nonzerop (candnotd))
11367             return omit_one_operand (type, rslt, arg0);
11368         }
11369
11370       /* If this is a comparison of a field, we may be able to simplify it.  */
11371       if ((TREE_CODE (arg0) == COMPONENT_REF
11372            || TREE_CODE (arg0) == BIT_FIELD_REF)
11373           /* Handle the constant case even without -O
11374              to make sure the warnings are given.  */
11375           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
11376         {
11377           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
11378           if (t1)
11379             return t1;
11380         }
11381
11382       /* Optimize comparisons of strlen vs zero to a compare of the
11383          first character of the string vs zero.  To wit,
11384                 strlen(ptr) == 0   =>  *ptr == 0
11385                 strlen(ptr) != 0   =>  *ptr != 0
11386          Other cases should reduce to one of these two (or a constant)
11387          due to the return value of strlen being unsigned.  */
11388       if (TREE_CODE (arg0) == CALL_EXPR
11389           && integer_zerop (arg1))
11390         {
11391           tree fndecl = get_callee_fndecl (arg0);
11392
11393           if (fndecl
11394               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11395               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11396               && call_expr_nargs (arg0) == 1
11397               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11398             {
11399               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11400               return fold_build2 (code, type, iref,
11401                                   build_int_cst (TREE_TYPE (iref), 0));
11402             }
11403         }
11404
11405       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11406          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
11407       if (TREE_CODE (arg0) == RSHIFT_EXPR
11408           && integer_zerop (arg1)
11409           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11410         {
11411           tree arg00 = TREE_OPERAND (arg0, 0);
11412           tree arg01 = TREE_OPERAND (arg0, 1);
11413           tree itype = TREE_TYPE (arg00);
11414           if (TREE_INT_CST_HIGH (arg01) == 0
11415               && TREE_INT_CST_LOW (arg01)
11416                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11417             {
11418               if (TYPE_UNSIGNED (itype))
11419                 {
11420                   itype = signed_type_for (itype);
11421                   arg00 = fold_convert (itype, arg00);
11422                 }
11423               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11424                                   type, arg00, build_int_cst (itype, 0));
11425             }
11426         }
11427
11428       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
11429       if (integer_zerop (arg1)
11430           && TREE_CODE (arg0) == BIT_XOR_EXPR)
11431         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11432                             TREE_OPERAND (arg0, 1));
11433
11434       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
11435       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11436           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11437         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11438                             build_int_cst (TREE_TYPE (arg1), 0));
11439       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
11440       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11441           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11442           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11443         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11444                             build_int_cst (TREE_TYPE (arg1), 0));
11445
11446       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
11447       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11448           && TREE_CODE (arg1) == INTEGER_CST
11449           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11450         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11451                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11452                                          TREE_OPERAND (arg0, 1), arg1));
11453
11454       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11455          (X & C) == 0 when C is a single bit.  */
11456       if (TREE_CODE (arg0) == BIT_AND_EXPR
11457           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11458           && integer_zerop (arg1)
11459           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11460         {
11461           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11462                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11463                              TREE_OPERAND (arg0, 1));
11464           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11465                               type, tem, arg1);
11466         }
11467
11468       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11469          constant C is a power of two, i.e. a single bit.  */
11470       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11471           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11472           && integer_zerop (arg1)
11473           && integer_pow2p (TREE_OPERAND (arg0, 1))
11474           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11475                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11476         {
11477           tree arg00 = TREE_OPERAND (arg0, 0);
11478           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11479                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
11480         }
11481
11482       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
11483          when is C is a power of two, i.e. a single bit.  */
11484       if (TREE_CODE (arg0) == BIT_AND_EXPR
11485           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
11486           && integer_zerop (arg1)
11487           && integer_pow2p (TREE_OPERAND (arg0, 1))
11488           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11489                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11490         {
11491           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11492           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
11493                              arg000, TREE_OPERAND (arg0, 1));
11494           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11495                               tem, build_int_cst (TREE_TYPE (tem), 0));
11496         }
11497
11498       if (integer_zerop (arg1)
11499           && tree_expr_nonzero_p (arg0))
11500         {
11501           tree res = constant_boolean_node (code==NE_EXPR, type);
11502           return omit_one_operand (type, res, arg0);
11503         }
11504
11505       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
11506       if (TREE_CODE (arg0) == NEGATE_EXPR
11507           && TREE_CODE (arg1) == NEGATE_EXPR)
11508         return fold_build2 (code, type,
11509                             TREE_OPERAND (arg0, 0),
11510                             TREE_OPERAND (arg1, 0));
11511
11512       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
11513       if (TREE_CODE (arg0) == BIT_AND_EXPR
11514           && TREE_CODE (arg1) == BIT_AND_EXPR)
11515         {
11516           tree arg00 = TREE_OPERAND (arg0, 0);
11517           tree arg01 = TREE_OPERAND (arg0, 1);
11518           tree arg10 = TREE_OPERAND (arg1, 0);
11519           tree arg11 = TREE_OPERAND (arg1, 1);
11520           tree itype = TREE_TYPE (arg0);
11521
11522           if (operand_equal_p (arg01, arg11, 0))
11523             return fold_build2 (code, type,
11524                                 fold_build2 (BIT_AND_EXPR, itype,
11525                                              fold_build2 (BIT_XOR_EXPR, itype,
11526                                                           arg00, arg10),
11527                                              arg01),
11528                                 build_int_cst (itype, 0));
11529
11530           if (operand_equal_p (arg01, arg10, 0))
11531             return fold_build2 (code, type,
11532                                 fold_build2 (BIT_AND_EXPR, itype,
11533                                              fold_build2 (BIT_XOR_EXPR, itype,
11534                                                           arg00, arg11),
11535                                              arg01),
11536                                 build_int_cst (itype, 0));
11537
11538           if (operand_equal_p (arg00, arg11, 0))
11539             return fold_build2 (code, type,
11540                                 fold_build2 (BIT_AND_EXPR, itype,
11541                                              fold_build2 (BIT_XOR_EXPR, itype,
11542                                                           arg01, arg10),
11543                                              arg00),
11544                                 build_int_cst (itype, 0));
11545
11546           if (operand_equal_p (arg00, arg10, 0))
11547             return fold_build2 (code, type,
11548                                 fold_build2 (BIT_AND_EXPR, itype,
11549                                              fold_build2 (BIT_XOR_EXPR, itype,
11550                                                           arg01, arg11),
11551                                              arg00),
11552                                 build_int_cst (itype, 0));
11553         }
11554
11555       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11556           && TREE_CODE (arg1) == BIT_XOR_EXPR)
11557         {
11558           tree arg00 = TREE_OPERAND (arg0, 0);
11559           tree arg01 = TREE_OPERAND (arg0, 1);
11560           tree arg10 = TREE_OPERAND (arg1, 0);
11561           tree arg11 = TREE_OPERAND (arg1, 1);
11562           tree itype = TREE_TYPE (arg0);
11563
11564           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
11565              operand_equal_p guarantees no side-effects so we don't need
11566              to use omit_one_operand on Z.  */
11567           if (operand_equal_p (arg01, arg11, 0))
11568             return fold_build2 (code, type, arg00, arg10);
11569           if (operand_equal_p (arg01, arg10, 0))
11570             return fold_build2 (code, type, arg00, arg11);
11571           if (operand_equal_p (arg00, arg11, 0))
11572             return fold_build2 (code, type, arg01, arg10);
11573           if (operand_equal_p (arg00, arg10, 0))
11574             return fold_build2 (code, type, arg01, arg11);
11575
11576           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
11577           if (TREE_CODE (arg01) == INTEGER_CST
11578               && TREE_CODE (arg11) == INTEGER_CST)
11579             return fold_build2 (code, type,
11580                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
11581                                              fold_build2 (BIT_XOR_EXPR, itype,
11582                                                           arg01, arg11)),
11583                                 arg10);
11584         }
11585
11586       /* Attempt to simplify equality/inequality comparisons of complex
11587          values.  Only lower the comparison if the result is known or
11588          can be simplified to a single scalar comparison.  */
11589       if ((TREE_CODE (arg0) == COMPLEX_EXPR
11590            || TREE_CODE (arg0) == COMPLEX_CST)
11591           && (TREE_CODE (arg1) == COMPLEX_EXPR
11592               || TREE_CODE (arg1) == COMPLEX_CST))
11593         {
11594           tree real0, imag0, real1, imag1;
11595           tree rcond, icond;
11596
11597           if (TREE_CODE (arg0) == COMPLEX_EXPR)
11598             {
11599               real0 = TREE_OPERAND (arg0, 0);
11600               imag0 = TREE_OPERAND (arg0, 1);
11601             }
11602           else
11603             {
11604               real0 = TREE_REALPART (arg0);
11605               imag0 = TREE_IMAGPART (arg0);
11606             }
11607
11608           if (TREE_CODE (arg1) == COMPLEX_EXPR)
11609             {
11610               real1 = TREE_OPERAND (arg1, 0);
11611               imag1 = TREE_OPERAND (arg1, 1);
11612             }
11613           else
11614             {
11615               real1 = TREE_REALPART (arg1);
11616               imag1 = TREE_IMAGPART (arg1);
11617             }
11618
11619           rcond = fold_binary (code, type, real0, real1);
11620           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
11621             {
11622               if (integer_zerop (rcond))
11623                 {
11624                   if (code == EQ_EXPR)
11625                     return omit_two_operands (type, boolean_false_node,
11626                                               imag0, imag1);
11627                   return fold_build2 (NE_EXPR, type, imag0, imag1);
11628                 }
11629               else
11630                 {
11631                   if (code == NE_EXPR)
11632                     return omit_two_operands (type, boolean_true_node,
11633                                               imag0, imag1);
11634                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
11635                 }
11636             }
11637
11638           icond = fold_binary (code, type, imag0, imag1);
11639           if (icond && TREE_CODE (icond) == INTEGER_CST)
11640             {
11641               if (integer_zerop (icond))
11642                 {
11643                   if (code == EQ_EXPR)
11644                     return omit_two_operands (type, boolean_false_node,
11645                                               real0, real1);
11646                   return fold_build2 (NE_EXPR, type, real0, real1);
11647                 }
11648               else
11649                 {
11650                   if (code == NE_EXPR)
11651                     return omit_two_operands (type, boolean_true_node,
11652                                               real0, real1);
11653                   return fold_build2 (EQ_EXPR, type, real0, real1);
11654                 }
11655             }
11656         }
11657
11658       return NULL_TREE;
11659
11660     case LT_EXPR:
11661     case GT_EXPR:
11662     case LE_EXPR:
11663     case GE_EXPR:
11664       tem = fold_comparison (code, type, op0, op1);
11665       if (tem != NULL_TREE)
11666         return tem;
11667
11668       /* Transform comparisons of the form X +- C CMP X.  */
11669       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11670           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11671           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
11672                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
11673               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11674                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
11675         {
11676           tree arg01 = TREE_OPERAND (arg0, 1);
11677           enum tree_code code0 = TREE_CODE (arg0);
11678           int is_positive;
11679
11680           if (TREE_CODE (arg01) == REAL_CST)
11681             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
11682           else
11683             is_positive = tree_int_cst_sgn (arg01);
11684
11685           /* (X - c) > X becomes false.  */
11686           if (code == GT_EXPR
11687               && ((code0 == MINUS_EXPR && is_positive >= 0)
11688                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11689             {
11690               if (TREE_CODE (arg01) == INTEGER_CST
11691                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11692                 fold_overflow_warning (("assuming signed overflow does not "
11693                                         "occur when assuming that (X - c) > X "
11694                                         "is always false"),
11695                                        WARN_STRICT_OVERFLOW_ALL);
11696               return constant_boolean_node (0, type);
11697             }
11698
11699           /* Likewise (X + c) < X becomes false.  */
11700           if (code == LT_EXPR
11701               && ((code0 == PLUS_EXPR && is_positive >= 0)
11702                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11703             {
11704               if (TREE_CODE (arg01) == INTEGER_CST
11705                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11706                 fold_overflow_warning (("assuming signed overflow does not "
11707                                         "occur when assuming that "
11708                                         "(X + c) < X is always false"),
11709                                        WARN_STRICT_OVERFLOW_ALL);
11710               return constant_boolean_node (0, type);
11711             }
11712
11713           /* Convert (X - c) <= X to true.  */
11714           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11715               && code == LE_EXPR
11716               && ((code0 == MINUS_EXPR && is_positive >= 0)
11717                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11718             {
11719               if (TREE_CODE (arg01) == INTEGER_CST
11720                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11721                 fold_overflow_warning (("assuming signed overflow does not "
11722                                         "occur when assuming that "
11723                                         "(X - c) <= X is always true"),
11724                                        WARN_STRICT_OVERFLOW_ALL);
11725               return constant_boolean_node (1, type);
11726             }
11727
11728           /* Convert (X + c) >= X to true.  */
11729           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11730               && code == GE_EXPR
11731               && ((code0 == PLUS_EXPR && is_positive >= 0)
11732                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11733             {
11734               if (TREE_CODE (arg01) == INTEGER_CST
11735                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11736                 fold_overflow_warning (("assuming signed overflow does not "
11737                                         "occur when assuming that "
11738                                         "(X + c) >= X is always true"),
11739                                        WARN_STRICT_OVERFLOW_ALL);
11740               return constant_boolean_node (1, type);
11741             }
11742
11743           if (TREE_CODE (arg01) == INTEGER_CST)
11744             {
11745               /* Convert X + c > X and X - c < X to true for integers.  */
11746               if (code == GT_EXPR
11747                   && ((code0 == PLUS_EXPR && is_positive > 0)
11748                       || (code0 == MINUS_EXPR && is_positive < 0)))
11749                 {
11750                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11751                     fold_overflow_warning (("assuming signed overflow does "
11752                                             "not occur when assuming that "
11753                                             "(X + c) > X is always true"),
11754                                            WARN_STRICT_OVERFLOW_ALL);
11755                   return constant_boolean_node (1, type);
11756                 }
11757
11758               if (code == LT_EXPR
11759                   && ((code0 == MINUS_EXPR && is_positive > 0)
11760                       || (code0 == PLUS_EXPR && is_positive < 0)))
11761                 {
11762                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11763                     fold_overflow_warning (("assuming signed overflow does "
11764                                             "not occur when assuming that "
11765                                             "(X - c) < X is always true"),
11766                                            WARN_STRICT_OVERFLOW_ALL);
11767                   return constant_boolean_node (1, type);
11768                 }
11769
11770               /* Convert X + c <= X and X - c >= X to false for integers.  */
11771               if (code == LE_EXPR
11772                   && ((code0 == PLUS_EXPR && is_positive > 0)
11773                       || (code0 == MINUS_EXPR && is_positive < 0)))
11774                 {
11775                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11776                     fold_overflow_warning (("assuming signed overflow does "
11777                                             "not occur when assuming that "
11778                                             "(X + c) <= X is always false"),
11779                                            WARN_STRICT_OVERFLOW_ALL);
11780                   return constant_boolean_node (0, type);
11781                 }
11782
11783               if (code == GE_EXPR
11784                   && ((code0 == MINUS_EXPR && is_positive > 0)
11785                       || (code0 == PLUS_EXPR && is_positive < 0)))
11786                 {
11787                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11788                     fold_overflow_warning (("assuming signed overflow does "
11789                                             "not occur when assuming that "
11790                                             "(X - c) >= X is always false"),
11791                                            WARN_STRICT_OVERFLOW_ALL);
11792                   return constant_boolean_node (0, type);
11793                 }
11794             }
11795         }
11796
11797       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
11798          This transformation affects the cases which are handled in later
11799          optimizations involving comparisons with non-negative constants.  */
11800       if (TREE_CODE (arg1) == INTEGER_CST
11801           && TREE_CODE (arg0) != INTEGER_CST
11802           && tree_int_cst_sgn (arg1) > 0)
11803         {
11804           if (code == GE_EXPR)
11805             {
11806               arg1 = const_binop (MINUS_EXPR, arg1,
11807                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11808               return fold_build2 (GT_EXPR, type, arg0,
11809                                   fold_convert (TREE_TYPE (arg0), arg1));
11810             }
11811           if (code == LT_EXPR)
11812             {
11813               arg1 = const_binop (MINUS_EXPR, arg1,
11814                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11815               return fold_build2 (LE_EXPR, type, arg0,
11816                                   fold_convert (TREE_TYPE (arg0), arg1));
11817             }
11818         }
11819
11820       /* Comparisons with the highest or lowest possible integer of
11821          the specified precision will have known values.  */
11822       {
11823         tree arg1_type = TREE_TYPE (arg1);
11824         unsigned int width = TYPE_PRECISION (arg1_type);
11825
11826         if (TREE_CODE (arg1) == INTEGER_CST
11827             && !TREE_OVERFLOW (arg1)
11828             && width <= 2 * HOST_BITS_PER_WIDE_INT
11829             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
11830           {
11831             HOST_WIDE_INT signed_max_hi;
11832             unsigned HOST_WIDE_INT signed_max_lo;
11833             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
11834
11835             if (width <= HOST_BITS_PER_WIDE_INT)
11836               {
11837                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11838                                 - 1;
11839                 signed_max_hi = 0;
11840                 max_hi = 0;
11841
11842                 if (TYPE_UNSIGNED (arg1_type))
11843                   {
11844                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11845                     min_lo = 0;
11846                     min_hi = 0;
11847                   }
11848                 else
11849                   {
11850                     max_lo = signed_max_lo;
11851                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11852                     min_hi = -1;
11853                   }
11854               }
11855             else
11856               {
11857                 width -= HOST_BITS_PER_WIDE_INT;
11858                 signed_max_lo = -1;
11859                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11860                                 - 1;
11861                 max_lo = -1;
11862                 min_lo = 0;
11863
11864                 if (TYPE_UNSIGNED (arg1_type))
11865                   {
11866                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11867                     min_hi = 0;
11868                   }
11869                 else
11870                   {
11871                     max_hi = signed_max_hi;
11872                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11873                   }
11874               }
11875
11876             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
11877                 && TREE_INT_CST_LOW (arg1) == max_lo)
11878               switch (code)
11879                 {
11880                 case GT_EXPR:
11881                   return omit_one_operand (type, integer_zero_node, arg0);
11882
11883                 case GE_EXPR:
11884                   return fold_build2 (EQ_EXPR, type, op0, op1);
11885
11886                 case LE_EXPR:
11887                   return omit_one_operand (type, integer_one_node, arg0);
11888
11889                 case LT_EXPR:
11890                   return fold_build2 (NE_EXPR, type, op0, op1);
11891
11892                 /* The GE_EXPR and LT_EXPR cases above are not normally
11893                    reached because of previous transformations.  */
11894
11895                 default:
11896                   break;
11897                 }
11898             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11899                      == max_hi
11900                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
11901               switch (code)
11902                 {
11903                 case GT_EXPR:
11904                   arg1 = const_binop (PLUS_EXPR, arg1,
11905                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11906                   return fold_build2 (EQ_EXPR, type,
11907                                       fold_convert (TREE_TYPE (arg1), arg0),
11908                                       arg1);
11909                 case LE_EXPR:
11910                   arg1 = const_binop (PLUS_EXPR, arg1,
11911                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11912                   return fold_build2 (NE_EXPR, type,
11913                                       fold_convert (TREE_TYPE (arg1), arg0),
11914                                       arg1);
11915                 default:
11916                   break;
11917                 }
11918             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11919                      == min_hi
11920                      && TREE_INT_CST_LOW (arg1) == min_lo)
11921               switch (code)
11922                 {
11923                 case LT_EXPR:
11924                   return omit_one_operand (type, integer_zero_node, arg0);
11925
11926                 case LE_EXPR:
11927                   return fold_build2 (EQ_EXPR, type, op0, op1);
11928
11929                 case GE_EXPR:
11930                   return omit_one_operand (type, integer_one_node, arg0);
11931
11932                 case GT_EXPR:
11933                   return fold_build2 (NE_EXPR, type, op0, op1);
11934
11935                 default:
11936                   break;
11937                 }
11938             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11939                      == min_hi
11940                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
11941               switch (code)
11942                 {
11943                 case GE_EXPR:
11944                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11945                   return fold_build2 (NE_EXPR, type,
11946                                       fold_convert (TREE_TYPE (arg1), arg0),
11947                                       arg1);
11948                 case LT_EXPR:
11949                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11950                   return fold_build2 (EQ_EXPR, type,
11951                                       fold_convert (TREE_TYPE (arg1), arg0),
11952                                       arg1);
11953                 default:
11954                   break;
11955                 }
11956
11957             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
11958                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
11959                      && TYPE_UNSIGNED (arg1_type)
11960                      /* We will flip the signedness of the comparison operator
11961                         associated with the mode of arg1, so the sign bit is
11962                         specified by this mode.  Check that arg1 is the signed
11963                         max associated with this sign bit.  */
11964                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
11965                      /* signed_type does not work on pointer types.  */
11966                      && INTEGRAL_TYPE_P (arg1_type))
11967               {
11968                 /* The following case also applies to X < signed_max+1
11969                    and X >= signed_max+1 because previous transformations.  */
11970                 if (code == LE_EXPR || code == GT_EXPR)
11971                   {
11972                     tree st;
11973                     st = signed_type_for (TREE_TYPE (arg1));
11974                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
11975                                         type, fold_convert (st, arg0),
11976                                         build_int_cst (st, 0));
11977                   }
11978               }
11979           }
11980       }
11981
11982       /* If we are comparing an ABS_EXPR with a constant, we can
11983          convert all the cases into explicit comparisons, but they may
11984          well not be faster than doing the ABS and one comparison.
11985          But ABS (X) <= C is a range comparison, which becomes a subtraction
11986          and a comparison, and is probably faster.  */
11987       if (code == LE_EXPR
11988           && TREE_CODE (arg1) == INTEGER_CST
11989           && TREE_CODE (arg0) == ABS_EXPR
11990           && ! TREE_SIDE_EFFECTS (arg0)
11991           && (0 != (tem = negate_expr (arg1)))
11992           && TREE_CODE (tem) == INTEGER_CST
11993           && !TREE_OVERFLOW (tem))
11994         return fold_build2 (TRUTH_ANDIF_EXPR, type,
11995                             build2 (GE_EXPR, type,
11996                                     TREE_OPERAND (arg0, 0), tem),
11997                             build2 (LE_EXPR, type,
11998                                     TREE_OPERAND (arg0, 0), arg1));
11999
12000       /* Convert ABS_EXPR<x> >= 0 to true.  */
12001       strict_overflow_p = false;
12002       if (code == GE_EXPR
12003           && (integer_zerop (arg1)
12004               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12005                   && real_zerop (arg1)))
12006           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12007         {
12008           if (strict_overflow_p)
12009             fold_overflow_warning (("assuming signed overflow does not occur "
12010                                     "when simplifying comparison of "
12011                                     "absolute value and zero"),
12012                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12013           return omit_one_operand (type, integer_one_node, arg0);
12014         }
12015
12016       /* Convert ABS_EXPR<x> < 0 to false.  */
12017       strict_overflow_p = false;
12018       if (code == LT_EXPR
12019           && (integer_zerop (arg1) || real_zerop (arg1))
12020           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12021         {
12022           if (strict_overflow_p)
12023             fold_overflow_warning (("assuming signed overflow does not occur "
12024                                     "when simplifying comparison of "
12025                                     "absolute value and zero"),
12026                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12027           return omit_one_operand (type, integer_zero_node, arg0);
12028         }
12029
12030       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12031          and similarly for >= into !=.  */
12032       if ((code == LT_EXPR || code == GE_EXPR)
12033           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12034           && TREE_CODE (arg1) == LSHIFT_EXPR
12035           && integer_onep (TREE_OPERAND (arg1, 0)))
12036         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12037                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12038                                TREE_OPERAND (arg1, 1)),
12039                        build_int_cst (TREE_TYPE (arg0), 0));
12040
12041       if ((code == LT_EXPR || code == GE_EXPR)
12042           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12043           && (TREE_CODE (arg1) == NOP_EXPR
12044               || TREE_CODE (arg1) == CONVERT_EXPR)
12045           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12046           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12047         return
12048           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12049                   fold_convert (TREE_TYPE (arg0),
12050                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12051                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12052                                                       1))),
12053                   build_int_cst (TREE_TYPE (arg0), 0));
12054
12055       return NULL_TREE;
12056
12057     case UNORDERED_EXPR:
12058     case ORDERED_EXPR:
12059     case UNLT_EXPR:
12060     case UNLE_EXPR:
12061     case UNGT_EXPR:
12062     case UNGE_EXPR:
12063     case UNEQ_EXPR:
12064     case LTGT_EXPR:
12065       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12066         {
12067           t1 = fold_relational_const (code, type, arg0, arg1);
12068           if (t1 != NULL_TREE)
12069             return t1;
12070         }
12071
12072       /* If the first operand is NaN, the result is constant.  */
12073       if (TREE_CODE (arg0) == REAL_CST
12074           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12075           && (code != LTGT_EXPR || ! flag_trapping_math))
12076         {
12077           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12078                ? integer_zero_node
12079                : integer_one_node;
12080           return omit_one_operand (type, t1, arg1);
12081         }
12082
12083       /* If the second operand is NaN, the result is constant.  */
12084       if (TREE_CODE (arg1) == REAL_CST
12085           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12086           && (code != LTGT_EXPR || ! flag_trapping_math))
12087         {
12088           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12089                ? integer_zero_node
12090                : integer_one_node;
12091           return omit_one_operand (type, t1, arg0);
12092         }
12093
12094       /* Simplify unordered comparison of something with itself.  */
12095       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12096           && operand_equal_p (arg0, arg1, 0))
12097         return constant_boolean_node (1, type);
12098
12099       if (code == LTGT_EXPR
12100           && !flag_trapping_math
12101           && operand_equal_p (arg0, arg1, 0))
12102         return constant_boolean_node (0, type);
12103
12104       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12105       {
12106         tree targ0 = strip_float_extensions (arg0);
12107         tree targ1 = strip_float_extensions (arg1);
12108         tree newtype = TREE_TYPE (targ0);
12109
12110         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12111           newtype = TREE_TYPE (targ1);
12112
12113         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12114           return fold_build2 (code, type, fold_convert (newtype, targ0),
12115                               fold_convert (newtype, targ1));
12116       }
12117
12118       return NULL_TREE;
12119
12120     case COMPOUND_EXPR:
12121       /* When pedantic, a compound expression can be neither an lvalue
12122          nor an integer constant expression.  */
12123       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12124         return NULL_TREE;
12125       /* Don't let (0, 0) be null pointer constant.  */
12126       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12127                                  : fold_convert (type, arg1);
12128       return pedantic_non_lvalue (tem);
12129
12130     case COMPLEX_EXPR:
12131       if ((TREE_CODE (arg0) == REAL_CST
12132            && TREE_CODE (arg1) == REAL_CST)
12133           || (TREE_CODE (arg0) == INTEGER_CST
12134               && TREE_CODE (arg1) == INTEGER_CST))
12135         return build_complex (type, arg0, arg1);
12136       return NULL_TREE;
12137
12138     case ASSERT_EXPR:
12139       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12140       gcc_unreachable ();
12141
12142     default:
12143       return NULL_TREE;
12144     } /* switch (code) */
12145 }
12146
12147 /* Callback for walk_tree, looking for LABEL_EXPR.
12148    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12149    Do not check the sub-tree of GOTO_EXPR.  */
12150
12151 static tree
12152 contains_label_1 (tree *tp,
12153                   int *walk_subtrees,
12154                   void *data ATTRIBUTE_UNUSED)
12155 {
12156   switch (TREE_CODE (*tp))
12157     {
12158     case LABEL_EXPR:
12159       return *tp;
12160     case GOTO_EXPR:
12161       *walk_subtrees = 0;
12162     /* no break */
12163     default:
12164       return NULL_TREE;
12165     }
12166 }
12167
12168 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12169    accessible from outside the sub-tree. Returns NULL_TREE if no
12170    addressable label is found.  */
12171
12172 static bool
12173 contains_label_p (tree st)
12174 {
12175   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12176 }
12177
12178 /* Fold a ternary expression of code CODE and type TYPE with operands
12179    OP0, OP1, and OP2.  Return the folded expression if folding is
12180    successful.  Otherwise, return NULL_TREE.  */
12181
12182 tree
12183 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12184 {
12185   tree tem;
12186   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12187   enum tree_code_class kind = TREE_CODE_CLASS (code);
12188
12189   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12190               && TREE_CODE_LENGTH (code) == 3);
12191
12192   /* Strip any conversions that don't change the mode.  This is safe
12193      for every expression, except for a comparison expression because
12194      its signedness is derived from its operands.  So, in the latter
12195      case, only strip conversions that don't change the signedness.
12196
12197      Note that this is done as an internal manipulation within the
12198      constant folder, in order to find the simplest representation of
12199      the arguments so that their form can be studied.  In any cases,
12200      the appropriate type conversions should be put back in the tree
12201      that will get out of the constant folder.  */
12202   if (op0)
12203     {
12204       arg0 = op0;
12205       STRIP_NOPS (arg0);
12206     }
12207
12208   if (op1)
12209     {
12210       arg1 = op1;
12211       STRIP_NOPS (arg1);
12212     }
12213
12214   switch (code)
12215     {
12216     case COMPONENT_REF:
12217       if (TREE_CODE (arg0) == CONSTRUCTOR
12218           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12219         {
12220           unsigned HOST_WIDE_INT idx;
12221           tree field, value;
12222           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12223             if (field == arg1)
12224               return value;
12225         }
12226       return NULL_TREE;
12227
12228     case COND_EXPR:
12229       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12230          so all simple results must be passed through pedantic_non_lvalue.  */
12231       if (TREE_CODE (arg0) == INTEGER_CST)
12232         {
12233           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12234           tem = integer_zerop (arg0) ? op2 : op1;
12235           /* Only optimize constant conditions when the selected branch
12236              has the same type as the COND_EXPR.  This avoids optimizing
12237              away "c ? x : throw", where the throw has a void type.
12238              Avoid throwing away that operand which contains label.  */
12239           if ((!TREE_SIDE_EFFECTS (unused_op)
12240                || !contains_label_p (unused_op))
12241               && (! VOID_TYPE_P (TREE_TYPE (tem))
12242                   || VOID_TYPE_P (type)))
12243             return pedantic_non_lvalue (tem);
12244           return NULL_TREE;
12245         }
12246       if (operand_equal_p (arg1, op2, 0))
12247         return pedantic_omit_one_operand (type, arg1, arg0);
12248
12249       /* If we have A op B ? A : C, we may be able to convert this to a
12250          simpler expression, depending on the operation and the values
12251          of B and C.  Signed zeros prevent all of these transformations,
12252          for reasons given above each one.
12253
12254          Also try swapping the arguments and inverting the conditional.  */
12255       if (COMPARISON_CLASS_P (arg0)
12256           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12257                                              arg1, TREE_OPERAND (arg0, 1))
12258           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12259         {
12260           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12261           if (tem)
12262             return tem;
12263         }
12264
12265       if (COMPARISON_CLASS_P (arg0)
12266           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12267                                              op2,
12268                                              TREE_OPERAND (arg0, 1))
12269           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12270         {
12271           tem = fold_truth_not_expr (arg0);
12272           if (tem && COMPARISON_CLASS_P (tem))
12273             {
12274               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12275               if (tem)
12276                 return tem;
12277             }
12278         }
12279
12280       /* If the second operand is simpler than the third, swap them
12281          since that produces better jump optimization results.  */
12282       if (truth_value_p (TREE_CODE (arg0))
12283           && tree_swap_operands_p (op1, op2, false))
12284         {
12285           /* See if this can be inverted.  If it can't, possibly because
12286              it was a floating-point inequality comparison, don't do
12287              anything.  */
12288           tem = fold_truth_not_expr (arg0);
12289           if (tem)
12290             return fold_build3 (code, type, tem, op2, op1);
12291         }
12292
12293       /* Convert A ? 1 : 0 to simply A.  */
12294       if (integer_onep (op1)
12295           && integer_zerop (op2)
12296           /* If we try to convert OP0 to our type, the
12297              call to fold will try to move the conversion inside
12298              a COND, which will recurse.  In that case, the COND_EXPR
12299              is probably the best choice, so leave it alone.  */
12300           && type == TREE_TYPE (arg0))
12301         return pedantic_non_lvalue (arg0);
12302
12303       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12304          over COND_EXPR in cases such as floating point comparisons.  */
12305       if (integer_zerop (op1)
12306           && integer_onep (op2)
12307           && truth_value_p (TREE_CODE (arg0)))
12308         return pedantic_non_lvalue (fold_convert (type,
12309                                                   invert_truthvalue (arg0)));
12310
12311       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12312       if (TREE_CODE (arg0) == LT_EXPR
12313           && integer_zerop (TREE_OPERAND (arg0, 1))
12314           && integer_zerop (op2)
12315           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12316         {
12317           /* sign_bit_p only checks ARG1 bits within A's precision.
12318              If <sign bit of A> has wider type than A, bits outside
12319              of A's precision in <sign bit of A> need to be checked.
12320              If they are all 0, this optimization needs to be done
12321              in unsigned A's type, if they are all 1 in signed A's type,
12322              otherwise this can't be done.  */
12323           if (TYPE_PRECISION (TREE_TYPE (tem))
12324               < TYPE_PRECISION (TREE_TYPE (arg1))
12325               && TYPE_PRECISION (TREE_TYPE (tem))
12326                  < TYPE_PRECISION (type))
12327             {
12328               unsigned HOST_WIDE_INT mask_lo;
12329               HOST_WIDE_INT mask_hi;
12330               int inner_width, outer_width;
12331               tree tem_type;
12332
12333               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12334               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12335               if (outer_width > TYPE_PRECISION (type))
12336                 outer_width = TYPE_PRECISION (type);
12337
12338               if (outer_width > HOST_BITS_PER_WIDE_INT)
12339                 {
12340                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12341                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12342                   mask_lo = -1;
12343                 }
12344               else
12345                 {
12346                   mask_hi = 0;
12347                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12348                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12349                 }
12350               if (inner_width > HOST_BITS_PER_WIDE_INT)
12351                 {
12352                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12353                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12354                   mask_lo = 0;
12355                 }
12356               else
12357                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12358                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12359
12360               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12361                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12362                 {
12363                   tem_type = signed_type_for (TREE_TYPE (tem));
12364                   tem = fold_convert (tem_type, tem);
12365                 }
12366               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12367                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12368                 {
12369                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12370                   tem = fold_convert (tem_type, tem);
12371                 }
12372               else
12373                 tem = NULL;
12374             }
12375
12376           if (tem)
12377             return fold_convert (type,
12378                                  fold_build2 (BIT_AND_EXPR,
12379                                               TREE_TYPE (tem), tem,
12380                                               fold_convert (TREE_TYPE (tem),
12381                                                             arg1)));
12382         }
12383
12384       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12385          already handled above.  */
12386       if (TREE_CODE (arg0) == BIT_AND_EXPR
12387           && integer_onep (TREE_OPERAND (arg0, 1))
12388           && integer_zerop (op2)
12389           && integer_pow2p (arg1))
12390         {
12391           tree tem = TREE_OPERAND (arg0, 0);
12392           STRIP_NOPS (tem);
12393           if (TREE_CODE (tem) == RSHIFT_EXPR
12394               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12395               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12396                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12397             return fold_build2 (BIT_AND_EXPR, type,
12398                                 TREE_OPERAND (tem, 0), arg1);
12399         }
12400
12401       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
12402          is probably obsolete because the first operand should be a
12403          truth value (that's why we have the two cases above), but let's
12404          leave it in until we can confirm this for all front-ends.  */
12405       if (integer_zerop (op2)
12406           && TREE_CODE (arg0) == NE_EXPR
12407           && integer_zerop (TREE_OPERAND (arg0, 1))
12408           && integer_pow2p (arg1)
12409           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12410           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12411                               arg1, OEP_ONLY_CONST))
12412         return pedantic_non_lvalue (fold_convert (type,
12413                                                   TREE_OPERAND (arg0, 0)));
12414
12415       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
12416       if (integer_zerop (op2)
12417           && truth_value_p (TREE_CODE (arg0))
12418           && truth_value_p (TREE_CODE (arg1)))
12419         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12420                             fold_convert (type, arg0),
12421                             arg1);
12422
12423       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
12424       if (integer_onep (op2)
12425           && truth_value_p (TREE_CODE (arg0))
12426           && truth_value_p (TREE_CODE (arg1)))
12427         {
12428           /* Only perform transformation if ARG0 is easily inverted.  */
12429           tem = fold_truth_not_expr (arg0);
12430           if (tem)
12431             return fold_build2 (TRUTH_ORIF_EXPR, type,
12432                                 fold_convert (type, tem),
12433                                 arg1);
12434         }
12435
12436       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
12437       if (integer_zerop (arg1)
12438           && truth_value_p (TREE_CODE (arg0))
12439           && truth_value_p (TREE_CODE (op2)))
12440         {
12441           /* Only perform transformation if ARG0 is easily inverted.  */
12442           tem = fold_truth_not_expr (arg0);
12443           if (tem)
12444             return fold_build2 (TRUTH_ANDIF_EXPR, type,
12445                                 fold_convert (type, tem),
12446                                 op2);
12447         }
12448
12449       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
12450       if (integer_onep (arg1)
12451           && truth_value_p (TREE_CODE (arg0))
12452           && truth_value_p (TREE_CODE (op2)))
12453         return fold_build2 (TRUTH_ORIF_EXPR, type,
12454                             fold_convert (type, arg0),
12455                             op2);
12456
12457       return NULL_TREE;
12458
12459     case CALL_EXPR:
12460       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
12461          of fold_ternary on them.  */
12462       gcc_unreachable ();
12463
12464     case BIT_FIELD_REF:
12465       if ((TREE_CODE (arg0) == VECTOR_CST
12466            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12467           && type == TREE_TYPE (TREE_TYPE (arg0))
12468           && host_integerp (arg1, 1)
12469           && host_integerp (op2, 1))
12470         {
12471           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12472           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12473
12474           if (width != 0
12475               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12476               && (idx % width) == 0
12477               && (idx = idx / width)
12478                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12479             {
12480               tree elements = NULL_TREE;
12481
12482               if (TREE_CODE (arg0) == VECTOR_CST)
12483                 elements = TREE_VECTOR_CST_ELTS (arg0);
12484               else
12485                 {
12486                   unsigned HOST_WIDE_INT idx;
12487                   tree value;
12488
12489                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
12490                     elements = tree_cons (NULL_TREE, value, elements);
12491                 }
12492               while (idx-- > 0 && elements)
12493                 elements = TREE_CHAIN (elements);
12494               if (elements)
12495                 return TREE_VALUE (elements);
12496               else
12497                 return fold_convert (type, integer_zero_node);
12498             }
12499         }
12500       return NULL_TREE;
12501
12502     default:
12503       return NULL_TREE;
12504     } /* switch (code) */
12505 }
12506
12507 /* Perform constant folding and related simplification of EXPR.
12508    The related simplifications include x*1 => x, x*0 => 0, etc.,
12509    and application of the associative law.
12510    NOP_EXPR conversions may be removed freely (as long as we
12511    are careful not to change the type of the overall expression).
12512    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
12513    but we can constant-fold them if they have constant operands.  */
12514
12515 #ifdef ENABLE_FOLD_CHECKING
12516 # define fold(x) fold_1 (x)
12517 static tree fold_1 (tree);
12518 static
12519 #endif
12520 tree
12521 fold (tree expr)
12522 {
12523   const tree t = expr;
12524   enum tree_code code = TREE_CODE (t);
12525   enum tree_code_class kind = TREE_CODE_CLASS (code);
12526   tree tem;
12527
12528   /* Return right away if a constant.  */
12529   if (kind == tcc_constant)
12530     return t;
12531
12532   /* CALL_EXPR-like objects with variable numbers of operands are
12533      treated specially.  */
12534   if (kind == tcc_vl_exp)
12535     {
12536       if (code == CALL_EXPR)
12537         {
12538           tem = fold_call_expr (expr, false);
12539           return tem ? tem : expr;
12540         }
12541       return expr;
12542     }
12543
12544   if (IS_EXPR_CODE_CLASS (kind)
12545       || IS_GIMPLE_STMT_CODE_CLASS (kind))
12546     {
12547       tree type = TREE_TYPE (t);
12548       tree op0, op1, op2;
12549
12550       switch (TREE_CODE_LENGTH (code))
12551         {
12552         case 1:
12553           op0 = TREE_OPERAND (t, 0);
12554           tem = fold_unary (code, type, op0);
12555           return tem ? tem : expr;
12556         case 2:
12557           op0 = TREE_OPERAND (t, 0);
12558           op1 = TREE_OPERAND (t, 1);
12559           tem = fold_binary (code, type, op0, op1);
12560           return tem ? tem : expr;
12561         case 3:
12562           op0 = TREE_OPERAND (t, 0);
12563           op1 = TREE_OPERAND (t, 1);
12564           op2 = TREE_OPERAND (t, 2);
12565           tem = fold_ternary (code, type, op0, op1, op2);
12566           return tem ? tem : expr;
12567         default:
12568           break;
12569         }
12570     }
12571
12572   switch (code)
12573     {
12574     case CONST_DECL:
12575       return fold (DECL_INITIAL (t));
12576
12577     default:
12578       return t;
12579     } /* switch (code) */
12580 }
12581
12582 #ifdef ENABLE_FOLD_CHECKING
12583 #undef fold
12584
12585 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
12586 static void fold_check_failed (tree, tree);
12587 void print_fold_checksum (tree);
12588
12589 /* When --enable-checking=fold, compute a digest of expr before
12590    and after actual fold call to see if fold did not accidentally
12591    change original expr.  */
12592
12593 tree
12594 fold (tree expr)
12595 {
12596   tree ret;
12597   struct md5_ctx ctx;
12598   unsigned char checksum_before[16], checksum_after[16];
12599   htab_t ht;
12600
12601   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12602   md5_init_ctx (&ctx);
12603   fold_checksum_tree (expr, &ctx, ht);
12604   md5_finish_ctx (&ctx, checksum_before);
12605   htab_empty (ht);
12606
12607   ret = fold_1 (expr);
12608
12609   md5_init_ctx (&ctx);
12610   fold_checksum_tree (expr, &ctx, ht);
12611   md5_finish_ctx (&ctx, checksum_after);
12612   htab_delete (ht);
12613
12614   if (memcmp (checksum_before, checksum_after, 16))
12615     fold_check_failed (expr, ret);
12616
12617   return ret;
12618 }
12619
12620 void
12621 print_fold_checksum (tree expr)
12622 {
12623   struct md5_ctx ctx;
12624   unsigned char checksum[16], cnt;
12625   htab_t ht;
12626
12627   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12628   md5_init_ctx (&ctx);
12629   fold_checksum_tree (expr, &ctx, ht);
12630   md5_finish_ctx (&ctx, checksum);
12631   htab_delete (ht);
12632   for (cnt = 0; cnt < 16; ++cnt)
12633     fprintf (stderr, "%02x", checksum[cnt]);
12634   putc ('\n', stderr);
12635 }
12636
12637 static void
12638 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
12639 {
12640   internal_error ("fold check: original tree changed by fold");
12641 }
12642
12643 static void
12644 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
12645 {
12646   void **slot;
12647   enum tree_code code;
12648   struct tree_function_decl buf;
12649   int i, len;
12650   
12651 recursive_label:
12652
12653   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
12654                <= sizeof (struct tree_function_decl))
12655               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
12656   if (expr == NULL)
12657     return;
12658   slot = htab_find_slot (ht, expr, INSERT);
12659   if (*slot != NULL)
12660     return;
12661   *slot = expr;
12662   code = TREE_CODE (expr);
12663   if (TREE_CODE_CLASS (code) == tcc_declaration
12664       && DECL_ASSEMBLER_NAME_SET_P (expr))
12665     {
12666       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
12667       memcpy ((char *) &buf, expr, tree_size (expr));
12668       expr = (tree) &buf;
12669       SET_DECL_ASSEMBLER_NAME (expr, NULL);
12670     }
12671   else if (TREE_CODE_CLASS (code) == tcc_type
12672            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
12673                || TYPE_CACHED_VALUES_P (expr)
12674                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
12675     {
12676       /* Allow these fields to be modified.  */
12677       memcpy ((char *) &buf, expr, tree_size (expr));
12678       expr = (tree) &buf;
12679       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
12680       TYPE_POINTER_TO (expr) = NULL;
12681       TYPE_REFERENCE_TO (expr) = NULL;
12682       if (TYPE_CACHED_VALUES_P (expr))
12683         {
12684           TYPE_CACHED_VALUES_P (expr) = 0;
12685           TYPE_CACHED_VALUES (expr) = NULL;
12686         }
12687     }
12688   md5_process_bytes (expr, tree_size (expr), ctx);
12689   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
12690   if (TREE_CODE_CLASS (code) != tcc_type
12691       && TREE_CODE_CLASS (code) != tcc_declaration
12692       && code != TREE_LIST)
12693     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
12694   switch (TREE_CODE_CLASS (code))
12695     {
12696     case tcc_constant:
12697       switch (code)
12698         {
12699         case STRING_CST:
12700           md5_process_bytes (TREE_STRING_POINTER (expr),
12701                              TREE_STRING_LENGTH (expr), ctx);
12702           break;
12703         case COMPLEX_CST:
12704           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
12705           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
12706           break;
12707         case VECTOR_CST:
12708           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
12709           break;
12710         default:
12711           break;
12712         }
12713       break;
12714     case tcc_exceptional:
12715       switch (code)
12716         {
12717         case TREE_LIST:
12718           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
12719           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
12720           expr = TREE_CHAIN (expr);
12721           goto recursive_label;
12722           break;
12723         case TREE_VEC:
12724           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
12725             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
12726           break;
12727         default:
12728           break;
12729         }
12730       break;
12731     case tcc_expression:
12732     case tcc_reference:
12733     case tcc_comparison:
12734     case tcc_unary:
12735     case tcc_binary:
12736     case tcc_statement:
12737     case tcc_vl_exp:
12738       len = TREE_OPERAND_LENGTH (expr);
12739       for (i = 0; i < len; ++i)
12740         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
12741       break;
12742     case tcc_declaration:
12743       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
12744       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
12745       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
12746         {
12747           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
12748           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
12749           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
12750           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
12751           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
12752         }
12753       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
12754         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
12755           
12756       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
12757         {
12758           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
12759           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
12760           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
12761         }
12762       break;
12763     case tcc_type:
12764       if (TREE_CODE (expr) == ENUMERAL_TYPE)
12765         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
12766       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
12767       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
12768       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
12769       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
12770       if (INTEGRAL_TYPE_P (expr)
12771           || SCALAR_FLOAT_TYPE_P (expr))
12772         {
12773           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
12774           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
12775         }
12776       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
12777       if (TREE_CODE (expr) == RECORD_TYPE
12778           || TREE_CODE (expr) == UNION_TYPE
12779           || TREE_CODE (expr) == QUAL_UNION_TYPE)
12780         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
12781       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
12782       break;
12783     default:
12784       break;
12785     }
12786 }
12787
12788 #endif
12789
12790 /* Fold a unary tree expression with code CODE of type TYPE with an
12791    operand OP0.  Return a folded expression if successful.  Otherwise,
12792    return a tree expression with code CODE of type TYPE with an
12793    operand OP0.  */
12794
12795 tree
12796 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
12797 {
12798   tree tem;
12799 #ifdef ENABLE_FOLD_CHECKING
12800   unsigned char checksum_before[16], checksum_after[16];
12801   struct md5_ctx ctx;
12802   htab_t ht;
12803
12804   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12805   md5_init_ctx (&ctx);
12806   fold_checksum_tree (op0, &ctx, ht);
12807   md5_finish_ctx (&ctx, checksum_before);
12808   htab_empty (ht);
12809 #endif
12810   
12811   tem = fold_unary (code, type, op0);
12812   if (!tem)
12813     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
12814   
12815 #ifdef ENABLE_FOLD_CHECKING
12816   md5_init_ctx (&ctx);
12817   fold_checksum_tree (op0, &ctx, ht);
12818   md5_finish_ctx (&ctx, checksum_after);
12819   htab_delete (ht);
12820
12821   if (memcmp (checksum_before, checksum_after, 16))
12822     fold_check_failed (op0, tem);
12823 #endif
12824   return tem;
12825 }
12826
12827 /* Fold a binary tree expression with code CODE of type TYPE with
12828    operands OP0 and OP1.  Return a folded expression if successful.
12829    Otherwise, return a tree expression with code CODE of type TYPE
12830    with operands OP0 and OP1.  */
12831
12832 tree
12833 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
12834                   MEM_STAT_DECL)
12835 {
12836   tree tem;
12837 #ifdef ENABLE_FOLD_CHECKING
12838   unsigned char checksum_before_op0[16],
12839                 checksum_before_op1[16],
12840                 checksum_after_op0[16],
12841                 checksum_after_op1[16];
12842   struct md5_ctx ctx;
12843   htab_t ht;
12844
12845   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12846   md5_init_ctx (&ctx);
12847   fold_checksum_tree (op0, &ctx, ht);
12848   md5_finish_ctx (&ctx, checksum_before_op0);
12849   htab_empty (ht);
12850
12851   md5_init_ctx (&ctx);
12852   fold_checksum_tree (op1, &ctx, ht);
12853   md5_finish_ctx (&ctx, checksum_before_op1);
12854   htab_empty (ht);
12855 #endif
12856
12857   tem = fold_binary (code, type, op0, op1);
12858   if (!tem)
12859     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
12860   
12861 #ifdef ENABLE_FOLD_CHECKING
12862   md5_init_ctx (&ctx);
12863   fold_checksum_tree (op0, &ctx, ht);
12864   md5_finish_ctx (&ctx, checksum_after_op0);
12865   htab_empty (ht);
12866
12867   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12868     fold_check_failed (op0, tem);
12869   
12870   md5_init_ctx (&ctx);
12871   fold_checksum_tree (op1, &ctx, ht);
12872   md5_finish_ctx (&ctx, checksum_after_op1);
12873   htab_delete (ht);
12874
12875   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12876     fold_check_failed (op1, tem);
12877 #endif
12878   return tem;
12879 }
12880
12881 /* Fold a ternary tree expression with code CODE of type TYPE with
12882    operands OP0, OP1, and OP2.  Return a folded expression if
12883    successful.  Otherwise, return a tree expression with code CODE of
12884    type TYPE with operands OP0, OP1, and OP2.  */
12885
12886 tree
12887 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
12888              MEM_STAT_DECL)
12889 {
12890   tree tem;
12891 #ifdef ENABLE_FOLD_CHECKING
12892   unsigned char checksum_before_op0[16],
12893                 checksum_before_op1[16],
12894                 checksum_before_op2[16],
12895                 checksum_after_op0[16],
12896                 checksum_after_op1[16],
12897                 checksum_after_op2[16];
12898   struct md5_ctx ctx;
12899   htab_t ht;
12900
12901   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12902   md5_init_ctx (&ctx);
12903   fold_checksum_tree (op0, &ctx, ht);
12904   md5_finish_ctx (&ctx, checksum_before_op0);
12905   htab_empty (ht);
12906
12907   md5_init_ctx (&ctx);
12908   fold_checksum_tree (op1, &ctx, ht);
12909   md5_finish_ctx (&ctx, checksum_before_op1);
12910   htab_empty (ht);
12911
12912   md5_init_ctx (&ctx);
12913   fold_checksum_tree (op2, &ctx, ht);
12914   md5_finish_ctx (&ctx, checksum_before_op2);
12915   htab_empty (ht);
12916 #endif
12917
12918   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
12919   tem = fold_ternary (code, type, op0, op1, op2);
12920   if (!tem)
12921     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
12922       
12923 #ifdef ENABLE_FOLD_CHECKING
12924   md5_init_ctx (&ctx);
12925   fold_checksum_tree (op0, &ctx, ht);
12926   md5_finish_ctx (&ctx, checksum_after_op0);
12927   htab_empty (ht);
12928
12929   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12930     fold_check_failed (op0, tem);
12931   
12932   md5_init_ctx (&ctx);
12933   fold_checksum_tree (op1, &ctx, ht);
12934   md5_finish_ctx (&ctx, checksum_after_op1);
12935   htab_empty (ht);
12936
12937   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12938     fold_check_failed (op1, tem);
12939   
12940   md5_init_ctx (&ctx);
12941   fold_checksum_tree (op2, &ctx, ht);
12942   md5_finish_ctx (&ctx, checksum_after_op2);
12943   htab_delete (ht);
12944
12945   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
12946     fold_check_failed (op2, tem);
12947 #endif
12948   return tem;
12949 }
12950
12951 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
12952    arguments in ARGARRAY, and a null static chain.
12953    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
12954    of type TYPE from the given operands as constructed by build_call_array.  */
12955
12956 tree
12957 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
12958 {
12959   tree tem;
12960 #ifdef ENABLE_FOLD_CHECKING
12961   unsigned char checksum_before_fn[16],
12962                 checksum_before_arglist[16],
12963                 checksum_after_fn[16],
12964                 checksum_after_arglist[16];
12965   struct md5_ctx ctx;
12966   htab_t ht;
12967   int i;
12968
12969   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12970   md5_init_ctx (&ctx);
12971   fold_checksum_tree (fn, &ctx, ht);
12972   md5_finish_ctx (&ctx, checksum_before_fn);
12973   htab_empty (ht);
12974
12975   md5_init_ctx (&ctx);
12976   for (i = 0; i < nargs; i++)
12977     fold_checksum_tree (argarray[i], &ctx, ht);
12978   md5_finish_ctx (&ctx, checksum_before_arglist);
12979   htab_empty (ht);
12980 #endif
12981
12982   tem = fold_builtin_call_array (type, fn, nargs, argarray);
12983       
12984 #ifdef ENABLE_FOLD_CHECKING
12985   md5_init_ctx (&ctx);
12986   fold_checksum_tree (fn, &ctx, ht);
12987   md5_finish_ctx (&ctx, checksum_after_fn);
12988   htab_empty (ht);
12989
12990   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
12991     fold_check_failed (fn, tem);
12992   
12993   md5_init_ctx (&ctx);
12994   for (i = 0; i < nargs; i++)
12995     fold_checksum_tree (argarray[i], &ctx, ht);
12996   md5_finish_ctx (&ctx, checksum_after_arglist);
12997   htab_delete (ht);
12998
12999   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13000     fold_check_failed (NULL_TREE, tem);
13001 #endif
13002   return tem;
13003 }
13004
13005 /* Perform constant folding and related simplification of initializer
13006    expression EXPR.  These behave identically to "fold_buildN" but ignore
13007    potential run-time traps and exceptions that fold must preserve.  */
13008
13009 #define START_FOLD_INIT \
13010   int saved_signaling_nans = flag_signaling_nans;\
13011   int saved_trapping_math = flag_trapping_math;\
13012   int saved_rounding_math = flag_rounding_math;\
13013   int saved_trapv = flag_trapv;\
13014   int saved_folding_initializer = folding_initializer;\
13015   flag_signaling_nans = 0;\
13016   flag_trapping_math = 0;\
13017   flag_rounding_math = 0;\
13018   flag_trapv = 0;\
13019   folding_initializer = 1;
13020
13021 #define END_FOLD_INIT \
13022   flag_signaling_nans = saved_signaling_nans;\
13023   flag_trapping_math = saved_trapping_math;\
13024   flag_rounding_math = saved_rounding_math;\
13025   flag_trapv = saved_trapv;\
13026   folding_initializer = saved_folding_initializer;
13027
13028 tree
13029 fold_build1_initializer (enum tree_code code, tree type, tree op)
13030 {
13031   tree result;
13032   START_FOLD_INIT;
13033
13034   result = fold_build1 (code, type, op);
13035
13036   END_FOLD_INIT;
13037   return result;
13038 }
13039
13040 tree
13041 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13042 {
13043   tree result;
13044   START_FOLD_INIT;
13045
13046   result = fold_build2 (code, type, op0, op1);
13047
13048   END_FOLD_INIT;
13049   return result;
13050 }
13051
13052 tree
13053 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13054                          tree op2)
13055 {
13056   tree result;
13057   START_FOLD_INIT;
13058
13059   result = fold_build3 (code, type, op0, op1, op2);
13060
13061   END_FOLD_INIT;
13062   return result;
13063 }
13064
13065 tree
13066 fold_build_call_array_initializer (tree type, tree fn,
13067                                    int nargs, tree *argarray)
13068 {
13069   tree result;
13070   START_FOLD_INIT;
13071
13072   result = fold_build_call_array (type, fn, nargs, argarray);
13073
13074   END_FOLD_INIT;
13075   return result;
13076 }
13077
13078 #undef START_FOLD_INIT
13079 #undef END_FOLD_INIT
13080
13081 /* Determine if first argument is a multiple of second argument.  Return 0 if
13082    it is not, or we cannot easily determined it to be.
13083
13084    An example of the sort of thing we care about (at this point; this routine
13085    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13086    fold cases do now) is discovering that
13087
13088      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13089
13090    is a multiple of
13091
13092      SAVE_EXPR (J * 8)
13093
13094    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13095
13096    This code also handles discovering that
13097
13098      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13099
13100    is a multiple of 8 so we don't have to worry about dealing with a
13101    possible remainder.
13102
13103    Note that we *look* inside a SAVE_EXPR only to determine how it was
13104    calculated; it is not safe for fold to do much of anything else with the
13105    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13106    at run time.  For example, the latter example above *cannot* be implemented
13107    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13108    evaluation time of the original SAVE_EXPR is not necessarily the same at
13109    the time the new expression is evaluated.  The only optimization of this
13110    sort that would be valid is changing
13111
13112      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13113
13114    divided by 8 to
13115
13116      SAVE_EXPR (I) * SAVE_EXPR (J)
13117
13118    (where the same SAVE_EXPR (J) is used in the original and the
13119    transformed version).  */
13120
13121 int
13122 multiple_of_p (tree type, tree top, tree bottom)
13123 {
13124   if (operand_equal_p (top, bottom, 0))
13125     return 1;
13126
13127   if (TREE_CODE (type) != INTEGER_TYPE)
13128     return 0;
13129
13130   switch (TREE_CODE (top))
13131     {
13132     case BIT_AND_EXPR:
13133       /* Bitwise and provides a power of two multiple.  If the mask is
13134          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13135       if (!integer_pow2p (bottom))
13136         return 0;
13137       /* FALLTHRU */
13138
13139     case MULT_EXPR:
13140       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13141               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13142
13143     case PLUS_EXPR:
13144     case MINUS_EXPR:
13145       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13146               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13147
13148     case LSHIFT_EXPR:
13149       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13150         {
13151           tree op1, t1;
13152
13153           op1 = TREE_OPERAND (top, 1);
13154           /* const_binop may not detect overflow correctly,
13155              so check for it explicitly here.  */
13156           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13157               > TREE_INT_CST_LOW (op1)
13158               && TREE_INT_CST_HIGH (op1) == 0
13159               && 0 != (t1 = fold_convert (type,
13160                                           const_binop (LSHIFT_EXPR,
13161                                                        size_one_node,
13162                                                        op1, 0)))
13163               && !TREE_OVERFLOW (t1))
13164             return multiple_of_p (type, t1, bottom);
13165         }
13166       return 0;
13167
13168     case NOP_EXPR:
13169       /* Can't handle conversions from non-integral or wider integral type.  */
13170       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13171           || (TYPE_PRECISION (type)
13172               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13173         return 0;
13174
13175       /* .. fall through ...  */
13176
13177     case SAVE_EXPR:
13178       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13179
13180     case INTEGER_CST:
13181       if (TREE_CODE (bottom) != INTEGER_CST
13182           || integer_zerop (bottom)
13183           || (TYPE_UNSIGNED (type)
13184               && (tree_int_cst_sgn (top) < 0
13185                   || tree_int_cst_sgn (bottom) < 0)))
13186         return 0;
13187       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13188                                              top, bottom, 0));
13189
13190     default:
13191       return 0;
13192     }
13193 }
13194
13195 /* Return true if `t' is known to be non-negative.  If the return
13196    value is based on the assumption that signed overflow is undefined,
13197    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13198    *STRICT_OVERFLOW_P.  */
13199
13200 bool
13201 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13202 {
13203   if (t == error_mark_node)
13204     return false;
13205
13206   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13207     return true;
13208
13209   switch (TREE_CODE (t))
13210     {
13211     case SSA_NAME:
13212       /* Query VRP to see if it has recorded any information about
13213          the range of this object.  */
13214       return ssa_name_nonnegative_p (t);
13215
13216     case ABS_EXPR:
13217       /* We can't return 1 if flag_wrapv is set because
13218          ABS_EXPR<INT_MIN> = INT_MIN.  */
13219       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
13220         return true;
13221       if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
13222         {
13223           *strict_overflow_p = true;
13224           return true;
13225         }
13226       break;
13227
13228     case INTEGER_CST:
13229       return tree_int_cst_sgn (t) >= 0;
13230
13231     case REAL_CST:
13232       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13233
13234     case PLUS_EXPR:
13235       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13236         return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13237                                                strict_overflow_p)
13238                 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13239                                                   strict_overflow_p));
13240
13241       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13242          both unsigned and at least 2 bits shorter than the result.  */
13243       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13244           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13245           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13246         {
13247           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13248           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13249           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13250               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13251             {
13252               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13253                                        TYPE_PRECISION (inner2)) + 1;
13254               return prec < TYPE_PRECISION (TREE_TYPE (t));
13255             }
13256         }
13257       break;
13258
13259     case MULT_EXPR:
13260       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13261         {
13262           /* x * x for floating point x is always non-negative.  */
13263           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
13264             return true;
13265           return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13266                                                  strict_overflow_p)
13267                   && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13268                                                     strict_overflow_p));
13269         }
13270
13271       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13272          both unsigned and their total bits is shorter than the result.  */
13273       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13274           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13275           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13276         {
13277           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13278           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13279           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13280               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13281             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13282                    < TYPE_PRECISION (TREE_TYPE (t));
13283         }
13284       return false;
13285
13286     case BIT_AND_EXPR:
13287     case MAX_EXPR:
13288       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13289                                              strict_overflow_p)
13290               || tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13291                                                 strict_overflow_p));
13292
13293     case BIT_IOR_EXPR:
13294     case BIT_XOR_EXPR:
13295     case MIN_EXPR:
13296     case RDIV_EXPR:
13297     case TRUNC_DIV_EXPR:
13298     case CEIL_DIV_EXPR:
13299     case FLOOR_DIV_EXPR:
13300     case ROUND_DIV_EXPR:
13301       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13302                                              strict_overflow_p)
13303               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13304                                                 strict_overflow_p));
13305
13306     case TRUNC_MOD_EXPR:
13307     case CEIL_MOD_EXPR:
13308     case FLOOR_MOD_EXPR:
13309     case ROUND_MOD_EXPR:
13310     case SAVE_EXPR:
13311     case NON_LVALUE_EXPR:
13312     case FLOAT_EXPR:
13313     case FIX_TRUNC_EXPR:
13314       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13315                                             strict_overflow_p);
13316
13317     case COMPOUND_EXPR:
13318     case MODIFY_EXPR:
13319     case GIMPLE_MODIFY_STMT:
13320       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13321                                             strict_overflow_p);
13322
13323     case BIND_EXPR:
13324       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
13325                                             strict_overflow_p);
13326
13327     case COND_EXPR:
13328       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13329                                              strict_overflow_p)
13330               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13331                                                 strict_overflow_p));
13332
13333     case NOP_EXPR:
13334       {
13335         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13336         tree outer_type = TREE_TYPE (t);
13337
13338         if (TREE_CODE (outer_type) == REAL_TYPE)
13339           {
13340             if (TREE_CODE (inner_type) == REAL_TYPE)
13341               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13342                                                     strict_overflow_p);
13343             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13344               {
13345                 if (TYPE_UNSIGNED (inner_type))
13346                   return true;
13347                 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13348                                                       strict_overflow_p);
13349               }
13350           }
13351         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13352           {
13353             if (TREE_CODE (inner_type) == REAL_TYPE)
13354               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t,0),
13355                                                     strict_overflow_p);
13356             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13357               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13358                       && TYPE_UNSIGNED (inner_type);
13359           }
13360       }
13361       break;
13362
13363     case TARGET_EXPR:
13364       {
13365         tree temp = TARGET_EXPR_SLOT (t);
13366         t = TARGET_EXPR_INITIAL (t);
13367
13368         /* If the initializer is non-void, then it's a normal expression
13369            that will be assigned to the slot.  */
13370         if (!VOID_TYPE_P (t))
13371           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
13372
13373         /* Otherwise, the initializer sets the slot in some way.  One common
13374            way is an assignment statement at the end of the initializer.  */
13375         while (1)
13376           {
13377             if (TREE_CODE (t) == BIND_EXPR)
13378               t = expr_last (BIND_EXPR_BODY (t));
13379             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
13380                      || TREE_CODE (t) == TRY_CATCH_EXPR)
13381               t = expr_last (TREE_OPERAND (t, 0));
13382             else if (TREE_CODE (t) == STATEMENT_LIST)
13383               t = expr_last (t);
13384             else
13385               break;
13386           }
13387         if ((TREE_CODE (t) == MODIFY_EXPR
13388              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
13389             && GENERIC_TREE_OPERAND (t, 0) == temp)
13390           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13391                                                 strict_overflow_p);
13392
13393         return false;
13394       }
13395
13396     case CALL_EXPR:
13397       {
13398         tree fndecl = get_callee_fndecl (t);
13399         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
13400           switch (DECL_FUNCTION_CODE (fndecl))
13401             {
13402             CASE_FLT_FN (BUILT_IN_ACOS):
13403             CASE_FLT_FN (BUILT_IN_ACOSH):
13404             CASE_FLT_FN (BUILT_IN_CABS):
13405             CASE_FLT_FN (BUILT_IN_COSH):
13406             CASE_FLT_FN (BUILT_IN_ERFC):
13407             CASE_FLT_FN (BUILT_IN_EXP):
13408             CASE_FLT_FN (BUILT_IN_EXP10):
13409             CASE_FLT_FN (BUILT_IN_EXP2):
13410             CASE_FLT_FN (BUILT_IN_FABS):
13411             CASE_FLT_FN (BUILT_IN_FDIM):
13412             CASE_FLT_FN (BUILT_IN_HYPOT):
13413             CASE_FLT_FN (BUILT_IN_POW10):
13414             CASE_INT_FN (BUILT_IN_FFS):
13415             CASE_INT_FN (BUILT_IN_PARITY):
13416             CASE_INT_FN (BUILT_IN_POPCOUNT):
13417             case BUILT_IN_BSWAP32:
13418             case BUILT_IN_BSWAP64:
13419               /* Always true.  */
13420               return true;
13421
13422             CASE_FLT_FN (BUILT_IN_SQRT):
13423               /* sqrt(-0.0) is -0.0.  */
13424               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
13425                 return true;
13426               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13427                                                     strict_overflow_p);
13428
13429             CASE_FLT_FN (BUILT_IN_ASINH):
13430             CASE_FLT_FN (BUILT_IN_ATAN):
13431             CASE_FLT_FN (BUILT_IN_ATANH):
13432             CASE_FLT_FN (BUILT_IN_CBRT):
13433             CASE_FLT_FN (BUILT_IN_CEIL):
13434             CASE_FLT_FN (BUILT_IN_ERF):
13435             CASE_FLT_FN (BUILT_IN_EXPM1):
13436             CASE_FLT_FN (BUILT_IN_FLOOR):
13437             CASE_FLT_FN (BUILT_IN_FMOD):
13438             CASE_FLT_FN (BUILT_IN_FREXP):
13439             CASE_FLT_FN (BUILT_IN_LCEIL):
13440             CASE_FLT_FN (BUILT_IN_LDEXP):
13441             CASE_FLT_FN (BUILT_IN_LFLOOR):
13442             CASE_FLT_FN (BUILT_IN_LLCEIL):
13443             CASE_FLT_FN (BUILT_IN_LLFLOOR):
13444             CASE_FLT_FN (BUILT_IN_LLRINT):
13445             CASE_FLT_FN (BUILT_IN_LLROUND):
13446             CASE_FLT_FN (BUILT_IN_LRINT):
13447             CASE_FLT_FN (BUILT_IN_LROUND):
13448             CASE_FLT_FN (BUILT_IN_MODF):
13449             CASE_FLT_FN (BUILT_IN_NEARBYINT):
13450             CASE_FLT_FN (BUILT_IN_RINT):
13451             CASE_FLT_FN (BUILT_IN_ROUND):
13452             CASE_FLT_FN (BUILT_IN_SCALB):
13453             CASE_FLT_FN (BUILT_IN_SCALBLN):
13454             CASE_FLT_FN (BUILT_IN_SCALBN):
13455             CASE_FLT_FN (BUILT_IN_SIGNBIT):
13456             CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
13457             CASE_FLT_FN (BUILT_IN_SINH):
13458             CASE_FLT_FN (BUILT_IN_TANH):
13459             CASE_FLT_FN (BUILT_IN_TRUNC):
13460               /* True if the 1st argument is nonnegative.  */
13461               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13462                                                     strict_overflow_p);
13463
13464             CASE_FLT_FN (BUILT_IN_FMAX):
13465               /* True if the 1st OR 2nd arguments are nonnegative.  */
13466               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13467                                                      strict_overflow_p)
13468                       || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13469                                                          strict_overflow_p)));
13470
13471             CASE_FLT_FN (BUILT_IN_FMIN):
13472               /* True if the 1st AND 2nd arguments are nonnegative.  */
13473               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13474                                                      strict_overflow_p)
13475                       && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13476                                                          strict_overflow_p)));
13477
13478             CASE_FLT_FN (BUILT_IN_COPYSIGN):
13479               /* True if the 2nd argument is nonnegative.  */
13480               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13481                                                     strict_overflow_p);
13482
13483             CASE_FLT_FN (BUILT_IN_POWI):
13484               /* True if the 1st argument is nonnegative or the second
13485                  argument is an even integer.  */
13486               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
13487                 {
13488                   tree arg1 = CALL_EXPR_ARG (t, 1);
13489                   if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
13490                     return true;
13491                 }
13492               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13493                                                     strict_overflow_p);
13494
13495             CASE_FLT_FN (BUILT_IN_POW):
13496               /* True if the 1st argument is nonnegative or the second
13497                  argument is an even integer valued real.  */
13498               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
13499                 {
13500                   REAL_VALUE_TYPE c;
13501                   HOST_WIDE_INT n;
13502
13503                   c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
13504                   n = real_to_integer (&c);
13505                   if ((n & 1) == 0)
13506                     {
13507                       REAL_VALUE_TYPE cint;
13508                       real_from_integer (&cint, VOIDmode, n,
13509                                          n < 0 ? -1 : 0, 0);
13510                       if (real_identical (&c, &cint))
13511                         return true;
13512                     }
13513                 }
13514               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13515                                                     strict_overflow_p);
13516
13517             default:
13518               break;
13519             }
13520       }
13521
13522       /* ... fall through ...  */
13523
13524     default:
13525       {
13526         tree type = TREE_TYPE (t);
13527         if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13528             && truth_value_p (TREE_CODE (t)))
13529           /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13530              have a signed:1 type (where the value is -1 and 0).  */
13531           return true;
13532       }
13533     }
13534
13535   /* We don't know sign of `t', so be conservative and return false.  */
13536   return false;
13537 }
13538
13539 /* Return true if `t' is known to be non-negative.  Handle warnings
13540    about undefined signed overflow.  */
13541
13542 bool
13543 tree_expr_nonnegative_p (tree t)
13544 {
13545   bool ret, strict_overflow_p;
13546
13547   strict_overflow_p = false;
13548   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
13549   if (strict_overflow_p)
13550     fold_overflow_warning (("assuming signed overflow does not occur when "
13551                             "determining that expression is always "
13552                             "non-negative"),
13553                            WARN_STRICT_OVERFLOW_MISC);
13554   return ret;
13555 }
13556
13557 /* Return true when T is an address and is known to be nonzero.
13558    For floating point we further ensure that T is not denormal.
13559    Similar logic is present in nonzero_address in rtlanal.h.
13560
13561    If the return value is based on the assumption that signed overflow
13562    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
13563    change *STRICT_OVERFLOW_P.  */
13564
13565 bool
13566 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
13567 {
13568   tree type = TREE_TYPE (t);
13569   bool sub_strict_overflow_p;
13570
13571   /* Doing something useful for floating point would need more work.  */
13572   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
13573     return false;
13574
13575   switch (TREE_CODE (t))
13576     {
13577     case SSA_NAME:
13578       /* Query VRP to see if it has recorded any information about
13579          the range of this object.  */
13580       return ssa_name_nonzero_p (t);
13581
13582     case ABS_EXPR:
13583       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13584                                         strict_overflow_p);
13585
13586     case INTEGER_CST:
13587       return !integer_zerop (t);
13588
13589     case PLUS_EXPR:
13590       if (TYPE_OVERFLOW_UNDEFINED (type))
13591         {
13592           /* With the presence of negative values it is hard
13593              to say something.  */
13594           sub_strict_overflow_p = false;
13595           if (!tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13596                                               &sub_strict_overflow_p)
13597               || !tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13598                                                  &sub_strict_overflow_p))
13599             return false;
13600           /* One of operands must be positive and the other non-negative.  */
13601           /* We don't set *STRICT_OVERFLOW_P here: even if this value
13602              overflows, on a twos-complement machine the sum of two
13603              nonnegative numbers can never be zero.  */
13604           return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13605                                              strict_overflow_p)
13606                   || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13607                                                 strict_overflow_p));
13608         }
13609       break;
13610
13611     case MULT_EXPR:
13612       if (TYPE_OVERFLOW_UNDEFINED (type))
13613         {
13614           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13615                                          strict_overflow_p)
13616               && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13617                                             strict_overflow_p))
13618             {
13619               *strict_overflow_p = true;
13620               return true;
13621             }
13622         }
13623       break;
13624
13625     case NOP_EXPR:
13626       {
13627         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13628         tree outer_type = TREE_TYPE (t);
13629
13630         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
13631                 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13632                                               strict_overflow_p));
13633       }
13634       break;
13635
13636    case ADDR_EXPR:
13637       {
13638         tree base = get_base_address (TREE_OPERAND (t, 0));
13639
13640         if (!base)
13641           return false;
13642
13643         /* Weak declarations may link to NULL.  */
13644         if (VAR_OR_FUNCTION_DECL_P (base))
13645           return !DECL_WEAK (base);
13646
13647         /* Constants are never weak.  */
13648         if (CONSTANT_CLASS_P (base))
13649           return true;
13650
13651         return false;
13652       }
13653
13654     case COND_EXPR:
13655       sub_strict_overflow_p = false;
13656       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13657                                      &sub_strict_overflow_p)
13658           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
13659                                         &sub_strict_overflow_p))
13660         {
13661           if (sub_strict_overflow_p)
13662             *strict_overflow_p = true;
13663           return true;
13664         }
13665       break;
13666
13667     case MIN_EXPR:
13668       sub_strict_overflow_p = false;
13669       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13670                                      &sub_strict_overflow_p)
13671           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13672                                         &sub_strict_overflow_p))
13673         {
13674           if (sub_strict_overflow_p)
13675             *strict_overflow_p = true;
13676         }
13677       break;
13678
13679     case MAX_EXPR:
13680       sub_strict_overflow_p = false;
13681       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13682                                      &sub_strict_overflow_p))
13683         {
13684           if (sub_strict_overflow_p)
13685             *strict_overflow_p = true;
13686
13687           /* When both operands are nonzero, then MAX must be too.  */
13688           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13689                                          strict_overflow_p))
13690             return true;
13691
13692           /* MAX where operand 0 is positive is positive.  */
13693           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13694                                                strict_overflow_p);
13695         }
13696       /* MAX where operand 1 is positive is positive.  */
13697       else if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13698                                           &sub_strict_overflow_p)
13699                && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13700                                                  &sub_strict_overflow_p))
13701         {
13702           if (sub_strict_overflow_p)
13703             *strict_overflow_p = true;
13704           return true;
13705         }
13706       break;
13707
13708     case COMPOUND_EXPR:
13709     case MODIFY_EXPR:
13710     case GIMPLE_MODIFY_STMT:
13711     case BIND_EXPR:
13712       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13713                                         strict_overflow_p);
13714
13715     case SAVE_EXPR:
13716     case NON_LVALUE_EXPR:
13717       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13718                                         strict_overflow_p);
13719
13720     case BIT_IOR_EXPR:
13721       return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13722                                         strict_overflow_p)
13723               || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13724                                             strict_overflow_p));
13725
13726     case CALL_EXPR:
13727       return alloca_call_p (t);
13728
13729     default:
13730       break;
13731     }
13732   return false;
13733 }
13734
13735 /* Return true when T is an address and is known to be nonzero.
13736    Handle warnings about undefined signed overflow.  */
13737
13738 bool
13739 tree_expr_nonzero_p (tree t)
13740 {
13741   bool ret, strict_overflow_p;
13742
13743   strict_overflow_p = false;
13744   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
13745   if (strict_overflow_p)
13746     fold_overflow_warning (("assuming signed overflow does not occur when "
13747                             "determining that expression is always "
13748                             "non-zero"),
13749                            WARN_STRICT_OVERFLOW_MISC);
13750   return ret;
13751 }
13752
13753 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
13754    attempt to fold the expression to a constant without modifying TYPE,
13755    OP0 or OP1.
13756
13757    If the expression could be simplified to a constant, then return
13758    the constant.  If the expression would not be simplified to a
13759    constant, then return NULL_TREE.  */
13760
13761 tree
13762 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
13763 {
13764   tree tem = fold_binary (code, type, op0, op1);
13765   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13766 }
13767
13768 /* Given the components of a unary expression CODE, TYPE and OP0,
13769    attempt to fold the expression to a constant without modifying
13770    TYPE or OP0.
13771
13772    If the expression could be simplified to a constant, then return
13773    the constant.  If the expression would not be simplified to a
13774    constant, then return NULL_TREE.  */
13775
13776 tree
13777 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
13778 {
13779   tree tem = fold_unary (code, type, op0);
13780   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13781 }
13782
13783 /* If EXP represents referencing an element in a constant string
13784    (either via pointer arithmetic or array indexing), return the
13785    tree representing the value accessed, otherwise return NULL.  */
13786
13787 tree
13788 fold_read_from_constant_string (tree exp)
13789 {
13790   if ((TREE_CODE (exp) == INDIRECT_REF
13791        || TREE_CODE (exp) == ARRAY_REF)
13792       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
13793     {
13794       tree exp1 = TREE_OPERAND (exp, 0);
13795       tree index;
13796       tree string;
13797
13798       if (TREE_CODE (exp) == INDIRECT_REF)
13799         string = string_constant (exp1, &index);
13800       else
13801         {
13802           tree low_bound = array_ref_low_bound (exp);
13803           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
13804
13805           /* Optimize the special-case of a zero lower bound.
13806
13807              We convert the low_bound to sizetype to avoid some problems
13808              with constant folding.  (E.g. suppose the lower bound is 1,
13809              and its mode is QI.  Without the conversion,l (ARRAY
13810              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
13811              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
13812           if (! integer_zerop (low_bound))
13813             index = size_diffop (index, fold_convert (sizetype, low_bound));
13814
13815           string = exp1;
13816         }
13817
13818       if (string
13819           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
13820           && TREE_CODE (string) == STRING_CST
13821           && TREE_CODE (index) == INTEGER_CST
13822           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
13823           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
13824               == MODE_INT)
13825           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
13826         return fold_convert (TREE_TYPE (exp),
13827                              build_int_cst (NULL_TREE,
13828                                             (TREE_STRING_POINTER (string)
13829                                              [TREE_INT_CST_LOW (index)])));
13830     }
13831   return NULL;
13832 }
13833
13834 /* Return the tree for neg (ARG0) when ARG0 is known to be either
13835    an integer constant or real constant.
13836
13837    TYPE is the type of the result.  */
13838
13839 static tree
13840 fold_negate_const (tree arg0, tree type)
13841 {
13842   tree t = NULL_TREE;
13843
13844   switch (TREE_CODE (arg0))
13845     {
13846     case INTEGER_CST:
13847       {
13848         unsigned HOST_WIDE_INT low;
13849         HOST_WIDE_INT high;
13850         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13851                                    TREE_INT_CST_HIGH (arg0),
13852                                    &low, &high);
13853         t = force_fit_type_double (type, low, high, 1,
13854                                    (overflow | TREE_OVERFLOW (arg0))
13855                                    && !TYPE_UNSIGNED (type));
13856         break;
13857       }
13858
13859     case REAL_CST:
13860       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13861       break;
13862
13863     default:
13864       gcc_unreachable ();
13865     }
13866
13867   return t;
13868 }
13869
13870 /* Return the tree for abs (ARG0) when ARG0 is known to be either
13871    an integer constant or real constant.
13872
13873    TYPE is the type of the result.  */
13874
13875 tree
13876 fold_abs_const (tree arg0, tree type)
13877 {
13878   tree t = NULL_TREE;
13879
13880   switch (TREE_CODE (arg0))
13881     {
13882     case INTEGER_CST:
13883       /* If the value is unsigned, then the absolute value is
13884          the same as the ordinary value.  */
13885       if (TYPE_UNSIGNED (type))
13886         t = arg0;
13887       /* Similarly, if the value is non-negative.  */
13888       else if (INT_CST_LT (integer_minus_one_node, arg0))
13889         t = arg0;
13890       /* If the value is negative, then the absolute value is
13891          its negation.  */
13892       else
13893         {
13894           unsigned HOST_WIDE_INT low;
13895           HOST_WIDE_INT high;
13896           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13897                                      TREE_INT_CST_HIGH (arg0),
13898                                      &low, &high);
13899           t = force_fit_type_double (type, low, high, -1,
13900                                      overflow | TREE_OVERFLOW (arg0));
13901         }
13902       break;
13903
13904     case REAL_CST:
13905       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
13906         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13907       else
13908         t =  arg0;
13909       break;
13910
13911     default:
13912       gcc_unreachable ();
13913     }
13914
13915   return t;
13916 }
13917
13918 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
13919    constant.  TYPE is the type of the result.  */
13920
13921 static tree
13922 fold_not_const (tree arg0, tree type)
13923 {
13924   tree t = NULL_TREE;
13925
13926   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
13927
13928   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
13929                              ~TREE_INT_CST_HIGH (arg0), 0,
13930                              TREE_OVERFLOW (arg0));
13931
13932   return t;
13933 }
13934
13935 /* Given CODE, a relational operator, the target type, TYPE and two
13936    constant operands OP0 and OP1, return the result of the
13937    relational operation.  If the result is not a compile time
13938    constant, then return NULL_TREE.  */
13939
13940 static tree
13941 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
13942 {
13943   int result, invert;
13944
13945   /* From here on, the only cases we handle are when the result is
13946      known to be a constant.  */
13947
13948   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
13949     {
13950       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
13951       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
13952
13953       /* Handle the cases where either operand is a NaN.  */
13954       if (real_isnan (c0) || real_isnan (c1))
13955         {
13956           switch (code)
13957             {
13958             case EQ_EXPR:
13959             case ORDERED_EXPR:
13960               result = 0;
13961               break;
13962
13963             case NE_EXPR:
13964             case UNORDERED_EXPR:
13965             case UNLT_EXPR:
13966             case UNLE_EXPR:
13967             case UNGT_EXPR:
13968             case UNGE_EXPR:
13969             case UNEQ_EXPR:
13970               result = 1;
13971               break;
13972
13973             case LT_EXPR:
13974             case LE_EXPR:
13975             case GT_EXPR:
13976             case GE_EXPR:
13977             case LTGT_EXPR:
13978               if (flag_trapping_math)
13979                 return NULL_TREE;
13980               result = 0;
13981               break;
13982
13983             default:
13984               gcc_unreachable ();
13985             }
13986
13987           return constant_boolean_node (result, type);
13988         }
13989
13990       return constant_boolean_node (real_compare (code, c0, c1), type);
13991     }
13992
13993   /* Handle equality/inequality of complex constants.  */
13994   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
13995     {
13996       tree rcond = fold_relational_const (code, type,
13997                                           TREE_REALPART (op0),
13998                                           TREE_REALPART (op1));
13999       tree icond = fold_relational_const (code, type,
14000                                           TREE_IMAGPART (op0),
14001                                           TREE_IMAGPART (op1));
14002       if (code == EQ_EXPR)
14003         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14004       else if (code == NE_EXPR)
14005         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14006       else
14007         return NULL_TREE;
14008     }
14009
14010   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14011
14012      To compute GT, swap the arguments and do LT.
14013      To compute GE, do LT and invert the result.
14014      To compute LE, swap the arguments, do LT and invert the result.
14015      To compute NE, do EQ and invert the result.
14016
14017      Therefore, the code below must handle only EQ and LT.  */
14018
14019   if (code == LE_EXPR || code == GT_EXPR)
14020     {
14021       tree tem = op0;
14022       op0 = op1;
14023       op1 = tem;
14024       code = swap_tree_comparison (code);
14025     }
14026
14027   /* Note that it is safe to invert for real values here because we
14028      have already handled the one case that it matters.  */
14029
14030   invert = 0;
14031   if (code == NE_EXPR || code == GE_EXPR)
14032     {
14033       invert = 1;
14034       code = invert_tree_comparison (code, false);
14035     }
14036
14037   /* Compute a result for LT or EQ if args permit;
14038      Otherwise return T.  */
14039   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14040     {
14041       if (code == EQ_EXPR)
14042         result = tree_int_cst_equal (op0, op1);
14043       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14044         result = INT_CST_LT_UNSIGNED (op0, op1);
14045       else
14046         result = INT_CST_LT (op0, op1);
14047     }
14048   else
14049     return NULL_TREE;
14050
14051   if (invert)
14052     result ^= 1;
14053   return constant_boolean_node (result, type);
14054 }
14055
14056 /* Build an expression for the a clean point containing EXPR with type TYPE.
14057    Don't build a cleanup point expression for EXPR which don't have side
14058    effects.  */
14059
14060 tree
14061 fold_build_cleanup_point_expr (tree type, tree expr)
14062 {
14063   /* If the expression does not have side effects then we don't have to wrap
14064      it with a cleanup point expression.  */
14065   if (!TREE_SIDE_EFFECTS (expr))
14066     return expr;
14067
14068   /* If the expression is a return, check to see if the expression inside the
14069      return has no side effects or the right hand side of the modify expression
14070      inside the return. If either don't have side effects set we don't need to
14071      wrap the expression in a cleanup point expression.  Note we don't check the
14072      left hand side of the modify because it should always be a return decl.  */
14073   if (TREE_CODE (expr) == RETURN_EXPR)
14074     {
14075       tree op = TREE_OPERAND (expr, 0);
14076       if (!op || !TREE_SIDE_EFFECTS (op))
14077         return expr;
14078       op = TREE_OPERAND (op, 1);
14079       if (!TREE_SIDE_EFFECTS (op))
14080         return expr;
14081     }
14082   
14083   return build1 (CLEANUP_POINT_EXPR, type, expr);
14084 }
14085
14086 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
14087    avoid confusing the gimplify process.  */
14088
14089 tree
14090 build_fold_addr_expr_with_type (tree t, tree ptrtype)
14091 {
14092   /* The size of the object is not relevant when talking about its address.  */
14093   if (TREE_CODE (t) == WITH_SIZE_EXPR)
14094     t = TREE_OPERAND (t, 0);
14095
14096   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
14097   if (TREE_CODE (t) == INDIRECT_REF
14098       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
14099     {
14100       t = TREE_OPERAND (t, 0);
14101       if (TREE_TYPE (t) != ptrtype)
14102         t = build1 (NOP_EXPR, ptrtype, t);
14103     }
14104   else
14105     {
14106       tree base = t;
14107
14108       while (handled_component_p (base))
14109         base = TREE_OPERAND (base, 0);
14110       if (DECL_P (base))
14111         TREE_ADDRESSABLE (base) = 1;
14112
14113       t = build1 (ADDR_EXPR, ptrtype, t);
14114     }
14115
14116   return t;
14117 }
14118
14119 tree
14120 build_fold_addr_expr (tree t)
14121 {
14122   return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
14123 }
14124
14125 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14126    of an indirection through OP0, or NULL_TREE if no simplification is
14127    possible.  */
14128
14129 tree
14130 fold_indirect_ref_1 (tree type, tree op0)
14131 {
14132   tree sub = op0;
14133   tree subtype;
14134
14135   STRIP_NOPS (sub);
14136   subtype = TREE_TYPE (sub);
14137   if (!POINTER_TYPE_P (subtype))
14138     return NULL_TREE;
14139
14140   if (TREE_CODE (sub) == ADDR_EXPR)
14141     {
14142       tree op = TREE_OPERAND (sub, 0);
14143       tree optype = TREE_TYPE (op);
14144       /* *&CONST_DECL -> to the value of the const decl.  */
14145       if (TREE_CODE (op) == CONST_DECL)
14146         return DECL_INITIAL (op);
14147       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
14148       if (type == optype)
14149         {
14150           tree fop = fold_read_from_constant_string (op);
14151           if (fop)
14152             return fop;
14153           else
14154             return op;
14155         }
14156       /* *(foo *)&fooarray => fooarray[0] */
14157       else if (TREE_CODE (optype) == ARRAY_TYPE
14158                && type == TREE_TYPE (optype))
14159         {
14160           tree type_domain = TYPE_DOMAIN (optype);
14161           tree min_val = size_zero_node;
14162           if (type_domain && TYPE_MIN_VALUE (type_domain))
14163             min_val = TYPE_MIN_VALUE (type_domain);
14164           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14165         }
14166       /* *(foo *)&complexfoo => __real__ complexfoo */
14167       else if (TREE_CODE (optype) == COMPLEX_TYPE
14168                && type == TREE_TYPE (optype))
14169         return fold_build1 (REALPART_EXPR, type, op);
14170       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14171       else if (TREE_CODE (optype) == VECTOR_TYPE
14172                && type == TREE_TYPE (optype))
14173         {
14174           tree part_width = TYPE_SIZE (type);
14175           tree index = bitsize_int (0);
14176           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
14177         }
14178     }
14179
14180   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
14181   if (TREE_CODE (sub) == PLUS_EXPR
14182       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
14183     {
14184       tree op00 = TREE_OPERAND (sub, 0);
14185       tree op01 = TREE_OPERAND (sub, 1);
14186       tree op00type;
14187
14188       STRIP_NOPS (op00);
14189       op00type = TREE_TYPE (op00);
14190       if (TREE_CODE (op00) == ADDR_EXPR
14191           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
14192           && type == TREE_TYPE (TREE_TYPE (op00type)))
14193         {
14194           tree size = TYPE_SIZE_UNIT (type);
14195           if (tree_int_cst_equal (size, op01))
14196             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
14197         }
14198     }
14199   
14200   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
14201   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
14202       && type == TREE_TYPE (TREE_TYPE (subtype)))
14203     {
14204       tree type_domain;
14205       tree min_val = size_zero_node;
14206       sub = build_fold_indirect_ref (sub);
14207       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
14208       if (type_domain && TYPE_MIN_VALUE (type_domain))
14209         min_val = TYPE_MIN_VALUE (type_domain);
14210       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
14211     }
14212
14213   return NULL_TREE;
14214 }
14215
14216 /* Builds an expression for an indirection through T, simplifying some
14217    cases.  */
14218
14219 tree
14220 build_fold_indirect_ref (tree t)
14221 {
14222   tree type = TREE_TYPE (TREE_TYPE (t));
14223   tree sub = fold_indirect_ref_1 (type, t);
14224
14225   if (sub)
14226     return sub;
14227   else
14228     return build1 (INDIRECT_REF, type, t);
14229 }
14230
14231 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
14232
14233 tree
14234 fold_indirect_ref (tree t)
14235 {
14236   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
14237
14238   if (sub)
14239     return sub;
14240   else
14241     return t;
14242 }
14243
14244 /* Strip non-trapping, non-side-effecting tree nodes from an expression
14245    whose result is ignored.  The type of the returned tree need not be
14246    the same as the original expression.  */
14247
14248 tree
14249 fold_ignored_result (tree t)
14250 {
14251   if (!TREE_SIDE_EFFECTS (t))
14252     return integer_zero_node;
14253
14254   for (;;)
14255     switch (TREE_CODE_CLASS (TREE_CODE (t)))
14256       {
14257       case tcc_unary:
14258         t = TREE_OPERAND (t, 0);
14259         break;
14260
14261       case tcc_binary:
14262       case tcc_comparison:
14263         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14264           t = TREE_OPERAND (t, 0);
14265         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
14266           t = TREE_OPERAND (t, 1);
14267         else
14268           return t;
14269         break;
14270
14271       case tcc_expression:
14272         switch (TREE_CODE (t))
14273           {
14274           case COMPOUND_EXPR:
14275             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14276               return t;
14277             t = TREE_OPERAND (t, 0);
14278             break;
14279
14280           case COND_EXPR:
14281             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
14282                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
14283               return t;
14284             t = TREE_OPERAND (t, 0);
14285             break;
14286
14287           default:
14288             return t;
14289           }
14290         break;
14291
14292       default:
14293         return t;
14294       }
14295 }
14296
14297 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
14298    This can only be applied to objects of a sizetype.  */
14299
14300 tree
14301 round_up (tree value, int divisor)
14302 {
14303   tree div = NULL_TREE;
14304
14305   gcc_assert (divisor > 0);
14306   if (divisor == 1)
14307     return value;
14308
14309   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14310      have to do anything.  Only do this when we are not given a const,
14311      because in that case, this check is more expensive than just
14312      doing it.  */
14313   if (TREE_CODE (value) != INTEGER_CST)
14314     {
14315       div = build_int_cst (TREE_TYPE (value), divisor);
14316
14317       if (multiple_of_p (TREE_TYPE (value), value, div))
14318         return value;
14319     }
14320
14321   /* If divisor is a power of two, simplify this to bit manipulation.  */
14322   if (divisor == (divisor & -divisor))
14323     {
14324       if (TREE_CODE (value) == INTEGER_CST)
14325         {
14326           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
14327           unsigned HOST_WIDE_INT high;
14328           bool overflow_p;
14329
14330           if ((low & (divisor - 1)) == 0)
14331             return value;
14332
14333           overflow_p = TREE_OVERFLOW (value);
14334           high = TREE_INT_CST_HIGH (value);
14335           low &= ~(divisor - 1);
14336           low += divisor;
14337           if (low == 0)
14338             {
14339               high++;
14340               if (high == 0)
14341                 overflow_p = true;
14342             }
14343
14344           return force_fit_type_double (TREE_TYPE (value), low, high,
14345                                         -1, overflow_p);
14346         }
14347       else
14348         {
14349           tree t;
14350
14351           t = build_int_cst (TREE_TYPE (value), divisor - 1);
14352           value = size_binop (PLUS_EXPR, value, t);
14353           t = build_int_cst (TREE_TYPE (value), -divisor);
14354           value = size_binop (BIT_AND_EXPR, value, t);
14355         }
14356     }
14357   else
14358     {
14359       if (!div)
14360         div = build_int_cst (TREE_TYPE (value), divisor);
14361       value = size_binop (CEIL_DIV_EXPR, value, div);
14362       value = size_binop (MULT_EXPR, value, div);
14363     }
14364
14365   return value;
14366 }
14367
14368 /* Likewise, but round down.  */
14369
14370 tree
14371 round_down (tree value, int divisor)
14372 {
14373   tree div = NULL_TREE;
14374
14375   gcc_assert (divisor > 0);
14376   if (divisor == 1)
14377     return value;
14378
14379   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14380      have to do anything.  Only do this when we are not given a const,
14381      because in that case, this check is more expensive than just
14382      doing it.  */
14383   if (TREE_CODE (value) != INTEGER_CST)
14384     {
14385       div = build_int_cst (TREE_TYPE (value), divisor);
14386
14387       if (multiple_of_p (TREE_TYPE (value), value, div))
14388         return value;
14389     }
14390
14391   /* If divisor is a power of two, simplify this to bit manipulation.  */
14392   if (divisor == (divisor & -divisor))
14393     {
14394       tree t;
14395
14396       t = build_int_cst (TREE_TYPE (value), -divisor);
14397       value = size_binop (BIT_AND_EXPR, value, t);
14398     }
14399   else
14400     {
14401       if (!div)
14402         div = build_int_cst (TREE_TYPE (value), divisor);
14403       value = size_binop (FLOOR_DIV_EXPR, value, div);
14404       value = size_binop (MULT_EXPR, value, div);
14405     }
14406
14407   return value;
14408 }
14409
14410 /* Returns the pointer to the base of the object addressed by EXP and
14411    extracts the information about the offset of the access, storing it
14412    to PBITPOS and POFFSET.  */
14413
14414 static tree
14415 split_address_to_core_and_offset (tree exp,
14416                                   HOST_WIDE_INT *pbitpos, tree *poffset)
14417 {
14418   tree core;
14419   enum machine_mode mode;
14420   int unsignedp, volatilep;
14421   HOST_WIDE_INT bitsize;
14422
14423   if (TREE_CODE (exp) == ADDR_EXPR)
14424     {
14425       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
14426                                   poffset, &mode, &unsignedp, &volatilep,
14427                                   false);
14428       core = build_fold_addr_expr (core);
14429     }
14430   else
14431     {
14432       core = exp;
14433       *pbitpos = 0;
14434       *poffset = NULL_TREE;
14435     }
14436
14437   return core;
14438 }
14439
14440 /* Returns true if addresses of E1 and E2 differ by a constant, false
14441    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
14442
14443 bool
14444 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
14445 {
14446   tree core1, core2;
14447   HOST_WIDE_INT bitpos1, bitpos2;
14448   tree toffset1, toffset2, tdiff, type;
14449
14450   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
14451   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
14452
14453   if (bitpos1 % BITS_PER_UNIT != 0
14454       || bitpos2 % BITS_PER_UNIT != 0
14455       || !operand_equal_p (core1, core2, 0))
14456     return false;
14457
14458   if (toffset1 && toffset2)
14459     {
14460       type = TREE_TYPE (toffset1);
14461       if (type != TREE_TYPE (toffset2))
14462         toffset2 = fold_convert (type, toffset2);
14463
14464       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
14465       if (!cst_and_fits_in_hwi (tdiff))
14466         return false;
14467
14468       *diff = int_cst_value (tdiff);
14469     }
14470   else if (toffset1 || toffset2)
14471     {
14472       /* If only one of the offsets is non-constant, the difference cannot
14473          be a constant.  */
14474       return false;
14475     }
14476   else
14477     *diff = 0;
14478
14479   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
14480   return true;
14481 }
14482
14483 /* Simplify the floating point expression EXP when the sign of the
14484    result is not significant.  Return NULL_TREE if no simplification
14485    is possible.  */
14486
14487 tree
14488 fold_strip_sign_ops (tree exp)
14489 {
14490   tree arg0, arg1;
14491
14492   switch (TREE_CODE (exp))
14493     {
14494     case ABS_EXPR:
14495     case NEGATE_EXPR:
14496       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14497       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
14498
14499     case MULT_EXPR:
14500     case RDIV_EXPR:
14501       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
14502         return NULL_TREE;
14503       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14504       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14505       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
14506         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
14507                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
14508                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
14509       break;
14510
14511     case COMPOUND_EXPR:
14512       arg0 = TREE_OPERAND (exp, 0);
14513       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14514       if (arg1)
14515         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
14516       break;
14517       
14518     case COND_EXPR:
14519       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14520       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
14521       if (arg0 || arg1)
14522         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
14523                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
14524                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
14525       break;
14526       
14527     case CALL_EXPR:
14528       {
14529         const enum built_in_function fcode = builtin_mathfn_code (exp);
14530         switch (fcode)
14531         {
14532         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14533           /* Strip copysign function call, return the 1st argument. */
14534           arg0 = CALL_EXPR_ARG (exp, 0);
14535           arg1 = CALL_EXPR_ARG (exp, 1);
14536           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
14537
14538         default:
14539           /* Strip sign ops from the argument of "odd" math functions.  */
14540           if (negate_mathfn_p (fcode))
14541             {
14542               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
14543               if (arg0)
14544                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
14545             }
14546           break;
14547         }
14548       }
14549       break;
14550
14551     default:
14552       break;
14553     }
14554   return NULL_TREE;
14555 }