OSDN Git Service

* config/rs6000/rs6000.c (function_arg_advance): For 32-bit ELF ABI,
[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 /* Non-zero 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] rahter 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 non-zero 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                            ? lang_hooks.types.signed_type (type)
1414                            : lang_hooks.types.unsigned_type (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 = lang_hooks.types.signed_type (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 (get_signed_or_unsigned_type
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 (lang_hooks.types.signed_type (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 = lang_hooks.types.unsigned_type (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 = lang_hooks.types.signed_type (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 = lang_hooks.types.unsigned_type (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 = (low != 0);
4553         }
4554       else if (! subset || highequal)
4555         {
4556           low = low0;
4557           high = range_predecessor (low1);
4558           in_p = (high != 0);
4559         }
4560       else
4561         return 0;
4562     }
4563
4564   else if (! in0_p && in1_p)
4565     {
4566       /* If they don't overlap, the result is the second range.  If the second
4567          is a subset of the first, the result is false.  Otherwise,
4568          the range starts just after the first range and ends at the
4569          end of the second.  */
4570       if (no_overlap)
4571         in_p = 1, low = low1, high = high1;
4572       else if (subset || highequal)
4573         in_p = 0, low = high = 0;
4574       else
4575         {
4576           low = range_successor (high0);
4577           high = high1;
4578           in_p = (low != 0);
4579         }
4580     }
4581
4582   else
4583     {
4584       /* The case where we are excluding both ranges.  Here the complex case
4585          is if they don't overlap.  In that case, the only time we have a
4586          range is if they are adjacent.  If the second is a subset of the
4587          first, the result is the first.  Otherwise, the range to exclude
4588          starts at the beginning of the first range and ends at the end of the
4589          second.  */
4590       if (no_overlap)
4591         {
4592           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4593                                          range_successor (high0),
4594                                          1, low1, 0)))
4595             in_p = 0, low = low0, high = high1;
4596           else
4597             {
4598               /* Canonicalize - [min, x] into - [-, x].  */
4599               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4600                 switch (TREE_CODE (TREE_TYPE (low0)))
4601                   {
4602                   case ENUMERAL_TYPE:
4603                     if (TYPE_PRECISION (TREE_TYPE (low0))
4604                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4605                       break;
4606                     /* FALLTHROUGH */
4607                   case INTEGER_TYPE:
4608                     if (tree_int_cst_equal (low0,
4609                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4610                       low0 = 0;
4611                     break;
4612                   case POINTER_TYPE:
4613                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4614                         && integer_zerop (low0))
4615                       low0 = 0;
4616                     break;
4617                   default:
4618                     break;
4619                   }
4620
4621               /* Canonicalize - [x, max] into - [x, -].  */
4622               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4623                 switch (TREE_CODE (TREE_TYPE (high1)))
4624                   {
4625                   case ENUMERAL_TYPE:
4626                     if (TYPE_PRECISION (TREE_TYPE (high1))
4627                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4628                       break;
4629                     /* FALLTHROUGH */
4630                   case INTEGER_TYPE:
4631                     if (tree_int_cst_equal (high1,
4632                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4633                       high1 = 0;
4634                     break;
4635                   case POINTER_TYPE:
4636                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4637                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4638                                                        high1, 1,
4639                                                        integer_one_node, 1)))
4640                       high1 = 0;
4641                     break;
4642                   default:
4643                     break;
4644                   }
4645
4646               /* The ranges might be also adjacent between the maximum and
4647                  minimum values of the given type.  For
4648                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4649                  return + [x + 1, y - 1].  */
4650               if (low0 == 0 && high1 == 0)
4651                 {
4652                   low = range_successor (high0);
4653                   high = range_predecessor (low1);
4654                   if (low == 0 || high == 0)
4655                     return 0;
4656
4657                   in_p = 1;
4658                 }
4659               else
4660                 return 0;
4661             }
4662         }
4663       else if (subset)
4664         in_p = 0, low = low0, high = high0;
4665       else
4666         in_p = 0, low = low0, high = high1;
4667     }
4668
4669   *pin_p = in_p, *plow = low, *phigh = high;
4670   return 1;
4671 }
4672 \f
4673
4674 /* Subroutine of fold, looking inside expressions of the form
4675    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4676    of the COND_EXPR.  This function is being used also to optimize
4677    A op B ? C : A, by reversing the comparison first.
4678
4679    Return a folded expression whose code is not a COND_EXPR
4680    anymore, or NULL_TREE if no folding opportunity is found.  */
4681
4682 static tree
4683 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4684 {
4685   enum tree_code comp_code = TREE_CODE (arg0);
4686   tree arg00 = TREE_OPERAND (arg0, 0);
4687   tree arg01 = TREE_OPERAND (arg0, 1);
4688   tree arg1_type = TREE_TYPE (arg1);
4689   tree tem;
4690
4691   STRIP_NOPS (arg1);
4692   STRIP_NOPS (arg2);
4693
4694   /* If we have A op 0 ? A : -A, consider applying the following
4695      transformations:
4696
4697      A == 0? A : -A    same as -A
4698      A != 0? A : -A    same as A
4699      A >= 0? A : -A    same as abs (A)
4700      A > 0?  A : -A    same as abs (A)
4701      A <= 0? A : -A    same as -abs (A)
4702      A < 0?  A : -A    same as -abs (A)
4703
4704      None of these transformations work for modes with signed
4705      zeros.  If A is +/-0, the first two transformations will
4706      change the sign of the result (from +0 to -0, or vice
4707      versa).  The last four will fix the sign of the result,
4708      even though the original expressions could be positive or
4709      negative, depending on the sign of A.
4710
4711      Note that all these transformations are correct if A is
4712      NaN, since the two alternatives (A and -A) are also NaNs.  */
4713   if ((FLOAT_TYPE_P (TREE_TYPE (arg01))
4714        ? real_zerop (arg01)
4715        : integer_zerop (arg01))
4716       && ((TREE_CODE (arg2) == NEGATE_EXPR
4717            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4718              /* In the case that A is of the form X-Y, '-A' (arg2) may
4719                 have already been folded to Y-X, check for that. */
4720           || (TREE_CODE (arg1) == MINUS_EXPR
4721               && TREE_CODE (arg2) == MINUS_EXPR
4722               && operand_equal_p (TREE_OPERAND (arg1, 0),
4723                                   TREE_OPERAND (arg2, 1), 0)
4724               && operand_equal_p (TREE_OPERAND (arg1, 1),
4725                                   TREE_OPERAND (arg2, 0), 0))))
4726     switch (comp_code)
4727       {
4728       case EQ_EXPR:
4729       case UNEQ_EXPR:
4730         tem = fold_convert (arg1_type, arg1);
4731         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4732       case NE_EXPR:
4733       case LTGT_EXPR:
4734         return pedantic_non_lvalue (fold_convert (type, arg1));
4735       case UNGE_EXPR:
4736       case UNGT_EXPR:
4737         if (flag_trapping_math)
4738           break;
4739         /* Fall through.  */
4740       case GE_EXPR:
4741       case GT_EXPR:
4742         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4743           arg1 = fold_convert (lang_hooks.types.signed_type
4744                                (TREE_TYPE (arg1)), arg1);
4745         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4746         return pedantic_non_lvalue (fold_convert (type, tem));
4747       case UNLE_EXPR:
4748       case UNLT_EXPR:
4749         if (flag_trapping_math)
4750           break;
4751       case LE_EXPR:
4752       case LT_EXPR:
4753         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4754           arg1 = fold_convert (lang_hooks.types.signed_type
4755                                (TREE_TYPE (arg1)), arg1);
4756         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4757         return negate_expr (fold_convert (type, tem));
4758       default:
4759         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4760         break;
4761       }
4762
4763   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4764      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4765      both transformations are correct when A is NaN: A != 0
4766      is then true, and A == 0 is false.  */
4767
4768   if (integer_zerop (arg01) && integer_zerop (arg2))
4769     {
4770       if (comp_code == NE_EXPR)
4771         return pedantic_non_lvalue (fold_convert (type, arg1));
4772       else if (comp_code == EQ_EXPR)
4773         return build_int_cst (type, 0);
4774     }
4775
4776   /* Try some transformations of A op B ? A : B.
4777
4778      A == B? A : B    same as B
4779      A != B? A : B    same as A
4780      A >= B? A : B    same as max (A, B)
4781      A > B?  A : B    same as max (B, A)
4782      A <= B? A : B    same as min (A, B)
4783      A < B?  A : B    same as min (B, A)
4784
4785      As above, these transformations don't work in the presence
4786      of signed zeros.  For example, if A and B are zeros of
4787      opposite sign, the first two transformations will change
4788      the sign of the result.  In the last four, the original
4789      expressions give different results for (A=+0, B=-0) and
4790      (A=-0, B=+0), but the transformed expressions do not.
4791
4792      The first two transformations are correct if either A or B
4793      is a NaN.  In the first transformation, the condition will
4794      be false, and B will indeed be chosen.  In the case of the
4795      second transformation, the condition A != B will be true,
4796      and A will be chosen.
4797
4798      The conversions to max() and min() are not correct if B is
4799      a number and A is not.  The conditions in the original
4800      expressions will be false, so all four give B.  The min()
4801      and max() versions would give a NaN instead.  */
4802   if (operand_equal_for_comparison_p (arg01, arg2, arg00)
4803       /* Avoid these transformations if the COND_EXPR may be used
4804          as an lvalue in the C++ front-end.  PR c++/19199.  */
4805       && (in_gimple_form
4806           || (strcmp (lang_hooks.name, "GNU C++") != 0
4807               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4808           || ! maybe_lvalue_p (arg1)
4809           || ! maybe_lvalue_p (arg2)))
4810     {
4811       tree comp_op0 = arg00;
4812       tree comp_op1 = arg01;
4813       tree comp_type = TREE_TYPE (comp_op0);
4814
4815       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4816       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4817         {
4818           comp_type = type;
4819           comp_op0 = arg1;
4820           comp_op1 = arg2;
4821         }
4822
4823       switch (comp_code)
4824         {
4825         case EQ_EXPR:
4826           return pedantic_non_lvalue (fold_convert (type, arg2));
4827         case NE_EXPR:
4828           return pedantic_non_lvalue (fold_convert (type, arg1));
4829         case LE_EXPR:
4830         case LT_EXPR:
4831         case UNLE_EXPR:
4832         case UNLT_EXPR:
4833           /* In C++ a ?: expression can be an lvalue, so put the
4834              operand which will be used if they are equal first
4835              so that we can convert this back to the
4836              corresponding COND_EXPR.  */
4837           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4838             {
4839               comp_op0 = fold_convert (comp_type, comp_op0);
4840               comp_op1 = fold_convert (comp_type, comp_op1);
4841               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4842                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4843                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4844               return pedantic_non_lvalue (fold_convert (type, tem));
4845             }
4846           break;
4847         case GE_EXPR:
4848         case GT_EXPR:
4849         case UNGE_EXPR:
4850         case UNGT_EXPR:
4851           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4852             {
4853               comp_op0 = fold_convert (comp_type, comp_op0);
4854               comp_op1 = fold_convert (comp_type, comp_op1);
4855               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4856                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
4857                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
4858               return pedantic_non_lvalue (fold_convert (type, tem));
4859             }
4860           break;
4861         case UNEQ_EXPR:
4862           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4863             return pedantic_non_lvalue (fold_convert (type, arg2));
4864           break;
4865         case LTGT_EXPR:
4866           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4867             return pedantic_non_lvalue (fold_convert (type, arg1));
4868           break;
4869         default:
4870           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4871           break;
4872         }
4873     }
4874
4875   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4876      we might still be able to simplify this.  For example,
4877      if C1 is one less or one more than C2, this might have started
4878      out as a MIN or MAX and been transformed by this function.
4879      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
4880
4881   if (INTEGRAL_TYPE_P (type)
4882       && TREE_CODE (arg01) == INTEGER_CST
4883       && TREE_CODE (arg2) == INTEGER_CST)
4884     switch (comp_code)
4885       {
4886       case EQ_EXPR:
4887         /* We can replace A with C1 in this case.  */
4888         arg1 = fold_convert (type, arg01);
4889         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
4890
4891       case LT_EXPR:
4892         /* If C1 is C2 + 1, this is min(A, C2).  */
4893         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4894                                OEP_ONLY_CONST)
4895             && operand_equal_p (arg01,
4896                                 const_binop (PLUS_EXPR, arg2,
4897                                              build_int_cst (type, 1), 0),
4898                                 OEP_ONLY_CONST))
4899           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4900                                                    type, arg1, arg2));
4901         break;
4902
4903       case LE_EXPR:
4904         /* If C1 is C2 - 1, this is min(A, C2).  */
4905         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4906                                OEP_ONLY_CONST)
4907             && operand_equal_p (arg01,
4908                                 const_binop (MINUS_EXPR, arg2,
4909                                              build_int_cst (type, 1), 0),
4910                                 OEP_ONLY_CONST))
4911           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4912                                                    type, arg1, arg2));
4913         break;
4914
4915       case GT_EXPR:
4916         /* If C1 is C2 - 1, this is max(A, C2).  */
4917         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4918                                OEP_ONLY_CONST)
4919             && operand_equal_p (arg01,
4920                                 const_binop (MINUS_EXPR, arg2,
4921                                              build_int_cst (type, 1), 0),
4922                                 OEP_ONLY_CONST))
4923           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4924                                                    type, arg1, arg2));
4925         break;
4926
4927       case GE_EXPR:
4928         /* If C1 is C2 + 1, this is max(A, C2).  */
4929         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4930                                OEP_ONLY_CONST)
4931             && operand_equal_p (arg01,
4932                                 const_binop (PLUS_EXPR, arg2,
4933                                              build_int_cst (type, 1), 0),
4934                                 OEP_ONLY_CONST))
4935           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4936                                                    type, arg1, arg2));
4937         break;
4938       case NE_EXPR:
4939         break;
4940       default:
4941         gcc_unreachable ();
4942       }
4943
4944   return NULL_TREE;
4945 }
4946
4947
4948 \f
4949 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4950 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
4951 #endif
4952
4953 /* EXP is some logical combination of boolean tests.  See if we can
4954    merge it into some range test.  Return the new tree if so.  */
4955
4956 static tree
4957 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
4958 {
4959   int or_op = (code == TRUTH_ORIF_EXPR
4960                || code == TRUTH_OR_EXPR);
4961   int in0_p, in1_p, in_p;
4962   tree low0, low1, low, high0, high1, high;
4963   bool strict_overflow_p = false;
4964   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
4965   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
4966   tree tem;
4967   const char * const warnmsg = G_("assuming signed overflow does not occur "
4968                                   "when simplifying range test");
4969
4970   /* If this is an OR operation, invert both sides; we will invert
4971      again at the end.  */
4972   if (or_op)
4973     in0_p = ! in0_p, in1_p = ! in1_p;
4974
4975   /* If both expressions are the same, if we can merge the ranges, and we
4976      can build the range test, return it or it inverted.  If one of the
4977      ranges is always true or always false, consider it to be the same
4978      expression as the other.  */
4979   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
4980       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4981                        in1_p, low1, high1)
4982       && 0 != (tem = (build_range_check (type,
4983                                          lhs != 0 ? lhs
4984                                          : rhs != 0 ? rhs : integer_zero_node,
4985                                          in_p, low, high))))
4986     {
4987       if (strict_overflow_p)
4988         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
4989       return or_op ? invert_truthvalue (tem) : tem;
4990     }
4991
4992   /* On machines where the branch cost is expensive, if this is a
4993      short-circuited branch and the underlying object on both sides
4994      is the same, make a non-short-circuit operation.  */
4995   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
4996            && lhs != 0 && rhs != 0
4997            && (code == TRUTH_ANDIF_EXPR
4998                || code == TRUTH_ORIF_EXPR)
4999            && operand_equal_p (lhs, rhs, 0))
5000     {
5001       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5002          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5003          which cases we can't do this.  */
5004       if (simple_operand_p (lhs))
5005         return build2 (code == TRUTH_ANDIF_EXPR
5006                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5007                        type, op0, op1);
5008
5009       else if (lang_hooks.decls.global_bindings_p () == 0
5010                && ! CONTAINS_PLACEHOLDER_P (lhs))
5011         {
5012           tree common = save_expr (lhs);
5013
5014           if (0 != (lhs = build_range_check (type, common,
5015                                              or_op ? ! in0_p : in0_p,
5016                                              low0, high0))
5017               && (0 != (rhs = build_range_check (type, common,
5018                                                  or_op ? ! in1_p : in1_p,
5019                                                  low1, high1))))
5020             {
5021               if (strict_overflow_p)
5022                 fold_overflow_warning (warnmsg,
5023                                        WARN_STRICT_OVERFLOW_COMPARISON);
5024               return build2 (code == TRUTH_ANDIF_EXPR
5025                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5026                              type, lhs, rhs);
5027             }
5028         }
5029     }
5030
5031   return 0;
5032 }
5033 \f
5034 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5035    bit value.  Arrange things so the extra bits will be set to zero if and
5036    only if C is signed-extended to its full width.  If MASK is nonzero,
5037    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5038
5039 static tree
5040 unextend (tree c, int p, int unsignedp, tree mask)
5041 {
5042   tree type = TREE_TYPE (c);
5043   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5044   tree temp;
5045
5046   if (p == modesize || unsignedp)
5047     return c;
5048
5049   /* We work by getting just the sign bit into the low-order bit, then
5050      into the high-order bit, then sign-extend.  We then XOR that value
5051      with C.  */
5052   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5053   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5054
5055   /* We must use a signed type in order to get an arithmetic right shift.
5056      However, we must also avoid introducing accidental overflows, so that
5057      a subsequent call to integer_zerop will work.  Hence we must
5058      do the type conversion here.  At this point, the constant is either
5059      zero or one, and the conversion to a signed type can never overflow.
5060      We could get an overflow if this conversion is done anywhere else.  */
5061   if (TYPE_UNSIGNED (type))
5062     temp = fold_convert (lang_hooks.types.signed_type (type), temp);
5063
5064   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5065   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5066   if (mask != 0)
5067     temp = const_binop (BIT_AND_EXPR, temp,
5068                         fold_convert (TREE_TYPE (c), mask), 0);
5069   /* If necessary, convert the type back to match the type of C.  */
5070   if (TYPE_UNSIGNED (type))
5071     temp = fold_convert (type, temp);
5072
5073   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5074 }
5075 \f
5076 /* Find ways of folding logical expressions of LHS and RHS:
5077    Try to merge two comparisons to the same innermost item.
5078    Look for range tests like "ch >= '0' && ch <= '9'".
5079    Look for combinations of simple terms on machines with expensive branches
5080    and evaluate the RHS unconditionally.
5081
5082    For example, if we have p->a == 2 && p->b == 4 and we can make an
5083    object large enough to span both A and B, we can do this with a comparison
5084    against the object ANDed with the a mask.
5085
5086    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5087    operations to do this with one comparison.
5088
5089    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5090    function and the one above.
5091
5092    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5093    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5094
5095    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5096    two operands.
5097
5098    We return the simplified tree or 0 if no optimization is possible.  */
5099
5100 static tree
5101 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5102 {
5103   /* If this is the "or" of two comparisons, we can do something if
5104      the comparisons are NE_EXPR.  If this is the "and", we can do something
5105      if the comparisons are EQ_EXPR.  I.e.,
5106         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5107
5108      WANTED_CODE is this operation code.  For single bit fields, we can
5109      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5110      comparison for one-bit fields.  */
5111
5112   enum tree_code wanted_code;
5113   enum tree_code lcode, rcode;
5114   tree ll_arg, lr_arg, rl_arg, rr_arg;
5115   tree ll_inner, lr_inner, rl_inner, rr_inner;
5116   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5117   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5118   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5119   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5120   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5121   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5122   enum machine_mode lnmode, rnmode;
5123   tree ll_mask, lr_mask, rl_mask, rr_mask;
5124   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5125   tree l_const, r_const;
5126   tree lntype, rntype, result;
5127   int first_bit, end_bit;
5128   int volatilep;
5129   tree orig_lhs = lhs, orig_rhs = rhs;
5130   enum tree_code orig_code = code;
5131
5132   /* Start by getting the comparison codes.  Fail if anything is volatile.
5133      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5134      it were surrounded with a NE_EXPR.  */
5135
5136   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5137     return 0;
5138
5139   lcode = TREE_CODE (lhs);
5140   rcode = TREE_CODE (rhs);
5141
5142   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5143     {
5144       lhs = build2 (NE_EXPR, truth_type, lhs,
5145                     build_int_cst (TREE_TYPE (lhs), 0));
5146       lcode = NE_EXPR;
5147     }
5148
5149   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5150     {
5151       rhs = build2 (NE_EXPR, truth_type, rhs,
5152                     build_int_cst (TREE_TYPE (rhs), 0));
5153       rcode = NE_EXPR;
5154     }
5155
5156   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5157       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5158     return 0;
5159
5160   ll_arg = TREE_OPERAND (lhs, 0);
5161   lr_arg = TREE_OPERAND (lhs, 1);
5162   rl_arg = TREE_OPERAND (rhs, 0);
5163   rr_arg = TREE_OPERAND (rhs, 1);
5164
5165   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5166   if (simple_operand_p (ll_arg)
5167       && simple_operand_p (lr_arg))
5168     {
5169       tree result;
5170       if (operand_equal_p (ll_arg, rl_arg, 0)
5171           && operand_equal_p (lr_arg, rr_arg, 0))
5172         {
5173           result = combine_comparisons (code, lcode, rcode,
5174                                         truth_type, ll_arg, lr_arg);
5175           if (result)
5176             return result;
5177         }
5178       else if (operand_equal_p (ll_arg, rr_arg, 0)
5179                && operand_equal_p (lr_arg, rl_arg, 0))
5180         {
5181           result = combine_comparisons (code, lcode,
5182                                         swap_tree_comparison (rcode),
5183                                         truth_type, ll_arg, lr_arg);
5184           if (result)
5185             return result;
5186         }
5187     }
5188
5189   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5190           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5191
5192   /* If the RHS can be evaluated unconditionally and its operands are
5193      simple, it wins to evaluate the RHS unconditionally on machines
5194      with expensive branches.  In this case, this isn't a comparison
5195      that can be merged.  Avoid doing this if the RHS is a floating-point
5196      comparison since those can trap.  */
5197
5198   if (BRANCH_COST >= 2
5199       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5200       && simple_operand_p (rl_arg)
5201       && simple_operand_p (rr_arg))
5202     {
5203       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5204       if (code == TRUTH_OR_EXPR
5205           && lcode == NE_EXPR && integer_zerop (lr_arg)
5206           && rcode == NE_EXPR && integer_zerop (rr_arg)
5207           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5208         return build2 (NE_EXPR, truth_type,
5209                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5210                                ll_arg, rl_arg),
5211                        build_int_cst (TREE_TYPE (ll_arg), 0));
5212
5213       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5214       if (code == TRUTH_AND_EXPR
5215           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5216           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5217           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5218         return build2 (EQ_EXPR, truth_type,
5219                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5220                                ll_arg, rl_arg),
5221                        build_int_cst (TREE_TYPE (ll_arg), 0));
5222
5223       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5224         {
5225           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5226             return build2 (code, truth_type, lhs, rhs);
5227           return NULL_TREE;
5228         }
5229     }
5230
5231   /* See if the comparisons can be merged.  Then get all the parameters for
5232      each side.  */
5233
5234   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5235       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5236     return 0;
5237
5238   volatilep = 0;
5239   ll_inner = decode_field_reference (ll_arg,
5240                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5241                                      &ll_unsignedp, &volatilep, &ll_mask,
5242                                      &ll_and_mask);
5243   lr_inner = decode_field_reference (lr_arg,
5244                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5245                                      &lr_unsignedp, &volatilep, &lr_mask,
5246                                      &lr_and_mask);
5247   rl_inner = decode_field_reference (rl_arg,
5248                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5249                                      &rl_unsignedp, &volatilep, &rl_mask,
5250                                      &rl_and_mask);
5251   rr_inner = decode_field_reference (rr_arg,
5252                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5253                                      &rr_unsignedp, &volatilep, &rr_mask,
5254                                      &rr_and_mask);
5255
5256   /* It must be true that the inner operation on the lhs of each
5257      comparison must be the same if we are to be able to do anything.
5258      Then see if we have constants.  If not, the same must be true for
5259      the rhs's.  */
5260   if (volatilep || ll_inner == 0 || rl_inner == 0
5261       || ! operand_equal_p (ll_inner, rl_inner, 0))
5262     return 0;
5263
5264   if (TREE_CODE (lr_arg) == INTEGER_CST
5265       && TREE_CODE (rr_arg) == INTEGER_CST)
5266     l_const = lr_arg, r_const = rr_arg;
5267   else if (lr_inner == 0 || rr_inner == 0
5268            || ! operand_equal_p (lr_inner, rr_inner, 0))
5269     return 0;
5270   else
5271     l_const = r_const = 0;
5272
5273   /* If either comparison code is not correct for our logical operation,
5274      fail.  However, we can convert a one-bit comparison against zero into
5275      the opposite comparison against that bit being set in the field.  */
5276
5277   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5278   if (lcode != wanted_code)
5279     {
5280       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5281         {
5282           /* Make the left operand unsigned, since we are only interested
5283              in the value of one bit.  Otherwise we are doing the wrong
5284              thing below.  */
5285           ll_unsignedp = 1;
5286           l_const = ll_mask;
5287         }
5288       else
5289         return 0;
5290     }
5291
5292   /* This is analogous to the code for l_const above.  */
5293   if (rcode != wanted_code)
5294     {
5295       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5296         {
5297           rl_unsignedp = 1;
5298           r_const = rl_mask;
5299         }
5300       else
5301         return 0;
5302     }
5303
5304   /* See if we can find a mode that contains both fields being compared on
5305      the left.  If we can't, fail.  Otherwise, update all constants and masks
5306      to be relative to a field of that size.  */
5307   first_bit = MIN (ll_bitpos, rl_bitpos);
5308   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5309   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5310                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5311                           volatilep);
5312   if (lnmode == VOIDmode)
5313     return 0;
5314
5315   lnbitsize = GET_MODE_BITSIZE (lnmode);
5316   lnbitpos = first_bit & ~ (lnbitsize - 1);
5317   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5318   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5319
5320   if (BYTES_BIG_ENDIAN)
5321     {
5322       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5323       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5324     }
5325
5326   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5327                          size_int (xll_bitpos), 0);
5328   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5329                          size_int (xrl_bitpos), 0);
5330
5331   if (l_const)
5332     {
5333       l_const = fold_convert (lntype, l_const);
5334       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5335       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5336       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5337                                         fold_build1 (BIT_NOT_EXPR,
5338                                                      lntype, ll_mask),
5339                                         0)))
5340         {
5341           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5342
5343           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5344         }
5345     }
5346   if (r_const)
5347     {
5348       r_const = fold_convert (lntype, r_const);
5349       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5350       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5351       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5352                                         fold_build1 (BIT_NOT_EXPR,
5353                                                      lntype, rl_mask),
5354                                         0)))
5355         {
5356           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5357
5358           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5359         }
5360     }
5361
5362   /* If the right sides are not constant, do the same for it.  Also,
5363      disallow this optimization if a size or signedness mismatch occurs
5364      between the left and right sides.  */
5365   if (l_const == 0)
5366     {
5367       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5368           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5369           /* Make sure the two fields on the right
5370              correspond to the left without being swapped.  */
5371           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5372         return 0;
5373
5374       first_bit = MIN (lr_bitpos, rr_bitpos);
5375       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5376       rnmode = get_best_mode (end_bit - first_bit, first_bit,
5377                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5378                               volatilep);
5379       if (rnmode == VOIDmode)
5380         return 0;
5381
5382       rnbitsize = GET_MODE_BITSIZE (rnmode);
5383       rnbitpos = first_bit & ~ (rnbitsize - 1);
5384       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5385       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5386
5387       if (BYTES_BIG_ENDIAN)
5388         {
5389           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5390           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5391         }
5392
5393       lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
5394                              size_int (xlr_bitpos), 0);
5395       rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
5396                              size_int (xrr_bitpos), 0);
5397
5398       /* Make a mask that corresponds to both fields being compared.
5399          Do this for both items being compared.  If the operands are the
5400          same size and the bits being compared are in the same position
5401          then we can do this by masking both and comparing the masked
5402          results.  */
5403       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5404       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
5405       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5406         {
5407           lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5408                                     ll_unsignedp || rl_unsignedp);
5409           if (! all_ones_mask_p (ll_mask, lnbitsize))
5410             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5411
5412           rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
5413                                     lr_unsignedp || rr_unsignedp);
5414           if (! all_ones_mask_p (lr_mask, rnbitsize))
5415             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5416
5417           return build2 (wanted_code, truth_type, lhs, rhs);
5418         }
5419
5420       /* There is still another way we can do something:  If both pairs of
5421          fields being compared are adjacent, we may be able to make a wider
5422          field containing them both.
5423
5424          Note that we still must mask the lhs/rhs expressions.  Furthermore,
5425          the mask must be shifted to account for the shift done by
5426          make_bit_field_ref.  */
5427       if ((ll_bitsize + ll_bitpos == rl_bitpos
5428            && lr_bitsize + lr_bitpos == rr_bitpos)
5429           || (ll_bitpos == rl_bitpos + rl_bitsize
5430               && lr_bitpos == rr_bitpos + rr_bitsize))
5431         {
5432           tree type;
5433
5434           lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
5435                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5436           rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
5437                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5438
5439           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5440                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
5441           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5442                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
5443
5444           /* Convert to the smaller type before masking out unwanted bits.  */
5445           type = lntype;
5446           if (lntype != rntype)
5447             {
5448               if (lnbitsize > rnbitsize)
5449                 {
5450                   lhs = fold_convert (rntype, lhs);
5451                   ll_mask = fold_convert (rntype, ll_mask);
5452                   type = rntype;
5453                 }
5454               else if (lnbitsize < rnbitsize)
5455                 {
5456                   rhs = fold_convert (lntype, rhs);
5457                   lr_mask = fold_convert (lntype, lr_mask);
5458                   type = lntype;
5459                 }
5460             }
5461
5462           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5463             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5464
5465           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5466             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5467
5468           return build2 (wanted_code, truth_type, lhs, rhs);
5469         }
5470
5471       return 0;
5472     }
5473
5474   /* Handle the case of comparisons with constants.  If there is something in
5475      common between the masks, those bits of the constants must be the same.
5476      If not, the condition is always false.  Test for this to avoid generating
5477      incorrect code below.  */
5478   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5479   if (! integer_zerop (result)
5480       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5481                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5482     {
5483       if (wanted_code == NE_EXPR)
5484         {
5485           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5486           return constant_boolean_node (true, truth_type);
5487         }
5488       else
5489         {
5490           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5491           return constant_boolean_node (false, truth_type);
5492         }
5493     }
5494
5495   /* Construct the expression we will return.  First get the component
5496      reference we will make.  Unless the mask is all ones the width of
5497      that field, perform the mask operation.  Then compare with the
5498      merged constant.  */
5499   result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5500                                ll_unsignedp || rl_unsignedp);
5501
5502   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5503   if (! all_ones_mask_p (ll_mask, lnbitsize))
5504     result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
5505
5506   return build2 (wanted_code, truth_type, result,
5507                  const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
5508 }
5509 \f
5510 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5511    constant.  */
5512
5513 static tree
5514 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5515 {
5516   tree arg0 = op0;
5517   enum tree_code op_code;
5518   tree comp_const = op1;
5519   tree minmax_const;
5520   int consts_equal, consts_lt;
5521   tree inner;
5522
5523   STRIP_SIGN_NOPS (arg0);
5524
5525   op_code = TREE_CODE (arg0);
5526   minmax_const = TREE_OPERAND (arg0, 1);
5527   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5528   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5529   inner = TREE_OPERAND (arg0, 0);
5530
5531   /* If something does not permit us to optimize, return the original tree.  */
5532   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5533       || TREE_CODE (comp_const) != INTEGER_CST
5534       || TREE_OVERFLOW (comp_const)
5535       || TREE_CODE (minmax_const) != INTEGER_CST
5536       || TREE_OVERFLOW (minmax_const))
5537     return NULL_TREE;
5538
5539   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5540      and GT_EXPR, doing the rest with recursive calls using logical
5541      simplifications.  */
5542   switch (code)
5543     {
5544     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5545       {
5546         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5547                                           type, op0, op1);
5548         if (tem)
5549           return invert_truthvalue (tem);
5550         return NULL_TREE;
5551       }
5552
5553     case GE_EXPR:
5554       return
5555         fold_build2 (TRUTH_ORIF_EXPR, type,
5556                      optimize_minmax_comparison
5557                      (EQ_EXPR, type, arg0, comp_const),
5558                      optimize_minmax_comparison
5559                      (GT_EXPR, type, arg0, comp_const));
5560
5561     case EQ_EXPR:
5562       if (op_code == MAX_EXPR && consts_equal)
5563         /* MAX (X, 0) == 0  ->  X <= 0  */
5564         return fold_build2 (LE_EXPR, type, inner, comp_const);
5565
5566       else if (op_code == MAX_EXPR && consts_lt)
5567         /* MAX (X, 0) == 5  ->  X == 5   */
5568         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5569
5570       else if (op_code == MAX_EXPR)
5571         /* MAX (X, 0) == -1  ->  false  */
5572         return omit_one_operand (type, integer_zero_node, inner);
5573
5574       else if (consts_equal)
5575         /* MIN (X, 0) == 0  ->  X >= 0  */
5576         return fold_build2 (GE_EXPR, type, inner, comp_const);
5577
5578       else if (consts_lt)
5579         /* MIN (X, 0) == 5  ->  false  */
5580         return omit_one_operand (type, integer_zero_node, inner);
5581
5582       else
5583         /* MIN (X, 0) == -1  ->  X == -1  */
5584         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5585
5586     case GT_EXPR:
5587       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5588         /* MAX (X, 0) > 0  ->  X > 0
5589            MAX (X, 0) > 5  ->  X > 5  */
5590         return fold_build2 (GT_EXPR, type, inner, comp_const);
5591
5592       else if (op_code == MAX_EXPR)
5593         /* MAX (X, 0) > -1  ->  true  */
5594         return omit_one_operand (type, integer_one_node, inner);
5595
5596       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5597         /* MIN (X, 0) > 0  ->  false
5598            MIN (X, 0) > 5  ->  false  */
5599         return omit_one_operand (type, integer_zero_node, inner);
5600
5601       else
5602         /* MIN (X, 0) > -1  ->  X > -1  */
5603         return fold_build2 (GT_EXPR, type, inner, comp_const);
5604
5605     default:
5606       return NULL_TREE;
5607     }
5608 }
5609 \f
5610 /* T is an integer expression that is being multiplied, divided, or taken a
5611    modulus (CODE says which and what kind of divide or modulus) by a
5612    constant C.  See if we can eliminate that operation by folding it with
5613    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5614    should be used for the computation if wider than our type.
5615
5616    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5617    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5618    expression would not overflow or that overflow is undefined for the type
5619    in the language in question.
5620
5621    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5622    the machine has a multiply-accumulate insn or that this is part of an
5623    addressing calculation.
5624
5625    If we return a non-null expression, it is an equivalent form of the
5626    original computation, but need not be in the original type.
5627
5628    We set *STRICT_OVERFLOW_P to true if the return values depends on
5629    signed overflow being undefined.  Otherwise we do not change
5630    *STRICT_OVERFLOW_P.  */
5631
5632 static tree
5633 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5634                 bool *strict_overflow_p)
5635 {
5636   /* To avoid exponential search depth, refuse to allow recursion past
5637      three levels.  Beyond that (1) it's highly unlikely that we'll find
5638      something interesting and (2) we've probably processed it before
5639      when we built the inner expression.  */
5640
5641   static int depth;
5642   tree ret;
5643
5644   if (depth > 3)
5645     return NULL;
5646
5647   depth++;
5648   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5649   depth--;
5650
5651   return ret;
5652 }
5653
5654 static tree
5655 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5656                   bool *strict_overflow_p)
5657 {
5658   tree type = TREE_TYPE (t);
5659   enum tree_code tcode = TREE_CODE (t);
5660   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5661                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5662                 ? wide_type : type);
5663   tree t1, t2;
5664   int same_p = tcode == code;
5665   tree op0 = NULL_TREE, op1 = NULL_TREE;
5666   bool sub_strict_overflow_p;
5667
5668   /* Don't deal with constants of zero here; they confuse the code below.  */
5669   if (integer_zerop (c))
5670     return NULL_TREE;
5671
5672   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5673     op0 = TREE_OPERAND (t, 0);
5674
5675   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5676     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5677
5678   /* Note that we need not handle conditional operations here since fold
5679      already handles those cases.  So just do arithmetic here.  */
5680   switch (tcode)
5681     {
5682     case INTEGER_CST:
5683       /* For a constant, we can always simplify if we are a multiply
5684          or (for divide and modulus) if it is a multiple of our constant.  */
5685       if (code == MULT_EXPR
5686           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5687         return const_binop (code, fold_convert (ctype, t),
5688                             fold_convert (ctype, c), 0);
5689       break;
5690
5691     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5692       /* If op0 is an expression ...  */
5693       if ((COMPARISON_CLASS_P (op0)
5694            || UNARY_CLASS_P (op0)
5695            || BINARY_CLASS_P (op0)
5696            || VL_EXP_CLASS_P (op0)
5697            || EXPRESSION_CLASS_P (op0))
5698           /* ... and is unsigned, and its type is smaller than ctype,
5699              then we cannot pass through as widening.  */
5700           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5701                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5702                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5703                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5704                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5705               /* ... or this is a truncation (t is narrower than op0),
5706                  then we cannot pass through this narrowing.  */
5707               || (GET_MODE_SIZE (TYPE_MODE (type))
5708                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5709               /* ... or signedness changes for division or modulus,
5710                  then we cannot pass through this conversion.  */
5711               || (code != MULT_EXPR
5712                   && (TYPE_UNSIGNED (ctype)
5713                       != TYPE_UNSIGNED (TREE_TYPE (op0))))))
5714         break;
5715
5716       /* Pass the constant down and see if we can make a simplification.  If
5717          we can, replace this expression with the inner simplification for
5718          possible later conversion to our or some other type.  */
5719       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5720           && TREE_CODE (t2) == INTEGER_CST
5721           && !TREE_OVERFLOW (t2)
5722           && (0 != (t1 = extract_muldiv (op0, t2, code,
5723                                          code == MULT_EXPR
5724                                          ? ctype : NULL_TREE,
5725                                          strict_overflow_p))))
5726         return t1;
5727       break;
5728
5729     case ABS_EXPR:
5730       /* If widening the type changes it from signed to unsigned, then we
5731          must avoid building ABS_EXPR itself as unsigned.  */
5732       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5733         {
5734           tree cstype = (*lang_hooks.types.signed_type) (ctype);
5735           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5736               != 0)
5737             {
5738               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5739               return fold_convert (ctype, t1);
5740             }
5741           break;
5742         }
5743       /* FALLTHROUGH */
5744     case NEGATE_EXPR:
5745       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5746           != 0)
5747         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5748       break;
5749
5750     case MIN_EXPR:  case MAX_EXPR:
5751       /* If widening the type changes the signedness, then we can't perform
5752          this optimization as that changes the result.  */
5753       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5754         break;
5755
5756       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5757       sub_strict_overflow_p = false;
5758       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5759                                 &sub_strict_overflow_p)) != 0
5760           && (t2 = extract_muldiv (op1, c, code, wide_type,
5761                                    &sub_strict_overflow_p)) != 0)
5762         {
5763           if (tree_int_cst_sgn (c) < 0)
5764             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5765           if (sub_strict_overflow_p)
5766             *strict_overflow_p = true;
5767           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5768                               fold_convert (ctype, t2));
5769         }
5770       break;
5771
5772     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5773       /* If the second operand is constant, this is a multiplication
5774          or floor division, by a power of two, so we can treat it that
5775          way unless the multiplier or divisor overflows.  Signed
5776          left-shift overflow is implementation-defined rather than
5777          undefined in C90, so do not convert signed left shift into
5778          multiplication.  */
5779       if (TREE_CODE (op1) == INTEGER_CST
5780           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5781           /* const_binop may not detect overflow correctly,
5782              so check for it explicitly here.  */
5783           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5784           && TREE_INT_CST_HIGH (op1) == 0
5785           && 0 != (t1 = fold_convert (ctype,
5786                                       const_binop (LSHIFT_EXPR,
5787                                                    size_one_node,
5788                                                    op1, 0)))
5789           && !TREE_OVERFLOW (t1))
5790         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5791                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5792                                        ctype, fold_convert (ctype, op0), t1),
5793                                c, code, wide_type, strict_overflow_p);
5794       break;
5795
5796     case PLUS_EXPR:  case MINUS_EXPR:
5797       /* See if we can eliminate the operation on both sides.  If we can, we
5798          can return a new PLUS or MINUS.  If we can't, the only remaining
5799          cases where we can do anything are if the second operand is a
5800          constant.  */
5801       sub_strict_overflow_p = false;
5802       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5803       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5804       if (t1 != 0 && t2 != 0
5805           && (code == MULT_EXPR
5806               /* If not multiplication, we can only do this if both operands
5807                  are divisible by c.  */
5808               || (multiple_of_p (ctype, op0, c)
5809                   && multiple_of_p (ctype, op1, c))))
5810         {
5811           if (sub_strict_overflow_p)
5812             *strict_overflow_p = true;
5813           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5814                               fold_convert (ctype, t2));
5815         }
5816
5817       /* If this was a subtraction, negate OP1 and set it to be an addition.
5818          This simplifies the logic below.  */
5819       if (tcode == MINUS_EXPR)
5820         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5821
5822       if (TREE_CODE (op1) != INTEGER_CST)
5823         break;
5824
5825       /* If either OP1 or C are negative, this optimization is not safe for
5826          some of the division and remainder types while for others we need
5827          to change the code.  */
5828       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5829         {
5830           if (code == CEIL_DIV_EXPR)
5831             code = FLOOR_DIV_EXPR;
5832           else if (code == FLOOR_DIV_EXPR)
5833             code = CEIL_DIV_EXPR;
5834           else if (code != MULT_EXPR
5835                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5836             break;
5837         }
5838
5839       /* If it's a multiply or a division/modulus operation of a multiple
5840          of our constant, do the operation and verify it doesn't overflow.  */
5841       if (code == MULT_EXPR
5842           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5843         {
5844           op1 = const_binop (code, fold_convert (ctype, op1),
5845                              fold_convert (ctype, c), 0);
5846           /* We allow the constant to overflow with wrapping semantics.  */
5847           if (op1 == 0
5848               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5849             break;
5850         }
5851       else
5852         break;
5853
5854       /* If we have an unsigned type is not a sizetype, we cannot widen
5855          the operation since it will change the result if the original
5856          computation overflowed.  */
5857       if (TYPE_UNSIGNED (ctype)
5858           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5859           && ctype != type)
5860         break;
5861
5862       /* If we were able to eliminate our operation from the first side,
5863          apply our operation to the second side and reform the PLUS.  */
5864       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5865         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5866
5867       /* The last case is if we are a multiply.  In that case, we can
5868          apply the distributive law to commute the multiply and addition
5869          if the multiplication of the constants doesn't overflow.  */
5870       if (code == MULT_EXPR)
5871         return fold_build2 (tcode, ctype,
5872                             fold_build2 (code, ctype,
5873                                          fold_convert (ctype, op0),
5874                                          fold_convert (ctype, c)),
5875                             op1);
5876
5877       break;
5878
5879     case MULT_EXPR:
5880       /* We have a special case here if we are doing something like
5881          (C * 8) % 4 since we know that's zero.  */
5882       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5883            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5884           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5885           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5886         return omit_one_operand (type, integer_zero_node, op0);
5887
5888       /* ... fall through ...  */
5889
5890     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5891     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5892       /* If we can extract our operation from the LHS, do so and return a
5893          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5894          do something only if the second operand is a constant.  */
5895       if (same_p
5896           && (t1 = extract_muldiv (op0, c, code, wide_type,
5897                                    strict_overflow_p)) != 0)
5898         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5899                             fold_convert (ctype, op1));
5900       else if (tcode == MULT_EXPR && code == MULT_EXPR
5901                && (t1 = extract_muldiv (op1, c, code, wide_type,
5902                                         strict_overflow_p)) != 0)
5903         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5904                             fold_convert (ctype, t1));
5905       else if (TREE_CODE (op1) != INTEGER_CST)
5906         return 0;
5907
5908       /* If these are the same operation types, we can associate them
5909          assuming no overflow.  */
5910       if (tcode == code
5911           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5912                                      fold_convert (ctype, c), 0))
5913           && !TREE_OVERFLOW (t1))
5914         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5915
5916       /* If these operations "cancel" each other, we have the main
5917          optimizations of this pass, which occur when either constant is a
5918          multiple of the other, in which case we replace this with either an
5919          operation or CODE or TCODE.
5920
5921          If we have an unsigned type that is not a sizetype, we cannot do
5922          this since it will change the result if the original computation
5923          overflowed.  */
5924       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5925            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5926           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5927               || (tcode == MULT_EXPR
5928                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5929                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
5930         {
5931           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5932             {
5933               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5934                 *strict_overflow_p = true;
5935               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5936                                   fold_convert (ctype,
5937                                                 const_binop (TRUNC_DIV_EXPR,
5938                                                              op1, c, 0)));
5939             }
5940           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5941             {
5942               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5943                 *strict_overflow_p = true;
5944               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5945                                   fold_convert (ctype,
5946                                                 const_binop (TRUNC_DIV_EXPR,
5947                                                              c, op1, 0)));
5948             }
5949         }
5950       break;
5951
5952     default:
5953       break;
5954     }
5955
5956   return 0;
5957 }
5958 \f
5959 /* Return a node which has the indicated constant VALUE (either 0 or
5960    1), and is of the indicated TYPE.  */
5961
5962 tree
5963 constant_boolean_node (int value, tree type)
5964 {
5965   if (type == integer_type_node)
5966     return value ? integer_one_node : integer_zero_node;
5967   else if (type == boolean_type_node)
5968     return value ? boolean_true_node : boolean_false_node;
5969   else
5970     return build_int_cst (type, value);
5971 }
5972
5973
5974 /* Return true if expr looks like an ARRAY_REF and set base and
5975    offset to the appropriate trees.  If there is no offset,
5976    offset is set to NULL_TREE.  Base will be canonicalized to
5977    something you can get the element type from using
5978    TREE_TYPE (TREE_TYPE (base)).  Offset will be the offset
5979    in bytes to the base.  */
5980
5981 static bool
5982 extract_array_ref (tree expr, tree *base, tree *offset)
5983 {
5984   /* One canonical form is a PLUS_EXPR with the first
5985      argument being an ADDR_EXPR with a possible NOP_EXPR
5986      attached.  */
5987   if (TREE_CODE (expr) == PLUS_EXPR)
5988     {
5989       tree op0 = TREE_OPERAND (expr, 0);
5990       tree inner_base, dummy1;
5991       /* Strip NOP_EXPRs here because the C frontends and/or
5992          folders present us (int *)&x.a + 4B possibly.  */
5993       STRIP_NOPS (op0);
5994       if (extract_array_ref (op0, &inner_base, &dummy1))
5995         {
5996           *base = inner_base;
5997           if (dummy1 == NULL_TREE)
5998             *offset = TREE_OPERAND (expr, 1);
5999           else
6000             *offset = fold_build2 (PLUS_EXPR, TREE_TYPE (expr),
6001                                    dummy1, TREE_OPERAND (expr, 1));
6002           return true;
6003         }
6004     }
6005   /* Other canonical form is an ADDR_EXPR of an ARRAY_REF,
6006      which we transform into an ADDR_EXPR with appropriate
6007      offset.  For other arguments to the ADDR_EXPR we assume
6008      zero offset and as such do not care about the ADDR_EXPR
6009      type and strip possible nops from it.  */
6010   else if (TREE_CODE (expr) == ADDR_EXPR)
6011     {
6012       tree op0 = TREE_OPERAND (expr, 0);
6013       if (TREE_CODE (op0) == ARRAY_REF)
6014         {
6015           tree idx = TREE_OPERAND (op0, 1);
6016           *base = TREE_OPERAND (op0, 0);
6017           *offset = fold_build2 (MULT_EXPR, TREE_TYPE (idx), idx,
6018                                  array_ref_element_size (op0)); 
6019         }
6020       else
6021         {
6022           /* Handle array-to-pointer decay as &a.  */
6023           if (TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
6024             *base = TREE_OPERAND (expr, 0);
6025           else
6026             *base = expr;
6027           *offset = NULL_TREE;
6028         }
6029       return true;
6030     }
6031   /* The next canonical form is a VAR_DECL with POINTER_TYPE.  */
6032   else if (SSA_VAR_P (expr)
6033            && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
6034     {
6035       *base = expr;
6036       *offset = NULL_TREE;
6037       return true;
6038     }
6039
6040   return false;
6041 }
6042
6043
6044 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6045    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6046    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6047    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6048    COND is the first argument to CODE; otherwise (as in the example
6049    given here), it is the second argument.  TYPE is the type of the
6050    original expression.  Return NULL_TREE if no simplification is
6051    possible.  */
6052
6053 static tree
6054 fold_binary_op_with_conditional_arg (enum tree_code code,
6055                                      tree type, tree op0, tree op1,
6056                                      tree cond, tree arg, int cond_first_p)
6057 {
6058   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6059   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6060   tree test, true_value, false_value;
6061   tree lhs = NULL_TREE;
6062   tree rhs = NULL_TREE;
6063
6064   /* This transformation is only worthwhile if we don't have to wrap
6065      arg in a SAVE_EXPR, and the operation can be simplified on at least
6066      one of the branches once its pushed inside the COND_EXPR.  */
6067   if (!TREE_CONSTANT (arg))
6068     return NULL_TREE;
6069
6070   if (TREE_CODE (cond) == COND_EXPR)
6071     {
6072       test = TREE_OPERAND (cond, 0);
6073       true_value = TREE_OPERAND (cond, 1);
6074       false_value = TREE_OPERAND (cond, 2);
6075       /* If this operand throws an expression, then it does not make
6076          sense to try to perform a logical or arithmetic operation
6077          involving it.  */
6078       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6079         lhs = true_value;
6080       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6081         rhs = false_value;
6082     }
6083   else
6084     {
6085       tree testtype = TREE_TYPE (cond);
6086       test = cond;
6087       true_value = constant_boolean_node (true, testtype);
6088       false_value = constant_boolean_node (false, testtype);
6089     }
6090
6091   arg = fold_convert (arg_type, arg);
6092   if (lhs == 0)
6093     {
6094       true_value = fold_convert (cond_type, true_value);
6095       if (cond_first_p)
6096         lhs = fold_build2 (code, type, true_value, arg);
6097       else
6098         lhs = fold_build2 (code, type, arg, true_value);
6099     }
6100   if (rhs == 0)
6101     {
6102       false_value = fold_convert (cond_type, false_value);
6103       if (cond_first_p)
6104         rhs = fold_build2 (code, type, false_value, arg);
6105       else
6106         rhs = fold_build2 (code, type, arg, false_value);
6107     }
6108
6109   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6110   return fold_convert (type, test);
6111 }
6112
6113 \f
6114 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6115
6116    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6117    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6118    ADDEND is the same as X.
6119
6120    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6121    and finite.  The problematic cases are when X is zero, and its mode
6122    has signed zeros.  In the case of rounding towards -infinity,
6123    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6124    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6125
6126 static bool
6127 fold_real_zero_addition_p (tree type, tree addend, int negate)
6128 {
6129   if (!real_zerop (addend))
6130     return false;
6131
6132   /* Don't allow the fold with -fsignaling-nans.  */
6133   if (HONOR_SNANS (TYPE_MODE (type)))
6134     return false;
6135
6136   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6137   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6138     return true;
6139
6140   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6141   if (TREE_CODE (addend) == REAL_CST
6142       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6143     negate = !negate;
6144
6145   /* The mode has signed zeros, and we have to honor their sign.
6146      In this situation, there is only one case we can return true for.
6147      X - 0 is the same as X unless rounding towards -infinity is
6148      supported.  */
6149   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6150 }
6151
6152 /* Subroutine of fold() that checks comparisons of built-in math
6153    functions against real constants.
6154
6155    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6156    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6157    is the type of the result and ARG0 and ARG1 are the operands of the
6158    comparison.  ARG1 must be a TREE_REAL_CST.
6159
6160    The function returns the constant folded tree if a simplification
6161    can be made, and NULL_TREE otherwise.  */
6162
6163 static tree
6164 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6165                      tree type, tree arg0, tree arg1)
6166 {
6167   REAL_VALUE_TYPE c;
6168
6169   if (BUILTIN_SQRT_P (fcode))
6170     {
6171       tree arg = CALL_EXPR_ARG (arg0, 0);
6172       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6173
6174       c = TREE_REAL_CST (arg1);
6175       if (REAL_VALUE_NEGATIVE (c))
6176         {
6177           /* sqrt(x) < y is always false, if y is negative.  */
6178           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6179             return omit_one_operand (type, integer_zero_node, arg);
6180
6181           /* sqrt(x) > y is always true, if y is negative and we
6182              don't care about NaNs, i.e. negative values of x.  */
6183           if (code == NE_EXPR || !HONOR_NANS (mode))
6184             return omit_one_operand (type, integer_one_node, arg);
6185
6186           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6187           return fold_build2 (GE_EXPR, type, arg,
6188                               build_real (TREE_TYPE (arg), dconst0));
6189         }
6190       else if (code == GT_EXPR || code == GE_EXPR)
6191         {
6192           REAL_VALUE_TYPE c2;
6193
6194           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6195           real_convert (&c2, mode, &c2);
6196
6197           if (REAL_VALUE_ISINF (c2))
6198             {
6199               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6200               if (HONOR_INFINITIES (mode))
6201                 return fold_build2 (EQ_EXPR, type, arg,
6202                                     build_real (TREE_TYPE (arg), c2));
6203
6204               /* sqrt(x) > y is always false, when y is very large
6205                  and we don't care about infinities.  */
6206               return omit_one_operand (type, integer_zero_node, arg);
6207             }
6208
6209           /* sqrt(x) > c is the same as x > c*c.  */
6210           return fold_build2 (code, type, arg,
6211                               build_real (TREE_TYPE (arg), c2));
6212         }
6213       else if (code == LT_EXPR || code == LE_EXPR)
6214         {
6215           REAL_VALUE_TYPE c2;
6216
6217           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6218           real_convert (&c2, mode, &c2);
6219
6220           if (REAL_VALUE_ISINF (c2))
6221             {
6222               /* sqrt(x) < y is always true, when y is a very large
6223                  value and we don't care about NaNs or Infinities.  */
6224               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6225                 return omit_one_operand (type, integer_one_node, arg);
6226
6227               /* sqrt(x) < y is x != +Inf when y is very large and we
6228                  don't care about NaNs.  */
6229               if (! HONOR_NANS (mode))
6230                 return fold_build2 (NE_EXPR, type, arg,
6231                                     build_real (TREE_TYPE (arg), c2));
6232
6233               /* sqrt(x) < y is x >= 0 when y is very large and we
6234                  don't care about Infinities.  */
6235               if (! HONOR_INFINITIES (mode))
6236                 return fold_build2 (GE_EXPR, type, arg,
6237                                     build_real (TREE_TYPE (arg), dconst0));
6238
6239               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6240               if (lang_hooks.decls.global_bindings_p () != 0
6241                   || CONTAINS_PLACEHOLDER_P (arg))
6242                 return NULL_TREE;
6243
6244               arg = save_expr (arg);
6245               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6246                                   fold_build2 (GE_EXPR, type, arg,
6247                                                build_real (TREE_TYPE (arg),
6248                                                            dconst0)),
6249                                   fold_build2 (NE_EXPR, type, arg,
6250                                                build_real (TREE_TYPE (arg),
6251                                                            c2)));
6252             }
6253
6254           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6255           if (! HONOR_NANS (mode))
6256             return fold_build2 (code, type, arg,
6257                                 build_real (TREE_TYPE (arg), c2));
6258
6259           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6260           if (lang_hooks.decls.global_bindings_p () == 0
6261               && ! CONTAINS_PLACEHOLDER_P (arg))
6262             {
6263               arg = save_expr (arg);
6264               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6265                                   fold_build2 (GE_EXPR, type, arg,
6266                                                build_real (TREE_TYPE (arg),
6267                                                            dconst0)),
6268                                   fold_build2 (code, type, arg,
6269                                                build_real (TREE_TYPE (arg),
6270                                                            c2)));
6271             }
6272         }
6273     }
6274
6275   return NULL_TREE;
6276 }
6277
6278 /* Subroutine of fold() that optimizes comparisons against Infinities,
6279    either +Inf or -Inf.
6280
6281    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6282    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6283    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6284
6285    The function returns the constant folded tree if a simplification
6286    can be made, and NULL_TREE otherwise.  */
6287
6288 static tree
6289 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6290 {
6291   enum machine_mode mode;
6292   REAL_VALUE_TYPE max;
6293   tree temp;
6294   bool neg;
6295
6296   mode = TYPE_MODE (TREE_TYPE (arg0));
6297
6298   /* For negative infinity swap the sense of the comparison.  */
6299   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6300   if (neg)
6301     code = swap_tree_comparison (code);
6302
6303   switch (code)
6304     {
6305     case GT_EXPR:
6306       /* x > +Inf is always false, if with ignore sNANs.  */
6307       if (HONOR_SNANS (mode))
6308         return NULL_TREE;
6309       return omit_one_operand (type, integer_zero_node, arg0);
6310
6311     case LE_EXPR:
6312       /* x <= +Inf is always true, if we don't case about NaNs.  */
6313       if (! HONOR_NANS (mode))
6314         return omit_one_operand (type, integer_one_node, arg0);
6315
6316       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6317       if (lang_hooks.decls.global_bindings_p () == 0
6318           && ! CONTAINS_PLACEHOLDER_P (arg0))
6319         {
6320           arg0 = save_expr (arg0);
6321           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6322         }
6323       break;
6324
6325     case EQ_EXPR:
6326     case GE_EXPR:
6327       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6328       real_maxval (&max, neg, mode);
6329       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6330                           arg0, build_real (TREE_TYPE (arg0), max));
6331
6332     case LT_EXPR:
6333       /* x < +Inf is always equal to x <= DBL_MAX.  */
6334       real_maxval (&max, neg, mode);
6335       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6336                           arg0, build_real (TREE_TYPE (arg0), max));
6337
6338     case NE_EXPR:
6339       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6340       real_maxval (&max, neg, mode);
6341       if (! HONOR_NANS (mode))
6342         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6343                             arg0, build_real (TREE_TYPE (arg0), max));
6344
6345       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6346                           arg0, build_real (TREE_TYPE (arg0), max));
6347       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6348
6349     default:
6350       break;
6351     }
6352
6353   return NULL_TREE;
6354 }
6355
6356 /* Subroutine of fold() that optimizes comparisons of a division by
6357    a nonzero integer constant against an integer constant, i.e.
6358    X/C1 op C2.
6359
6360    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6361    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6362    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6363
6364    The function returns the constant folded tree if a simplification
6365    can be made, and NULL_TREE otherwise.  */
6366
6367 static tree
6368 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6369 {
6370   tree prod, tmp, hi, lo;
6371   tree arg00 = TREE_OPERAND (arg0, 0);
6372   tree arg01 = TREE_OPERAND (arg0, 1);
6373   unsigned HOST_WIDE_INT lpart;
6374   HOST_WIDE_INT hpart;
6375   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6376   bool neg_overflow;
6377   int overflow;
6378
6379   /* We have to do this the hard way to detect unsigned overflow.
6380      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6381   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6382                                    TREE_INT_CST_HIGH (arg01),
6383                                    TREE_INT_CST_LOW (arg1),
6384                                    TREE_INT_CST_HIGH (arg1),
6385                                    &lpart, &hpart, unsigned_p);
6386   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6387                                 -1, overflow);
6388   neg_overflow = false;
6389
6390   if (unsigned_p)
6391     {
6392       tmp = int_const_binop (MINUS_EXPR, arg01,
6393                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6394       lo = prod;
6395
6396       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6397       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6398                                        TREE_INT_CST_HIGH (prod),
6399                                        TREE_INT_CST_LOW (tmp),
6400                                        TREE_INT_CST_HIGH (tmp),
6401                                        &lpart, &hpart, unsigned_p);
6402       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6403                                   -1, overflow | TREE_OVERFLOW (prod));
6404     }
6405   else if (tree_int_cst_sgn (arg01) >= 0)
6406     {
6407       tmp = int_const_binop (MINUS_EXPR, arg01,
6408                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6409       switch (tree_int_cst_sgn (arg1))
6410         {
6411         case -1:
6412           neg_overflow = true;
6413           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6414           hi = prod;
6415           break;
6416
6417         case  0:
6418           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6419           hi = tmp;
6420           break;
6421
6422         case  1:
6423           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6424           lo = prod;
6425           break;
6426
6427         default:
6428           gcc_unreachable ();
6429         }
6430     }
6431   else
6432     {
6433       /* A negative divisor reverses the relational operators.  */
6434       code = swap_tree_comparison (code);
6435
6436       tmp = int_const_binop (PLUS_EXPR, arg01,
6437                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6438       switch (tree_int_cst_sgn (arg1))
6439         {
6440         case -1:
6441           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6442           lo = prod;
6443           break;
6444
6445         case  0:
6446           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6447           lo = tmp;
6448           break;
6449
6450         case  1:
6451           neg_overflow = true;
6452           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6453           hi = prod;
6454           break;
6455
6456         default:
6457           gcc_unreachable ();
6458         }
6459     }
6460
6461   switch (code)
6462     {
6463     case EQ_EXPR:
6464       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6465         return omit_one_operand (type, integer_zero_node, arg00);
6466       if (TREE_OVERFLOW (hi))
6467         return fold_build2 (GE_EXPR, type, arg00, lo);
6468       if (TREE_OVERFLOW (lo))
6469         return fold_build2 (LE_EXPR, type, arg00, hi);
6470       return build_range_check (type, arg00, 1, lo, hi);
6471
6472     case NE_EXPR:
6473       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6474         return omit_one_operand (type, integer_one_node, arg00);
6475       if (TREE_OVERFLOW (hi))
6476         return fold_build2 (LT_EXPR, type, arg00, lo);
6477       if (TREE_OVERFLOW (lo))
6478         return fold_build2 (GT_EXPR, type, arg00, hi);
6479       return build_range_check (type, arg00, 0, lo, hi);
6480
6481     case LT_EXPR:
6482       if (TREE_OVERFLOW (lo))
6483         {
6484           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6485           return omit_one_operand (type, tmp, arg00);
6486         }
6487       return fold_build2 (LT_EXPR, type, arg00, lo);
6488
6489     case LE_EXPR:
6490       if (TREE_OVERFLOW (hi))
6491         {
6492           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6493           return omit_one_operand (type, tmp, arg00);
6494         }
6495       return fold_build2 (LE_EXPR, type, arg00, hi);
6496
6497     case GT_EXPR:
6498       if (TREE_OVERFLOW (hi))
6499         {
6500           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6501           return omit_one_operand (type, tmp, arg00);
6502         }
6503       return fold_build2 (GT_EXPR, type, arg00, hi);
6504
6505     case GE_EXPR:
6506       if (TREE_OVERFLOW (lo))
6507         {
6508           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6509           return omit_one_operand (type, tmp, arg00);
6510         }
6511       return fold_build2 (GE_EXPR, type, arg00, lo);
6512
6513     default:
6514       break;
6515     }
6516
6517   return NULL_TREE;
6518 }
6519
6520
6521 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6522    equality/inequality test, then return a simplified form of the test
6523    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6524    result type.  */
6525
6526 static tree
6527 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6528                                      tree result_type)
6529 {
6530   /* If this is testing a single bit, we can optimize the test.  */
6531   if ((code == NE_EXPR || code == EQ_EXPR)
6532       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6533       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6534     {
6535       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6536          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6537       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6538
6539       if (arg00 != NULL_TREE
6540           /* This is only a win if casting to a signed type is cheap,
6541              i.e. when arg00's type is not a partial mode.  */
6542           && TYPE_PRECISION (TREE_TYPE (arg00))
6543              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6544         {
6545           tree stype = lang_hooks.types.signed_type (TREE_TYPE (arg00));
6546           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6547                               result_type, fold_convert (stype, arg00),
6548                               build_int_cst (stype, 0));
6549         }
6550     }
6551
6552   return NULL_TREE;
6553 }
6554
6555 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6556    equality/inequality test, then return a simplified form of
6557    the test using shifts and logical operations.  Otherwise return
6558    NULL.  TYPE is the desired result type.  */
6559
6560 tree
6561 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6562                       tree result_type)
6563 {
6564   /* If this is testing a single bit, we can optimize the test.  */
6565   if ((code == NE_EXPR || code == EQ_EXPR)
6566       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6567       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6568     {
6569       tree inner = TREE_OPERAND (arg0, 0);
6570       tree type = TREE_TYPE (arg0);
6571       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6572       enum machine_mode operand_mode = TYPE_MODE (type);
6573       int ops_unsigned;
6574       tree signed_type, unsigned_type, intermediate_type;
6575       tree tem, one;
6576
6577       /* First, see if we can fold the single bit test into a sign-bit
6578          test.  */
6579       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6580                                                  result_type);
6581       if (tem)
6582         return tem;
6583
6584       /* Otherwise we have (A & C) != 0 where C is a single bit,
6585          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6586          Similarly for (A & C) == 0.  */
6587
6588       /* If INNER is a right shift of a constant and it plus BITNUM does
6589          not overflow, adjust BITNUM and INNER.  */
6590       if (TREE_CODE (inner) == RSHIFT_EXPR
6591           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6592           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6593           && bitnum < TYPE_PRECISION (type)
6594           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6595                                    bitnum - TYPE_PRECISION (type)))
6596         {
6597           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6598           inner = TREE_OPERAND (inner, 0);
6599         }
6600
6601       /* If we are going to be able to omit the AND below, we must do our
6602          operations as unsigned.  If we must use the AND, we have a choice.
6603          Normally unsigned is faster, but for some machines signed is.  */
6604 #ifdef LOAD_EXTEND_OP
6605       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6606                       && !flag_syntax_only) ? 0 : 1;
6607 #else
6608       ops_unsigned = 1;
6609 #endif
6610
6611       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6612       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6613       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6614       inner = fold_convert (intermediate_type, inner);
6615
6616       if (bitnum != 0)
6617         inner = build2 (RSHIFT_EXPR, intermediate_type,
6618                         inner, size_int (bitnum));
6619
6620       one = build_int_cst (intermediate_type, 1);
6621
6622       if (code == EQ_EXPR)
6623         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6624
6625       /* Put the AND last so it can combine with more things.  */
6626       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6627
6628       /* Make sure to return the proper type.  */
6629       inner = fold_convert (result_type, inner);
6630
6631       return inner;
6632     }
6633   return NULL_TREE;
6634 }
6635
6636 /* Check whether we are allowed to reorder operands arg0 and arg1,
6637    such that the evaluation of arg1 occurs before arg0.  */
6638
6639 static bool
6640 reorder_operands_p (tree arg0, tree arg1)
6641 {
6642   if (! flag_evaluation_order)
6643       return true;
6644   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6645     return true;
6646   return ! TREE_SIDE_EFFECTS (arg0)
6647          && ! TREE_SIDE_EFFECTS (arg1);
6648 }
6649
6650 /* Test whether it is preferable two swap two operands, ARG0 and
6651    ARG1, for example because ARG0 is an integer constant and ARG1
6652    isn't.  If REORDER is true, only recommend swapping if we can
6653    evaluate the operands in reverse order.  */
6654
6655 bool
6656 tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
6657 {
6658   STRIP_SIGN_NOPS (arg0);
6659   STRIP_SIGN_NOPS (arg1);
6660
6661   if (TREE_CODE (arg1) == INTEGER_CST)
6662     return 0;
6663   if (TREE_CODE (arg0) == INTEGER_CST)
6664     return 1;
6665
6666   if (TREE_CODE (arg1) == REAL_CST)
6667     return 0;
6668   if (TREE_CODE (arg0) == REAL_CST)
6669     return 1;
6670
6671   if (TREE_CODE (arg1) == COMPLEX_CST)
6672     return 0;
6673   if (TREE_CODE (arg0) == COMPLEX_CST)
6674     return 1;
6675
6676   if (TREE_CONSTANT (arg1))
6677     return 0;
6678   if (TREE_CONSTANT (arg0))
6679     return 1;
6680
6681   if (optimize_size)
6682     return 0;
6683
6684   if (reorder && flag_evaluation_order
6685       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6686     return 0;
6687
6688   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6689      for commutative and comparison operators.  Ensuring a canonical
6690      form allows the optimizers to find additional redundancies without
6691      having to explicitly check for both orderings.  */
6692   if (TREE_CODE (arg0) == SSA_NAME
6693       && TREE_CODE (arg1) == SSA_NAME
6694       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6695     return 1;
6696
6697   /* Put SSA_NAMEs last.  */
6698   if (TREE_CODE (arg1) == SSA_NAME)
6699     return 0;
6700   if (TREE_CODE (arg0) == SSA_NAME)
6701     return 1;
6702
6703   /* Put variables last.  */
6704   if (DECL_P (arg1))
6705     return 0;
6706   if (DECL_P (arg0))
6707     return 1;
6708
6709   return 0;
6710 }
6711
6712 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6713    ARG0 is extended to a wider type.  */
6714
6715 static tree
6716 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6717 {
6718   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6719   tree arg1_unw;
6720   tree shorter_type, outer_type;
6721   tree min, max;
6722   bool above, below;
6723
6724   if (arg0_unw == arg0)
6725     return NULL_TREE;
6726   shorter_type = TREE_TYPE (arg0_unw);
6727
6728 #ifdef HAVE_canonicalize_funcptr_for_compare
6729   /* Disable this optimization if we're casting a function pointer
6730      type on targets that require function pointer canonicalization.  */
6731   if (HAVE_canonicalize_funcptr_for_compare
6732       && TREE_CODE (shorter_type) == POINTER_TYPE
6733       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6734     return NULL_TREE;
6735 #endif
6736
6737   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6738     return NULL_TREE;
6739
6740   arg1_unw = get_unwidened (arg1, shorter_type);
6741
6742   /* If possible, express the comparison in the shorter mode.  */
6743   if ((code == EQ_EXPR || code == NE_EXPR
6744        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6745       && (TREE_TYPE (arg1_unw) == shorter_type
6746           || (TREE_CODE (arg1_unw) == INTEGER_CST
6747               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6748                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6749               && int_fits_type_p (arg1_unw, shorter_type))))
6750     return fold_build2 (code, type, arg0_unw,
6751                        fold_convert (shorter_type, arg1_unw));
6752
6753   if (TREE_CODE (arg1_unw) != INTEGER_CST
6754       || TREE_CODE (shorter_type) != INTEGER_TYPE
6755       || !int_fits_type_p (arg1_unw, shorter_type))
6756     return NULL_TREE;
6757
6758   /* If we are comparing with the integer that does not fit into the range
6759      of the shorter type, the result is known.  */
6760   outer_type = TREE_TYPE (arg1_unw);
6761   min = lower_bound_in_type (outer_type, shorter_type);
6762   max = upper_bound_in_type (outer_type, shorter_type);
6763
6764   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6765                                                    max, arg1_unw));
6766   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6767                                                    arg1_unw, min));
6768
6769   switch (code)
6770     {
6771     case EQ_EXPR:
6772       if (above || below)
6773         return omit_one_operand (type, integer_zero_node, arg0);
6774       break;
6775
6776     case NE_EXPR:
6777       if (above || below)
6778         return omit_one_operand (type, integer_one_node, arg0);
6779       break;
6780
6781     case LT_EXPR:
6782     case LE_EXPR:
6783       if (above)
6784         return omit_one_operand (type, integer_one_node, arg0);
6785       else if (below)
6786         return omit_one_operand (type, integer_zero_node, arg0);
6787
6788     case GT_EXPR:
6789     case GE_EXPR:
6790       if (above)
6791         return omit_one_operand (type, integer_zero_node, arg0);
6792       else if (below)
6793         return omit_one_operand (type, integer_one_node, arg0);
6794
6795     default:
6796       break;
6797     }
6798
6799   return NULL_TREE;
6800 }
6801
6802 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6803    ARG0 just the signedness is changed.  */
6804
6805 static tree
6806 fold_sign_changed_comparison (enum tree_code code, tree type,
6807                               tree arg0, tree arg1)
6808 {
6809   tree arg0_inner;
6810   tree inner_type, outer_type;
6811
6812   if (TREE_CODE (arg0) != NOP_EXPR
6813       && TREE_CODE (arg0) != CONVERT_EXPR)
6814     return NULL_TREE;
6815
6816   outer_type = TREE_TYPE (arg0);
6817   arg0_inner = TREE_OPERAND (arg0, 0);
6818   inner_type = TREE_TYPE (arg0_inner);
6819
6820 #ifdef HAVE_canonicalize_funcptr_for_compare
6821   /* Disable this optimization if we're casting a function pointer
6822      type on targets that require function pointer canonicalization.  */
6823   if (HAVE_canonicalize_funcptr_for_compare
6824       && TREE_CODE (inner_type) == POINTER_TYPE
6825       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6826     return NULL_TREE;
6827 #endif
6828
6829   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6830     return NULL_TREE;
6831
6832   if (TREE_CODE (arg1) != INTEGER_CST
6833       && !((TREE_CODE (arg1) == NOP_EXPR
6834             || TREE_CODE (arg1) == CONVERT_EXPR)
6835            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6836     return NULL_TREE;
6837
6838   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6839       && code != NE_EXPR
6840       && code != EQ_EXPR)
6841     return NULL_TREE;
6842
6843   if (TREE_CODE (arg1) == INTEGER_CST)
6844     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6845                                   TREE_INT_CST_HIGH (arg1), 0,
6846                                   TREE_OVERFLOW (arg1));
6847   else
6848     arg1 = fold_convert (inner_type, arg1);
6849
6850   return fold_build2 (code, type, arg0_inner, arg1);
6851 }
6852
6853 /* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6854    step of the array.  Reconstructs s and delta in the case of s * delta
6855    being an integer constant (and thus already folded).
6856    ADDR is the address. MULT is the multiplicative expression.
6857    If the function succeeds, the new address expression is returned.  Otherwise
6858    NULL_TREE is returned.  */
6859
6860 static tree
6861 try_move_mult_to_index (enum tree_code code, tree addr, tree op1)
6862 {
6863   tree s, delta, step;
6864   tree ref = TREE_OPERAND (addr, 0), pref;
6865   tree ret, pos;
6866   tree itype;
6867   bool mdim = false;
6868
6869   /* Canonicalize op1 into a possibly non-constant delta
6870      and an INTEGER_CST s.  */
6871   if (TREE_CODE (op1) == MULT_EXPR)
6872     {
6873       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6874
6875       STRIP_NOPS (arg0);
6876       STRIP_NOPS (arg1);
6877   
6878       if (TREE_CODE (arg0) == INTEGER_CST)
6879         {
6880           s = arg0;
6881           delta = arg1;
6882         }
6883       else if (TREE_CODE (arg1) == INTEGER_CST)
6884         {
6885           s = arg1;
6886           delta = arg0;
6887         }
6888       else
6889         return NULL_TREE;
6890     }
6891   else if (TREE_CODE (op1) == INTEGER_CST)
6892     {
6893       delta = op1;
6894       s = NULL_TREE;
6895     }
6896   else
6897     {
6898       /* Simulate we are delta * 1.  */
6899       delta = op1;
6900       s = integer_one_node;
6901     }
6902
6903   for (;; ref = TREE_OPERAND (ref, 0))
6904     {
6905       if (TREE_CODE (ref) == ARRAY_REF)
6906         {
6907           /* Remember if this was a multi-dimensional array.  */
6908           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6909             mdim = true;
6910
6911           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6912           if (! itype)
6913             continue;
6914
6915           step = array_ref_element_size (ref);
6916           if (TREE_CODE (step) != INTEGER_CST)
6917             continue;
6918
6919           if (s)
6920             {
6921               if (! tree_int_cst_equal (step, s))
6922                 continue;
6923             }
6924           else
6925             {
6926               /* Try if delta is a multiple of step.  */
6927               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6928               if (! tmp)
6929                 continue;
6930               delta = tmp;
6931             }
6932
6933           /* Only fold here if we can verify we do not overflow one
6934              dimension of a multi-dimensional array.  */
6935           if (mdim)
6936             {
6937               tree tmp;
6938
6939               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6940                   || !INTEGRAL_TYPE_P (itype)
6941                   || !TYPE_MAX_VALUE (itype)
6942                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6943                 continue;
6944
6945               tmp = fold_binary (code, itype,
6946                                  fold_convert (itype,
6947                                                TREE_OPERAND (ref, 1)),
6948                                  fold_convert (itype, delta));
6949               if (!tmp
6950                   || TREE_CODE (tmp) != INTEGER_CST
6951                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6952                 continue;
6953             }
6954
6955           break;
6956         }
6957       else
6958         mdim = false;
6959
6960       if (!handled_component_p (ref))
6961         return NULL_TREE;
6962     }
6963
6964   /* We found the suitable array reference.  So copy everything up to it,
6965      and replace the index.  */
6966
6967   pref = TREE_OPERAND (addr, 0);
6968   ret = copy_node (pref);
6969   pos = ret;
6970
6971   while (pref != ref)
6972     {
6973       pref = TREE_OPERAND (pref, 0);
6974       TREE_OPERAND (pos, 0) = copy_node (pref);
6975       pos = TREE_OPERAND (pos, 0);
6976     }
6977
6978   TREE_OPERAND (pos, 1) = fold_build2 (code, itype,
6979                                        fold_convert (itype,
6980                                                      TREE_OPERAND (pos, 1)),
6981                                        fold_convert (itype, delta));
6982
6983   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6984 }
6985
6986
6987 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6988    means A >= Y && A != MAX, but in this case we know that
6989    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6990
6991 static tree
6992 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6993 {
6994   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6995
6996   if (TREE_CODE (bound) == LT_EXPR)
6997     a = TREE_OPERAND (bound, 0);
6998   else if (TREE_CODE (bound) == GT_EXPR)
6999     a = TREE_OPERAND (bound, 1);
7000   else
7001     return NULL_TREE;
7002
7003   typea = TREE_TYPE (a);
7004   if (!INTEGRAL_TYPE_P (typea)
7005       && !POINTER_TYPE_P (typea))
7006     return NULL_TREE;
7007
7008   if (TREE_CODE (ineq) == LT_EXPR)
7009     {
7010       a1 = TREE_OPERAND (ineq, 1);
7011       y = TREE_OPERAND (ineq, 0);
7012     }
7013   else if (TREE_CODE (ineq) == GT_EXPR)
7014     {
7015       a1 = TREE_OPERAND (ineq, 0);
7016       y = TREE_OPERAND (ineq, 1);
7017     }
7018   else
7019     return NULL_TREE;
7020
7021   if (TREE_TYPE (a1) != typea)
7022     return NULL_TREE;
7023
7024   diff = fold_build2 (MINUS_EXPR, typea, a1, a);
7025   if (!integer_onep (diff))
7026     return NULL_TREE;
7027
7028   return fold_build2 (GE_EXPR, type, a, y);
7029 }
7030
7031 /* Fold a sum or difference of at least one multiplication.
7032    Returns the folded tree or NULL if no simplification could be made.  */
7033
7034 static tree
7035 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7036 {
7037   tree arg00, arg01, arg10, arg11;
7038   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7039
7040   /* (A * C) +- (B * C) -> (A+-B) * C.
7041      (A * C) +- A -> A * (C+-1).
7042      We are most concerned about the case where C is a constant,
7043      but other combinations show up during loop reduction.  Since
7044      it is not difficult, try all four possibilities.  */
7045
7046   if (TREE_CODE (arg0) == MULT_EXPR)
7047     {
7048       arg00 = TREE_OPERAND (arg0, 0);
7049       arg01 = TREE_OPERAND (arg0, 1);
7050     }
7051   else
7052     {
7053       arg00 = arg0;
7054       arg01 = build_one_cst (type);
7055     }
7056   if (TREE_CODE (arg1) == MULT_EXPR)
7057     {
7058       arg10 = TREE_OPERAND (arg1, 0);
7059       arg11 = TREE_OPERAND (arg1, 1);
7060     }
7061   else
7062     {
7063       arg10 = arg1;
7064       arg11 = build_one_cst (type);
7065     }
7066   same = NULL_TREE;
7067
7068   if (operand_equal_p (arg01, arg11, 0))
7069     same = arg01, alt0 = arg00, alt1 = arg10;
7070   else if (operand_equal_p (arg00, arg10, 0))
7071     same = arg00, alt0 = arg01, alt1 = arg11;
7072   else if (operand_equal_p (arg00, arg11, 0))
7073     same = arg00, alt0 = arg01, alt1 = arg10;
7074   else if (operand_equal_p (arg01, arg10, 0))
7075     same = arg01, alt0 = arg00, alt1 = arg11;
7076
7077   /* No identical multiplicands; see if we can find a common
7078      power-of-two factor in non-power-of-two multiplies.  This
7079      can help in multi-dimensional array access.  */
7080   else if (host_integerp (arg01, 0)
7081            && host_integerp (arg11, 0))
7082     {
7083       HOST_WIDE_INT int01, int11, tmp;
7084       bool swap = false;
7085       tree maybe_same;
7086       int01 = TREE_INT_CST_LOW (arg01);
7087       int11 = TREE_INT_CST_LOW (arg11);
7088
7089       /* Move min of absolute values to int11.  */
7090       if ((int01 >= 0 ? int01 : -int01)
7091           < (int11 >= 0 ? int11 : -int11))
7092         {
7093           tmp = int01, int01 = int11, int11 = tmp;
7094           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7095           maybe_same = arg01;
7096           swap = true;
7097         }
7098       else
7099         maybe_same = arg11;
7100
7101       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7102         {
7103           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7104                               build_int_cst (TREE_TYPE (arg00),
7105                                              int01 / int11));
7106           alt1 = arg10;
7107           same = maybe_same;
7108           if (swap)
7109             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7110         }
7111     }
7112
7113   if (same)
7114     return fold_build2 (MULT_EXPR, type,
7115                         fold_build2 (code, type,
7116                                      fold_convert (type, alt0),
7117                                      fold_convert (type, alt1)),
7118                         fold_convert (type, same));
7119
7120   return NULL_TREE;
7121 }
7122
7123 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7124    specified by EXPR into the buffer PTR of length LEN bytes.
7125    Return the number of bytes placed in the buffer, or zero
7126    upon failure.  */
7127
7128 static int
7129 native_encode_int (tree expr, unsigned char *ptr, int len)
7130 {
7131   tree type = TREE_TYPE (expr);
7132   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7133   int byte, offset, word, words;
7134   unsigned char value;
7135
7136   if (total_bytes > len)
7137     return 0;
7138   words = total_bytes / UNITS_PER_WORD;
7139
7140   for (byte = 0; byte < total_bytes; byte++)
7141     {
7142       int bitpos = byte * BITS_PER_UNIT;
7143       if (bitpos < HOST_BITS_PER_WIDE_INT)
7144         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7145       else
7146         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7147                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7148
7149       if (total_bytes > UNITS_PER_WORD)
7150         {
7151           word = byte / UNITS_PER_WORD;
7152           if (WORDS_BIG_ENDIAN)
7153             word = (words - 1) - word;
7154           offset = word * UNITS_PER_WORD;
7155           if (BYTES_BIG_ENDIAN)
7156             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7157           else
7158             offset += byte % UNITS_PER_WORD;
7159         }
7160       else
7161         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7162       ptr[offset] = value;
7163     }
7164   return total_bytes;
7165 }
7166
7167
7168 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7169    specified by EXPR into the buffer PTR of length LEN bytes.
7170    Return the number of bytes placed in the buffer, or zero
7171    upon failure.  */
7172
7173 static int
7174 native_encode_real (tree expr, unsigned char *ptr, int len)
7175 {
7176   tree type = TREE_TYPE (expr);
7177   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7178   int byte, offset, word, words, bitpos;
7179   unsigned char value;
7180
7181   /* There are always 32 bits in each long, no matter the size of
7182      the hosts long.  We handle floating point representations with
7183      up to 192 bits.  */
7184   long tmp[6];
7185
7186   if (total_bytes > len)
7187     return 0;
7188   words = 32 / UNITS_PER_WORD;
7189
7190   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7191
7192   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7193        bitpos += BITS_PER_UNIT)
7194     {
7195       byte = (bitpos / BITS_PER_UNIT) & 3;
7196       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7197
7198       if (UNITS_PER_WORD < 4)
7199         {
7200           word = byte / UNITS_PER_WORD;
7201           if (WORDS_BIG_ENDIAN)
7202             word = (words - 1) - word;
7203           offset = word * UNITS_PER_WORD;
7204           if (BYTES_BIG_ENDIAN)
7205             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7206           else
7207             offset += byte % UNITS_PER_WORD;
7208         }
7209       else
7210         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7211       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7212     }
7213   return total_bytes;
7214 }
7215
7216 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7217    specified by EXPR into the buffer PTR of length LEN bytes.
7218    Return the number of bytes placed in the buffer, or zero
7219    upon failure.  */
7220
7221 static int
7222 native_encode_complex (tree expr, unsigned char *ptr, int len)
7223 {
7224   int rsize, isize;
7225   tree part;
7226
7227   part = TREE_REALPART (expr);
7228   rsize = native_encode_expr (part, ptr, len);
7229   if (rsize == 0)
7230     return 0;
7231   part = TREE_IMAGPART (expr);
7232   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7233   if (isize != rsize)
7234     return 0;
7235   return rsize + isize;
7236 }
7237
7238
7239 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7240    specified by EXPR into the buffer PTR of length LEN bytes.
7241    Return the number of bytes placed in the buffer, or zero
7242    upon failure.  */
7243
7244 static int
7245 native_encode_vector (tree expr, unsigned char *ptr, int len)
7246 {
7247   int i, size, offset, count;
7248   tree itype, elem, elements;
7249
7250   offset = 0;
7251   elements = TREE_VECTOR_CST_ELTS (expr);
7252   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7253   itype = TREE_TYPE (TREE_TYPE (expr));
7254   size = GET_MODE_SIZE (TYPE_MODE (itype));
7255   for (i = 0; i < count; i++)
7256     {
7257       if (elements)
7258         {
7259           elem = TREE_VALUE (elements);
7260           elements = TREE_CHAIN (elements);
7261         }
7262       else
7263         elem = NULL_TREE;
7264
7265       if (elem)
7266         {
7267           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7268             return 0;
7269         }
7270       else
7271         {
7272           if (offset + size > len)
7273             return 0;
7274           memset (ptr+offset, 0, size);
7275         }
7276       offset += size;
7277     }
7278   return offset;
7279 }
7280
7281
7282 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7283    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7284    buffer PTR of length LEN bytes.  Return the number of bytes
7285    placed in the buffer, or zero upon failure.  */
7286
7287 int
7288 native_encode_expr (tree expr, unsigned char *ptr, int len)
7289 {
7290   switch (TREE_CODE (expr))
7291     {
7292     case INTEGER_CST:
7293       return native_encode_int (expr, ptr, len);
7294
7295     case REAL_CST:
7296       return native_encode_real (expr, ptr, len);
7297
7298     case COMPLEX_CST:
7299       return native_encode_complex (expr, ptr, len);
7300
7301     case VECTOR_CST:
7302       return native_encode_vector (expr, ptr, len);
7303
7304     default:
7305       return 0;
7306     }
7307 }
7308
7309
7310 /* Subroutine of native_interpret_expr.  Interpret the contents of
7311    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7312    If the buffer cannot be interpreted, return NULL_TREE.  */
7313
7314 static tree
7315 native_interpret_int (tree type, unsigned char *ptr, int len)
7316 {
7317   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7318   int byte, offset, word, words;
7319   unsigned char value;
7320   unsigned int HOST_WIDE_INT lo = 0;
7321   HOST_WIDE_INT hi = 0;
7322
7323   if (total_bytes > len)
7324     return NULL_TREE;
7325   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7326     return NULL_TREE;
7327   words = total_bytes / UNITS_PER_WORD;
7328
7329   for (byte = 0; byte < total_bytes; byte++)
7330     {
7331       int bitpos = byte * BITS_PER_UNIT;
7332       if (total_bytes > UNITS_PER_WORD)
7333         {
7334           word = byte / UNITS_PER_WORD;
7335           if (WORDS_BIG_ENDIAN)
7336             word = (words - 1) - word;
7337           offset = word * UNITS_PER_WORD;
7338           if (BYTES_BIG_ENDIAN)
7339             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7340           else
7341             offset += byte % UNITS_PER_WORD;
7342         }
7343       else
7344         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7345       value = ptr[offset];
7346
7347       if (bitpos < HOST_BITS_PER_WIDE_INT)
7348         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7349       else
7350         hi |= (unsigned HOST_WIDE_INT) value
7351               << (bitpos - HOST_BITS_PER_WIDE_INT);
7352     }
7353
7354   return build_int_cst_wide_type (type, lo, hi);
7355 }
7356
7357
7358 /* Subroutine of native_interpret_expr.  Interpret the contents of
7359    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7360    If the buffer cannot be interpreted, return NULL_TREE.  */
7361
7362 static tree
7363 native_interpret_real (tree type, unsigned char *ptr, int len)
7364 {
7365   enum machine_mode mode = TYPE_MODE (type);
7366   int total_bytes = GET_MODE_SIZE (mode);
7367   int byte, offset, word, words, bitpos;
7368   unsigned char value;
7369   /* There are always 32 bits in each long, no matter the size of
7370      the hosts long.  We handle floating point representations with
7371      up to 192 bits.  */
7372   REAL_VALUE_TYPE r;
7373   long tmp[6];
7374
7375   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7376   if (total_bytes > len || total_bytes > 24)
7377     return NULL_TREE;
7378   words = 32 / UNITS_PER_WORD;
7379
7380   memset (tmp, 0, sizeof (tmp));
7381   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7382        bitpos += BITS_PER_UNIT)
7383     {
7384       byte = (bitpos / BITS_PER_UNIT) & 3;
7385       if (UNITS_PER_WORD < 4)
7386         {
7387           word = byte / UNITS_PER_WORD;
7388           if (WORDS_BIG_ENDIAN)
7389             word = (words - 1) - word;
7390           offset = word * UNITS_PER_WORD;
7391           if (BYTES_BIG_ENDIAN)
7392             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7393           else
7394             offset += byte % UNITS_PER_WORD;
7395         }
7396       else
7397         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7398       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7399
7400       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7401     }
7402
7403   real_from_target (&r, tmp, mode);
7404   return build_real (type, r);
7405 }
7406
7407
7408 /* Subroutine of native_interpret_expr.  Interpret the contents of
7409    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7410    If the buffer cannot be interpreted, return NULL_TREE.  */
7411
7412 static tree
7413 native_interpret_complex (tree type, unsigned char *ptr, int len)
7414 {
7415   tree etype, rpart, ipart;
7416   int size;
7417
7418   etype = TREE_TYPE (type);
7419   size = GET_MODE_SIZE (TYPE_MODE (etype));
7420   if (size * 2 > len)
7421     return NULL_TREE;
7422   rpart = native_interpret_expr (etype, ptr, size);
7423   if (!rpart)
7424     return NULL_TREE;
7425   ipart = native_interpret_expr (etype, ptr+size, size);
7426   if (!ipart)
7427     return NULL_TREE;
7428   return build_complex (type, rpart, ipart);
7429 }
7430
7431
7432 /* Subroutine of native_interpret_expr.  Interpret the contents of
7433    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7434    If the buffer cannot be interpreted, return NULL_TREE.  */
7435
7436 static tree
7437 native_interpret_vector (tree type, unsigned char *ptr, int len)
7438 {
7439   tree etype, elem, elements;
7440   int i, size, count;
7441
7442   etype = TREE_TYPE (type);
7443   size = GET_MODE_SIZE (TYPE_MODE (etype));
7444   count = TYPE_VECTOR_SUBPARTS (type);
7445   if (size * count > len)
7446     return NULL_TREE;
7447
7448   elements = NULL_TREE;
7449   for (i = count - 1; i >= 0; i--)
7450     {
7451       elem = native_interpret_expr (etype, ptr+(i*size), size);
7452       if (!elem)
7453         return NULL_TREE;
7454       elements = tree_cons (NULL_TREE, elem, elements);
7455     }
7456   return build_vector (type, elements);
7457 }
7458
7459
7460 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7461    the buffer PTR of length LEN as a constant of type TYPE.  For
7462    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7463    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7464    return NULL_TREE.  */
7465
7466 tree
7467 native_interpret_expr (tree type, unsigned char *ptr, int len)
7468 {
7469   switch (TREE_CODE (type))
7470     {
7471     case INTEGER_TYPE:
7472     case ENUMERAL_TYPE:
7473     case BOOLEAN_TYPE:
7474       return native_interpret_int (type, ptr, len);
7475
7476     case REAL_TYPE:
7477       return native_interpret_real (type, ptr, len);
7478
7479     case COMPLEX_TYPE:
7480       return native_interpret_complex (type, ptr, len);
7481
7482     case VECTOR_TYPE:
7483       return native_interpret_vector (type, ptr, len);
7484
7485     default:
7486       return NULL_TREE;
7487     }
7488 }
7489
7490
7491 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7492    TYPE at compile-time.  If we're unable to perform the conversion
7493    return NULL_TREE.  */
7494
7495 static tree
7496 fold_view_convert_expr (tree type, tree expr)
7497 {
7498   /* We support up to 512-bit values (for V8DFmode).  */
7499   unsigned char buffer[64];
7500   int len;
7501
7502   /* Check that the host and target are sane.  */
7503   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7504     return NULL_TREE;
7505
7506   len = native_encode_expr (expr, buffer, sizeof (buffer));
7507   if (len == 0)
7508     return NULL_TREE;
7509
7510   return native_interpret_expr (type, buffer, len);
7511 }
7512
7513
7514 /* Fold a unary expression of code CODE and type TYPE with operand
7515    OP0.  Return the folded expression if folding is successful.
7516    Otherwise, return NULL_TREE.  */
7517
7518 tree
7519 fold_unary (enum tree_code code, tree type, tree op0)
7520 {
7521   tree tem;
7522   tree arg0;
7523   enum tree_code_class kind = TREE_CODE_CLASS (code);
7524
7525   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7526               && TREE_CODE_LENGTH (code) == 1);
7527
7528   arg0 = op0;
7529   if (arg0)
7530     {
7531       if (code == NOP_EXPR || code == CONVERT_EXPR
7532           || code == FLOAT_EXPR || code == ABS_EXPR)
7533         {
7534           /* Don't use STRIP_NOPS, because signedness of argument type
7535              matters.  */
7536           STRIP_SIGN_NOPS (arg0);
7537         }
7538       else
7539         {
7540           /* Strip any conversions that don't change the mode.  This
7541              is safe for every expression, except for a comparison
7542              expression because its signedness is derived from its
7543              operands.
7544
7545              Note that this is done as an internal manipulation within
7546              the constant folder, in order to find the simplest
7547              representation of the arguments so that their form can be
7548              studied.  In any cases, the appropriate type conversions
7549              should be put back in the tree that will get out of the
7550              constant folder.  */
7551           STRIP_NOPS (arg0);
7552         }
7553     }
7554
7555   if (TREE_CODE_CLASS (code) == tcc_unary)
7556     {
7557       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7558         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7559                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7560       else if (TREE_CODE (arg0) == COND_EXPR)
7561         {
7562           tree arg01 = TREE_OPERAND (arg0, 1);
7563           tree arg02 = TREE_OPERAND (arg0, 2);
7564           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7565             arg01 = fold_build1 (code, type, arg01);
7566           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7567             arg02 = fold_build1 (code, type, arg02);
7568           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7569                              arg01, arg02);
7570
7571           /* If this was a conversion, and all we did was to move into
7572              inside the COND_EXPR, bring it back out.  But leave it if
7573              it is a conversion from integer to integer and the
7574              result precision is no wider than a word since such a
7575              conversion is cheap and may be optimized away by combine,
7576              while it couldn't if it were outside the COND_EXPR.  Then return
7577              so we don't get into an infinite recursion loop taking the
7578              conversion out and then back in.  */
7579
7580           if ((code == NOP_EXPR || code == CONVERT_EXPR
7581                || code == NON_LVALUE_EXPR)
7582               && TREE_CODE (tem) == COND_EXPR
7583               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7584               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7585               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7586               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7587               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7588                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7589               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7590                      && (INTEGRAL_TYPE_P
7591                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7592                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7593                   || flag_syntax_only))
7594             tem = build1 (code, type,
7595                           build3 (COND_EXPR,
7596                                   TREE_TYPE (TREE_OPERAND
7597                                              (TREE_OPERAND (tem, 1), 0)),
7598                                   TREE_OPERAND (tem, 0),
7599                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7600                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7601           return tem;
7602         }
7603       else if (COMPARISON_CLASS_P (arg0))
7604         {
7605           if (TREE_CODE (type) == BOOLEAN_TYPE)
7606             {
7607               arg0 = copy_node (arg0);
7608               TREE_TYPE (arg0) = type;
7609               return arg0;
7610             }
7611           else if (TREE_CODE (type) != INTEGER_TYPE)
7612             return fold_build3 (COND_EXPR, type, arg0,
7613                                 fold_build1 (code, type,
7614                                              integer_one_node),
7615                                 fold_build1 (code, type,
7616                                              integer_zero_node));
7617         }
7618    }
7619
7620   switch (code)
7621     {
7622     case NOP_EXPR:
7623     case FLOAT_EXPR:
7624     case CONVERT_EXPR:
7625     case FIX_TRUNC_EXPR:
7626       if (TREE_TYPE (op0) == type)
7627         return op0;
7628       
7629       /* If we have (type) (a CMP b) and type is an integral type, return
7630          new expression involving the new type.  */
7631       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7632         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7633                             TREE_OPERAND (op0, 1));
7634
7635       /* Handle cases of two conversions in a row.  */
7636       if (TREE_CODE (op0) == NOP_EXPR
7637           || TREE_CODE (op0) == CONVERT_EXPR)
7638         {
7639           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7640           tree inter_type = TREE_TYPE (op0);
7641           int inside_int = INTEGRAL_TYPE_P (inside_type);
7642           int inside_ptr = POINTER_TYPE_P (inside_type);
7643           int inside_float = FLOAT_TYPE_P (inside_type);
7644           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7645           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7646           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7647           int inter_int = INTEGRAL_TYPE_P (inter_type);
7648           int inter_ptr = POINTER_TYPE_P (inter_type);
7649           int inter_float = FLOAT_TYPE_P (inter_type);
7650           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7651           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7652           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7653           int final_int = INTEGRAL_TYPE_P (type);
7654           int final_ptr = POINTER_TYPE_P (type);
7655           int final_float = FLOAT_TYPE_P (type);
7656           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7657           unsigned int final_prec = TYPE_PRECISION (type);
7658           int final_unsignedp = TYPE_UNSIGNED (type);
7659
7660           /* In addition to the cases of two conversions in a row
7661              handled below, if we are converting something to its own
7662              type via an object of identical or wider precision, neither
7663              conversion is needed.  */
7664           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7665               && (((inter_int || inter_ptr) && final_int)
7666                   || (inter_float && final_float))
7667               && inter_prec >= final_prec)
7668             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7669
7670           /* Likewise, if the intermediate and final types are either both
7671              float or both integer, we don't need the middle conversion if
7672              it is wider than the final type and doesn't change the signedness
7673              (for integers).  Avoid this if the final type is a pointer
7674              since then we sometimes need the inner conversion.  Likewise if
7675              the outer has a precision not equal to the size of its mode.  */
7676           if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
7677                || (inter_float && inside_float)
7678                || (inter_vec && inside_vec))
7679               && inter_prec >= inside_prec
7680               && (inter_float || inter_vec
7681                   || inter_unsignedp == inside_unsignedp)
7682               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7683                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7684               && ! final_ptr
7685               && (! final_vec || inter_prec == inside_prec))
7686             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7687
7688           /* If we have a sign-extension of a zero-extended value, we can
7689              replace that by a single zero-extension.  */
7690           if (inside_int && inter_int && final_int
7691               && inside_prec < inter_prec && inter_prec < final_prec
7692               && inside_unsignedp && !inter_unsignedp)
7693             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7694
7695           /* Two conversions in a row are not needed unless:
7696              - some conversion is floating-point (overstrict for now), or
7697              - some conversion is a vector (overstrict for now), or
7698              - the intermediate type is narrower than both initial and
7699                final, or
7700              - the intermediate type and innermost type differ in signedness,
7701                and the outermost type is wider than the intermediate, or
7702              - the initial type is a pointer type and the precisions of the
7703                intermediate and final types differ, or
7704              - the final type is a pointer type and the precisions of the
7705                initial and intermediate types differ.
7706              - the final type is a pointer type and the initial type not
7707              - the initial type is a pointer to an array and the final type
7708                not.  */
7709           if (! inside_float && ! inter_float && ! final_float
7710               && ! inside_vec && ! inter_vec && ! final_vec
7711               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7712               && ! (inside_int && inter_int
7713                     && inter_unsignedp != inside_unsignedp
7714                     && inter_prec < final_prec)
7715               && ((inter_unsignedp && inter_prec > inside_prec)
7716                   == (final_unsignedp && final_prec > inter_prec))
7717               && ! (inside_ptr && inter_prec != final_prec)
7718               && ! (final_ptr && inside_prec != inter_prec)
7719               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7720                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7721               && final_ptr == inside_ptr
7722               && ! (inside_ptr
7723                     && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
7724                     && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
7725             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7726         }
7727
7728       /* Handle (T *)&A.B.C for A being of type T and B and C
7729          living at offset zero.  This occurs frequently in
7730          C++ upcasting and then accessing the base.  */
7731       if (TREE_CODE (op0) == ADDR_EXPR
7732           && POINTER_TYPE_P (type)
7733           && handled_component_p (TREE_OPERAND (op0, 0)))
7734         {
7735           HOST_WIDE_INT bitsize, bitpos;
7736           tree offset;
7737           enum machine_mode mode;
7738           int unsignedp, volatilep;
7739           tree base = TREE_OPERAND (op0, 0);
7740           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7741                                       &mode, &unsignedp, &volatilep, false);
7742           /* If the reference was to a (constant) zero offset, we can use
7743              the address of the base if it has the same base type
7744              as the result type.  */
7745           if (! offset && bitpos == 0
7746               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7747                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7748             return fold_convert (type, build_fold_addr_expr (base));
7749         }
7750
7751       /* Convert (type *)&A into &A->field_of_type_and_offset_0.  */
7752       if (TREE_CODE (op0) == ADDR_EXPR && POINTER_TYPE_P (type)
7753           && (tem = maybe_fold_offset_to_component_ref
7754                       (TREE_TYPE (TREE_OPERAND (op0, 0)), TREE_OPERAND (op0, 0),
7755                        integer_zero_node, TREE_TYPE (type), false)))
7756         return build_fold_addr_expr_with_type (tem, type);
7757
7758       if ((TREE_CODE (op0) == MODIFY_EXPR
7759            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7760           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7761           /* Detect assigning a bitfield.  */
7762           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7763                && DECL_BIT_FIELD
7764                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7765         {
7766           /* Don't leave an assignment inside a conversion
7767              unless assigning a bitfield.  */
7768           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7769           /* First do the assignment, then return converted constant.  */
7770           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7771           TREE_NO_WARNING (tem) = 1;
7772           TREE_USED (tem) = 1;
7773           return tem;
7774         }
7775
7776       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7777          constants (if x has signed type, the sign bit cannot be set
7778          in c).  This folds extension into the BIT_AND_EXPR.  */
7779       if (INTEGRAL_TYPE_P (type)
7780           && TREE_CODE (type) != BOOLEAN_TYPE
7781           && TREE_CODE (op0) == BIT_AND_EXPR
7782           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7783         {
7784           tree and = op0;
7785           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7786           int change = 0;
7787
7788           if (TYPE_UNSIGNED (TREE_TYPE (and))
7789               || (TYPE_PRECISION (type)
7790                   <= TYPE_PRECISION (TREE_TYPE (and))))
7791             change = 1;
7792           else if (TYPE_PRECISION (TREE_TYPE (and1))
7793                    <= HOST_BITS_PER_WIDE_INT
7794                    && host_integerp (and1, 1))
7795             {
7796               unsigned HOST_WIDE_INT cst;
7797
7798               cst = tree_low_cst (and1, 1);
7799               cst &= (HOST_WIDE_INT) -1
7800                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7801               change = (cst == 0);
7802 #ifdef LOAD_EXTEND_OP
7803               if (change
7804                   && !flag_syntax_only
7805                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7806                       == ZERO_EXTEND))
7807                 {
7808                   tree uns = lang_hooks.types.unsigned_type (TREE_TYPE (and0));
7809                   and0 = fold_convert (uns, and0);
7810                   and1 = fold_convert (uns, and1);
7811                 }
7812 #endif
7813             }
7814           if (change)
7815             {
7816               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7817                                            TREE_INT_CST_HIGH (and1), 0,
7818                                            TREE_OVERFLOW (and1));
7819               return fold_build2 (BIT_AND_EXPR, type,
7820                                   fold_convert (type, and0), tem);
7821             }
7822         }
7823
7824       /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
7825          T2 being pointers to types of the same size.  */
7826       if (POINTER_TYPE_P (type)
7827           && BINARY_CLASS_P (arg0)
7828           && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7829           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
7830         {
7831           tree arg00 = TREE_OPERAND (arg0, 0);
7832           tree t0 = type;
7833           tree t1 = TREE_TYPE (arg00);
7834           tree tt0 = TREE_TYPE (t0);
7835           tree tt1 = TREE_TYPE (t1);
7836           tree s0 = TYPE_SIZE (tt0);
7837           tree s1 = TYPE_SIZE (tt1);
7838
7839           if (s0 && s1 && operand_equal_p (s0, s1, OEP_ONLY_CONST))
7840             return build2 (TREE_CODE (arg0), t0, fold_convert (t0, arg00),
7841                            TREE_OPERAND (arg0, 1));
7842         }
7843
7844       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7845          of the same precision, and X is a integer type not narrower than
7846          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7847       if (INTEGRAL_TYPE_P (type)
7848           && TREE_CODE (op0) == BIT_NOT_EXPR
7849           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7850           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7851               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7852           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7853         {
7854           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7855           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7856               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7857             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7858         }
7859
7860       tem = fold_convert_const (code, type, op0);
7861       return tem ? tem : NULL_TREE;
7862
7863     case VIEW_CONVERT_EXPR:
7864       if (TREE_TYPE (op0) == type)
7865         return op0;
7866       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7867         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7868       return fold_view_convert_expr (type, op0);
7869
7870     case NEGATE_EXPR:
7871       tem = fold_negate_expr (arg0);
7872       if (tem)
7873         return fold_convert (type, tem);
7874       return NULL_TREE;
7875
7876     case ABS_EXPR:
7877       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7878         return fold_abs_const (arg0, type);
7879       else if (TREE_CODE (arg0) == NEGATE_EXPR)
7880         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7881       /* Convert fabs((double)float) into (double)fabsf(float).  */
7882       else if (TREE_CODE (arg0) == NOP_EXPR
7883                && TREE_CODE (type) == REAL_TYPE)
7884         {
7885           tree targ0 = strip_float_extensions (arg0);
7886           if (targ0 != arg0)
7887             return fold_convert (type, fold_build1 (ABS_EXPR,
7888                                                     TREE_TYPE (targ0),
7889                                                     targ0));
7890         }
7891       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
7892       else if (TREE_CODE (arg0) == ABS_EXPR)
7893         return arg0;
7894       else if (tree_expr_nonnegative_p (arg0))
7895         return arg0;
7896
7897       /* Strip sign ops from argument.  */
7898       if (TREE_CODE (type) == REAL_TYPE)
7899         {
7900           tem = fold_strip_sign_ops (arg0);
7901           if (tem)
7902             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7903         }
7904       return NULL_TREE;
7905
7906     case CONJ_EXPR:
7907       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7908         return fold_convert (type, arg0);
7909       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7910         {
7911           tree itype = TREE_TYPE (type);
7912           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
7913           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
7914           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
7915         }
7916       if (TREE_CODE (arg0) == COMPLEX_CST)
7917         {
7918           tree itype = TREE_TYPE (type);
7919           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
7920           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
7921           return build_complex (type, rpart, negate_expr (ipart));
7922         }
7923       if (TREE_CODE (arg0) == CONJ_EXPR)
7924         return fold_convert (type, TREE_OPERAND (arg0, 0));
7925       return NULL_TREE;
7926
7927     case BIT_NOT_EXPR:
7928       if (TREE_CODE (arg0) == INTEGER_CST)
7929         return fold_not_const (arg0, type);
7930       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7931         return TREE_OPERAND (arg0, 0);
7932       /* Convert ~ (-A) to A - 1.  */
7933       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7934         return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7935                             build_int_cst (type, 1));
7936       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
7937       else if (INTEGRAL_TYPE_P (type)
7938                && ((TREE_CODE (arg0) == MINUS_EXPR
7939                     && integer_onep (TREE_OPERAND (arg0, 1)))
7940                    || (TREE_CODE (arg0) == PLUS_EXPR
7941                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7942         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7943       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
7944       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7945                && (tem = fold_unary (BIT_NOT_EXPR, type,
7946                                      fold_convert (type,
7947                                                    TREE_OPERAND (arg0, 0)))))
7948         return fold_build2 (BIT_XOR_EXPR, type, tem,
7949                             fold_convert (type, TREE_OPERAND (arg0, 1)));
7950       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7951                && (tem = fold_unary (BIT_NOT_EXPR, type,
7952                                      fold_convert (type,
7953                                                    TREE_OPERAND (arg0, 1)))))
7954         return fold_build2 (BIT_XOR_EXPR, type,
7955                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
7956
7957       return NULL_TREE;
7958
7959     case TRUTH_NOT_EXPR:
7960       /* The argument to invert_truthvalue must have Boolean type.  */
7961       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7962           arg0 = fold_convert (boolean_type_node, arg0);
7963
7964       /* Note that the operand of this must be an int
7965          and its values must be 0 or 1.
7966          ("true" is a fixed value perhaps depending on the language,
7967          but we don't handle values other than 1 correctly yet.)  */
7968       tem = fold_truth_not_expr (arg0);
7969       if (!tem)
7970         return NULL_TREE;
7971       return fold_convert (type, tem);
7972
7973     case REALPART_EXPR:
7974       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7975         return fold_convert (type, arg0);
7976       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7977         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7978                                  TREE_OPERAND (arg0, 1));
7979       if (TREE_CODE (arg0) == COMPLEX_CST)
7980         return fold_convert (type, TREE_REALPART (arg0));
7981       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7982         {
7983           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7984           tem = fold_build2 (TREE_CODE (arg0), itype,
7985                              fold_build1 (REALPART_EXPR, itype,
7986                                           TREE_OPERAND (arg0, 0)),
7987                              fold_build1 (REALPART_EXPR, itype,
7988                                           TREE_OPERAND (arg0, 1)));
7989           return fold_convert (type, tem);
7990         }
7991       if (TREE_CODE (arg0) == CONJ_EXPR)
7992         {
7993           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7994           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
7995           return fold_convert (type, tem);
7996         }
7997       if (TREE_CODE (arg0) == CALL_EXPR)
7998         {
7999           tree fn = get_callee_fndecl (arg0);
8000           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8001             switch (DECL_FUNCTION_CODE (fn))
8002               {
8003               CASE_FLT_FN (BUILT_IN_CEXPI):
8004                 fn = mathfn_built_in (type, BUILT_IN_COS);
8005                 if (fn)
8006                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8007                 break;
8008
8009               default:
8010                 break;
8011               }
8012         }
8013       return NULL_TREE;
8014
8015     case IMAGPART_EXPR:
8016       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8017         return fold_convert (type, integer_zero_node);
8018       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8019         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8020                                  TREE_OPERAND (arg0, 0));
8021       if (TREE_CODE (arg0) == COMPLEX_CST)
8022         return fold_convert (type, TREE_IMAGPART (arg0));
8023       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8024         {
8025           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8026           tem = fold_build2 (TREE_CODE (arg0), itype,
8027                              fold_build1 (IMAGPART_EXPR, itype,
8028                                           TREE_OPERAND (arg0, 0)),
8029                              fold_build1 (IMAGPART_EXPR, itype,
8030                                           TREE_OPERAND (arg0, 1)));
8031           return fold_convert (type, tem);
8032         }
8033       if (TREE_CODE (arg0) == CONJ_EXPR)
8034         {
8035           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8036           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8037           return fold_convert (type, negate_expr (tem));
8038         }
8039       if (TREE_CODE (arg0) == CALL_EXPR)
8040         {
8041           tree fn = get_callee_fndecl (arg0);
8042           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8043             switch (DECL_FUNCTION_CODE (fn))
8044               {
8045               CASE_FLT_FN (BUILT_IN_CEXPI):
8046                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8047                 if (fn)
8048                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8049                 break;
8050
8051               default:
8052                 break;
8053               }
8054         }
8055       return NULL_TREE;
8056
8057     default:
8058       return NULL_TREE;
8059     } /* switch (code) */
8060 }
8061
8062 /* Fold a binary expression of code CODE and type TYPE with operands
8063    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8064    Return the folded expression if folding is successful.  Otherwise,
8065    return NULL_TREE.  */
8066
8067 static tree
8068 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8069 {
8070   enum tree_code compl_code;
8071
8072   if (code == MIN_EXPR)
8073     compl_code = MAX_EXPR;
8074   else if (code == MAX_EXPR)
8075     compl_code = MIN_EXPR;
8076   else
8077     gcc_unreachable ();
8078
8079   /* MIN (MAX (a, b), b) == b.  */
8080   if (TREE_CODE (op0) == compl_code
8081       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8082     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8083
8084   /* MIN (MAX (b, a), b) == b.  */
8085   if (TREE_CODE (op0) == compl_code
8086       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8087       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8088     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8089
8090   /* MIN (a, MAX (a, b)) == a.  */
8091   if (TREE_CODE (op1) == compl_code
8092       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8093       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8094     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8095
8096   /* MIN (a, MAX (b, a)) == a.  */
8097   if (TREE_CODE (op1) == compl_code
8098       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8099       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8100     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8101
8102   return NULL_TREE;
8103 }
8104
8105 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8106    by changing CODE to reduce the magnitude of constants involved in
8107    ARG0 of the comparison.
8108    Returns a canonicalized comparison tree if a simplification was
8109    possible, otherwise returns NULL_TREE.
8110    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8111    valid if signed overflow is undefined.  */
8112
8113 static tree
8114 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8115                                  tree arg0, tree arg1,
8116                                  bool *strict_overflow_p)
8117 {
8118   enum tree_code code0 = TREE_CODE (arg0);
8119   tree t, cst0 = NULL_TREE;
8120   int sgn0;
8121   bool swap = false;
8122
8123   /* Match A +- CST code arg1 and CST code arg1.  */
8124   if (!(((code0 == MINUS_EXPR
8125           || code0 == PLUS_EXPR)
8126          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8127         || code0 == INTEGER_CST))
8128     return NULL_TREE;
8129
8130   /* Identify the constant in arg0 and its sign.  */
8131   if (code0 == INTEGER_CST)
8132     cst0 = arg0;
8133   else
8134     cst0 = TREE_OPERAND (arg0, 1);
8135   sgn0 = tree_int_cst_sgn (cst0);
8136
8137   /* Overflowed constants and zero will cause problems.  */
8138   if (integer_zerop (cst0)
8139       || TREE_OVERFLOW (cst0))
8140     return NULL_TREE;
8141
8142   /* See if we can reduce the magnitude of the constant in
8143      arg0 by changing the comparison code.  */
8144   if (code0 == INTEGER_CST)
8145     {
8146       /* CST <= arg1  ->  CST-1 < arg1.  */
8147       if (code == LE_EXPR && sgn0 == 1)
8148         code = LT_EXPR;
8149       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8150       else if (code == LT_EXPR && sgn0 == -1)
8151         code = LE_EXPR;
8152       /* CST > arg1  ->  CST-1 >= arg1.  */
8153       else if (code == GT_EXPR && sgn0 == 1)
8154         code = GE_EXPR;
8155       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8156       else if (code == GE_EXPR && sgn0 == -1)
8157         code = GT_EXPR;
8158       else
8159         return NULL_TREE;
8160       /* arg1 code' CST' might be more canonical.  */
8161       swap = true;
8162     }
8163   else
8164     {
8165       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8166       if (code == LT_EXPR
8167           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8168         code = LE_EXPR;
8169       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8170       else if (code == GT_EXPR
8171                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8172         code = GE_EXPR;
8173       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8174       else if (code == LE_EXPR
8175                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8176         code = LT_EXPR;
8177       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8178       else if (code == GE_EXPR
8179                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8180         code = GT_EXPR;
8181       else
8182         return NULL_TREE;
8183       *strict_overflow_p = true;
8184     }
8185
8186   /* Now build the constant reduced in magnitude.  */
8187   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8188                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8189   if (code0 != INTEGER_CST)
8190     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8191
8192   /* If swapping might yield to a more canonical form, do so.  */
8193   if (swap)
8194     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8195   else
8196     return fold_build2 (code, type, t, arg1);
8197 }
8198
8199 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8200    overflow further.  Try to decrease the magnitude of constants involved
8201    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8202    and put sole constants at the second argument position.
8203    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8204
8205 static tree
8206 maybe_canonicalize_comparison (enum tree_code code, tree type,
8207                                tree arg0, tree arg1)
8208 {
8209   tree t;
8210   bool strict_overflow_p;
8211   const char * const warnmsg = G_("assuming signed overflow does not occur "
8212                                   "when reducing constant in comparison");
8213
8214   /* In principle pointers also have undefined overflow behavior,
8215      but that causes problems elsewhere.  */
8216   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8217       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8218     return NULL_TREE;
8219
8220   /* Try canonicalization by simplifying arg0.  */
8221   strict_overflow_p = false;
8222   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8223                                        &strict_overflow_p);
8224   if (t)
8225     {
8226       if (strict_overflow_p)
8227         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8228       return t;
8229     }
8230
8231   /* Try canonicalization by simplifying arg1 using the swapped
8232      comparison.  */
8233   code = swap_tree_comparison (code);
8234   strict_overflow_p = false;
8235   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8236                                        &strict_overflow_p);
8237   if (t && strict_overflow_p)
8238     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8239   return t;
8240 }
8241
8242 /* Subroutine of fold_binary.  This routine performs all of the
8243    transformations that are common to the equality/inequality
8244    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8245    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8246    fold_binary should call fold_binary.  Fold a comparison with
8247    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8248    the folded comparison or NULL_TREE.  */
8249
8250 static tree
8251 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8252 {
8253   tree arg0, arg1, tem;
8254
8255   arg0 = op0;
8256   arg1 = op1;
8257
8258   STRIP_SIGN_NOPS (arg0);
8259   STRIP_SIGN_NOPS (arg1);
8260
8261   tem = fold_relational_const (code, type, arg0, arg1);
8262   if (tem != NULL_TREE)
8263     return tem;
8264
8265   /* If one arg is a real or integer constant, put it last.  */
8266   if (tree_swap_operands_p (arg0, arg1, true))
8267     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8268
8269   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8270   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8271       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8272           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8273           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8274       && (TREE_CODE (arg1) == INTEGER_CST
8275           && !TREE_OVERFLOW (arg1)))
8276     {
8277       tree const1 = TREE_OPERAND (arg0, 1);
8278       tree const2 = arg1;
8279       tree variable = TREE_OPERAND (arg0, 0);
8280       tree lhs;
8281       int lhs_add;
8282       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8283
8284       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8285                          TREE_TYPE (arg1), const2, const1);
8286
8287       /* If the constant operation overflowed this can be
8288          simplified as a comparison against INT_MAX/INT_MIN.  */
8289       if (TREE_CODE (lhs) == INTEGER_CST
8290           && TREE_OVERFLOW (lhs))
8291         {
8292           int const1_sgn = tree_int_cst_sgn (const1);
8293           enum tree_code code2 = code;
8294
8295           /* Get the sign of the constant on the lhs if the
8296              operation were VARIABLE + CONST1.  */
8297           if (TREE_CODE (arg0) == MINUS_EXPR)
8298             const1_sgn = -const1_sgn;
8299
8300           /* The sign of the constant determines if we overflowed
8301              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8302              Canonicalize to the INT_MIN overflow by swapping the comparison
8303              if necessary.  */
8304           if (const1_sgn == -1)
8305             code2 = swap_tree_comparison (code);
8306
8307           /* We now can look at the canonicalized case
8308                VARIABLE + 1  CODE2  INT_MIN
8309              and decide on the result.  */
8310           if (code2 == LT_EXPR
8311               || code2 == LE_EXPR
8312               || code2 == EQ_EXPR)
8313             return omit_one_operand (type, boolean_false_node, variable);
8314           else if (code2 == NE_EXPR
8315                    || code2 == GE_EXPR
8316                    || code2 == GT_EXPR)
8317             return omit_one_operand (type, boolean_true_node, variable);
8318         }
8319
8320       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8321           && (TREE_CODE (lhs) != INTEGER_CST
8322               || !TREE_OVERFLOW (lhs)))
8323         {
8324           fold_overflow_warning (("assuming signed overflow does not occur "
8325                                   "when changing X +- C1 cmp C2 to "
8326                                   "X cmp C1 +- C2"),
8327                                  WARN_STRICT_OVERFLOW_COMPARISON);
8328           return fold_build2 (code, type, variable, lhs);
8329         }
8330     }
8331
8332   /* For comparisons of pointers we can decompose it to a compile time
8333      comparison of the base objects and the offsets into the object.
8334      This requires at least one operand being an ADDR_EXPR to do more
8335      than the operand_equal_p test below.  */
8336   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8337       && (TREE_CODE (arg0) == ADDR_EXPR
8338           || TREE_CODE (arg1) == ADDR_EXPR))
8339     {
8340       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8341       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8342       enum machine_mode mode;
8343       int volatilep, unsignedp;
8344       bool indirect_base0 = false;
8345
8346       /* Get base and offset for the access.  Strip ADDR_EXPR for
8347          get_inner_reference, but put it back by stripping INDIRECT_REF
8348          off the base object if possible.  */
8349       base0 = arg0;
8350       if (TREE_CODE (arg0) == ADDR_EXPR)
8351         {
8352           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8353                                        &bitsize, &bitpos0, &offset0, &mode,
8354                                        &unsignedp, &volatilep, false);
8355           if (TREE_CODE (base0) == INDIRECT_REF)
8356             base0 = TREE_OPERAND (base0, 0);
8357           else
8358             indirect_base0 = true;
8359         }
8360
8361       base1 = arg1;
8362       if (TREE_CODE (arg1) == ADDR_EXPR)
8363         {
8364           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8365                                        &bitsize, &bitpos1, &offset1, &mode,
8366                                        &unsignedp, &volatilep, false);
8367           /* We have to make sure to have an indirect/non-indirect base1
8368              just the same as we did for base0.  */
8369           if (TREE_CODE (base1) == INDIRECT_REF
8370               && !indirect_base0)
8371             base1 = TREE_OPERAND (base1, 0);
8372           else if (!indirect_base0)
8373             base1 = NULL_TREE;
8374         }
8375       else if (indirect_base0)
8376         base1 = NULL_TREE;
8377
8378       /* If we have equivalent bases we might be able to simplify.  */
8379       if (base0 && base1
8380           && operand_equal_p (base0, base1, 0))
8381         {
8382           /* We can fold this expression to a constant if the non-constant
8383              offset parts are equal.  */
8384           if (offset0 == offset1
8385               || (offset0 && offset1
8386                   && operand_equal_p (offset0, offset1, 0)))
8387             {
8388               switch (code)
8389                 {
8390                 case EQ_EXPR:
8391                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8392                 case NE_EXPR:
8393                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8394                 case LT_EXPR:
8395                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8396                 case LE_EXPR:
8397                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8398                 case GE_EXPR:
8399                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8400                 case GT_EXPR:
8401                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8402                 default:;
8403                 }
8404             }
8405           /* We can simplify the comparison to a comparison of the variable
8406              offset parts if the constant offset parts are equal.
8407              Be careful to use signed size type here because otherwise we
8408              mess with array offsets in the wrong way.  This is possible
8409              because pointer arithmetic is restricted to retain within an
8410              object and overflow on pointer differences is undefined as of
8411              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8412           else if (bitpos0 == bitpos1)
8413             {
8414               tree signed_size_type_node;
8415               signed_size_type_node = signed_type_for (size_type_node);
8416
8417               /* By converting to signed size type we cover middle-end pointer
8418                  arithmetic which operates on unsigned pointer types of size
8419                  type size and ARRAY_REF offsets which are properly sign or
8420                  zero extended from their type in case it is narrower than
8421                  size type.  */
8422               if (offset0 == NULL_TREE)
8423                 offset0 = build_int_cst (signed_size_type_node, 0);
8424               else
8425                 offset0 = fold_convert (signed_size_type_node, offset0);
8426               if (offset1 == NULL_TREE)
8427                 offset1 = build_int_cst (signed_size_type_node, 0);
8428               else
8429                 offset1 = fold_convert (signed_size_type_node, offset1);
8430
8431               return fold_build2 (code, type, offset0, offset1);
8432             }
8433         }
8434     }
8435
8436   /* If this is a comparison of two exprs that look like an ARRAY_REF of the
8437      same object, then we can fold this to a comparison of the two offsets in
8438      signed size type.  This is possible because pointer arithmetic is
8439      restricted to retain within an object and overflow on pointer differences
8440      is undefined as of 6.5.6/8 and /9 with respect to the signed ptrdiff_t.
8441
8442      We check flag_wrapv directly because pointers types are unsigned,
8443      and therefore TYPE_OVERFLOW_WRAPS returns true for them.  That is
8444      normally what we want to avoid certain odd overflow cases, but
8445      not here.  */
8446   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8447       && !flag_wrapv
8448       && !TYPE_OVERFLOW_TRAPS (TREE_TYPE (arg0)))
8449     {
8450       tree base0, offset0, base1, offset1;
8451
8452       if (extract_array_ref (arg0, &base0, &offset0)
8453           && extract_array_ref (arg1, &base1, &offset1)
8454           && operand_equal_p (base0, base1, 0))
8455         {
8456           tree signed_size_type_node;
8457           signed_size_type_node = signed_type_for (size_type_node);
8458
8459           /* By converting to signed size type we cover middle-end pointer
8460              arithmetic which operates on unsigned pointer types of size
8461              type size and ARRAY_REF offsets which are properly sign or
8462              zero extended from their type in case it is narrower than
8463              size type.  */
8464           if (offset0 == NULL_TREE)
8465             offset0 = build_int_cst (signed_size_type_node, 0);
8466           else
8467             offset0 = fold_convert (signed_size_type_node, offset0);
8468           if (offset1 == NULL_TREE)
8469             offset1 = build_int_cst (signed_size_type_node, 0);
8470           else
8471             offset1 = fold_convert (signed_size_type_node, offset1);
8472
8473           return fold_build2 (code, type, offset0, offset1);
8474         }
8475     }
8476
8477   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8478      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8479      the resulting offset is smaller in absolute value than the
8480      original one.  */
8481   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8482       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8483       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8484           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8485       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8486       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8487           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8488     {
8489       tree const1 = TREE_OPERAND (arg0, 1);
8490       tree const2 = TREE_OPERAND (arg1, 1);
8491       tree variable1 = TREE_OPERAND (arg0, 0);
8492       tree variable2 = TREE_OPERAND (arg1, 0);
8493       tree cst;
8494       const char * const warnmsg = G_("assuming signed overflow does not "
8495                                       "occur when combining constants around "
8496                                       "a comparison");
8497
8498       /* Put the constant on the side where it doesn't overflow and is
8499          of lower absolute value than before.  */
8500       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8501                              ? MINUS_EXPR : PLUS_EXPR,
8502                              const2, const1, 0);
8503       if (!TREE_OVERFLOW (cst)
8504           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8505         {
8506           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8507           return fold_build2 (code, type,
8508                               variable1,
8509                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8510                                            variable2, cst));
8511         }
8512
8513       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8514                              ? MINUS_EXPR : PLUS_EXPR,
8515                              const1, const2, 0);
8516       if (!TREE_OVERFLOW (cst)
8517           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8518         {
8519           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8520           return fold_build2 (code, type,
8521                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8522                                            variable1, cst),
8523                               variable2);
8524         }
8525     }
8526
8527   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8528      signed arithmetic case.  That form is created by the compiler
8529      often enough for folding it to be of value.  One example is in
8530      computing loop trip counts after Operator Strength Reduction.  */
8531   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8532       && TREE_CODE (arg0) == MULT_EXPR
8533       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8534           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8535       && integer_zerop (arg1))
8536     {
8537       tree const1 = TREE_OPERAND (arg0, 1);
8538       tree const2 = arg1;                       /* zero */
8539       tree variable1 = TREE_OPERAND (arg0, 0);
8540       enum tree_code cmp_code = code;
8541
8542       gcc_assert (!integer_zerop (const1));
8543
8544       fold_overflow_warning (("assuming signed overflow does not occur when "
8545                               "eliminating multiplication in comparison "
8546                               "with zero"),
8547                              WARN_STRICT_OVERFLOW_COMPARISON);
8548
8549       /* If const1 is negative we swap the sense of the comparison.  */
8550       if (tree_int_cst_sgn (const1) < 0)
8551         cmp_code = swap_tree_comparison (cmp_code);
8552
8553       return fold_build2 (cmp_code, type, variable1, const2);
8554     }
8555
8556   tem = maybe_canonicalize_comparison (code, type, arg0, arg1);
8557   if (tem)
8558     return tem;
8559
8560   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8561     {
8562       tree targ0 = strip_float_extensions (arg0);
8563       tree targ1 = strip_float_extensions (arg1);
8564       tree newtype = TREE_TYPE (targ0);
8565
8566       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8567         newtype = TREE_TYPE (targ1);
8568
8569       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8570       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8571         return fold_build2 (code, type, fold_convert (newtype, targ0),
8572                             fold_convert (newtype, targ1));
8573
8574       /* (-a) CMP (-b) -> b CMP a  */
8575       if (TREE_CODE (arg0) == NEGATE_EXPR
8576           && TREE_CODE (arg1) == NEGATE_EXPR)
8577         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8578                             TREE_OPERAND (arg0, 0));
8579
8580       if (TREE_CODE (arg1) == REAL_CST)
8581         {
8582           REAL_VALUE_TYPE cst;
8583           cst = TREE_REAL_CST (arg1);
8584
8585           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8586           if (TREE_CODE (arg0) == NEGATE_EXPR)
8587             return fold_build2 (swap_tree_comparison (code), type,
8588                                 TREE_OPERAND (arg0, 0),
8589                                 build_real (TREE_TYPE (arg1),
8590                                             REAL_VALUE_NEGATE (cst)));
8591
8592           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8593           /* a CMP (-0) -> a CMP 0  */
8594           if (REAL_VALUE_MINUS_ZERO (cst))
8595             return fold_build2 (code, type, arg0,
8596                                 build_real (TREE_TYPE (arg1), dconst0));
8597
8598           /* x != NaN is always true, other ops are always false.  */
8599           if (REAL_VALUE_ISNAN (cst)
8600               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8601             {
8602               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8603               return omit_one_operand (type, tem, arg0);
8604             }
8605
8606           /* Fold comparisons against infinity.  */
8607           if (REAL_VALUE_ISINF (cst))
8608             {
8609               tem = fold_inf_compare (code, type, arg0, arg1);
8610               if (tem != NULL_TREE)
8611                 return tem;
8612             }
8613         }
8614
8615       /* If this is a comparison of a real constant with a PLUS_EXPR
8616          or a MINUS_EXPR of a real constant, we can convert it into a
8617          comparison with a revised real constant as long as no overflow
8618          occurs when unsafe_math_optimizations are enabled.  */
8619       if (flag_unsafe_math_optimizations
8620           && TREE_CODE (arg1) == REAL_CST
8621           && (TREE_CODE (arg0) == PLUS_EXPR
8622               || TREE_CODE (arg0) == MINUS_EXPR)
8623           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8624           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8625                                       ? MINUS_EXPR : PLUS_EXPR,
8626                                       arg1, TREE_OPERAND (arg0, 1), 0))
8627           && !TREE_OVERFLOW (tem))
8628         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8629
8630       /* Likewise, we can simplify a comparison of a real constant with
8631          a MINUS_EXPR whose first operand is also a real constant, i.e.
8632          (c1 - x) < c2 becomes x > c1-c2.  */
8633       if (flag_unsafe_math_optimizations
8634           && TREE_CODE (arg1) == REAL_CST
8635           && TREE_CODE (arg0) == MINUS_EXPR
8636           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8637           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8638                                       arg1, 0))
8639           && !TREE_OVERFLOW (tem))
8640         return fold_build2 (swap_tree_comparison (code), type,
8641                             TREE_OPERAND (arg0, 1), tem);
8642
8643       /* Fold comparisons against built-in math functions.  */
8644       if (TREE_CODE (arg1) == REAL_CST
8645           && flag_unsafe_math_optimizations
8646           && ! flag_errno_math)
8647         {
8648           enum built_in_function fcode = builtin_mathfn_code (arg0);
8649
8650           if (fcode != END_BUILTINS)
8651             {
8652               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8653               if (tem != NULL_TREE)
8654                 return tem;
8655             }
8656         }
8657     }
8658
8659   /* Convert foo++ == CONST into ++foo == CONST + INCR.  */
8660   if (TREE_CONSTANT (arg1)
8661       && (TREE_CODE (arg0) == POSTINCREMENT_EXPR
8662           || TREE_CODE (arg0) == POSTDECREMENT_EXPR)
8663       /* This optimization is invalid for ordered comparisons
8664          if CONST+INCR overflows or if foo+incr might overflow.
8665          This optimization is invalid for floating point due to rounding.
8666          For pointer types we assume overflow doesn't happen.  */
8667       && (POINTER_TYPE_P (TREE_TYPE (arg0))
8668           || (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8669               && (code == EQ_EXPR || code == NE_EXPR))))
8670     {
8671       tree varop, newconst;
8672
8673       if (TREE_CODE (arg0) == POSTINCREMENT_EXPR)
8674         {
8675           newconst = fold_build2 (PLUS_EXPR, TREE_TYPE (arg0),
8676                                   arg1, TREE_OPERAND (arg0, 1));
8677           varop = build2 (PREINCREMENT_EXPR, TREE_TYPE (arg0),
8678                           TREE_OPERAND (arg0, 0),
8679                           TREE_OPERAND (arg0, 1));
8680         }
8681       else
8682         {
8683           newconst = fold_build2 (MINUS_EXPR, TREE_TYPE (arg0),
8684                                   arg1, TREE_OPERAND (arg0, 1));
8685           varop = build2 (PREDECREMENT_EXPR, TREE_TYPE (arg0),
8686                           TREE_OPERAND (arg0, 0),
8687                           TREE_OPERAND (arg0, 1));
8688         }
8689
8690
8691       /* If VAROP is a reference to a bitfield, we must mask
8692          the constant by the width of the field.  */
8693       if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
8694           && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))
8695           && host_integerp (DECL_SIZE (TREE_OPERAND
8696                                          (TREE_OPERAND (varop, 0), 1)), 1))
8697         {
8698           tree fielddecl = TREE_OPERAND (TREE_OPERAND (varop, 0), 1);
8699           HOST_WIDE_INT size = tree_low_cst (DECL_SIZE (fielddecl), 1);
8700           tree folded_compare, shift;
8701
8702           /* First check whether the comparison would come out
8703              always the same.  If we don't do that we would
8704              change the meaning with the masking.  */
8705           folded_compare = fold_build2 (code, type,
8706                                         TREE_OPERAND (varop, 0), arg1);
8707           if (TREE_CODE (folded_compare) == INTEGER_CST)
8708             return omit_one_operand (type, folded_compare, varop);
8709
8710           shift = build_int_cst (NULL_TREE,
8711                                  TYPE_PRECISION (TREE_TYPE (varop)) - size);
8712           shift = fold_convert (TREE_TYPE (varop), shift);
8713           newconst = fold_build2 (LSHIFT_EXPR, TREE_TYPE (varop),
8714                                   newconst, shift);
8715           newconst = fold_build2 (RSHIFT_EXPR, TREE_TYPE (varop),
8716                                   newconst, shift);
8717         }
8718
8719       return fold_build2 (code, type, varop, newconst);
8720     }
8721
8722   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8723       && (TREE_CODE (arg0) == NOP_EXPR
8724           || TREE_CODE (arg0) == CONVERT_EXPR))
8725     {
8726       /* If we are widening one operand of an integer comparison,
8727          see if the other operand is similarly being widened.  Perhaps we
8728          can do the comparison in the narrower type.  */
8729       tem = fold_widened_comparison (code, type, arg0, arg1);
8730       if (tem)
8731         return tem;
8732
8733       /* Or if we are changing signedness.  */
8734       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8735       if (tem)
8736         return tem;
8737     }
8738
8739   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8740      constant, we can simplify it.  */
8741   if (TREE_CODE (arg1) == INTEGER_CST
8742       && (TREE_CODE (arg0) == MIN_EXPR
8743           || TREE_CODE (arg0) == MAX_EXPR)
8744       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8745     {
8746       tem = optimize_minmax_comparison (code, type, op0, op1);
8747       if (tem)
8748         return tem;
8749     }
8750
8751   /* Simplify comparison of something with itself.  (For IEEE
8752      floating-point, we can only do some of these simplifications.)  */
8753   if (operand_equal_p (arg0, arg1, 0))
8754     {
8755       switch (code)
8756         {
8757         case EQ_EXPR:
8758           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8759               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8760             return constant_boolean_node (1, type);
8761           break;
8762
8763         case GE_EXPR:
8764         case LE_EXPR:
8765           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8766               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8767             return constant_boolean_node (1, type);
8768           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8769
8770         case NE_EXPR:
8771           /* For NE, we can only do this simplification if integer
8772              or we don't honor IEEE floating point NaNs.  */
8773           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8774               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8775             break;
8776           /* ... fall through ...  */
8777         case GT_EXPR:
8778         case LT_EXPR:
8779           return constant_boolean_node (0, type);
8780         default:
8781           gcc_unreachable ();
8782         }
8783     }
8784
8785   /* If we are comparing an expression that just has comparisons
8786      of two integer values, arithmetic expressions of those comparisons,
8787      and constants, we can simplify it.  There are only three cases
8788      to check: the two values can either be equal, the first can be
8789      greater, or the second can be greater.  Fold the expression for
8790      those three values.  Since each value must be 0 or 1, we have
8791      eight possibilities, each of which corresponds to the constant 0
8792      or 1 or one of the six possible comparisons.
8793
8794      This handles common cases like (a > b) == 0 but also handles
8795      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8796      occur in macroized code.  */
8797
8798   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8799     {
8800       tree cval1 = 0, cval2 = 0;
8801       int save_p = 0;
8802
8803       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8804           /* Don't handle degenerate cases here; they should already
8805              have been handled anyway.  */
8806           && cval1 != 0 && cval2 != 0
8807           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8808           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8809           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8810           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8811           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8812           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8813                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8814         {
8815           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8816           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8817
8818           /* We can't just pass T to eval_subst in case cval1 or cval2
8819              was the same as ARG1.  */
8820
8821           tree high_result
8822                 = fold_build2 (code, type,
8823                                eval_subst (arg0, cval1, maxval,
8824                                            cval2, minval),
8825                                arg1);
8826           tree equal_result
8827                 = fold_build2 (code, type,
8828                                eval_subst (arg0, cval1, maxval,
8829                                            cval2, maxval),
8830                                arg1);
8831           tree low_result
8832                 = fold_build2 (code, type,
8833                                eval_subst (arg0, cval1, minval,
8834                                            cval2, maxval),
8835                                arg1);
8836
8837           /* All three of these results should be 0 or 1.  Confirm they are.
8838              Then use those values to select the proper code to use.  */
8839
8840           if (TREE_CODE (high_result) == INTEGER_CST
8841               && TREE_CODE (equal_result) == INTEGER_CST
8842               && TREE_CODE (low_result) == INTEGER_CST)
8843             {
8844               /* Make a 3-bit mask with the high-order bit being the
8845                  value for `>', the next for '=', and the low for '<'.  */
8846               switch ((integer_onep (high_result) * 4)
8847                       + (integer_onep (equal_result) * 2)
8848                       + integer_onep (low_result))
8849                 {
8850                 case 0:
8851                   /* Always false.  */
8852                   return omit_one_operand (type, integer_zero_node, arg0);
8853                 case 1:
8854                   code = LT_EXPR;
8855                   break;
8856                 case 2:
8857                   code = EQ_EXPR;
8858                   break;
8859                 case 3:
8860                   code = LE_EXPR;
8861                   break;
8862                 case 4:
8863                   code = GT_EXPR;
8864                   break;
8865                 case 5:
8866                   code = NE_EXPR;
8867                   break;
8868                 case 6:
8869                   code = GE_EXPR;
8870                   break;
8871                 case 7:
8872                   /* Always true.  */
8873                   return omit_one_operand (type, integer_one_node, arg0);
8874                 }
8875
8876               if (save_p)
8877                 return save_expr (build2 (code, type, cval1, cval2));
8878               return fold_build2 (code, type, cval1, cval2);
8879             }
8880         }
8881     }
8882
8883   /* Fold a comparison of the address of COMPONENT_REFs with the same
8884      type and component to a comparison of the address of the base
8885      object.  In short, &x->a OP &y->a to x OP y and
8886      &x->a OP &y.a to x OP &y  */
8887   if (TREE_CODE (arg0) == ADDR_EXPR
8888       && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8889       && TREE_CODE (arg1) == ADDR_EXPR
8890       && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8891     {
8892       tree cref0 = TREE_OPERAND (arg0, 0);
8893       tree cref1 = TREE_OPERAND (arg1, 0);
8894       if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8895         {
8896           tree op0 = TREE_OPERAND (cref0, 0);
8897           tree op1 = TREE_OPERAND (cref1, 0);
8898           return fold_build2 (code, type,
8899                               build_fold_addr_expr (op0),
8900                               build_fold_addr_expr (op1));
8901         }
8902     }
8903
8904   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8905      into a single range test.  */
8906   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8907        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8908       && TREE_CODE (arg1) == INTEGER_CST
8909       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8910       && !integer_zerop (TREE_OPERAND (arg0, 1))
8911       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8912       && !TREE_OVERFLOW (arg1))
8913     {
8914       tem = fold_div_compare (code, type, arg0, arg1);
8915       if (tem != NULL_TREE)
8916         return tem;
8917     }
8918
8919   /* Fold ~X op ~Y as Y op X.  */
8920   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8921       && TREE_CODE (arg1) == BIT_NOT_EXPR)
8922     {
8923       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8924       return fold_build2 (code, type,
8925                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8926                           TREE_OPERAND (arg0, 0));
8927     }
8928
8929   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
8930   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8931       && TREE_CODE (arg1) == INTEGER_CST)
8932     {
8933       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8934       return fold_build2 (swap_tree_comparison (code), type,
8935                           TREE_OPERAND (arg0, 0),
8936                           fold_build1 (BIT_NOT_EXPR, cmp_type,
8937                                        fold_convert (cmp_type, arg1)));
8938     }
8939
8940   return NULL_TREE;
8941 }
8942
8943
8944 /* Subroutine of fold_binary.  Optimize complex multiplications of the
8945    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
8946    argument EXPR represents the expression "z" of type TYPE.  */
8947
8948 static tree
8949 fold_mult_zconjz (tree type, tree expr)
8950 {
8951   tree itype = TREE_TYPE (type);
8952   tree rpart, ipart, tem;
8953
8954   if (TREE_CODE (expr) == COMPLEX_EXPR)
8955     {
8956       rpart = TREE_OPERAND (expr, 0);
8957       ipart = TREE_OPERAND (expr, 1);
8958     }
8959   else if (TREE_CODE (expr) == COMPLEX_CST)
8960     {
8961       rpart = TREE_REALPART (expr);
8962       ipart = TREE_IMAGPART (expr);
8963     }
8964   else
8965     {
8966       expr = save_expr (expr);
8967       rpart = fold_build1 (REALPART_EXPR, itype, expr);
8968       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8969     }
8970
8971   rpart = save_expr (rpart);
8972   ipart = save_expr (ipart);
8973   tem = fold_build2 (PLUS_EXPR, itype,
8974                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
8975                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
8976   return fold_build2 (COMPLEX_EXPR, type, tem,
8977                       fold_convert (itype, integer_zero_node));
8978 }
8979
8980
8981 /* Fold a binary expression of code CODE and type TYPE with operands
8982    OP0 and OP1.  Return the folded expression if folding is
8983    successful.  Otherwise, return NULL_TREE.  */
8984
8985 tree
8986 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
8987 {
8988   enum tree_code_class kind = TREE_CODE_CLASS (code);
8989   tree arg0, arg1, tem;
8990   tree t1 = NULL_TREE;
8991   bool strict_overflow_p;
8992
8993   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
8994                || IS_GIMPLE_STMT_CODE_CLASS (kind))
8995               && TREE_CODE_LENGTH (code) == 2
8996               && op0 != NULL_TREE
8997               && op1 != NULL_TREE);
8998
8999   arg0 = op0;
9000   arg1 = op1;
9001
9002   /* Strip any conversions that don't change the mode.  This is
9003      safe for every expression, except for a comparison expression
9004      because its signedness is derived from its operands.  So, in
9005      the latter case, only strip conversions that don't change the
9006      signedness.
9007
9008      Note that this is done as an internal manipulation within the
9009      constant folder, in order to find the simplest representation
9010      of the arguments so that their form can be studied.  In any
9011      cases, the appropriate type conversions should be put back in
9012      the tree that will get out of the constant folder.  */
9013
9014   if (kind == tcc_comparison)
9015     {
9016       STRIP_SIGN_NOPS (arg0);
9017       STRIP_SIGN_NOPS (arg1);
9018     }
9019   else
9020     {
9021       STRIP_NOPS (arg0);
9022       STRIP_NOPS (arg1);
9023     }
9024
9025   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9026      constant but we can't do arithmetic on them.  */
9027   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9028       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9029       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9030       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9031     {
9032       if (kind == tcc_binary)
9033         tem = const_binop (code, arg0, arg1, 0);
9034       else if (kind == tcc_comparison)
9035         tem = fold_relational_const (code, type, arg0, arg1);
9036       else
9037         tem = NULL_TREE;
9038
9039       if (tem != NULL_TREE)
9040         {
9041           if (TREE_TYPE (tem) != type)
9042             tem = fold_convert (type, tem);
9043           return tem;
9044         }
9045     }
9046
9047   /* If this is a commutative operation, and ARG0 is a constant, move it
9048      to ARG1 to reduce the number of tests below.  */
9049   if (commutative_tree_code (code)
9050       && tree_swap_operands_p (arg0, arg1, true))
9051     return fold_build2 (code, type, op1, op0);
9052
9053   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9054
9055      First check for cases where an arithmetic operation is applied to a
9056      compound, conditional, or comparison operation.  Push the arithmetic
9057      operation inside the compound or conditional to see if any folding
9058      can then be done.  Convert comparison to conditional for this purpose.
9059      The also optimizes non-constant cases that used to be done in
9060      expand_expr.
9061
9062      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9063      one of the operands is a comparison and the other is a comparison, a
9064      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9065      code below would make the expression more complex.  Change it to a
9066      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9067      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9068
9069   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9070        || code == EQ_EXPR || code == NE_EXPR)
9071       && ((truth_value_p (TREE_CODE (arg0))
9072            && (truth_value_p (TREE_CODE (arg1))
9073                || (TREE_CODE (arg1) == BIT_AND_EXPR
9074                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9075           || (truth_value_p (TREE_CODE (arg1))
9076               && (truth_value_p (TREE_CODE (arg0))
9077                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9078                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9079     {
9080       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9081                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9082                          : TRUTH_XOR_EXPR,
9083                          boolean_type_node,
9084                          fold_convert (boolean_type_node, arg0),
9085                          fold_convert (boolean_type_node, arg1));
9086
9087       if (code == EQ_EXPR)
9088         tem = invert_truthvalue (tem);
9089
9090       return fold_convert (type, tem);
9091     }
9092
9093   if (TREE_CODE_CLASS (code) == tcc_binary
9094       || TREE_CODE_CLASS (code) == tcc_comparison)
9095     {
9096       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9097         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9098                        fold_build2 (code, type,
9099                                     TREE_OPERAND (arg0, 1), op1));
9100       if (TREE_CODE (arg1) == COMPOUND_EXPR
9101           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9102         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9103                        fold_build2 (code, type,
9104                                     op0, TREE_OPERAND (arg1, 1)));
9105
9106       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9107         {
9108           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9109                                                      arg0, arg1, 
9110                                                      /*cond_first_p=*/1);
9111           if (tem != NULL_TREE)
9112             return tem;
9113         }
9114
9115       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9116         {
9117           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9118                                                      arg1, arg0, 
9119                                                      /*cond_first_p=*/0);
9120           if (tem != NULL_TREE)
9121             return tem;
9122         }
9123     }
9124
9125   switch (code)
9126     {
9127     case PLUS_EXPR:
9128       /* A + (-B) -> A - B */
9129       if (TREE_CODE (arg1) == NEGATE_EXPR)
9130         return fold_build2 (MINUS_EXPR, type,
9131                             fold_convert (type, arg0),
9132                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9133       /* (-A) + B -> B - A */
9134       if (TREE_CODE (arg0) == NEGATE_EXPR
9135           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9136         return fold_build2 (MINUS_EXPR, type,
9137                             fold_convert (type, arg1),
9138                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9139       /* Convert ~A + 1 to -A.  */
9140       if (INTEGRAL_TYPE_P (type)
9141           && TREE_CODE (arg0) == BIT_NOT_EXPR
9142           && integer_onep (arg1))
9143         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9144
9145       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9146          same or one.  */
9147       if ((TREE_CODE (arg0) == MULT_EXPR
9148            || TREE_CODE (arg1) == MULT_EXPR)
9149           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9150         {
9151           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9152           if (tem)
9153             return tem;
9154         }
9155
9156       if (! FLOAT_TYPE_P (type))
9157         {
9158           if (integer_zerop (arg1))
9159             return non_lvalue (fold_convert (type, arg0));
9160
9161           /* ~X + X is -1.  */
9162           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9163               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9164               && !TYPE_OVERFLOW_TRAPS (type))
9165             {
9166               t1 = build_int_cst_type (type, -1);
9167               return omit_one_operand (type, t1, arg1);
9168             }
9169
9170           /* X + ~X is -1.  */
9171           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9172               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
9173               && !TYPE_OVERFLOW_TRAPS (type))
9174             {
9175               t1 = build_int_cst_type (type, -1);
9176               return omit_one_operand (type, t1, arg0);
9177           }
9178
9179           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9180              with a constant, and the two constants have no bits in common,
9181              we should treat this as a BIT_IOR_EXPR since this may produce more
9182              simplifications.  */
9183           if (TREE_CODE (arg0) == BIT_AND_EXPR
9184               && TREE_CODE (arg1) == BIT_AND_EXPR
9185               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9186               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9187               && integer_zerop (const_binop (BIT_AND_EXPR,
9188                                              TREE_OPERAND (arg0, 1),
9189                                              TREE_OPERAND (arg1, 1), 0)))
9190             {
9191               code = BIT_IOR_EXPR;
9192               goto bit_ior;
9193             }
9194
9195           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9196              (plus (plus (mult) (mult)) (foo)) so that we can
9197              take advantage of the factoring cases below.  */
9198           if (((TREE_CODE (arg0) == PLUS_EXPR
9199                 || TREE_CODE (arg0) == MINUS_EXPR)
9200                && TREE_CODE (arg1) == MULT_EXPR)
9201               || ((TREE_CODE (arg1) == PLUS_EXPR
9202                    || TREE_CODE (arg1) == MINUS_EXPR)
9203                   && TREE_CODE (arg0) == MULT_EXPR))
9204             {
9205               tree parg0, parg1, parg, marg;
9206               enum tree_code pcode;
9207
9208               if (TREE_CODE (arg1) == MULT_EXPR)
9209                 parg = arg0, marg = arg1;
9210               else
9211                 parg = arg1, marg = arg0;
9212               pcode = TREE_CODE (parg);
9213               parg0 = TREE_OPERAND (parg, 0);
9214               parg1 = TREE_OPERAND (parg, 1);
9215               STRIP_NOPS (parg0);
9216               STRIP_NOPS (parg1);
9217
9218               if (TREE_CODE (parg0) == MULT_EXPR
9219                   && TREE_CODE (parg1) != MULT_EXPR)
9220                 return fold_build2 (pcode, type,
9221                                     fold_build2 (PLUS_EXPR, type,
9222                                                  fold_convert (type, parg0),
9223                                                  fold_convert (type, marg)),
9224                                     fold_convert (type, parg1));
9225               if (TREE_CODE (parg0) != MULT_EXPR
9226                   && TREE_CODE (parg1) == MULT_EXPR)
9227                 return fold_build2 (PLUS_EXPR, type,
9228                                     fold_convert (type, parg0),
9229                                     fold_build2 (pcode, type,
9230                                                  fold_convert (type, marg),
9231                                                  fold_convert (type,
9232                                                                parg1)));
9233             }
9234
9235           /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
9236              of the array.  Loop optimizer sometimes produce this type of
9237              expressions.  */
9238           if (TREE_CODE (arg0) == ADDR_EXPR)
9239             {
9240               tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
9241               if (tem)
9242                 return fold_convert (type, tem);
9243             }
9244           else if (TREE_CODE (arg1) == ADDR_EXPR)
9245             {
9246               tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
9247               if (tem)
9248                 return fold_convert (type, tem);
9249             }
9250         }
9251       else
9252         {
9253           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9254           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9255             return non_lvalue (fold_convert (type, arg0));
9256
9257           /* Likewise if the operands are reversed.  */
9258           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9259             return non_lvalue (fold_convert (type, arg1));
9260
9261           /* Convert X + -C into X - C.  */
9262           if (TREE_CODE (arg1) == REAL_CST
9263               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9264             {
9265               tem = fold_negate_const (arg1, type);
9266               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9267                 return fold_build2 (MINUS_EXPR, type,
9268                                     fold_convert (type, arg0),
9269                                     fold_convert (type, tem));
9270             }
9271
9272           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9273              to __complex__ ( x, y ).  This is not the same for SNaNs or
9274              if signed zeros are involved.  */
9275           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9276               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9277               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9278             {
9279               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9280               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9281               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9282               bool arg0rz = false, arg0iz = false;
9283               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9284                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9285                 {
9286                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9287                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9288                   if (arg0rz && arg1i && real_zerop (arg1i))
9289                     {
9290                       tree rp = arg1r ? arg1r
9291                                   : build1 (REALPART_EXPR, rtype, arg1);
9292                       tree ip = arg0i ? arg0i
9293                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9294                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9295                     }
9296                   else if (arg0iz && arg1r && real_zerop (arg1r))
9297                     {
9298                       tree rp = arg0r ? arg0r
9299                                   : build1 (REALPART_EXPR, rtype, arg0);
9300                       tree ip = arg1i ? arg1i
9301                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9302                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9303                     }
9304                 }
9305             }
9306
9307           if (flag_unsafe_math_optimizations
9308               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9309               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9310               && (tem = distribute_real_division (code, type, arg0, arg1)))
9311             return tem;
9312
9313           /* Convert x+x into x*2.0.  */
9314           if (operand_equal_p (arg0, arg1, 0)
9315               && SCALAR_FLOAT_TYPE_P (type))
9316             return fold_build2 (MULT_EXPR, type, arg0,
9317                                 build_real (type, dconst2));
9318
9319           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  */
9320           if (flag_unsafe_math_optimizations
9321               && TREE_CODE (arg1) == PLUS_EXPR
9322               && TREE_CODE (arg0) != MULT_EXPR)
9323             {
9324               tree tree10 = TREE_OPERAND (arg1, 0);
9325               tree tree11 = TREE_OPERAND (arg1, 1);
9326               if (TREE_CODE (tree11) == MULT_EXPR
9327                   && TREE_CODE (tree10) == MULT_EXPR)
9328                 {
9329                   tree tree0;
9330                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9331                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9332                 }
9333             }
9334           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  */
9335           if (flag_unsafe_math_optimizations
9336               && TREE_CODE (arg0) == PLUS_EXPR
9337               && TREE_CODE (arg1) != MULT_EXPR)
9338             {
9339               tree tree00 = TREE_OPERAND (arg0, 0);
9340               tree tree01 = TREE_OPERAND (arg0, 1);
9341               if (TREE_CODE (tree01) == MULT_EXPR
9342                   && TREE_CODE (tree00) == MULT_EXPR)
9343                 {
9344                   tree tree0;
9345                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9346                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9347                 }
9348             }
9349         }
9350
9351      bit_rotate:
9352       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9353          is a rotate of A by C1 bits.  */
9354       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9355          is a rotate of A by B bits.  */
9356       {
9357         enum tree_code code0, code1;
9358         code0 = TREE_CODE (arg0);
9359         code1 = TREE_CODE (arg1);
9360         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9361              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9362             && operand_equal_p (TREE_OPERAND (arg0, 0),
9363                                 TREE_OPERAND (arg1, 0), 0)
9364             && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
9365           {
9366             tree tree01, tree11;
9367             enum tree_code code01, code11;
9368
9369             tree01 = TREE_OPERAND (arg0, 1);
9370             tree11 = TREE_OPERAND (arg1, 1);
9371             STRIP_NOPS (tree01);
9372             STRIP_NOPS (tree11);
9373             code01 = TREE_CODE (tree01);
9374             code11 = TREE_CODE (tree11);
9375             if (code01 == INTEGER_CST
9376                 && code11 == INTEGER_CST
9377                 && TREE_INT_CST_HIGH (tree01) == 0
9378                 && TREE_INT_CST_HIGH (tree11) == 0
9379                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9380                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9381               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9382                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9383             else if (code11 == MINUS_EXPR)
9384               {
9385                 tree tree110, tree111;
9386                 tree110 = TREE_OPERAND (tree11, 0);
9387                 tree111 = TREE_OPERAND (tree11, 1);
9388                 STRIP_NOPS (tree110);
9389                 STRIP_NOPS (tree111);
9390                 if (TREE_CODE (tree110) == INTEGER_CST
9391                     && 0 == compare_tree_int (tree110,
9392                                               TYPE_PRECISION
9393                                               (TREE_TYPE (TREE_OPERAND
9394                                                           (arg0, 0))))
9395                     && operand_equal_p (tree01, tree111, 0))
9396                   return build2 ((code0 == LSHIFT_EXPR
9397                                   ? LROTATE_EXPR
9398                                   : RROTATE_EXPR),
9399                                  type, TREE_OPERAND (arg0, 0), tree01);
9400               }
9401             else if (code01 == MINUS_EXPR)
9402               {
9403                 tree tree010, tree011;
9404                 tree010 = TREE_OPERAND (tree01, 0);
9405                 tree011 = TREE_OPERAND (tree01, 1);
9406                 STRIP_NOPS (tree010);
9407                 STRIP_NOPS (tree011);
9408                 if (TREE_CODE (tree010) == INTEGER_CST
9409                     && 0 == compare_tree_int (tree010,
9410                                               TYPE_PRECISION
9411                                               (TREE_TYPE (TREE_OPERAND
9412                                                           (arg0, 0))))
9413                     && operand_equal_p (tree11, tree011, 0))
9414                   return build2 ((code0 != LSHIFT_EXPR
9415                                   ? LROTATE_EXPR
9416                                   : RROTATE_EXPR),
9417                                  type, TREE_OPERAND (arg0, 0), tree11);
9418               }
9419           }
9420       }
9421
9422     associate:
9423       /* In most languages, can't associate operations on floats through
9424          parentheses.  Rather than remember where the parentheses were, we
9425          don't associate floats at all, unless the user has specified
9426          -funsafe-math-optimizations.  */
9427
9428       if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9429         {
9430           tree var0, con0, lit0, minus_lit0;
9431           tree var1, con1, lit1, minus_lit1;
9432           bool ok = true;
9433
9434           /* Split both trees into variables, constants, and literals.  Then
9435              associate each group together, the constants with literals,
9436              then the result with variables.  This increases the chances of
9437              literals being recombined later and of generating relocatable
9438              expressions for the sum of a constant and literal.  */
9439           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9440           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9441                              code == MINUS_EXPR);
9442
9443           /* With undefined overflow we can only associate constants
9444              with one variable.  */
9445           if ((POINTER_TYPE_P (type)
9446                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9447               && var0 && var1)
9448             {
9449               tree tmp0 = var0;
9450               tree tmp1 = var1;
9451
9452               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9453                 tmp0 = TREE_OPERAND (tmp0, 0);
9454               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9455                 tmp1 = TREE_OPERAND (tmp1, 0);
9456               /* The only case we can still associate with two variables
9457                  is if they are the same, modulo negation.  */
9458               if (!operand_equal_p (tmp0, tmp1, 0))
9459                 ok = false;
9460             }
9461
9462           /* Only do something if we found more than two objects.  Otherwise,
9463              nothing has changed and we risk infinite recursion.  */
9464           if (ok
9465               && (2 < ((var0 != 0) + (var1 != 0)
9466                        + (con0 != 0) + (con1 != 0)
9467                        + (lit0 != 0) + (lit1 != 0)
9468                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9469             {
9470               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9471               if (code == MINUS_EXPR)
9472                 code = PLUS_EXPR;
9473
9474               var0 = associate_trees (var0, var1, code, type);
9475               con0 = associate_trees (con0, con1, code, type);
9476               lit0 = associate_trees (lit0, lit1, code, type);
9477               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9478
9479               /* Preserve the MINUS_EXPR if the negative part of the literal is
9480                  greater than the positive part.  Otherwise, the multiplicative
9481                  folding code (i.e extract_muldiv) may be fooled in case
9482                  unsigned constants are subtracted, like in the following
9483                  example: ((X*2 + 4) - 8U)/2.  */
9484               if (minus_lit0 && lit0)
9485                 {
9486                   if (TREE_CODE (lit0) == INTEGER_CST
9487                       && TREE_CODE (minus_lit0) == INTEGER_CST
9488                       && tree_int_cst_lt (lit0, minus_lit0))
9489                     {
9490                       minus_lit0 = associate_trees (minus_lit0, lit0,
9491                                                     MINUS_EXPR, type);
9492                       lit0 = 0;
9493                     }
9494                   else
9495                     {
9496                       lit0 = associate_trees (lit0, minus_lit0,
9497                                               MINUS_EXPR, type);
9498                       minus_lit0 = 0;
9499                     }
9500                 }
9501               if (minus_lit0)
9502                 {
9503                   if (con0 == 0)
9504                     return fold_convert (type,
9505                                          associate_trees (var0, minus_lit0,
9506                                                           MINUS_EXPR, type));
9507                   else
9508                     {
9509                       con0 = associate_trees (con0, minus_lit0,
9510                                               MINUS_EXPR, type);
9511                       return fold_convert (type,
9512                                            associate_trees (var0, con0,
9513                                                             PLUS_EXPR, type));
9514                     }
9515                 }
9516
9517               con0 = associate_trees (con0, lit0, code, type);
9518               return fold_convert (type, associate_trees (var0, con0,
9519                                                           code, type));
9520             }
9521         }
9522
9523       return NULL_TREE;
9524
9525     case MINUS_EXPR:
9526       /* A - (-B) -> A + B */
9527       if (TREE_CODE (arg1) == NEGATE_EXPR)
9528         return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
9529       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9530       if (TREE_CODE (arg0) == NEGATE_EXPR
9531           && (FLOAT_TYPE_P (type)
9532               || INTEGRAL_TYPE_P (type))
9533           && negate_expr_p (arg1)
9534           && reorder_operands_p (arg0, arg1))
9535         return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
9536                             TREE_OPERAND (arg0, 0));
9537       /* Convert -A - 1 to ~A.  */
9538       if (INTEGRAL_TYPE_P (type)
9539           && TREE_CODE (arg0) == NEGATE_EXPR
9540           && integer_onep (arg1)
9541           && !TYPE_OVERFLOW_TRAPS (type))
9542         return fold_build1 (BIT_NOT_EXPR, type,
9543                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9544
9545       /* Convert -1 - A to ~A.  */
9546       if (INTEGRAL_TYPE_P (type)
9547           && integer_all_onesp (arg0))
9548         return fold_build1 (BIT_NOT_EXPR, type, op1);
9549
9550       if (! FLOAT_TYPE_P (type))
9551         {
9552           if (integer_zerop (arg0))
9553             return negate_expr (fold_convert (type, arg1));
9554           if (integer_zerop (arg1))
9555             return non_lvalue (fold_convert (type, arg0));
9556
9557           /* Fold A - (A & B) into ~B & A.  */
9558           if (!TREE_SIDE_EFFECTS (arg0)
9559               && TREE_CODE (arg1) == BIT_AND_EXPR)
9560             {
9561               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9562                 return fold_build2 (BIT_AND_EXPR, type,
9563                                     fold_build1 (BIT_NOT_EXPR, type,
9564                                                  TREE_OPERAND (arg1, 0)),
9565                                     arg0);
9566               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9567                 return fold_build2 (BIT_AND_EXPR, type,
9568                                     fold_build1 (BIT_NOT_EXPR, type,
9569                                                  TREE_OPERAND (arg1, 1)),
9570                                     arg0);
9571             }
9572
9573           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9574              any power of 2 minus 1.  */
9575           if (TREE_CODE (arg0) == BIT_AND_EXPR
9576               && TREE_CODE (arg1) == BIT_AND_EXPR
9577               && operand_equal_p (TREE_OPERAND (arg0, 0),
9578                                   TREE_OPERAND (arg1, 0), 0))
9579             {
9580               tree mask0 = TREE_OPERAND (arg0, 1);
9581               tree mask1 = TREE_OPERAND (arg1, 1);
9582               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9583
9584               if (operand_equal_p (tem, mask1, 0))
9585                 {
9586                   tem = fold_build2 (BIT_XOR_EXPR, type,
9587                                      TREE_OPERAND (arg0, 0), mask1);
9588                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9589                 }
9590             }
9591         }
9592
9593       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9594       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9595         return non_lvalue (fold_convert (type, arg0));
9596
9597       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9598          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9599          (-ARG1 + ARG0) reduces to -ARG1.  */
9600       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9601         return negate_expr (fold_convert (type, arg1));
9602
9603       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9604          __complex__ ( x, -y ).  This is not the same for SNaNs or if
9605          signed zeros are involved.  */
9606       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9607           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9608           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9609         {
9610           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9611           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9612           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9613           bool arg0rz = false, arg0iz = false;
9614           if ((arg0r && (arg0rz = real_zerop (arg0r)))
9615               || (arg0i && (arg0iz = real_zerop (arg0i))))
9616             {
9617               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9618               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9619               if (arg0rz && arg1i && real_zerop (arg1i))
9620                 {
9621                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
9622                                          arg1r ? arg1r
9623                                          : build1 (REALPART_EXPR, rtype, arg1));
9624                   tree ip = arg0i ? arg0i
9625                     : build1 (IMAGPART_EXPR, rtype, arg0);
9626                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9627                 }
9628               else if (arg0iz && arg1r && real_zerop (arg1r))
9629                 {
9630                   tree rp = arg0r ? arg0r
9631                     : build1 (REALPART_EXPR, rtype, arg0);
9632                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
9633                                          arg1i ? arg1i
9634                                          : build1 (IMAGPART_EXPR, rtype, arg1));
9635                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9636                 }
9637             }
9638         }
9639
9640       /* Fold &x - &x.  This can happen from &x.foo - &x.
9641          This is unsafe for certain floats even in non-IEEE formats.
9642          In IEEE, it is unsafe because it does wrong for NaNs.
9643          Also note that operand_equal_p is always false if an operand
9644          is volatile.  */
9645
9646       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9647           && operand_equal_p (arg0, arg1, 0))
9648         return fold_convert (type, integer_zero_node);
9649
9650       /* A - B -> A + (-B) if B is easily negatable.  */
9651       if (negate_expr_p (arg1)
9652           && ((FLOAT_TYPE_P (type)
9653                /* Avoid this transformation if B is a positive REAL_CST.  */
9654                && (TREE_CODE (arg1) != REAL_CST
9655                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9656               || INTEGRAL_TYPE_P (type)))
9657         return fold_build2 (PLUS_EXPR, type,
9658                             fold_convert (type, arg0),
9659                             fold_convert (type, negate_expr (arg1)));
9660
9661       /* Try folding difference of addresses.  */
9662       {
9663         HOST_WIDE_INT diff;
9664
9665         if ((TREE_CODE (arg0) == ADDR_EXPR
9666              || TREE_CODE (arg1) == ADDR_EXPR)
9667             && ptr_difference_const (arg0, arg1, &diff))
9668           return build_int_cst_type (type, diff);
9669       }
9670
9671       /* Fold &a[i] - &a[j] to i-j.  */
9672       if (TREE_CODE (arg0) == ADDR_EXPR
9673           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9674           && TREE_CODE (arg1) == ADDR_EXPR
9675           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9676         {
9677           tree aref0 = TREE_OPERAND (arg0, 0);
9678           tree aref1 = TREE_OPERAND (arg1, 0);
9679           if (operand_equal_p (TREE_OPERAND (aref0, 0),
9680                                TREE_OPERAND (aref1, 0), 0))
9681             {
9682               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9683               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9684               tree esz = array_ref_element_size (aref0);
9685               tree diff = build2 (MINUS_EXPR, type, op0, op1);
9686               return fold_build2 (MULT_EXPR, type, diff,
9687                                   fold_convert (type, esz));
9688                                   
9689             }
9690         }
9691
9692       /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
9693          of the array.  Loop optimizer sometimes produce this type of
9694          expressions.  */
9695       if (TREE_CODE (arg0) == ADDR_EXPR)
9696         {
9697           tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
9698           if (tem)
9699             return fold_convert (type, tem);
9700         }
9701
9702       if (flag_unsafe_math_optimizations
9703           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9704           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9705           && (tem = distribute_real_division (code, type, arg0, arg1)))
9706         return tem;
9707
9708       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9709          same or one.  */
9710       if ((TREE_CODE (arg0) == MULT_EXPR
9711            || TREE_CODE (arg1) == MULT_EXPR)
9712           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9713         {
9714           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9715           if (tem)
9716             return tem;
9717         }
9718
9719       goto associate;
9720
9721     case MULT_EXPR:
9722       /* (-A) * (-B) -> A * B  */
9723       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9724         return fold_build2 (MULT_EXPR, type,
9725                             fold_convert (type, TREE_OPERAND (arg0, 0)),
9726                             fold_convert (type, negate_expr (arg1)));
9727       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9728         return fold_build2 (MULT_EXPR, type,
9729                             fold_convert (type, negate_expr (arg0)),
9730                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9731
9732       if (! FLOAT_TYPE_P (type))
9733         {
9734           if (integer_zerop (arg1))
9735             return omit_one_operand (type, arg1, arg0);
9736           if (integer_onep (arg1))
9737             return non_lvalue (fold_convert (type, arg0));
9738           /* Transform x * -1 into -x.  */
9739           if (integer_all_onesp (arg1))
9740             return fold_convert (type, negate_expr (arg0));
9741           /* Transform x * -C into -x * C if x is easily negatable.  */
9742           if (TREE_CODE (arg1) == INTEGER_CST
9743               && tree_int_cst_sgn (arg1) == -1
9744               && negate_expr_p (arg0)
9745               && (tem = negate_expr (arg1)) != arg1
9746               && !TREE_OVERFLOW (tem))
9747             return fold_build2 (MULT_EXPR, type,
9748                                 negate_expr (arg0), tem);
9749
9750           /* (a * (1 << b)) is (a << b)  */
9751           if (TREE_CODE (arg1) == LSHIFT_EXPR
9752               && integer_onep (TREE_OPERAND (arg1, 0)))
9753             return fold_build2 (LSHIFT_EXPR, type, arg0,
9754                                 TREE_OPERAND (arg1, 1));
9755           if (TREE_CODE (arg0) == LSHIFT_EXPR
9756               && integer_onep (TREE_OPERAND (arg0, 0)))
9757             return fold_build2 (LSHIFT_EXPR, type, arg1,
9758                                 TREE_OPERAND (arg0, 1));
9759
9760           strict_overflow_p = false;
9761           if (TREE_CODE (arg1) == INTEGER_CST
9762               && 0 != (tem = extract_muldiv (op0,
9763                                              fold_convert (type, arg1),
9764                                              code, NULL_TREE,
9765                                              &strict_overflow_p)))
9766             {
9767               if (strict_overflow_p)
9768                 fold_overflow_warning (("assuming signed overflow does not "
9769                                         "occur when simplifying "
9770                                         "multiplication"),
9771                                        WARN_STRICT_OVERFLOW_MISC);
9772               return fold_convert (type, tem);
9773             }
9774
9775           /* Optimize z * conj(z) for integer complex numbers.  */
9776           if (TREE_CODE (arg0) == CONJ_EXPR
9777               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9778             return fold_mult_zconjz (type, arg1);
9779           if (TREE_CODE (arg1) == CONJ_EXPR
9780               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9781             return fold_mult_zconjz (type, arg0);
9782         }
9783       else
9784         {
9785           /* Maybe fold x * 0 to 0.  The expressions aren't the same
9786              when x is NaN, since x * 0 is also NaN.  Nor are they the
9787              same in modes with signed zeros, since multiplying a
9788              negative value by 0 gives -0, not +0.  */
9789           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9790               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9791               && real_zerop (arg1))
9792             return omit_one_operand (type, arg1, arg0);
9793           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
9794           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9795               && real_onep (arg1))
9796             return non_lvalue (fold_convert (type, arg0));
9797
9798           /* Transform x * -1.0 into -x.  */
9799           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9800               && real_minus_onep (arg1))
9801             return fold_convert (type, negate_expr (arg0));
9802
9803           /* Convert (C1/X)*C2 into (C1*C2)/X.  */
9804           if (flag_unsafe_math_optimizations
9805               && TREE_CODE (arg0) == RDIV_EXPR
9806               && TREE_CODE (arg1) == REAL_CST
9807               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
9808             {
9809               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
9810                                       arg1, 0);
9811               if (tem)
9812                 return fold_build2 (RDIV_EXPR, type, tem,
9813                                     TREE_OPERAND (arg0, 1));
9814             }
9815
9816           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
9817           if (operand_equal_p (arg0, arg1, 0))
9818             {
9819               tree tem = fold_strip_sign_ops (arg0);
9820               if (tem != NULL_TREE)
9821                 {
9822                   tem = fold_convert (type, tem);
9823                   return fold_build2 (MULT_EXPR, type, tem, tem);
9824                 }
9825             }
9826
9827           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
9828              This is not the same for NaNs or if signed zeros are
9829              involved.  */
9830           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9831               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9832               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
9833               && TREE_CODE (arg1) == COMPLEX_CST
9834               && real_zerop (TREE_REALPART (arg1)))
9835             {
9836               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9837               if (real_onep (TREE_IMAGPART (arg1)))
9838                 return fold_build2 (COMPLEX_EXPR, type,
9839                                     negate_expr (fold_build1 (IMAGPART_EXPR,
9840                                                               rtype, arg0)),
9841                                     fold_build1 (REALPART_EXPR, rtype, arg0));
9842               else if (real_minus_onep (TREE_IMAGPART (arg1)))
9843                 return fold_build2 (COMPLEX_EXPR, type,
9844                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
9845                                     negate_expr (fold_build1 (REALPART_EXPR,
9846                                                               rtype, arg0)));
9847             }
9848
9849           /* Optimize z * conj(z) for floating point complex numbers.
9850              Guarded by flag_unsafe_math_optimizations as non-finite
9851              imaginary components don't produce scalar results.  */
9852           if (flag_unsafe_math_optimizations
9853               && TREE_CODE (arg0) == CONJ_EXPR
9854               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9855             return fold_mult_zconjz (type, arg1);
9856           if (flag_unsafe_math_optimizations
9857               && TREE_CODE (arg1) == CONJ_EXPR
9858               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9859             return fold_mult_zconjz (type, arg0);
9860
9861           if (flag_unsafe_math_optimizations)
9862             {
9863               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
9864               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
9865
9866               /* Optimizations of root(...)*root(...).  */
9867               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
9868                 {
9869                   tree rootfn, arg;
9870                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9871                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9872
9873                   /* Optimize sqrt(x)*sqrt(x) as x.  */
9874                   if (BUILTIN_SQRT_P (fcode0)
9875                       && operand_equal_p (arg00, arg10, 0)
9876                       && ! HONOR_SNANS (TYPE_MODE (type)))
9877                     return arg00;
9878
9879                   /* Optimize root(x)*root(y) as root(x*y).  */
9880                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9881                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9882                   return build_call_expr (rootfn, 1, arg);
9883                 }
9884
9885               /* Optimize expN(x)*expN(y) as expN(x+y).  */
9886               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
9887                 {
9888                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9889                   tree arg = fold_build2 (PLUS_EXPR, type,
9890                                           CALL_EXPR_ARG (arg0, 0),
9891                                           CALL_EXPR_ARG (arg1, 0));
9892                   return build_call_expr (expfn, 1, arg);
9893                 }
9894
9895               /* Optimizations of pow(...)*pow(...).  */
9896               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
9897                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
9898                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
9899                 {
9900                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9901                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9902                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9903                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9904
9905                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
9906                   if (operand_equal_p (arg01, arg11, 0))
9907                     {
9908                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9909                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9910                       return build_call_expr (powfn, 2, arg, arg01);
9911                     }
9912
9913                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
9914                   if (operand_equal_p (arg00, arg10, 0))
9915                     {
9916                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9917                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
9918                       return build_call_expr (powfn, 2, arg00, arg);
9919                     }
9920                 }
9921
9922               /* Optimize tan(x)*cos(x) as sin(x).  */
9923               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
9924                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
9925                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
9926                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
9927                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
9928                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
9929                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
9930                                       CALL_EXPR_ARG (arg1, 0), 0))
9931                 {
9932                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
9933
9934                   if (sinfn != NULL_TREE)
9935                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
9936                 }
9937
9938               /* Optimize x*pow(x,c) as pow(x,c+1).  */
9939               if (fcode1 == BUILT_IN_POW
9940                   || fcode1 == BUILT_IN_POWF
9941                   || fcode1 == BUILT_IN_POWL)
9942                 {
9943                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9944                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9945                   if (TREE_CODE (arg11) == REAL_CST
9946                       && !TREE_OVERFLOW (arg11)
9947                       && operand_equal_p (arg0, arg10, 0))
9948                     {
9949                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
9950                       REAL_VALUE_TYPE c;
9951                       tree arg;
9952
9953                       c = TREE_REAL_CST (arg11);
9954                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9955                       arg = build_real (type, c);
9956                       return build_call_expr (powfn, 2, arg0, arg);
9957                     }
9958                 }
9959
9960               /* Optimize pow(x,c)*x as pow(x,c+1).  */
9961               if (fcode0 == BUILT_IN_POW
9962                   || fcode0 == BUILT_IN_POWF
9963                   || fcode0 == BUILT_IN_POWL)
9964                 {
9965                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9966                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9967                   if (TREE_CODE (arg01) == REAL_CST
9968                       && !TREE_OVERFLOW (arg01)
9969                       && operand_equal_p (arg1, arg00, 0))
9970                     {
9971                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9972                       REAL_VALUE_TYPE c;
9973                       tree arg;
9974
9975                       c = TREE_REAL_CST (arg01);
9976                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9977                       arg = build_real (type, c);
9978                       return build_call_expr (powfn, 2, arg1, arg);
9979                     }
9980                 }
9981
9982               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
9983               if (! optimize_size
9984                   && operand_equal_p (arg0, arg1, 0))
9985                 {
9986                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
9987
9988                   if (powfn)
9989                     {
9990                       tree arg = build_real (type, dconst2);
9991                       return build_call_expr (powfn, 2, arg0, arg);
9992                     }
9993                 }
9994             }
9995         }
9996       goto associate;
9997
9998     case BIT_IOR_EXPR:
9999     bit_ior:
10000       if (integer_all_onesp (arg1))
10001         return omit_one_operand (type, arg1, arg0);
10002       if (integer_zerop (arg1))
10003         return non_lvalue (fold_convert (type, arg0));
10004       if (operand_equal_p (arg0, arg1, 0))
10005         return non_lvalue (fold_convert (type, arg0));
10006
10007       /* ~X | X is -1.  */
10008       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10009           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10010         {
10011           t1 = build_int_cst_type (type, -1);
10012           return omit_one_operand (type, t1, arg1);
10013         }
10014
10015       /* X | ~X is -1.  */
10016       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10017           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10018         {
10019           t1 = build_int_cst_type (type, -1);
10020           return omit_one_operand (type, t1, arg0);
10021         }
10022
10023       /* Canonicalize (X & C1) | C2.  */
10024       if (TREE_CODE (arg0) == BIT_AND_EXPR
10025           && TREE_CODE (arg1) == INTEGER_CST
10026           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10027         {
10028           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, mlo, mhi;
10029           int width = TYPE_PRECISION (type);
10030           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10031           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10032           hi2 = TREE_INT_CST_HIGH (arg1);
10033           lo2 = TREE_INT_CST_LOW (arg1);
10034
10035           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10036           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10037             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10038
10039           if (width > HOST_BITS_PER_WIDE_INT)
10040             {
10041               mhi = (unsigned HOST_WIDE_INT) -1 
10042                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10043               mlo = -1;
10044             }
10045           else
10046             {
10047               mhi = 0;
10048               mlo = (unsigned HOST_WIDE_INT) -1
10049                     >> (HOST_BITS_PER_WIDE_INT - width);
10050             }
10051
10052           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10053           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10054             return fold_build2 (BIT_IOR_EXPR, type,
10055                                 TREE_OPERAND (arg0, 0), arg1);
10056
10057           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2.  */
10058           hi1 &= mhi;
10059           lo1 &= mlo;
10060           if ((hi1 & ~hi2) != hi1 || (lo1 & ~lo2) != lo1)
10061             return fold_build2 (BIT_IOR_EXPR, type,
10062                                 fold_build2 (BIT_AND_EXPR, type,
10063                                              TREE_OPERAND (arg0, 0),
10064                                              build_int_cst_wide (type,
10065                                                                  lo1 & ~lo2,
10066                                                                  hi1 & ~hi2)),
10067                                 arg1);
10068         }
10069
10070       /* (X & Y) | Y is (X, Y).  */
10071       if (TREE_CODE (arg0) == BIT_AND_EXPR
10072           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10073         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10074       /* (X & Y) | X is (Y, X).  */
10075       if (TREE_CODE (arg0) == BIT_AND_EXPR
10076           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10077           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10078         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10079       /* X | (X & Y) is (Y, X).  */
10080       if (TREE_CODE (arg1) == BIT_AND_EXPR
10081           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10082           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10083         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10084       /* X | (Y & X) is (Y, X).  */
10085       if (TREE_CODE (arg1) == BIT_AND_EXPR
10086           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10087           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10088         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10089
10090       t1 = distribute_bit_expr (code, type, arg0, arg1);
10091       if (t1 != NULL_TREE)
10092         return t1;
10093
10094       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10095
10096          This results in more efficient code for machines without a NAND
10097          instruction.  Combine will canonicalize to the first form
10098          which will allow use of NAND instructions provided by the
10099          backend if they exist.  */
10100       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10101           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10102         {
10103           return fold_build1 (BIT_NOT_EXPR, type,
10104                               build2 (BIT_AND_EXPR, type,
10105                                       TREE_OPERAND (arg0, 0),
10106                                       TREE_OPERAND (arg1, 0)));
10107         }
10108
10109       /* See if this can be simplified into a rotate first.  If that
10110          is unsuccessful continue in the association code.  */
10111       goto bit_rotate;
10112
10113     case BIT_XOR_EXPR:
10114       if (integer_zerop (arg1))
10115         return non_lvalue (fold_convert (type, arg0));
10116       if (integer_all_onesp (arg1))
10117         return fold_build1 (BIT_NOT_EXPR, type, arg0);
10118       if (operand_equal_p (arg0, arg1, 0))
10119         return omit_one_operand (type, integer_zero_node, arg0);
10120
10121       /* ~X ^ X is -1.  */
10122       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10123           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10124         {
10125           t1 = build_int_cst_type (type, -1);
10126           return omit_one_operand (type, t1, arg1);
10127         }
10128
10129       /* X ^ ~X is -1.  */
10130       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10131           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10132         {
10133           t1 = build_int_cst_type (type, -1);
10134           return omit_one_operand (type, t1, arg0);
10135         }
10136
10137       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10138          with a constant, and the two constants have no bits in common,
10139          we should treat this as a BIT_IOR_EXPR since this may produce more
10140          simplifications.  */
10141       if (TREE_CODE (arg0) == BIT_AND_EXPR
10142           && TREE_CODE (arg1) == BIT_AND_EXPR
10143           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10144           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10145           && integer_zerop (const_binop (BIT_AND_EXPR,
10146                                          TREE_OPERAND (arg0, 1),
10147                                          TREE_OPERAND (arg1, 1), 0)))
10148         {
10149           code = BIT_IOR_EXPR;
10150           goto bit_ior;
10151         }
10152
10153       /* (X | Y) ^ X -> Y & ~ X*/
10154       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10155           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10156         {
10157           tree t2 = TREE_OPERAND (arg0, 1);
10158           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10159                             arg1);
10160           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10161                             fold_convert (type, t1));
10162           return t1;
10163         }
10164
10165       /* (Y | X) ^ X -> Y & ~ X*/
10166       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10167           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10168         {
10169           tree t2 = TREE_OPERAND (arg0, 0);
10170           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10171                             arg1);
10172           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10173                             fold_convert (type, t1));
10174           return t1;
10175         }
10176
10177       /* X ^ (X | Y) -> Y & ~ X*/
10178       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10179           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10180         {
10181           tree t2 = TREE_OPERAND (arg1, 1);
10182           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10183                             arg0);
10184           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10185                             fold_convert (type, t1));
10186           return t1;
10187         }
10188
10189       /* X ^ (Y | X) -> Y & ~ X*/
10190       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10191           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10192         {
10193           tree t2 = TREE_OPERAND (arg1, 0);
10194           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10195                             arg0);
10196           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10197                             fold_convert (type, t1));
10198           return t1;
10199         }
10200         
10201       /* Convert ~X ^ ~Y to X ^ Y.  */
10202       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10203           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10204         return fold_build2 (code, type,
10205                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10206                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10207
10208       /* Convert ~X ^ C to X ^ ~C.  */
10209       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10210           && TREE_CODE (arg1) == INTEGER_CST)
10211         return fold_build2 (code, type,
10212                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10213                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10214
10215       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10216       if (TREE_CODE (arg0) == BIT_AND_EXPR
10217           && integer_onep (TREE_OPERAND (arg0, 1))
10218           && integer_onep (arg1))
10219         return fold_build2 (EQ_EXPR, type, arg0,
10220                             build_int_cst (TREE_TYPE (arg0), 0));
10221
10222       /* Fold (X & Y) ^ Y as ~X & Y.  */
10223       if (TREE_CODE (arg0) == BIT_AND_EXPR
10224           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10225         {
10226           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10227           return fold_build2 (BIT_AND_EXPR, type, 
10228                               fold_build1 (BIT_NOT_EXPR, type, tem),
10229                               fold_convert (type, arg1));
10230         }
10231       /* Fold (X & Y) ^ X as ~Y & X.  */
10232       if (TREE_CODE (arg0) == BIT_AND_EXPR
10233           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10234           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10235         {
10236           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10237           return fold_build2 (BIT_AND_EXPR, type,
10238                               fold_build1 (BIT_NOT_EXPR, type, tem),
10239                               fold_convert (type, arg1));
10240         }
10241       /* Fold X ^ (X & Y) as X & ~Y.  */
10242       if (TREE_CODE (arg1) == BIT_AND_EXPR
10243           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10244         {
10245           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10246           return fold_build2 (BIT_AND_EXPR, type,
10247                               fold_convert (type, arg0),
10248                               fold_build1 (BIT_NOT_EXPR, type, tem));
10249         }
10250       /* Fold X ^ (Y & X) as ~Y & X.  */
10251       if (TREE_CODE (arg1) == BIT_AND_EXPR
10252           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10253           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10254         {
10255           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10256           return fold_build2 (BIT_AND_EXPR, type,
10257                               fold_build1 (BIT_NOT_EXPR, type, tem),
10258                               fold_convert (type, arg0));
10259         }
10260
10261       /* See if this can be simplified into a rotate first.  If that
10262          is unsuccessful continue in the association code.  */
10263       goto bit_rotate;
10264
10265     case BIT_AND_EXPR:
10266       if (integer_all_onesp (arg1))
10267         return non_lvalue (fold_convert (type, arg0));
10268       if (integer_zerop (arg1))
10269         return omit_one_operand (type, arg1, arg0);
10270       if (operand_equal_p (arg0, arg1, 0))
10271         return non_lvalue (fold_convert (type, arg0));
10272
10273       /* ~X & X is always zero.  */
10274       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10275           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10276         return omit_one_operand (type, integer_zero_node, arg1);
10277
10278       /* X & ~X is always zero.  */
10279       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10280           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10281         return omit_one_operand (type, integer_zero_node, arg0);
10282
10283       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10284       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10285           && TREE_CODE (arg1) == INTEGER_CST
10286           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10287         return fold_build2 (BIT_IOR_EXPR, type,
10288                             fold_build2 (BIT_AND_EXPR, type,
10289                                          TREE_OPERAND (arg0, 0), arg1),
10290                             fold_build2 (BIT_AND_EXPR, type,
10291                                          TREE_OPERAND (arg0, 1), arg1));
10292
10293       /* (X | Y) & Y is (X, Y).  */
10294       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10295           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10296         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10297       /* (X | Y) & X is (Y, X).  */
10298       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10299           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10300           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10301         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10302       /* X & (X | Y) is (Y, X).  */
10303       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10304           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10305           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10306         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10307       /* X & (Y | X) is (Y, X).  */
10308       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10309           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10310           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10311         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10312
10313       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10314       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10315           && integer_onep (TREE_OPERAND (arg0, 1))
10316           && integer_onep (arg1))
10317         {
10318           tem = TREE_OPERAND (arg0, 0);
10319           return fold_build2 (EQ_EXPR, type,
10320                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10321                                            build_int_cst (TREE_TYPE (tem), 1)),
10322                               build_int_cst (TREE_TYPE (tem), 0));
10323         }
10324       /* Fold ~X & 1 as (X & 1) == 0.  */
10325       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10326           && integer_onep (arg1))
10327         {
10328           tem = TREE_OPERAND (arg0, 0);
10329           return fold_build2 (EQ_EXPR, type,
10330                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10331                                            build_int_cst (TREE_TYPE (tem), 1)),
10332                               build_int_cst (TREE_TYPE (tem), 0));
10333         }
10334
10335       /* Fold (X ^ Y) & Y as ~X & Y.  */
10336       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10337           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10338         {
10339           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10340           return fold_build2 (BIT_AND_EXPR, type, 
10341                               fold_build1 (BIT_NOT_EXPR, type, tem),
10342                               fold_convert (type, arg1));
10343         }
10344       /* Fold (X ^ Y) & X as ~Y & X.  */
10345       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10346           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10347           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10348         {
10349           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10350           return fold_build2 (BIT_AND_EXPR, type,
10351                               fold_build1 (BIT_NOT_EXPR, type, tem),
10352                               fold_convert (type, arg1));
10353         }
10354       /* Fold X & (X ^ Y) as X & ~Y.  */
10355       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10356           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10357         {
10358           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10359           return fold_build2 (BIT_AND_EXPR, type,
10360                               fold_convert (type, arg0),
10361                               fold_build1 (BIT_NOT_EXPR, type, tem));
10362         }
10363       /* Fold X & (Y ^ X) as ~Y & X.  */
10364       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10365           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10366           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10367         {
10368           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10369           return fold_build2 (BIT_AND_EXPR, type,
10370                               fold_build1 (BIT_NOT_EXPR, type, tem),
10371                               fold_convert (type, arg0));
10372         }
10373
10374       t1 = distribute_bit_expr (code, type, arg0, arg1);
10375       if (t1 != NULL_TREE)
10376         return t1;
10377       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10378       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10379           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10380         {
10381           unsigned int prec
10382             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10383
10384           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10385               && (~TREE_INT_CST_LOW (arg1)
10386                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10387             return fold_convert (type, TREE_OPERAND (arg0, 0));
10388         }
10389
10390       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10391
10392          This results in more efficient code for machines without a NOR
10393          instruction.  Combine will canonicalize to the first form
10394          which will allow use of NOR instructions provided by the
10395          backend if they exist.  */
10396       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10397           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10398         {
10399           return fold_build1 (BIT_NOT_EXPR, type,
10400                               build2 (BIT_IOR_EXPR, type,
10401                                       TREE_OPERAND (arg0, 0),
10402                                       TREE_OPERAND (arg1, 0)));
10403         }
10404
10405       goto associate;
10406
10407     case RDIV_EXPR:
10408       /* Don't touch a floating-point divide by zero unless the mode
10409          of the constant can represent infinity.  */
10410       if (TREE_CODE (arg1) == REAL_CST
10411           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10412           && real_zerop (arg1))
10413         return NULL_TREE;
10414
10415       /* Optimize A / A to 1.0 if we don't care about
10416          NaNs or Infinities.  Skip the transformation
10417          for non-real operands.  */
10418       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10419           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10420           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10421           && operand_equal_p (arg0, arg1, 0))
10422         {
10423           tree r = build_real (TREE_TYPE (arg0), dconst1);
10424
10425           return omit_two_operands (type, r, arg0, arg1);
10426         }
10427
10428       /* The complex version of the above A / A optimization.  */
10429       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10430           && operand_equal_p (arg0, arg1, 0))
10431         {
10432           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10433           if (! HONOR_NANS (TYPE_MODE (elem_type))
10434               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10435             {
10436               tree r = build_real (elem_type, dconst1);
10437               /* omit_two_operands will call fold_convert for us.  */
10438               return omit_two_operands (type, r, arg0, arg1);
10439             }
10440         }
10441
10442       /* (-A) / (-B) -> A / B  */
10443       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10444         return fold_build2 (RDIV_EXPR, type,
10445                             TREE_OPERAND (arg0, 0),
10446                             negate_expr (arg1));
10447       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10448         return fold_build2 (RDIV_EXPR, type,
10449                             negate_expr (arg0),
10450                             TREE_OPERAND (arg1, 0));
10451
10452       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10453       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10454           && real_onep (arg1))
10455         return non_lvalue (fold_convert (type, arg0));
10456
10457       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10458       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10459           && real_minus_onep (arg1))
10460         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10461
10462       /* If ARG1 is a constant, we can convert this to a multiply by the
10463          reciprocal.  This does not have the same rounding properties,
10464          so only do this if -funsafe-math-optimizations.  We can actually
10465          always safely do it if ARG1 is a power of two, but it's hard to
10466          tell if it is or not in a portable manner.  */
10467       if (TREE_CODE (arg1) == REAL_CST)
10468         {
10469           if (flag_unsafe_math_optimizations
10470               && 0 != (tem = const_binop (code, build_real (type, dconst1),
10471                                           arg1, 0)))
10472             return fold_build2 (MULT_EXPR, type, arg0, tem);
10473           /* Find the reciprocal if optimizing and the result is exact.  */
10474           if (optimize)
10475             {
10476               REAL_VALUE_TYPE r;
10477               r = TREE_REAL_CST (arg1);
10478               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10479                 {
10480                   tem = build_real (type, r);
10481                   return fold_build2 (MULT_EXPR, type,
10482                                       fold_convert (type, arg0), tem);
10483                 }
10484             }
10485         }
10486       /* Convert A/B/C to A/(B*C).  */
10487       if (flag_unsafe_math_optimizations
10488           && TREE_CODE (arg0) == RDIV_EXPR)
10489         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10490                             fold_build2 (MULT_EXPR, type,
10491                                          TREE_OPERAND (arg0, 1), arg1));
10492
10493       /* Convert A/(B/C) to (A/B)*C.  */
10494       if (flag_unsafe_math_optimizations
10495           && TREE_CODE (arg1) == RDIV_EXPR)
10496         return fold_build2 (MULT_EXPR, type,
10497                             fold_build2 (RDIV_EXPR, type, arg0,
10498                                          TREE_OPERAND (arg1, 0)),
10499                             TREE_OPERAND (arg1, 1));
10500
10501       /* Convert C1/(X*C2) into (C1/C2)/X.  */
10502       if (flag_unsafe_math_optimizations
10503           && TREE_CODE (arg1) == MULT_EXPR
10504           && TREE_CODE (arg0) == REAL_CST
10505           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10506         {
10507           tree tem = const_binop (RDIV_EXPR, arg0,
10508                                   TREE_OPERAND (arg1, 1), 0);
10509           if (tem)
10510             return fold_build2 (RDIV_EXPR, type, tem,
10511                                 TREE_OPERAND (arg1, 0));
10512         }
10513
10514       if (flag_unsafe_math_optimizations)
10515         {
10516           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10517           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10518
10519           /* Optimize sin(x)/cos(x) as tan(x).  */
10520           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10521                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10522                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10523               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10524                                   CALL_EXPR_ARG (arg1, 0), 0))
10525             {
10526               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10527
10528               if (tanfn != NULL_TREE)
10529                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10530             }
10531
10532           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
10533           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10534                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10535                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10536               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10537                                   CALL_EXPR_ARG (arg1, 0), 0))
10538             {
10539               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10540
10541               if (tanfn != NULL_TREE)
10542                 {
10543                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10544                   return fold_build2 (RDIV_EXPR, type,
10545                                       build_real (type, dconst1), tmp);
10546                 }
10547             }
10548
10549           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10550              NaNs or Infinities.  */
10551           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10552                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10553                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
10554             {
10555               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10556               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10557
10558               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10559                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10560                   && operand_equal_p (arg00, arg01, 0))
10561                 {
10562                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10563
10564                   if (cosfn != NULL_TREE)
10565                     return build_call_expr (cosfn, 1, arg00);
10566                 }
10567             }
10568
10569           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
10570              NaNs or Infinities.  */
10571           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
10572                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
10573                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
10574             {
10575               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10576               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10577
10578               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10579                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10580                   && operand_equal_p (arg00, arg01, 0))
10581                 {
10582                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10583
10584                   if (cosfn != NULL_TREE)
10585                     {
10586                       tree tmp = build_call_expr (cosfn, 1, arg00);
10587                       return fold_build2 (RDIV_EXPR, type,
10588                                           build_real (type, dconst1),
10589                                           tmp);
10590                     }
10591                 }
10592             }
10593
10594           /* Optimize pow(x,c)/x as pow(x,c-1).  */
10595           if (fcode0 == BUILT_IN_POW
10596               || fcode0 == BUILT_IN_POWF
10597               || fcode0 == BUILT_IN_POWL)
10598             {
10599               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10600               tree arg01 = CALL_EXPR_ARG (arg0, 1);
10601               if (TREE_CODE (arg01) == REAL_CST
10602                   && !TREE_OVERFLOW (arg01)
10603                   && operand_equal_p (arg1, arg00, 0))
10604                 {
10605                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10606                   REAL_VALUE_TYPE c;
10607                   tree arg;
10608
10609                   c = TREE_REAL_CST (arg01);
10610                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
10611                   arg = build_real (type, c);
10612                   return build_call_expr (powfn, 2, arg1, arg);
10613                 }
10614             }
10615
10616           /* Optimize x/expN(y) into x*expN(-y).  */
10617           if (BUILTIN_EXPONENT_P (fcode1))
10618             {
10619               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10620               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
10621               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
10622               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10623             }
10624
10625           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
10626           if (fcode1 == BUILT_IN_POW
10627               || fcode1 == BUILT_IN_POWF
10628               || fcode1 == BUILT_IN_POWL)
10629             {
10630               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10631               tree arg10 = CALL_EXPR_ARG (arg1, 0);
10632               tree arg11 = CALL_EXPR_ARG (arg1, 1);
10633               tree neg11 = fold_convert (type, negate_expr (arg11));
10634               arg1 = build_call_expr (powfn, 2, arg10, neg11);
10635               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10636             }
10637         }
10638       return NULL_TREE;
10639
10640     case TRUNC_DIV_EXPR:
10641     case FLOOR_DIV_EXPR:
10642       /* Simplify A / (B << N) where A and B are positive and B is
10643          a power of 2, to A >> (N + log2(B)).  */
10644       strict_overflow_p = false;
10645       if (TREE_CODE (arg1) == LSHIFT_EXPR
10646           && (TYPE_UNSIGNED (type)
10647               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10648         {
10649           tree sval = TREE_OPERAND (arg1, 0);
10650           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
10651             {
10652               tree sh_cnt = TREE_OPERAND (arg1, 1);
10653               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
10654
10655               if (strict_overflow_p)
10656                 fold_overflow_warning (("assuming signed overflow does not "
10657                                         "occur when simplifying A / (B << N)"),
10658                                        WARN_STRICT_OVERFLOW_MISC);
10659
10660               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
10661                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
10662               return fold_build2 (RSHIFT_EXPR, type,
10663                                   fold_convert (type, arg0), sh_cnt);
10664             }
10665         }
10666       /* Fall thru */
10667
10668     case ROUND_DIV_EXPR:
10669     case CEIL_DIV_EXPR:
10670     case EXACT_DIV_EXPR:
10671       if (integer_onep (arg1))
10672         return non_lvalue (fold_convert (type, arg0));
10673       if (integer_zerop (arg1))
10674         return NULL_TREE;
10675       /* X / -1 is -X.  */
10676       if (!TYPE_UNSIGNED (type)
10677           && TREE_CODE (arg1) == INTEGER_CST
10678           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10679           && TREE_INT_CST_HIGH (arg1) == -1)
10680         return fold_convert (type, negate_expr (arg0));
10681
10682       /* Convert -A / -B to A / B when the type is signed and overflow is
10683          undefined.  */
10684       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10685           && TREE_CODE (arg0) == NEGATE_EXPR
10686           && negate_expr_p (arg1))
10687         {
10688           if (INTEGRAL_TYPE_P (type))
10689             fold_overflow_warning (("assuming signed overflow does not occur "
10690                                     "when distributing negation across "
10691                                     "division"),
10692                                    WARN_STRICT_OVERFLOW_MISC);
10693           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10694                               negate_expr (arg1));
10695         }
10696       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10697           && TREE_CODE (arg1) == NEGATE_EXPR
10698           && negate_expr_p (arg0))
10699         {
10700           if (INTEGRAL_TYPE_P (type))
10701             fold_overflow_warning (("assuming signed overflow does not occur "
10702                                     "when distributing negation across "
10703                                     "division"),
10704                                    WARN_STRICT_OVERFLOW_MISC);
10705           return fold_build2 (code, type, negate_expr (arg0),
10706                               TREE_OPERAND (arg1, 0));
10707         }
10708
10709       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
10710          operation, EXACT_DIV_EXPR.
10711
10712          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
10713          At one time others generated faster code, it's not clear if they do
10714          after the last round to changes to the DIV code in expmed.c.  */
10715       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
10716           && multiple_of_p (type, arg0, arg1))
10717         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
10718
10719       strict_overflow_p = false;
10720       if (TREE_CODE (arg1) == INTEGER_CST
10721           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10722                                          &strict_overflow_p)))
10723         {
10724           if (strict_overflow_p)
10725             fold_overflow_warning (("assuming signed overflow does not occur "
10726                                     "when simplifying division"),
10727                                    WARN_STRICT_OVERFLOW_MISC);
10728           return fold_convert (type, tem);
10729         }
10730
10731       return NULL_TREE;
10732
10733     case CEIL_MOD_EXPR:
10734     case FLOOR_MOD_EXPR:
10735     case ROUND_MOD_EXPR:
10736     case TRUNC_MOD_EXPR:
10737       /* X % 1 is always zero, but be sure to preserve any side
10738          effects in X.  */
10739       if (integer_onep (arg1))
10740         return omit_one_operand (type, integer_zero_node, arg0);
10741
10742       /* X % 0, return X % 0 unchanged so that we can get the
10743          proper warnings and errors.  */
10744       if (integer_zerop (arg1))
10745         return NULL_TREE;
10746
10747       /* 0 % X is always zero, but be sure to preserve any side
10748          effects in X.  Place this after checking for X == 0.  */
10749       if (integer_zerop (arg0))
10750         return omit_one_operand (type, integer_zero_node, arg1);
10751
10752       /* X % -1 is zero.  */
10753       if (!TYPE_UNSIGNED (type)
10754           && TREE_CODE (arg1) == INTEGER_CST
10755           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10756           && TREE_INT_CST_HIGH (arg1) == -1)
10757         return omit_one_operand (type, integer_zero_node, arg0);
10758
10759       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
10760          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
10761       strict_overflow_p = false;
10762       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
10763           && (TYPE_UNSIGNED (type)
10764               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10765         {
10766           tree c = arg1;
10767           /* Also optimize A % (C << N)  where C is a power of 2,
10768              to A & ((C << N) - 1).  */
10769           if (TREE_CODE (arg1) == LSHIFT_EXPR)
10770             c = TREE_OPERAND (arg1, 0);
10771
10772           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
10773             {
10774               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
10775                                        build_int_cst (TREE_TYPE (arg1), 1));
10776               if (strict_overflow_p)
10777                 fold_overflow_warning (("assuming signed overflow does not "
10778                                         "occur when simplifying "
10779                                         "X % (power of two)"),
10780                                        WARN_STRICT_OVERFLOW_MISC);
10781               return fold_build2 (BIT_AND_EXPR, type,
10782                                   fold_convert (type, arg0),
10783                                   fold_convert (type, mask));
10784             }
10785         }
10786
10787       /* X % -C is the same as X % C.  */
10788       if (code == TRUNC_MOD_EXPR
10789           && !TYPE_UNSIGNED (type)
10790           && TREE_CODE (arg1) == INTEGER_CST
10791           && !TREE_OVERFLOW (arg1)
10792           && TREE_INT_CST_HIGH (arg1) < 0
10793           && !TYPE_OVERFLOW_TRAPS (type)
10794           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
10795           && !sign_bit_p (arg1, arg1))
10796         return fold_build2 (code, type, fold_convert (type, arg0),
10797                             fold_convert (type, negate_expr (arg1)));
10798
10799       /* X % -Y is the same as X % Y.  */
10800       if (code == TRUNC_MOD_EXPR
10801           && !TYPE_UNSIGNED (type)
10802           && TREE_CODE (arg1) == NEGATE_EXPR
10803           && !TYPE_OVERFLOW_TRAPS (type))
10804         return fold_build2 (code, type, fold_convert (type, arg0),
10805                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10806
10807       if (TREE_CODE (arg1) == INTEGER_CST
10808           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10809                                          &strict_overflow_p)))
10810         {
10811           if (strict_overflow_p)
10812             fold_overflow_warning (("assuming signed overflow does not occur "
10813                                     "when simplifying modulos"),
10814                                    WARN_STRICT_OVERFLOW_MISC);
10815           return fold_convert (type, tem);
10816         }
10817
10818       return NULL_TREE;
10819
10820     case LROTATE_EXPR:
10821     case RROTATE_EXPR:
10822       if (integer_all_onesp (arg0))
10823         return omit_one_operand (type, arg0, arg1);
10824       goto shift;
10825
10826     case RSHIFT_EXPR:
10827       /* Optimize -1 >> x for arithmetic right shifts.  */
10828       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
10829         return omit_one_operand (type, arg0, arg1);
10830       /* ... fall through ...  */
10831
10832     case LSHIFT_EXPR:
10833     shift:
10834       if (integer_zerop (arg1))
10835         return non_lvalue (fold_convert (type, arg0));
10836       if (integer_zerop (arg0))
10837         return omit_one_operand (type, arg0, arg1);
10838
10839       /* Since negative shift count is not well-defined,
10840          don't try to compute it in the compiler.  */
10841       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
10842         return NULL_TREE;
10843
10844       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
10845       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
10846           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10847           && host_integerp (TREE_OPERAND (arg0, 1), false)
10848           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10849         {
10850           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
10851                                + TREE_INT_CST_LOW (arg1));
10852
10853           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
10854              being well defined.  */
10855           if (low >= TYPE_PRECISION (type))
10856             {
10857               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
10858                 low = low % TYPE_PRECISION (type);
10859               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
10860                 return build_int_cst (type, 0);
10861               else
10862                 low = TYPE_PRECISION (type) - 1;
10863             }
10864
10865           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10866                               build_int_cst (type, low));
10867         }
10868
10869       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
10870          into x & ((unsigned)-1 >> c) for unsigned types.  */
10871       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
10872            || (TYPE_UNSIGNED (type)
10873                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
10874           && host_integerp (arg1, false)
10875           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10876           && host_integerp (TREE_OPERAND (arg0, 1), false)
10877           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10878         {
10879           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10880           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
10881           tree lshift;
10882           tree arg00;
10883
10884           if (low0 == low1)
10885             {
10886               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10887
10888               lshift = build_int_cst (type, -1);
10889               lshift = int_const_binop (code, lshift, arg1, 0);
10890
10891               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
10892             }
10893         }
10894
10895       /* Rewrite an LROTATE_EXPR by a constant into an
10896          RROTATE_EXPR by a new constant.  */
10897       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
10898         {
10899           tree tem = build_int_cst (TREE_TYPE (arg1),
10900                                     GET_MODE_BITSIZE (TYPE_MODE (type)));
10901           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
10902           return fold_build2 (RROTATE_EXPR, type, arg0, tem);
10903         }
10904
10905       /* If we have a rotate of a bit operation with the rotate count and
10906          the second operand of the bit operation both constant,
10907          permute the two operations.  */
10908       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10909           && (TREE_CODE (arg0) == BIT_AND_EXPR
10910               || TREE_CODE (arg0) == BIT_IOR_EXPR
10911               || TREE_CODE (arg0) == BIT_XOR_EXPR)
10912           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10913         return fold_build2 (TREE_CODE (arg0), type,
10914                             fold_build2 (code, type,
10915                                          TREE_OPERAND (arg0, 0), arg1),
10916                             fold_build2 (code, type,
10917                                          TREE_OPERAND (arg0, 1), arg1));
10918
10919       /* Two consecutive rotates adding up to the width of the mode can
10920          be ignored.  */
10921       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10922           && TREE_CODE (arg0) == RROTATE_EXPR
10923           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10924           && TREE_INT_CST_HIGH (arg1) == 0
10925           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
10926           && ((TREE_INT_CST_LOW (arg1)
10927                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
10928               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
10929         return TREE_OPERAND (arg0, 0);
10930
10931       return NULL_TREE;
10932
10933     case MIN_EXPR:
10934       if (operand_equal_p (arg0, arg1, 0))
10935         return omit_one_operand (type, arg0, arg1);
10936       if (INTEGRAL_TYPE_P (type)
10937           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
10938         return omit_one_operand (type, arg1, arg0);
10939       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
10940       if (tem)
10941         return tem;
10942       goto associate;
10943
10944     case MAX_EXPR:
10945       if (operand_equal_p (arg0, arg1, 0))
10946         return omit_one_operand (type, arg0, arg1);
10947       if (INTEGRAL_TYPE_P (type)
10948           && TYPE_MAX_VALUE (type)
10949           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
10950         return omit_one_operand (type, arg1, arg0);
10951       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
10952       if (tem)
10953         return tem;
10954       goto associate;
10955
10956     case TRUTH_ANDIF_EXPR:
10957       /* Note that the operands of this must be ints
10958          and their values must be 0 or 1.
10959          ("true" is a fixed value perhaps depending on the language.)  */
10960       /* If first arg is constant zero, return it.  */
10961       if (integer_zerop (arg0))
10962         return fold_convert (type, arg0);
10963     case TRUTH_AND_EXPR:
10964       /* If either arg is constant true, drop it.  */
10965       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10966         return non_lvalue (fold_convert (type, arg1));
10967       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
10968           /* Preserve sequence points.  */
10969           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
10970         return non_lvalue (fold_convert (type, arg0));
10971       /* If second arg is constant zero, result is zero, but first arg
10972          must be evaluated.  */
10973       if (integer_zerop (arg1))
10974         return omit_one_operand (type, arg1, arg0);
10975       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
10976          case will be handled here.  */
10977       if (integer_zerop (arg0))
10978         return omit_one_operand (type, arg0, arg1);
10979
10980       /* !X && X is always false.  */
10981       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10982           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10983         return omit_one_operand (type, integer_zero_node, arg1);
10984       /* X && !X is always false.  */
10985       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10986           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10987         return omit_one_operand (type, integer_zero_node, arg0);
10988
10989       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
10990          means A >= Y && A != MAX, but in this case we know that
10991          A < X <= MAX.  */
10992
10993       if (!TREE_SIDE_EFFECTS (arg0)
10994           && !TREE_SIDE_EFFECTS (arg1))
10995         {
10996           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
10997           if (tem && !operand_equal_p (tem, arg0, 0))
10998             return fold_build2 (code, type, tem, arg1);
10999
11000           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11001           if (tem && !operand_equal_p (tem, arg1, 0))
11002             return fold_build2 (code, type, arg0, tem);
11003         }
11004
11005     truth_andor:
11006       /* We only do these simplifications if we are optimizing.  */
11007       if (!optimize)
11008         return NULL_TREE;
11009
11010       /* Check for things like (A || B) && (A || C).  We can convert this
11011          to A || (B && C).  Note that either operator can be any of the four
11012          truth and/or operations and the transformation will still be
11013          valid.   Also note that we only care about order for the
11014          ANDIF and ORIF operators.  If B contains side effects, this
11015          might change the truth-value of A.  */
11016       if (TREE_CODE (arg0) == TREE_CODE (arg1)
11017           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11018               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11019               || TREE_CODE (arg0) == TRUTH_AND_EXPR
11020               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11021           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11022         {
11023           tree a00 = TREE_OPERAND (arg0, 0);
11024           tree a01 = TREE_OPERAND (arg0, 1);
11025           tree a10 = TREE_OPERAND (arg1, 0);
11026           tree a11 = TREE_OPERAND (arg1, 1);
11027           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11028                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11029                              && (code == TRUTH_AND_EXPR
11030                                  || code == TRUTH_OR_EXPR));
11031
11032           if (operand_equal_p (a00, a10, 0))
11033             return fold_build2 (TREE_CODE (arg0), type, a00,
11034                                 fold_build2 (code, type, a01, a11));
11035           else if (commutative && operand_equal_p (a00, a11, 0))
11036             return fold_build2 (TREE_CODE (arg0), type, a00,
11037                                 fold_build2 (code, type, a01, a10));
11038           else if (commutative && operand_equal_p (a01, a10, 0))
11039             return fold_build2 (TREE_CODE (arg0), type, a01,
11040                                 fold_build2 (code, type, a00, a11));
11041
11042           /* This case if tricky because we must either have commutative
11043              operators or else A10 must not have side-effects.  */
11044
11045           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11046                    && operand_equal_p (a01, a11, 0))
11047             return fold_build2 (TREE_CODE (arg0), type,
11048                                 fold_build2 (code, type, a00, a10),
11049                                 a01);
11050         }
11051
11052       /* See if we can build a range comparison.  */
11053       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11054         return tem;
11055
11056       /* Check for the possibility of merging component references.  If our
11057          lhs is another similar operation, try to merge its rhs with our
11058          rhs.  Then try to merge our lhs and rhs.  */
11059       if (TREE_CODE (arg0) == code
11060           && 0 != (tem = fold_truthop (code, type,
11061                                        TREE_OPERAND (arg0, 1), arg1)))
11062         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11063
11064       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11065         return tem;
11066
11067       return NULL_TREE;
11068
11069     case TRUTH_ORIF_EXPR:
11070       /* Note that the operands of this must be ints
11071          and their values must be 0 or true.
11072          ("true" is a fixed value perhaps depending on the language.)  */
11073       /* If first arg is constant true, return it.  */
11074       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11075         return fold_convert (type, arg0);
11076     case TRUTH_OR_EXPR:
11077       /* If either arg is constant zero, drop it.  */
11078       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11079         return non_lvalue (fold_convert (type, arg1));
11080       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11081           /* Preserve sequence points.  */
11082           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11083         return non_lvalue (fold_convert (type, arg0));
11084       /* If second arg is constant true, result is true, but we must
11085          evaluate first arg.  */
11086       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11087         return omit_one_operand (type, arg1, arg0);
11088       /* Likewise for first arg, but note this only occurs here for
11089          TRUTH_OR_EXPR.  */
11090       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11091         return omit_one_operand (type, arg0, arg1);
11092
11093       /* !X || X is always true.  */
11094       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11095           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11096         return omit_one_operand (type, integer_one_node, arg1);
11097       /* X || !X is always true.  */
11098       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11099           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11100         return omit_one_operand (type, integer_one_node, arg0);
11101
11102       goto truth_andor;
11103
11104     case TRUTH_XOR_EXPR:
11105       /* If the second arg is constant zero, drop it.  */
11106       if (integer_zerop (arg1))
11107         return non_lvalue (fold_convert (type, arg0));
11108       /* If the second arg is constant true, this is a logical inversion.  */
11109       if (integer_onep (arg1))
11110         {
11111           /* Only call invert_truthvalue if operand is a truth value.  */
11112           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11113             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11114           else
11115             tem = invert_truthvalue (arg0);
11116           return non_lvalue (fold_convert (type, tem));
11117         }
11118       /* Identical arguments cancel to zero.  */
11119       if (operand_equal_p (arg0, arg1, 0))
11120         return omit_one_operand (type, integer_zero_node, arg0);
11121
11122       /* !X ^ X is always true.  */
11123       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11124           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11125         return omit_one_operand (type, integer_one_node, arg1);
11126
11127       /* X ^ !X is always true.  */
11128       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11129           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11130         return omit_one_operand (type, integer_one_node, arg0);
11131
11132       return NULL_TREE;
11133
11134     case EQ_EXPR:
11135     case NE_EXPR:
11136       tem = fold_comparison (code, type, op0, op1);
11137       if (tem != NULL_TREE)
11138         return tem;
11139
11140       /* bool_var != 0 becomes bool_var. */
11141       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11142           && code == NE_EXPR)
11143         return non_lvalue (fold_convert (type, arg0));
11144
11145       /* bool_var == 1 becomes bool_var. */
11146       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11147           && code == EQ_EXPR)
11148         return non_lvalue (fold_convert (type, arg0));
11149
11150       /* bool_var != 1 becomes !bool_var. */
11151       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11152           && code == NE_EXPR)
11153         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11154
11155       /* bool_var == 0 becomes !bool_var. */
11156       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11157           && code == EQ_EXPR)
11158         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11159
11160       /* If this is an equality comparison of the address of two non-weak,
11161          unaliased symbols neither of which are extern (since we do not
11162          have access to attributes for externs), then we know the result.  */
11163       if (TREE_CODE (arg0) == ADDR_EXPR
11164           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11165           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11166           && ! lookup_attribute ("alias",
11167                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11168           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11169           && TREE_CODE (arg1) == ADDR_EXPR
11170           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11171           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11172           && ! lookup_attribute ("alias",
11173                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11174           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11175         {
11176           /* We know that we're looking at the address of two
11177              non-weak, unaliased, static _DECL nodes.
11178
11179              It is both wasteful and incorrect to call operand_equal_p
11180              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11181              all we need to do is test pointer equality for the arguments
11182              to the two ADDR_EXPR nodes.  It is incorrect to use
11183              operand_equal_p as that function is NOT equivalent to a
11184              C equality test.  It can in fact return false for two
11185              objects which would test as equal using the C equality
11186              operator.  */
11187           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11188           return constant_boolean_node (equal
11189                                         ? code == EQ_EXPR : code != EQ_EXPR,
11190                                         type);
11191         }
11192
11193       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11194          a MINUS_EXPR of a constant, we can convert it into a comparison with
11195          a revised constant as long as no overflow occurs.  */
11196       if (TREE_CODE (arg1) == INTEGER_CST
11197           && (TREE_CODE (arg0) == PLUS_EXPR
11198               || TREE_CODE (arg0) == MINUS_EXPR)
11199           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11200           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11201                                       ? MINUS_EXPR : PLUS_EXPR,
11202                                       fold_convert (TREE_TYPE (arg0), arg1),
11203                                       TREE_OPERAND (arg0, 1), 0))
11204           && !TREE_OVERFLOW (tem))
11205         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11206
11207       /* Similarly for a NEGATE_EXPR.  */
11208       if (TREE_CODE (arg0) == NEGATE_EXPR
11209           && TREE_CODE (arg1) == INTEGER_CST
11210           && 0 != (tem = negate_expr (arg1))
11211           && TREE_CODE (tem) == INTEGER_CST
11212           && !TREE_OVERFLOW (tem))
11213         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11214
11215       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11216       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11217           && TREE_CODE (arg1) == INTEGER_CST
11218           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11219         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11220                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11221                                          fold_convert (TREE_TYPE (arg0), arg1),
11222                                          TREE_OPERAND (arg0, 1)));
11223
11224       /* Transform comparisons of the form X +- C CMP X.  */
11225       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11226           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11227           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11228           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11229               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11230         {
11231           tree cst = TREE_OPERAND (arg0, 1);
11232
11233           if (code == EQ_EXPR
11234               && !integer_zerop (cst))
11235             return omit_two_operands (type, boolean_false_node,
11236                                       TREE_OPERAND (arg0, 0), arg1);
11237           else
11238             return omit_two_operands (type, boolean_true_node,
11239                                       TREE_OPERAND (arg0, 0), arg1);
11240         }
11241
11242       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11243          for !=.  Don't do this for ordered comparisons due to overflow.  */
11244       if (TREE_CODE (arg0) == MINUS_EXPR
11245           && integer_zerop (arg1))
11246         return fold_build2 (code, type,
11247                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11248
11249       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11250       if (TREE_CODE (arg0) == ABS_EXPR
11251           && (integer_zerop (arg1) || real_zerop (arg1)))
11252         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11253
11254       /* If this is an EQ or NE comparison with zero and ARG0 is
11255          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11256          two operations, but the latter can be done in one less insn
11257          on machines that have only two-operand insns or on which a
11258          constant cannot be the first operand.  */
11259       if (TREE_CODE (arg0) == BIT_AND_EXPR
11260           && integer_zerop (arg1))
11261         {
11262           tree arg00 = TREE_OPERAND (arg0, 0);
11263           tree arg01 = TREE_OPERAND (arg0, 1);
11264           if (TREE_CODE (arg00) == LSHIFT_EXPR
11265               && integer_onep (TREE_OPERAND (arg00, 0)))
11266             return
11267               fold_build2 (code, type,
11268                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11269                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11270                                            arg01, TREE_OPERAND (arg00, 1)),
11271                                    fold_convert (TREE_TYPE (arg0),
11272                                                  integer_one_node)),
11273                            arg1);
11274           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
11275                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
11276             return
11277               fold_build2 (code, type,
11278                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11279                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11280                                            arg00, TREE_OPERAND (arg01, 1)),
11281                                    fold_convert (TREE_TYPE (arg0),
11282                                                  integer_one_node)),
11283                            arg1);
11284         }
11285
11286       /* If this is an NE or EQ comparison of zero against the result of a
11287          signed MOD operation whose second operand is a power of 2, make
11288          the MOD operation unsigned since it is simpler and equivalent.  */
11289       if (integer_zerop (arg1)
11290           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11291           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11292               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11293               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11294               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11295           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11296         {
11297           tree newtype = lang_hooks.types.unsigned_type (TREE_TYPE (arg0));
11298           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11299                                      fold_convert (newtype,
11300                                                    TREE_OPERAND (arg0, 0)),
11301                                      fold_convert (newtype,
11302                                                    TREE_OPERAND (arg0, 1)));
11303
11304           return fold_build2 (code, type, newmod,
11305                               fold_convert (newtype, arg1));
11306         }
11307
11308       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11309          C1 is a valid shift constant, and C2 is a power of two, i.e.
11310          a single bit.  */
11311       if (TREE_CODE (arg0) == BIT_AND_EXPR
11312           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11313           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11314              == INTEGER_CST
11315           && integer_pow2p (TREE_OPERAND (arg0, 1))
11316           && integer_zerop (arg1))
11317         {
11318           tree itype = TREE_TYPE (arg0);
11319           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11320           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11321
11322           /* Check for a valid shift count.  */
11323           if (TREE_INT_CST_HIGH (arg001) == 0
11324               && TREE_INT_CST_LOW (arg001) < prec)
11325             {
11326               tree arg01 = TREE_OPERAND (arg0, 1);
11327               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11328               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11329               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11330                  can be rewritten as (X & (C2 << C1)) != 0.  */
11331               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11332                 {
11333                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11334                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11335                   return fold_build2 (code, type, tem, arg1);
11336                 }
11337               /* Otherwise, for signed (arithmetic) shifts,
11338                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11339                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11340               else if (!TYPE_UNSIGNED (itype))
11341                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11342                                     arg000, build_int_cst (itype, 0));
11343               /* Otherwise, of unsigned (logical) shifts,
11344                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11345                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11346               else
11347                 return omit_one_operand (type,
11348                                          code == EQ_EXPR ? integer_one_node
11349                                                          : integer_zero_node,
11350                                          arg000);
11351             }
11352         }
11353
11354       /* If this is an NE comparison of zero with an AND of one, remove the
11355          comparison since the AND will give the correct value.  */
11356       if (code == NE_EXPR
11357           && integer_zerop (arg1)
11358           && TREE_CODE (arg0) == BIT_AND_EXPR
11359           && integer_onep (TREE_OPERAND (arg0, 1)))
11360         return fold_convert (type, arg0);
11361
11362       /* If we have (A & C) == C where C is a power of 2, convert this into
11363          (A & C) != 0.  Similarly for NE_EXPR.  */
11364       if (TREE_CODE (arg0) == BIT_AND_EXPR
11365           && integer_pow2p (TREE_OPERAND (arg0, 1))
11366           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11367         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11368                             arg0, fold_convert (TREE_TYPE (arg0),
11369                                                 integer_zero_node));
11370
11371       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11372          bit, then fold the expression into A < 0 or A >= 0.  */
11373       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11374       if (tem)
11375         return tem;
11376
11377       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11378          Similarly for NE_EXPR.  */
11379       if (TREE_CODE (arg0) == BIT_AND_EXPR
11380           && TREE_CODE (arg1) == INTEGER_CST
11381           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11382         {
11383           tree notc = fold_build1 (BIT_NOT_EXPR,
11384                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11385                                    TREE_OPERAND (arg0, 1));
11386           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11387                                        arg1, notc);
11388           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11389           if (integer_nonzerop (dandnotc))
11390             return omit_one_operand (type, rslt, arg0);
11391         }
11392
11393       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11394          Similarly for NE_EXPR.  */
11395       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11396           && TREE_CODE (arg1) == INTEGER_CST
11397           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11398         {
11399           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11400           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11401                                        TREE_OPERAND (arg0, 1), notd);
11402           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11403           if (integer_nonzerop (candnotd))
11404             return omit_one_operand (type, rslt, arg0);
11405         }
11406
11407       /* If this is a comparison of a field, we may be able to simplify it.  */
11408       if ((TREE_CODE (arg0) == COMPONENT_REF
11409            || TREE_CODE (arg0) == BIT_FIELD_REF)
11410           /* Handle the constant case even without -O
11411              to make sure the warnings are given.  */
11412           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
11413         {
11414           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
11415           if (t1)
11416             return t1;
11417         }
11418
11419       /* Optimize comparisons of strlen vs zero to a compare of the
11420          first character of the string vs zero.  To wit,
11421                 strlen(ptr) == 0   =>  *ptr == 0
11422                 strlen(ptr) != 0   =>  *ptr != 0
11423          Other cases should reduce to one of these two (or a constant)
11424          due to the return value of strlen being unsigned.  */
11425       if (TREE_CODE (arg0) == CALL_EXPR
11426           && integer_zerop (arg1))
11427         {
11428           tree fndecl = get_callee_fndecl (arg0);
11429
11430           if (fndecl
11431               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11432               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11433               && call_expr_nargs (arg0) == 1
11434               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11435             {
11436               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11437               return fold_build2 (code, type, iref,
11438                                   build_int_cst (TREE_TYPE (iref), 0));
11439             }
11440         }
11441
11442       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11443          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
11444       if (TREE_CODE (arg0) == RSHIFT_EXPR
11445           && integer_zerop (arg1)
11446           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11447         {
11448           tree arg00 = TREE_OPERAND (arg0, 0);
11449           tree arg01 = TREE_OPERAND (arg0, 1);
11450           tree itype = TREE_TYPE (arg00);
11451           if (TREE_INT_CST_HIGH (arg01) == 0
11452               && TREE_INT_CST_LOW (arg01)
11453                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11454             {
11455               if (TYPE_UNSIGNED (itype))
11456                 {
11457                   itype = lang_hooks.types.signed_type (itype);
11458                   arg00 = fold_convert (itype, arg00);
11459                 }
11460               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11461                                   type, arg00, build_int_cst (itype, 0));
11462             }
11463         }
11464
11465       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
11466       if (integer_zerop (arg1)
11467           && TREE_CODE (arg0) == BIT_XOR_EXPR)
11468         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11469                             TREE_OPERAND (arg0, 1));
11470
11471       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
11472       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11473           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11474         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11475                             build_int_cst (TREE_TYPE (arg1), 0));
11476       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
11477       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11478           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11479           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11480         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11481                             build_int_cst (TREE_TYPE (arg1), 0));
11482
11483       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
11484       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11485           && TREE_CODE (arg1) == INTEGER_CST
11486           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11487         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11488                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11489                                          TREE_OPERAND (arg0, 1), arg1));
11490
11491       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11492          (X & C) == 0 when C is a single bit.  */
11493       if (TREE_CODE (arg0) == BIT_AND_EXPR
11494           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11495           && integer_zerop (arg1)
11496           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11497         {
11498           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11499                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11500                              TREE_OPERAND (arg0, 1));
11501           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11502                               type, tem, arg1);
11503         }
11504
11505       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11506          constant C is a power of two, i.e. a single bit.  */
11507       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11508           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11509           && integer_zerop (arg1)
11510           && integer_pow2p (TREE_OPERAND (arg0, 1))
11511           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11512                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11513         {
11514           tree arg00 = TREE_OPERAND (arg0, 0);
11515           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11516                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
11517         }
11518
11519       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
11520          when is C is a power of two, i.e. a single bit.  */
11521       if (TREE_CODE (arg0) == BIT_AND_EXPR
11522           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
11523           && integer_zerop (arg1)
11524           && integer_pow2p (TREE_OPERAND (arg0, 1))
11525           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11526                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11527         {
11528           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11529           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
11530                              arg000, TREE_OPERAND (arg0, 1));
11531           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11532                               tem, build_int_cst (TREE_TYPE (tem), 0));
11533         }
11534
11535       if (integer_zerop (arg1)
11536           && tree_expr_nonzero_p (arg0))
11537         {
11538           tree res = constant_boolean_node (code==NE_EXPR, type);
11539           return omit_one_operand (type, res, arg0);
11540         }
11541
11542       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
11543       if (TREE_CODE (arg0) == NEGATE_EXPR
11544           && TREE_CODE (arg1) == NEGATE_EXPR)
11545         return fold_build2 (code, type,
11546                             TREE_OPERAND (arg0, 0),
11547                             TREE_OPERAND (arg1, 0));
11548
11549       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
11550       if (TREE_CODE (arg0) == BIT_AND_EXPR
11551           && TREE_CODE (arg1) == BIT_AND_EXPR)
11552         {
11553           tree arg00 = TREE_OPERAND (arg0, 0);
11554           tree arg01 = TREE_OPERAND (arg0, 1);
11555           tree arg10 = TREE_OPERAND (arg1, 0);
11556           tree arg11 = TREE_OPERAND (arg1, 1);
11557           tree itype = TREE_TYPE (arg0);
11558
11559           if (operand_equal_p (arg01, arg11, 0))
11560             return fold_build2 (code, type,
11561                                 fold_build2 (BIT_AND_EXPR, itype,
11562                                              fold_build2 (BIT_XOR_EXPR, itype,
11563                                                           arg00, arg10),
11564                                              arg01),
11565                                 build_int_cst (itype, 0));
11566
11567           if (operand_equal_p (arg01, arg10, 0))
11568             return fold_build2 (code, type,
11569                                 fold_build2 (BIT_AND_EXPR, itype,
11570                                              fold_build2 (BIT_XOR_EXPR, itype,
11571                                                           arg00, arg11),
11572                                              arg01),
11573                                 build_int_cst (itype, 0));
11574
11575           if (operand_equal_p (arg00, arg11, 0))
11576             return fold_build2 (code, type,
11577                                 fold_build2 (BIT_AND_EXPR, itype,
11578                                              fold_build2 (BIT_XOR_EXPR, itype,
11579                                                           arg01, arg10),
11580                                              arg00),
11581                                 build_int_cst (itype, 0));
11582
11583           if (operand_equal_p (arg00, arg10, 0))
11584             return fold_build2 (code, type,
11585                                 fold_build2 (BIT_AND_EXPR, itype,
11586                                              fold_build2 (BIT_XOR_EXPR, itype,
11587                                                           arg01, arg11),
11588                                              arg00),
11589                                 build_int_cst (itype, 0));
11590         }
11591
11592       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11593           && TREE_CODE (arg1) == BIT_XOR_EXPR)
11594         {
11595           tree arg00 = TREE_OPERAND (arg0, 0);
11596           tree arg01 = TREE_OPERAND (arg0, 1);
11597           tree arg10 = TREE_OPERAND (arg1, 0);
11598           tree arg11 = TREE_OPERAND (arg1, 1);
11599           tree itype = TREE_TYPE (arg0);
11600
11601           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
11602              operand_equal_p guarantees no side-effects so we don't need
11603              to use omit_one_operand on Z.  */
11604           if (operand_equal_p (arg01, arg11, 0))
11605             return fold_build2 (code, type, arg00, arg10);
11606           if (operand_equal_p (arg01, arg10, 0))
11607             return fold_build2 (code, type, arg00, arg11);
11608           if (operand_equal_p (arg00, arg11, 0))
11609             return fold_build2 (code, type, arg01, arg10);
11610           if (operand_equal_p (arg00, arg10, 0))
11611             return fold_build2 (code, type, arg01, arg11);
11612
11613           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
11614           if (TREE_CODE (arg01) == INTEGER_CST
11615               && TREE_CODE (arg11) == INTEGER_CST)
11616             return fold_build2 (code, type,
11617                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
11618                                              fold_build2 (BIT_XOR_EXPR, itype,
11619                                                           arg01, arg11)),
11620                                 arg10);
11621         }
11622
11623       /* Attempt to simplify equality/inequality comparisons of complex
11624          values.  Only lower the comparison if the result is known or
11625          can be simplified to a single scalar comparison.  */
11626       if ((TREE_CODE (arg0) == COMPLEX_EXPR
11627            || TREE_CODE (arg0) == COMPLEX_CST)
11628           && (TREE_CODE (arg1) == COMPLEX_EXPR
11629               || TREE_CODE (arg1) == COMPLEX_CST))
11630         {
11631           tree real0, imag0, real1, imag1;
11632           tree rcond, icond;
11633
11634           if (TREE_CODE (arg0) == COMPLEX_EXPR)
11635             {
11636               real0 = TREE_OPERAND (arg0, 0);
11637               imag0 = TREE_OPERAND (arg0, 1);
11638             }
11639           else
11640             {
11641               real0 = TREE_REALPART (arg0);
11642               imag0 = TREE_IMAGPART (arg0);
11643             }
11644
11645           if (TREE_CODE (arg1) == COMPLEX_EXPR)
11646             {
11647               real1 = TREE_OPERAND (arg1, 0);
11648               imag1 = TREE_OPERAND (arg1, 1);
11649             }
11650           else
11651             {
11652               real1 = TREE_REALPART (arg1);
11653               imag1 = TREE_IMAGPART (arg1);
11654             }
11655
11656           rcond = fold_binary (code, type, real0, real1);
11657           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
11658             {
11659               if (integer_zerop (rcond))
11660                 {
11661                   if (code == EQ_EXPR)
11662                     return omit_two_operands (type, boolean_false_node,
11663                                               imag0, imag1);
11664                   return fold_build2 (NE_EXPR, type, imag0, imag1);
11665                 }
11666               else
11667                 {
11668                   if (code == NE_EXPR)
11669                     return omit_two_operands (type, boolean_true_node,
11670                                               imag0, imag1);
11671                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
11672                 }
11673             }
11674
11675           icond = fold_binary (code, type, imag0, imag1);
11676           if (icond && TREE_CODE (icond) == INTEGER_CST)
11677             {
11678               if (integer_zerop (icond))
11679                 {
11680                   if (code == EQ_EXPR)
11681                     return omit_two_operands (type, boolean_false_node,
11682                                               real0, real1);
11683                   return fold_build2 (NE_EXPR, type, real0, real1);
11684                 }
11685               else
11686                 {
11687                   if (code == NE_EXPR)
11688                     return omit_two_operands (type, boolean_true_node,
11689                                               real0, real1);
11690                   return fold_build2 (EQ_EXPR, type, real0, real1);
11691                 }
11692             }
11693         }
11694
11695       return NULL_TREE;
11696
11697     case LT_EXPR:
11698     case GT_EXPR:
11699     case LE_EXPR:
11700     case GE_EXPR:
11701       tem = fold_comparison (code, type, op0, op1);
11702       if (tem != NULL_TREE)
11703         return tem;
11704
11705       /* Transform comparisons of the form X +- C CMP X.  */
11706       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11707           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11708           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
11709                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
11710               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11711                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
11712         {
11713           tree arg01 = TREE_OPERAND (arg0, 1);
11714           enum tree_code code0 = TREE_CODE (arg0);
11715           int is_positive;
11716
11717           if (TREE_CODE (arg01) == REAL_CST)
11718             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
11719           else
11720             is_positive = tree_int_cst_sgn (arg01);
11721
11722           /* (X - c) > X becomes false.  */
11723           if (code == GT_EXPR
11724               && ((code0 == MINUS_EXPR && is_positive >= 0)
11725                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11726             {
11727               if (TREE_CODE (arg01) == INTEGER_CST
11728                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11729                 fold_overflow_warning (("assuming signed overflow does not "
11730                                         "occur when assuming that (X - c) > X "
11731                                         "is always false"),
11732                                        WARN_STRICT_OVERFLOW_ALL);
11733               return constant_boolean_node (0, type);
11734             }
11735
11736           /* Likewise (X + c) < X becomes false.  */
11737           if (code == LT_EXPR
11738               && ((code0 == PLUS_EXPR && is_positive >= 0)
11739                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11740             {
11741               if (TREE_CODE (arg01) == INTEGER_CST
11742                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11743                 fold_overflow_warning (("assuming signed overflow does not "
11744                                         "occur when assuming that "
11745                                         "(X + c) < X is always false"),
11746                                        WARN_STRICT_OVERFLOW_ALL);
11747               return constant_boolean_node (0, type);
11748             }
11749
11750           /* Convert (X - c) <= X to true.  */
11751           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11752               && code == LE_EXPR
11753               && ((code0 == MINUS_EXPR && is_positive >= 0)
11754                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11755             {
11756               if (TREE_CODE (arg01) == INTEGER_CST
11757                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11758                 fold_overflow_warning (("assuming signed overflow does not "
11759                                         "occur when assuming that "
11760                                         "(X - c) <= X is always true"),
11761                                        WARN_STRICT_OVERFLOW_ALL);
11762               return constant_boolean_node (1, type);
11763             }
11764
11765           /* Convert (X + c) >= X to true.  */
11766           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11767               && code == GE_EXPR
11768               && ((code0 == PLUS_EXPR && is_positive >= 0)
11769                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11770             {
11771               if (TREE_CODE (arg01) == INTEGER_CST
11772                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11773                 fold_overflow_warning (("assuming signed overflow does not "
11774                                         "occur when assuming that "
11775                                         "(X + c) >= X is always true"),
11776                                        WARN_STRICT_OVERFLOW_ALL);
11777               return constant_boolean_node (1, type);
11778             }
11779
11780           if (TREE_CODE (arg01) == INTEGER_CST)
11781             {
11782               /* Convert X + c > X and X - c < X to true for integers.  */
11783               if (code == GT_EXPR
11784                   && ((code0 == PLUS_EXPR && is_positive > 0)
11785                       || (code0 == MINUS_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 true"),
11791                                            WARN_STRICT_OVERFLOW_ALL);
11792                   return constant_boolean_node (1, type);
11793                 }
11794
11795               if (code == LT_EXPR
11796                   && ((code0 == MINUS_EXPR && is_positive > 0)
11797                       || (code0 == PLUS_EXPR && is_positive < 0)))
11798                 {
11799                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11800                     fold_overflow_warning (("assuming signed overflow does "
11801                                             "not occur when assuming that "
11802                                             "(X - c) < X is always true"),
11803                                            WARN_STRICT_OVERFLOW_ALL);
11804                   return constant_boolean_node (1, type);
11805                 }
11806
11807               /* Convert X + c <= X and X - c >= X to false for integers.  */
11808               if (code == LE_EXPR
11809                   && ((code0 == PLUS_EXPR && is_positive > 0)
11810                       || (code0 == MINUS_EXPR && is_positive < 0)))
11811                 {
11812                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11813                     fold_overflow_warning (("assuming signed overflow does "
11814                                             "not occur when assuming that "
11815                                             "(X + c) <= X is always false"),
11816                                            WARN_STRICT_OVERFLOW_ALL);
11817                   return constant_boolean_node (0, type);
11818                 }
11819
11820               if (code == GE_EXPR
11821                   && ((code0 == MINUS_EXPR && is_positive > 0)
11822                       || (code0 == PLUS_EXPR && is_positive < 0)))
11823                 {
11824                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11825                     fold_overflow_warning (("assuming signed overflow does "
11826                                             "not occur when assuming that "
11827                                             "(X - c) >= X is always false"),
11828                                            WARN_STRICT_OVERFLOW_ALL);
11829                   return constant_boolean_node (0, type);
11830                 }
11831             }
11832         }
11833
11834       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
11835          This transformation affects the cases which are handled in later
11836          optimizations involving comparisons with non-negative constants.  */
11837       if (TREE_CODE (arg1) == INTEGER_CST
11838           && TREE_CODE (arg0) != INTEGER_CST
11839           && tree_int_cst_sgn (arg1) > 0)
11840         {
11841           if (code == GE_EXPR)
11842             {
11843               arg1 = const_binop (MINUS_EXPR, arg1,
11844                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11845               return fold_build2 (GT_EXPR, type, arg0,
11846                                   fold_convert (TREE_TYPE (arg0), arg1));
11847             }
11848           if (code == LT_EXPR)
11849             {
11850               arg1 = const_binop (MINUS_EXPR, arg1,
11851                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11852               return fold_build2 (LE_EXPR, type, arg0,
11853                                   fold_convert (TREE_TYPE (arg0), arg1));
11854             }
11855         }
11856
11857       /* Comparisons with the highest or lowest possible integer of
11858          the specified precision will have known values.  */
11859       {
11860         tree arg1_type = TREE_TYPE (arg1);
11861         unsigned int width = TYPE_PRECISION (arg1_type);
11862
11863         if (TREE_CODE (arg1) == INTEGER_CST
11864             && !TREE_OVERFLOW (arg1)
11865             && width <= 2 * HOST_BITS_PER_WIDE_INT
11866             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
11867           {
11868             HOST_WIDE_INT signed_max_hi;
11869             unsigned HOST_WIDE_INT signed_max_lo;
11870             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
11871
11872             if (width <= HOST_BITS_PER_WIDE_INT)
11873               {
11874                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11875                                 - 1;
11876                 signed_max_hi = 0;
11877                 max_hi = 0;
11878
11879                 if (TYPE_UNSIGNED (arg1_type))
11880                   {
11881                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11882                     min_lo = 0;
11883                     min_hi = 0;
11884                   }
11885                 else
11886                   {
11887                     max_lo = signed_max_lo;
11888                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11889                     min_hi = -1;
11890                   }
11891               }
11892             else
11893               {
11894                 width -= HOST_BITS_PER_WIDE_INT;
11895                 signed_max_lo = -1;
11896                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11897                                 - 1;
11898                 max_lo = -1;
11899                 min_lo = 0;
11900
11901                 if (TYPE_UNSIGNED (arg1_type))
11902                   {
11903                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11904                     min_hi = 0;
11905                   }
11906                 else
11907                   {
11908                     max_hi = signed_max_hi;
11909                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11910                   }
11911               }
11912
11913             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
11914                 && TREE_INT_CST_LOW (arg1) == max_lo)
11915               switch (code)
11916                 {
11917                 case GT_EXPR:
11918                   return omit_one_operand (type, integer_zero_node, arg0);
11919
11920                 case GE_EXPR:
11921                   return fold_build2 (EQ_EXPR, type, op0, op1);
11922
11923                 case LE_EXPR:
11924                   return omit_one_operand (type, integer_one_node, arg0);
11925
11926                 case LT_EXPR:
11927                   return fold_build2 (NE_EXPR, type, op0, op1);
11928
11929                 /* The GE_EXPR and LT_EXPR cases above are not normally
11930                    reached because of previous transformations.  */
11931
11932                 default:
11933                   break;
11934                 }
11935             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11936                      == max_hi
11937                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
11938               switch (code)
11939                 {
11940                 case GT_EXPR:
11941                   arg1 = const_binop (PLUS_EXPR, arg1,
11942                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11943                   return fold_build2 (EQ_EXPR, type,
11944                                       fold_convert (TREE_TYPE (arg1), arg0),
11945                                       arg1);
11946                 case LE_EXPR:
11947                   arg1 = const_binop (PLUS_EXPR, arg1,
11948                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11949                   return fold_build2 (NE_EXPR, type,
11950                                       fold_convert (TREE_TYPE (arg1), arg0),
11951                                       arg1);
11952                 default:
11953                   break;
11954                 }
11955             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11956                      == min_hi
11957                      && TREE_INT_CST_LOW (arg1) == min_lo)
11958               switch (code)
11959                 {
11960                 case LT_EXPR:
11961                   return omit_one_operand (type, integer_zero_node, arg0);
11962
11963                 case LE_EXPR:
11964                   return fold_build2 (EQ_EXPR, type, op0, op1);
11965
11966                 case GE_EXPR:
11967                   return omit_one_operand (type, integer_one_node, arg0);
11968
11969                 case GT_EXPR:
11970                   return fold_build2 (NE_EXPR, type, op0, op1);
11971
11972                 default:
11973                   break;
11974                 }
11975             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11976                      == min_hi
11977                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
11978               switch (code)
11979                 {
11980                 case GE_EXPR:
11981                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11982                   return fold_build2 (NE_EXPR, type,
11983                                       fold_convert (TREE_TYPE (arg1), arg0),
11984                                       arg1);
11985                 case LT_EXPR:
11986                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11987                   return fold_build2 (EQ_EXPR, type,
11988                                       fold_convert (TREE_TYPE (arg1), arg0),
11989                                       arg1);
11990                 default:
11991                   break;
11992                 }
11993
11994             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
11995                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
11996                      && TYPE_UNSIGNED (arg1_type)
11997                      /* We will flip the signedness of the comparison operator
11998                         associated with the mode of arg1, so the sign bit is
11999                         specified by this mode.  Check that arg1 is the signed
12000                         max associated with this sign bit.  */
12001                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12002                      /* signed_type does not work on pointer types.  */
12003                      && INTEGRAL_TYPE_P (arg1_type))
12004               {
12005                 /* The following case also applies to X < signed_max+1
12006                    and X >= signed_max+1 because previous transformations.  */
12007                 if (code == LE_EXPR || code == GT_EXPR)
12008                   {
12009                     tree st;
12010                     st = lang_hooks.types.signed_type (TREE_TYPE (arg1));
12011                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12012                                         type, fold_convert (st, arg0),
12013                                         build_int_cst (st, 0));
12014                   }
12015               }
12016           }
12017       }
12018
12019       /* If we are comparing an ABS_EXPR with a constant, we can
12020          convert all the cases into explicit comparisons, but they may
12021          well not be faster than doing the ABS and one comparison.
12022          But ABS (X) <= C is a range comparison, which becomes a subtraction
12023          and a comparison, and is probably faster.  */
12024       if (code == LE_EXPR
12025           && TREE_CODE (arg1) == INTEGER_CST
12026           && TREE_CODE (arg0) == ABS_EXPR
12027           && ! TREE_SIDE_EFFECTS (arg0)
12028           && (0 != (tem = negate_expr (arg1)))
12029           && TREE_CODE (tem) == INTEGER_CST
12030           && !TREE_OVERFLOW (tem))
12031         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12032                             build2 (GE_EXPR, type,
12033                                     TREE_OPERAND (arg0, 0), tem),
12034                             build2 (LE_EXPR, type,
12035                                     TREE_OPERAND (arg0, 0), arg1));
12036
12037       /* Convert ABS_EXPR<x> >= 0 to true.  */
12038       strict_overflow_p = false;
12039       if (code == GE_EXPR
12040           && (integer_zerop (arg1)
12041               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12042                   && real_zerop (arg1)))
12043           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12044         {
12045           if (strict_overflow_p)
12046             fold_overflow_warning (("assuming signed overflow does not occur "
12047                                     "when simplifying comparison of "
12048                                     "absolute value and zero"),
12049                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12050           return omit_one_operand (type, integer_one_node, arg0);
12051         }
12052
12053       /* Convert ABS_EXPR<x> < 0 to false.  */
12054       strict_overflow_p = false;
12055       if (code == LT_EXPR
12056           && (integer_zerop (arg1) || real_zerop (arg1))
12057           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12058         {
12059           if (strict_overflow_p)
12060             fold_overflow_warning (("assuming signed overflow does not occur "
12061                                     "when simplifying comparison of "
12062                                     "absolute value and zero"),
12063                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12064           return omit_one_operand (type, integer_zero_node, arg0);
12065         }
12066
12067       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12068          and similarly for >= into !=.  */
12069       if ((code == LT_EXPR || code == GE_EXPR)
12070           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12071           && TREE_CODE (arg1) == LSHIFT_EXPR
12072           && integer_onep (TREE_OPERAND (arg1, 0)))
12073         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12074                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12075                                TREE_OPERAND (arg1, 1)),
12076                        build_int_cst (TREE_TYPE (arg0), 0));
12077
12078       if ((code == LT_EXPR || code == GE_EXPR)
12079           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12080           && (TREE_CODE (arg1) == NOP_EXPR
12081               || TREE_CODE (arg1) == CONVERT_EXPR)
12082           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12083           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12084         return
12085           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12086                   fold_convert (TREE_TYPE (arg0),
12087                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12088                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12089                                                       1))),
12090                   build_int_cst (TREE_TYPE (arg0), 0));
12091
12092       return NULL_TREE;
12093
12094     case UNORDERED_EXPR:
12095     case ORDERED_EXPR:
12096     case UNLT_EXPR:
12097     case UNLE_EXPR:
12098     case UNGT_EXPR:
12099     case UNGE_EXPR:
12100     case UNEQ_EXPR:
12101     case LTGT_EXPR:
12102       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12103         {
12104           t1 = fold_relational_const (code, type, arg0, arg1);
12105           if (t1 != NULL_TREE)
12106             return t1;
12107         }
12108
12109       /* If the first operand is NaN, the result is constant.  */
12110       if (TREE_CODE (arg0) == REAL_CST
12111           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12112           && (code != LTGT_EXPR || ! flag_trapping_math))
12113         {
12114           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12115                ? integer_zero_node
12116                : integer_one_node;
12117           return omit_one_operand (type, t1, arg1);
12118         }
12119
12120       /* If the second operand is NaN, the result is constant.  */
12121       if (TREE_CODE (arg1) == REAL_CST
12122           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12123           && (code != LTGT_EXPR || ! flag_trapping_math))
12124         {
12125           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12126                ? integer_zero_node
12127                : integer_one_node;
12128           return omit_one_operand (type, t1, arg0);
12129         }
12130
12131       /* Simplify unordered comparison of something with itself.  */
12132       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12133           && operand_equal_p (arg0, arg1, 0))
12134         return constant_boolean_node (1, type);
12135
12136       if (code == LTGT_EXPR
12137           && !flag_trapping_math
12138           && operand_equal_p (arg0, arg1, 0))
12139         return constant_boolean_node (0, type);
12140
12141       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12142       {
12143         tree targ0 = strip_float_extensions (arg0);
12144         tree targ1 = strip_float_extensions (arg1);
12145         tree newtype = TREE_TYPE (targ0);
12146
12147         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12148           newtype = TREE_TYPE (targ1);
12149
12150         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12151           return fold_build2 (code, type, fold_convert (newtype, targ0),
12152                               fold_convert (newtype, targ1));
12153       }
12154
12155       return NULL_TREE;
12156
12157     case COMPOUND_EXPR:
12158       /* When pedantic, a compound expression can be neither an lvalue
12159          nor an integer constant expression.  */
12160       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12161         return NULL_TREE;
12162       /* Don't let (0, 0) be null pointer constant.  */
12163       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12164                                  : fold_convert (type, arg1);
12165       return pedantic_non_lvalue (tem);
12166
12167     case COMPLEX_EXPR:
12168       if ((TREE_CODE (arg0) == REAL_CST
12169            && TREE_CODE (arg1) == REAL_CST)
12170           || (TREE_CODE (arg0) == INTEGER_CST
12171               && TREE_CODE (arg1) == INTEGER_CST))
12172         return build_complex (type, arg0, arg1);
12173       return NULL_TREE;
12174
12175     case ASSERT_EXPR:
12176       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12177       gcc_unreachable ();
12178
12179     default:
12180       return NULL_TREE;
12181     } /* switch (code) */
12182 }
12183
12184 /* Callback for walk_tree, looking for LABEL_EXPR.
12185    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12186    Do not check the sub-tree of GOTO_EXPR.  */
12187
12188 static tree
12189 contains_label_1 (tree *tp,
12190                   int *walk_subtrees,
12191                   void *data ATTRIBUTE_UNUSED)
12192 {
12193   switch (TREE_CODE (*tp))
12194     {
12195     case LABEL_EXPR:
12196       return *tp;
12197     case GOTO_EXPR:
12198       *walk_subtrees = 0;
12199     /* no break */
12200     default:
12201       return NULL_TREE;
12202     }
12203 }
12204
12205 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12206    accessible from outside the sub-tree. Returns NULL_TREE if no
12207    addressable label is found.  */
12208
12209 static bool
12210 contains_label_p (tree st)
12211 {
12212   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12213 }
12214
12215 /* Fold a ternary expression of code CODE and type TYPE with operands
12216    OP0, OP1, and OP2.  Return the folded expression if folding is
12217    successful.  Otherwise, return NULL_TREE.  */
12218
12219 tree
12220 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12221 {
12222   tree tem;
12223   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12224   enum tree_code_class kind = TREE_CODE_CLASS (code);
12225
12226   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12227               && TREE_CODE_LENGTH (code) == 3);
12228
12229   /* Strip any conversions that don't change the mode.  This is safe
12230      for every expression, except for a comparison expression because
12231      its signedness is derived from its operands.  So, in the latter
12232      case, only strip conversions that don't change the signedness.
12233
12234      Note that this is done as an internal manipulation within the
12235      constant folder, in order to find the simplest representation of
12236      the arguments so that their form can be studied.  In any cases,
12237      the appropriate type conversions should be put back in the tree
12238      that will get out of the constant folder.  */
12239   if (op0)
12240     {
12241       arg0 = op0;
12242       STRIP_NOPS (arg0);
12243     }
12244
12245   if (op1)
12246     {
12247       arg1 = op1;
12248       STRIP_NOPS (arg1);
12249     }
12250
12251   switch (code)
12252     {
12253     case COMPONENT_REF:
12254       if (TREE_CODE (arg0) == CONSTRUCTOR
12255           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12256         {
12257           unsigned HOST_WIDE_INT idx;
12258           tree field, value;
12259           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12260             if (field == arg1)
12261               return value;
12262         }
12263       return NULL_TREE;
12264
12265     case COND_EXPR:
12266       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12267          so all simple results must be passed through pedantic_non_lvalue.  */
12268       if (TREE_CODE (arg0) == INTEGER_CST)
12269         {
12270           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12271           tem = integer_zerop (arg0) ? op2 : op1;
12272           /* Only optimize constant conditions when the selected branch
12273              has the same type as the COND_EXPR.  This avoids optimizing
12274              away "c ? x : throw", where the throw has a void type.
12275              Avoid throwing away that operand which contains label.  */
12276           if ((!TREE_SIDE_EFFECTS (unused_op)
12277                || !contains_label_p (unused_op))
12278               && (! VOID_TYPE_P (TREE_TYPE (tem))
12279                   || VOID_TYPE_P (type)))
12280             return pedantic_non_lvalue (tem);
12281           return NULL_TREE;
12282         }
12283       if (operand_equal_p (arg1, op2, 0))
12284         return pedantic_omit_one_operand (type, arg1, arg0);
12285
12286       /* If we have A op B ? A : C, we may be able to convert this to a
12287          simpler expression, depending on the operation and the values
12288          of B and C.  Signed zeros prevent all of these transformations,
12289          for reasons given above each one.
12290
12291          Also try swapping the arguments and inverting the conditional.  */
12292       if (COMPARISON_CLASS_P (arg0)
12293           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12294                                              arg1, TREE_OPERAND (arg0, 1))
12295           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12296         {
12297           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12298           if (tem)
12299             return tem;
12300         }
12301
12302       if (COMPARISON_CLASS_P (arg0)
12303           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12304                                              op2,
12305                                              TREE_OPERAND (arg0, 1))
12306           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12307         {
12308           tem = fold_truth_not_expr (arg0);
12309           if (tem && COMPARISON_CLASS_P (tem))
12310             {
12311               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12312               if (tem)
12313                 return tem;
12314             }
12315         }
12316
12317       /* If the second operand is simpler than the third, swap them
12318          since that produces better jump optimization results.  */
12319       if (truth_value_p (TREE_CODE (arg0))
12320           && tree_swap_operands_p (op1, op2, false))
12321         {
12322           /* See if this can be inverted.  If it can't, possibly because
12323              it was a floating-point inequality comparison, don't do
12324              anything.  */
12325           tem = fold_truth_not_expr (arg0);
12326           if (tem)
12327             return fold_build3 (code, type, tem, op2, op1);
12328         }
12329
12330       /* Convert A ? 1 : 0 to simply A.  */
12331       if (integer_onep (op1)
12332           && integer_zerop (op2)
12333           /* If we try to convert OP0 to our type, the
12334              call to fold will try to move the conversion inside
12335              a COND, which will recurse.  In that case, the COND_EXPR
12336              is probably the best choice, so leave it alone.  */
12337           && type == TREE_TYPE (arg0))
12338         return pedantic_non_lvalue (arg0);
12339
12340       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12341          over COND_EXPR in cases such as floating point comparisons.  */
12342       if (integer_zerop (op1)
12343           && integer_onep (op2)
12344           && truth_value_p (TREE_CODE (arg0)))
12345         return pedantic_non_lvalue (fold_convert (type,
12346                                                   invert_truthvalue (arg0)));
12347
12348       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12349       if (TREE_CODE (arg0) == LT_EXPR
12350           && integer_zerop (TREE_OPERAND (arg0, 1))
12351           && integer_zerop (op2)
12352           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12353         {
12354           /* sign_bit_p only checks ARG1 bits within A's precision.
12355              If <sign bit of A> has wider type than A, bits outside
12356              of A's precision in <sign bit of A> need to be checked.
12357              If they are all 0, this optimization needs to be done
12358              in unsigned A's type, if they are all 1 in signed A's type,
12359              otherwise this can't be done.  */
12360           if (TYPE_PRECISION (TREE_TYPE (tem))
12361               < TYPE_PRECISION (TREE_TYPE (arg1))
12362               && TYPE_PRECISION (TREE_TYPE (tem))
12363                  < TYPE_PRECISION (type))
12364             {
12365               unsigned HOST_WIDE_INT mask_lo;
12366               HOST_WIDE_INT mask_hi;
12367               int inner_width, outer_width;
12368               tree tem_type;
12369
12370               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12371               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12372               if (outer_width > TYPE_PRECISION (type))
12373                 outer_width = TYPE_PRECISION (type);
12374
12375               if (outer_width > HOST_BITS_PER_WIDE_INT)
12376                 {
12377                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12378                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12379                   mask_lo = -1;
12380                 }
12381               else
12382                 {
12383                   mask_hi = 0;
12384                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12385                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12386                 }
12387               if (inner_width > HOST_BITS_PER_WIDE_INT)
12388                 {
12389                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12390                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12391                   mask_lo = 0;
12392                 }
12393               else
12394                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12395                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12396
12397               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12398                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12399                 {
12400                   tem_type = lang_hooks.types.signed_type (TREE_TYPE (tem));
12401                   tem = fold_convert (tem_type, tem);
12402                 }
12403               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12404                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12405                 {
12406                   tem_type = lang_hooks.types.unsigned_type (TREE_TYPE (tem));
12407                   tem = fold_convert (tem_type, tem);
12408                 }
12409               else
12410                 tem = NULL;
12411             }
12412
12413           if (tem)
12414             return fold_convert (type,
12415                                  fold_build2 (BIT_AND_EXPR,
12416                                               TREE_TYPE (tem), tem,
12417                                               fold_convert (TREE_TYPE (tem),
12418                                                             arg1)));
12419         }
12420
12421       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12422          already handled above.  */
12423       if (TREE_CODE (arg0) == BIT_AND_EXPR
12424           && integer_onep (TREE_OPERAND (arg0, 1))
12425           && integer_zerop (op2)
12426           && integer_pow2p (arg1))
12427         {
12428           tree tem = TREE_OPERAND (arg0, 0);
12429           STRIP_NOPS (tem);
12430           if (TREE_CODE (tem) == RSHIFT_EXPR
12431               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12432               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12433                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12434             return fold_build2 (BIT_AND_EXPR, type,
12435                                 TREE_OPERAND (tem, 0), arg1);
12436         }
12437
12438       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
12439          is probably obsolete because the first operand should be a
12440          truth value (that's why we have the two cases above), but let's
12441          leave it in until we can confirm this for all front-ends.  */
12442       if (integer_zerop (op2)
12443           && TREE_CODE (arg0) == NE_EXPR
12444           && integer_zerop (TREE_OPERAND (arg0, 1))
12445           && integer_pow2p (arg1)
12446           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12447           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12448                               arg1, OEP_ONLY_CONST))
12449         return pedantic_non_lvalue (fold_convert (type,
12450                                                   TREE_OPERAND (arg0, 0)));
12451
12452       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
12453       if (integer_zerop (op2)
12454           && truth_value_p (TREE_CODE (arg0))
12455           && truth_value_p (TREE_CODE (arg1)))
12456         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12457                             fold_convert (type, arg0),
12458                             arg1);
12459
12460       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
12461       if (integer_onep (op2)
12462           && truth_value_p (TREE_CODE (arg0))
12463           && truth_value_p (TREE_CODE (arg1)))
12464         {
12465           /* Only perform transformation if ARG0 is easily inverted.  */
12466           tem = fold_truth_not_expr (arg0);
12467           if (tem)
12468             return fold_build2 (TRUTH_ORIF_EXPR, type,
12469                                 fold_convert (type, tem),
12470                                 arg1);
12471         }
12472
12473       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
12474       if (integer_zerop (arg1)
12475           && truth_value_p (TREE_CODE (arg0))
12476           && truth_value_p (TREE_CODE (op2)))
12477         {
12478           /* Only perform transformation if ARG0 is easily inverted.  */
12479           tem = fold_truth_not_expr (arg0);
12480           if (tem)
12481             return fold_build2 (TRUTH_ANDIF_EXPR, type,
12482                                 fold_convert (type, tem),
12483                                 op2);
12484         }
12485
12486       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
12487       if (integer_onep (arg1)
12488           && truth_value_p (TREE_CODE (arg0))
12489           && truth_value_p (TREE_CODE (op2)))
12490         return fold_build2 (TRUTH_ORIF_EXPR, type,
12491                             fold_convert (type, arg0),
12492                             op2);
12493
12494       return NULL_TREE;
12495
12496     case CALL_EXPR:
12497       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
12498          of fold_ternary on them.  */
12499       gcc_unreachable ();
12500
12501     case BIT_FIELD_REF:
12502       if ((TREE_CODE (arg0) == VECTOR_CST
12503            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12504           && type == TREE_TYPE (TREE_TYPE (arg0))
12505           && host_integerp (arg1, 1)
12506           && host_integerp (op2, 1))
12507         {
12508           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12509           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12510
12511           if (width != 0
12512               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12513               && (idx % width) == 0
12514               && (idx = idx / width)
12515                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12516             {
12517               tree elements = NULL_TREE;
12518
12519               if (TREE_CODE (arg0) == VECTOR_CST)
12520                 elements = TREE_VECTOR_CST_ELTS (arg0);
12521               else
12522                 {
12523                   unsigned HOST_WIDE_INT idx;
12524                   tree value;
12525
12526                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
12527                     elements = tree_cons (NULL_TREE, value, elements);
12528                 }
12529               while (idx-- > 0 && elements)
12530                 elements = TREE_CHAIN (elements);
12531               if (elements)
12532                 return TREE_VALUE (elements);
12533               else
12534                 return fold_convert (type, integer_zero_node);
12535             }
12536         }
12537       return NULL_TREE;
12538
12539     default:
12540       return NULL_TREE;
12541     } /* switch (code) */
12542 }
12543
12544 /* Perform constant folding and related simplification of EXPR.
12545    The related simplifications include x*1 => x, x*0 => 0, etc.,
12546    and application of the associative law.
12547    NOP_EXPR conversions may be removed freely (as long as we
12548    are careful not to change the type of the overall expression).
12549    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
12550    but we can constant-fold them if they have constant operands.  */
12551
12552 #ifdef ENABLE_FOLD_CHECKING
12553 # define fold(x) fold_1 (x)
12554 static tree fold_1 (tree);
12555 static
12556 #endif
12557 tree
12558 fold (tree expr)
12559 {
12560   const tree t = expr;
12561   enum tree_code code = TREE_CODE (t);
12562   enum tree_code_class kind = TREE_CODE_CLASS (code);
12563   tree tem;
12564
12565   /* Return right away if a constant.  */
12566   if (kind == tcc_constant)
12567     return t;
12568
12569   /* CALL_EXPR-like objects with variable numbers of operands are
12570      treated specially.  */
12571   if (kind == tcc_vl_exp)
12572     {
12573       if (code == CALL_EXPR)
12574         {
12575           tem = fold_call_expr (expr, false);
12576           return tem ? tem : expr;
12577         }
12578       return expr;
12579     }
12580
12581   if (IS_EXPR_CODE_CLASS (kind)
12582       || IS_GIMPLE_STMT_CODE_CLASS (kind))
12583     {
12584       tree type = TREE_TYPE (t);
12585       tree op0, op1, op2;
12586
12587       switch (TREE_CODE_LENGTH (code))
12588         {
12589         case 1:
12590           op0 = TREE_OPERAND (t, 0);
12591           tem = fold_unary (code, type, op0);
12592           return tem ? tem : expr;
12593         case 2:
12594           op0 = TREE_OPERAND (t, 0);
12595           op1 = TREE_OPERAND (t, 1);
12596           tem = fold_binary (code, type, op0, op1);
12597           return tem ? tem : expr;
12598         case 3:
12599           op0 = TREE_OPERAND (t, 0);
12600           op1 = TREE_OPERAND (t, 1);
12601           op2 = TREE_OPERAND (t, 2);
12602           tem = fold_ternary (code, type, op0, op1, op2);
12603           return tem ? tem : expr;
12604         default:
12605           break;
12606         }
12607     }
12608
12609   switch (code)
12610     {
12611     case CONST_DECL:
12612       return fold (DECL_INITIAL (t));
12613
12614     default:
12615       return t;
12616     } /* switch (code) */
12617 }
12618
12619 #ifdef ENABLE_FOLD_CHECKING
12620 #undef fold
12621
12622 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
12623 static void fold_check_failed (tree, tree);
12624 void print_fold_checksum (tree);
12625
12626 /* When --enable-checking=fold, compute a digest of expr before
12627    and after actual fold call to see if fold did not accidentally
12628    change original expr.  */
12629
12630 tree
12631 fold (tree expr)
12632 {
12633   tree ret;
12634   struct md5_ctx ctx;
12635   unsigned char checksum_before[16], checksum_after[16];
12636   htab_t ht;
12637
12638   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12639   md5_init_ctx (&ctx);
12640   fold_checksum_tree (expr, &ctx, ht);
12641   md5_finish_ctx (&ctx, checksum_before);
12642   htab_empty (ht);
12643
12644   ret = fold_1 (expr);
12645
12646   md5_init_ctx (&ctx);
12647   fold_checksum_tree (expr, &ctx, ht);
12648   md5_finish_ctx (&ctx, checksum_after);
12649   htab_delete (ht);
12650
12651   if (memcmp (checksum_before, checksum_after, 16))
12652     fold_check_failed (expr, ret);
12653
12654   return ret;
12655 }
12656
12657 void
12658 print_fold_checksum (tree expr)
12659 {
12660   struct md5_ctx ctx;
12661   unsigned char checksum[16], cnt;
12662   htab_t ht;
12663
12664   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12665   md5_init_ctx (&ctx);
12666   fold_checksum_tree (expr, &ctx, ht);
12667   md5_finish_ctx (&ctx, checksum);
12668   htab_delete (ht);
12669   for (cnt = 0; cnt < 16; ++cnt)
12670     fprintf (stderr, "%02x", checksum[cnt]);
12671   putc ('\n', stderr);
12672 }
12673
12674 static void
12675 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
12676 {
12677   internal_error ("fold check: original tree changed by fold");
12678 }
12679
12680 static void
12681 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
12682 {
12683   void **slot;
12684   enum tree_code code;
12685   struct tree_function_decl buf;
12686   int i, len;
12687   
12688 recursive_label:
12689
12690   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
12691                <= sizeof (struct tree_function_decl))
12692               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
12693   if (expr == NULL)
12694     return;
12695   slot = htab_find_slot (ht, expr, INSERT);
12696   if (*slot != NULL)
12697     return;
12698   *slot = expr;
12699   code = TREE_CODE (expr);
12700   if (TREE_CODE_CLASS (code) == tcc_declaration
12701       && DECL_ASSEMBLER_NAME_SET_P (expr))
12702     {
12703       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
12704       memcpy ((char *) &buf, expr, tree_size (expr));
12705       expr = (tree) &buf;
12706       SET_DECL_ASSEMBLER_NAME (expr, NULL);
12707     }
12708   else if (TREE_CODE_CLASS (code) == tcc_type
12709            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
12710                || TYPE_CACHED_VALUES_P (expr)
12711                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
12712     {
12713       /* Allow these fields to be modified.  */
12714       memcpy ((char *) &buf, expr, tree_size (expr));
12715       expr = (tree) &buf;
12716       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
12717       TYPE_POINTER_TO (expr) = NULL;
12718       TYPE_REFERENCE_TO (expr) = NULL;
12719       if (TYPE_CACHED_VALUES_P (expr))
12720         {
12721           TYPE_CACHED_VALUES_P (expr) = 0;
12722           TYPE_CACHED_VALUES (expr) = NULL;
12723         }
12724     }
12725   md5_process_bytes (expr, tree_size (expr), ctx);
12726   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
12727   if (TREE_CODE_CLASS (code) != tcc_type
12728       && TREE_CODE_CLASS (code) != tcc_declaration
12729       && code != TREE_LIST)
12730     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
12731   switch (TREE_CODE_CLASS (code))
12732     {
12733     case tcc_constant:
12734       switch (code)
12735         {
12736         case STRING_CST:
12737           md5_process_bytes (TREE_STRING_POINTER (expr),
12738                              TREE_STRING_LENGTH (expr), ctx);
12739           break;
12740         case COMPLEX_CST:
12741           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
12742           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
12743           break;
12744         case VECTOR_CST:
12745           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
12746           break;
12747         default:
12748           break;
12749         }
12750       break;
12751     case tcc_exceptional:
12752       switch (code)
12753         {
12754         case TREE_LIST:
12755           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
12756           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
12757           expr = TREE_CHAIN (expr);
12758           goto recursive_label;
12759           break;
12760         case TREE_VEC:
12761           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
12762             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
12763           break;
12764         default:
12765           break;
12766         }
12767       break;
12768     case tcc_expression:
12769     case tcc_reference:
12770     case tcc_comparison:
12771     case tcc_unary:
12772     case tcc_binary:
12773     case tcc_statement:
12774     case tcc_vl_exp:
12775       len = TREE_OPERAND_LENGTH (expr);
12776       for (i = 0; i < len; ++i)
12777         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
12778       break;
12779     case tcc_declaration:
12780       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
12781       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
12782       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
12783         {
12784           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
12785           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
12786           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
12787           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
12788           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
12789         }
12790       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
12791         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
12792           
12793       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
12794         {
12795           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
12796           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
12797           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
12798         }
12799       break;
12800     case tcc_type:
12801       if (TREE_CODE (expr) == ENUMERAL_TYPE)
12802         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
12803       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
12804       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
12805       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
12806       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
12807       if (INTEGRAL_TYPE_P (expr)
12808           || SCALAR_FLOAT_TYPE_P (expr))
12809         {
12810           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
12811           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
12812         }
12813       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
12814       if (TREE_CODE (expr) == RECORD_TYPE
12815           || TREE_CODE (expr) == UNION_TYPE
12816           || TREE_CODE (expr) == QUAL_UNION_TYPE)
12817         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
12818       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
12819       break;
12820     default:
12821       break;
12822     }
12823 }
12824
12825 #endif
12826
12827 /* Fold a unary tree expression with code CODE of type TYPE with an
12828    operand OP0.  Return a folded expression if successful.  Otherwise,
12829    return a tree expression with code CODE of type TYPE with an
12830    operand OP0.  */
12831
12832 tree
12833 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
12834 {
12835   tree tem;
12836 #ifdef ENABLE_FOLD_CHECKING
12837   unsigned char checksum_before[16], checksum_after[16];
12838   struct md5_ctx ctx;
12839   htab_t ht;
12840
12841   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12842   md5_init_ctx (&ctx);
12843   fold_checksum_tree (op0, &ctx, ht);
12844   md5_finish_ctx (&ctx, checksum_before);
12845   htab_empty (ht);
12846 #endif
12847   
12848   tem = fold_unary (code, type, op0);
12849   if (!tem)
12850     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
12851   
12852 #ifdef ENABLE_FOLD_CHECKING
12853   md5_init_ctx (&ctx);
12854   fold_checksum_tree (op0, &ctx, ht);
12855   md5_finish_ctx (&ctx, checksum_after);
12856   htab_delete (ht);
12857
12858   if (memcmp (checksum_before, checksum_after, 16))
12859     fold_check_failed (op0, tem);
12860 #endif
12861   return tem;
12862 }
12863
12864 /* Fold a binary tree expression with code CODE of type TYPE with
12865    operands OP0 and OP1.  Return a folded expression if successful.
12866    Otherwise, return a tree expression with code CODE of type TYPE
12867    with operands OP0 and OP1.  */
12868
12869 tree
12870 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
12871                   MEM_STAT_DECL)
12872 {
12873   tree tem;
12874 #ifdef ENABLE_FOLD_CHECKING
12875   unsigned char checksum_before_op0[16],
12876                 checksum_before_op1[16],
12877                 checksum_after_op0[16],
12878                 checksum_after_op1[16];
12879   struct md5_ctx ctx;
12880   htab_t ht;
12881
12882   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12883   md5_init_ctx (&ctx);
12884   fold_checksum_tree (op0, &ctx, ht);
12885   md5_finish_ctx (&ctx, checksum_before_op0);
12886   htab_empty (ht);
12887
12888   md5_init_ctx (&ctx);
12889   fold_checksum_tree (op1, &ctx, ht);
12890   md5_finish_ctx (&ctx, checksum_before_op1);
12891   htab_empty (ht);
12892 #endif
12893
12894   tem = fold_binary (code, type, op0, op1);
12895   if (!tem)
12896     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
12897   
12898 #ifdef ENABLE_FOLD_CHECKING
12899   md5_init_ctx (&ctx);
12900   fold_checksum_tree (op0, &ctx, ht);
12901   md5_finish_ctx (&ctx, checksum_after_op0);
12902   htab_empty (ht);
12903
12904   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12905     fold_check_failed (op0, tem);
12906   
12907   md5_init_ctx (&ctx);
12908   fold_checksum_tree (op1, &ctx, ht);
12909   md5_finish_ctx (&ctx, checksum_after_op1);
12910   htab_delete (ht);
12911
12912   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12913     fold_check_failed (op1, tem);
12914 #endif
12915   return tem;
12916 }
12917
12918 /* Fold a ternary tree expression with code CODE of type TYPE with
12919    operands OP0, OP1, and OP2.  Return a folded expression if
12920    successful.  Otherwise, return a tree expression with code CODE of
12921    type TYPE with operands OP0, OP1, and OP2.  */
12922
12923 tree
12924 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
12925              MEM_STAT_DECL)
12926 {
12927   tree tem;
12928 #ifdef ENABLE_FOLD_CHECKING
12929   unsigned char checksum_before_op0[16],
12930                 checksum_before_op1[16],
12931                 checksum_before_op2[16],
12932                 checksum_after_op0[16],
12933                 checksum_after_op1[16],
12934                 checksum_after_op2[16];
12935   struct md5_ctx ctx;
12936   htab_t ht;
12937
12938   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12939   md5_init_ctx (&ctx);
12940   fold_checksum_tree (op0, &ctx, ht);
12941   md5_finish_ctx (&ctx, checksum_before_op0);
12942   htab_empty (ht);
12943
12944   md5_init_ctx (&ctx);
12945   fold_checksum_tree (op1, &ctx, ht);
12946   md5_finish_ctx (&ctx, checksum_before_op1);
12947   htab_empty (ht);
12948
12949   md5_init_ctx (&ctx);
12950   fold_checksum_tree (op2, &ctx, ht);
12951   md5_finish_ctx (&ctx, checksum_before_op2);
12952   htab_empty (ht);
12953 #endif
12954
12955   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
12956   tem = fold_ternary (code, type, op0, op1, op2);
12957   if (!tem)
12958     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
12959       
12960 #ifdef ENABLE_FOLD_CHECKING
12961   md5_init_ctx (&ctx);
12962   fold_checksum_tree (op0, &ctx, ht);
12963   md5_finish_ctx (&ctx, checksum_after_op0);
12964   htab_empty (ht);
12965
12966   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12967     fold_check_failed (op0, tem);
12968   
12969   md5_init_ctx (&ctx);
12970   fold_checksum_tree (op1, &ctx, ht);
12971   md5_finish_ctx (&ctx, checksum_after_op1);
12972   htab_empty (ht);
12973
12974   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12975     fold_check_failed (op1, tem);
12976   
12977   md5_init_ctx (&ctx);
12978   fold_checksum_tree (op2, &ctx, ht);
12979   md5_finish_ctx (&ctx, checksum_after_op2);
12980   htab_delete (ht);
12981
12982   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
12983     fold_check_failed (op2, tem);
12984 #endif
12985   return tem;
12986 }
12987
12988 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
12989    arguments in ARGARRAY, and a null static chain.
12990    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
12991    of type TYPE from the given operands as constructed by build_call_array.  */
12992
12993 tree
12994 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
12995 {
12996   tree tem;
12997 #ifdef ENABLE_FOLD_CHECKING
12998   unsigned char checksum_before_fn[16],
12999                 checksum_before_arglist[16],
13000                 checksum_after_fn[16],
13001                 checksum_after_arglist[16];
13002   struct md5_ctx ctx;
13003   htab_t ht;
13004   int i;
13005
13006   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13007   md5_init_ctx (&ctx);
13008   fold_checksum_tree (fn, &ctx, ht);
13009   md5_finish_ctx (&ctx, checksum_before_fn);
13010   htab_empty (ht);
13011
13012   md5_init_ctx (&ctx);
13013   for (i = 0; i < nargs; i++)
13014     fold_checksum_tree (argarray[i], &ctx, ht);
13015   md5_finish_ctx (&ctx, checksum_before_arglist);
13016   htab_empty (ht);
13017 #endif
13018
13019   tem = fold_builtin_call_array (type, fn, nargs, argarray);
13020       
13021 #ifdef ENABLE_FOLD_CHECKING
13022   md5_init_ctx (&ctx);
13023   fold_checksum_tree (fn, &ctx, ht);
13024   md5_finish_ctx (&ctx, checksum_after_fn);
13025   htab_empty (ht);
13026
13027   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13028     fold_check_failed (fn, tem);
13029   
13030   md5_init_ctx (&ctx);
13031   for (i = 0; i < nargs; i++)
13032     fold_checksum_tree (argarray[i], &ctx, ht);
13033   md5_finish_ctx (&ctx, checksum_after_arglist);
13034   htab_delete (ht);
13035
13036   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13037     fold_check_failed (NULL_TREE, tem);
13038 #endif
13039   return tem;
13040 }
13041
13042 /* Perform constant folding and related simplification of initializer
13043    expression EXPR.  These behave identically to "fold_buildN" but ignore
13044    potential run-time traps and exceptions that fold must preserve.  */
13045
13046 #define START_FOLD_INIT \
13047   int saved_signaling_nans = flag_signaling_nans;\
13048   int saved_trapping_math = flag_trapping_math;\
13049   int saved_rounding_math = flag_rounding_math;\
13050   int saved_trapv = flag_trapv;\
13051   int saved_folding_initializer = folding_initializer;\
13052   flag_signaling_nans = 0;\
13053   flag_trapping_math = 0;\
13054   flag_rounding_math = 0;\
13055   flag_trapv = 0;\
13056   folding_initializer = 1;
13057
13058 #define END_FOLD_INIT \
13059   flag_signaling_nans = saved_signaling_nans;\
13060   flag_trapping_math = saved_trapping_math;\
13061   flag_rounding_math = saved_rounding_math;\
13062   flag_trapv = saved_trapv;\
13063   folding_initializer = saved_folding_initializer;
13064
13065 tree
13066 fold_build1_initializer (enum tree_code code, tree type, tree op)
13067 {
13068   tree result;
13069   START_FOLD_INIT;
13070
13071   result = fold_build1 (code, type, op);
13072
13073   END_FOLD_INIT;
13074   return result;
13075 }
13076
13077 tree
13078 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13079 {
13080   tree result;
13081   START_FOLD_INIT;
13082
13083   result = fold_build2 (code, type, op0, op1);
13084
13085   END_FOLD_INIT;
13086   return result;
13087 }
13088
13089 tree
13090 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13091                          tree op2)
13092 {
13093   tree result;
13094   START_FOLD_INIT;
13095
13096   result = fold_build3 (code, type, op0, op1, op2);
13097
13098   END_FOLD_INIT;
13099   return result;
13100 }
13101
13102 tree
13103 fold_build_call_array_initializer (tree type, tree fn,
13104                                    int nargs, tree *argarray)
13105 {
13106   tree result;
13107   START_FOLD_INIT;
13108
13109   result = fold_build_call_array (type, fn, nargs, argarray);
13110
13111   END_FOLD_INIT;
13112   return result;
13113 }
13114
13115 #undef START_FOLD_INIT
13116 #undef END_FOLD_INIT
13117
13118 /* Determine if first argument is a multiple of second argument.  Return 0 if
13119    it is not, or we cannot easily determined it to be.
13120
13121    An example of the sort of thing we care about (at this point; this routine
13122    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13123    fold cases do now) is discovering that
13124
13125      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13126
13127    is a multiple of
13128
13129      SAVE_EXPR (J * 8)
13130
13131    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13132
13133    This code also handles discovering that
13134
13135      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13136
13137    is a multiple of 8 so we don't have to worry about dealing with a
13138    possible remainder.
13139
13140    Note that we *look* inside a SAVE_EXPR only to determine how it was
13141    calculated; it is not safe for fold to do much of anything else with the
13142    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13143    at run time.  For example, the latter example above *cannot* be implemented
13144    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13145    evaluation time of the original SAVE_EXPR is not necessarily the same at
13146    the time the new expression is evaluated.  The only optimization of this
13147    sort that would be valid is changing
13148
13149      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13150
13151    divided by 8 to
13152
13153      SAVE_EXPR (I) * SAVE_EXPR (J)
13154
13155    (where the same SAVE_EXPR (J) is used in the original and the
13156    transformed version).  */
13157
13158 int
13159 multiple_of_p (tree type, tree top, tree bottom)
13160 {
13161   if (operand_equal_p (top, bottom, 0))
13162     return 1;
13163
13164   if (TREE_CODE (type) != INTEGER_TYPE)
13165     return 0;
13166
13167   switch (TREE_CODE (top))
13168     {
13169     case BIT_AND_EXPR:
13170       /* Bitwise and provides a power of two multiple.  If the mask is
13171          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13172       if (!integer_pow2p (bottom))
13173         return 0;
13174       /* FALLTHRU */
13175
13176     case MULT_EXPR:
13177       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13178               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13179
13180     case PLUS_EXPR:
13181     case MINUS_EXPR:
13182       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13183               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13184
13185     case LSHIFT_EXPR:
13186       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13187         {
13188           tree op1, t1;
13189
13190           op1 = TREE_OPERAND (top, 1);
13191           /* const_binop may not detect overflow correctly,
13192              so check for it explicitly here.  */
13193           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13194               > TREE_INT_CST_LOW (op1)
13195               && TREE_INT_CST_HIGH (op1) == 0
13196               && 0 != (t1 = fold_convert (type,
13197                                           const_binop (LSHIFT_EXPR,
13198                                                        size_one_node,
13199                                                        op1, 0)))
13200               && !TREE_OVERFLOW (t1))
13201             return multiple_of_p (type, t1, bottom);
13202         }
13203       return 0;
13204
13205     case NOP_EXPR:
13206       /* Can't handle conversions from non-integral or wider integral type.  */
13207       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13208           || (TYPE_PRECISION (type)
13209               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13210         return 0;
13211
13212       /* .. fall through ...  */
13213
13214     case SAVE_EXPR:
13215       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13216
13217     case INTEGER_CST:
13218       if (TREE_CODE (bottom) != INTEGER_CST
13219           || integer_zerop (bottom)
13220           || (TYPE_UNSIGNED (type)
13221               && (tree_int_cst_sgn (top) < 0
13222                   || tree_int_cst_sgn (bottom) < 0)))
13223         return 0;
13224       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13225                                              top, bottom, 0));
13226
13227     default:
13228       return 0;
13229     }
13230 }
13231
13232 /* Return true if `t' is known to be non-negative.  If the return
13233    value is based on the assumption that signed overflow is undefined,
13234    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13235    *STRICT_OVERFLOW_P.  */
13236
13237 bool
13238 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13239 {
13240   if (t == error_mark_node)
13241     return false;
13242
13243   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13244     return true;
13245
13246   switch (TREE_CODE (t))
13247     {
13248     case SSA_NAME:
13249       /* Query VRP to see if it has recorded any information about
13250          the range of this object.  */
13251       return ssa_name_nonnegative_p (t);
13252
13253     case ABS_EXPR:
13254       /* We can't return 1 if flag_wrapv is set because
13255          ABS_EXPR<INT_MIN> = INT_MIN.  */
13256       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
13257         return true;
13258       if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
13259         {
13260           *strict_overflow_p = true;
13261           return true;
13262         }
13263       break;
13264
13265     case INTEGER_CST:
13266       return tree_int_cst_sgn (t) >= 0;
13267
13268     case REAL_CST:
13269       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13270
13271     case PLUS_EXPR:
13272       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13273         return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13274                                                strict_overflow_p)
13275                 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13276                                                   strict_overflow_p));
13277
13278       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13279          both unsigned and at least 2 bits shorter than the result.  */
13280       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13281           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13282           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13283         {
13284           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13285           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13286           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13287               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13288             {
13289               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13290                                        TYPE_PRECISION (inner2)) + 1;
13291               return prec < TYPE_PRECISION (TREE_TYPE (t));
13292             }
13293         }
13294       break;
13295
13296     case MULT_EXPR:
13297       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13298         {
13299           /* x * x for floating point x is always non-negative.  */
13300           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
13301             return true;
13302           return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13303                                                  strict_overflow_p)
13304                   && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13305                                                     strict_overflow_p));
13306         }
13307
13308       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13309          both unsigned and their total bits is shorter than the result.  */
13310       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13311           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13312           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13313         {
13314           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13315           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13316           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13317               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13318             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13319                    < TYPE_PRECISION (TREE_TYPE (t));
13320         }
13321       return false;
13322
13323     case BIT_AND_EXPR:
13324     case MAX_EXPR:
13325       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13326                                              strict_overflow_p)
13327               || tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13328                                                 strict_overflow_p));
13329
13330     case BIT_IOR_EXPR:
13331     case BIT_XOR_EXPR:
13332     case MIN_EXPR:
13333     case RDIV_EXPR:
13334     case TRUNC_DIV_EXPR:
13335     case CEIL_DIV_EXPR:
13336     case FLOOR_DIV_EXPR:
13337     case ROUND_DIV_EXPR:
13338       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13339                                              strict_overflow_p)
13340               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13341                                                 strict_overflow_p));
13342
13343     case TRUNC_MOD_EXPR:
13344     case CEIL_MOD_EXPR:
13345     case FLOOR_MOD_EXPR:
13346     case ROUND_MOD_EXPR:
13347     case SAVE_EXPR:
13348     case NON_LVALUE_EXPR:
13349     case FLOAT_EXPR:
13350     case FIX_TRUNC_EXPR:
13351       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13352                                             strict_overflow_p);
13353
13354     case COMPOUND_EXPR:
13355     case MODIFY_EXPR:
13356     case GIMPLE_MODIFY_STMT:
13357       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13358                                             strict_overflow_p);
13359
13360     case BIND_EXPR:
13361       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
13362                                             strict_overflow_p);
13363
13364     case COND_EXPR:
13365       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13366                                              strict_overflow_p)
13367               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13368                                                 strict_overflow_p));
13369
13370     case NOP_EXPR:
13371       {
13372         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13373         tree outer_type = TREE_TYPE (t);
13374
13375         if (TREE_CODE (outer_type) == REAL_TYPE)
13376           {
13377             if (TREE_CODE (inner_type) == REAL_TYPE)
13378               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13379                                                     strict_overflow_p);
13380             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13381               {
13382                 if (TYPE_UNSIGNED (inner_type))
13383                   return true;
13384                 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13385                                                       strict_overflow_p);
13386               }
13387           }
13388         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13389           {
13390             if (TREE_CODE (inner_type) == REAL_TYPE)
13391               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t,0),
13392                                                     strict_overflow_p);
13393             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13394               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13395                       && TYPE_UNSIGNED (inner_type);
13396           }
13397       }
13398       break;
13399
13400     case TARGET_EXPR:
13401       {
13402         tree temp = TARGET_EXPR_SLOT (t);
13403         t = TARGET_EXPR_INITIAL (t);
13404
13405         /* If the initializer is non-void, then it's a normal expression
13406            that will be assigned to the slot.  */
13407         if (!VOID_TYPE_P (t))
13408           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
13409
13410         /* Otherwise, the initializer sets the slot in some way.  One common
13411            way is an assignment statement at the end of the initializer.  */
13412         while (1)
13413           {
13414             if (TREE_CODE (t) == BIND_EXPR)
13415               t = expr_last (BIND_EXPR_BODY (t));
13416             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
13417                      || TREE_CODE (t) == TRY_CATCH_EXPR)
13418               t = expr_last (TREE_OPERAND (t, 0));
13419             else if (TREE_CODE (t) == STATEMENT_LIST)
13420               t = expr_last (t);
13421             else
13422               break;
13423           }
13424         if ((TREE_CODE (t) == MODIFY_EXPR
13425              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
13426             && GENERIC_TREE_OPERAND (t, 0) == temp)
13427           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13428                                                 strict_overflow_p);
13429
13430         return false;
13431       }
13432
13433     case CALL_EXPR:
13434       {
13435         tree fndecl = get_callee_fndecl (t);
13436         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
13437           switch (DECL_FUNCTION_CODE (fndecl))
13438             {
13439             CASE_FLT_FN (BUILT_IN_ACOS):
13440             CASE_FLT_FN (BUILT_IN_ACOSH):
13441             CASE_FLT_FN (BUILT_IN_CABS):
13442             CASE_FLT_FN (BUILT_IN_COSH):
13443             CASE_FLT_FN (BUILT_IN_ERFC):
13444             CASE_FLT_FN (BUILT_IN_EXP):
13445             CASE_FLT_FN (BUILT_IN_EXP10):
13446             CASE_FLT_FN (BUILT_IN_EXP2):
13447             CASE_FLT_FN (BUILT_IN_FABS):
13448             CASE_FLT_FN (BUILT_IN_FDIM):
13449             CASE_FLT_FN (BUILT_IN_HYPOT):
13450             CASE_FLT_FN (BUILT_IN_POW10):
13451             CASE_INT_FN (BUILT_IN_FFS):
13452             CASE_INT_FN (BUILT_IN_PARITY):
13453             CASE_INT_FN (BUILT_IN_POPCOUNT):
13454             case BUILT_IN_BSWAP32:
13455             case BUILT_IN_BSWAP64:
13456               /* Always true.  */
13457               return true;
13458
13459             CASE_FLT_FN (BUILT_IN_SQRT):
13460               /* sqrt(-0.0) is -0.0.  */
13461               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
13462                 return true;
13463               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13464                                                     strict_overflow_p);
13465
13466             CASE_FLT_FN (BUILT_IN_ASINH):
13467             CASE_FLT_FN (BUILT_IN_ATAN):
13468             CASE_FLT_FN (BUILT_IN_ATANH):
13469             CASE_FLT_FN (BUILT_IN_CBRT):
13470             CASE_FLT_FN (BUILT_IN_CEIL):
13471             CASE_FLT_FN (BUILT_IN_ERF):
13472             CASE_FLT_FN (BUILT_IN_EXPM1):
13473             CASE_FLT_FN (BUILT_IN_FLOOR):
13474             CASE_FLT_FN (BUILT_IN_FMOD):
13475             CASE_FLT_FN (BUILT_IN_FREXP):
13476             CASE_FLT_FN (BUILT_IN_LCEIL):
13477             CASE_FLT_FN (BUILT_IN_LDEXP):
13478             CASE_FLT_FN (BUILT_IN_LFLOOR):
13479             CASE_FLT_FN (BUILT_IN_LLCEIL):
13480             CASE_FLT_FN (BUILT_IN_LLFLOOR):
13481             CASE_FLT_FN (BUILT_IN_LLRINT):
13482             CASE_FLT_FN (BUILT_IN_LLROUND):
13483             CASE_FLT_FN (BUILT_IN_LRINT):
13484             CASE_FLT_FN (BUILT_IN_LROUND):
13485             CASE_FLT_FN (BUILT_IN_MODF):
13486             CASE_FLT_FN (BUILT_IN_NEARBYINT):
13487             CASE_FLT_FN (BUILT_IN_RINT):
13488             CASE_FLT_FN (BUILT_IN_ROUND):
13489             CASE_FLT_FN (BUILT_IN_SCALB):
13490             CASE_FLT_FN (BUILT_IN_SCALBLN):
13491             CASE_FLT_FN (BUILT_IN_SCALBN):
13492             CASE_FLT_FN (BUILT_IN_SIGNBIT):
13493             CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
13494             CASE_FLT_FN (BUILT_IN_SINH):
13495             CASE_FLT_FN (BUILT_IN_TANH):
13496             CASE_FLT_FN (BUILT_IN_TRUNC):
13497               /* True if the 1st argument is nonnegative.  */
13498               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13499                                                     strict_overflow_p);
13500
13501             CASE_FLT_FN (BUILT_IN_FMAX):
13502               /* True if the 1st OR 2nd arguments are nonnegative.  */
13503               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13504                                                      strict_overflow_p)
13505                       || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13506                                                          strict_overflow_p)));
13507
13508             CASE_FLT_FN (BUILT_IN_FMIN):
13509               /* True if the 1st AND 2nd arguments are nonnegative.  */
13510               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13511                                                      strict_overflow_p)
13512                       && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13513                                                          strict_overflow_p)));
13514
13515             CASE_FLT_FN (BUILT_IN_COPYSIGN):
13516               /* True if the 2nd argument is nonnegative.  */
13517               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13518                                                     strict_overflow_p);
13519
13520             CASE_FLT_FN (BUILT_IN_POWI):
13521               /* True if the 1st argument is nonnegative or the second
13522                  argument is an even integer.  */
13523               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
13524                 {
13525                   tree arg1 = CALL_EXPR_ARG (t, 1);
13526                   if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
13527                     return true;
13528                 }
13529               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13530                                                     strict_overflow_p);
13531
13532             CASE_FLT_FN (BUILT_IN_POW):
13533               /* True if the 1st argument is nonnegative or the second
13534                  argument is an even integer valued real.  */
13535               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
13536                 {
13537                   REAL_VALUE_TYPE c;
13538                   HOST_WIDE_INT n;
13539
13540                   c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
13541                   n = real_to_integer (&c);
13542                   if ((n & 1) == 0)
13543                     {
13544                       REAL_VALUE_TYPE cint;
13545                       real_from_integer (&cint, VOIDmode, n,
13546                                          n < 0 ? -1 : 0, 0);
13547                       if (real_identical (&c, &cint))
13548                         return true;
13549                     }
13550                 }
13551               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13552                                                     strict_overflow_p);
13553
13554             default:
13555               break;
13556             }
13557       }
13558
13559       /* ... fall through ...  */
13560
13561     default:
13562       if (truth_value_p (TREE_CODE (t)))
13563         /* Truth values evaluate to 0 or 1, which is nonnegative.  */
13564         return true;
13565     }
13566
13567   /* We don't know sign of `t', so be conservative and return false.  */
13568   return false;
13569 }
13570
13571 /* Return true if `t' is known to be non-negative.  Handle warnings
13572    about undefined signed overflow.  */
13573
13574 bool
13575 tree_expr_nonnegative_p (tree t)
13576 {
13577   bool ret, strict_overflow_p;
13578
13579   strict_overflow_p = false;
13580   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
13581   if (strict_overflow_p)
13582     fold_overflow_warning (("assuming signed overflow does not occur when "
13583                             "determining that expression is always "
13584                             "non-negative"),
13585                            WARN_STRICT_OVERFLOW_MISC);
13586   return ret;
13587 }
13588
13589 /* Return true when T is an address and is known to be nonzero.
13590    For floating point we further ensure that T is not denormal.
13591    Similar logic is present in nonzero_address in rtlanal.h.
13592
13593    If the return value is based on the assumption that signed overflow
13594    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
13595    change *STRICT_OVERFLOW_P.  */
13596
13597 bool
13598 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
13599 {
13600   tree type = TREE_TYPE (t);
13601   bool sub_strict_overflow_p;
13602
13603   /* Doing something useful for floating point would need more work.  */
13604   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
13605     return false;
13606
13607   switch (TREE_CODE (t))
13608     {
13609     case SSA_NAME:
13610       /* Query VRP to see if it has recorded any information about
13611          the range of this object.  */
13612       return ssa_name_nonzero_p (t);
13613
13614     case ABS_EXPR:
13615       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13616                                         strict_overflow_p);
13617
13618     case INTEGER_CST:
13619       return !integer_zerop (t);
13620
13621     case PLUS_EXPR:
13622       if (TYPE_OVERFLOW_UNDEFINED (type))
13623         {
13624           /* With the presence of negative values it is hard
13625              to say something.  */
13626           sub_strict_overflow_p = false;
13627           if (!tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13628                                               &sub_strict_overflow_p)
13629               || !tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13630                                                  &sub_strict_overflow_p))
13631             return false;
13632           /* One of operands must be positive and the other non-negative.  */
13633           /* We don't set *STRICT_OVERFLOW_P here: even if this value
13634              overflows, on a twos-complement machine the sum of two
13635              nonnegative numbers can never be zero.  */
13636           return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13637                                              strict_overflow_p)
13638                   || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13639                                                 strict_overflow_p));
13640         }
13641       break;
13642
13643     case MULT_EXPR:
13644       if (TYPE_OVERFLOW_UNDEFINED (type))
13645         {
13646           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13647                                          strict_overflow_p)
13648               && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13649                                             strict_overflow_p))
13650             {
13651               *strict_overflow_p = true;
13652               return true;
13653             }
13654         }
13655       break;
13656
13657     case NOP_EXPR:
13658       {
13659         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13660         tree outer_type = TREE_TYPE (t);
13661
13662         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
13663                 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13664                                               strict_overflow_p));
13665       }
13666       break;
13667
13668    case ADDR_EXPR:
13669       {
13670         tree base = get_base_address (TREE_OPERAND (t, 0));
13671
13672         if (!base)
13673           return false;
13674
13675         /* Weak declarations may link to NULL.  */
13676         if (VAR_OR_FUNCTION_DECL_P (base))
13677           return !DECL_WEAK (base);
13678
13679         /* Constants are never weak.  */
13680         if (CONSTANT_CLASS_P (base))
13681           return true;
13682
13683         return false;
13684       }
13685
13686     case COND_EXPR:
13687       sub_strict_overflow_p = false;
13688       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13689                                      &sub_strict_overflow_p)
13690           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
13691                                         &sub_strict_overflow_p))
13692         {
13693           if (sub_strict_overflow_p)
13694             *strict_overflow_p = true;
13695           return true;
13696         }
13697       break;
13698
13699     case MIN_EXPR:
13700       sub_strict_overflow_p = false;
13701       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13702                                      &sub_strict_overflow_p)
13703           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13704                                         &sub_strict_overflow_p))
13705         {
13706           if (sub_strict_overflow_p)
13707             *strict_overflow_p = true;
13708         }
13709       break;
13710
13711     case MAX_EXPR:
13712       sub_strict_overflow_p = false;
13713       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13714                                      &sub_strict_overflow_p))
13715         {
13716           if (sub_strict_overflow_p)
13717             *strict_overflow_p = true;
13718
13719           /* When both operands are nonzero, then MAX must be too.  */
13720           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13721                                          strict_overflow_p))
13722             return true;
13723
13724           /* MAX where operand 0 is positive is positive.  */
13725           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13726                                                strict_overflow_p);
13727         }
13728       /* MAX where operand 1 is positive is positive.  */
13729       else if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13730                                           &sub_strict_overflow_p)
13731                && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13732                                                  &sub_strict_overflow_p))
13733         {
13734           if (sub_strict_overflow_p)
13735             *strict_overflow_p = true;
13736           return true;
13737         }
13738       break;
13739
13740     case COMPOUND_EXPR:
13741     case MODIFY_EXPR:
13742     case GIMPLE_MODIFY_STMT:
13743     case BIND_EXPR:
13744       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13745                                         strict_overflow_p);
13746
13747     case SAVE_EXPR:
13748     case NON_LVALUE_EXPR:
13749       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13750                                         strict_overflow_p);
13751
13752     case BIT_IOR_EXPR:
13753       return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13754                                         strict_overflow_p)
13755               || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13756                                             strict_overflow_p));
13757
13758     case CALL_EXPR:
13759       return alloca_call_p (t);
13760
13761     default:
13762       break;
13763     }
13764   return false;
13765 }
13766
13767 /* Return true when T is an address and is known to be nonzero.
13768    Handle warnings about undefined signed overflow.  */
13769
13770 bool
13771 tree_expr_nonzero_p (tree t)
13772 {
13773   bool ret, strict_overflow_p;
13774
13775   strict_overflow_p = false;
13776   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
13777   if (strict_overflow_p)
13778     fold_overflow_warning (("assuming signed overflow does not occur when "
13779                             "determining that expression is always "
13780                             "non-zero"),
13781                            WARN_STRICT_OVERFLOW_MISC);
13782   return ret;
13783 }
13784
13785 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
13786    attempt to fold the expression to a constant without modifying TYPE,
13787    OP0 or OP1.
13788
13789    If the expression could be simplified to a constant, then return
13790    the constant.  If the expression would not be simplified to a
13791    constant, then return NULL_TREE.  */
13792
13793 tree
13794 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
13795 {
13796   tree tem = fold_binary (code, type, op0, op1);
13797   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13798 }
13799
13800 /* Given the components of a unary expression CODE, TYPE and OP0,
13801    attempt to fold the expression to a constant without modifying
13802    TYPE or OP0.
13803
13804    If the expression could be simplified to a constant, then return
13805    the constant.  If the expression would not be simplified to a
13806    constant, then return NULL_TREE.  */
13807
13808 tree
13809 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
13810 {
13811   tree tem = fold_unary (code, type, op0);
13812   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13813 }
13814
13815 /* If EXP represents referencing an element in a constant string
13816    (either via pointer arithmetic or array indexing), return the
13817    tree representing the value accessed, otherwise return NULL.  */
13818
13819 tree
13820 fold_read_from_constant_string (tree exp)
13821 {
13822   if ((TREE_CODE (exp) == INDIRECT_REF
13823        || TREE_CODE (exp) == ARRAY_REF)
13824       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
13825     {
13826       tree exp1 = TREE_OPERAND (exp, 0);
13827       tree index;
13828       tree string;
13829
13830       if (TREE_CODE (exp) == INDIRECT_REF)
13831         string = string_constant (exp1, &index);
13832       else
13833         {
13834           tree low_bound = array_ref_low_bound (exp);
13835           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
13836
13837           /* Optimize the special-case of a zero lower bound.
13838
13839              We convert the low_bound to sizetype to avoid some problems
13840              with constant folding.  (E.g. suppose the lower bound is 1,
13841              and its mode is QI.  Without the conversion,l (ARRAY
13842              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
13843              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
13844           if (! integer_zerop (low_bound))
13845             index = size_diffop (index, fold_convert (sizetype, low_bound));
13846
13847           string = exp1;
13848         }
13849
13850       if (string
13851           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
13852           && TREE_CODE (string) == STRING_CST
13853           && TREE_CODE (index) == INTEGER_CST
13854           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
13855           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
13856               == MODE_INT)
13857           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
13858         return fold_convert (TREE_TYPE (exp),
13859                              build_int_cst (NULL_TREE,
13860                                             (TREE_STRING_POINTER (string)
13861                                              [TREE_INT_CST_LOW (index)])));
13862     }
13863   return NULL;
13864 }
13865
13866 /* Return the tree for neg (ARG0) when ARG0 is known to be either
13867    an integer constant or real constant.
13868
13869    TYPE is the type of the result.  */
13870
13871 static tree
13872 fold_negate_const (tree arg0, tree type)
13873 {
13874   tree t = NULL_TREE;
13875
13876   switch (TREE_CODE (arg0))
13877     {
13878     case INTEGER_CST:
13879       {
13880         unsigned HOST_WIDE_INT low;
13881         HOST_WIDE_INT high;
13882         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13883                                    TREE_INT_CST_HIGH (arg0),
13884                                    &low, &high);
13885         t = force_fit_type_double (type, low, high, 1,
13886                                    (overflow | TREE_OVERFLOW (arg0))
13887                                    && !TYPE_UNSIGNED (type));
13888         break;
13889       }
13890
13891     case REAL_CST:
13892       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13893       break;
13894
13895     default:
13896       gcc_unreachable ();
13897     }
13898
13899   return t;
13900 }
13901
13902 /* Return the tree for abs (ARG0) when ARG0 is known to be either
13903    an integer constant or real constant.
13904
13905    TYPE is the type of the result.  */
13906
13907 tree
13908 fold_abs_const (tree arg0, tree type)
13909 {
13910   tree t = NULL_TREE;
13911
13912   switch (TREE_CODE (arg0))
13913     {
13914     case INTEGER_CST:
13915       /* If the value is unsigned, then the absolute value is
13916          the same as the ordinary value.  */
13917       if (TYPE_UNSIGNED (type))
13918         t = arg0;
13919       /* Similarly, if the value is non-negative.  */
13920       else if (INT_CST_LT (integer_minus_one_node, arg0))
13921         t = arg0;
13922       /* If the value is negative, then the absolute value is
13923          its negation.  */
13924       else
13925         {
13926           unsigned HOST_WIDE_INT low;
13927           HOST_WIDE_INT high;
13928           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13929                                      TREE_INT_CST_HIGH (arg0),
13930                                      &low, &high);
13931           t = force_fit_type_double (type, low, high, -1,
13932                                      overflow | TREE_OVERFLOW (arg0));
13933         }
13934       break;
13935
13936     case REAL_CST:
13937       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
13938         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13939       else
13940         t =  arg0;
13941       break;
13942
13943     default:
13944       gcc_unreachable ();
13945     }
13946
13947   return t;
13948 }
13949
13950 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
13951    constant.  TYPE is the type of the result.  */
13952
13953 static tree
13954 fold_not_const (tree arg0, tree type)
13955 {
13956   tree t = NULL_TREE;
13957
13958   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
13959
13960   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
13961                              ~TREE_INT_CST_HIGH (arg0), 0,
13962                              TREE_OVERFLOW (arg0));
13963
13964   return t;
13965 }
13966
13967 /* Given CODE, a relational operator, the target type, TYPE and two
13968    constant operands OP0 and OP1, return the result of the
13969    relational operation.  If the result is not a compile time
13970    constant, then return NULL_TREE.  */
13971
13972 static tree
13973 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
13974 {
13975   int result, invert;
13976
13977   /* From here on, the only cases we handle are when the result is
13978      known to be a constant.  */
13979
13980   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
13981     {
13982       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
13983       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
13984
13985       /* Handle the cases where either operand is a NaN.  */
13986       if (real_isnan (c0) || real_isnan (c1))
13987         {
13988           switch (code)
13989             {
13990             case EQ_EXPR:
13991             case ORDERED_EXPR:
13992               result = 0;
13993               break;
13994
13995             case NE_EXPR:
13996             case UNORDERED_EXPR:
13997             case UNLT_EXPR:
13998             case UNLE_EXPR:
13999             case UNGT_EXPR:
14000             case UNGE_EXPR:
14001             case UNEQ_EXPR:
14002               result = 1;
14003               break;
14004
14005             case LT_EXPR:
14006             case LE_EXPR:
14007             case GT_EXPR:
14008             case GE_EXPR:
14009             case LTGT_EXPR:
14010               if (flag_trapping_math)
14011                 return NULL_TREE;
14012               result = 0;
14013               break;
14014
14015             default:
14016               gcc_unreachable ();
14017             }
14018
14019           return constant_boolean_node (result, type);
14020         }
14021
14022       return constant_boolean_node (real_compare (code, c0, c1), type);
14023     }
14024
14025   /* Handle equality/inequality of complex constants.  */
14026   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14027     {
14028       tree rcond = fold_relational_const (code, type,
14029                                           TREE_REALPART (op0),
14030                                           TREE_REALPART (op1));
14031       tree icond = fold_relational_const (code, type,
14032                                           TREE_IMAGPART (op0),
14033                                           TREE_IMAGPART (op1));
14034       if (code == EQ_EXPR)
14035         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14036       else if (code == NE_EXPR)
14037         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14038       else
14039         return NULL_TREE;
14040     }
14041
14042   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14043
14044      To compute GT, swap the arguments and do LT.
14045      To compute GE, do LT and invert the result.
14046      To compute LE, swap the arguments, do LT and invert the result.
14047      To compute NE, do EQ and invert the result.
14048
14049      Therefore, the code below must handle only EQ and LT.  */
14050
14051   if (code == LE_EXPR || code == GT_EXPR)
14052     {
14053       tree tem = op0;
14054       op0 = op1;
14055       op1 = tem;
14056       code = swap_tree_comparison (code);
14057     }
14058
14059   /* Note that it is safe to invert for real values here because we
14060      have already handled the one case that it matters.  */
14061
14062   invert = 0;
14063   if (code == NE_EXPR || code == GE_EXPR)
14064     {
14065       invert = 1;
14066       code = invert_tree_comparison (code, false);
14067     }
14068
14069   /* Compute a result for LT or EQ if args permit;
14070      Otherwise return T.  */
14071   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14072     {
14073       if (code == EQ_EXPR)
14074         result = tree_int_cst_equal (op0, op1);
14075       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14076         result = INT_CST_LT_UNSIGNED (op0, op1);
14077       else
14078         result = INT_CST_LT (op0, op1);
14079     }
14080   else
14081     return NULL_TREE;
14082
14083   if (invert)
14084     result ^= 1;
14085   return constant_boolean_node (result, type);
14086 }
14087
14088 /* Build an expression for the a clean point containing EXPR with type TYPE.
14089    Don't build a cleanup point expression for EXPR which don't have side
14090    effects.  */
14091
14092 tree
14093 fold_build_cleanup_point_expr (tree type, tree expr)
14094 {
14095   /* If the expression does not have side effects then we don't have to wrap
14096      it with a cleanup point expression.  */
14097   if (!TREE_SIDE_EFFECTS (expr))
14098     return expr;
14099
14100   /* If the expression is a return, check to see if the expression inside the
14101      return has no side effects or the right hand side of the modify expression
14102      inside the return. If either don't have side effects set we don't need to
14103      wrap the expression in a cleanup point expression.  Note we don't check the
14104      left hand side of the modify because it should always be a return decl.  */
14105   if (TREE_CODE (expr) == RETURN_EXPR)
14106     {
14107       tree op = TREE_OPERAND (expr, 0);
14108       if (!op || !TREE_SIDE_EFFECTS (op))
14109         return expr;
14110       op = TREE_OPERAND (op, 1);
14111       if (!TREE_SIDE_EFFECTS (op))
14112         return expr;
14113     }
14114   
14115   return build1 (CLEANUP_POINT_EXPR, type, expr);
14116 }
14117
14118 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
14119    avoid confusing the gimplify process.  */
14120
14121 tree
14122 build_fold_addr_expr_with_type (tree t, tree ptrtype)
14123 {
14124   /* The size of the object is not relevant when talking about its address.  */
14125   if (TREE_CODE (t) == WITH_SIZE_EXPR)
14126     t = TREE_OPERAND (t, 0);
14127
14128   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
14129   if (TREE_CODE (t) == INDIRECT_REF
14130       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
14131     {
14132       t = TREE_OPERAND (t, 0);
14133       if (TREE_TYPE (t) != ptrtype)
14134         t = build1 (NOP_EXPR, ptrtype, t);
14135     }
14136   else
14137     {
14138       tree base = t;
14139
14140       while (handled_component_p (base))
14141         base = TREE_OPERAND (base, 0);
14142       if (DECL_P (base))
14143         TREE_ADDRESSABLE (base) = 1;
14144
14145       t = build1 (ADDR_EXPR, ptrtype, t);
14146     }
14147
14148   return t;
14149 }
14150
14151 tree
14152 build_fold_addr_expr (tree t)
14153 {
14154   return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
14155 }
14156
14157 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14158    of an indirection through OP0, or NULL_TREE if no simplification is
14159    possible.  */
14160
14161 tree
14162 fold_indirect_ref_1 (tree type, tree op0)
14163 {
14164   tree sub = op0;
14165   tree subtype;
14166
14167   STRIP_NOPS (sub);
14168   subtype = TREE_TYPE (sub);
14169   if (!POINTER_TYPE_P (subtype))
14170     return NULL_TREE;
14171
14172   if (TREE_CODE (sub) == ADDR_EXPR)
14173     {
14174       tree op = TREE_OPERAND (sub, 0);
14175       tree optype = TREE_TYPE (op);
14176       /* *&CONST_DECL -> to the value of the const decl.  */
14177       if (TREE_CODE (op) == CONST_DECL)
14178         return DECL_INITIAL (op);
14179       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
14180       if (type == optype)
14181         {
14182           tree fop = fold_read_from_constant_string (op);
14183           if (fop)
14184             return fop;
14185           else
14186             return op;
14187         }
14188       /* *(foo *)&fooarray => fooarray[0] */
14189       else if (TREE_CODE (optype) == ARRAY_TYPE
14190                && type == TREE_TYPE (optype))
14191         {
14192           tree type_domain = TYPE_DOMAIN (optype);
14193           tree min_val = size_zero_node;
14194           if (type_domain && TYPE_MIN_VALUE (type_domain))
14195             min_val = TYPE_MIN_VALUE (type_domain);
14196           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14197         }
14198       /* *(foo *)&complexfoo => __real__ complexfoo */
14199       else if (TREE_CODE (optype) == COMPLEX_TYPE
14200                && type == TREE_TYPE (optype))
14201         return fold_build1 (REALPART_EXPR, type, op);
14202       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14203       else if (TREE_CODE (optype) == VECTOR_TYPE
14204                && type == TREE_TYPE (optype))
14205         {
14206           tree part_width = TYPE_SIZE (type);
14207           tree index = bitsize_int (0);
14208           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
14209         }
14210     }
14211
14212   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
14213   if (TREE_CODE (sub) == PLUS_EXPR
14214       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
14215     {
14216       tree op00 = TREE_OPERAND (sub, 0);
14217       tree op01 = TREE_OPERAND (sub, 1);
14218       tree op00type;
14219
14220       STRIP_NOPS (op00);
14221       op00type = TREE_TYPE (op00);
14222       if (TREE_CODE (op00) == ADDR_EXPR
14223           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
14224           && type == TREE_TYPE (TREE_TYPE (op00type)))
14225         {
14226           tree size = TYPE_SIZE_UNIT (type);
14227           if (tree_int_cst_equal (size, op01))
14228             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
14229         }
14230     }
14231   
14232   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
14233   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
14234       && type == TREE_TYPE (TREE_TYPE (subtype)))
14235     {
14236       tree type_domain;
14237       tree min_val = size_zero_node;
14238       sub = build_fold_indirect_ref (sub);
14239       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
14240       if (type_domain && TYPE_MIN_VALUE (type_domain))
14241         min_val = TYPE_MIN_VALUE (type_domain);
14242       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
14243     }
14244
14245   return NULL_TREE;
14246 }
14247
14248 /* Builds an expression for an indirection through T, simplifying some
14249    cases.  */
14250
14251 tree
14252 build_fold_indirect_ref (tree t)
14253 {
14254   tree type = TREE_TYPE (TREE_TYPE (t));
14255   tree sub = fold_indirect_ref_1 (type, t);
14256
14257   if (sub)
14258     return sub;
14259   else
14260     return build1 (INDIRECT_REF, type, t);
14261 }
14262
14263 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
14264
14265 tree
14266 fold_indirect_ref (tree t)
14267 {
14268   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
14269
14270   if (sub)
14271     return sub;
14272   else
14273     return t;
14274 }
14275
14276 /* Strip non-trapping, non-side-effecting tree nodes from an expression
14277    whose result is ignored.  The type of the returned tree need not be
14278    the same as the original expression.  */
14279
14280 tree
14281 fold_ignored_result (tree t)
14282 {
14283   if (!TREE_SIDE_EFFECTS (t))
14284     return integer_zero_node;
14285
14286   for (;;)
14287     switch (TREE_CODE_CLASS (TREE_CODE (t)))
14288       {
14289       case tcc_unary:
14290         t = TREE_OPERAND (t, 0);
14291         break;
14292
14293       case tcc_binary:
14294       case tcc_comparison:
14295         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14296           t = TREE_OPERAND (t, 0);
14297         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
14298           t = TREE_OPERAND (t, 1);
14299         else
14300           return t;
14301         break;
14302
14303       case tcc_expression:
14304         switch (TREE_CODE (t))
14305           {
14306           case COMPOUND_EXPR:
14307             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14308               return t;
14309             t = TREE_OPERAND (t, 0);
14310             break;
14311
14312           case COND_EXPR:
14313             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
14314                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
14315               return t;
14316             t = TREE_OPERAND (t, 0);
14317             break;
14318
14319           default:
14320             return t;
14321           }
14322         break;
14323
14324       default:
14325         return t;
14326       }
14327 }
14328
14329 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
14330    This can only be applied to objects of a sizetype.  */
14331
14332 tree
14333 round_up (tree value, int divisor)
14334 {
14335   tree div = NULL_TREE;
14336
14337   gcc_assert (divisor > 0);
14338   if (divisor == 1)
14339     return value;
14340
14341   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14342      have to do anything.  Only do this when we are not given a const,
14343      because in that case, this check is more expensive than just
14344      doing it.  */
14345   if (TREE_CODE (value) != INTEGER_CST)
14346     {
14347       div = build_int_cst (TREE_TYPE (value), divisor);
14348
14349       if (multiple_of_p (TREE_TYPE (value), value, div))
14350         return value;
14351     }
14352
14353   /* If divisor is a power of two, simplify this to bit manipulation.  */
14354   if (divisor == (divisor & -divisor))
14355     {
14356       if (TREE_CODE (value) == INTEGER_CST)
14357         {
14358           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
14359           unsigned HOST_WIDE_INT high;
14360           bool overflow_p;
14361
14362           if ((low & (divisor - 1)) == 0)
14363             return value;
14364
14365           overflow_p = TREE_OVERFLOW (value);
14366           high = TREE_INT_CST_HIGH (value);
14367           low &= ~(divisor - 1);
14368           low += divisor;
14369           if (low == 0)
14370             {
14371               high++;
14372               if (high == 0)
14373                 overflow_p = true;
14374             }
14375
14376           return force_fit_type_double (TREE_TYPE (value), low, high,
14377                                         -1, overflow_p);
14378         }
14379       else
14380         {
14381           tree t;
14382
14383           t = build_int_cst (TREE_TYPE (value), divisor - 1);
14384           value = size_binop (PLUS_EXPR, value, t);
14385           t = build_int_cst (TREE_TYPE (value), -divisor);
14386           value = size_binop (BIT_AND_EXPR, value, t);
14387         }
14388     }
14389   else
14390     {
14391       if (!div)
14392         div = build_int_cst (TREE_TYPE (value), divisor);
14393       value = size_binop (CEIL_DIV_EXPR, value, div);
14394       value = size_binop (MULT_EXPR, value, div);
14395     }
14396
14397   return value;
14398 }
14399
14400 /* Likewise, but round down.  */
14401
14402 tree
14403 round_down (tree value, int divisor)
14404 {
14405   tree div = NULL_TREE;
14406
14407   gcc_assert (divisor > 0);
14408   if (divisor == 1)
14409     return value;
14410
14411   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14412      have to do anything.  Only do this when we are not given a const,
14413      because in that case, this check is more expensive than just
14414      doing it.  */
14415   if (TREE_CODE (value) != INTEGER_CST)
14416     {
14417       div = build_int_cst (TREE_TYPE (value), divisor);
14418
14419       if (multiple_of_p (TREE_TYPE (value), value, div))
14420         return value;
14421     }
14422
14423   /* If divisor is a power of two, simplify this to bit manipulation.  */
14424   if (divisor == (divisor & -divisor))
14425     {
14426       tree t;
14427
14428       t = build_int_cst (TREE_TYPE (value), -divisor);
14429       value = size_binop (BIT_AND_EXPR, value, t);
14430     }
14431   else
14432     {
14433       if (!div)
14434         div = build_int_cst (TREE_TYPE (value), divisor);
14435       value = size_binop (FLOOR_DIV_EXPR, value, div);
14436       value = size_binop (MULT_EXPR, value, div);
14437     }
14438
14439   return value;
14440 }
14441
14442 /* Returns the pointer to the base of the object addressed by EXP and
14443    extracts the information about the offset of the access, storing it
14444    to PBITPOS and POFFSET.  */
14445
14446 static tree
14447 split_address_to_core_and_offset (tree exp,
14448                                   HOST_WIDE_INT *pbitpos, tree *poffset)
14449 {
14450   tree core;
14451   enum machine_mode mode;
14452   int unsignedp, volatilep;
14453   HOST_WIDE_INT bitsize;
14454
14455   if (TREE_CODE (exp) == ADDR_EXPR)
14456     {
14457       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
14458                                   poffset, &mode, &unsignedp, &volatilep,
14459                                   false);
14460       core = build_fold_addr_expr (core);
14461     }
14462   else
14463     {
14464       core = exp;
14465       *pbitpos = 0;
14466       *poffset = NULL_TREE;
14467     }
14468
14469   return core;
14470 }
14471
14472 /* Returns true if addresses of E1 and E2 differ by a constant, false
14473    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
14474
14475 bool
14476 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
14477 {
14478   tree core1, core2;
14479   HOST_WIDE_INT bitpos1, bitpos2;
14480   tree toffset1, toffset2, tdiff, type;
14481
14482   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
14483   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
14484
14485   if (bitpos1 % BITS_PER_UNIT != 0
14486       || bitpos2 % BITS_PER_UNIT != 0
14487       || !operand_equal_p (core1, core2, 0))
14488     return false;
14489
14490   if (toffset1 && toffset2)
14491     {
14492       type = TREE_TYPE (toffset1);
14493       if (type != TREE_TYPE (toffset2))
14494         toffset2 = fold_convert (type, toffset2);
14495
14496       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
14497       if (!cst_and_fits_in_hwi (tdiff))
14498         return false;
14499
14500       *diff = int_cst_value (tdiff);
14501     }
14502   else if (toffset1 || toffset2)
14503     {
14504       /* If only one of the offsets is non-constant, the difference cannot
14505          be a constant.  */
14506       return false;
14507     }
14508   else
14509     *diff = 0;
14510
14511   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
14512   return true;
14513 }
14514
14515 /* Simplify the floating point expression EXP when the sign of the
14516    result is not significant.  Return NULL_TREE if no simplification
14517    is possible.  */
14518
14519 tree
14520 fold_strip_sign_ops (tree exp)
14521 {
14522   tree arg0, arg1;
14523
14524   switch (TREE_CODE (exp))
14525     {
14526     case ABS_EXPR:
14527     case NEGATE_EXPR:
14528       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14529       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
14530
14531     case MULT_EXPR:
14532     case RDIV_EXPR:
14533       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
14534         return NULL_TREE;
14535       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14536       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14537       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
14538         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
14539                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
14540                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
14541       break;
14542
14543     case COMPOUND_EXPR:
14544       arg0 = TREE_OPERAND (exp, 0);
14545       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14546       if (arg1)
14547         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
14548       break;
14549       
14550     case COND_EXPR:
14551       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14552       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
14553       if (arg0 || arg1)
14554         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
14555                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
14556                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
14557       break;
14558       
14559     case CALL_EXPR:
14560       {
14561         const enum built_in_function fcode = builtin_mathfn_code (exp);
14562         switch (fcode)
14563         {
14564         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14565           /* Strip copysign function call, return the 1st argument. */
14566           arg0 = CALL_EXPR_ARG (exp, 0);
14567           arg1 = CALL_EXPR_ARG (exp, 1);
14568           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
14569
14570         default:
14571           /* Strip sign ops from the argument of "odd" math functions.  */
14572           if (negate_mathfn_p (fcode))
14573             {
14574               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
14575               if (arg0)
14576                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
14577             }
14578           break;
14579         }
14580       }
14581       break;
14582
14583     default:
14584       break;
14585     }
14586   return NULL_TREE;
14587 }