OSDN Git Service

* decl.c (get_atexit_fn_ptr_type): New function.
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 /*@@ This file should be rewritten to use an arbitrary precision
24   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
25   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
26   @@ The routines that translate from the ap rep should
27   @@ warn if precision et. al. is lost.
28   @@ This would also make life easier when this technology is used
29   @@ for cross-compilers.  */
30
31 /* The entry points in this file are fold, size_int_wide, size_binop
32    and force_fit_type_double.
33
34    fold takes a tree as argument and returns a simplified tree.
35
36    size_binop takes a tree code for an arithmetic operation
37    and two operands that are trees, and produces a tree for the
38    result, assuming the type comes from `sizetype'.
39
40    size_int takes an integer value, and creates a tree constant
41    with type from `sizetype'.
42
43    force_fit_type_double takes a constant, an overflowable flag and a
44    prior overflow indicator.  It forces the value to fit the type and
45    sets TREE_OVERFLOW.
46
47    Note: Since the folders get called on non-gimple code as well as
48    gimple code, we need to handle GIMPLE tuples as well as their
49    corresponding tree equivalents.  */
50
51 #include "config.h"
52 #include "system.h"
53 #include "coretypes.h"
54 #include "tm.h"
55 #include "flags.h"
56 #include "tree.h"
57 #include "real.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "toplev.h"
62 #include "intl.h"
63 #include "ggc.h"
64 #include "hashtab.h"
65 #include "langhooks.h"
66 #include "md5.h"
67
68 /* Nonzero if we are folding constants inside an initializer; zero
69    otherwise.  */
70 int folding_initializer = 0;
71
72 /* The following constants represent a bit based encoding of GCC's
73    comparison operators.  This encoding simplifies transformations
74    on relational comparison operators, such as AND and OR.  */
75 enum comparison_code {
76   COMPCODE_FALSE = 0,
77   COMPCODE_LT = 1,
78   COMPCODE_EQ = 2,
79   COMPCODE_LE = 3,
80   COMPCODE_GT = 4,
81   COMPCODE_LTGT = 5,
82   COMPCODE_GE = 6,
83   COMPCODE_ORD = 7,
84   COMPCODE_UNORD = 8,
85   COMPCODE_UNLT = 9,
86   COMPCODE_UNEQ = 10,
87   COMPCODE_UNLE = 11,
88   COMPCODE_UNGT = 12,
89   COMPCODE_NE = 13,
90   COMPCODE_UNGE = 14,
91   COMPCODE_TRUE = 15
92 };
93
94 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
95 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
96 static bool negate_mathfn_p (enum built_in_function);
97 static bool negate_expr_p (tree);
98 static tree negate_expr (tree);
99 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
100 static tree associate_trees (tree, tree, enum tree_code, tree);
101 static tree const_binop (enum tree_code, tree, tree, int);
102 static enum comparison_code comparison_to_compcode (enum tree_code);
103 static enum tree_code compcode_to_comparison (enum comparison_code);
104 static tree combine_comparisons (enum tree_code, enum tree_code,
105                                  enum tree_code, tree, tree, tree);
106 static int truth_value_p (enum tree_code);
107 static int operand_equal_for_comparison_p (tree, tree, tree);
108 static int twoval_comparison_p (tree, tree *, tree *, int *);
109 static tree eval_subst (tree, tree, tree, tree, tree);
110 static tree pedantic_omit_one_operand (tree, tree, tree);
111 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
112 static tree make_bit_field_ref (tree, tree, int, int, int);
113 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
114 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
115                                     enum machine_mode *, int *, int *,
116                                     tree *, tree *);
117 static int all_ones_mask_p (tree, int);
118 static tree sign_bit_p (tree, tree);
119 static int simple_operand_p (tree);
120 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
121 static tree range_predecessor (tree);
122 static tree range_successor (tree);
123 static tree make_range (tree, int *, tree *, tree *, bool *);
124 static tree build_range_check (tree, tree, int, tree, tree);
125 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
126                          tree);
127 static tree fold_range_test (enum tree_code, tree, tree, tree);
128 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
129 static tree unextend (tree, int, int, tree);
130 static tree fold_truthop (enum tree_code, tree, tree, tree);
131 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
132 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
133 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
134 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
135                                                  tree, tree,
136                                                  tree, tree, int);
137 static bool fold_real_zero_addition_p (tree, tree, int);
138 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
139                                  tree, tree, tree);
140 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
141 static tree fold_div_compare (enum tree_code, tree, tree, tree);
142 static bool reorder_operands_p (tree, tree);
143 static tree fold_negate_const (tree, tree);
144 static tree fold_not_const (tree, tree);
145 static tree fold_relational_const (enum tree_code, tree, tree, tree);
146
147
148 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
149    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
150    and SUM1.  Then this yields nonzero if overflow occurred during the
151    addition.
152
153    Overflow occurs if A and B have the same sign, but A and SUM differ in
154    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
155    sign.  */
156 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
157 \f
158 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
159    We do that by representing the two-word integer in 4 words, with only
160    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
161    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
162
163 #define LOWPART(x) \
164   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
165 #define HIGHPART(x) \
166   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
167 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
168
169 /* Unpack a two-word integer into 4 words.
170    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
171    WORDS points to the array of HOST_WIDE_INTs.  */
172
173 static void
174 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
175 {
176   words[0] = LOWPART (low);
177   words[1] = HIGHPART (low);
178   words[2] = LOWPART (hi);
179   words[3] = HIGHPART (hi);
180 }
181
182 /* Pack an array of 4 words into a two-word integer.
183    WORDS points to the array of words.
184    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
185
186 static void
187 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
188         HOST_WIDE_INT *hi)
189 {
190   *low = words[0] + words[1] * BASE;
191   *hi = words[2] + words[3] * BASE;
192 }
193 \f
194 /* Force the double-word integer L1, H1 to be within the range of the
195    integer type TYPE.  Stores the properly truncated and sign-extended
196    double-word integer in *LV, *HV.  Returns true if the operation
197    overflows, that is, argument and result are different.  */
198
199 int
200 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
201                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, tree type)
202 {
203   unsigned HOST_WIDE_INT low0 = l1;
204   HOST_WIDE_INT high0 = h1;
205   unsigned int prec;
206   int sign_extended_type;
207
208   if (POINTER_TYPE_P (type)
209       || TREE_CODE (type) == OFFSET_TYPE)
210     prec = POINTER_SIZE;
211   else
212     prec = TYPE_PRECISION (type);
213
214   /* Size types *are* sign extended.  */
215   sign_extended_type = (!TYPE_UNSIGNED (type)
216                         || (TREE_CODE (type) == INTEGER_TYPE
217                             && TYPE_IS_SIZETYPE (type)));
218
219   /* First clear all bits that are beyond the type's precision.  */
220   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
221     ;
222   else if (prec > HOST_BITS_PER_WIDE_INT)
223     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
224   else
225     {
226       h1 = 0;
227       if (prec < HOST_BITS_PER_WIDE_INT)
228         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
229     }
230
231   /* Then do sign extension if necessary.  */
232   if (!sign_extended_type)
233     /* No sign extension */;
234   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
235     /* Correct width already.  */;
236   else if (prec > HOST_BITS_PER_WIDE_INT)
237     {
238       /* Sign extend top half? */
239       if (h1 & ((unsigned HOST_WIDE_INT)1
240                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
241         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
242     }
243   else if (prec == HOST_BITS_PER_WIDE_INT)
244     {
245       if ((HOST_WIDE_INT)l1 < 0)
246         h1 = -1;
247     }
248   else
249     {
250       /* Sign extend bottom half? */
251       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
252         {
253           h1 = -1;
254           l1 |= (HOST_WIDE_INT)(-1) << prec;
255         }
256     }
257
258   *lv = l1;
259   *hv = h1;
260
261   /* If the value didn't fit, signal overflow.  */
262   return l1 != low0 || h1 != high0;
263 }
264
265 /* We force the double-int HIGH:LOW to the range of the type TYPE by
266    sign or zero extending it.
267    OVERFLOWABLE indicates if we are interested
268    in overflow of the value, when >0 we are only interested in signed
269    overflow, for <0 we are interested in any overflow.  OVERFLOWED
270    indicates whether overflow has already occurred.  CONST_OVERFLOWED
271    indicates whether constant overflow has already occurred.  We force
272    T's value to be within range of T's type (by setting to 0 or 1 all
273    the bits outside the type's range).  We set TREE_OVERFLOWED if,
274         OVERFLOWED is nonzero,
275         or OVERFLOWABLE is >0 and signed overflow occurs
276         or OVERFLOWABLE is <0 and any overflow occurs
277    We return a new tree node for the extended double-int.  The node
278    is shared if no overflow flags are set.  */
279
280 tree
281 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
282                        HOST_WIDE_INT high, int overflowable,
283                        bool overflowed)
284 {
285   int sign_extended_type;
286   bool overflow;
287
288   /* Size types *are* sign extended.  */
289   sign_extended_type = (!TYPE_UNSIGNED (type)
290                         || (TREE_CODE (type) == INTEGER_TYPE
291                             && TYPE_IS_SIZETYPE (type)));
292
293   overflow = fit_double_type (low, high, &low, &high, type);
294
295   /* If we need to set overflow flags, return a new unshared node.  */
296   if (overflowed || overflow)
297     {
298       if (overflowed
299           || overflowable < 0
300           || (overflowable > 0 && sign_extended_type))
301         {
302           tree t = make_node (INTEGER_CST);
303           TREE_INT_CST_LOW (t) = low;
304           TREE_INT_CST_HIGH (t) = high;
305           TREE_TYPE (t) = type;
306           TREE_OVERFLOW (t) = 1;
307           return t;
308         }
309     }
310
311   /* Else build a shared node.  */
312   return build_int_cst_wide (type, low, high);
313 }
314 \f
315 /* Add two doubleword integers with doubleword result.
316    Return nonzero if the operation overflows according to UNSIGNED_P.
317    Each argument is given as two `HOST_WIDE_INT' pieces.
318    One argument is L1 and H1; the other, L2 and H2.
319    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
320
321 int
322 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
323                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
324                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
325                       bool unsigned_p)
326 {
327   unsigned HOST_WIDE_INT l;
328   HOST_WIDE_INT h;
329
330   l = l1 + l2;
331   h = h1 + h2 + (l < l1);
332
333   *lv = l;
334   *hv = h;
335
336   if (unsigned_p)
337     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
338   else
339     return OVERFLOW_SUM_SIGN (h1, h2, h);
340 }
341
342 /* Negate a doubleword integer with doubleword result.
343    Return nonzero if the operation overflows, assuming it's signed.
344    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
345    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
346
347 int
348 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
349             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
350 {
351   if (l1 == 0)
352     {
353       *lv = 0;
354       *hv = - h1;
355       return (*hv & h1) < 0;
356     }
357   else
358     {
359       *lv = -l1;
360       *hv = ~h1;
361       return 0;
362     }
363 }
364 \f
365 /* Multiply two doubleword integers with doubleword result.
366    Return nonzero if the operation overflows according to UNSIGNED_P.
367    Each argument is given as two `HOST_WIDE_INT' pieces.
368    One argument is L1 and H1; the other, L2 and H2.
369    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
370
371 int
372 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
373                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
374                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
375                       bool unsigned_p)
376 {
377   HOST_WIDE_INT arg1[4];
378   HOST_WIDE_INT arg2[4];
379   HOST_WIDE_INT prod[4 * 2];
380   unsigned HOST_WIDE_INT carry;
381   int i, j, k;
382   unsigned HOST_WIDE_INT toplow, neglow;
383   HOST_WIDE_INT tophigh, neghigh;
384
385   encode (arg1, l1, h1);
386   encode (arg2, l2, h2);
387
388   memset (prod, 0, sizeof prod);
389
390   for (i = 0; i < 4; i++)
391     {
392       carry = 0;
393       for (j = 0; j < 4; j++)
394         {
395           k = i + j;
396           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
397           carry += arg1[i] * arg2[j];
398           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
399           carry += prod[k];
400           prod[k] = LOWPART (carry);
401           carry = HIGHPART (carry);
402         }
403       prod[i + 4] = carry;
404     }
405
406   decode (prod, lv, hv);
407   decode (prod + 4, &toplow, &tophigh);
408
409   /* Unsigned overflow is immediate.  */
410   if (unsigned_p)
411     return (toplow | tophigh) != 0;
412
413   /* Check for signed overflow by calculating the signed representation of the
414      top half of the result; it should agree with the low half's sign bit.  */
415   if (h1 < 0)
416     {
417       neg_double (l2, h2, &neglow, &neghigh);
418       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
419     }
420   if (h2 < 0)
421     {
422       neg_double (l1, h1, &neglow, &neghigh);
423       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
424     }
425   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
426 }
427 \f
428 /* Shift the doubleword integer in L1, H1 left by COUNT places
429    keeping only PREC bits of result.
430    Shift right if COUNT is negative.
431    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
432    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
433
434 void
435 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
436                HOST_WIDE_INT count, unsigned int prec,
437                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
438 {
439   unsigned HOST_WIDE_INT signmask;
440
441   if (count < 0)
442     {
443       rshift_double (l1, h1, -count, prec, lv, hv, arith);
444       return;
445     }
446
447   if (SHIFT_COUNT_TRUNCATED)
448     count %= prec;
449
450   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
451     {
452       /* Shifting by the host word size is undefined according to the
453          ANSI standard, so we must handle this as a special case.  */
454       *hv = 0;
455       *lv = 0;
456     }
457   else if (count >= HOST_BITS_PER_WIDE_INT)
458     {
459       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
460       *lv = 0;
461     }
462   else
463     {
464       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
465              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
466       *lv = l1 << count;
467     }
468
469   /* Sign extend all bits that are beyond the precision.  */
470
471   signmask = -((prec > HOST_BITS_PER_WIDE_INT
472                 ? ((unsigned HOST_WIDE_INT) *hv
473                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
474                 : (*lv >> (prec - 1))) & 1);
475
476   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
477     ;
478   else if (prec >= HOST_BITS_PER_WIDE_INT)
479     {
480       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
481       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
482     }
483   else
484     {
485       *hv = signmask;
486       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
487       *lv |= signmask << prec;
488     }
489 }
490
491 /* Shift the doubleword integer in L1, H1 right by COUNT places
492    keeping only PREC bits of result.  COUNT must be positive.
493    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
494    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
495
496 void
497 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
498                HOST_WIDE_INT count, unsigned int prec,
499                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
500                int arith)
501 {
502   unsigned HOST_WIDE_INT signmask;
503
504   signmask = (arith
505               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
506               : 0);
507
508   if (SHIFT_COUNT_TRUNCATED)
509     count %= prec;
510
511   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
512     {
513       /* Shifting by the host word size is undefined according to the
514          ANSI standard, so we must handle this as a special case.  */
515       *hv = 0;
516       *lv = 0;
517     }
518   else if (count >= HOST_BITS_PER_WIDE_INT)
519     {
520       *hv = 0;
521       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
522     }
523   else
524     {
525       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
526       *lv = ((l1 >> count)
527              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
528     }
529
530   /* Zero / sign extend all bits that are beyond the precision.  */
531
532   if (count >= (HOST_WIDE_INT)prec)
533     {
534       *hv = signmask;
535       *lv = signmask;
536     }
537   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
538     ;
539   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
540     {
541       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
542       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
543     }
544   else
545     {
546       *hv = signmask;
547       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
548       *lv |= signmask << (prec - count);
549     }
550 }
551 \f
552 /* Rotate the doubleword integer in L1, H1 left by COUNT places
553    keeping only PREC bits of result.
554    Rotate right if COUNT is negative.
555    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
556
557 void
558 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
559                 HOST_WIDE_INT count, unsigned int prec,
560                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
561 {
562   unsigned HOST_WIDE_INT s1l, s2l;
563   HOST_WIDE_INT s1h, s2h;
564
565   count %= prec;
566   if (count < 0)
567     count += prec;
568
569   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
570   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
571   *lv = s1l | s2l;
572   *hv = s1h | s2h;
573 }
574
575 /* Rotate the doubleword integer in L1, H1 left by COUNT places
576    keeping only PREC bits of result.  COUNT must be positive.
577    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
578
579 void
580 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
581                 HOST_WIDE_INT count, unsigned int prec,
582                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
583 {
584   unsigned HOST_WIDE_INT s1l, s2l;
585   HOST_WIDE_INT s1h, s2h;
586
587   count %= prec;
588   if (count < 0)
589     count += prec;
590
591   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
592   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
593   *lv = s1l | s2l;
594   *hv = s1h | s2h;
595 }
596 \f
597 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
598    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
599    CODE is a tree code for a kind of division, one of
600    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
601    or EXACT_DIV_EXPR
602    It controls how the quotient is rounded to an integer.
603    Return nonzero if the operation overflows.
604    UNS nonzero says do unsigned division.  */
605
606 int
607 div_and_round_double (enum tree_code code, int uns,
608                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
609                       HOST_WIDE_INT hnum_orig,
610                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
611                       HOST_WIDE_INT hden_orig,
612                       unsigned HOST_WIDE_INT *lquo,
613                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
614                       HOST_WIDE_INT *hrem)
615 {
616   int quo_neg = 0;
617   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
618   HOST_WIDE_INT den[4], quo[4];
619   int i, j;
620   unsigned HOST_WIDE_INT work;
621   unsigned HOST_WIDE_INT carry = 0;
622   unsigned HOST_WIDE_INT lnum = lnum_orig;
623   HOST_WIDE_INT hnum = hnum_orig;
624   unsigned HOST_WIDE_INT lden = lden_orig;
625   HOST_WIDE_INT hden = hden_orig;
626   int overflow = 0;
627
628   if (hden == 0 && lden == 0)
629     overflow = 1, lden = 1;
630
631   /* Calculate quotient sign and convert operands to unsigned.  */
632   if (!uns)
633     {
634       if (hnum < 0)
635         {
636           quo_neg = ~ quo_neg;
637           /* (minimum integer) / (-1) is the only overflow case.  */
638           if (neg_double (lnum, hnum, &lnum, &hnum)
639               && ((HOST_WIDE_INT) lden & hden) == -1)
640             overflow = 1;
641         }
642       if (hden < 0)
643         {
644           quo_neg = ~ quo_neg;
645           neg_double (lden, hden, &lden, &hden);
646         }
647     }
648
649   if (hnum == 0 && hden == 0)
650     {                           /* single precision */
651       *hquo = *hrem = 0;
652       /* This unsigned division rounds toward zero.  */
653       *lquo = lnum / lden;
654       goto finish_up;
655     }
656
657   if (hnum == 0)
658     {                           /* trivial case: dividend < divisor */
659       /* hden != 0 already checked.  */
660       *hquo = *lquo = 0;
661       *hrem = hnum;
662       *lrem = lnum;
663       goto finish_up;
664     }
665
666   memset (quo, 0, sizeof quo);
667
668   memset (num, 0, sizeof num);  /* to zero 9th element */
669   memset (den, 0, sizeof den);
670
671   encode (num, lnum, hnum);
672   encode (den, lden, hden);
673
674   /* Special code for when the divisor < BASE.  */
675   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
676     {
677       /* hnum != 0 already checked.  */
678       for (i = 4 - 1; i >= 0; i--)
679         {
680           work = num[i] + carry * BASE;
681           quo[i] = work / lden;
682           carry = work % lden;
683         }
684     }
685   else
686     {
687       /* Full double precision division,
688          with thanks to Don Knuth's "Seminumerical Algorithms".  */
689       int num_hi_sig, den_hi_sig;
690       unsigned HOST_WIDE_INT quo_est, scale;
691
692       /* Find the highest nonzero divisor digit.  */
693       for (i = 4 - 1;; i--)
694         if (den[i] != 0)
695           {
696             den_hi_sig = i;
697             break;
698           }
699
700       /* Insure that the first digit of the divisor is at least BASE/2.
701          This is required by the quotient digit estimation algorithm.  */
702
703       scale = BASE / (den[den_hi_sig] + 1);
704       if (scale > 1)
705         {               /* scale divisor and dividend */
706           carry = 0;
707           for (i = 0; i <= 4 - 1; i++)
708             {
709               work = (num[i] * scale) + carry;
710               num[i] = LOWPART (work);
711               carry = HIGHPART (work);
712             }
713
714           num[4] = carry;
715           carry = 0;
716           for (i = 0; i <= 4 - 1; i++)
717             {
718               work = (den[i] * scale) + carry;
719               den[i] = LOWPART (work);
720               carry = HIGHPART (work);
721               if (den[i] != 0) den_hi_sig = i;
722             }
723         }
724
725       num_hi_sig = 4;
726
727       /* Main loop */
728       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
729         {
730           /* Guess the next quotient digit, quo_est, by dividing the first
731              two remaining dividend digits by the high order quotient digit.
732              quo_est is never low and is at most 2 high.  */
733           unsigned HOST_WIDE_INT tmp;
734
735           num_hi_sig = i + den_hi_sig + 1;
736           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
737           if (num[num_hi_sig] != den[den_hi_sig])
738             quo_est = work / den[den_hi_sig];
739           else
740             quo_est = BASE - 1;
741
742           /* Refine quo_est so it's usually correct, and at most one high.  */
743           tmp = work - quo_est * den[den_hi_sig];
744           if (tmp < BASE
745               && (den[den_hi_sig - 1] * quo_est
746                   > (tmp * BASE + num[num_hi_sig - 2])))
747             quo_est--;
748
749           /* Try QUO_EST as the quotient digit, by multiplying the
750              divisor by QUO_EST and subtracting from the remaining dividend.
751              Keep in mind that QUO_EST is the I - 1st digit.  */
752
753           carry = 0;
754           for (j = 0; j <= den_hi_sig; j++)
755             {
756               work = quo_est * den[j] + carry;
757               carry = HIGHPART (work);
758               work = num[i + j] - LOWPART (work);
759               num[i + j] = LOWPART (work);
760               carry += HIGHPART (work) != 0;
761             }
762
763           /* If quo_est was high by one, then num[i] went negative and
764              we need to correct things.  */
765           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
766             {
767               quo_est--;
768               carry = 0;                /* add divisor back in */
769               for (j = 0; j <= den_hi_sig; j++)
770                 {
771                   work = num[i + j] + den[j] + carry;
772                   carry = HIGHPART (work);
773                   num[i + j] = LOWPART (work);
774                 }
775
776               num [num_hi_sig] += carry;
777             }
778
779           /* Store the quotient digit.  */
780           quo[i] = quo_est;
781         }
782     }
783
784   decode (quo, lquo, hquo);
785
786  finish_up:
787   /* If result is negative, make it so.  */
788   if (quo_neg)
789     neg_double (*lquo, *hquo, lquo, hquo);
790
791   /* Compute trial remainder:  rem = num - (quo * den)  */
792   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
793   neg_double (*lrem, *hrem, lrem, hrem);
794   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
795
796   switch (code)
797     {
798     case TRUNC_DIV_EXPR:
799     case TRUNC_MOD_EXPR:        /* round toward zero */
800     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
801       return overflow;
802
803     case FLOOR_DIV_EXPR:
804     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
805       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
806         {
807           /* quo = quo - 1;  */
808           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
809                       lquo, hquo);
810         }
811       else
812         return overflow;
813       break;
814
815     case CEIL_DIV_EXPR:
816     case CEIL_MOD_EXPR:         /* round toward positive infinity */
817       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
818         {
819           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
820                       lquo, hquo);
821         }
822       else
823         return overflow;
824       break;
825
826     case ROUND_DIV_EXPR:
827     case ROUND_MOD_EXPR:        /* round to closest integer */
828       {
829         unsigned HOST_WIDE_INT labs_rem = *lrem;
830         HOST_WIDE_INT habs_rem = *hrem;
831         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
832         HOST_WIDE_INT habs_den = hden, htwice;
833
834         /* Get absolute values.  */
835         if (*hrem < 0)
836           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
837         if (hden < 0)
838           neg_double (lden, hden, &labs_den, &habs_den);
839
840         /* If (2 * abs (lrem) >= abs (lden)) */
841         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
842                     labs_rem, habs_rem, &ltwice, &htwice);
843
844         if (((unsigned HOST_WIDE_INT) habs_den
845              < (unsigned HOST_WIDE_INT) htwice)
846             || (((unsigned HOST_WIDE_INT) habs_den
847                  == (unsigned HOST_WIDE_INT) htwice)
848                 && (labs_den < ltwice)))
849           {
850             if (*hquo < 0)
851               /* quo = quo - 1;  */
852               add_double (*lquo, *hquo,
853                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
854             else
855               /* quo = quo + 1; */
856               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
857                           lquo, hquo);
858           }
859         else
860           return overflow;
861       }
862       break;
863
864     default:
865       gcc_unreachable ();
866     }
867
868   /* Compute true remainder:  rem = num - (quo * den)  */
869   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
870   neg_double (*lrem, *hrem, lrem, hrem);
871   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
872   return overflow;
873 }
874
875 /* If ARG2 divides ARG1 with zero remainder, carries out the division
876    of type CODE and returns the quotient.
877    Otherwise returns NULL_TREE.  */
878
879 static tree
880 div_if_zero_remainder (enum tree_code code, tree arg1, tree arg2)
881 {
882   unsigned HOST_WIDE_INT int1l, int2l;
883   HOST_WIDE_INT int1h, int2h;
884   unsigned HOST_WIDE_INT quol, reml;
885   HOST_WIDE_INT quoh, remh;
886   tree type = TREE_TYPE (arg1);
887   int uns = TYPE_UNSIGNED (type);
888
889   int1l = TREE_INT_CST_LOW (arg1);
890   int1h = TREE_INT_CST_HIGH (arg1);
891   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
892      &obj[some_exotic_number].  */
893   if (POINTER_TYPE_P (type))
894     {
895       uns = false;
896       type = signed_type_for (type);
897       fit_double_type (int1l, int1h, &int1l, &int1h,
898                        type);
899     }
900   else
901     fit_double_type (int1l, int1h, &int1l, &int1h, type);
902   int2l = TREE_INT_CST_LOW (arg2);
903   int2h = TREE_INT_CST_HIGH (arg2);
904
905   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
906                         &quol, &quoh, &reml, &remh);
907   if (remh != 0 || reml != 0)
908     return NULL_TREE;
909
910   return build_int_cst_wide (type, quol, quoh);
911 }
912 \f
913 /* This is nonzero if we should defer warnings about undefined
914    overflow.  This facility exists because these warnings are a
915    special case.  The code to estimate loop iterations does not want
916    to issue any warnings, since it works with expressions which do not
917    occur in user code.  Various bits of cleanup code call fold(), but
918    only use the result if it has certain characteristics (e.g., is a
919    constant); that code only wants to issue a warning if the result is
920    used.  */
921
922 static int fold_deferring_overflow_warnings;
923
924 /* If a warning about undefined overflow is deferred, this is the
925    warning.  Note that this may cause us to turn two warnings into
926    one, but that is fine since it is sufficient to only give one
927    warning per expression.  */
928
929 static const char* fold_deferred_overflow_warning;
930
931 /* If a warning about undefined overflow is deferred, this is the
932    level at which the warning should be emitted.  */
933
934 static enum warn_strict_overflow_code fold_deferred_overflow_code;
935
936 /* Start deferring overflow warnings.  We could use a stack here to
937    permit nested calls, but at present it is not necessary.  */
938
939 void
940 fold_defer_overflow_warnings (void)
941 {
942   ++fold_deferring_overflow_warnings;
943 }
944
945 /* Stop deferring overflow warnings.  If there is a pending warning,
946    and ISSUE is true, then issue the warning if appropriate.  STMT is
947    the statement with which the warning should be associated (used for
948    location information); STMT may be NULL.  CODE is the level of the
949    warning--a warn_strict_overflow_code value.  This function will use
950    the smaller of CODE and the deferred code when deciding whether to
951    issue the warning.  CODE may be zero to mean to always use the
952    deferred code.  */
953
954 void
955 fold_undefer_overflow_warnings (bool issue, tree stmt, int code)
956 {
957   const char *warnmsg;
958   location_t locus;
959
960   gcc_assert (fold_deferring_overflow_warnings > 0);
961   --fold_deferring_overflow_warnings;
962   if (fold_deferring_overflow_warnings > 0)
963     {
964       if (fold_deferred_overflow_warning != NULL
965           && code != 0
966           && code < (int) fold_deferred_overflow_code)
967         fold_deferred_overflow_code = code;
968       return;
969     }
970
971   warnmsg = fold_deferred_overflow_warning;
972   fold_deferred_overflow_warning = NULL;
973
974   if (!issue || warnmsg == NULL)
975     return;
976
977   /* Use the smallest code level when deciding to issue the
978      warning.  */
979   if (code == 0 || code > (int) fold_deferred_overflow_code)
980     code = fold_deferred_overflow_code;
981
982   if (!issue_strict_overflow_warning (code))
983     return;
984
985   if (stmt == NULL_TREE || !expr_has_location (stmt))
986     locus = input_location;
987   else
988     locus = expr_location (stmt);
989   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
990 }
991
992 /* Stop deferring overflow warnings, ignoring any deferred
993    warnings.  */
994
995 void
996 fold_undefer_and_ignore_overflow_warnings (void)
997 {
998   fold_undefer_overflow_warnings (false, NULL_TREE, 0);
999 }
1000
1001 /* Whether we are deferring overflow warnings.  */
1002
1003 bool
1004 fold_deferring_overflow_warnings_p (void)
1005 {
1006   return fold_deferring_overflow_warnings > 0;
1007 }
1008
1009 /* This is called when we fold something based on the fact that signed
1010    overflow is undefined.  */
1011
1012 static void
1013 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1014 {
1015   gcc_assert (!flag_wrapv && !flag_trapv);
1016   if (fold_deferring_overflow_warnings > 0)
1017     {
1018       if (fold_deferred_overflow_warning == NULL
1019           || wc < fold_deferred_overflow_code)
1020         {
1021           fold_deferred_overflow_warning = gmsgid;
1022           fold_deferred_overflow_code = wc;
1023         }
1024     }
1025   else if (issue_strict_overflow_warning (wc))
1026     warning (OPT_Wstrict_overflow, gmsgid);
1027 }
1028 \f
1029 /* Return true if the built-in mathematical function specified by CODE
1030    is odd, i.e. -f(x) == f(-x).  */
1031
1032 static bool
1033 negate_mathfn_p (enum built_in_function code)
1034 {
1035   switch (code)
1036     {
1037     CASE_FLT_FN (BUILT_IN_ASIN):
1038     CASE_FLT_FN (BUILT_IN_ASINH):
1039     CASE_FLT_FN (BUILT_IN_ATAN):
1040     CASE_FLT_FN (BUILT_IN_ATANH):
1041     CASE_FLT_FN (BUILT_IN_CASIN):
1042     CASE_FLT_FN (BUILT_IN_CASINH):
1043     CASE_FLT_FN (BUILT_IN_CATAN):
1044     CASE_FLT_FN (BUILT_IN_CATANH):
1045     CASE_FLT_FN (BUILT_IN_CBRT):
1046     CASE_FLT_FN (BUILT_IN_CPROJ):
1047     CASE_FLT_FN (BUILT_IN_CSIN):
1048     CASE_FLT_FN (BUILT_IN_CSINH):
1049     CASE_FLT_FN (BUILT_IN_CTAN):
1050     CASE_FLT_FN (BUILT_IN_CTANH):
1051     CASE_FLT_FN (BUILT_IN_ERF):
1052     CASE_FLT_FN (BUILT_IN_LLROUND):
1053     CASE_FLT_FN (BUILT_IN_LROUND):
1054     CASE_FLT_FN (BUILT_IN_ROUND):
1055     CASE_FLT_FN (BUILT_IN_SIN):
1056     CASE_FLT_FN (BUILT_IN_SINH):
1057     CASE_FLT_FN (BUILT_IN_TAN):
1058     CASE_FLT_FN (BUILT_IN_TANH):
1059     CASE_FLT_FN (BUILT_IN_TRUNC):
1060       return true;
1061
1062     CASE_FLT_FN (BUILT_IN_LLRINT):
1063     CASE_FLT_FN (BUILT_IN_LRINT):
1064     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1065     CASE_FLT_FN (BUILT_IN_RINT):
1066       return !flag_rounding_math;
1067     
1068     default:
1069       break;
1070     }
1071   return false;
1072 }
1073
1074 /* Check whether we may negate an integer constant T without causing
1075    overflow.  */
1076
1077 bool
1078 may_negate_without_overflow_p (tree t)
1079 {
1080   unsigned HOST_WIDE_INT val;
1081   unsigned int prec;
1082   tree type;
1083
1084   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1085
1086   type = TREE_TYPE (t);
1087   if (TYPE_UNSIGNED (type))
1088     return false;
1089
1090   prec = TYPE_PRECISION (type);
1091   if (prec > HOST_BITS_PER_WIDE_INT)
1092     {
1093       if (TREE_INT_CST_LOW (t) != 0)
1094         return true;
1095       prec -= HOST_BITS_PER_WIDE_INT;
1096       val = TREE_INT_CST_HIGH (t);
1097     }
1098   else
1099     val = TREE_INT_CST_LOW (t);
1100   if (prec < HOST_BITS_PER_WIDE_INT)
1101     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1102   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1103 }
1104
1105 /* Determine whether an expression T can be cheaply negated using
1106    the function negate_expr without introducing undefined overflow.  */
1107
1108 static bool
1109 negate_expr_p (tree t)
1110 {
1111   tree type;
1112
1113   if (t == 0)
1114     return false;
1115
1116   type = TREE_TYPE (t);
1117
1118   STRIP_SIGN_NOPS (t);
1119   switch (TREE_CODE (t))
1120     {
1121     case INTEGER_CST:
1122       if (TYPE_OVERFLOW_WRAPS (type))
1123         return true;
1124
1125       /* Check that -CST will not overflow type.  */
1126       return may_negate_without_overflow_p (t);
1127     case BIT_NOT_EXPR:
1128       return (INTEGRAL_TYPE_P (type)
1129               && TYPE_OVERFLOW_WRAPS (type));
1130
1131     case REAL_CST:
1132     case NEGATE_EXPR:
1133       return true;
1134
1135     case COMPLEX_CST:
1136       return negate_expr_p (TREE_REALPART (t))
1137              && negate_expr_p (TREE_IMAGPART (t));
1138
1139     case COMPLEX_EXPR:
1140       return negate_expr_p (TREE_OPERAND (t, 0))
1141              && negate_expr_p (TREE_OPERAND (t, 1));
1142
1143     case CONJ_EXPR:
1144       return negate_expr_p (TREE_OPERAND (t, 0));
1145
1146     case PLUS_EXPR:
1147       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1148           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1149         return false;
1150       /* -(A + B) -> (-B) - A.  */
1151       if (negate_expr_p (TREE_OPERAND (t, 1))
1152           && reorder_operands_p (TREE_OPERAND (t, 0),
1153                                  TREE_OPERAND (t, 1)))
1154         return true;
1155       /* -(A + B) -> (-A) - B.  */
1156       return negate_expr_p (TREE_OPERAND (t, 0));
1157
1158     case MINUS_EXPR:
1159       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1160       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1161              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1162              && reorder_operands_p (TREE_OPERAND (t, 0),
1163                                     TREE_OPERAND (t, 1));
1164
1165     case MULT_EXPR:
1166       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1167         break;
1168
1169       /* Fall through.  */
1170
1171     case RDIV_EXPR:
1172       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1173         return negate_expr_p (TREE_OPERAND (t, 1))
1174                || negate_expr_p (TREE_OPERAND (t, 0));
1175       break;
1176
1177     case TRUNC_DIV_EXPR:
1178     case ROUND_DIV_EXPR:
1179     case FLOOR_DIV_EXPR:
1180     case CEIL_DIV_EXPR:
1181     case EXACT_DIV_EXPR:
1182       /* In general we can't negate A / B, because if A is INT_MIN and
1183          B is 1, we may turn this into INT_MIN / -1 which is undefined
1184          and actually traps on some architectures.  But if overflow is
1185          undefined, we can negate, because - (INT_MIN / 1) is an
1186          overflow.  */
1187       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1188           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1189         break;
1190       return negate_expr_p (TREE_OPERAND (t, 1))
1191              || negate_expr_p (TREE_OPERAND (t, 0));
1192
1193     case NOP_EXPR:
1194       /* Negate -((double)float) as (double)(-float).  */
1195       if (TREE_CODE (type) == REAL_TYPE)
1196         {
1197           tree tem = strip_float_extensions (t);
1198           if (tem != t)
1199             return negate_expr_p (tem);
1200         }
1201       break;
1202
1203     case CALL_EXPR:
1204       /* Negate -f(x) as f(-x).  */
1205       if (negate_mathfn_p (builtin_mathfn_code (t)))
1206         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1207       break;
1208
1209     case RSHIFT_EXPR:
1210       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1211       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1212         {
1213           tree op1 = TREE_OPERAND (t, 1);
1214           if (TREE_INT_CST_HIGH (op1) == 0
1215               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1216                  == TREE_INT_CST_LOW (op1))
1217             return true;
1218         }
1219       break;
1220
1221     default:
1222       break;
1223     }
1224   return false;
1225 }
1226
1227 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1228    simplification is possible.
1229    If negate_expr_p would return true for T, NULL_TREE will never be
1230    returned.  */
1231
1232 static tree
1233 fold_negate_expr (tree t)
1234 {
1235   tree type = TREE_TYPE (t);
1236   tree tem;
1237
1238   switch (TREE_CODE (t))
1239     {
1240     /* Convert - (~A) to A + 1.  */
1241     case BIT_NOT_EXPR:
1242       if (INTEGRAL_TYPE_P (type))
1243         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1244                             build_int_cst (type, 1));
1245       break;
1246       
1247     case INTEGER_CST:
1248       tem = fold_negate_const (t, type);
1249       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1250           || !TYPE_OVERFLOW_TRAPS (type))
1251         return tem;
1252       break;
1253
1254     case REAL_CST:
1255       tem = fold_negate_const (t, type);
1256       /* Two's complement FP formats, such as c4x, may overflow.  */
1257       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1258         return tem;
1259       break;
1260
1261     case COMPLEX_CST:
1262       {
1263         tree rpart = negate_expr (TREE_REALPART (t));
1264         tree ipart = negate_expr (TREE_IMAGPART (t));
1265
1266         if ((TREE_CODE (rpart) == REAL_CST
1267              && TREE_CODE (ipart) == REAL_CST)
1268             || (TREE_CODE (rpart) == INTEGER_CST
1269                 && TREE_CODE (ipart) == INTEGER_CST))
1270           return build_complex (type, rpart, ipart);
1271       }
1272       break;
1273
1274     case COMPLEX_EXPR:
1275       if (negate_expr_p (t))
1276         return fold_build2 (COMPLEX_EXPR, type,
1277                             fold_negate_expr (TREE_OPERAND (t, 0)),
1278                             fold_negate_expr (TREE_OPERAND (t, 1)));
1279       break;
1280       
1281     case CONJ_EXPR:
1282       if (negate_expr_p (t))
1283         return fold_build1 (CONJ_EXPR, type,
1284                             fold_negate_expr (TREE_OPERAND (t, 0)));
1285       break;
1286
1287     case NEGATE_EXPR:
1288       return TREE_OPERAND (t, 0);
1289
1290     case PLUS_EXPR:
1291       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1292           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1293         {
1294           /* -(A + B) -> (-B) - A.  */
1295           if (negate_expr_p (TREE_OPERAND (t, 1))
1296               && reorder_operands_p (TREE_OPERAND (t, 0),
1297                                      TREE_OPERAND (t, 1)))
1298             {
1299               tem = negate_expr (TREE_OPERAND (t, 1));
1300               return fold_build2 (MINUS_EXPR, type,
1301                                   tem, TREE_OPERAND (t, 0));
1302             }
1303
1304           /* -(A + B) -> (-A) - B.  */
1305           if (negate_expr_p (TREE_OPERAND (t, 0)))
1306             {
1307               tem = negate_expr (TREE_OPERAND (t, 0));
1308               return fold_build2 (MINUS_EXPR, type,
1309                                   tem, TREE_OPERAND (t, 1));
1310             }
1311         }
1312       break;
1313
1314     case MINUS_EXPR:
1315       /* - (A - B) -> B - A  */
1316       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1317           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1318           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1319         return fold_build2 (MINUS_EXPR, type,
1320                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1321       break;
1322
1323     case MULT_EXPR:
1324       if (TYPE_UNSIGNED (type))
1325         break;
1326
1327       /* Fall through.  */
1328
1329     case RDIV_EXPR:
1330       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1331         {
1332           tem = TREE_OPERAND (t, 1);
1333           if (negate_expr_p (tem))
1334             return fold_build2 (TREE_CODE (t), type,
1335                                 TREE_OPERAND (t, 0), negate_expr (tem));
1336           tem = TREE_OPERAND (t, 0);
1337           if (negate_expr_p (tem))
1338             return fold_build2 (TREE_CODE (t), type,
1339                                 negate_expr (tem), TREE_OPERAND (t, 1));
1340         }
1341       break;
1342
1343     case TRUNC_DIV_EXPR:
1344     case ROUND_DIV_EXPR:
1345     case FLOOR_DIV_EXPR:
1346     case CEIL_DIV_EXPR:
1347     case EXACT_DIV_EXPR:
1348       /* In general we can't negate A / B, because if A is INT_MIN and
1349          B is 1, we may turn this into INT_MIN / -1 which is undefined
1350          and actually traps on some architectures.  But if overflow is
1351          undefined, we can negate, because - (INT_MIN / 1) is an
1352          overflow.  */
1353       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1354         {
1355           const char * const warnmsg = G_("assuming signed overflow does not "
1356                                           "occur when negating a division");
1357           tem = TREE_OPERAND (t, 1);
1358           if (negate_expr_p (tem))
1359             {
1360               if (INTEGRAL_TYPE_P (type)
1361                   && (TREE_CODE (tem) != INTEGER_CST
1362                       || integer_onep (tem)))
1363                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1364               return fold_build2 (TREE_CODE (t), type,
1365                                   TREE_OPERAND (t, 0), negate_expr (tem));
1366             }
1367           tem = TREE_OPERAND (t, 0);
1368           if (negate_expr_p (tem))
1369             {
1370               if (INTEGRAL_TYPE_P (type)
1371                   && (TREE_CODE (tem) != INTEGER_CST
1372                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1373                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1374               return fold_build2 (TREE_CODE (t), type,
1375                                   negate_expr (tem), TREE_OPERAND (t, 1));
1376             }
1377         }
1378       break;
1379
1380     case NOP_EXPR:
1381       /* Convert -((double)float) into (double)(-float).  */
1382       if (TREE_CODE (type) == REAL_TYPE)
1383         {
1384           tem = strip_float_extensions (t);
1385           if (tem != t && negate_expr_p (tem))
1386             return negate_expr (tem);
1387         }
1388       break;
1389
1390     case CALL_EXPR:
1391       /* Negate -f(x) as f(-x).  */
1392       if (negate_mathfn_p (builtin_mathfn_code (t))
1393           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1394         {
1395           tree fndecl, arg;
1396
1397           fndecl = get_callee_fndecl (t);
1398           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1399           return build_call_expr (fndecl, 1, arg);
1400         }
1401       break;
1402
1403     case RSHIFT_EXPR:
1404       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1405       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1406         {
1407           tree op1 = TREE_OPERAND (t, 1);
1408           if (TREE_INT_CST_HIGH (op1) == 0
1409               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1410                  == TREE_INT_CST_LOW (op1))
1411             {
1412               tree ntype = TYPE_UNSIGNED (type)
1413                            ? lang_hooks.types.signed_type (type)
1414                            : unsigned_type_for (type);
1415               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1416               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1417               return fold_convert (type, temp);
1418             }
1419         }
1420       break;
1421
1422     default:
1423       break;
1424     }
1425
1426   return NULL_TREE;
1427 }
1428
1429 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1430    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1431    return NULL_TREE. */
1432
1433 static tree
1434 negate_expr (tree t)
1435 {
1436   tree type, tem;
1437
1438   if (t == NULL_TREE)
1439     return NULL_TREE;
1440
1441   type = TREE_TYPE (t);
1442   STRIP_SIGN_NOPS (t);
1443
1444   tem = fold_negate_expr (t);
1445   if (!tem)
1446     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1447   return fold_convert (type, tem);
1448 }
1449 \f
1450 /* Split a tree IN into a constant, literal and variable parts that could be
1451    combined with CODE to make IN.  "constant" means an expression with
1452    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1453    commutative arithmetic operation.  Store the constant part into *CONP,
1454    the literal in *LITP and return the variable part.  If a part isn't
1455    present, set it to null.  If the tree does not decompose in this way,
1456    return the entire tree as the variable part and the other parts as null.
1457
1458    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1459    case, we negate an operand that was subtracted.  Except if it is a
1460    literal for which we use *MINUS_LITP instead.
1461
1462    If NEGATE_P is true, we are negating all of IN, again except a literal
1463    for which we use *MINUS_LITP instead.
1464
1465    If IN is itself a literal or constant, return it as appropriate.
1466
1467    Note that we do not guarantee that any of the three values will be the
1468    same type as IN, but they will have the same signedness and mode.  */
1469
1470 static tree
1471 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1472             tree *minus_litp, int negate_p)
1473 {
1474   tree var = 0;
1475
1476   *conp = 0;
1477   *litp = 0;
1478   *minus_litp = 0;
1479
1480   /* Strip any conversions that don't change the machine mode or signedness.  */
1481   STRIP_SIGN_NOPS (in);
1482
1483   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
1484     *litp = in;
1485   else if (TREE_CODE (in) == code
1486            || (! FLOAT_TYPE_P (TREE_TYPE (in))
1487                /* We can associate addition and subtraction together (even
1488                   though the C standard doesn't say so) for integers because
1489                   the value is not affected.  For reals, the value might be
1490                   affected, so we can't.  */
1491                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1492                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1493     {
1494       tree op0 = TREE_OPERAND (in, 0);
1495       tree op1 = TREE_OPERAND (in, 1);
1496       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1497       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1498
1499       /* First see if either of the operands is a literal, then a constant.  */
1500       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
1501         *litp = op0, op0 = 0;
1502       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
1503         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1504
1505       if (op0 != 0 && TREE_CONSTANT (op0))
1506         *conp = op0, op0 = 0;
1507       else if (op1 != 0 && TREE_CONSTANT (op1))
1508         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1509
1510       /* If we haven't dealt with either operand, this is not a case we can
1511          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1512       if (op0 != 0 && op1 != 0)
1513         var = in;
1514       else if (op0 != 0)
1515         var = op0;
1516       else
1517         var = op1, neg_var_p = neg1_p;
1518
1519       /* Now do any needed negations.  */
1520       if (neg_litp_p)
1521         *minus_litp = *litp, *litp = 0;
1522       if (neg_conp_p)
1523         *conp = negate_expr (*conp);
1524       if (neg_var_p)
1525         var = negate_expr (var);
1526     }
1527   else if (TREE_CONSTANT (in))
1528     *conp = in;
1529   else
1530     var = in;
1531
1532   if (negate_p)
1533     {
1534       if (*litp)
1535         *minus_litp = *litp, *litp = 0;
1536       else if (*minus_litp)
1537         *litp = *minus_litp, *minus_litp = 0;
1538       *conp = negate_expr (*conp);
1539       var = negate_expr (var);
1540     }
1541
1542   return var;
1543 }
1544
1545 /* Re-associate trees split by the above function.  T1 and T2 are either
1546    expressions to associate or null.  Return the new expression, if any.  If
1547    we build an operation, do it in TYPE and with CODE.  */
1548
1549 static tree
1550 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1551 {
1552   if (t1 == 0)
1553     return t2;
1554   else if (t2 == 0)
1555     return t1;
1556
1557   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1558      try to fold this since we will have infinite recursion.  But do
1559      deal with any NEGATE_EXPRs.  */
1560   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1561       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1562     {
1563       if (code == PLUS_EXPR)
1564         {
1565           if (TREE_CODE (t1) == NEGATE_EXPR)
1566             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1567                            fold_convert (type, TREE_OPERAND (t1, 0)));
1568           else if (TREE_CODE (t2) == NEGATE_EXPR)
1569             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1570                            fold_convert (type, TREE_OPERAND (t2, 0)));
1571           else if (integer_zerop (t2))
1572             return fold_convert (type, t1);
1573         }
1574       else if (code == MINUS_EXPR)
1575         {
1576           if (integer_zerop (t2))
1577             return fold_convert (type, t1);
1578         }
1579
1580       return build2 (code, type, fold_convert (type, t1),
1581                      fold_convert (type, t2));
1582     }
1583
1584   return fold_build2 (code, type, fold_convert (type, t1),
1585                       fold_convert (type, t2));
1586 }
1587 \f
1588 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1589    for use in int_const_binop, size_binop and size_diffop.  */
1590
1591 static bool
1592 int_binop_types_match_p (enum tree_code code, tree type1, tree type2)
1593 {
1594   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1595     return false;
1596   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1597     return false;
1598
1599   switch (code)
1600     {
1601     case LSHIFT_EXPR:
1602     case RSHIFT_EXPR:
1603     case LROTATE_EXPR:
1604     case RROTATE_EXPR:
1605       return true;
1606
1607     default:
1608       break;
1609     }
1610
1611   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1612          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1613          && TYPE_MODE (type1) == TYPE_MODE (type2);
1614 }
1615
1616
1617 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1618    to produce a new constant.  Return NULL_TREE if we don't know how
1619    to evaluate CODE at compile-time.
1620
1621    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1622
1623 tree
1624 int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1625 {
1626   unsigned HOST_WIDE_INT int1l, int2l;
1627   HOST_WIDE_INT int1h, int2h;
1628   unsigned HOST_WIDE_INT low;
1629   HOST_WIDE_INT hi;
1630   unsigned HOST_WIDE_INT garbagel;
1631   HOST_WIDE_INT garbageh;
1632   tree t;
1633   tree type = TREE_TYPE (arg1);
1634   int uns = TYPE_UNSIGNED (type);
1635   int is_sizetype
1636     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1637   int overflow = 0;
1638
1639   int1l = TREE_INT_CST_LOW (arg1);
1640   int1h = TREE_INT_CST_HIGH (arg1);
1641   int2l = TREE_INT_CST_LOW (arg2);
1642   int2h = TREE_INT_CST_HIGH (arg2);
1643
1644   switch (code)
1645     {
1646     case BIT_IOR_EXPR:
1647       low = int1l | int2l, hi = int1h | int2h;
1648       break;
1649
1650     case BIT_XOR_EXPR:
1651       low = int1l ^ int2l, hi = int1h ^ int2h;
1652       break;
1653
1654     case BIT_AND_EXPR:
1655       low = int1l & int2l, hi = int1h & int2h;
1656       break;
1657
1658     case RSHIFT_EXPR:
1659       int2l = -int2l;
1660     case LSHIFT_EXPR:
1661       /* It's unclear from the C standard whether shifts can overflow.
1662          The following code ignores overflow; perhaps a C standard
1663          interpretation ruling is needed.  */
1664       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1665                      &low, &hi, !uns);
1666       break;
1667
1668     case RROTATE_EXPR:
1669       int2l = - int2l;
1670     case LROTATE_EXPR:
1671       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1672                       &low, &hi);
1673       break;
1674
1675     case PLUS_EXPR:
1676       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1677       break;
1678
1679     case MINUS_EXPR:
1680       neg_double (int2l, int2h, &low, &hi);
1681       add_double (int1l, int1h, low, hi, &low, &hi);
1682       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1683       break;
1684
1685     case MULT_EXPR:
1686       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1687       break;
1688
1689     case TRUNC_DIV_EXPR:
1690     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1691     case EXACT_DIV_EXPR:
1692       /* This is a shortcut for a common special case.  */
1693       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1694           && !TREE_OVERFLOW (arg1)
1695           && !TREE_OVERFLOW (arg2)
1696           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1697         {
1698           if (code == CEIL_DIV_EXPR)
1699             int1l += int2l - 1;
1700
1701           low = int1l / int2l, hi = 0;
1702           break;
1703         }
1704
1705       /* ... fall through ...  */
1706
1707     case ROUND_DIV_EXPR:
1708       if (int2h == 0 && int2l == 0)
1709         return NULL_TREE;
1710       if (int2h == 0 && int2l == 1)
1711         {
1712           low = int1l, hi = int1h;
1713           break;
1714         }
1715       if (int1l == int2l && int1h == int2h
1716           && ! (int1l == 0 && int1h == 0))
1717         {
1718           low = 1, hi = 0;
1719           break;
1720         }
1721       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1722                                        &low, &hi, &garbagel, &garbageh);
1723       break;
1724
1725     case TRUNC_MOD_EXPR:
1726     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1727       /* This is a shortcut for a common special case.  */
1728       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1729           && !TREE_OVERFLOW (arg1)
1730           && !TREE_OVERFLOW (arg2)
1731           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1732         {
1733           if (code == CEIL_MOD_EXPR)
1734             int1l += int2l - 1;
1735           low = int1l % int2l, hi = 0;
1736           break;
1737         }
1738
1739       /* ... fall through ...  */
1740
1741     case ROUND_MOD_EXPR:
1742       if (int2h == 0 && int2l == 0)
1743         return NULL_TREE;
1744       overflow = div_and_round_double (code, uns,
1745                                        int1l, int1h, int2l, int2h,
1746                                        &garbagel, &garbageh, &low, &hi);
1747       break;
1748
1749     case MIN_EXPR:
1750     case MAX_EXPR:
1751       if (uns)
1752         low = (((unsigned HOST_WIDE_INT) int1h
1753                 < (unsigned HOST_WIDE_INT) int2h)
1754                || (((unsigned HOST_WIDE_INT) int1h
1755                     == (unsigned HOST_WIDE_INT) int2h)
1756                    && int1l < int2l));
1757       else
1758         low = (int1h < int2h
1759                || (int1h == int2h && int1l < int2l));
1760
1761       if (low == (code == MIN_EXPR))
1762         low = int1l, hi = int1h;
1763       else
1764         low = int2l, hi = int2h;
1765       break;
1766
1767     default:
1768       return NULL_TREE;
1769     }
1770
1771   if (notrunc)
1772     {
1773       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1774
1775       /* Propagate overflow flags ourselves.  */
1776       if (((!uns || is_sizetype) && overflow)
1777           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1778         {
1779           t = copy_node (t);
1780           TREE_OVERFLOW (t) = 1;
1781         }
1782     }
1783   else
1784     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1785                                ((!uns || is_sizetype) && overflow)
1786                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1787
1788   return t;
1789 }
1790
1791 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1792    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1793    are the same kind of constant and the same machine mode.  Return zero if
1794    combining the constants is not allowed in the current operating mode.
1795
1796    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1797
1798 static tree
1799 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1800 {
1801   /* Sanity check for the recursive cases.  */
1802   if (!arg1 || !arg2)
1803     return NULL_TREE;
1804
1805   STRIP_NOPS (arg1);
1806   STRIP_NOPS (arg2);
1807
1808   if (TREE_CODE (arg1) == INTEGER_CST)
1809     return int_const_binop (code, arg1, arg2, notrunc);
1810
1811   if (TREE_CODE (arg1) == REAL_CST)
1812     {
1813       enum machine_mode mode;
1814       REAL_VALUE_TYPE d1;
1815       REAL_VALUE_TYPE d2;
1816       REAL_VALUE_TYPE value;
1817       REAL_VALUE_TYPE result;
1818       bool inexact;
1819       tree t, type;
1820
1821       /* The following codes are handled by real_arithmetic.  */
1822       switch (code)
1823         {
1824         case PLUS_EXPR:
1825         case MINUS_EXPR:
1826         case MULT_EXPR:
1827         case RDIV_EXPR:
1828         case MIN_EXPR:
1829         case MAX_EXPR:
1830           break;
1831
1832         default:
1833           return NULL_TREE;
1834         }
1835
1836       d1 = TREE_REAL_CST (arg1);
1837       d2 = TREE_REAL_CST (arg2);
1838
1839       type = TREE_TYPE (arg1);
1840       mode = TYPE_MODE (type);
1841
1842       /* Don't perform operation if we honor signaling NaNs and
1843          either operand is a NaN.  */
1844       if (HONOR_SNANS (mode)
1845           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1846         return NULL_TREE;
1847
1848       /* Don't perform operation if it would raise a division
1849          by zero exception.  */
1850       if (code == RDIV_EXPR
1851           && REAL_VALUES_EQUAL (d2, dconst0)
1852           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1853         return NULL_TREE;
1854
1855       /* If either operand is a NaN, just return it.  Otherwise, set up
1856          for floating-point trap; we return an overflow.  */
1857       if (REAL_VALUE_ISNAN (d1))
1858         return arg1;
1859       else if (REAL_VALUE_ISNAN (d2))
1860         return arg2;
1861
1862       inexact = real_arithmetic (&value, code, &d1, &d2);
1863       real_convert (&result, mode, &value);
1864
1865       /* Don't constant fold this floating point operation if
1866          the result has overflowed and flag_trapping_math.  */
1867       if (flag_trapping_math
1868           && MODE_HAS_INFINITIES (mode)
1869           && REAL_VALUE_ISINF (result)
1870           && !REAL_VALUE_ISINF (d1)
1871           && !REAL_VALUE_ISINF (d2))
1872         return NULL_TREE;
1873
1874       /* Don't constant fold this floating point operation if the
1875          result may dependent upon the run-time rounding mode and
1876          flag_rounding_math is set, or if GCC's software emulation
1877          is unable to accurately represent the result.  */
1878       if ((flag_rounding_math
1879            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1880                && !flag_unsafe_math_optimizations))
1881           && (inexact || !real_identical (&result, &value)))
1882         return NULL_TREE;
1883
1884       t = build_real (type, result);
1885
1886       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1887       return t;
1888     }
1889
1890   if (TREE_CODE (arg1) == COMPLEX_CST)
1891     {
1892       tree type = TREE_TYPE (arg1);
1893       tree r1 = TREE_REALPART (arg1);
1894       tree i1 = TREE_IMAGPART (arg1);
1895       tree r2 = TREE_REALPART (arg2);
1896       tree i2 = TREE_IMAGPART (arg2);
1897       tree real, imag;
1898
1899       switch (code)
1900         {
1901         case PLUS_EXPR:
1902         case MINUS_EXPR:
1903           real = const_binop (code, r1, r2, notrunc);
1904           imag = const_binop (code, i1, i2, notrunc);
1905           break;
1906
1907         case MULT_EXPR:
1908           real = const_binop (MINUS_EXPR,
1909                               const_binop (MULT_EXPR, r1, r2, notrunc),
1910                               const_binop (MULT_EXPR, i1, i2, notrunc),
1911                               notrunc);
1912           imag = const_binop (PLUS_EXPR,
1913                               const_binop (MULT_EXPR, r1, i2, notrunc),
1914                               const_binop (MULT_EXPR, i1, r2, notrunc),
1915                               notrunc);
1916           break;
1917
1918         case RDIV_EXPR:
1919           {
1920             tree magsquared
1921               = const_binop (PLUS_EXPR,
1922                              const_binop (MULT_EXPR, r2, r2, notrunc),
1923                              const_binop (MULT_EXPR, i2, i2, notrunc),
1924                              notrunc);
1925             tree t1
1926               = const_binop (PLUS_EXPR,
1927                              const_binop (MULT_EXPR, r1, r2, notrunc),
1928                              const_binop (MULT_EXPR, i1, i2, notrunc),
1929                              notrunc);
1930             tree t2
1931               = const_binop (MINUS_EXPR,
1932                              const_binop (MULT_EXPR, i1, r2, notrunc),
1933                              const_binop (MULT_EXPR, r1, i2, notrunc),
1934                              notrunc);
1935
1936             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1937               code = TRUNC_DIV_EXPR;
1938
1939             real = const_binop (code, t1, magsquared, notrunc);
1940             imag = const_binop (code, t2, magsquared, notrunc);
1941           }
1942           break;
1943
1944         default:
1945           return NULL_TREE;
1946         }
1947
1948       if (real && imag)
1949         return build_complex (type, real, imag);
1950     }
1951
1952   return NULL_TREE;
1953 }
1954
1955 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
1956    indicates which particular sizetype to create.  */
1957
1958 tree
1959 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1960 {
1961   return build_int_cst (sizetype_tab[(int) kind], number);
1962 }
1963 \f
1964 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1965    is a tree code.  The type of the result is taken from the operands.
1966    Both must be equivalent integer types, ala int_binop_types_match_p.
1967    If the operands are constant, so is the result.  */
1968
1969 tree
1970 size_binop (enum tree_code code, tree arg0, tree arg1)
1971 {
1972   tree type = TREE_TYPE (arg0);
1973
1974   if (arg0 == error_mark_node || arg1 == error_mark_node)
1975     return error_mark_node;
1976
1977   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
1978                                        TREE_TYPE (arg1)));
1979
1980   /* Handle the special case of two integer constants faster.  */
1981   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1982     {
1983       /* And some specific cases even faster than that.  */
1984       if (code == PLUS_EXPR)
1985         {
1986           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
1987             return arg1;
1988           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1989             return arg0;
1990         }
1991       else if (code == MINUS_EXPR)
1992         {
1993           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1994             return arg0;
1995         }
1996       else if (code == MULT_EXPR)
1997         {
1998           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
1999             return arg1;
2000         }
2001
2002       /* Handle general case of two integer constants.  */
2003       return int_const_binop (code, arg0, arg1, 0);
2004     }
2005
2006   return fold_build2 (code, type, arg0, arg1);
2007 }
2008
2009 /* Given two values, either both of sizetype or both of bitsizetype,
2010    compute the difference between the two values.  Return the value
2011    in signed type corresponding to the type of the operands.  */
2012
2013 tree
2014 size_diffop (tree arg0, tree arg1)
2015 {
2016   tree type = TREE_TYPE (arg0);
2017   tree ctype;
2018
2019   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2020                                        TREE_TYPE (arg1)));
2021
2022   /* If the type is already signed, just do the simple thing.  */
2023   if (!TYPE_UNSIGNED (type))
2024     return size_binop (MINUS_EXPR, arg0, arg1);
2025
2026   if (type == sizetype)
2027     ctype = ssizetype;
2028   else if (type == bitsizetype)
2029     ctype = sbitsizetype;
2030   else
2031     ctype = 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 = unsigned_type_for (etype);
4356           high = fold_convert (etype, high);
4357           exp = fold_convert (etype, exp);
4358         }
4359       return build_range_check (type, exp, 1, 0, high);
4360     }
4361
4362   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4363   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4364     {
4365       unsigned HOST_WIDE_INT lo;
4366       HOST_WIDE_INT hi;
4367       int prec;
4368
4369       prec = TYPE_PRECISION (etype);
4370       if (prec <= HOST_BITS_PER_WIDE_INT)
4371         {
4372           hi = 0;
4373           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4374         }
4375       else
4376         {
4377           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4378           lo = (unsigned HOST_WIDE_INT) -1;
4379         }
4380
4381       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4382         {
4383           if (TYPE_UNSIGNED (etype))
4384             {
4385               etype = 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 = unsigned_type_for (etype);
4424       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4425       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4426                           integer_one_node, 1);
4427       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4428
4429       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4430                                       minv, 1, maxv, 1)))
4431         etype = utype;
4432       else
4433         return 0;
4434     }
4435
4436   high = fold_convert (etype, high);
4437   low = fold_convert (etype, low);
4438   exp = fold_convert (etype, exp);
4439
4440   value = const_binop (MINUS_EXPR, high, low, 0);
4441
4442   if (value != 0 && !TREE_OVERFLOW (value))
4443     return build_range_check (type,
4444                               fold_build2 (MINUS_EXPR, etype, exp, low),
4445                               1, build_int_cst (etype, 0), value);
4446
4447   return 0;
4448 }
4449 \f
4450 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4451
4452 static tree
4453 range_predecessor (tree val)
4454 {
4455   tree type = TREE_TYPE (val);
4456
4457   if (INTEGRAL_TYPE_P (type)
4458       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4459     return 0;
4460   else
4461     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4462 }
4463
4464 /* Return the successor of VAL in its type, handling the infinite case.  */
4465
4466 static tree
4467 range_successor (tree val)
4468 {
4469   tree type = TREE_TYPE (val);
4470
4471   if (INTEGRAL_TYPE_P (type)
4472       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4473     return 0;
4474   else
4475     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4476 }
4477
4478 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4479    can, 0 if we can't.  Set the output range into the specified parameters.  */
4480
4481 static int
4482 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4483               tree high0, int in1_p, tree low1, tree high1)
4484 {
4485   int no_overlap;
4486   int subset;
4487   int temp;
4488   tree tem;
4489   int in_p;
4490   tree low, high;
4491   int lowequal = ((low0 == 0 && low1 == 0)
4492                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4493                                                 low0, 0, low1, 0)));
4494   int highequal = ((high0 == 0 && high1 == 0)
4495                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4496                                                  high0, 1, high1, 1)));
4497
4498   /* Make range 0 be the range that starts first, or ends last if they
4499      start at the same value.  Swap them if it isn't.  */
4500   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4501                                  low0, 0, low1, 0))
4502       || (lowequal
4503           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4504                                         high1, 1, high0, 1))))
4505     {
4506       temp = in0_p, in0_p = in1_p, in1_p = temp;
4507       tem = low0, low0 = low1, low1 = tem;
4508       tem = high0, high0 = high1, high1 = tem;
4509     }
4510
4511   /* Now flag two cases, whether the ranges are disjoint or whether the
4512      second range is totally subsumed in the first.  Note that the tests
4513      below are simplified by the ones above.  */
4514   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4515                                           high0, 1, low1, 0));
4516   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4517                                       high1, 1, high0, 1));
4518
4519   /* We now have four cases, depending on whether we are including or
4520      excluding the two ranges.  */
4521   if (in0_p && in1_p)
4522     {
4523       /* If they don't overlap, the result is false.  If the second range
4524          is a subset it is the result.  Otherwise, the range is from the start
4525          of the second to the end of the first.  */
4526       if (no_overlap)
4527         in_p = 0, low = high = 0;
4528       else if (subset)
4529         in_p = 1, low = low1, high = high1;
4530       else
4531         in_p = 1, low = low1, high = high0;
4532     }
4533
4534   else if (in0_p && ! in1_p)
4535     {
4536       /* If they don't overlap, the result is the first range.  If they are
4537          equal, the result is false.  If the second range is a subset of the
4538          first, and the ranges begin at the same place, we go from just after
4539          the end of the second range to the end of the first.  If the second
4540          range is not a subset of the first, or if it is a subset and both
4541          ranges end at the same place, the range starts at the start of the
4542          first range and ends just before the second range.
4543          Otherwise, we can't describe this as a single range.  */
4544       if (no_overlap)
4545         in_p = 1, low = low0, high = high0;
4546       else if (lowequal && highequal)
4547         in_p = 0, low = high = 0;
4548       else if (subset && lowequal)
4549         {
4550           low = range_successor (high1);
4551           high = high0;
4552           in_p = (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       if ((TREE_CODE (op0) == MODIFY_EXPR
7752            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7753           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7754           /* Detect assigning a bitfield.  */
7755           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7756                && DECL_BIT_FIELD
7757                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7758         {
7759           /* Don't leave an assignment inside a conversion
7760              unless assigning a bitfield.  */
7761           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7762           /* First do the assignment, then return converted constant.  */
7763           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7764           TREE_NO_WARNING (tem) = 1;
7765           TREE_USED (tem) = 1;
7766           return tem;
7767         }
7768
7769       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7770          constants (if x has signed type, the sign bit cannot be set
7771          in c).  This folds extension into the BIT_AND_EXPR.  */
7772       if (INTEGRAL_TYPE_P (type)
7773           && TREE_CODE (type) != BOOLEAN_TYPE
7774           && TREE_CODE (op0) == BIT_AND_EXPR
7775           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7776         {
7777           tree and = op0;
7778           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7779           int change = 0;
7780
7781           if (TYPE_UNSIGNED (TREE_TYPE (and))
7782               || (TYPE_PRECISION (type)
7783                   <= TYPE_PRECISION (TREE_TYPE (and))))
7784             change = 1;
7785           else if (TYPE_PRECISION (TREE_TYPE (and1))
7786                    <= HOST_BITS_PER_WIDE_INT
7787                    && host_integerp (and1, 1))
7788             {
7789               unsigned HOST_WIDE_INT cst;
7790
7791               cst = tree_low_cst (and1, 1);
7792               cst &= (HOST_WIDE_INT) -1
7793                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7794               change = (cst == 0);
7795 #ifdef LOAD_EXTEND_OP
7796               if (change
7797                   && !flag_syntax_only
7798                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7799                       == ZERO_EXTEND))
7800                 {
7801                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7802                   and0 = fold_convert (uns, and0);
7803                   and1 = fold_convert (uns, and1);
7804                 }
7805 #endif
7806             }
7807           if (change)
7808             {
7809               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7810                                            TREE_INT_CST_HIGH (and1), 0,
7811                                            TREE_OVERFLOW (and1));
7812               return fold_build2 (BIT_AND_EXPR, type,
7813                                   fold_convert (type, and0), tem);
7814             }
7815         }
7816
7817       /* Convert (T1)(X op Y) into ((T1)X op (T1)Y), for pointer type,
7818          when one of the new casts will fold away. Conservatively we assume
7819          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST.  */
7820       if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE (arg0))
7821           && BINARY_CLASS_P (arg0)
7822           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7823               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7824               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7825         {
7826           tree arg00 = TREE_OPERAND (arg0, 0);
7827           tree arg01 = TREE_OPERAND (arg0, 1);
7828
7829           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7830                               fold_convert (type, arg01));
7831         }
7832
7833       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7834          of the same precision, and X is an integer type not narrower than
7835          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7836       if (INTEGRAL_TYPE_P (type)
7837           && TREE_CODE (op0) == BIT_NOT_EXPR
7838           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7839           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7840               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7841           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7842         {
7843           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7844           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7845               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7846             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7847         }
7848
7849       tem = fold_convert_const (code, type, op0);
7850       return tem ? tem : NULL_TREE;
7851
7852     case VIEW_CONVERT_EXPR:
7853       if (TREE_TYPE (op0) == type)
7854         return op0;
7855       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7856         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7857       return fold_view_convert_expr (type, op0);
7858
7859     case NEGATE_EXPR:
7860       tem = fold_negate_expr (arg0);
7861       if (tem)
7862         return fold_convert (type, tem);
7863       return NULL_TREE;
7864
7865     case ABS_EXPR:
7866       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7867         return fold_abs_const (arg0, type);
7868       else if (TREE_CODE (arg0) == NEGATE_EXPR)
7869         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7870       /* Convert fabs((double)float) into (double)fabsf(float).  */
7871       else if (TREE_CODE (arg0) == NOP_EXPR
7872                && TREE_CODE (type) == REAL_TYPE)
7873         {
7874           tree targ0 = strip_float_extensions (arg0);
7875           if (targ0 != arg0)
7876             return fold_convert (type, fold_build1 (ABS_EXPR,
7877                                                     TREE_TYPE (targ0),
7878                                                     targ0));
7879         }
7880       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
7881       else if (TREE_CODE (arg0) == ABS_EXPR)
7882         return arg0;
7883       else if (tree_expr_nonnegative_p (arg0))
7884         return arg0;
7885
7886       /* Strip sign ops from argument.  */
7887       if (TREE_CODE (type) == REAL_TYPE)
7888         {
7889           tem = fold_strip_sign_ops (arg0);
7890           if (tem)
7891             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7892         }
7893       return NULL_TREE;
7894
7895     case CONJ_EXPR:
7896       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7897         return fold_convert (type, arg0);
7898       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7899         {
7900           tree itype = TREE_TYPE (type);
7901           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
7902           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
7903           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
7904         }
7905       if (TREE_CODE (arg0) == COMPLEX_CST)
7906         {
7907           tree itype = TREE_TYPE (type);
7908           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
7909           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
7910           return build_complex (type, rpart, negate_expr (ipart));
7911         }
7912       if (TREE_CODE (arg0) == CONJ_EXPR)
7913         return fold_convert (type, TREE_OPERAND (arg0, 0));
7914       return NULL_TREE;
7915
7916     case BIT_NOT_EXPR:
7917       if (TREE_CODE (arg0) == INTEGER_CST)
7918         return fold_not_const (arg0, type);
7919       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7920         return TREE_OPERAND (arg0, 0);
7921       /* Convert ~ (-A) to A - 1.  */
7922       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7923         return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7924                             build_int_cst (type, 1));
7925       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
7926       else if (INTEGRAL_TYPE_P (type)
7927                && ((TREE_CODE (arg0) == MINUS_EXPR
7928                     && integer_onep (TREE_OPERAND (arg0, 1)))
7929                    || (TREE_CODE (arg0) == PLUS_EXPR
7930                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7931         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7932       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
7933       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7934                && (tem = fold_unary (BIT_NOT_EXPR, type,
7935                                      fold_convert (type,
7936                                                    TREE_OPERAND (arg0, 0)))))
7937         return fold_build2 (BIT_XOR_EXPR, type, tem,
7938                             fold_convert (type, TREE_OPERAND (arg0, 1)));
7939       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7940                && (tem = fold_unary (BIT_NOT_EXPR, type,
7941                                      fold_convert (type,
7942                                                    TREE_OPERAND (arg0, 1)))))
7943         return fold_build2 (BIT_XOR_EXPR, type,
7944                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
7945
7946       return NULL_TREE;
7947
7948     case TRUTH_NOT_EXPR:
7949       /* The argument to invert_truthvalue must have Boolean type.  */
7950       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7951           arg0 = fold_convert (boolean_type_node, arg0);
7952
7953       /* Note that the operand of this must be an int
7954          and its values must be 0 or 1.
7955          ("true" is a fixed value perhaps depending on the language,
7956          but we don't handle values other than 1 correctly yet.)  */
7957       tem = fold_truth_not_expr (arg0);
7958       if (!tem)
7959         return NULL_TREE;
7960       return fold_convert (type, tem);
7961
7962     case REALPART_EXPR:
7963       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7964         return fold_convert (type, arg0);
7965       if (TREE_CODE (arg0) == COMPLEX_EXPR)
7966         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7967                                  TREE_OPERAND (arg0, 1));
7968       if (TREE_CODE (arg0) == COMPLEX_CST)
7969         return fold_convert (type, TREE_REALPART (arg0));
7970       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7971         {
7972           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7973           tem = fold_build2 (TREE_CODE (arg0), itype,
7974                              fold_build1 (REALPART_EXPR, itype,
7975                                           TREE_OPERAND (arg0, 0)),
7976                              fold_build1 (REALPART_EXPR, itype,
7977                                           TREE_OPERAND (arg0, 1)));
7978           return fold_convert (type, tem);
7979         }
7980       if (TREE_CODE (arg0) == CONJ_EXPR)
7981         {
7982           tree itype = TREE_TYPE (TREE_TYPE (arg0));
7983           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
7984           return fold_convert (type, tem);
7985         }
7986       if (TREE_CODE (arg0) == CALL_EXPR)
7987         {
7988           tree fn = get_callee_fndecl (arg0);
7989           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
7990             switch (DECL_FUNCTION_CODE (fn))
7991               {
7992               CASE_FLT_FN (BUILT_IN_CEXPI):
7993                 fn = mathfn_built_in (type, BUILT_IN_COS);
7994                 if (fn)
7995                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
7996                 break;
7997
7998               default:
7999                 break;
8000               }
8001         }
8002       return NULL_TREE;
8003
8004     case IMAGPART_EXPR:
8005       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8006         return fold_convert (type, integer_zero_node);
8007       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8008         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8009                                  TREE_OPERAND (arg0, 0));
8010       if (TREE_CODE (arg0) == COMPLEX_CST)
8011         return fold_convert (type, TREE_IMAGPART (arg0));
8012       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8013         {
8014           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8015           tem = fold_build2 (TREE_CODE (arg0), itype,
8016                              fold_build1 (IMAGPART_EXPR, itype,
8017                                           TREE_OPERAND (arg0, 0)),
8018                              fold_build1 (IMAGPART_EXPR, itype,
8019                                           TREE_OPERAND (arg0, 1)));
8020           return fold_convert (type, tem);
8021         }
8022       if (TREE_CODE (arg0) == CONJ_EXPR)
8023         {
8024           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8025           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8026           return fold_convert (type, negate_expr (tem));
8027         }
8028       if (TREE_CODE (arg0) == CALL_EXPR)
8029         {
8030           tree fn = get_callee_fndecl (arg0);
8031           if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8032             switch (DECL_FUNCTION_CODE (fn))
8033               {
8034               CASE_FLT_FN (BUILT_IN_CEXPI):
8035                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8036                 if (fn)
8037                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8038                 break;
8039
8040               default:
8041                 break;
8042               }
8043         }
8044       return NULL_TREE;
8045
8046     default:
8047       return NULL_TREE;
8048     } /* switch (code) */
8049 }
8050
8051 /* Fold a binary expression of code CODE and type TYPE with operands
8052    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8053    Return the folded expression if folding is successful.  Otherwise,
8054    return NULL_TREE.  */
8055
8056 static tree
8057 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8058 {
8059   enum tree_code compl_code;
8060
8061   if (code == MIN_EXPR)
8062     compl_code = MAX_EXPR;
8063   else if (code == MAX_EXPR)
8064     compl_code = MIN_EXPR;
8065   else
8066     gcc_unreachable ();
8067
8068   /* MIN (MAX (a, b), b) == b.  */
8069   if (TREE_CODE (op0) == compl_code
8070       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8071     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8072
8073   /* MIN (MAX (b, a), b) == b.  */
8074   if (TREE_CODE (op0) == compl_code
8075       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8076       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8077     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8078
8079   /* MIN (a, MAX (a, b)) == a.  */
8080   if (TREE_CODE (op1) == compl_code
8081       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8082       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8083     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8084
8085   /* MIN (a, MAX (b, a)) == a.  */
8086   if (TREE_CODE (op1) == compl_code
8087       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8088       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8089     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8090
8091   return NULL_TREE;
8092 }
8093
8094 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8095    by changing CODE to reduce the magnitude of constants involved in
8096    ARG0 of the comparison.
8097    Returns a canonicalized comparison tree if a simplification was
8098    possible, otherwise returns NULL_TREE.
8099    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8100    valid if signed overflow is undefined.  */
8101
8102 static tree
8103 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8104                                  tree arg0, tree arg1,
8105                                  bool *strict_overflow_p)
8106 {
8107   enum tree_code code0 = TREE_CODE (arg0);
8108   tree t, cst0 = NULL_TREE;
8109   int sgn0;
8110   bool swap = false;
8111
8112   /* Match A +- CST code arg1 and CST code arg1.  */
8113   if (!(((code0 == MINUS_EXPR
8114           || code0 == PLUS_EXPR)
8115          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8116         || code0 == INTEGER_CST))
8117     return NULL_TREE;
8118
8119   /* Identify the constant in arg0 and its sign.  */
8120   if (code0 == INTEGER_CST)
8121     cst0 = arg0;
8122   else
8123     cst0 = TREE_OPERAND (arg0, 1);
8124   sgn0 = tree_int_cst_sgn (cst0);
8125
8126   /* Overflowed constants and zero will cause problems.  */
8127   if (integer_zerop (cst0)
8128       || TREE_OVERFLOW (cst0))
8129     return NULL_TREE;
8130
8131   /* See if we can reduce the magnitude of the constant in
8132      arg0 by changing the comparison code.  */
8133   if (code0 == INTEGER_CST)
8134     {
8135       /* CST <= arg1  ->  CST-1 < arg1.  */
8136       if (code == LE_EXPR && sgn0 == 1)
8137         code = LT_EXPR;
8138       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8139       else if (code == LT_EXPR && sgn0 == -1)
8140         code = LE_EXPR;
8141       /* CST > arg1  ->  CST-1 >= arg1.  */
8142       else if (code == GT_EXPR && sgn0 == 1)
8143         code = GE_EXPR;
8144       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8145       else if (code == GE_EXPR && sgn0 == -1)
8146         code = GT_EXPR;
8147       else
8148         return NULL_TREE;
8149       /* arg1 code' CST' might be more canonical.  */
8150       swap = true;
8151     }
8152   else
8153     {
8154       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8155       if (code == LT_EXPR
8156           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8157         code = LE_EXPR;
8158       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8159       else if (code == GT_EXPR
8160                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8161         code = GE_EXPR;
8162       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8163       else if (code == LE_EXPR
8164                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8165         code = LT_EXPR;
8166       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8167       else if (code == GE_EXPR
8168                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8169         code = GT_EXPR;
8170       else
8171         return NULL_TREE;
8172       *strict_overflow_p = true;
8173     }
8174
8175   /* Now build the constant reduced in magnitude.  */
8176   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8177                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8178   if (code0 != INTEGER_CST)
8179     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8180
8181   /* If swapping might yield to a more canonical form, do so.  */
8182   if (swap)
8183     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8184   else
8185     return fold_build2 (code, type, t, arg1);
8186 }
8187
8188 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8189    overflow further.  Try to decrease the magnitude of constants involved
8190    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8191    and put sole constants at the second argument position.
8192    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8193
8194 static tree
8195 maybe_canonicalize_comparison (enum tree_code code, tree type,
8196                                tree arg0, tree arg1)
8197 {
8198   tree t;
8199   bool strict_overflow_p;
8200   const char * const warnmsg = G_("assuming signed overflow does not occur "
8201                                   "when reducing constant in comparison");
8202
8203   /* In principle pointers also have undefined overflow behavior,
8204      but that causes problems elsewhere.  */
8205   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8206       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8207     return NULL_TREE;
8208
8209   /* Try canonicalization by simplifying arg0.  */
8210   strict_overflow_p = false;
8211   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8212                                        &strict_overflow_p);
8213   if (t)
8214     {
8215       if (strict_overflow_p)
8216         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8217       return t;
8218     }
8219
8220   /* Try canonicalization by simplifying arg1 using the swapped
8221      comparison.  */
8222   code = swap_tree_comparison (code);
8223   strict_overflow_p = false;
8224   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8225                                        &strict_overflow_p);
8226   if (t && strict_overflow_p)
8227     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8228   return t;
8229 }
8230
8231 /* Subroutine of fold_binary.  This routine performs all of the
8232    transformations that are common to the equality/inequality
8233    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8234    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8235    fold_binary should call fold_binary.  Fold a comparison with
8236    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8237    the folded comparison or NULL_TREE.  */
8238
8239 static tree
8240 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8241 {
8242   tree arg0, arg1, tem;
8243
8244   arg0 = op0;
8245   arg1 = op1;
8246
8247   STRIP_SIGN_NOPS (arg0);
8248   STRIP_SIGN_NOPS (arg1);
8249
8250   tem = fold_relational_const (code, type, arg0, arg1);
8251   if (tem != NULL_TREE)
8252     return tem;
8253
8254   /* If one arg is a real or integer constant, put it last.  */
8255   if (tree_swap_operands_p (arg0, arg1, true))
8256     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8257
8258   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8259   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8260       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8261           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8262           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8263       && (TREE_CODE (arg1) == INTEGER_CST
8264           && !TREE_OVERFLOW (arg1)))
8265     {
8266       tree const1 = TREE_OPERAND (arg0, 1);
8267       tree const2 = arg1;
8268       tree variable = TREE_OPERAND (arg0, 0);
8269       tree lhs;
8270       int lhs_add;
8271       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8272
8273       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8274                          TREE_TYPE (arg1), const2, const1);
8275
8276       /* If the constant operation overflowed this can be
8277          simplified as a comparison against INT_MAX/INT_MIN.  */
8278       if (TREE_CODE (lhs) == INTEGER_CST
8279           && TREE_OVERFLOW (lhs))
8280         {
8281           int const1_sgn = tree_int_cst_sgn (const1);
8282           enum tree_code code2 = code;
8283
8284           /* Get the sign of the constant on the lhs if the
8285              operation were VARIABLE + CONST1.  */
8286           if (TREE_CODE (arg0) == MINUS_EXPR)
8287             const1_sgn = -const1_sgn;
8288
8289           /* The sign of the constant determines if we overflowed
8290              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8291              Canonicalize to the INT_MIN overflow by swapping the comparison
8292              if necessary.  */
8293           if (const1_sgn == -1)
8294             code2 = swap_tree_comparison (code);
8295
8296           /* We now can look at the canonicalized case
8297                VARIABLE + 1  CODE2  INT_MIN
8298              and decide on the result.  */
8299           if (code2 == LT_EXPR
8300               || code2 == LE_EXPR
8301               || code2 == EQ_EXPR)
8302             return omit_one_operand (type, boolean_false_node, variable);
8303           else if (code2 == NE_EXPR
8304                    || code2 == GE_EXPR
8305                    || code2 == GT_EXPR)
8306             return omit_one_operand (type, boolean_true_node, variable);
8307         }
8308
8309       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8310           && (TREE_CODE (lhs) != INTEGER_CST
8311               || !TREE_OVERFLOW (lhs)))
8312         {
8313           fold_overflow_warning (("assuming signed overflow does not occur "
8314                                   "when changing X +- C1 cmp C2 to "
8315                                   "X cmp C1 +- C2"),
8316                                  WARN_STRICT_OVERFLOW_COMPARISON);
8317           return fold_build2 (code, type, variable, lhs);
8318         }
8319     }
8320
8321   /* For comparisons of pointers we can decompose it to a compile time
8322      comparison of the base objects and the offsets into the object.
8323      This requires at least one operand being an ADDR_EXPR to do more
8324      than the operand_equal_p test below.  */
8325   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8326       && (TREE_CODE (arg0) == ADDR_EXPR
8327           || TREE_CODE (arg1) == ADDR_EXPR))
8328     {
8329       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8330       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8331       enum machine_mode mode;
8332       int volatilep, unsignedp;
8333       bool indirect_base0 = false;
8334
8335       /* Get base and offset for the access.  Strip ADDR_EXPR for
8336          get_inner_reference, but put it back by stripping INDIRECT_REF
8337          off the base object if possible.  */
8338       base0 = arg0;
8339       if (TREE_CODE (arg0) == ADDR_EXPR)
8340         {
8341           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8342                                        &bitsize, &bitpos0, &offset0, &mode,
8343                                        &unsignedp, &volatilep, false);
8344           if (TREE_CODE (base0) == INDIRECT_REF)
8345             base0 = TREE_OPERAND (base0, 0);
8346           else
8347             indirect_base0 = true;
8348         }
8349
8350       base1 = arg1;
8351       if (TREE_CODE (arg1) == ADDR_EXPR)
8352         {
8353           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8354                                        &bitsize, &bitpos1, &offset1, &mode,
8355                                        &unsignedp, &volatilep, false);
8356           /* We have to make sure to have an indirect/non-indirect base1
8357              just the same as we did for base0.  */
8358           if (TREE_CODE (base1) == INDIRECT_REF
8359               && !indirect_base0)
8360             base1 = TREE_OPERAND (base1, 0);
8361           else if (!indirect_base0)
8362             base1 = NULL_TREE;
8363         }
8364       else if (indirect_base0)
8365         base1 = NULL_TREE;
8366
8367       /* If we have equivalent bases we might be able to simplify.  */
8368       if (base0 && base1
8369           && operand_equal_p (base0, base1, 0))
8370         {
8371           /* We can fold this expression to a constant if the non-constant
8372              offset parts are equal.  */
8373           if (offset0 == offset1
8374               || (offset0 && offset1
8375                   && operand_equal_p (offset0, offset1, 0)))
8376             {
8377               switch (code)
8378                 {
8379                 case EQ_EXPR:
8380                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8381                 case NE_EXPR:
8382                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8383                 case LT_EXPR:
8384                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8385                 case LE_EXPR:
8386                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8387                 case GE_EXPR:
8388                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8389                 case GT_EXPR:
8390                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8391                 default:;
8392                 }
8393             }
8394           /* We can simplify the comparison to a comparison of the variable
8395              offset parts if the constant offset parts are equal.
8396              Be careful to use signed size type here because otherwise we
8397              mess with array offsets in the wrong way.  This is possible
8398              because pointer arithmetic is restricted to retain within an
8399              object and overflow on pointer differences is undefined as of
8400              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8401           else if (bitpos0 == bitpos1)
8402             {
8403               tree signed_size_type_node;
8404               signed_size_type_node = signed_type_for (size_type_node);
8405
8406               /* By converting to signed size type we cover middle-end pointer
8407                  arithmetic which operates on unsigned pointer types of size
8408                  type size and ARRAY_REF offsets which are properly sign or
8409                  zero extended from their type in case it is narrower than
8410                  size type.  */
8411               if (offset0 == NULL_TREE)
8412                 offset0 = build_int_cst (signed_size_type_node, 0);
8413               else
8414                 offset0 = fold_convert (signed_size_type_node, offset0);
8415               if (offset1 == NULL_TREE)
8416                 offset1 = build_int_cst (signed_size_type_node, 0);
8417               else
8418                 offset1 = fold_convert (signed_size_type_node, offset1);
8419
8420               return fold_build2 (code, type, offset0, offset1);
8421             }
8422         }
8423     }
8424
8425   /* If this is a comparison of two exprs that look like an ARRAY_REF of the
8426      same object, then we can fold this to a comparison of the two offsets in
8427      signed size type.  This is possible because pointer arithmetic is
8428      restricted to retain within an object and overflow on pointer differences
8429      is undefined as of 6.5.6/8 and /9 with respect to the signed ptrdiff_t.
8430
8431      We check flag_wrapv directly because pointers types are unsigned,
8432      and therefore TYPE_OVERFLOW_WRAPS returns true for them.  That is
8433      normally what we want to avoid certain odd overflow cases, but
8434      not here.  */
8435   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8436       && !flag_wrapv
8437       && !TYPE_OVERFLOW_TRAPS (TREE_TYPE (arg0)))
8438     {
8439       tree base0, offset0, base1, offset1;
8440
8441       if (extract_array_ref (arg0, &base0, &offset0)
8442           && extract_array_ref (arg1, &base1, &offset1)
8443           && operand_equal_p (base0, base1, 0))
8444         {
8445           tree signed_size_type_node;
8446           signed_size_type_node = signed_type_for (size_type_node);
8447
8448           /* By converting to signed size type we cover middle-end pointer
8449              arithmetic which operates on unsigned pointer types of size
8450              type size and ARRAY_REF offsets which are properly sign or
8451              zero extended from their type in case it is narrower than
8452              size type.  */
8453           if (offset0 == NULL_TREE)
8454             offset0 = build_int_cst (signed_size_type_node, 0);
8455           else
8456             offset0 = fold_convert (signed_size_type_node, offset0);
8457           if (offset1 == NULL_TREE)
8458             offset1 = build_int_cst (signed_size_type_node, 0);
8459           else
8460             offset1 = fold_convert (signed_size_type_node, offset1);
8461
8462           return fold_build2 (code, type, offset0, offset1);
8463         }
8464     }
8465
8466   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8467      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8468      the resulting offset is smaller in absolute value than the
8469      original one.  */
8470   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8471       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8472       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8473           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8474       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8475       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8476           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8477     {
8478       tree const1 = TREE_OPERAND (arg0, 1);
8479       tree const2 = TREE_OPERAND (arg1, 1);
8480       tree variable1 = TREE_OPERAND (arg0, 0);
8481       tree variable2 = TREE_OPERAND (arg1, 0);
8482       tree cst;
8483       const char * const warnmsg = G_("assuming signed overflow does not "
8484                                       "occur when combining constants around "
8485                                       "a comparison");
8486
8487       /* Put the constant on the side where it doesn't overflow and is
8488          of lower absolute value than before.  */
8489       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8490                              ? MINUS_EXPR : PLUS_EXPR,
8491                              const2, const1, 0);
8492       if (!TREE_OVERFLOW (cst)
8493           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8494         {
8495           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8496           return fold_build2 (code, type,
8497                               variable1,
8498                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8499                                            variable2, cst));
8500         }
8501
8502       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8503                              ? MINUS_EXPR : PLUS_EXPR,
8504                              const1, const2, 0);
8505       if (!TREE_OVERFLOW (cst)
8506           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8507         {
8508           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8509           return fold_build2 (code, type,
8510                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8511                                            variable1, cst),
8512                               variable2);
8513         }
8514     }
8515
8516   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8517      signed arithmetic case.  That form is created by the compiler
8518      often enough for folding it to be of value.  One example is in
8519      computing loop trip counts after Operator Strength Reduction.  */
8520   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8521       && TREE_CODE (arg0) == MULT_EXPR
8522       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8523           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8524       && integer_zerop (arg1))
8525     {
8526       tree const1 = TREE_OPERAND (arg0, 1);
8527       tree const2 = arg1;                       /* zero */
8528       tree variable1 = TREE_OPERAND (arg0, 0);
8529       enum tree_code cmp_code = code;
8530
8531       gcc_assert (!integer_zerop (const1));
8532
8533       fold_overflow_warning (("assuming signed overflow does not occur when "
8534                               "eliminating multiplication in comparison "
8535                               "with zero"),
8536                              WARN_STRICT_OVERFLOW_COMPARISON);
8537
8538       /* If const1 is negative we swap the sense of the comparison.  */
8539       if (tree_int_cst_sgn (const1) < 0)
8540         cmp_code = swap_tree_comparison (cmp_code);
8541
8542       return fold_build2 (cmp_code, type, variable1, const2);
8543     }
8544
8545   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8546   if (tem)
8547     return tem;
8548
8549   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8550     {
8551       tree targ0 = strip_float_extensions (arg0);
8552       tree targ1 = strip_float_extensions (arg1);
8553       tree newtype = TREE_TYPE (targ0);
8554
8555       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8556         newtype = TREE_TYPE (targ1);
8557
8558       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8559       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8560         return fold_build2 (code, type, fold_convert (newtype, targ0),
8561                             fold_convert (newtype, targ1));
8562
8563       /* (-a) CMP (-b) -> b CMP a  */
8564       if (TREE_CODE (arg0) == NEGATE_EXPR
8565           && TREE_CODE (arg1) == NEGATE_EXPR)
8566         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8567                             TREE_OPERAND (arg0, 0));
8568
8569       if (TREE_CODE (arg1) == REAL_CST)
8570         {
8571           REAL_VALUE_TYPE cst;
8572           cst = TREE_REAL_CST (arg1);
8573
8574           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8575           if (TREE_CODE (arg0) == NEGATE_EXPR)
8576             return fold_build2 (swap_tree_comparison (code), type,
8577                                 TREE_OPERAND (arg0, 0),
8578                                 build_real (TREE_TYPE (arg1),
8579                                             REAL_VALUE_NEGATE (cst)));
8580
8581           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8582           /* a CMP (-0) -> a CMP 0  */
8583           if (REAL_VALUE_MINUS_ZERO (cst))
8584             return fold_build2 (code, type, arg0,
8585                                 build_real (TREE_TYPE (arg1), dconst0));
8586
8587           /* x != NaN is always true, other ops are always false.  */
8588           if (REAL_VALUE_ISNAN (cst)
8589               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8590             {
8591               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8592               return omit_one_operand (type, tem, arg0);
8593             }
8594
8595           /* Fold comparisons against infinity.  */
8596           if (REAL_VALUE_ISINF (cst))
8597             {
8598               tem = fold_inf_compare (code, type, arg0, arg1);
8599               if (tem != NULL_TREE)
8600                 return tem;
8601             }
8602         }
8603
8604       /* If this is a comparison of a real constant with a PLUS_EXPR
8605          or a MINUS_EXPR of a real constant, we can convert it into a
8606          comparison with a revised real constant as long as no overflow
8607          occurs when unsafe_math_optimizations are enabled.  */
8608       if (flag_unsafe_math_optimizations
8609           && TREE_CODE (arg1) == REAL_CST
8610           && (TREE_CODE (arg0) == PLUS_EXPR
8611               || TREE_CODE (arg0) == MINUS_EXPR)
8612           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8613           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8614                                       ? MINUS_EXPR : PLUS_EXPR,
8615                                       arg1, TREE_OPERAND (arg0, 1), 0))
8616           && !TREE_OVERFLOW (tem))
8617         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8618
8619       /* Likewise, we can simplify a comparison of a real constant with
8620          a MINUS_EXPR whose first operand is also a real constant, i.e.
8621          (c1 - x) < c2 becomes x > c1-c2.  */
8622       if (flag_unsafe_math_optimizations
8623           && TREE_CODE (arg1) == REAL_CST
8624           && TREE_CODE (arg0) == MINUS_EXPR
8625           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8626           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8627                                       arg1, 0))
8628           && !TREE_OVERFLOW (tem))
8629         return fold_build2 (swap_tree_comparison (code), type,
8630                             TREE_OPERAND (arg0, 1), tem);
8631
8632       /* Fold comparisons against built-in math functions.  */
8633       if (TREE_CODE (arg1) == REAL_CST
8634           && flag_unsafe_math_optimizations
8635           && ! flag_errno_math)
8636         {
8637           enum built_in_function fcode = builtin_mathfn_code (arg0);
8638
8639           if (fcode != END_BUILTINS)
8640             {
8641               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8642               if (tem != NULL_TREE)
8643                 return tem;
8644             }
8645         }
8646     }
8647
8648   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8649       && (TREE_CODE (arg0) == NOP_EXPR
8650           || TREE_CODE (arg0) == CONVERT_EXPR))
8651     {
8652       /* If we are widening one operand of an integer comparison,
8653          see if the other operand is similarly being widened.  Perhaps we
8654          can do the comparison in the narrower type.  */
8655       tem = fold_widened_comparison (code, type, arg0, arg1);
8656       if (tem)
8657         return tem;
8658
8659       /* Or if we are changing signedness.  */
8660       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8661       if (tem)
8662         return tem;
8663     }
8664
8665   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8666      constant, we can simplify it.  */
8667   if (TREE_CODE (arg1) == INTEGER_CST
8668       && (TREE_CODE (arg0) == MIN_EXPR
8669           || TREE_CODE (arg0) == MAX_EXPR)
8670       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8671     {
8672       tem = optimize_minmax_comparison (code, type, op0, op1);
8673       if (tem)
8674         return tem;
8675     }
8676
8677   /* Simplify comparison of something with itself.  (For IEEE
8678      floating-point, we can only do some of these simplifications.)  */
8679   if (operand_equal_p (arg0, arg1, 0))
8680     {
8681       switch (code)
8682         {
8683         case EQ_EXPR:
8684           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8685               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8686             return constant_boolean_node (1, type);
8687           break;
8688
8689         case GE_EXPR:
8690         case LE_EXPR:
8691           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8692               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8693             return constant_boolean_node (1, type);
8694           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8695
8696         case NE_EXPR:
8697           /* For NE, we can only do this simplification if integer
8698              or we don't honor IEEE floating point NaNs.  */
8699           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8700               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8701             break;
8702           /* ... fall through ...  */
8703         case GT_EXPR:
8704         case LT_EXPR:
8705           return constant_boolean_node (0, type);
8706         default:
8707           gcc_unreachable ();
8708         }
8709     }
8710
8711   /* If we are comparing an expression that just has comparisons
8712      of two integer values, arithmetic expressions of those comparisons,
8713      and constants, we can simplify it.  There are only three cases
8714      to check: the two values can either be equal, the first can be
8715      greater, or the second can be greater.  Fold the expression for
8716      those three values.  Since each value must be 0 or 1, we have
8717      eight possibilities, each of which corresponds to the constant 0
8718      or 1 or one of the six possible comparisons.
8719
8720      This handles common cases like (a > b) == 0 but also handles
8721      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8722      occur in macroized code.  */
8723
8724   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8725     {
8726       tree cval1 = 0, cval2 = 0;
8727       int save_p = 0;
8728
8729       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8730           /* Don't handle degenerate cases here; they should already
8731              have been handled anyway.  */
8732           && cval1 != 0 && cval2 != 0
8733           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8734           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8735           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8736           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8737           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8738           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8739                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8740         {
8741           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8742           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8743
8744           /* We can't just pass T to eval_subst in case cval1 or cval2
8745              was the same as ARG1.  */
8746
8747           tree high_result
8748                 = fold_build2 (code, type,
8749                                eval_subst (arg0, cval1, maxval,
8750                                            cval2, minval),
8751                                arg1);
8752           tree equal_result
8753                 = fold_build2 (code, type,
8754                                eval_subst (arg0, cval1, maxval,
8755                                            cval2, maxval),
8756                                arg1);
8757           tree low_result
8758                 = fold_build2 (code, type,
8759                                eval_subst (arg0, cval1, minval,
8760                                            cval2, maxval),
8761                                arg1);
8762
8763           /* All three of these results should be 0 or 1.  Confirm they are.
8764              Then use those values to select the proper code to use.  */
8765
8766           if (TREE_CODE (high_result) == INTEGER_CST
8767               && TREE_CODE (equal_result) == INTEGER_CST
8768               && TREE_CODE (low_result) == INTEGER_CST)
8769             {
8770               /* Make a 3-bit mask with the high-order bit being the
8771                  value for `>', the next for '=', and the low for '<'.  */
8772               switch ((integer_onep (high_result) * 4)
8773                       + (integer_onep (equal_result) * 2)
8774                       + integer_onep (low_result))
8775                 {
8776                 case 0:
8777                   /* Always false.  */
8778                   return omit_one_operand (type, integer_zero_node, arg0);
8779                 case 1:
8780                   code = LT_EXPR;
8781                   break;
8782                 case 2:
8783                   code = EQ_EXPR;
8784                   break;
8785                 case 3:
8786                   code = LE_EXPR;
8787                   break;
8788                 case 4:
8789                   code = GT_EXPR;
8790                   break;
8791                 case 5:
8792                   code = NE_EXPR;
8793                   break;
8794                 case 6:
8795                   code = GE_EXPR;
8796                   break;
8797                 case 7:
8798                   /* Always true.  */
8799                   return omit_one_operand (type, integer_one_node, arg0);
8800                 }
8801
8802               if (save_p)
8803                 return save_expr (build2 (code, type, cval1, cval2));
8804               return fold_build2 (code, type, cval1, cval2);
8805             }
8806         }
8807     }
8808
8809   /* Fold a comparison of the address of COMPONENT_REFs with the same
8810      type and component to a comparison of the address of the base
8811      object.  In short, &x->a OP &y->a to x OP y and
8812      &x->a OP &y.a to x OP &y  */
8813   if (TREE_CODE (arg0) == ADDR_EXPR
8814       && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8815       && TREE_CODE (arg1) == ADDR_EXPR
8816       && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8817     {
8818       tree cref0 = TREE_OPERAND (arg0, 0);
8819       tree cref1 = TREE_OPERAND (arg1, 0);
8820       if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8821         {
8822           tree op0 = TREE_OPERAND (cref0, 0);
8823           tree op1 = TREE_OPERAND (cref1, 0);
8824           return fold_build2 (code, type,
8825                               build_fold_addr_expr (op0),
8826                               build_fold_addr_expr (op1));
8827         }
8828     }
8829
8830   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8831      into a single range test.  */
8832   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8833        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8834       && TREE_CODE (arg1) == INTEGER_CST
8835       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8836       && !integer_zerop (TREE_OPERAND (arg0, 1))
8837       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8838       && !TREE_OVERFLOW (arg1))
8839     {
8840       tem = fold_div_compare (code, type, arg0, arg1);
8841       if (tem != NULL_TREE)
8842         return tem;
8843     }
8844
8845   /* Fold ~X op ~Y as Y op X.  */
8846   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8847       && TREE_CODE (arg1) == BIT_NOT_EXPR)
8848     {
8849       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8850       return fold_build2 (code, type,
8851                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8852                           TREE_OPERAND (arg0, 0));
8853     }
8854
8855   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
8856   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8857       && TREE_CODE (arg1) == INTEGER_CST)
8858     {
8859       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8860       return fold_build2 (swap_tree_comparison (code), type,
8861                           TREE_OPERAND (arg0, 0),
8862                           fold_build1 (BIT_NOT_EXPR, cmp_type,
8863                                        fold_convert (cmp_type, arg1)));
8864     }
8865
8866   return NULL_TREE;
8867 }
8868
8869
8870 /* Subroutine of fold_binary.  Optimize complex multiplications of the
8871    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
8872    argument EXPR represents the expression "z" of type TYPE.  */
8873
8874 static tree
8875 fold_mult_zconjz (tree type, tree expr)
8876 {
8877   tree itype = TREE_TYPE (type);
8878   tree rpart, ipart, tem;
8879
8880   if (TREE_CODE (expr) == COMPLEX_EXPR)
8881     {
8882       rpart = TREE_OPERAND (expr, 0);
8883       ipart = TREE_OPERAND (expr, 1);
8884     }
8885   else if (TREE_CODE (expr) == COMPLEX_CST)
8886     {
8887       rpart = TREE_REALPART (expr);
8888       ipart = TREE_IMAGPART (expr);
8889     }
8890   else
8891     {
8892       expr = save_expr (expr);
8893       rpart = fold_build1 (REALPART_EXPR, itype, expr);
8894       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8895     }
8896
8897   rpart = save_expr (rpart);
8898   ipart = save_expr (ipart);
8899   tem = fold_build2 (PLUS_EXPR, itype,
8900                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
8901                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
8902   return fold_build2 (COMPLEX_EXPR, type, tem,
8903                       fold_convert (itype, integer_zero_node));
8904 }
8905
8906
8907 /* Fold a binary expression of code CODE and type TYPE with operands
8908    OP0 and OP1.  Return the folded expression if folding is
8909    successful.  Otherwise, return NULL_TREE.  */
8910
8911 tree
8912 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
8913 {
8914   enum tree_code_class kind = TREE_CODE_CLASS (code);
8915   tree arg0, arg1, tem;
8916   tree t1 = NULL_TREE;
8917   bool strict_overflow_p;
8918
8919   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
8920                || IS_GIMPLE_STMT_CODE_CLASS (kind))
8921               && TREE_CODE_LENGTH (code) == 2
8922               && op0 != NULL_TREE
8923               && op1 != NULL_TREE);
8924
8925   arg0 = op0;
8926   arg1 = op1;
8927
8928   /* Strip any conversions that don't change the mode.  This is
8929      safe for every expression, except for a comparison expression
8930      because its signedness is derived from its operands.  So, in
8931      the latter case, only strip conversions that don't change the
8932      signedness.
8933
8934      Note that this is done as an internal manipulation within the
8935      constant folder, in order to find the simplest representation
8936      of the arguments so that their form can be studied.  In any
8937      cases, the appropriate type conversions should be put back in
8938      the tree that will get out of the constant folder.  */
8939
8940   if (kind == tcc_comparison)
8941     {
8942       STRIP_SIGN_NOPS (arg0);
8943       STRIP_SIGN_NOPS (arg1);
8944     }
8945   else
8946     {
8947       STRIP_NOPS (arg0);
8948       STRIP_NOPS (arg1);
8949     }
8950
8951   /* Note that TREE_CONSTANT isn't enough: static var addresses are
8952      constant but we can't do arithmetic on them.  */
8953   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
8954       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
8955       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
8956       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
8957     {
8958       if (kind == tcc_binary)
8959         tem = const_binop (code, arg0, arg1, 0);
8960       else if (kind == tcc_comparison)
8961         tem = fold_relational_const (code, type, arg0, arg1);
8962       else
8963         tem = NULL_TREE;
8964
8965       if (tem != NULL_TREE)
8966         {
8967           if (TREE_TYPE (tem) != type)
8968             tem = fold_convert (type, tem);
8969           return tem;
8970         }
8971     }
8972
8973   /* If this is a commutative operation, and ARG0 is a constant, move it
8974      to ARG1 to reduce the number of tests below.  */
8975   if (commutative_tree_code (code)
8976       && tree_swap_operands_p (arg0, arg1, true))
8977     return fold_build2 (code, type, op1, op0);
8978
8979   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
8980
8981      First check for cases where an arithmetic operation is applied to a
8982      compound, conditional, or comparison operation.  Push the arithmetic
8983      operation inside the compound or conditional to see if any folding
8984      can then be done.  Convert comparison to conditional for this purpose.
8985      The also optimizes non-constant cases that used to be done in
8986      expand_expr.
8987
8988      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
8989      one of the operands is a comparison and the other is a comparison, a
8990      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
8991      code below would make the expression more complex.  Change it to a
8992      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
8993      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
8994
8995   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
8996        || code == EQ_EXPR || code == NE_EXPR)
8997       && ((truth_value_p (TREE_CODE (arg0))
8998            && (truth_value_p (TREE_CODE (arg1))
8999                || (TREE_CODE (arg1) == BIT_AND_EXPR
9000                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9001           || (truth_value_p (TREE_CODE (arg1))
9002               && (truth_value_p (TREE_CODE (arg0))
9003                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9004                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9005     {
9006       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9007                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9008                          : TRUTH_XOR_EXPR,
9009                          boolean_type_node,
9010                          fold_convert (boolean_type_node, arg0),
9011                          fold_convert (boolean_type_node, arg1));
9012
9013       if (code == EQ_EXPR)
9014         tem = invert_truthvalue (tem);
9015
9016       return fold_convert (type, tem);
9017     }
9018
9019   if (TREE_CODE_CLASS (code) == tcc_binary
9020       || TREE_CODE_CLASS (code) == tcc_comparison)
9021     {
9022       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9023         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9024                        fold_build2 (code, type,
9025                                     TREE_OPERAND (arg0, 1), op1));
9026       if (TREE_CODE (arg1) == COMPOUND_EXPR
9027           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9028         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9029                        fold_build2 (code, type,
9030                                     op0, TREE_OPERAND (arg1, 1)));
9031
9032       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9033         {
9034           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9035                                                      arg0, arg1, 
9036                                                      /*cond_first_p=*/1);
9037           if (tem != NULL_TREE)
9038             return tem;
9039         }
9040
9041       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9042         {
9043           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9044                                                      arg1, arg0, 
9045                                                      /*cond_first_p=*/0);
9046           if (tem != NULL_TREE)
9047             return tem;
9048         }
9049     }
9050
9051   switch (code)
9052     {
9053     case PLUS_EXPR:
9054       /* A + (-B) -> A - B */
9055       if (TREE_CODE (arg1) == NEGATE_EXPR)
9056         return fold_build2 (MINUS_EXPR, type,
9057                             fold_convert (type, arg0),
9058                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9059       /* (-A) + B -> B - A */
9060       if (TREE_CODE (arg0) == NEGATE_EXPR
9061           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9062         return fold_build2 (MINUS_EXPR, type,
9063                             fold_convert (type, arg1),
9064                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9065       /* Convert ~A + 1 to -A.  */
9066       if (INTEGRAL_TYPE_P (type)
9067           && TREE_CODE (arg0) == BIT_NOT_EXPR
9068           && integer_onep (arg1))
9069         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9070
9071       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9072          same or one.  */
9073       if ((TREE_CODE (arg0) == MULT_EXPR
9074            || TREE_CODE (arg1) == MULT_EXPR)
9075           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9076         {
9077           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9078           if (tem)
9079             return tem;
9080         }
9081
9082       if (! FLOAT_TYPE_P (type))
9083         {
9084           if (integer_zerop (arg1))
9085             return non_lvalue (fold_convert (type, arg0));
9086
9087           /* ~X + X is -1.  */
9088           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9089               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9090               && !TYPE_OVERFLOW_TRAPS (type))
9091             {
9092               t1 = build_int_cst_type (type, -1);
9093               return omit_one_operand (type, t1, arg1);
9094             }
9095
9096           /* X + ~X is -1.  */
9097           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9098               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
9099               && !TYPE_OVERFLOW_TRAPS (type))
9100             {
9101               t1 = build_int_cst_type (type, -1);
9102               return omit_one_operand (type, t1, arg0);
9103           }
9104
9105           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9106              with a constant, and the two constants have no bits in common,
9107              we should treat this as a BIT_IOR_EXPR since this may produce more
9108              simplifications.  */
9109           if (TREE_CODE (arg0) == BIT_AND_EXPR
9110               && TREE_CODE (arg1) == BIT_AND_EXPR
9111               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9112               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9113               && integer_zerop (const_binop (BIT_AND_EXPR,
9114                                              TREE_OPERAND (arg0, 1),
9115                                              TREE_OPERAND (arg1, 1), 0)))
9116             {
9117               code = BIT_IOR_EXPR;
9118               goto bit_ior;
9119             }
9120
9121           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9122              (plus (plus (mult) (mult)) (foo)) so that we can
9123              take advantage of the factoring cases below.  */
9124           if (((TREE_CODE (arg0) == PLUS_EXPR
9125                 || TREE_CODE (arg0) == MINUS_EXPR)
9126                && TREE_CODE (arg1) == MULT_EXPR)
9127               || ((TREE_CODE (arg1) == PLUS_EXPR
9128                    || TREE_CODE (arg1) == MINUS_EXPR)
9129                   && TREE_CODE (arg0) == MULT_EXPR))
9130             {
9131               tree parg0, parg1, parg, marg;
9132               enum tree_code pcode;
9133
9134               if (TREE_CODE (arg1) == MULT_EXPR)
9135                 parg = arg0, marg = arg1;
9136               else
9137                 parg = arg1, marg = arg0;
9138               pcode = TREE_CODE (parg);
9139               parg0 = TREE_OPERAND (parg, 0);
9140               parg1 = TREE_OPERAND (parg, 1);
9141               STRIP_NOPS (parg0);
9142               STRIP_NOPS (parg1);
9143
9144               if (TREE_CODE (parg0) == MULT_EXPR
9145                   && TREE_CODE (parg1) != MULT_EXPR)
9146                 return fold_build2 (pcode, type,
9147                                     fold_build2 (PLUS_EXPR, type,
9148                                                  fold_convert (type, parg0),
9149                                                  fold_convert (type, marg)),
9150                                     fold_convert (type, parg1));
9151               if (TREE_CODE (parg0) != MULT_EXPR
9152                   && TREE_CODE (parg1) == MULT_EXPR)
9153                 return fold_build2 (PLUS_EXPR, type,
9154                                     fold_convert (type, parg0),
9155                                     fold_build2 (pcode, type,
9156                                                  fold_convert (type, marg),
9157                                                  fold_convert (type,
9158                                                                parg1)));
9159             }
9160
9161           /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
9162              of the array.  Loop optimizer sometimes produce this type of
9163              expressions.  */
9164           if (TREE_CODE (arg0) == ADDR_EXPR)
9165             {
9166               tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
9167               if (tem)
9168                 return fold_convert (type, tem);
9169             }
9170           else if (TREE_CODE (arg1) == ADDR_EXPR)
9171             {
9172               tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
9173               if (tem)
9174                 return fold_convert (type, tem);
9175             }
9176         }
9177       else
9178         {
9179           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9180           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9181             return non_lvalue (fold_convert (type, arg0));
9182
9183           /* Likewise if the operands are reversed.  */
9184           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9185             return non_lvalue (fold_convert (type, arg1));
9186
9187           /* Convert X + -C into X - C.  */
9188           if (TREE_CODE (arg1) == REAL_CST
9189               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9190             {
9191               tem = fold_negate_const (arg1, type);
9192               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9193                 return fold_build2 (MINUS_EXPR, type,
9194                                     fold_convert (type, arg0),
9195                                     fold_convert (type, tem));
9196             }
9197
9198           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9199              to __complex__ ( x, y ).  This is not the same for SNaNs or
9200              if signed zeros are involved.  */
9201           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9202               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9203               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9204             {
9205               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9206               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9207               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9208               bool arg0rz = false, arg0iz = false;
9209               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9210                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9211                 {
9212                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9213                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9214                   if (arg0rz && arg1i && real_zerop (arg1i))
9215                     {
9216                       tree rp = arg1r ? arg1r
9217                                   : build1 (REALPART_EXPR, rtype, arg1);
9218                       tree ip = arg0i ? arg0i
9219                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9220                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9221                     }
9222                   else if (arg0iz && arg1r && real_zerop (arg1r))
9223                     {
9224                       tree rp = arg0r ? arg0r
9225                                   : build1 (REALPART_EXPR, rtype, arg0);
9226                       tree ip = arg1i ? arg1i
9227                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9228                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9229                     }
9230                 }
9231             }
9232
9233           if (flag_unsafe_math_optimizations
9234               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9235               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9236               && (tem = distribute_real_division (code, type, arg0, arg1)))
9237             return tem;
9238
9239           /* Convert x+x into x*2.0.  */
9240           if (operand_equal_p (arg0, arg1, 0)
9241               && SCALAR_FLOAT_TYPE_P (type))
9242             return fold_build2 (MULT_EXPR, type, arg0,
9243                                 build_real (type, dconst2));
9244
9245           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  */
9246           if (flag_unsafe_math_optimizations
9247               && TREE_CODE (arg1) == PLUS_EXPR
9248               && TREE_CODE (arg0) != MULT_EXPR)
9249             {
9250               tree tree10 = TREE_OPERAND (arg1, 0);
9251               tree tree11 = TREE_OPERAND (arg1, 1);
9252               if (TREE_CODE (tree11) == MULT_EXPR
9253                   && TREE_CODE (tree10) == MULT_EXPR)
9254                 {
9255                   tree tree0;
9256                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9257                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9258                 }
9259             }
9260           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  */
9261           if (flag_unsafe_math_optimizations
9262               && TREE_CODE (arg0) == PLUS_EXPR
9263               && TREE_CODE (arg1) != MULT_EXPR)
9264             {
9265               tree tree00 = TREE_OPERAND (arg0, 0);
9266               tree tree01 = TREE_OPERAND (arg0, 1);
9267               if (TREE_CODE (tree01) == MULT_EXPR
9268                   && TREE_CODE (tree00) == MULT_EXPR)
9269                 {
9270                   tree tree0;
9271                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9272                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9273                 }
9274             }
9275         }
9276
9277      bit_rotate:
9278       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9279          is a rotate of A by C1 bits.  */
9280       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9281          is a rotate of A by B bits.  */
9282       {
9283         enum tree_code code0, code1;
9284         code0 = TREE_CODE (arg0);
9285         code1 = TREE_CODE (arg1);
9286         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9287              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9288             && operand_equal_p (TREE_OPERAND (arg0, 0),
9289                                 TREE_OPERAND (arg1, 0), 0)
9290             && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
9291           {
9292             tree tree01, tree11;
9293             enum tree_code code01, code11;
9294
9295             tree01 = TREE_OPERAND (arg0, 1);
9296             tree11 = TREE_OPERAND (arg1, 1);
9297             STRIP_NOPS (tree01);
9298             STRIP_NOPS (tree11);
9299             code01 = TREE_CODE (tree01);
9300             code11 = TREE_CODE (tree11);
9301             if (code01 == INTEGER_CST
9302                 && code11 == INTEGER_CST
9303                 && TREE_INT_CST_HIGH (tree01) == 0
9304                 && TREE_INT_CST_HIGH (tree11) == 0
9305                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9306                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9307               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9308                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9309             else if (code11 == MINUS_EXPR)
9310               {
9311                 tree tree110, tree111;
9312                 tree110 = TREE_OPERAND (tree11, 0);
9313                 tree111 = TREE_OPERAND (tree11, 1);
9314                 STRIP_NOPS (tree110);
9315                 STRIP_NOPS (tree111);
9316                 if (TREE_CODE (tree110) == INTEGER_CST
9317                     && 0 == compare_tree_int (tree110,
9318                                               TYPE_PRECISION
9319                                               (TREE_TYPE (TREE_OPERAND
9320                                                           (arg0, 0))))
9321                     && operand_equal_p (tree01, tree111, 0))
9322                   return build2 ((code0 == LSHIFT_EXPR
9323                                   ? LROTATE_EXPR
9324                                   : RROTATE_EXPR),
9325                                  type, TREE_OPERAND (arg0, 0), tree01);
9326               }
9327             else if (code01 == MINUS_EXPR)
9328               {
9329                 tree tree010, tree011;
9330                 tree010 = TREE_OPERAND (tree01, 0);
9331                 tree011 = TREE_OPERAND (tree01, 1);
9332                 STRIP_NOPS (tree010);
9333                 STRIP_NOPS (tree011);
9334                 if (TREE_CODE (tree010) == INTEGER_CST
9335                     && 0 == compare_tree_int (tree010,
9336                                               TYPE_PRECISION
9337                                               (TREE_TYPE (TREE_OPERAND
9338                                                           (arg0, 0))))
9339                     && operand_equal_p (tree11, tree011, 0))
9340                   return build2 ((code0 != LSHIFT_EXPR
9341                                   ? LROTATE_EXPR
9342                                   : RROTATE_EXPR),
9343                                  type, TREE_OPERAND (arg0, 0), tree11);
9344               }
9345           }
9346       }
9347
9348     associate:
9349       /* In most languages, can't associate operations on floats through
9350          parentheses.  Rather than remember where the parentheses were, we
9351          don't associate floats at all, unless the user has specified
9352          -funsafe-math-optimizations.  */
9353
9354       if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9355         {
9356           tree var0, con0, lit0, minus_lit0;
9357           tree var1, con1, lit1, minus_lit1;
9358           bool ok = true;
9359
9360           /* Split both trees into variables, constants, and literals.  Then
9361              associate each group together, the constants with literals,
9362              then the result with variables.  This increases the chances of
9363              literals being recombined later and of generating relocatable
9364              expressions for the sum of a constant and literal.  */
9365           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9366           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9367                              code == MINUS_EXPR);
9368
9369           /* With undefined overflow we can only associate constants
9370              with one variable.  */
9371           if ((POINTER_TYPE_P (type)
9372                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9373               && var0 && var1)
9374             {
9375               tree tmp0 = var0;
9376               tree tmp1 = var1;
9377
9378               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9379                 tmp0 = TREE_OPERAND (tmp0, 0);
9380               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9381                 tmp1 = TREE_OPERAND (tmp1, 0);
9382               /* The only case we can still associate with two variables
9383                  is if they are the same, modulo negation.  */
9384               if (!operand_equal_p (tmp0, tmp1, 0))
9385                 ok = false;
9386             }
9387
9388           /* Only do something if we found more than two objects.  Otherwise,
9389              nothing has changed and we risk infinite recursion.  */
9390           if (ok
9391               && (2 < ((var0 != 0) + (var1 != 0)
9392                        + (con0 != 0) + (con1 != 0)
9393                        + (lit0 != 0) + (lit1 != 0)
9394                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9395             {
9396               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9397               if (code == MINUS_EXPR)
9398                 code = PLUS_EXPR;
9399
9400               var0 = associate_trees (var0, var1, code, type);
9401               con0 = associate_trees (con0, con1, code, type);
9402               lit0 = associate_trees (lit0, lit1, code, type);
9403               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9404
9405               /* Preserve the MINUS_EXPR if the negative part of the literal is
9406                  greater than the positive part.  Otherwise, the multiplicative
9407                  folding code (i.e extract_muldiv) may be fooled in case
9408                  unsigned constants are subtracted, like in the following
9409                  example: ((X*2 + 4) - 8U)/2.  */
9410               if (minus_lit0 && lit0)
9411                 {
9412                   if (TREE_CODE (lit0) == INTEGER_CST
9413                       && TREE_CODE (minus_lit0) == INTEGER_CST
9414                       && tree_int_cst_lt (lit0, minus_lit0))
9415                     {
9416                       minus_lit0 = associate_trees (minus_lit0, lit0,
9417                                                     MINUS_EXPR, type);
9418                       lit0 = 0;
9419                     }
9420                   else
9421                     {
9422                       lit0 = associate_trees (lit0, minus_lit0,
9423                                               MINUS_EXPR, type);
9424                       minus_lit0 = 0;
9425                     }
9426                 }
9427               if (minus_lit0)
9428                 {
9429                   if (con0 == 0)
9430                     return fold_convert (type,
9431                                          associate_trees (var0, minus_lit0,
9432                                                           MINUS_EXPR, type));
9433                   else
9434                     {
9435                       con0 = associate_trees (con0, minus_lit0,
9436                                               MINUS_EXPR, type);
9437                       return fold_convert (type,
9438                                            associate_trees (var0, con0,
9439                                                             PLUS_EXPR, type));
9440                     }
9441                 }
9442
9443               con0 = associate_trees (con0, lit0, code, type);
9444               return fold_convert (type, associate_trees (var0, con0,
9445                                                           code, type));
9446             }
9447         }
9448
9449       return NULL_TREE;
9450
9451     case MINUS_EXPR:
9452       /* A - (-B) -> A + B */
9453       if (TREE_CODE (arg1) == NEGATE_EXPR)
9454         return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
9455       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9456       if (TREE_CODE (arg0) == NEGATE_EXPR
9457           && (FLOAT_TYPE_P (type)
9458               || INTEGRAL_TYPE_P (type))
9459           && negate_expr_p (arg1)
9460           && reorder_operands_p (arg0, arg1))
9461         return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
9462                             TREE_OPERAND (arg0, 0));
9463       /* Convert -A - 1 to ~A.  */
9464       if (INTEGRAL_TYPE_P (type)
9465           && TREE_CODE (arg0) == NEGATE_EXPR
9466           && integer_onep (arg1)
9467           && !TYPE_OVERFLOW_TRAPS (type))
9468         return fold_build1 (BIT_NOT_EXPR, type,
9469                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9470
9471       /* Convert -1 - A to ~A.  */
9472       if (INTEGRAL_TYPE_P (type)
9473           && integer_all_onesp (arg0))
9474         return fold_build1 (BIT_NOT_EXPR, type, op1);
9475
9476       if (! FLOAT_TYPE_P (type))
9477         {
9478           if (integer_zerop (arg0))
9479             return negate_expr (fold_convert (type, arg1));
9480           if (integer_zerop (arg1))
9481             return non_lvalue (fold_convert (type, arg0));
9482
9483           /* Fold A - (A & B) into ~B & A.  */
9484           if (!TREE_SIDE_EFFECTS (arg0)
9485               && TREE_CODE (arg1) == BIT_AND_EXPR)
9486             {
9487               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9488                 return fold_build2 (BIT_AND_EXPR, type,
9489                                     fold_build1 (BIT_NOT_EXPR, type,
9490                                                  TREE_OPERAND (arg1, 0)),
9491                                     arg0);
9492               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9493                 return fold_build2 (BIT_AND_EXPR, type,
9494                                     fold_build1 (BIT_NOT_EXPR, type,
9495                                                  TREE_OPERAND (arg1, 1)),
9496                                     arg0);
9497             }
9498
9499           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9500              any power of 2 minus 1.  */
9501           if (TREE_CODE (arg0) == BIT_AND_EXPR
9502               && TREE_CODE (arg1) == BIT_AND_EXPR
9503               && operand_equal_p (TREE_OPERAND (arg0, 0),
9504                                   TREE_OPERAND (arg1, 0), 0))
9505             {
9506               tree mask0 = TREE_OPERAND (arg0, 1);
9507               tree mask1 = TREE_OPERAND (arg1, 1);
9508               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9509
9510               if (operand_equal_p (tem, mask1, 0))
9511                 {
9512                   tem = fold_build2 (BIT_XOR_EXPR, type,
9513                                      TREE_OPERAND (arg0, 0), mask1);
9514                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9515                 }
9516             }
9517         }
9518
9519       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9520       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9521         return non_lvalue (fold_convert (type, arg0));
9522
9523       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9524          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9525          (-ARG1 + ARG0) reduces to -ARG1.  */
9526       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9527         return negate_expr (fold_convert (type, arg1));
9528
9529       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9530          __complex__ ( x, -y ).  This is not the same for SNaNs or if
9531          signed zeros are involved.  */
9532       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9533           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9534           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9535         {
9536           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9537           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9538           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9539           bool arg0rz = false, arg0iz = false;
9540           if ((arg0r && (arg0rz = real_zerop (arg0r)))
9541               || (arg0i && (arg0iz = real_zerop (arg0i))))
9542             {
9543               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9544               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9545               if (arg0rz && arg1i && real_zerop (arg1i))
9546                 {
9547                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
9548                                          arg1r ? arg1r
9549                                          : build1 (REALPART_EXPR, rtype, arg1));
9550                   tree ip = arg0i ? arg0i
9551                     : build1 (IMAGPART_EXPR, rtype, arg0);
9552                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9553                 }
9554               else if (arg0iz && arg1r && real_zerop (arg1r))
9555                 {
9556                   tree rp = arg0r ? arg0r
9557                     : build1 (REALPART_EXPR, rtype, arg0);
9558                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
9559                                          arg1i ? arg1i
9560                                          : build1 (IMAGPART_EXPR, rtype, arg1));
9561                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9562                 }
9563             }
9564         }
9565
9566       /* Fold &x - &x.  This can happen from &x.foo - &x.
9567          This is unsafe for certain floats even in non-IEEE formats.
9568          In IEEE, it is unsafe because it does wrong for NaNs.
9569          Also note that operand_equal_p is always false if an operand
9570          is volatile.  */
9571
9572       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9573           && operand_equal_p (arg0, arg1, 0))
9574         return fold_convert (type, integer_zero_node);
9575
9576       /* A - B -> A + (-B) if B is easily negatable.  */
9577       if (negate_expr_p (arg1)
9578           && ((FLOAT_TYPE_P (type)
9579                /* Avoid this transformation if B is a positive REAL_CST.  */
9580                && (TREE_CODE (arg1) != REAL_CST
9581                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9582               || INTEGRAL_TYPE_P (type)))
9583         return fold_build2 (PLUS_EXPR, type,
9584                             fold_convert (type, arg0),
9585                             fold_convert (type, negate_expr (arg1)));
9586
9587       /* Try folding difference of addresses.  */
9588       {
9589         HOST_WIDE_INT diff;
9590
9591         if ((TREE_CODE (arg0) == ADDR_EXPR
9592              || TREE_CODE (arg1) == ADDR_EXPR)
9593             && ptr_difference_const (arg0, arg1, &diff))
9594           return build_int_cst_type (type, diff);
9595       }
9596
9597       /* Fold &a[i] - &a[j] to i-j.  */
9598       if (TREE_CODE (arg0) == ADDR_EXPR
9599           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9600           && TREE_CODE (arg1) == ADDR_EXPR
9601           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9602         {
9603           tree aref0 = TREE_OPERAND (arg0, 0);
9604           tree aref1 = TREE_OPERAND (arg1, 0);
9605           if (operand_equal_p (TREE_OPERAND (aref0, 0),
9606                                TREE_OPERAND (aref1, 0), 0))
9607             {
9608               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9609               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9610               tree esz = array_ref_element_size (aref0);
9611               tree diff = build2 (MINUS_EXPR, type, op0, op1);
9612               return fold_build2 (MULT_EXPR, type, diff,
9613                                   fold_convert (type, esz));
9614                                   
9615             }
9616         }
9617
9618       /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
9619          of the array.  Loop optimizer sometimes produce this type of
9620          expressions.  */
9621       if (TREE_CODE (arg0) == ADDR_EXPR)
9622         {
9623           tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
9624           if (tem)
9625             return fold_convert (type, tem);
9626         }
9627
9628       if (flag_unsafe_math_optimizations
9629           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9630           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9631           && (tem = distribute_real_division (code, type, arg0, arg1)))
9632         return tem;
9633
9634       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9635          same or one.  */
9636       if ((TREE_CODE (arg0) == MULT_EXPR
9637            || TREE_CODE (arg1) == MULT_EXPR)
9638           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9639         {
9640           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9641           if (tem)
9642             return tem;
9643         }
9644
9645       goto associate;
9646
9647     case MULT_EXPR:
9648       /* (-A) * (-B) -> A * B  */
9649       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9650         return fold_build2 (MULT_EXPR, type,
9651                             fold_convert (type, TREE_OPERAND (arg0, 0)),
9652                             fold_convert (type, negate_expr (arg1)));
9653       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9654         return fold_build2 (MULT_EXPR, type,
9655                             fold_convert (type, negate_expr (arg0)),
9656                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9657
9658       if (! FLOAT_TYPE_P (type))
9659         {
9660           if (integer_zerop (arg1))
9661             return omit_one_operand (type, arg1, arg0);
9662           if (integer_onep (arg1))
9663             return non_lvalue (fold_convert (type, arg0));
9664           /* Transform x * -1 into -x.  */
9665           if (integer_all_onesp (arg1))
9666             return fold_convert (type, negate_expr (arg0));
9667           /* Transform x * -C into -x * C if x is easily negatable.  */
9668           if (TREE_CODE (arg1) == INTEGER_CST
9669               && tree_int_cst_sgn (arg1) == -1
9670               && negate_expr_p (arg0)
9671               && (tem = negate_expr (arg1)) != arg1
9672               && !TREE_OVERFLOW (tem))
9673             return fold_build2 (MULT_EXPR, type,
9674                                 negate_expr (arg0), tem);
9675
9676           /* (a * (1 << b)) is (a << b)  */
9677           if (TREE_CODE (arg1) == LSHIFT_EXPR
9678               && integer_onep (TREE_OPERAND (arg1, 0)))
9679             return fold_build2 (LSHIFT_EXPR, type, arg0,
9680                                 TREE_OPERAND (arg1, 1));
9681           if (TREE_CODE (arg0) == LSHIFT_EXPR
9682               && integer_onep (TREE_OPERAND (arg0, 0)))
9683             return fold_build2 (LSHIFT_EXPR, type, arg1,
9684                                 TREE_OPERAND (arg0, 1));
9685
9686           strict_overflow_p = false;
9687           if (TREE_CODE (arg1) == INTEGER_CST
9688               && 0 != (tem = extract_muldiv (op0,
9689                                              fold_convert (type, arg1),
9690                                              code, NULL_TREE,
9691                                              &strict_overflow_p)))
9692             {
9693               if (strict_overflow_p)
9694                 fold_overflow_warning (("assuming signed overflow does not "
9695                                         "occur when simplifying "
9696                                         "multiplication"),
9697                                        WARN_STRICT_OVERFLOW_MISC);
9698               return fold_convert (type, tem);
9699             }
9700
9701           /* Optimize z * conj(z) for integer complex numbers.  */
9702           if (TREE_CODE (arg0) == CONJ_EXPR
9703               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9704             return fold_mult_zconjz (type, arg1);
9705           if (TREE_CODE (arg1) == CONJ_EXPR
9706               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9707             return fold_mult_zconjz (type, arg0);
9708         }
9709       else
9710         {
9711           /* Maybe fold x * 0 to 0.  The expressions aren't the same
9712              when x is NaN, since x * 0 is also NaN.  Nor are they the
9713              same in modes with signed zeros, since multiplying a
9714              negative value by 0 gives -0, not +0.  */
9715           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9716               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9717               && real_zerop (arg1))
9718             return omit_one_operand (type, arg1, arg0);
9719           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
9720           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9721               && real_onep (arg1))
9722             return non_lvalue (fold_convert (type, arg0));
9723
9724           /* Transform x * -1.0 into -x.  */
9725           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9726               && real_minus_onep (arg1))
9727             return fold_convert (type, negate_expr (arg0));
9728
9729           /* Convert (C1/X)*C2 into (C1*C2)/X.  */
9730           if (flag_unsafe_math_optimizations
9731               && TREE_CODE (arg0) == RDIV_EXPR
9732               && TREE_CODE (arg1) == REAL_CST
9733               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
9734             {
9735               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
9736                                       arg1, 0);
9737               if (tem)
9738                 return fold_build2 (RDIV_EXPR, type, tem,
9739                                     TREE_OPERAND (arg0, 1));
9740             }
9741
9742           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
9743           if (operand_equal_p (arg0, arg1, 0))
9744             {
9745               tree tem = fold_strip_sign_ops (arg0);
9746               if (tem != NULL_TREE)
9747                 {
9748                   tem = fold_convert (type, tem);
9749                   return fold_build2 (MULT_EXPR, type, tem, tem);
9750                 }
9751             }
9752
9753           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
9754              This is not the same for NaNs or if signed zeros are
9755              involved.  */
9756           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9757               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9758               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
9759               && TREE_CODE (arg1) == COMPLEX_CST
9760               && real_zerop (TREE_REALPART (arg1)))
9761             {
9762               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9763               if (real_onep (TREE_IMAGPART (arg1)))
9764                 return fold_build2 (COMPLEX_EXPR, type,
9765                                     negate_expr (fold_build1 (IMAGPART_EXPR,
9766                                                               rtype, arg0)),
9767                                     fold_build1 (REALPART_EXPR, rtype, arg0));
9768               else if (real_minus_onep (TREE_IMAGPART (arg1)))
9769                 return fold_build2 (COMPLEX_EXPR, type,
9770                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
9771                                     negate_expr (fold_build1 (REALPART_EXPR,
9772                                                               rtype, arg0)));
9773             }
9774
9775           /* Optimize z * conj(z) for floating point complex numbers.
9776              Guarded by flag_unsafe_math_optimizations as non-finite
9777              imaginary components don't produce scalar results.  */
9778           if (flag_unsafe_math_optimizations
9779               && TREE_CODE (arg0) == CONJ_EXPR
9780               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9781             return fold_mult_zconjz (type, arg1);
9782           if (flag_unsafe_math_optimizations
9783               && TREE_CODE (arg1) == CONJ_EXPR
9784               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9785             return fold_mult_zconjz (type, arg0);
9786
9787           if (flag_unsafe_math_optimizations)
9788             {
9789               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
9790               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
9791
9792               /* Optimizations of root(...)*root(...).  */
9793               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
9794                 {
9795                   tree rootfn, arg;
9796                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9797                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9798
9799                   /* Optimize sqrt(x)*sqrt(x) as x.  */
9800                   if (BUILTIN_SQRT_P (fcode0)
9801                       && operand_equal_p (arg00, arg10, 0)
9802                       && ! HONOR_SNANS (TYPE_MODE (type)))
9803                     return arg00;
9804
9805                   /* Optimize root(x)*root(y) as root(x*y).  */
9806                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9807                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9808                   return build_call_expr (rootfn, 1, arg);
9809                 }
9810
9811               /* Optimize expN(x)*expN(y) as expN(x+y).  */
9812               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
9813                 {
9814                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9815                   tree arg = fold_build2 (PLUS_EXPR, type,
9816                                           CALL_EXPR_ARG (arg0, 0),
9817                                           CALL_EXPR_ARG (arg1, 0));
9818                   return build_call_expr (expfn, 1, arg);
9819                 }
9820
9821               /* Optimizations of pow(...)*pow(...).  */
9822               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
9823                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
9824                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
9825                 {
9826                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9827                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9828                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9829                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9830
9831                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
9832                   if (operand_equal_p (arg01, arg11, 0))
9833                     {
9834                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9835                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9836                       return build_call_expr (powfn, 2, arg, arg01);
9837                     }
9838
9839                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
9840                   if (operand_equal_p (arg00, arg10, 0))
9841                     {
9842                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9843                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
9844                       return build_call_expr (powfn, 2, arg00, arg);
9845                     }
9846                 }
9847
9848               /* Optimize tan(x)*cos(x) as sin(x).  */
9849               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
9850                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
9851                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
9852                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
9853                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
9854                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
9855                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
9856                                       CALL_EXPR_ARG (arg1, 0), 0))
9857                 {
9858                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
9859
9860                   if (sinfn != NULL_TREE)
9861                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
9862                 }
9863
9864               /* Optimize x*pow(x,c) as pow(x,c+1).  */
9865               if (fcode1 == BUILT_IN_POW
9866                   || fcode1 == BUILT_IN_POWF
9867                   || fcode1 == BUILT_IN_POWL)
9868                 {
9869                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
9870                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
9871                   if (TREE_CODE (arg11) == REAL_CST
9872                       && !TREE_OVERFLOW (arg11)
9873                       && operand_equal_p (arg0, arg10, 0))
9874                     {
9875                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
9876                       REAL_VALUE_TYPE c;
9877                       tree arg;
9878
9879                       c = TREE_REAL_CST (arg11);
9880                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9881                       arg = build_real (type, c);
9882                       return build_call_expr (powfn, 2, arg0, arg);
9883                     }
9884                 }
9885
9886               /* Optimize pow(x,c)*x as pow(x,c+1).  */
9887               if (fcode0 == BUILT_IN_POW
9888                   || fcode0 == BUILT_IN_POWF
9889                   || fcode0 == BUILT_IN_POWL)
9890                 {
9891                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
9892                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
9893                   if (TREE_CODE (arg01) == REAL_CST
9894                       && !TREE_OVERFLOW (arg01)
9895                       && operand_equal_p (arg1, arg00, 0))
9896                     {
9897                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
9898                       REAL_VALUE_TYPE c;
9899                       tree arg;
9900
9901                       c = TREE_REAL_CST (arg01);
9902                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9903                       arg = build_real (type, c);
9904                       return build_call_expr (powfn, 2, arg1, arg);
9905                     }
9906                 }
9907
9908               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
9909               if (! optimize_size
9910                   && operand_equal_p (arg0, arg1, 0))
9911                 {
9912                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
9913
9914                   if (powfn)
9915                     {
9916                       tree arg = build_real (type, dconst2);
9917                       return build_call_expr (powfn, 2, arg0, arg);
9918                     }
9919                 }
9920             }
9921         }
9922       goto associate;
9923
9924     case BIT_IOR_EXPR:
9925     bit_ior:
9926       if (integer_all_onesp (arg1))
9927         return omit_one_operand (type, arg1, arg0);
9928       if (integer_zerop (arg1))
9929         return non_lvalue (fold_convert (type, arg0));
9930       if (operand_equal_p (arg0, arg1, 0))
9931         return non_lvalue (fold_convert (type, arg0));
9932
9933       /* ~X | X is -1.  */
9934       if (TREE_CODE (arg0) == BIT_NOT_EXPR
9935           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9936         {
9937           t1 = build_int_cst_type (type, -1);
9938           return omit_one_operand (type, t1, arg1);
9939         }
9940
9941       /* X | ~X is -1.  */
9942       if (TREE_CODE (arg1) == BIT_NOT_EXPR
9943           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9944         {
9945           t1 = build_int_cst_type (type, -1);
9946           return omit_one_operand (type, t1, arg0);
9947         }
9948
9949       /* Canonicalize (X & C1) | C2.  */
9950       if (TREE_CODE (arg0) == BIT_AND_EXPR
9951           && TREE_CODE (arg1) == INTEGER_CST
9952           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9953         {
9954           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, mlo, mhi;
9955           int width = TYPE_PRECISION (type);
9956           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
9957           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
9958           hi2 = TREE_INT_CST_HIGH (arg1);
9959           lo2 = TREE_INT_CST_LOW (arg1);
9960
9961           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
9962           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
9963             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
9964
9965           if (width > HOST_BITS_PER_WIDE_INT)
9966             {
9967               mhi = (unsigned HOST_WIDE_INT) -1 
9968                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
9969               mlo = -1;
9970             }
9971           else
9972             {
9973               mhi = 0;
9974               mlo = (unsigned HOST_WIDE_INT) -1
9975                     >> (HOST_BITS_PER_WIDE_INT - width);
9976             }
9977
9978           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
9979           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
9980             return fold_build2 (BIT_IOR_EXPR, type,
9981                                 TREE_OPERAND (arg0, 0), arg1);
9982
9983           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2.  */
9984           hi1 &= mhi;
9985           lo1 &= mlo;
9986           if ((hi1 & ~hi2) != hi1 || (lo1 & ~lo2) != lo1)
9987             return fold_build2 (BIT_IOR_EXPR, type,
9988                                 fold_build2 (BIT_AND_EXPR, type,
9989                                              TREE_OPERAND (arg0, 0),
9990                                              build_int_cst_wide (type,
9991                                                                  lo1 & ~lo2,
9992                                                                  hi1 & ~hi2)),
9993                                 arg1);
9994         }
9995
9996       /* (X & Y) | Y is (X, Y).  */
9997       if (TREE_CODE (arg0) == BIT_AND_EXPR
9998           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9999         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10000       /* (X & Y) | X is (Y, X).  */
10001       if (TREE_CODE (arg0) == BIT_AND_EXPR
10002           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10003           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10004         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10005       /* X | (X & Y) is (Y, X).  */
10006       if (TREE_CODE (arg1) == BIT_AND_EXPR
10007           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10008           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10009         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10010       /* X | (Y & X) is (Y, X).  */
10011       if (TREE_CODE (arg1) == BIT_AND_EXPR
10012           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10013           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10014         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10015
10016       t1 = distribute_bit_expr (code, type, arg0, arg1);
10017       if (t1 != NULL_TREE)
10018         return t1;
10019
10020       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10021
10022          This results in more efficient code for machines without a NAND
10023          instruction.  Combine will canonicalize to the first form
10024          which will allow use of NAND instructions provided by the
10025          backend if they exist.  */
10026       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10027           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10028         {
10029           return fold_build1 (BIT_NOT_EXPR, type,
10030                               build2 (BIT_AND_EXPR, type,
10031                                       TREE_OPERAND (arg0, 0),
10032                                       TREE_OPERAND (arg1, 0)));
10033         }
10034
10035       /* See if this can be simplified into a rotate first.  If that
10036          is unsuccessful continue in the association code.  */
10037       goto bit_rotate;
10038
10039     case BIT_XOR_EXPR:
10040       if (integer_zerop (arg1))
10041         return non_lvalue (fold_convert (type, arg0));
10042       if (integer_all_onesp (arg1))
10043         return fold_build1 (BIT_NOT_EXPR, type, arg0);
10044       if (operand_equal_p (arg0, arg1, 0))
10045         return omit_one_operand (type, integer_zero_node, arg0);
10046
10047       /* ~X ^ X is -1.  */
10048       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10049           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10050         {
10051           t1 = build_int_cst_type (type, -1);
10052           return omit_one_operand (type, t1, arg1);
10053         }
10054
10055       /* X ^ ~X is -1.  */
10056       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10057           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10058         {
10059           t1 = build_int_cst_type (type, -1);
10060           return omit_one_operand (type, t1, arg0);
10061         }
10062
10063       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10064          with a constant, and the two constants have no bits in common,
10065          we should treat this as a BIT_IOR_EXPR since this may produce more
10066          simplifications.  */
10067       if (TREE_CODE (arg0) == BIT_AND_EXPR
10068           && TREE_CODE (arg1) == BIT_AND_EXPR
10069           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10070           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10071           && integer_zerop (const_binop (BIT_AND_EXPR,
10072                                          TREE_OPERAND (arg0, 1),
10073                                          TREE_OPERAND (arg1, 1), 0)))
10074         {
10075           code = BIT_IOR_EXPR;
10076           goto bit_ior;
10077         }
10078
10079       /* (X | Y) ^ X -> Y & ~ X*/
10080       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10081           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10082         {
10083           tree t2 = TREE_OPERAND (arg0, 1);
10084           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10085                             arg1);
10086           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10087                             fold_convert (type, t1));
10088           return t1;
10089         }
10090
10091       /* (Y | X) ^ X -> Y & ~ X*/
10092       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10093           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10094         {
10095           tree t2 = TREE_OPERAND (arg0, 0);
10096           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10097                             arg1);
10098           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10099                             fold_convert (type, t1));
10100           return t1;
10101         }
10102
10103       /* X ^ (X | Y) -> Y & ~ X*/
10104       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10105           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10106         {
10107           tree t2 = TREE_OPERAND (arg1, 1);
10108           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10109                             arg0);
10110           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10111                             fold_convert (type, t1));
10112           return t1;
10113         }
10114
10115       /* X ^ (Y | X) -> Y & ~ X*/
10116       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10117           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10118         {
10119           tree t2 = TREE_OPERAND (arg1, 0);
10120           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10121                             arg0);
10122           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10123                             fold_convert (type, t1));
10124           return t1;
10125         }
10126         
10127       /* Convert ~X ^ ~Y to X ^ Y.  */
10128       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10129           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10130         return fold_build2 (code, type,
10131                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10132                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10133
10134       /* Convert ~X ^ C to X ^ ~C.  */
10135       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10136           && TREE_CODE (arg1) == INTEGER_CST)
10137         return fold_build2 (code, type,
10138                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10139                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10140
10141       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10142       if (TREE_CODE (arg0) == BIT_AND_EXPR
10143           && integer_onep (TREE_OPERAND (arg0, 1))
10144           && integer_onep (arg1))
10145         return fold_build2 (EQ_EXPR, type, arg0,
10146                             build_int_cst (TREE_TYPE (arg0), 0));
10147
10148       /* Fold (X & Y) ^ Y as ~X & Y.  */
10149       if (TREE_CODE (arg0) == BIT_AND_EXPR
10150           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10151         {
10152           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10153           return fold_build2 (BIT_AND_EXPR, type, 
10154                               fold_build1 (BIT_NOT_EXPR, type, tem),
10155                               fold_convert (type, arg1));
10156         }
10157       /* Fold (X & Y) ^ X as ~Y & X.  */
10158       if (TREE_CODE (arg0) == BIT_AND_EXPR
10159           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10160           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10161         {
10162           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10163           return fold_build2 (BIT_AND_EXPR, type,
10164                               fold_build1 (BIT_NOT_EXPR, type, tem),
10165                               fold_convert (type, arg1));
10166         }
10167       /* Fold X ^ (X & Y) as X & ~Y.  */
10168       if (TREE_CODE (arg1) == BIT_AND_EXPR
10169           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10170         {
10171           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10172           return fold_build2 (BIT_AND_EXPR, type,
10173                               fold_convert (type, arg0),
10174                               fold_build1 (BIT_NOT_EXPR, type, tem));
10175         }
10176       /* Fold X ^ (Y & X) as ~Y & X.  */
10177       if (TREE_CODE (arg1) == BIT_AND_EXPR
10178           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10179           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10180         {
10181           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10182           return fold_build2 (BIT_AND_EXPR, type,
10183                               fold_build1 (BIT_NOT_EXPR, type, tem),
10184                               fold_convert (type, arg0));
10185         }
10186
10187       /* See if this can be simplified into a rotate first.  If that
10188          is unsuccessful continue in the association code.  */
10189       goto bit_rotate;
10190
10191     case BIT_AND_EXPR:
10192       if (integer_all_onesp (arg1))
10193         return non_lvalue (fold_convert (type, arg0));
10194       if (integer_zerop (arg1))
10195         return omit_one_operand (type, arg1, arg0);
10196       if (operand_equal_p (arg0, arg1, 0))
10197         return non_lvalue (fold_convert (type, arg0));
10198
10199       /* ~X & X is always zero.  */
10200       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10201           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10202         return omit_one_operand (type, integer_zero_node, arg1);
10203
10204       /* X & ~X is always zero.  */
10205       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10206           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10207         return omit_one_operand (type, integer_zero_node, arg0);
10208
10209       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10210       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10211           && TREE_CODE (arg1) == INTEGER_CST
10212           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10213         return fold_build2 (BIT_IOR_EXPR, type,
10214                             fold_build2 (BIT_AND_EXPR, type,
10215                                          TREE_OPERAND (arg0, 0), arg1),
10216                             fold_build2 (BIT_AND_EXPR, type,
10217                                          TREE_OPERAND (arg0, 1), arg1));
10218
10219       /* (X | Y) & Y is (X, Y).  */
10220       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10221           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10222         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10223       /* (X | Y) & X is (Y, X).  */
10224       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10225           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10226           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10227         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10228       /* X & (X | Y) is (Y, X).  */
10229       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10230           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10231           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10232         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10233       /* X & (Y | X) is (Y, X).  */
10234       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10235           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10236           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10237         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10238
10239       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10240       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10241           && integer_onep (TREE_OPERAND (arg0, 1))
10242           && integer_onep (arg1))
10243         {
10244           tem = TREE_OPERAND (arg0, 0);
10245           return fold_build2 (EQ_EXPR, type,
10246                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10247                                            build_int_cst (TREE_TYPE (tem), 1)),
10248                               build_int_cst (TREE_TYPE (tem), 0));
10249         }
10250       /* Fold ~X & 1 as (X & 1) == 0.  */
10251       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10252           && integer_onep (arg1))
10253         {
10254           tem = TREE_OPERAND (arg0, 0);
10255           return fold_build2 (EQ_EXPR, type,
10256                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10257                                            build_int_cst (TREE_TYPE (tem), 1)),
10258                               build_int_cst (TREE_TYPE (tem), 0));
10259         }
10260
10261       /* Fold (X ^ Y) & Y as ~X & Y.  */
10262       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10263           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10264         {
10265           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10266           return fold_build2 (BIT_AND_EXPR, type, 
10267                               fold_build1 (BIT_NOT_EXPR, type, tem),
10268                               fold_convert (type, arg1));
10269         }
10270       /* Fold (X ^ Y) & X as ~Y & X.  */
10271       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10272           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10273           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10274         {
10275           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10276           return fold_build2 (BIT_AND_EXPR, type,
10277                               fold_build1 (BIT_NOT_EXPR, type, tem),
10278                               fold_convert (type, arg1));
10279         }
10280       /* Fold X & (X ^ Y) as X & ~Y.  */
10281       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10282           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10283         {
10284           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10285           return fold_build2 (BIT_AND_EXPR, type,
10286                               fold_convert (type, arg0),
10287                               fold_build1 (BIT_NOT_EXPR, type, tem));
10288         }
10289       /* Fold X & (Y ^ X) as ~Y & X.  */
10290       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10291           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10292           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10293         {
10294           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10295           return fold_build2 (BIT_AND_EXPR, type,
10296                               fold_build1 (BIT_NOT_EXPR, type, tem),
10297                               fold_convert (type, arg0));
10298         }
10299
10300       t1 = distribute_bit_expr (code, type, arg0, arg1);
10301       if (t1 != NULL_TREE)
10302         return t1;
10303       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10304       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10305           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10306         {
10307           unsigned int prec
10308             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10309
10310           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10311               && (~TREE_INT_CST_LOW (arg1)
10312                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10313             return fold_convert (type, TREE_OPERAND (arg0, 0));
10314         }
10315
10316       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10317
10318          This results in more efficient code for machines without a NOR
10319          instruction.  Combine will canonicalize to the first form
10320          which will allow use of NOR instructions provided by the
10321          backend if they exist.  */
10322       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10323           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10324         {
10325           return fold_build1 (BIT_NOT_EXPR, type,
10326                               build2 (BIT_IOR_EXPR, type,
10327                                       TREE_OPERAND (arg0, 0),
10328                                       TREE_OPERAND (arg1, 0)));
10329         }
10330
10331       goto associate;
10332
10333     case RDIV_EXPR:
10334       /* Don't touch a floating-point divide by zero unless the mode
10335          of the constant can represent infinity.  */
10336       if (TREE_CODE (arg1) == REAL_CST
10337           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10338           && real_zerop (arg1))
10339         return NULL_TREE;
10340
10341       /* Optimize A / A to 1.0 if we don't care about
10342          NaNs or Infinities.  Skip the transformation
10343          for non-real operands.  */
10344       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10345           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10346           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10347           && operand_equal_p (arg0, arg1, 0))
10348         {
10349           tree r = build_real (TREE_TYPE (arg0), dconst1);
10350
10351           return omit_two_operands (type, r, arg0, arg1);
10352         }
10353
10354       /* The complex version of the above A / A optimization.  */
10355       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10356           && operand_equal_p (arg0, arg1, 0))
10357         {
10358           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10359           if (! HONOR_NANS (TYPE_MODE (elem_type))
10360               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10361             {
10362               tree r = build_real (elem_type, dconst1);
10363               /* omit_two_operands will call fold_convert for us.  */
10364               return omit_two_operands (type, r, arg0, arg1);
10365             }
10366         }
10367
10368       /* (-A) / (-B) -> A / B  */
10369       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10370         return fold_build2 (RDIV_EXPR, type,
10371                             TREE_OPERAND (arg0, 0),
10372                             negate_expr (arg1));
10373       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10374         return fold_build2 (RDIV_EXPR, type,
10375                             negate_expr (arg0),
10376                             TREE_OPERAND (arg1, 0));
10377
10378       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10379       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10380           && real_onep (arg1))
10381         return non_lvalue (fold_convert (type, arg0));
10382
10383       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10384       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10385           && real_minus_onep (arg1))
10386         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10387
10388       /* If ARG1 is a constant, we can convert this to a multiply by the
10389          reciprocal.  This does not have the same rounding properties,
10390          so only do this if -funsafe-math-optimizations.  We can actually
10391          always safely do it if ARG1 is a power of two, but it's hard to
10392          tell if it is or not in a portable manner.  */
10393       if (TREE_CODE (arg1) == REAL_CST)
10394         {
10395           if (flag_unsafe_math_optimizations
10396               && 0 != (tem = const_binop (code, build_real (type, dconst1),
10397                                           arg1, 0)))
10398             return fold_build2 (MULT_EXPR, type, arg0, tem);
10399           /* Find the reciprocal if optimizing and the result is exact.  */
10400           if (optimize)
10401             {
10402               REAL_VALUE_TYPE r;
10403               r = TREE_REAL_CST (arg1);
10404               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10405                 {
10406                   tem = build_real (type, r);
10407                   return fold_build2 (MULT_EXPR, type,
10408                                       fold_convert (type, arg0), tem);
10409                 }
10410             }
10411         }
10412       /* Convert A/B/C to A/(B*C).  */
10413       if (flag_unsafe_math_optimizations
10414           && TREE_CODE (arg0) == RDIV_EXPR)
10415         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10416                             fold_build2 (MULT_EXPR, type,
10417                                          TREE_OPERAND (arg0, 1), arg1));
10418
10419       /* Convert A/(B/C) to (A/B)*C.  */
10420       if (flag_unsafe_math_optimizations
10421           && TREE_CODE (arg1) == RDIV_EXPR)
10422         return fold_build2 (MULT_EXPR, type,
10423                             fold_build2 (RDIV_EXPR, type, arg0,
10424                                          TREE_OPERAND (arg1, 0)),
10425                             TREE_OPERAND (arg1, 1));
10426
10427       /* Convert C1/(X*C2) into (C1/C2)/X.  */
10428       if (flag_unsafe_math_optimizations
10429           && TREE_CODE (arg1) == MULT_EXPR
10430           && TREE_CODE (arg0) == REAL_CST
10431           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10432         {
10433           tree tem = const_binop (RDIV_EXPR, arg0,
10434                                   TREE_OPERAND (arg1, 1), 0);
10435           if (tem)
10436             return fold_build2 (RDIV_EXPR, type, tem,
10437                                 TREE_OPERAND (arg1, 0));
10438         }
10439
10440       if (flag_unsafe_math_optimizations)
10441         {
10442           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10443           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10444
10445           /* Optimize sin(x)/cos(x) as tan(x).  */
10446           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10447                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10448                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10449               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10450                                   CALL_EXPR_ARG (arg1, 0), 0))
10451             {
10452               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10453
10454               if (tanfn != NULL_TREE)
10455                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10456             }
10457
10458           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
10459           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10460                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10461                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10462               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10463                                   CALL_EXPR_ARG (arg1, 0), 0))
10464             {
10465               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10466
10467               if (tanfn != NULL_TREE)
10468                 {
10469                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10470                   return fold_build2 (RDIV_EXPR, type,
10471                                       build_real (type, dconst1), tmp);
10472                 }
10473             }
10474
10475           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10476              NaNs or Infinities.  */
10477           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10478                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10479                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
10480             {
10481               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10482               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10483
10484               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10485                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10486                   && operand_equal_p (arg00, arg01, 0))
10487                 {
10488                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10489
10490                   if (cosfn != NULL_TREE)
10491                     return build_call_expr (cosfn, 1, arg00);
10492                 }
10493             }
10494
10495           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
10496              NaNs or Infinities.  */
10497           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
10498                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
10499                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
10500             {
10501               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10502               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10503
10504               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10505                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10506                   && operand_equal_p (arg00, arg01, 0))
10507                 {
10508                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10509
10510                   if (cosfn != NULL_TREE)
10511                     {
10512                       tree tmp = build_call_expr (cosfn, 1, arg00);
10513                       return fold_build2 (RDIV_EXPR, type,
10514                                           build_real (type, dconst1),
10515                                           tmp);
10516                     }
10517                 }
10518             }
10519
10520           /* Optimize pow(x,c)/x as pow(x,c-1).  */
10521           if (fcode0 == BUILT_IN_POW
10522               || fcode0 == BUILT_IN_POWF
10523               || fcode0 == BUILT_IN_POWL)
10524             {
10525               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10526               tree arg01 = CALL_EXPR_ARG (arg0, 1);
10527               if (TREE_CODE (arg01) == REAL_CST
10528                   && !TREE_OVERFLOW (arg01)
10529                   && operand_equal_p (arg1, arg00, 0))
10530                 {
10531                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10532                   REAL_VALUE_TYPE c;
10533                   tree arg;
10534
10535                   c = TREE_REAL_CST (arg01);
10536                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
10537                   arg = build_real (type, c);
10538                   return build_call_expr (powfn, 2, arg1, arg);
10539                 }
10540             }
10541
10542           /* Optimize x/expN(y) into x*expN(-y).  */
10543           if (BUILTIN_EXPONENT_P (fcode1))
10544             {
10545               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10546               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
10547               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
10548               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10549             }
10550
10551           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
10552           if (fcode1 == BUILT_IN_POW
10553               || fcode1 == BUILT_IN_POWF
10554               || fcode1 == BUILT_IN_POWL)
10555             {
10556               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10557               tree arg10 = CALL_EXPR_ARG (arg1, 0);
10558               tree arg11 = CALL_EXPR_ARG (arg1, 1);
10559               tree neg11 = fold_convert (type, negate_expr (arg11));
10560               arg1 = build_call_expr (powfn, 2, arg10, neg11);
10561               return fold_build2 (MULT_EXPR, type, arg0, arg1);
10562             }
10563         }
10564       return NULL_TREE;
10565
10566     case TRUNC_DIV_EXPR:
10567     case FLOOR_DIV_EXPR:
10568       /* Simplify A / (B << N) where A and B are positive and B is
10569          a power of 2, to A >> (N + log2(B)).  */
10570       strict_overflow_p = false;
10571       if (TREE_CODE (arg1) == LSHIFT_EXPR
10572           && (TYPE_UNSIGNED (type)
10573               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10574         {
10575           tree sval = TREE_OPERAND (arg1, 0);
10576           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
10577             {
10578               tree sh_cnt = TREE_OPERAND (arg1, 1);
10579               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
10580
10581               if (strict_overflow_p)
10582                 fold_overflow_warning (("assuming signed overflow does not "
10583                                         "occur when simplifying A / (B << N)"),
10584                                        WARN_STRICT_OVERFLOW_MISC);
10585
10586               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
10587                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
10588               return fold_build2 (RSHIFT_EXPR, type,
10589                                   fold_convert (type, arg0), sh_cnt);
10590             }
10591         }
10592       /* Fall thru */
10593
10594     case ROUND_DIV_EXPR:
10595     case CEIL_DIV_EXPR:
10596     case EXACT_DIV_EXPR:
10597       if (integer_onep (arg1))
10598         return non_lvalue (fold_convert (type, arg0));
10599       if (integer_zerop (arg1))
10600         return NULL_TREE;
10601       /* X / -1 is -X.  */
10602       if (!TYPE_UNSIGNED (type)
10603           && TREE_CODE (arg1) == INTEGER_CST
10604           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10605           && TREE_INT_CST_HIGH (arg1) == -1)
10606         return fold_convert (type, negate_expr (arg0));
10607
10608       /* Convert -A / -B to A / B when the type is signed and overflow is
10609          undefined.  */
10610       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10611           && TREE_CODE (arg0) == NEGATE_EXPR
10612           && negate_expr_p (arg1))
10613         {
10614           if (INTEGRAL_TYPE_P (type))
10615             fold_overflow_warning (("assuming signed overflow does not occur "
10616                                     "when distributing negation across "
10617                                     "division"),
10618                                    WARN_STRICT_OVERFLOW_MISC);
10619           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10620                               negate_expr (arg1));
10621         }
10622       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10623           && TREE_CODE (arg1) == NEGATE_EXPR
10624           && negate_expr_p (arg0))
10625         {
10626           if (INTEGRAL_TYPE_P (type))
10627             fold_overflow_warning (("assuming signed overflow does not occur "
10628                                     "when distributing negation across "
10629                                     "division"),
10630                                    WARN_STRICT_OVERFLOW_MISC);
10631           return fold_build2 (code, type, negate_expr (arg0),
10632                               TREE_OPERAND (arg1, 0));
10633         }
10634
10635       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
10636          operation, EXACT_DIV_EXPR.
10637
10638          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
10639          At one time others generated faster code, it's not clear if they do
10640          after the last round to changes to the DIV code in expmed.c.  */
10641       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
10642           && multiple_of_p (type, arg0, arg1))
10643         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
10644
10645       strict_overflow_p = false;
10646       if (TREE_CODE (arg1) == INTEGER_CST
10647           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10648                                          &strict_overflow_p)))
10649         {
10650           if (strict_overflow_p)
10651             fold_overflow_warning (("assuming signed overflow does not occur "
10652                                     "when simplifying division"),
10653                                    WARN_STRICT_OVERFLOW_MISC);
10654           return fold_convert (type, tem);
10655         }
10656
10657       return NULL_TREE;
10658
10659     case CEIL_MOD_EXPR:
10660     case FLOOR_MOD_EXPR:
10661     case ROUND_MOD_EXPR:
10662     case TRUNC_MOD_EXPR:
10663       /* X % 1 is always zero, but be sure to preserve any side
10664          effects in X.  */
10665       if (integer_onep (arg1))
10666         return omit_one_operand (type, integer_zero_node, arg0);
10667
10668       /* X % 0, return X % 0 unchanged so that we can get the
10669          proper warnings and errors.  */
10670       if (integer_zerop (arg1))
10671         return NULL_TREE;
10672
10673       /* 0 % X is always zero, but be sure to preserve any side
10674          effects in X.  Place this after checking for X == 0.  */
10675       if (integer_zerop (arg0))
10676         return omit_one_operand (type, integer_zero_node, arg1);
10677
10678       /* X % -1 is zero.  */
10679       if (!TYPE_UNSIGNED (type)
10680           && TREE_CODE (arg1) == INTEGER_CST
10681           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10682           && TREE_INT_CST_HIGH (arg1) == -1)
10683         return omit_one_operand (type, integer_zero_node, arg0);
10684
10685       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
10686          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
10687       strict_overflow_p = false;
10688       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
10689           && (TYPE_UNSIGNED (type)
10690               || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10691         {
10692           tree c = arg1;
10693           /* Also optimize A % (C << N)  where C is a power of 2,
10694              to A & ((C << N) - 1).  */
10695           if (TREE_CODE (arg1) == LSHIFT_EXPR)
10696             c = TREE_OPERAND (arg1, 0);
10697
10698           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
10699             {
10700               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
10701                                        build_int_cst (TREE_TYPE (arg1), 1));
10702               if (strict_overflow_p)
10703                 fold_overflow_warning (("assuming signed overflow does not "
10704                                         "occur when simplifying "
10705                                         "X % (power of two)"),
10706                                        WARN_STRICT_OVERFLOW_MISC);
10707               return fold_build2 (BIT_AND_EXPR, type,
10708                                   fold_convert (type, arg0),
10709                                   fold_convert (type, mask));
10710             }
10711         }
10712
10713       /* X % -C is the same as X % C.  */
10714       if (code == TRUNC_MOD_EXPR
10715           && !TYPE_UNSIGNED (type)
10716           && TREE_CODE (arg1) == INTEGER_CST
10717           && !TREE_OVERFLOW (arg1)
10718           && TREE_INT_CST_HIGH (arg1) < 0
10719           && !TYPE_OVERFLOW_TRAPS (type)
10720           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
10721           && !sign_bit_p (arg1, arg1))
10722         return fold_build2 (code, type, fold_convert (type, arg0),
10723                             fold_convert (type, negate_expr (arg1)));
10724
10725       /* X % -Y is the same as X % Y.  */
10726       if (code == TRUNC_MOD_EXPR
10727           && !TYPE_UNSIGNED (type)
10728           && TREE_CODE (arg1) == NEGATE_EXPR
10729           && !TYPE_OVERFLOW_TRAPS (type))
10730         return fold_build2 (code, type, fold_convert (type, arg0),
10731                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10732
10733       if (TREE_CODE (arg1) == INTEGER_CST
10734           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10735                                          &strict_overflow_p)))
10736         {
10737           if (strict_overflow_p)
10738             fold_overflow_warning (("assuming signed overflow does not occur "
10739                                     "when simplifying modulos"),
10740                                    WARN_STRICT_OVERFLOW_MISC);
10741           return fold_convert (type, tem);
10742         }
10743
10744       return NULL_TREE;
10745
10746     case LROTATE_EXPR:
10747     case RROTATE_EXPR:
10748       if (integer_all_onesp (arg0))
10749         return omit_one_operand (type, arg0, arg1);
10750       goto shift;
10751
10752     case RSHIFT_EXPR:
10753       /* Optimize -1 >> x for arithmetic right shifts.  */
10754       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
10755         return omit_one_operand (type, arg0, arg1);
10756       /* ... fall through ...  */
10757
10758     case LSHIFT_EXPR:
10759     shift:
10760       if (integer_zerop (arg1))
10761         return non_lvalue (fold_convert (type, arg0));
10762       if (integer_zerop (arg0))
10763         return omit_one_operand (type, arg0, arg1);
10764
10765       /* Since negative shift count is not well-defined,
10766          don't try to compute it in the compiler.  */
10767       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
10768         return NULL_TREE;
10769
10770       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
10771       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
10772           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10773           && host_integerp (TREE_OPERAND (arg0, 1), false)
10774           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10775         {
10776           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
10777                                + TREE_INT_CST_LOW (arg1));
10778
10779           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
10780              being well defined.  */
10781           if (low >= TYPE_PRECISION (type))
10782             {
10783               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
10784                 low = low % TYPE_PRECISION (type);
10785               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
10786                 return build_int_cst (type, 0);
10787               else
10788                 low = TYPE_PRECISION (type) - 1;
10789             }
10790
10791           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10792                               build_int_cst (type, low));
10793         }
10794
10795       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
10796          into x & ((unsigned)-1 >> c) for unsigned types.  */
10797       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
10798            || (TYPE_UNSIGNED (type)
10799                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
10800           && host_integerp (arg1, false)
10801           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10802           && host_integerp (TREE_OPERAND (arg0, 1), false)
10803           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10804         {
10805           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10806           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
10807           tree lshift;
10808           tree arg00;
10809
10810           if (low0 == low1)
10811             {
10812               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10813
10814               lshift = build_int_cst (type, -1);
10815               lshift = int_const_binop (code, lshift, arg1, 0);
10816
10817               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
10818             }
10819         }
10820
10821       /* Rewrite an LROTATE_EXPR by a constant into an
10822          RROTATE_EXPR by a new constant.  */
10823       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
10824         {
10825           tree tem = build_int_cst (TREE_TYPE (arg1),
10826                                     GET_MODE_BITSIZE (TYPE_MODE (type)));
10827           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
10828           return fold_build2 (RROTATE_EXPR, type, arg0, tem);
10829         }
10830
10831       /* If we have a rotate of a bit operation with the rotate count and
10832          the second operand of the bit operation both constant,
10833          permute the two operations.  */
10834       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10835           && (TREE_CODE (arg0) == BIT_AND_EXPR
10836               || TREE_CODE (arg0) == BIT_IOR_EXPR
10837               || TREE_CODE (arg0) == BIT_XOR_EXPR)
10838           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10839         return fold_build2 (TREE_CODE (arg0), type,
10840                             fold_build2 (code, type,
10841                                          TREE_OPERAND (arg0, 0), arg1),
10842                             fold_build2 (code, type,
10843                                          TREE_OPERAND (arg0, 1), arg1));
10844
10845       /* Two consecutive rotates adding up to the width of the mode can
10846          be ignored.  */
10847       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10848           && TREE_CODE (arg0) == RROTATE_EXPR
10849           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10850           && TREE_INT_CST_HIGH (arg1) == 0
10851           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
10852           && ((TREE_INT_CST_LOW (arg1)
10853                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
10854               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
10855         return TREE_OPERAND (arg0, 0);
10856
10857       return NULL_TREE;
10858
10859     case MIN_EXPR:
10860       if (operand_equal_p (arg0, arg1, 0))
10861         return omit_one_operand (type, arg0, arg1);
10862       if (INTEGRAL_TYPE_P (type)
10863           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
10864         return omit_one_operand (type, arg1, arg0);
10865       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
10866       if (tem)
10867         return tem;
10868       goto associate;
10869
10870     case MAX_EXPR:
10871       if (operand_equal_p (arg0, arg1, 0))
10872         return omit_one_operand (type, arg0, arg1);
10873       if (INTEGRAL_TYPE_P (type)
10874           && TYPE_MAX_VALUE (type)
10875           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
10876         return omit_one_operand (type, arg1, arg0);
10877       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
10878       if (tem)
10879         return tem;
10880       goto associate;
10881
10882     case TRUTH_ANDIF_EXPR:
10883       /* Note that the operands of this must be ints
10884          and their values must be 0 or 1.
10885          ("true" is a fixed value perhaps depending on the language.)  */
10886       /* If first arg is constant zero, return it.  */
10887       if (integer_zerop (arg0))
10888         return fold_convert (type, arg0);
10889     case TRUTH_AND_EXPR:
10890       /* If either arg is constant true, drop it.  */
10891       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10892         return non_lvalue (fold_convert (type, arg1));
10893       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
10894           /* Preserve sequence points.  */
10895           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
10896         return non_lvalue (fold_convert (type, arg0));
10897       /* If second arg is constant zero, result is zero, but first arg
10898          must be evaluated.  */
10899       if (integer_zerop (arg1))
10900         return omit_one_operand (type, arg1, arg0);
10901       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
10902          case will be handled here.  */
10903       if (integer_zerop (arg0))
10904         return omit_one_operand (type, arg0, arg1);
10905
10906       /* !X && X is always false.  */
10907       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10908           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10909         return omit_one_operand (type, integer_zero_node, arg1);
10910       /* X && !X is always false.  */
10911       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10912           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10913         return omit_one_operand (type, integer_zero_node, arg0);
10914
10915       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
10916          means A >= Y && A != MAX, but in this case we know that
10917          A < X <= MAX.  */
10918
10919       if (!TREE_SIDE_EFFECTS (arg0)
10920           && !TREE_SIDE_EFFECTS (arg1))
10921         {
10922           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
10923           if (tem && !operand_equal_p (tem, arg0, 0))
10924             return fold_build2 (code, type, tem, arg1);
10925
10926           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
10927           if (tem && !operand_equal_p (tem, arg1, 0))
10928             return fold_build2 (code, type, arg0, tem);
10929         }
10930
10931     truth_andor:
10932       /* We only do these simplifications if we are optimizing.  */
10933       if (!optimize)
10934         return NULL_TREE;
10935
10936       /* Check for things like (A || B) && (A || C).  We can convert this
10937          to A || (B && C).  Note that either operator can be any of the four
10938          truth and/or operations and the transformation will still be
10939          valid.   Also note that we only care about order for the
10940          ANDIF and ORIF operators.  If B contains side effects, this
10941          might change the truth-value of A.  */
10942       if (TREE_CODE (arg0) == TREE_CODE (arg1)
10943           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
10944               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
10945               || TREE_CODE (arg0) == TRUTH_AND_EXPR
10946               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
10947           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
10948         {
10949           tree a00 = TREE_OPERAND (arg0, 0);
10950           tree a01 = TREE_OPERAND (arg0, 1);
10951           tree a10 = TREE_OPERAND (arg1, 0);
10952           tree a11 = TREE_OPERAND (arg1, 1);
10953           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
10954                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
10955                              && (code == TRUTH_AND_EXPR
10956                                  || code == TRUTH_OR_EXPR));
10957
10958           if (operand_equal_p (a00, a10, 0))
10959             return fold_build2 (TREE_CODE (arg0), type, a00,
10960                                 fold_build2 (code, type, a01, a11));
10961           else if (commutative && operand_equal_p (a00, a11, 0))
10962             return fold_build2 (TREE_CODE (arg0), type, a00,
10963                                 fold_build2 (code, type, a01, a10));
10964           else if (commutative && operand_equal_p (a01, a10, 0))
10965             return fold_build2 (TREE_CODE (arg0), type, a01,
10966                                 fold_build2 (code, type, a00, a11));
10967
10968           /* This case if tricky because we must either have commutative
10969              operators or else A10 must not have side-effects.  */
10970
10971           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
10972                    && operand_equal_p (a01, a11, 0))
10973             return fold_build2 (TREE_CODE (arg0), type,
10974                                 fold_build2 (code, type, a00, a10),
10975                                 a01);
10976         }
10977
10978       /* See if we can build a range comparison.  */
10979       if (0 != (tem = fold_range_test (code, type, op0, op1)))
10980         return tem;
10981
10982       /* Check for the possibility of merging component references.  If our
10983          lhs is another similar operation, try to merge its rhs with our
10984          rhs.  Then try to merge our lhs and rhs.  */
10985       if (TREE_CODE (arg0) == code
10986           && 0 != (tem = fold_truthop (code, type,
10987                                        TREE_OPERAND (arg0, 1), arg1)))
10988         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
10989
10990       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
10991         return tem;
10992
10993       return NULL_TREE;
10994
10995     case TRUTH_ORIF_EXPR:
10996       /* Note that the operands of this must be ints
10997          and their values must be 0 or true.
10998          ("true" is a fixed value perhaps depending on the language.)  */
10999       /* If first arg is constant true, return it.  */
11000       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11001         return fold_convert (type, arg0);
11002     case TRUTH_OR_EXPR:
11003       /* If either arg is constant zero, drop it.  */
11004       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11005         return non_lvalue (fold_convert (type, arg1));
11006       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11007           /* Preserve sequence points.  */
11008           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11009         return non_lvalue (fold_convert (type, arg0));
11010       /* If second arg is constant true, result is true, but we must
11011          evaluate first arg.  */
11012       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11013         return omit_one_operand (type, arg1, arg0);
11014       /* Likewise for first arg, but note this only occurs here for
11015          TRUTH_OR_EXPR.  */
11016       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11017         return omit_one_operand (type, arg0, arg1);
11018
11019       /* !X || X is always true.  */
11020       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11021           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11022         return omit_one_operand (type, integer_one_node, arg1);
11023       /* X || !X is always true.  */
11024       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11025           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11026         return omit_one_operand (type, integer_one_node, arg0);
11027
11028       goto truth_andor;
11029
11030     case TRUTH_XOR_EXPR:
11031       /* If the second arg is constant zero, drop it.  */
11032       if (integer_zerop (arg1))
11033         return non_lvalue (fold_convert (type, arg0));
11034       /* If the second arg is constant true, this is a logical inversion.  */
11035       if (integer_onep (arg1))
11036         {
11037           /* Only call invert_truthvalue if operand is a truth value.  */
11038           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11039             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11040           else
11041             tem = invert_truthvalue (arg0);
11042           return non_lvalue (fold_convert (type, tem));
11043         }
11044       /* Identical arguments cancel to zero.  */
11045       if (operand_equal_p (arg0, arg1, 0))
11046         return omit_one_operand (type, integer_zero_node, arg0);
11047
11048       /* !X ^ X is always true.  */
11049       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11050           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11051         return omit_one_operand (type, integer_one_node, arg1);
11052
11053       /* X ^ !X is always true.  */
11054       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11055           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11056         return omit_one_operand (type, integer_one_node, arg0);
11057
11058       return NULL_TREE;
11059
11060     case EQ_EXPR:
11061     case NE_EXPR:
11062       tem = fold_comparison (code, type, op0, op1);
11063       if (tem != NULL_TREE)
11064         return tem;
11065
11066       /* bool_var != 0 becomes bool_var. */
11067       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11068           && code == NE_EXPR)
11069         return non_lvalue (fold_convert (type, arg0));
11070
11071       /* bool_var == 1 becomes bool_var. */
11072       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11073           && code == EQ_EXPR)
11074         return non_lvalue (fold_convert (type, arg0));
11075
11076       /* bool_var != 1 becomes !bool_var. */
11077       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11078           && code == NE_EXPR)
11079         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11080
11081       /* bool_var == 0 becomes !bool_var. */
11082       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11083           && code == EQ_EXPR)
11084         return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
11085
11086       /* If this is an equality comparison of the address of two non-weak,
11087          unaliased symbols neither of which are extern (since we do not
11088          have access to attributes for externs), then we know the result.  */
11089       if (TREE_CODE (arg0) == ADDR_EXPR
11090           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11091           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11092           && ! lookup_attribute ("alias",
11093                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11094           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11095           && TREE_CODE (arg1) == ADDR_EXPR
11096           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11097           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11098           && ! lookup_attribute ("alias",
11099                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11100           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11101         {
11102           /* We know that we're looking at the address of two
11103              non-weak, unaliased, static _DECL nodes.
11104
11105              It is both wasteful and incorrect to call operand_equal_p
11106              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11107              all we need to do is test pointer equality for the arguments
11108              to the two ADDR_EXPR nodes.  It is incorrect to use
11109              operand_equal_p as that function is NOT equivalent to a
11110              C equality test.  It can in fact return false for two
11111              objects which would test as equal using the C equality
11112              operator.  */
11113           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11114           return constant_boolean_node (equal
11115                                         ? code == EQ_EXPR : code != EQ_EXPR,
11116                                         type);
11117         }
11118
11119       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11120          a MINUS_EXPR of a constant, we can convert it into a comparison with
11121          a revised constant as long as no overflow occurs.  */
11122       if (TREE_CODE (arg1) == INTEGER_CST
11123           && (TREE_CODE (arg0) == PLUS_EXPR
11124               || TREE_CODE (arg0) == MINUS_EXPR)
11125           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11126           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11127                                       ? MINUS_EXPR : PLUS_EXPR,
11128                                       fold_convert (TREE_TYPE (arg0), arg1),
11129                                       TREE_OPERAND (arg0, 1), 0))
11130           && !TREE_OVERFLOW (tem))
11131         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11132
11133       /* Similarly for a NEGATE_EXPR.  */
11134       if (TREE_CODE (arg0) == NEGATE_EXPR
11135           && TREE_CODE (arg1) == INTEGER_CST
11136           && 0 != (tem = negate_expr (arg1))
11137           && TREE_CODE (tem) == INTEGER_CST
11138           && !TREE_OVERFLOW (tem))
11139         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11140
11141       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11142       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11143           && TREE_CODE (arg1) == INTEGER_CST
11144           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11145         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11146                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11147                                          fold_convert (TREE_TYPE (arg0), arg1),
11148                                          TREE_OPERAND (arg0, 1)));
11149
11150       /* Transform comparisons of the form X +- C CMP X.  */
11151       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11152           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11153           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11154           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11155               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11156         {
11157           tree cst = TREE_OPERAND (arg0, 1);
11158
11159           if (code == EQ_EXPR
11160               && !integer_zerop (cst))
11161             return omit_two_operands (type, boolean_false_node,
11162                                       TREE_OPERAND (arg0, 0), arg1);
11163           else
11164             return omit_two_operands (type, boolean_true_node,
11165                                       TREE_OPERAND (arg0, 0), arg1);
11166         }
11167
11168       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11169          for !=.  Don't do this for ordered comparisons due to overflow.  */
11170       if (TREE_CODE (arg0) == MINUS_EXPR
11171           && integer_zerop (arg1))
11172         return fold_build2 (code, type,
11173                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11174
11175       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11176       if (TREE_CODE (arg0) == ABS_EXPR
11177           && (integer_zerop (arg1) || real_zerop (arg1)))
11178         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11179
11180       /* If this is an EQ or NE comparison with zero and ARG0 is
11181          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11182          two operations, but the latter can be done in one less insn
11183          on machines that have only two-operand insns or on which a
11184          constant cannot be the first operand.  */
11185       if (TREE_CODE (arg0) == BIT_AND_EXPR
11186           && integer_zerop (arg1))
11187         {
11188           tree arg00 = TREE_OPERAND (arg0, 0);
11189           tree arg01 = TREE_OPERAND (arg0, 1);
11190           if (TREE_CODE (arg00) == LSHIFT_EXPR
11191               && integer_onep (TREE_OPERAND (arg00, 0)))
11192             return
11193               fold_build2 (code, type,
11194                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11195                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11196                                            arg01, TREE_OPERAND (arg00, 1)),
11197                                    fold_convert (TREE_TYPE (arg0),
11198                                                  integer_one_node)),
11199                            arg1);
11200           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
11201                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
11202             return
11203               fold_build2 (code, type,
11204                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11205                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11206                                            arg00, TREE_OPERAND (arg01, 1)),
11207                                    fold_convert (TREE_TYPE (arg0),
11208                                                  integer_one_node)),
11209                            arg1);
11210         }
11211
11212       /* If this is an NE or EQ comparison of zero against the result of a
11213          signed MOD operation whose second operand is a power of 2, make
11214          the MOD operation unsigned since it is simpler and equivalent.  */
11215       if (integer_zerop (arg1)
11216           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11217           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11218               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11219               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11220               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11221           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11222         {
11223           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11224           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11225                                      fold_convert (newtype,
11226                                                    TREE_OPERAND (arg0, 0)),
11227                                      fold_convert (newtype,
11228                                                    TREE_OPERAND (arg0, 1)));
11229
11230           return fold_build2 (code, type, newmod,
11231                               fold_convert (newtype, arg1));
11232         }
11233
11234       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11235          C1 is a valid shift constant, and C2 is a power of two, i.e.
11236          a single bit.  */
11237       if (TREE_CODE (arg0) == BIT_AND_EXPR
11238           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11239           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11240              == INTEGER_CST
11241           && integer_pow2p (TREE_OPERAND (arg0, 1))
11242           && integer_zerop (arg1))
11243         {
11244           tree itype = TREE_TYPE (arg0);
11245           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11246           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11247
11248           /* Check for a valid shift count.  */
11249           if (TREE_INT_CST_HIGH (arg001) == 0
11250               && TREE_INT_CST_LOW (arg001) < prec)
11251             {
11252               tree arg01 = TREE_OPERAND (arg0, 1);
11253               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11254               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11255               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11256                  can be rewritten as (X & (C2 << C1)) != 0.  */
11257               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11258                 {
11259                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11260                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11261                   return fold_build2 (code, type, tem, arg1);
11262                 }
11263               /* Otherwise, for signed (arithmetic) shifts,
11264                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11265                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11266               else if (!TYPE_UNSIGNED (itype))
11267                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11268                                     arg000, build_int_cst (itype, 0));
11269               /* Otherwise, of unsigned (logical) shifts,
11270                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11271                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11272               else
11273                 return omit_one_operand (type,
11274                                          code == EQ_EXPR ? integer_one_node
11275                                                          : integer_zero_node,
11276                                          arg000);
11277             }
11278         }
11279
11280       /* If this is an NE comparison of zero with an AND of one, remove the
11281          comparison since the AND will give the correct value.  */
11282       if (code == NE_EXPR
11283           && integer_zerop (arg1)
11284           && TREE_CODE (arg0) == BIT_AND_EXPR
11285           && integer_onep (TREE_OPERAND (arg0, 1)))
11286         return fold_convert (type, arg0);
11287
11288       /* If we have (A & C) == C where C is a power of 2, convert this into
11289          (A & C) != 0.  Similarly for NE_EXPR.  */
11290       if (TREE_CODE (arg0) == BIT_AND_EXPR
11291           && integer_pow2p (TREE_OPERAND (arg0, 1))
11292           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11293         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11294                             arg0, fold_convert (TREE_TYPE (arg0),
11295                                                 integer_zero_node));
11296
11297       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11298          bit, then fold the expression into A < 0 or A >= 0.  */
11299       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11300       if (tem)
11301         return tem;
11302
11303       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11304          Similarly for NE_EXPR.  */
11305       if (TREE_CODE (arg0) == BIT_AND_EXPR
11306           && TREE_CODE (arg1) == INTEGER_CST
11307           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11308         {
11309           tree notc = fold_build1 (BIT_NOT_EXPR,
11310                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11311                                    TREE_OPERAND (arg0, 1));
11312           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11313                                        arg1, notc);
11314           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11315           if (integer_nonzerop (dandnotc))
11316             return omit_one_operand (type, rslt, arg0);
11317         }
11318
11319       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11320          Similarly for NE_EXPR.  */
11321       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11322           && TREE_CODE (arg1) == INTEGER_CST
11323           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11324         {
11325           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11326           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11327                                        TREE_OPERAND (arg0, 1), notd);
11328           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11329           if (integer_nonzerop (candnotd))
11330             return omit_one_operand (type, rslt, arg0);
11331         }
11332
11333       /* If this is a comparison of a field, we may be able to simplify it.  */
11334       if ((TREE_CODE (arg0) == COMPONENT_REF
11335            || TREE_CODE (arg0) == BIT_FIELD_REF)
11336           /* Handle the constant case even without -O
11337              to make sure the warnings are given.  */
11338           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
11339         {
11340           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
11341           if (t1)
11342             return t1;
11343         }
11344
11345       /* Optimize comparisons of strlen vs zero to a compare of the
11346          first character of the string vs zero.  To wit,
11347                 strlen(ptr) == 0   =>  *ptr == 0
11348                 strlen(ptr) != 0   =>  *ptr != 0
11349          Other cases should reduce to one of these two (or a constant)
11350          due to the return value of strlen being unsigned.  */
11351       if (TREE_CODE (arg0) == CALL_EXPR
11352           && integer_zerop (arg1))
11353         {
11354           tree fndecl = get_callee_fndecl (arg0);
11355
11356           if (fndecl
11357               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11358               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11359               && call_expr_nargs (arg0) == 1
11360               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11361             {
11362               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11363               return fold_build2 (code, type, iref,
11364                                   build_int_cst (TREE_TYPE (iref), 0));
11365             }
11366         }
11367
11368       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11369          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
11370       if (TREE_CODE (arg0) == RSHIFT_EXPR
11371           && integer_zerop (arg1)
11372           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11373         {
11374           tree arg00 = TREE_OPERAND (arg0, 0);
11375           tree arg01 = TREE_OPERAND (arg0, 1);
11376           tree itype = TREE_TYPE (arg00);
11377           if (TREE_INT_CST_HIGH (arg01) == 0
11378               && TREE_INT_CST_LOW (arg01)
11379                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11380             {
11381               if (TYPE_UNSIGNED (itype))
11382                 {
11383                   itype = lang_hooks.types.signed_type (itype);
11384                   arg00 = fold_convert (itype, arg00);
11385                 }
11386               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11387                                   type, arg00, build_int_cst (itype, 0));
11388             }
11389         }
11390
11391       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
11392       if (integer_zerop (arg1)
11393           && TREE_CODE (arg0) == BIT_XOR_EXPR)
11394         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11395                             TREE_OPERAND (arg0, 1));
11396
11397       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
11398       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11399           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11400         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11401                             build_int_cst (TREE_TYPE (arg1), 0));
11402       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
11403       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11404           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11405           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11406         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11407                             build_int_cst (TREE_TYPE (arg1), 0));
11408
11409       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
11410       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11411           && TREE_CODE (arg1) == INTEGER_CST
11412           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11413         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11414                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11415                                          TREE_OPERAND (arg0, 1), arg1));
11416
11417       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11418          (X & C) == 0 when C is a single bit.  */
11419       if (TREE_CODE (arg0) == BIT_AND_EXPR
11420           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11421           && integer_zerop (arg1)
11422           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11423         {
11424           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11425                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11426                              TREE_OPERAND (arg0, 1));
11427           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11428                               type, tem, arg1);
11429         }
11430
11431       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11432          constant C is a power of two, i.e. a single bit.  */
11433       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11434           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11435           && integer_zerop (arg1)
11436           && integer_pow2p (TREE_OPERAND (arg0, 1))
11437           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11438                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11439         {
11440           tree arg00 = TREE_OPERAND (arg0, 0);
11441           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11442                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
11443         }
11444
11445       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
11446          when is C is a power of two, i.e. a single bit.  */
11447       if (TREE_CODE (arg0) == BIT_AND_EXPR
11448           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
11449           && integer_zerop (arg1)
11450           && integer_pow2p (TREE_OPERAND (arg0, 1))
11451           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11452                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11453         {
11454           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11455           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
11456                              arg000, TREE_OPERAND (arg0, 1));
11457           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11458                               tem, build_int_cst (TREE_TYPE (tem), 0));
11459         }
11460
11461       if (integer_zerop (arg1)
11462           && tree_expr_nonzero_p (arg0))
11463         {
11464           tree res = constant_boolean_node (code==NE_EXPR, type);
11465           return omit_one_operand (type, res, arg0);
11466         }
11467
11468       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
11469       if (TREE_CODE (arg0) == NEGATE_EXPR
11470           && TREE_CODE (arg1) == NEGATE_EXPR)
11471         return fold_build2 (code, type,
11472                             TREE_OPERAND (arg0, 0),
11473                             TREE_OPERAND (arg1, 0));
11474
11475       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
11476       if (TREE_CODE (arg0) == BIT_AND_EXPR
11477           && TREE_CODE (arg1) == BIT_AND_EXPR)
11478         {
11479           tree arg00 = TREE_OPERAND (arg0, 0);
11480           tree arg01 = TREE_OPERAND (arg0, 1);
11481           tree arg10 = TREE_OPERAND (arg1, 0);
11482           tree arg11 = TREE_OPERAND (arg1, 1);
11483           tree itype = TREE_TYPE (arg0);
11484
11485           if (operand_equal_p (arg01, arg11, 0))
11486             return fold_build2 (code, type,
11487                                 fold_build2 (BIT_AND_EXPR, itype,
11488                                              fold_build2 (BIT_XOR_EXPR, itype,
11489                                                           arg00, arg10),
11490                                              arg01),
11491                                 build_int_cst (itype, 0));
11492
11493           if (operand_equal_p (arg01, arg10, 0))
11494             return fold_build2 (code, type,
11495                                 fold_build2 (BIT_AND_EXPR, itype,
11496                                              fold_build2 (BIT_XOR_EXPR, itype,
11497                                                           arg00, arg11),
11498                                              arg01),
11499                                 build_int_cst (itype, 0));
11500
11501           if (operand_equal_p (arg00, arg11, 0))
11502             return fold_build2 (code, type,
11503                                 fold_build2 (BIT_AND_EXPR, itype,
11504                                              fold_build2 (BIT_XOR_EXPR, itype,
11505                                                           arg01, arg10),
11506                                              arg00),
11507                                 build_int_cst (itype, 0));
11508
11509           if (operand_equal_p (arg00, arg10, 0))
11510             return fold_build2 (code, type,
11511                                 fold_build2 (BIT_AND_EXPR, itype,
11512                                              fold_build2 (BIT_XOR_EXPR, itype,
11513                                                           arg01, arg11),
11514                                              arg00),
11515                                 build_int_cst (itype, 0));
11516         }
11517
11518       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11519           && TREE_CODE (arg1) == BIT_XOR_EXPR)
11520         {
11521           tree arg00 = TREE_OPERAND (arg0, 0);
11522           tree arg01 = TREE_OPERAND (arg0, 1);
11523           tree arg10 = TREE_OPERAND (arg1, 0);
11524           tree arg11 = TREE_OPERAND (arg1, 1);
11525           tree itype = TREE_TYPE (arg0);
11526
11527           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
11528              operand_equal_p guarantees no side-effects so we don't need
11529              to use omit_one_operand on Z.  */
11530           if (operand_equal_p (arg01, arg11, 0))
11531             return fold_build2 (code, type, arg00, arg10);
11532           if (operand_equal_p (arg01, arg10, 0))
11533             return fold_build2 (code, type, arg00, arg11);
11534           if (operand_equal_p (arg00, arg11, 0))
11535             return fold_build2 (code, type, arg01, arg10);
11536           if (operand_equal_p (arg00, arg10, 0))
11537             return fold_build2 (code, type, arg01, arg11);
11538
11539           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
11540           if (TREE_CODE (arg01) == INTEGER_CST
11541               && TREE_CODE (arg11) == INTEGER_CST)
11542             return fold_build2 (code, type,
11543                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
11544                                              fold_build2 (BIT_XOR_EXPR, itype,
11545                                                           arg01, arg11)),
11546                                 arg10);
11547         }
11548
11549       /* Attempt to simplify equality/inequality comparisons of complex
11550          values.  Only lower the comparison if the result is known or
11551          can be simplified to a single scalar comparison.  */
11552       if ((TREE_CODE (arg0) == COMPLEX_EXPR
11553            || TREE_CODE (arg0) == COMPLEX_CST)
11554           && (TREE_CODE (arg1) == COMPLEX_EXPR
11555               || TREE_CODE (arg1) == COMPLEX_CST))
11556         {
11557           tree real0, imag0, real1, imag1;
11558           tree rcond, icond;
11559
11560           if (TREE_CODE (arg0) == COMPLEX_EXPR)
11561             {
11562               real0 = TREE_OPERAND (arg0, 0);
11563               imag0 = TREE_OPERAND (arg0, 1);
11564             }
11565           else
11566             {
11567               real0 = TREE_REALPART (arg0);
11568               imag0 = TREE_IMAGPART (arg0);
11569             }
11570
11571           if (TREE_CODE (arg1) == COMPLEX_EXPR)
11572             {
11573               real1 = TREE_OPERAND (arg1, 0);
11574               imag1 = TREE_OPERAND (arg1, 1);
11575             }
11576           else
11577             {
11578               real1 = TREE_REALPART (arg1);
11579               imag1 = TREE_IMAGPART (arg1);
11580             }
11581
11582           rcond = fold_binary (code, type, real0, real1);
11583           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
11584             {
11585               if (integer_zerop (rcond))
11586                 {
11587                   if (code == EQ_EXPR)
11588                     return omit_two_operands (type, boolean_false_node,
11589                                               imag0, imag1);
11590                   return fold_build2 (NE_EXPR, type, imag0, imag1);
11591                 }
11592               else
11593                 {
11594                   if (code == NE_EXPR)
11595                     return omit_two_operands (type, boolean_true_node,
11596                                               imag0, imag1);
11597                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
11598                 }
11599             }
11600
11601           icond = fold_binary (code, type, imag0, imag1);
11602           if (icond && TREE_CODE (icond) == INTEGER_CST)
11603             {
11604               if (integer_zerop (icond))
11605                 {
11606                   if (code == EQ_EXPR)
11607                     return omit_two_operands (type, boolean_false_node,
11608                                               real0, real1);
11609                   return fold_build2 (NE_EXPR, type, real0, real1);
11610                 }
11611               else
11612                 {
11613                   if (code == NE_EXPR)
11614                     return omit_two_operands (type, boolean_true_node,
11615                                               real0, real1);
11616                   return fold_build2 (EQ_EXPR, type, real0, real1);
11617                 }
11618             }
11619         }
11620
11621       return NULL_TREE;
11622
11623     case LT_EXPR:
11624     case GT_EXPR:
11625     case LE_EXPR:
11626     case GE_EXPR:
11627       tem = fold_comparison (code, type, op0, op1);
11628       if (tem != NULL_TREE)
11629         return tem;
11630
11631       /* Transform comparisons of the form X +- C CMP X.  */
11632       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11633           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11634           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
11635                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
11636               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11637                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
11638         {
11639           tree arg01 = TREE_OPERAND (arg0, 1);
11640           enum tree_code code0 = TREE_CODE (arg0);
11641           int is_positive;
11642
11643           if (TREE_CODE (arg01) == REAL_CST)
11644             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
11645           else
11646             is_positive = tree_int_cst_sgn (arg01);
11647
11648           /* (X - c) > X becomes false.  */
11649           if (code == GT_EXPR
11650               && ((code0 == MINUS_EXPR && is_positive >= 0)
11651                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11652             {
11653               if (TREE_CODE (arg01) == INTEGER_CST
11654                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11655                 fold_overflow_warning (("assuming signed overflow does not "
11656                                         "occur when assuming that (X - c) > X "
11657                                         "is always false"),
11658                                        WARN_STRICT_OVERFLOW_ALL);
11659               return constant_boolean_node (0, type);
11660             }
11661
11662           /* Likewise (X + c) < X becomes false.  */
11663           if (code == LT_EXPR
11664               && ((code0 == PLUS_EXPR && is_positive >= 0)
11665                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11666             {
11667               if (TREE_CODE (arg01) == INTEGER_CST
11668                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11669                 fold_overflow_warning (("assuming signed overflow does not "
11670                                         "occur when assuming that "
11671                                         "(X + c) < X is always false"),
11672                                        WARN_STRICT_OVERFLOW_ALL);
11673               return constant_boolean_node (0, type);
11674             }
11675
11676           /* Convert (X - c) <= X to true.  */
11677           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11678               && code == LE_EXPR
11679               && ((code0 == MINUS_EXPR && is_positive >= 0)
11680                   || (code0 == PLUS_EXPR && is_positive <= 0)))
11681             {
11682               if (TREE_CODE (arg01) == INTEGER_CST
11683                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11684                 fold_overflow_warning (("assuming signed overflow does not "
11685                                         "occur when assuming that "
11686                                         "(X - c) <= X is always true"),
11687                                        WARN_STRICT_OVERFLOW_ALL);
11688               return constant_boolean_node (1, type);
11689             }
11690
11691           /* Convert (X + c) >= X to true.  */
11692           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
11693               && code == GE_EXPR
11694               && ((code0 == PLUS_EXPR && is_positive >= 0)
11695                   || (code0 == MINUS_EXPR && is_positive <= 0)))
11696             {
11697               if (TREE_CODE (arg01) == INTEGER_CST
11698                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11699                 fold_overflow_warning (("assuming signed overflow does not "
11700                                         "occur when assuming that "
11701                                         "(X + c) >= X is always true"),
11702                                        WARN_STRICT_OVERFLOW_ALL);
11703               return constant_boolean_node (1, type);
11704             }
11705
11706           if (TREE_CODE (arg01) == INTEGER_CST)
11707             {
11708               /* Convert X + c > X and X - c < X to true for integers.  */
11709               if (code == GT_EXPR
11710                   && ((code0 == PLUS_EXPR && is_positive > 0)
11711                       || (code0 == MINUS_EXPR && is_positive < 0)))
11712                 {
11713                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11714                     fold_overflow_warning (("assuming signed overflow does "
11715                                             "not occur when assuming that "
11716                                             "(X + c) > X is always true"),
11717                                            WARN_STRICT_OVERFLOW_ALL);
11718                   return constant_boolean_node (1, type);
11719                 }
11720
11721               if (code == LT_EXPR
11722                   && ((code0 == MINUS_EXPR && is_positive > 0)
11723                       || (code0 == PLUS_EXPR && is_positive < 0)))
11724                 {
11725                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11726                     fold_overflow_warning (("assuming signed overflow does "
11727                                             "not occur when assuming that "
11728                                             "(X - c) < X is always true"),
11729                                            WARN_STRICT_OVERFLOW_ALL);
11730                   return constant_boolean_node (1, type);
11731                 }
11732
11733               /* Convert X + c <= X and X - c >= X to false for integers.  */
11734               if (code == LE_EXPR
11735                   && ((code0 == PLUS_EXPR && is_positive > 0)
11736                       || (code0 == MINUS_EXPR && is_positive < 0)))
11737                 {
11738                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11739                     fold_overflow_warning (("assuming signed overflow does "
11740                                             "not occur when assuming that "
11741                                             "(X + c) <= X is always false"),
11742                                            WARN_STRICT_OVERFLOW_ALL);
11743                   return constant_boolean_node (0, type);
11744                 }
11745
11746               if (code == GE_EXPR
11747                   && ((code0 == MINUS_EXPR && is_positive > 0)
11748                       || (code0 == PLUS_EXPR && is_positive < 0)))
11749                 {
11750                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11751                     fold_overflow_warning (("assuming signed overflow does "
11752                                             "not occur when assuming that "
11753                                             "(X - c) >= X is always false"),
11754                                            WARN_STRICT_OVERFLOW_ALL);
11755                   return constant_boolean_node (0, type);
11756                 }
11757             }
11758         }
11759
11760       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
11761          This transformation affects the cases which are handled in later
11762          optimizations involving comparisons with non-negative constants.  */
11763       if (TREE_CODE (arg1) == INTEGER_CST
11764           && TREE_CODE (arg0) != INTEGER_CST
11765           && tree_int_cst_sgn (arg1) > 0)
11766         {
11767           if (code == GE_EXPR)
11768             {
11769               arg1 = const_binop (MINUS_EXPR, arg1,
11770                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11771               return fold_build2 (GT_EXPR, type, arg0,
11772                                   fold_convert (TREE_TYPE (arg0), arg1));
11773             }
11774           if (code == LT_EXPR)
11775             {
11776               arg1 = const_binop (MINUS_EXPR, arg1,
11777                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
11778               return fold_build2 (LE_EXPR, type, arg0,
11779                                   fold_convert (TREE_TYPE (arg0), arg1));
11780             }
11781         }
11782
11783       /* Comparisons with the highest or lowest possible integer of
11784          the specified precision will have known values.  */
11785       {
11786         tree arg1_type = TREE_TYPE (arg1);
11787         unsigned int width = TYPE_PRECISION (arg1_type);
11788
11789         if (TREE_CODE (arg1) == INTEGER_CST
11790             && !TREE_OVERFLOW (arg1)
11791             && width <= 2 * HOST_BITS_PER_WIDE_INT
11792             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
11793           {
11794             HOST_WIDE_INT signed_max_hi;
11795             unsigned HOST_WIDE_INT signed_max_lo;
11796             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
11797
11798             if (width <= HOST_BITS_PER_WIDE_INT)
11799               {
11800                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11801                                 - 1;
11802                 signed_max_hi = 0;
11803                 max_hi = 0;
11804
11805                 if (TYPE_UNSIGNED (arg1_type))
11806                   {
11807                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11808                     min_lo = 0;
11809                     min_hi = 0;
11810                   }
11811                 else
11812                   {
11813                     max_lo = signed_max_lo;
11814                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11815                     min_hi = -1;
11816                   }
11817               }
11818             else
11819               {
11820                 width -= HOST_BITS_PER_WIDE_INT;
11821                 signed_max_lo = -1;
11822                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11823                                 - 1;
11824                 max_lo = -1;
11825                 min_lo = 0;
11826
11827                 if (TYPE_UNSIGNED (arg1_type))
11828                   {
11829                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11830                     min_hi = 0;
11831                   }
11832                 else
11833                   {
11834                     max_hi = signed_max_hi;
11835                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11836                   }
11837               }
11838
11839             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
11840                 && TREE_INT_CST_LOW (arg1) == max_lo)
11841               switch (code)
11842                 {
11843                 case GT_EXPR:
11844                   return omit_one_operand (type, integer_zero_node, arg0);
11845
11846                 case GE_EXPR:
11847                   return fold_build2 (EQ_EXPR, type, op0, op1);
11848
11849                 case LE_EXPR:
11850                   return omit_one_operand (type, integer_one_node, arg0);
11851
11852                 case LT_EXPR:
11853                   return fold_build2 (NE_EXPR, type, op0, op1);
11854
11855                 /* The GE_EXPR and LT_EXPR cases above are not normally
11856                    reached because of previous transformations.  */
11857
11858                 default:
11859                   break;
11860                 }
11861             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11862                      == max_hi
11863                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
11864               switch (code)
11865                 {
11866                 case GT_EXPR:
11867                   arg1 = const_binop (PLUS_EXPR, arg1,
11868                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11869                   return fold_build2 (EQ_EXPR, type,
11870                                       fold_convert (TREE_TYPE (arg1), arg0),
11871                                       arg1);
11872                 case LE_EXPR:
11873                   arg1 = const_binop (PLUS_EXPR, arg1,
11874                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
11875                   return fold_build2 (NE_EXPR, type,
11876                                       fold_convert (TREE_TYPE (arg1), arg0),
11877                                       arg1);
11878                 default:
11879                   break;
11880                 }
11881             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11882                      == min_hi
11883                      && TREE_INT_CST_LOW (arg1) == min_lo)
11884               switch (code)
11885                 {
11886                 case LT_EXPR:
11887                   return omit_one_operand (type, integer_zero_node, arg0);
11888
11889                 case LE_EXPR:
11890                   return fold_build2 (EQ_EXPR, type, op0, op1);
11891
11892                 case GE_EXPR:
11893                   return omit_one_operand (type, integer_one_node, arg0);
11894
11895                 case GT_EXPR:
11896                   return fold_build2 (NE_EXPR, type, op0, op1);
11897
11898                 default:
11899                   break;
11900                 }
11901             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11902                      == min_hi
11903                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
11904               switch (code)
11905                 {
11906                 case GE_EXPR:
11907                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11908                   return fold_build2 (NE_EXPR, type,
11909                                       fold_convert (TREE_TYPE (arg1), arg0),
11910                                       arg1);
11911                 case LT_EXPR:
11912                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11913                   return fold_build2 (EQ_EXPR, type,
11914                                       fold_convert (TREE_TYPE (arg1), arg0),
11915                                       arg1);
11916                 default:
11917                   break;
11918                 }
11919
11920             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
11921                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
11922                      && TYPE_UNSIGNED (arg1_type)
11923                      /* We will flip the signedness of the comparison operator
11924                         associated with the mode of arg1, so the sign bit is
11925                         specified by this mode.  Check that arg1 is the signed
11926                         max associated with this sign bit.  */
11927                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
11928                      /* signed_type does not work on pointer types.  */
11929                      && INTEGRAL_TYPE_P (arg1_type))
11930               {
11931                 /* The following case also applies to X < signed_max+1
11932                    and X >= signed_max+1 because previous transformations.  */
11933                 if (code == LE_EXPR || code == GT_EXPR)
11934                   {
11935                     tree st;
11936                     st = lang_hooks.types.signed_type (TREE_TYPE (arg1));
11937                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
11938                                         type, fold_convert (st, arg0),
11939                                         build_int_cst (st, 0));
11940                   }
11941               }
11942           }
11943       }
11944
11945       /* If we are comparing an ABS_EXPR with a constant, we can
11946          convert all the cases into explicit comparisons, but they may
11947          well not be faster than doing the ABS and one comparison.
11948          But ABS (X) <= C is a range comparison, which becomes a subtraction
11949          and a comparison, and is probably faster.  */
11950       if (code == LE_EXPR
11951           && TREE_CODE (arg1) == INTEGER_CST
11952           && TREE_CODE (arg0) == ABS_EXPR
11953           && ! TREE_SIDE_EFFECTS (arg0)
11954           && (0 != (tem = negate_expr (arg1)))
11955           && TREE_CODE (tem) == INTEGER_CST
11956           && !TREE_OVERFLOW (tem))
11957         return fold_build2 (TRUTH_ANDIF_EXPR, type,
11958                             build2 (GE_EXPR, type,
11959                                     TREE_OPERAND (arg0, 0), tem),
11960                             build2 (LE_EXPR, type,
11961                                     TREE_OPERAND (arg0, 0), arg1));
11962
11963       /* Convert ABS_EXPR<x> >= 0 to true.  */
11964       strict_overflow_p = false;
11965       if (code == GE_EXPR
11966           && (integer_zerop (arg1)
11967               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11968                   && real_zerop (arg1)))
11969           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
11970         {
11971           if (strict_overflow_p)
11972             fold_overflow_warning (("assuming signed overflow does not occur "
11973                                     "when simplifying comparison of "
11974                                     "absolute value and zero"),
11975                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
11976           return omit_one_operand (type, integer_one_node, arg0);
11977         }
11978
11979       /* Convert ABS_EXPR<x> < 0 to false.  */
11980       strict_overflow_p = false;
11981       if (code == LT_EXPR
11982           && (integer_zerop (arg1) || real_zerop (arg1))
11983           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
11984         {
11985           if (strict_overflow_p)
11986             fold_overflow_warning (("assuming signed overflow does not occur "
11987                                     "when simplifying comparison of "
11988                                     "absolute value and zero"),
11989                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
11990           return omit_one_operand (type, integer_zero_node, arg0);
11991         }
11992
11993       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
11994          and similarly for >= into !=.  */
11995       if ((code == LT_EXPR || code == GE_EXPR)
11996           && TYPE_UNSIGNED (TREE_TYPE (arg0))
11997           && TREE_CODE (arg1) == LSHIFT_EXPR
11998           && integer_onep (TREE_OPERAND (arg1, 0)))
11999         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12000                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12001                                TREE_OPERAND (arg1, 1)),
12002                        build_int_cst (TREE_TYPE (arg0), 0));
12003
12004       if ((code == LT_EXPR || code == GE_EXPR)
12005           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12006           && (TREE_CODE (arg1) == NOP_EXPR
12007               || TREE_CODE (arg1) == CONVERT_EXPR)
12008           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12009           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12010         return
12011           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12012                   fold_convert (TREE_TYPE (arg0),
12013                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12014                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12015                                                       1))),
12016                   build_int_cst (TREE_TYPE (arg0), 0));
12017
12018       return NULL_TREE;
12019
12020     case UNORDERED_EXPR:
12021     case ORDERED_EXPR:
12022     case UNLT_EXPR:
12023     case UNLE_EXPR:
12024     case UNGT_EXPR:
12025     case UNGE_EXPR:
12026     case UNEQ_EXPR:
12027     case LTGT_EXPR:
12028       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12029         {
12030           t1 = fold_relational_const (code, type, arg0, arg1);
12031           if (t1 != NULL_TREE)
12032             return t1;
12033         }
12034
12035       /* If the first operand is NaN, the result is constant.  */
12036       if (TREE_CODE (arg0) == REAL_CST
12037           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12038           && (code != LTGT_EXPR || ! flag_trapping_math))
12039         {
12040           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12041                ? integer_zero_node
12042                : integer_one_node;
12043           return omit_one_operand (type, t1, arg1);
12044         }
12045
12046       /* If the second operand is NaN, the result is constant.  */
12047       if (TREE_CODE (arg1) == REAL_CST
12048           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12049           && (code != LTGT_EXPR || ! flag_trapping_math))
12050         {
12051           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12052                ? integer_zero_node
12053                : integer_one_node;
12054           return omit_one_operand (type, t1, arg0);
12055         }
12056
12057       /* Simplify unordered comparison of something with itself.  */
12058       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12059           && operand_equal_p (arg0, arg1, 0))
12060         return constant_boolean_node (1, type);
12061
12062       if (code == LTGT_EXPR
12063           && !flag_trapping_math
12064           && operand_equal_p (arg0, arg1, 0))
12065         return constant_boolean_node (0, type);
12066
12067       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12068       {
12069         tree targ0 = strip_float_extensions (arg0);
12070         tree targ1 = strip_float_extensions (arg1);
12071         tree newtype = TREE_TYPE (targ0);
12072
12073         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12074           newtype = TREE_TYPE (targ1);
12075
12076         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12077           return fold_build2 (code, type, fold_convert (newtype, targ0),
12078                               fold_convert (newtype, targ1));
12079       }
12080
12081       return NULL_TREE;
12082
12083     case COMPOUND_EXPR:
12084       /* When pedantic, a compound expression can be neither an lvalue
12085          nor an integer constant expression.  */
12086       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12087         return NULL_TREE;
12088       /* Don't let (0, 0) be null pointer constant.  */
12089       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12090                                  : fold_convert (type, arg1);
12091       return pedantic_non_lvalue (tem);
12092
12093     case COMPLEX_EXPR:
12094       if ((TREE_CODE (arg0) == REAL_CST
12095            && TREE_CODE (arg1) == REAL_CST)
12096           || (TREE_CODE (arg0) == INTEGER_CST
12097               && TREE_CODE (arg1) == INTEGER_CST))
12098         return build_complex (type, arg0, arg1);
12099       return NULL_TREE;
12100
12101     case ASSERT_EXPR:
12102       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12103       gcc_unreachable ();
12104
12105     default:
12106       return NULL_TREE;
12107     } /* switch (code) */
12108 }
12109
12110 /* Callback for walk_tree, looking for LABEL_EXPR.
12111    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12112    Do not check the sub-tree of GOTO_EXPR.  */
12113
12114 static tree
12115 contains_label_1 (tree *tp,
12116                   int *walk_subtrees,
12117                   void *data ATTRIBUTE_UNUSED)
12118 {
12119   switch (TREE_CODE (*tp))
12120     {
12121     case LABEL_EXPR:
12122       return *tp;
12123     case GOTO_EXPR:
12124       *walk_subtrees = 0;
12125     /* no break */
12126     default:
12127       return NULL_TREE;
12128     }
12129 }
12130
12131 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12132    accessible from outside the sub-tree. Returns NULL_TREE if no
12133    addressable label is found.  */
12134
12135 static bool
12136 contains_label_p (tree st)
12137 {
12138   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12139 }
12140
12141 /* Fold a ternary expression of code CODE and type TYPE with operands
12142    OP0, OP1, and OP2.  Return the folded expression if folding is
12143    successful.  Otherwise, return NULL_TREE.  */
12144
12145 tree
12146 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12147 {
12148   tree tem;
12149   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12150   enum tree_code_class kind = TREE_CODE_CLASS (code);
12151
12152   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12153               && TREE_CODE_LENGTH (code) == 3);
12154
12155   /* Strip any conversions that don't change the mode.  This is safe
12156      for every expression, except for a comparison expression because
12157      its signedness is derived from its operands.  So, in the latter
12158      case, only strip conversions that don't change the signedness.
12159
12160      Note that this is done as an internal manipulation within the
12161      constant folder, in order to find the simplest representation of
12162      the arguments so that their form can be studied.  In any cases,
12163      the appropriate type conversions should be put back in the tree
12164      that will get out of the constant folder.  */
12165   if (op0)
12166     {
12167       arg0 = op0;
12168       STRIP_NOPS (arg0);
12169     }
12170
12171   if (op1)
12172     {
12173       arg1 = op1;
12174       STRIP_NOPS (arg1);
12175     }
12176
12177   switch (code)
12178     {
12179     case COMPONENT_REF:
12180       if (TREE_CODE (arg0) == CONSTRUCTOR
12181           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12182         {
12183           unsigned HOST_WIDE_INT idx;
12184           tree field, value;
12185           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12186             if (field == arg1)
12187               return value;
12188         }
12189       return NULL_TREE;
12190
12191     case COND_EXPR:
12192       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12193          so all simple results must be passed through pedantic_non_lvalue.  */
12194       if (TREE_CODE (arg0) == INTEGER_CST)
12195         {
12196           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12197           tem = integer_zerop (arg0) ? op2 : op1;
12198           /* Only optimize constant conditions when the selected branch
12199              has the same type as the COND_EXPR.  This avoids optimizing
12200              away "c ? x : throw", where the throw has a void type.
12201              Avoid throwing away that operand which contains label.  */
12202           if ((!TREE_SIDE_EFFECTS (unused_op)
12203                || !contains_label_p (unused_op))
12204               && (! VOID_TYPE_P (TREE_TYPE (tem))
12205                   || VOID_TYPE_P (type)))
12206             return pedantic_non_lvalue (tem);
12207           return NULL_TREE;
12208         }
12209       if (operand_equal_p (arg1, op2, 0))
12210         return pedantic_omit_one_operand (type, arg1, arg0);
12211
12212       /* If we have A op B ? A : C, we may be able to convert this to a
12213          simpler expression, depending on the operation and the values
12214          of B and C.  Signed zeros prevent all of these transformations,
12215          for reasons given above each one.
12216
12217          Also try swapping the arguments and inverting the conditional.  */
12218       if (COMPARISON_CLASS_P (arg0)
12219           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12220                                              arg1, TREE_OPERAND (arg0, 1))
12221           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12222         {
12223           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12224           if (tem)
12225             return tem;
12226         }
12227
12228       if (COMPARISON_CLASS_P (arg0)
12229           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12230                                              op2,
12231                                              TREE_OPERAND (arg0, 1))
12232           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12233         {
12234           tem = fold_truth_not_expr (arg0);
12235           if (tem && COMPARISON_CLASS_P (tem))
12236             {
12237               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12238               if (tem)
12239                 return tem;
12240             }
12241         }
12242
12243       /* If the second operand is simpler than the third, swap them
12244          since that produces better jump optimization results.  */
12245       if (truth_value_p (TREE_CODE (arg0))
12246           && tree_swap_operands_p (op1, op2, false))
12247         {
12248           /* See if this can be inverted.  If it can't, possibly because
12249              it was a floating-point inequality comparison, don't do
12250              anything.  */
12251           tem = fold_truth_not_expr (arg0);
12252           if (tem)
12253             return fold_build3 (code, type, tem, op2, op1);
12254         }
12255
12256       /* Convert A ? 1 : 0 to simply A.  */
12257       if (integer_onep (op1)
12258           && integer_zerop (op2)
12259           /* If we try to convert OP0 to our type, the
12260              call to fold will try to move the conversion inside
12261              a COND, which will recurse.  In that case, the COND_EXPR
12262              is probably the best choice, so leave it alone.  */
12263           && type == TREE_TYPE (arg0))
12264         return pedantic_non_lvalue (arg0);
12265
12266       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12267          over COND_EXPR in cases such as floating point comparisons.  */
12268       if (integer_zerop (op1)
12269           && integer_onep (op2)
12270           && truth_value_p (TREE_CODE (arg0)))
12271         return pedantic_non_lvalue (fold_convert (type,
12272                                                   invert_truthvalue (arg0)));
12273
12274       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12275       if (TREE_CODE (arg0) == LT_EXPR
12276           && integer_zerop (TREE_OPERAND (arg0, 1))
12277           && integer_zerop (op2)
12278           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12279         {
12280           /* sign_bit_p only checks ARG1 bits within A's precision.
12281              If <sign bit of A> has wider type than A, bits outside
12282              of A's precision in <sign bit of A> need to be checked.
12283              If they are all 0, this optimization needs to be done
12284              in unsigned A's type, if they are all 1 in signed A's type,
12285              otherwise this can't be done.  */
12286           if (TYPE_PRECISION (TREE_TYPE (tem))
12287               < TYPE_PRECISION (TREE_TYPE (arg1))
12288               && TYPE_PRECISION (TREE_TYPE (tem))
12289                  < TYPE_PRECISION (type))
12290             {
12291               unsigned HOST_WIDE_INT mask_lo;
12292               HOST_WIDE_INT mask_hi;
12293               int inner_width, outer_width;
12294               tree tem_type;
12295
12296               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12297               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12298               if (outer_width > TYPE_PRECISION (type))
12299                 outer_width = TYPE_PRECISION (type);
12300
12301               if (outer_width > HOST_BITS_PER_WIDE_INT)
12302                 {
12303                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12304                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12305                   mask_lo = -1;
12306                 }
12307               else
12308                 {
12309                   mask_hi = 0;
12310                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12311                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12312                 }
12313               if (inner_width > HOST_BITS_PER_WIDE_INT)
12314                 {
12315                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12316                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12317                   mask_lo = 0;
12318                 }
12319               else
12320                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12321                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12322
12323               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12324                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12325                 {
12326                   tem_type = lang_hooks.types.signed_type (TREE_TYPE (tem));
12327                   tem = fold_convert (tem_type, tem);
12328                 }
12329               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12330                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12331                 {
12332                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12333                   tem = fold_convert (tem_type, tem);
12334                 }
12335               else
12336                 tem = NULL;
12337             }
12338
12339           if (tem)
12340             return fold_convert (type,
12341                                  fold_build2 (BIT_AND_EXPR,
12342                                               TREE_TYPE (tem), tem,
12343                                               fold_convert (TREE_TYPE (tem),
12344                                                             arg1)));
12345         }
12346
12347       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12348          already handled above.  */
12349       if (TREE_CODE (arg0) == BIT_AND_EXPR
12350           && integer_onep (TREE_OPERAND (arg0, 1))
12351           && integer_zerop (op2)
12352           && integer_pow2p (arg1))
12353         {
12354           tree tem = TREE_OPERAND (arg0, 0);
12355           STRIP_NOPS (tem);
12356           if (TREE_CODE (tem) == RSHIFT_EXPR
12357               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12358               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12359                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12360             return fold_build2 (BIT_AND_EXPR, type,
12361                                 TREE_OPERAND (tem, 0), arg1);
12362         }
12363
12364       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
12365          is probably obsolete because the first operand should be a
12366          truth value (that's why we have the two cases above), but let's
12367          leave it in until we can confirm this for all front-ends.  */
12368       if (integer_zerop (op2)
12369           && TREE_CODE (arg0) == NE_EXPR
12370           && integer_zerop (TREE_OPERAND (arg0, 1))
12371           && integer_pow2p (arg1)
12372           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12373           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12374                               arg1, OEP_ONLY_CONST))
12375         return pedantic_non_lvalue (fold_convert (type,
12376                                                   TREE_OPERAND (arg0, 0)));
12377
12378       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
12379       if (integer_zerop (op2)
12380           && truth_value_p (TREE_CODE (arg0))
12381           && truth_value_p (TREE_CODE (arg1)))
12382         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12383                             fold_convert (type, arg0),
12384                             arg1);
12385
12386       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
12387       if (integer_onep (op2)
12388           && truth_value_p (TREE_CODE (arg0))
12389           && truth_value_p (TREE_CODE (arg1)))
12390         {
12391           /* Only perform transformation if ARG0 is easily inverted.  */
12392           tem = fold_truth_not_expr (arg0);
12393           if (tem)
12394             return fold_build2 (TRUTH_ORIF_EXPR, type,
12395                                 fold_convert (type, tem),
12396                                 arg1);
12397         }
12398
12399       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
12400       if (integer_zerop (arg1)
12401           && truth_value_p (TREE_CODE (arg0))
12402           && truth_value_p (TREE_CODE (op2)))
12403         {
12404           /* Only perform transformation if ARG0 is easily inverted.  */
12405           tem = fold_truth_not_expr (arg0);
12406           if (tem)
12407             return fold_build2 (TRUTH_ANDIF_EXPR, type,
12408                                 fold_convert (type, tem),
12409                                 op2);
12410         }
12411
12412       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
12413       if (integer_onep (arg1)
12414           && truth_value_p (TREE_CODE (arg0))
12415           && truth_value_p (TREE_CODE (op2)))
12416         return fold_build2 (TRUTH_ORIF_EXPR, type,
12417                             fold_convert (type, arg0),
12418                             op2);
12419
12420       return NULL_TREE;
12421
12422     case CALL_EXPR:
12423       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
12424          of fold_ternary on them.  */
12425       gcc_unreachable ();
12426
12427     case BIT_FIELD_REF:
12428       if ((TREE_CODE (arg0) == VECTOR_CST
12429            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12430           && type == TREE_TYPE (TREE_TYPE (arg0))
12431           && host_integerp (arg1, 1)
12432           && host_integerp (op2, 1))
12433         {
12434           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12435           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12436
12437           if (width != 0
12438               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12439               && (idx % width) == 0
12440               && (idx = idx / width)
12441                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12442             {
12443               tree elements = NULL_TREE;
12444
12445               if (TREE_CODE (arg0) == VECTOR_CST)
12446                 elements = TREE_VECTOR_CST_ELTS (arg0);
12447               else
12448                 {
12449                   unsigned HOST_WIDE_INT idx;
12450                   tree value;
12451
12452                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
12453                     elements = tree_cons (NULL_TREE, value, elements);
12454                 }
12455               while (idx-- > 0 && elements)
12456                 elements = TREE_CHAIN (elements);
12457               if (elements)
12458                 return TREE_VALUE (elements);
12459               else
12460                 return fold_convert (type, integer_zero_node);
12461             }
12462         }
12463       return NULL_TREE;
12464
12465     default:
12466       return NULL_TREE;
12467     } /* switch (code) */
12468 }
12469
12470 /* Perform constant folding and related simplification of EXPR.
12471    The related simplifications include x*1 => x, x*0 => 0, etc.,
12472    and application of the associative law.
12473    NOP_EXPR conversions may be removed freely (as long as we
12474    are careful not to change the type of the overall expression).
12475    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
12476    but we can constant-fold them if they have constant operands.  */
12477
12478 #ifdef ENABLE_FOLD_CHECKING
12479 # define fold(x) fold_1 (x)
12480 static tree fold_1 (tree);
12481 static
12482 #endif
12483 tree
12484 fold (tree expr)
12485 {
12486   const tree t = expr;
12487   enum tree_code code = TREE_CODE (t);
12488   enum tree_code_class kind = TREE_CODE_CLASS (code);
12489   tree tem;
12490
12491   /* Return right away if a constant.  */
12492   if (kind == tcc_constant)
12493     return t;
12494
12495   /* CALL_EXPR-like objects with variable numbers of operands are
12496      treated specially.  */
12497   if (kind == tcc_vl_exp)
12498     {
12499       if (code == CALL_EXPR)
12500         {
12501           tem = fold_call_expr (expr, false);
12502           return tem ? tem : expr;
12503         }
12504       return expr;
12505     }
12506
12507   if (IS_EXPR_CODE_CLASS (kind)
12508       || IS_GIMPLE_STMT_CODE_CLASS (kind))
12509     {
12510       tree type = TREE_TYPE (t);
12511       tree op0, op1, op2;
12512
12513       switch (TREE_CODE_LENGTH (code))
12514         {
12515         case 1:
12516           op0 = TREE_OPERAND (t, 0);
12517           tem = fold_unary (code, type, op0);
12518           return tem ? tem : expr;
12519         case 2:
12520           op0 = TREE_OPERAND (t, 0);
12521           op1 = TREE_OPERAND (t, 1);
12522           tem = fold_binary (code, type, op0, op1);
12523           return tem ? tem : expr;
12524         case 3:
12525           op0 = TREE_OPERAND (t, 0);
12526           op1 = TREE_OPERAND (t, 1);
12527           op2 = TREE_OPERAND (t, 2);
12528           tem = fold_ternary (code, type, op0, op1, op2);
12529           return tem ? tem : expr;
12530         default:
12531           break;
12532         }
12533     }
12534
12535   switch (code)
12536     {
12537     case CONST_DECL:
12538       return fold (DECL_INITIAL (t));
12539
12540     default:
12541       return t;
12542     } /* switch (code) */
12543 }
12544
12545 #ifdef ENABLE_FOLD_CHECKING
12546 #undef fold
12547
12548 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
12549 static void fold_check_failed (tree, tree);
12550 void print_fold_checksum (tree);
12551
12552 /* When --enable-checking=fold, compute a digest of expr before
12553    and after actual fold call to see if fold did not accidentally
12554    change original expr.  */
12555
12556 tree
12557 fold (tree expr)
12558 {
12559   tree ret;
12560   struct md5_ctx ctx;
12561   unsigned char checksum_before[16], checksum_after[16];
12562   htab_t ht;
12563
12564   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12565   md5_init_ctx (&ctx);
12566   fold_checksum_tree (expr, &ctx, ht);
12567   md5_finish_ctx (&ctx, checksum_before);
12568   htab_empty (ht);
12569
12570   ret = fold_1 (expr);
12571
12572   md5_init_ctx (&ctx);
12573   fold_checksum_tree (expr, &ctx, ht);
12574   md5_finish_ctx (&ctx, checksum_after);
12575   htab_delete (ht);
12576
12577   if (memcmp (checksum_before, checksum_after, 16))
12578     fold_check_failed (expr, ret);
12579
12580   return ret;
12581 }
12582
12583 void
12584 print_fold_checksum (tree expr)
12585 {
12586   struct md5_ctx ctx;
12587   unsigned char checksum[16], cnt;
12588   htab_t ht;
12589
12590   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12591   md5_init_ctx (&ctx);
12592   fold_checksum_tree (expr, &ctx, ht);
12593   md5_finish_ctx (&ctx, checksum);
12594   htab_delete (ht);
12595   for (cnt = 0; cnt < 16; ++cnt)
12596     fprintf (stderr, "%02x", checksum[cnt]);
12597   putc ('\n', stderr);
12598 }
12599
12600 static void
12601 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
12602 {
12603   internal_error ("fold check: original tree changed by fold");
12604 }
12605
12606 static void
12607 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
12608 {
12609   void **slot;
12610   enum tree_code code;
12611   struct tree_function_decl buf;
12612   int i, len;
12613   
12614 recursive_label:
12615
12616   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
12617                <= sizeof (struct tree_function_decl))
12618               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
12619   if (expr == NULL)
12620     return;
12621   slot = htab_find_slot (ht, expr, INSERT);
12622   if (*slot != NULL)
12623     return;
12624   *slot = expr;
12625   code = TREE_CODE (expr);
12626   if (TREE_CODE_CLASS (code) == tcc_declaration
12627       && DECL_ASSEMBLER_NAME_SET_P (expr))
12628     {
12629       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
12630       memcpy ((char *) &buf, expr, tree_size (expr));
12631       expr = (tree) &buf;
12632       SET_DECL_ASSEMBLER_NAME (expr, NULL);
12633     }
12634   else if (TREE_CODE_CLASS (code) == tcc_type
12635            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
12636                || TYPE_CACHED_VALUES_P (expr)
12637                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
12638     {
12639       /* Allow these fields to be modified.  */
12640       memcpy ((char *) &buf, expr, tree_size (expr));
12641       expr = (tree) &buf;
12642       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
12643       TYPE_POINTER_TO (expr) = NULL;
12644       TYPE_REFERENCE_TO (expr) = NULL;
12645       if (TYPE_CACHED_VALUES_P (expr))
12646         {
12647           TYPE_CACHED_VALUES_P (expr) = 0;
12648           TYPE_CACHED_VALUES (expr) = NULL;
12649         }
12650     }
12651   md5_process_bytes (expr, tree_size (expr), ctx);
12652   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
12653   if (TREE_CODE_CLASS (code) != tcc_type
12654       && TREE_CODE_CLASS (code) != tcc_declaration
12655       && code != TREE_LIST)
12656     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
12657   switch (TREE_CODE_CLASS (code))
12658     {
12659     case tcc_constant:
12660       switch (code)
12661         {
12662         case STRING_CST:
12663           md5_process_bytes (TREE_STRING_POINTER (expr),
12664                              TREE_STRING_LENGTH (expr), ctx);
12665           break;
12666         case COMPLEX_CST:
12667           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
12668           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
12669           break;
12670         case VECTOR_CST:
12671           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
12672           break;
12673         default:
12674           break;
12675         }
12676       break;
12677     case tcc_exceptional:
12678       switch (code)
12679         {
12680         case TREE_LIST:
12681           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
12682           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
12683           expr = TREE_CHAIN (expr);
12684           goto recursive_label;
12685           break;
12686         case TREE_VEC:
12687           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
12688             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
12689           break;
12690         default:
12691           break;
12692         }
12693       break;
12694     case tcc_expression:
12695     case tcc_reference:
12696     case tcc_comparison:
12697     case tcc_unary:
12698     case tcc_binary:
12699     case tcc_statement:
12700     case tcc_vl_exp:
12701       len = TREE_OPERAND_LENGTH (expr);
12702       for (i = 0; i < len; ++i)
12703         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
12704       break;
12705     case tcc_declaration:
12706       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
12707       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
12708       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
12709         {
12710           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
12711           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
12712           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
12713           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
12714           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
12715         }
12716       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
12717         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
12718           
12719       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
12720         {
12721           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
12722           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
12723           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
12724         }
12725       break;
12726     case tcc_type:
12727       if (TREE_CODE (expr) == ENUMERAL_TYPE)
12728         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
12729       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
12730       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
12731       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
12732       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
12733       if (INTEGRAL_TYPE_P (expr)
12734           || SCALAR_FLOAT_TYPE_P (expr))
12735         {
12736           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
12737           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
12738         }
12739       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
12740       if (TREE_CODE (expr) == RECORD_TYPE
12741           || TREE_CODE (expr) == UNION_TYPE
12742           || TREE_CODE (expr) == QUAL_UNION_TYPE)
12743         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
12744       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
12745       break;
12746     default:
12747       break;
12748     }
12749 }
12750
12751 #endif
12752
12753 /* Fold a unary tree expression with code CODE of type TYPE with an
12754    operand OP0.  Return a folded expression if successful.  Otherwise,
12755    return a tree expression with code CODE of type TYPE with an
12756    operand OP0.  */
12757
12758 tree
12759 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
12760 {
12761   tree tem;
12762 #ifdef ENABLE_FOLD_CHECKING
12763   unsigned char checksum_before[16], checksum_after[16];
12764   struct md5_ctx ctx;
12765   htab_t ht;
12766
12767   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12768   md5_init_ctx (&ctx);
12769   fold_checksum_tree (op0, &ctx, ht);
12770   md5_finish_ctx (&ctx, checksum_before);
12771   htab_empty (ht);
12772 #endif
12773   
12774   tem = fold_unary (code, type, op0);
12775   if (!tem)
12776     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
12777   
12778 #ifdef ENABLE_FOLD_CHECKING
12779   md5_init_ctx (&ctx);
12780   fold_checksum_tree (op0, &ctx, ht);
12781   md5_finish_ctx (&ctx, checksum_after);
12782   htab_delete (ht);
12783
12784   if (memcmp (checksum_before, checksum_after, 16))
12785     fold_check_failed (op0, tem);
12786 #endif
12787   return tem;
12788 }
12789
12790 /* Fold a binary tree expression with code CODE of type TYPE with
12791    operands OP0 and OP1.  Return a folded expression if successful.
12792    Otherwise, return a tree expression with code CODE of type TYPE
12793    with operands OP0 and OP1.  */
12794
12795 tree
12796 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
12797                   MEM_STAT_DECL)
12798 {
12799   tree tem;
12800 #ifdef ENABLE_FOLD_CHECKING
12801   unsigned char checksum_before_op0[16],
12802                 checksum_before_op1[16],
12803                 checksum_after_op0[16],
12804                 checksum_after_op1[16];
12805   struct md5_ctx ctx;
12806   htab_t ht;
12807
12808   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12809   md5_init_ctx (&ctx);
12810   fold_checksum_tree (op0, &ctx, ht);
12811   md5_finish_ctx (&ctx, checksum_before_op0);
12812   htab_empty (ht);
12813
12814   md5_init_ctx (&ctx);
12815   fold_checksum_tree (op1, &ctx, ht);
12816   md5_finish_ctx (&ctx, checksum_before_op1);
12817   htab_empty (ht);
12818 #endif
12819
12820   tem = fold_binary (code, type, op0, op1);
12821   if (!tem)
12822     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
12823   
12824 #ifdef ENABLE_FOLD_CHECKING
12825   md5_init_ctx (&ctx);
12826   fold_checksum_tree (op0, &ctx, ht);
12827   md5_finish_ctx (&ctx, checksum_after_op0);
12828   htab_empty (ht);
12829
12830   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12831     fold_check_failed (op0, tem);
12832   
12833   md5_init_ctx (&ctx);
12834   fold_checksum_tree (op1, &ctx, ht);
12835   md5_finish_ctx (&ctx, checksum_after_op1);
12836   htab_delete (ht);
12837
12838   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12839     fold_check_failed (op1, tem);
12840 #endif
12841   return tem;
12842 }
12843
12844 /* Fold a ternary tree expression with code CODE of type TYPE with
12845    operands OP0, OP1, and OP2.  Return a folded expression if
12846    successful.  Otherwise, return a tree expression with code CODE of
12847    type TYPE with operands OP0, OP1, and OP2.  */
12848
12849 tree
12850 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
12851              MEM_STAT_DECL)
12852 {
12853   tree tem;
12854 #ifdef ENABLE_FOLD_CHECKING
12855   unsigned char checksum_before_op0[16],
12856                 checksum_before_op1[16],
12857                 checksum_before_op2[16],
12858                 checksum_after_op0[16],
12859                 checksum_after_op1[16],
12860                 checksum_after_op2[16];
12861   struct md5_ctx ctx;
12862   htab_t ht;
12863
12864   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12865   md5_init_ctx (&ctx);
12866   fold_checksum_tree (op0, &ctx, ht);
12867   md5_finish_ctx (&ctx, checksum_before_op0);
12868   htab_empty (ht);
12869
12870   md5_init_ctx (&ctx);
12871   fold_checksum_tree (op1, &ctx, ht);
12872   md5_finish_ctx (&ctx, checksum_before_op1);
12873   htab_empty (ht);
12874
12875   md5_init_ctx (&ctx);
12876   fold_checksum_tree (op2, &ctx, ht);
12877   md5_finish_ctx (&ctx, checksum_before_op2);
12878   htab_empty (ht);
12879 #endif
12880
12881   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
12882   tem = fold_ternary (code, type, op0, op1, op2);
12883   if (!tem)
12884     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
12885       
12886 #ifdef ENABLE_FOLD_CHECKING
12887   md5_init_ctx (&ctx);
12888   fold_checksum_tree (op0, &ctx, ht);
12889   md5_finish_ctx (&ctx, checksum_after_op0);
12890   htab_empty (ht);
12891
12892   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12893     fold_check_failed (op0, tem);
12894   
12895   md5_init_ctx (&ctx);
12896   fold_checksum_tree (op1, &ctx, ht);
12897   md5_finish_ctx (&ctx, checksum_after_op1);
12898   htab_empty (ht);
12899
12900   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12901     fold_check_failed (op1, tem);
12902   
12903   md5_init_ctx (&ctx);
12904   fold_checksum_tree (op2, &ctx, ht);
12905   md5_finish_ctx (&ctx, checksum_after_op2);
12906   htab_delete (ht);
12907
12908   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
12909     fold_check_failed (op2, tem);
12910 #endif
12911   return tem;
12912 }
12913
12914 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
12915    arguments in ARGARRAY, and a null static chain.
12916    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
12917    of type TYPE from the given operands as constructed by build_call_array.  */
12918
12919 tree
12920 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
12921 {
12922   tree tem;
12923 #ifdef ENABLE_FOLD_CHECKING
12924   unsigned char checksum_before_fn[16],
12925                 checksum_before_arglist[16],
12926                 checksum_after_fn[16],
12927                 checksum_after_arglist[16];
12928   struct md5_ctx ctx;
12929   htab_t ht;
12930   int i;
12931
12932   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12933   md5_init_ctx (&ctx);
12934   fold_checksum_tree (fn, &ctx, ht);
12935   md5_finish_ctx (&ctx, checksum_before_fn);
12936   htab_empty (ht);
12937
12938   md5_init_ctx (&ctx);
12939   for (i = 0; i < nargs; i++)
12940     fold_checksum_tree (argarray[i], &ctx, ht);
12941   md5_finish_ctx (&ctx, checksum_before_arglist);
12942   htab_empty (ht);
12943 #endif
12944
12945   tem = fold_builtin_call_array (type, fn, nargs, argarray);
12946       
12947 #ifdef ENABLE_FOLD_CHECKING
12948   md5_init_ctx (&ctx);
12949   fold_checksum_tree (fn, &ctx, ht);
12950   md5_finish_ctx (&ctx, checksum_after_fn);
12951   htab_empty (ht);
12952
12953   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
12954     fold_check_failed (fn, tem);
12955   
12956   md5_init_ctx (&ctx);
12957   for (i = 0; i < nargs; i++)
12958     fold_checksum_tree (argarray[i], &ctx, ht);
12959   md5_finish_ctx (&ctx, checksum_after_arglist);
12960   htab_delete (ht);
12961
12962   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
12963     fold_check_failed (NULL_TREE, tem);
12964 #endif
12965   return tem;
12966 }
12967
12968 /* Perform constant folding and related simplification of initializer
12969    expression EXPR.  These behave identically to "fold_buildN" but ignore
12970    potential run-time traps and exceptions that fold must preserve.  */
12971
12972 #define START_FOLD_INIT \
12973   int saved_signaling_nans = flag_signaling_nans;\
12974   int saved_trapping_math = flag_trapping_math;\
12975   int saved_rounding_math = flag_rounding_math;\
12976   int saved_trapv = flag_trapv;\
12977   int saved_folding_initializer = folding_initializer;\
12978   flag_signaling_nans = 0;\
12979   flag_trapping_math = 0;\
12980   flag_rounding_math = 0;\
12981   flag_trapv = 0;\
12982   folding_initializer = 1;
12983
12984 #define END_FOLD_INIT \
12985   flag_signaling_nans = saved_signaling_nans;\
12986   flag_trapping_math = saved_trapping_math;\
12987   flag_rounding_math = saved_rounding_math;\
12988   flag_trapv = saved_trapv;\
12989   folding_initializer = saved_folding_initializer;
12990
12991 tree
12992 fold_build1_initializer (enum tree_code code, tree type, tree op)
12993 {
12994   tree result;
12995   START_FOLD_INIT;
12996
12997   result = fold_build1 (code, type, op);
12998
12999   END_FOLD_INIT;
13000   return result;
13001 }
13002
13003 tree
13004 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13005 {
13006   tree result;
13007   START_FOLD_INIT;
13008
13009   result = fold_build2 (code, type, op0, op1);
13010
13011   END_FOLD_INIT;
13012   return result;
13013 }
13014
13015 tree
13016 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13017                          tree op2)
13018 {
13019   tree result;
13020   START_FOLD_INIT;
13021
13022   result = fold_build3 (code, type, op0, op1, op2);
13023
13024   END_FOLD_INIT;
13025   return result;
13026 }
13027
13028 tree
13029 fold_build_call_array_initializer (tree type, tree fn,
13030                                    int nargs, tree *argarray)
13031 {
13032   tree result;
13033   START_FOLD_INIT;
13034
13035   result = fold_build_call_array (type, fn, nargs, argarray);
13036
13037   END_FOLD_INIT;
13038   return result;
13039 }
13040
13041 #undef START_FOLD_INIT
13042 #undef END_FOLD_INIT
13043
13044 /* Determine if first argument is a multiple of second argument.  Return 0 if
13045    it is not, or we cannot easily determined it to be.
13046
13047    An example of the sort of thing we care about (at this point; this routine
13048    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13049    fold cases do now) is discovering that
13050
13051      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13052
13053    is a multiple of
13054
13055      SAVE_EXPR (J * 8)
13056
13057    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13058
13059    This code also handles discovering that
13060
13061      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13062
13063    is a multiple of 8 so we don't have to worry about dealing with a
13064    possible remainder.
13065
13066    Note that we *look* inside a SAVE_EXPR only to determine how it was
13067    calculated; it is not safe for fold to do much of anything else with the
13068    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13069    at run time.  For example, the latter example above *cannot* be implemented
13070    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13071    evaluation time of the original SAVE_EXPR is not necessarily the same at
13072    the time the new expression is evaluated.  The only optimization of this
13073    sort that would be valid is changing
13074
13075      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13076
13077    divided by 8 to
13078
13079      SAVE_EXPR (I) * SAVE_EXPR (J)
13080
13081    (where the same SAVE_EXPR (J) is used in the original and the
13082    transformed version).  */
13083
13084 int
13085 multiple_of_p (tree type, tree top, tree bottom)
13086 {
13087   if (operand_equal_p (top, bottom, 0))
13088     return 1;
13089
13090   if (TREE_CODE (type) != INTEGER_TYPE)
13091     return 0;
13092
13093   switch (TREE_CODE (top))
13094     {
13095     case BIT_AND_EXPR:
13096       /* Bitwise and provides a power of two multiple.  If the mask is
13097          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13098       if (!integer_pow2p (bottom))
13099         return 0;
13100       /* FALLTHRU */
13101
13102     case MULT_EXPR:
13103       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13104               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13105
13106     case PLUS_EXPR:
13107     case MINUS_EXPR:
13108       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13109               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13110
13111     case LSHIFT_EXPR:
13112       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13113         {
13114           tree op1, t1;
13115
13116           op1 = TREE_OPERAND (top, 1);
13117           /* const_binop may not detect overflow correctly,
13118              so check for it explicitly here.  */
13119           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13120               > TREE_INT_CST_LOW (op1)
13121               && TREE_INT_CST_HIGH (op1) == 0
13122               && 0 != (t1 = fold_convert (type,
13123                                           const_binop (LSHIFT_EXPR,
13124                                                        size_one_node,
13125                                                        op1, 0)))
13126               && !TREE_OVERFLOW (t1))
13127             return multiple_of_p (type, t1, bottom);
13128         }
13129       return 0;
13130
13131     case NOP_EXPR:
13132       /* Can't handle conversions from non-integral or wider integral type.  */
13133       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13134           || (TYPE_PRECISION (type)
13135               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13136         return 0;
13137
13138       /* .. fall through ...  */
13139
13140     case SAVE_EXPR:
13141       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13142
13143     case INTEGER_CST:
13144       if (TREE_CODE (bottom) != INTEGER_CST
13145           || integer_zerop (bottom)
13146           || (TYPE_UNSIGNED (type)
13147               && (tree_int_cst_sgn (top) < 0
13148                   || tree_int_cst_sgn (bottom) < 0)))
13149         return 0;
13150       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13151                                              top, bottom, 0));
13152
13153     default:
13154       return 0;
13155     }
13156 }
13157
13158 /* Return true if `t' is known to be non-negative.  If the return
13159    value is based on the assumption that signed overflow is undefined,
13160    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13161    *STRICT_OVERFLOW_P.  */
13162
13163 bool
13164 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13165 {
13166   if (t == error_mark_node)
13167     return false;
13168
13169   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13170     return true;
13171
13172   switch (TREE_CODE (t))
13173     {
13174     case SSA_NAME:
13175       /* Query VRP to see if it has recorded any information about
13176          the range of this object.  */
13177       return ssa_name_nonnegative_p (t);
13178
13179     case ABS_EXPR:
13180       /* We can't return 1 if flag_wrapv is set because
13181          ABS_EXPR<INT_MIN> = INT_MIN.  */
13182       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
13183         return true;
13184       if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
13185         {
13186           *strict_overflow_p = true;
13187           return true;
13188         }
13189       break;
13190
13191     case INTEGER_CST:
13192       return tree_int_cst_sgn (t) >= 0;
13193
13194     case REAL_CST:
13195       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13196
13197     case PLUS_EXPR:
13198       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13199         return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13200                                                strict_overflow_p)
13201                 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13202                                                   strict_overflow_p));
13203
13204       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13205          both unsigned and at least 2 bits shorter than the result.  */
13206       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13207           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13208           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13209         {
13210           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13211           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13212           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13213               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13214             {
13215               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13216                                        TYPE_PRECISION (inner2)) + 1;
13217               return prec < TYPE_PRECISION (TREE_TYPE (t));
13218             }
13219         }
13220       break;
13221
13222     case MULT_EXPR:
13223       if (FLOAT_TYPE_P (TREE_TYPE (t)))
13224         {
13225           /* x * x for floating point x is always non-negative.  */
13226           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
13227             return true;
13228           return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13229                                                  strict_overflow_p)
13230                   && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13231                                                     strict_overflow_p));
13232         }
13233
13234       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13235          both unsigned and their total bits is shorter than the result.  */
13236       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
13237           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
13238           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
13239         {
13240           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
13241           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
13242           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13243               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13244             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13245                    < TYPE_PRECISION (TREE_TYPE (t));
13246         }
13247       return false;
13248
13249     case BIT_AND_EXPR:
13250     case MAX_EXPR:
13251       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13252                                              strict_overflow_p)
13253               || tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13254                                                 strict_overflow_p));
13255
13256     case BIT_IOR_EXPR:
13257     case BIT_XOR_EXPR:
13258     case MIN_EXPR:
13259     case RDIV_EXPR:
13260     case TRUNC_DIV_EXPR:
13261     case CEIL_DIV_EXPR:
13262     case FLOOR_DIV_EXPR:
13263     case ROUND_DIV_EXPR:
13264       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13265                                              strict_overflow_p)
13266               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13267                                                 strict_overflow_p));
13268
13269     case TRUNC_MOD_EXPR:
13270     case CEIL_MOD_EXPR:
13271     case FLOOR_MOD_EXPR:
13272     case ROUND_MOD_EXPR:
13273     case SAVE_EXPR:
13274     case NON_LVALUE_EXPR:
13275     case FLOAT_EXPR:
13276     case FIX_TRUNC_EXPR:
13277       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13278                                             strict_overflow_p);
13279
13280     case COMPOUND_EXPR:
13281     case MODIFY_EXPR:
13282     case GIMPLE_MODIFY_STMT:
13283       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13284                                             strict_overflow_p);
13285
13286     case BIND_EXPR:
13287       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
13288                                             strict_overflow_p);
13289
13290     case COND_EXPR:
13291       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13292                                              strict_overflow_p)
13293               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13294                                                 strict_overflow_p));
13295
13296     case NOP_EXPR:
13297       {
13298         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13299         tree outer_type = TREE_TYPE (t);
13300
13301         if (TREE_CODE (outer_type) == REAL_TYPE)
13302           {
13303             if (TREE_CODE (inner_type) == REAL_TYPE)
13304               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13305                                                     strict_overflow_p);
13306             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13307               {
13308                 if (TYPE_UNSIGNED (inner_type))
13309                   return true;
13310                 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13311                                                       strict_overflow_p);
13312               }
13313           }
13314         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13315           {
13316             if (TREE_CODE (inner_type) == REAL_TYPE)
13317               return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t,0),
13318                                                     strict_overflow_p);
13319             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13320               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13321                       && TYPE_UNSIGNED (inner_type);
13322           }
13323       }
13324       break;
13325
13326     case TARGET_EXPR:
13327       {
13328         tree temp = TARGET_EXPR_SLOT (t);
13329         t = TARGET_EXPR_INITIAL (t);
13330
13331         /* If the initializer is non-void, then it's a normal expression
13332            that will be assigned to the slot.  */
13333         if (!VOID_TYPE_P (t))
13334           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
13335
13336         /* Otherwise, the initializer sets the slot in some way.  One common
13337            way is an assignment statement at the end of the initializer.  */
13338         while (1)
13339           {
13340             if (TREE_CODE (t) == BIND_EXPR)
13341               t = expr_last (BIND_EXPR_BODY (t));
13342             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
13343                      || TREE_CODE (t) == TRY_CATCH_EXPR)
13344               t = expr_last (TREE_OPERAND (t, 0));
13345             else if (TREE_CODE (t) == STATEMENT_LIST)
13346               t = expr_last (t);
13347             else
13348               break;
13349           }
13350         if ((TREE_CODE (t) == MODIFY_EXPR
13351              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
13352             && GENERIC_TREE_OPERAND (t, 0) == temp)
13353           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13354                                                 strict_overflow_p);
13355
13356         return false;
13357       }
13358
13359     case CALL_EXPR:
13360       {
13361         tree fndecl = get_callee_fndecl (t);
13362         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
13363           switch (DECL_FUNCTION_CODE (fndecl))
13364             {
13365             CASE_FLT_FN (BUILT_IN_ACOS):
13366             CASE_FLT_FN (BUILT_IN_ACOSH):
13367             CASE_FLT_FN (BUILT_IN_CABS):
13368             CASE_FLT_FN (BUILT_IN_COSH):
13369             CASE_FLT_FN (BUILT_IN_ERFC):
13370             CASE_FLT_FN (BUILT_IN_EXP):
13371             CASE_FLT_FN (BUILT_IN_EXP10):
13372             CASE_FLT_FN (BUILT_IN_EXP2):
13373             CASE_FLT_FN (BUILT_IN_FABS):
13374             CASE_FLT_FN (BUILT_IN_FDIM):
13375             CASE_FLT_FN (BUILT_IN_HYPOT):
13376             CASE_FLT_FN (BUILT_IN_POW10):
13377             CASE_INT_FN (BUILT_IN_FFS):
13378             CASE_INT_FN (BUILT_IN_PARITY):
13379             CASE_INT_FN (BUILT_IN_POPCOUNT):
13380             case BUILT_IN_BSWAP32:
13381             case BUILT_IN_BSWAP64:
13382               /* Always true.  */
13383               return true;
13384
13385             CASE_FLT_FN (BUILT_IN_SQRT):
13386               /* sqrt(-0.0) is -0.0.  */
13387               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
13388                 return true;
13389               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13390                                                     strict_overflow_p);
13391
13392             CASE_FLT_FN (BUILT_IN_ASINH):
13393             CASE_FLT_FN (BUILT_IN_ATAN):
13394             CASE_FLT_FN (BUILT_IN_ATANH):
13395             CASE_FLT_FN (BUILT_IN_CBRT):
13396             CASE_FLT_FN (BUILT_IN_CEIL):
13397             CASE_FLT_FN (BUILT_IN_ERF):
13398             CASE_FLT_FN (BUILT_IN_EXPM1):
13399             CASE_FLT_FN (BUILT_IN_FLOOR):
13400             CASE_FLT_FN (BUILT_IN_FMOD):
13401             CASE_FLT_FN (BUILT_IN_FREXP):
13402             CASE_FLT_FN (BUILT_IN_LCEIL):
13403             CASE_FLT_FN (BUILT_IN_LDEXP):
13404             CASE_FLT_FN (BUILT_IN_LFLOOR):
13405             CASE_FLT_FN (BUILT_IN_LLCEIL):
13406             CASE_FLT_FN (BUILT_IN_LLFLOOR):
13407             CASE_FLT_FN (BUILT_IN_LLRINT):
13408             CASE_FLT_FN (BUILT_IN_LLROUND):
13409             CASE_FLT_FN (BUILT_IN_LRINT):
13410             CASE_FLT_FN (BUILT_IN_LROUND):
13411             CASE_FLT_FN (BUILT_IN_MODF):
13412             CASE_FLT_FN (BUILT_IN_NEARBYINT):
13413             CASE_FLT_FN (BUILT_IN_RINT):
13414             CASE_FLT_FN (BUILT_IN_ROUND):
13415             CASE_FLT_FN (BUILT_IN_SCALB):
13416             CASE_FLT_FN (BUILT_IN_SCALBLN):
13417             CASE_FLT_FN (BUILT_IN_SCALBN):
13418             CASE_FLT_FN (BUILT_IN_SIGNBIT):
13419             CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
13420             CASE_FLT_FN (BUILT_IN_SINH):
13421             CASE_FLT_FN (BUILT_IN_TANH):
13422             CASE_FLT_FN (BUILT_IN_TRUNC):
13423               /* True if the 1st argument is nonnegative.  */
13424               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13425                                                     strict_overflow_p);
13426
13427             CASE_FLT_FN (BUILT_IN_FMAX):
13428               /* True if the 1st OR 2nd arguments are nonnegative.  */
13429               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13430                                                      strict_overflow_p)
13431                       || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13432                                                          strict_overflow_p)));
13433
13434             CASE_FLT_FN (BUILT_IN_FMIN):
13435               /* True if the 1st AND 2nd arguments are nonnegative.  */
13436               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13437                                                      strict_overflow_p)
13438                       && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13439                                                          strict_overflow_p)));
13440
13441             CASE_FLT_FN (BUILT_IN_COPYSIGN):
13442               /* True if the 2nd argument is nonnegative.  */
13443               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
13444                                                     strict_overflow_p);
13445
13446             CASE_FLT_FN (BUILT_IN_POWI):
13447               /* True if the 1st argument is nonnegative or the second
13448                  argument is an even integer.  */
13449               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
13450                 {
13451                   tree arg1 = CALL_EXPR_ARG (t, 1);
13452                   if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
13453                     return true;
13454                 }
13455               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13456                                                     strict_overflow_p);
13457
13458             CASE_FLT_FN (BUILT_IN_POW):
13459               /* True if the 1st argument is nonnegative or the second
13460                  argument is an even integer valued real.  */
13461               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
13462                 {
13463                   REAL_VALUE_TYPE c;
13464                   HOST_WIDE_INT n;
13465
13466                   c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
13467                   n = real_to_integer (&c);
13468                   if ((n & 1) == 0)
13469                     {
13470                       REAL_VALUE_TYPE cint;
13471                       real_from_integer (&cint, VOIDmode, n,
13472                                          n < 0 ? -1 : 0, 0);
13473                       if (real_identical (&c, &cint))
13474                         return true;
13475                     }
13476                 }
13477               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13478                                                     strict_overflow_p);
13479
13480             default:
13481               break;
13482             }
13483       }
13484
13485       /* ... fall through ...  */
13486
13487     default:
13488       {
13489         tree type = TREE_TYPE (t);
13490         if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13491             && truth_value_p (TREE_CODE (t)))
13492           /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13493              have a signed:1 type (where the value is -1 and 0).  */
13494           return true;
13495       }
13496     }
13497
13498   /* We don't know sign of `t', so be conservative and return false.  */
13499   return false;
13500 }
13501
13502 /* Return true if `t' is known to be non-negative.  Handle warnings
13503    about undefined signed overflow.  */
13504
13505 bool
13506 tree_expr_nonnegative_p (tree t)
13507 {
13508   bool ret, strict_overflow_p;
13509
13510   strict_overflow_p = false;
13511   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
13512   if (strict_overflow_p)
13513     fold_overflow_warning (("assuming signed overflow does not occur when "
13514                             "determining that expression is always "
13515                             "non-negative"),
13516                            WARN_STRICT_OVERFLOW_MISC);
13517   return ret;
13518 }
13519
13520 /* Return true when T is an address and is known to be nonzero.
13521    For floating point we further ensure that T is not denormal.
13522    Similar logic is present in nonzero_address in rtlanal.h.
13523
13524    If the return value is based on the assumption that signed overflow
13525    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
13526    change *STRICT_OVERFLOW_P.  */
13527
13528 bool
13529 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
13530 {
13531   tree type = TREE_TYPE (t);
13532   bool sub_strict_overflow_p;
13533
13534   /* Doing something useful for floating point would need more work.  */
13535   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
13536     return false;
13537
13538   switch (TREE_CODE (t))
13539     {
13540     case SSA_NAME:
13541       /* Query VRP to see if it has recorded any information about
13542          the range of this object.  */
13543       return ssa_name_nonzero_p (t);
13544
13545     case ABS_EXPR:
13546       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13547                                         strict_overflow_p);
13548
13549     case INTEGER_CST:
13550       return !integer_zerop (t);
13551
13552     case PLUS_EXPR:
13553       if (TYPE_OVERFLOW_UNDEFINED (type))
13554         {
13555           /* With the presence of negative values it is hard
13556              to say something.  */
13557           sub_strict_overflow_p = false;
13558           if (!tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13559                                               &sub_strict_overflow_p)
13560               || !tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13561                                                  &sub_strict_overflow_p))
13562             return false;
13563           /* One of operands must be positive and the other non-negative.  */
13564           /* We don't set *STRICT_OVERFLOW_P here: even if this value
13565              overflows, on a twos-complement machine the sum of two
13566              nonnegative numbers can never be zero.  */
13567           return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13568                                              strict_overflow_p)
13569                   || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13570                                                 strict_overflow_p));
13571         }
13572       break;
13573
13574     case MULT_EXPR:
13575       if (TYPE_OVERFLOW_UNDEFINED (type))
13576         {
13577           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13578                                          strict_overflow_p)
13579               && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13580                                             strict_overflow_p))
13581             {
13582               *strict_overflow_p = true;
13583               return true;
13584             }
13585         }
13586       break;
13587
13588     case NOP_EXPR:
13589       {
13590         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
13591         tree outer_type = TREE_TYPE (t);
13592
13593         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
13594                 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13595                                               strict_overflow_p));
13596       }
13597       break;
13598
13599    case ADDR_EXPR:
13600       {
13601         tree base = get_base_address (TREE_OPERAND (t, 0));
13602
13603         if (!base)
13604           return false;
13605
13606         /* Weak declarations may link to NULL.  */
13607         if (VAR_OR_FUNCTION_DECL_P (base))
13608           return !DECL_WEAK (base);
13609
13610         /* Constants are never weak.  */
13611         if (CONSTANT_CLASS_P (base))
13612           return true;
13613
13614         return false;
13615       }
13616
13617     case COND_EXPR:
13618       sub_strict_overflow_p = false;
13619       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13620                                      &sub_strict_overflow_p)
13621           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
13622                                         &sub_strict_overflow_p))
13623         {
13624           if (sub_strict_overflow_p)
13625             *strict_overflow_p = true;
13626           return true;
13627         }
13628       break;
13629
13630     case MIN_EXPR:
13631       sub_strict_overflow_p = false;
13632       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13633                                      &sub_strict_overflow_p)
13634           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13635                                         &sub_strict_overflow_p))
13636         {
13637           if (sub_strict_overflow_p)
13638             *strict_overflow_p = true;
13639         }
13640       break;
13641
13642     case MAX_EXPR:
13643       sub_strict_overflow_p = false;
13644       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13645                                      &sub_strict_overflow_p))
13646         {
13647           if (sub_strict_overflow_p)
13648             *strict_overflow_p = true;
13649
13650           /* When both operands are nonzero, then MAX must be too.  */
13651           if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13652                                          strict_overflow_p))
13653             return true;
13654
13655           /* MAX where operand 0 is positive is positive.  */
13656           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
13657                                                strict_overflow_p);
13658         }
13659       /* MAX where operand 1 is positive is positive.  */
13660       else if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13661                                           &sub_strict_overflow_p)
13662                && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13663                                                  &sub_strict_overflow_p))
13664         {
13665           if (sub_strict_overflow_p)
13666             *strict_overflow_p = true;
13667           return true;
13668         }
13669       break;
13670
13671     case COMPOUND_EXPR:
13672     case MODIFY_EXPR:
13673     case GIMPLE_MODIFY_STMT:
13674     case BIND_EXPR:
13675       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13676                                         strict_overflow_p);
13677
13678     case SAVE_EXPR:
13679     case NON_LVALUE_EXPR:
13680       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13681                                         strict_overflow_p);
13682
13683     case BIT_IOR_EXPR:
13684       return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
13685                                         strict_overflow_p)
13686               || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
13687                                             strict_overflow_p));
13688
13689     case CALL_EXPR:
13690       return alloca_call_p (t);
13691
13692     default:
13693       break;
13694     }
13695   return false;
13696 }
13697
13698 /* Return true when T is an address and is known to be nonzero.
13699    Handle warnings about undefined signed overflow.  */
13700
13701 bool
13702 tree_expr_nonzero_p (tree t)
13703 {
13704   bool ret, strict_overflow_p;
13705
13706   strict_overflow_p = false;
13707   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
13708   if (strict_overflow_p)
13709     fold_overflow_warning (("assuming signed overflow does not occur when "
13710                             "determining that expression is always "
13711                             "non-zero"),
13712                            WARN_STRICT_OVERFLOW_MISC);
13713   return ret;
13714 }
13715
13716 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
13717    attempt to fold the expression to a constant without modifying TYPE,
13718    OP0 or OP1.
13719
13720    If the expression could be simplified to a constant, then return
13721    the constant.  If the expression would not be simplified to a
13722    constant, then return NULL_TREE.  */
13723
13724 tree
13725 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
13726 {
13727   tree tem = fold_binary (code, type, op0, op1);
13728   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13729 }
13730
13731 /* Given the components of a unary expression CODE, TYPE and OP0,
13732    attempt to fold the expression to a constant without modifying
13733    TYPE or OP0.
13734
13735    If the expression could be simplified to a constant, then return
13736    the constant.  If the expression would not be simplified to a
13737    constant, then return NULL_TREE.  */
13738
13739 tree
13740 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
13741 {
13742   tree tem = fold_unary (code, type, op0);
13743   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
13744 }
13745
13746 /* If EXP represents referencing an element in a constant string
13747    (either via pointer arithmetic or array indexing), return the
13748    tree representing the value accessed, otherwise return NULL.  */
13749
13750 tree
13751 fold_read_from_constant_string (tree exp)
13752 {
13753   if ((TREE_CODE (exp) == INDIRECT_REF
13754        || TREE_CODE (exp) == ARRAY_REF)
13755       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
13756     {
13757       tree exp1 = TREE_OPERAND (exp, 0);
13758       tree index;
13759       tree string;
13760
13761       if (TREE_CODE (exp) == INDIRECT_REF)
13762         string = string_constant (exp1, &index);
13763       else
13764         {
13765           tree low_bound = array_ref_low_bound (exp);
13766           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
13767
13768           /* Optimize the special-case of a zero lower bound.
13769
13770              We convert the low_bound to sizetype to avoid some problems
13771              with constant folding.  (E.g. suppose the lower bound is 1,
13772              and its mode is QI.  Without the conversion,l (ARRAY
13773              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
13774              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
13775           if (! integer_zerop (low_bound))
13776             index = size_diffop (index, fold_convert (sizetype, low_bound));
13777
13778           string = exp1;
13779         }
13780
13781       if (string
13782           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
13783           && TREE_CODE (string) == STRING_CST
13784           && TREE_CODE (index) == INTEGER_CST
13785           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
13786           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
13787               == MODE_INT)
13788           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
13789         return fold_convert (TREE_TYPE (exp),
13790                              build_int_cst (NULL_TREE,
13791                                             (TREE_STRING_POINTER (string)
13792                                              [TREE_INT_CST_LOW (index)])));
13793     }
13794   return NULL;
13795 }
13796
13797 /* Return the tree for neg (ARG0) when ARG0 is known to be either
13798    an integer constant or real constant.
13799
13800    TYPE is the type of the result.  */
13801
13802 static tree
13803 fold_negate_const (tree arg0, tree type)
13804 {
13805   tree t = NULL_TREE;
13806
13807   switch (TREE_CODE (arg0))
13808     {
13809     case INTEGER_CST:
13810       {
13811         unsigned HOST_WIDE_INT low;
13812         HOST_WIDE_INT high;
13813         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13814                                    TREE_INT_CST_HIGH (arg0),
13815                                    &low, &high);
13816         t = force_fit_type_double (type, low, high, 1,
13817                                    (overflow | TREE_OVERFLOW (arg0))
13818                                    && !TYPE_UNSIGNED (type));
13819         break;
13820       }
13821
13822     case REAL_CST:
13823       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13824       break;
13825
13826     default:
13827       gcc_unreachable ();
13828     }
13829
13830   return t;
13831 }
13832
13833 /* Return the tree for abs (ARG0) when ARG0 is known to be either
13834    an integer constant or real constant.
13835
13836    TYPE is the type of the result.  */
13837
13838 tree
13839 fold_abs_const (tree arg0, tree type)
13840 {
13841   tree t = NULL_TREE;
13842
13843   switch (TREE_CODE (arg0))
13844     {
13845     case INTEGER_CST:
13846       /* If the value is unsigned, then the absolute value is
13847          the same as the ordinary value.  */
13848       if (TYPE_UNSIGNED (type))
13849         t = arg0;
13850       /* Similarly, if the value is non-negative.  */
13851       else if (INT_CST_LT (integer_minus_one_node, arg0))
13852         t = arg0;
13853       /* If the value is negative, then the absolute value is
13854          its negation.  */
13855       else
13856         {
13857           unsigned HOST_WIDE_INT low;
13858           HOST_WIDE_INT high;
13859           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13860                                      TREE_INT_CST_HIGH (arg0),
13861                                      &low, &high);
13862           t = force_fit_type_double (type, low, high, -1,
13863                                      overflow | TREE_OVERFLOW (arg0));
13864         }
13865       break;
13866
13867     case REAL_CST:
13868       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
13869         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13870       else
13871         t =  arg0;
13872       break;
13873
13874     default:
13875       gcc_unreachable ();
13876     }
13877
13878   return t;
13879 }
13880
13881 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
13882    constant.  TYPE is the type of the result.  */
13883
13884 static tree
13885 fold_not_const (tree arg0, tree type)
13886 {
13887   tree t = NULL_TREE;
13888
13889   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
13890
13891   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
13892                              ~TREE_INT_CST_HIGH (arg0), 0,
13893                              TREE_OVERFLOW (arg0));
13894
13895   return t;
13896 }
13897
13898 /* Given CODE, a relational operator, the target type, TYPE and two
13899    constant operands OP0 and OP1, return the result of the
13900    relational operation.  If the result is not a compile time
13901    constant, then return NULL_TREE.  */
13902
13903 static tree
13904 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
13905 {
13906   int result, invert;
13907
13908   /* From here on, the only cases we handle are when the result is
13909      known to be a constant.  */
13910
13911   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
13912     {
13913       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
13914       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
13915
13916       /* Handle the cases where either operand is a NaN.  */
13917       if (real_isnan (c0) || real_isnan (c1))
13918         {
13919           switch (code)
13920             {
13921             case EQ_EXPR:
13922             case ORDERED_EXPR:
13923               result = 0;
13924               break;
13925
13926             case NE_EXPR:
13927             case UNORDERED_EXPR:
13928             case UNLT_EXPR:
13929             case UNLE_EXPR:
13930             case UNGT_EXPR:
13931             case UNGE_EXPR:
13932             case UNEQ_EXPR:
13933               result = 1;
13934               break;
13935
13936             case LT_EXPR:
13937             case LE_EXPR:
13938             case GT_EXPR:
13939             case GE_EXPR:
13940             case LTGT_EXPR:
13941               if (flag_trapping_math)
13942                 return NULL_TREE;
13943               result = 0;
13944               break;
13945
13946             default:
13947               gcc_unreachable ();
13948             }
13949
13950           return constant_boolean_node (result, type);
13951         }
13952
13953       return constant_boolean_node (real_compare (code, c0, c1), type);
13954     }
13955
13956   /* Handle equality/inequality of complex constants.  */
13957   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
13958     {
13959       tree rcond = fold_relational_const (code, type,
13960                                           TREE_REALPART (op0),
13961                                           TREE_REALPART (op1));
13962       tree icond = fold_relational_const (code, type,
13963                                           TREE_IMAGPART (op0),
13964                                           TREE_IMAGPART (op1));
13965       if (code == EQ_EXPR)
13966         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
13967       else if (code == NE_EXPR)
13968         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
13969       else
13970         return NULL_TREE;
13971     }
13972
13973   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
13974
13975      To compute GT, swap the arguments and do LT.
13976      To compute GE, do LT and invert the result.
13977      To compute LE, swap the arguments, do LT and invert the result.
13978      To compute NE, do EQ and invert the result.
13979
13980      Therefore, the code below must handle only EQ and LT.  */
13981
13982   if (code == LE_EXPR || code == GT_EXPR)
13983     {
13984       tree tem = op0;
13985       op0 = op1;
13986       op1 = tem;
13987       code = swap_tree_comparison (code);
13988     }
13989
13990   /* Note that it is safe to invert for real values here because we
13991      have already handled the one case that it matters.  */
13992
13993   invert = 0;
13994   if (code == NE_EXPR || code == GE_EXPR)
13995     {
13996       invert = 1;
13997       code = invert_tree_comparison (code, false);
13998     }
13999
14000   /* Compute a result for LT or EQ if args permit;
14001      Otherwise return T.  */
14002   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14003     {
14004       if (code == EQ_EXPR)
14005         result = tree_int_cst_equal (op0, op1);
14006       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14007         result = INT_CST_LT_UNSIGNED (op0, op1);
14008       else
14009         result = INT_CST_LT (op0, op1);
14010     }
14011   else
14012     return NULL_TREE;
14013
14014   if (invert)
14015     result ^= 1;
14016   return constant_boolean_node (result, type);
14017 }
14018
14019 /* Build an expression for the a clean point containing EXPR with type TYPE.
14020    Don't build a cleanup point expression for EXPR which don't have side
14021    effects.  */
14022
14023 tree
14024 fold_build_cleanup_point_expr (tree type, tree expr)
14025 {
14026   /* If the expression does not have side effects then we don't have to wrap
14027      it with a cleanup point expression.  */
14028   if (!TREE_SIDE_EFFECTS (expr))
14029     return expr;
14030
14031   /* If the expression is a return, check to see if the expression inside the
14032      return has no side effects or the right hand side of the modify expression
14033      inside the return. If either don't have side effects set we don't need to
14034      wrap the expression in a cleanup point expression.  Note we don't check the
14035      left hand side of the modify because it should always be a return decl.  */
14036   if (TREE_CODE (expr) == RETURN_EXPR)
14037     {
14038       tree op = TREE_OPERAND (expr, 0);
14039       if (!op || !TREE_SIDE_EFFECTS (op))
14040         return expr;
14041       op = TREE_OPERAND (op, 1);
14042       if (!TREE_SIDE_EFFECTS (op))
14043         return expr;
14044     }
14045   
14046   return build1 (CLEANUP_POINT_EXPR, type, expr);
14047 }
14048
14049 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
14050    avoid confusing the gimplify process.  */
14051
14052 tree
14053 build_fold_addr_expr_with_type (tree t, tree ptrtype)
14054 {
14055   /* The size of the object is not relevant when talking about its address.  */
14056   if (TREE_CODE (t) == WITH_SIZE_EXPR)
14057     t = TREE_OPERAND (t, 0);
14058
14059   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
14060   if (TREE_CODE (t) == INDIRECT_REF
14061       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
14062     {
14063       t = TREE_OPERAND (t, 0);
14064       if (TREE_TYPE (t) != ptrtype)
14065         t = build1 (NOP_EXPR, ptrtype, t);
14066     }
14067   else
14068     {
14069       tree base = t;
14070
14071       while (handled_component_p (base))
14072         base = TREE_OPERAND (base, 0);
14073       if (DECL_P (base))
14074         TREE_ADDRESSABLE (base) = 1;
14075
14076       t = build1 (ADDR_EXPR, ptrtype, t);
14077     }
14078
14079   return t;
14080 }
14081
14082 tree
14083 build_fold_addr_expr (tree t)
14084 {
14085   return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
14086 }
14087
14088 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14089    of an indirection through OP0, or NULL_TREE if no simplification is
14090    possible.  */
14091
14092 tree
14093 fold_indirect_ref_1 (tree type, tree op0)
14094 {
14095   tree sub = op0;
14096   tree subtype;
14097
14098   STRIP_NOPS (sub);
14099   subtype = TREE_TYPE (sub);
14100   if (!POINTER_TYPE_P (subtype))
14101     return NULL_TREE;
14102
14103   if (TREE_CODE (sub) == ADDR_EXPR)
14104     {
14105       tree op = TREE_OPERAND (sub, 0);
14106       tree optype = TREE_TYPE (op);
14107       /* *&CONST_DECL -> to the value of the const decl.  */
14108       if (TREE_CODE (op) == CONST_DECL)
14109         return DECL_INITIAL (op);
14110       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
14111       if (type == optype)
14112         {
14113           tree fop = fold_read_from_constant_string (op);
14114           if (fop)
14115             return fop;
14116           else
14117             return op;
14118         }
14119       /* *(foo *)&fooarray => fooarray[0] */
14120       else if (TREE_CODE (optype) == ARRAY_TYPE
14121                && type == TREE_TYPE (optype))
14122         {
14123           tree type_domain = TYPE_DOMAIN (optype);
14124           tree min_val = size_zero_node;
14125           if (type_domain && TYPE_MIN_VALUE (type_domain))
14126             min_val = TYPE_MIN_VALUE (type_domain);
14127           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14128         }
14129       /* *(foo *)&complexfoo => __real__ complexfoo */
14130       else if (TREE_CODE (optype) == COMPLEX_TYPE
14131                && type == TREE_TYPE (optype))
14132         return fold_build1 (REALPART_EXPR, type, op);
14133       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14134       else if (TREE_CODE (optype) == VECTOR_TYPE
14135                && type == TREE_TYPE (optype))
14136         {
14137           tree part_width = TYPE_SIZE (type);
14138           tree index = bitsize_int (0);
14139           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
14140         }
14141     }
14142
14143   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
14144   if (TREE_CODE (sub) == PLUS_EXPR
14145       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
14146     {
14147       tree op00 = TREE_OPERAND (sub, 0);
14148       tree op01 = TREE_OPERAND (sub, 1);
14149       tree op00type;
14150
14151       STRIP_NOPS (op00);
14152       op00type = TREE_TYPE (op00);
14153       if (TREE_CODE (op00) == ADDR_EXPR
14154           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
14155           && type == TREE_TYPE (TREE_TYPE (op00type)))
14156         {
14157           tree size = TYPE_SIZE_UNIT (type);
14158           if (tree_int_cst_equal (size, op01))
14159             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
14160         }
14161     }
14162   
14163   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
14164   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
14165       && type == TREE_TYPE (TREE_TYPE (subtype)))
14166     {
14167       tree type_domain;
14168       tree min_val = size_zero_node;
14169       sub = build_fold_indirect_ref (sub);
14170       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
14171       if (type_domain && TYPE_MIN_VALUE (type_domain))
14172         min_val = TYPE_MIN_VALUE (type_domain);
14173       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
14174     }
14175
14176   return NULL_TREE;
14177 }
14178
14179 /* Builds an expression for an indirection through T, simplifying some
14180    cases.  */
14181
14182 tree
14183 build_fold_indirect_ref (tree t)
14184 {
14185   tree type = TREE_TYPE (TREE_TYPE (t));
14186   tree sub = fold_indirect_ref_1 (type, t);
14187
14188   if (sub)
14189     return sub;
14190   else
14191     return build1 (INDIRECT_REF, type, t);
14192 }
14193
14194 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
14195
14196 tree
14197 fold_indirect_ref (tree t)
14198 {
14199   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
14200
14201   if (sub)
14202     return sub;
14203   else
14204     return t;
14205 }
14206
14207 /* Strip non-trapping, non-side-effecting tree nodes from an expression
14208    whose result is ignored.  The type of the returned tree need not be
14209    the same as the original expression.  */
14210
14211 tree
14212 fold_ignored_result (tree t)
14213 {
14214   if (!TREE_SIDE_EFFECTS (t))
14215     return integer_zero_node;
14216
14217   for (;;)
14218     switch (TREE_CODE_CLASS (TREE_CODE (t)))
14219       {
14220       case tcc_unary:
14221         t = TREE_OPERAND (t, 0);
14222         break;
14223
14224       case tcc_binary:
14225       case tcc_comparison:
14226         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14227           t = TREE_OPERAND (t, 0);
14228         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
14229           t = TREE_OPERAND (t, 1);
14230         else
14231           return t;
14232         break;
14233
14234       case tcc_expression:
14235         switch (TREE_CODE (t))
14236           {
14237           case COMPOUND_EXPR:
14238             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
14239               return t;
14240             t = TREE_OPERAND (t, 0);
14241             break;
14242
14243           case COND_EXPR:
14244             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
14245                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
14246               return t;
14247             t = TREE_OPERAND (t, 0);
14248             break;
14249
14250           default:
14251             return t;
14252           }
14253         break;
14254
14255       default:
14256         return t;
14257       }
14258 }
14259
14260 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
14261    This can only be applied to objects of a sizetype.  */
14262
14263 tree
14264 round_up (tree value, int divisor)
14265 {
14266   tree div = NULL_TREE;
14267
14268   gcc_assert (divisor > 0);
14269   if (divisor == 1)
14270     return value;
14271
14272   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14273      have to do anything.  Only do this when we are not given a const,
14274      because in that case, this check is more expensive than just
14275      doing it.  */
14276   if (TREE_CODE (value) != INTEGER_CST)
14277     {
14278       div = build_int_cst (TREE_TYPE (value), divisor);
14279
14280       if (multiple_of_p (TREE_TYPE (value), value, div))
14281         return value;
14282     }
14283
14284   /* If divisor is a power of two, simplify this to bit manipulation.  */
14285   if (divisor == (divisor & -divisor))
14286     {
14287       if (TREE_CODE (value) == INTEGER_CST)
14288         {
14289           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
14290           unsigned HOST_WIDE_INT high;
14291           bool overflow_p;
14292
14293           if ((low & (divisor - 1)) == 0)
14294             return value;
14295
14296           overflow_p = TREE_OVERFLOW (value);
14297           high = TREE_INT_CST_HIGH (value);
14298           low &= ~(divisor - 1);
14299           low += divisor;
14300           if (low == 0)
14301             {
14302               high++;
14303               if (high == 0)
14304                 overflow_p = true;
14305             }
14306
14307           return force_fit_type_double (TREE_TYPE (value), low, high,
14308                                         -1, overflow_p);
14309         }
14310       else
14311         {
14312           tree t;
14313
14314           t = build_int_cst (TREE_TYPE (value), divisor - 1);
14315           value = size_binop (PLUS_EXPR, value, t);
14316           t = build_int_cst (TREE_TYPE (value), -divisor);
14317           value = size_binop (BIT_AND_EXPR, value, t);
14318         }
14319     }
14320   else
14321     {
14322       if (!div)
14323         div = build_int_cst (TREE_TYPE (value), divisor);
14324       value = size_binop (CEIL_DIV_EXPR, value, div);
14325       value = size_binop (MULT_EXPR, value, div);
14326     }
14327
14328   return value;
14329 }
14330
14331 /* Likewise, but round down.  */
14332
14333 tree
14334 round_down (tree value, int divisor)
14335 {
14336   tree div = NULL_TREE;
14337
14338   gcc_assert (divisor > 0);
14339   if (divisor == 1)
14340     return value;
14341
14342   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
14343      have to do anything.  Only do this when we are not given a const,
14344      because in that case, this check is more expensive than just
14345      doing it.  */
14346   if (TREE_CODE (value) != INTEGER_CST)
14347     {
14348       div = build_int_cst (TREE_TYPE (value), divisor);
14349
14350       if (multiple_of_p (TREE_TYPE (value), value, div))
14351         return value;
14352     }
14353
14354   /* If divisor is a power of two, simplify this to bit manipulation.  */
14355   if (divisor == (divisor & -divisor))
14356     {
14357       tree t;
14358
14359       t = build_int_cst (TREE_TYPE (value), -divisor);
14360       value = size_binop (BIT_AND_EXPR, value, t);
14361     }
14362   else
14363     {
14364       if (!div)
14365         div = build_int_cst (TREE_TYPE (value), divisor);
14366       value = size_binop (FLOOR_DIV_EXPR, value, div);
14367       value = size_binop (MULT_EXPR, value, div);
14368     }
14369
14370   return value;
14371 }
14372
14373 /* Returns the pointer to the base of the object addressed by EXP and
14374    extracts the information about the offset of the access, storing it
14375    to PBITPOS and POFFSET.  */
14376
14377 static tree
14378 split_address_to_core_and_offset (tree exp,
14379                                   HOST_WIDE_INT *pbitpos, tree *poffset)
14380 {
14381   tree core;
14382   enum machine_mode mode;
14383   int unsignedp, volatilep;
14384   HOST_WIDE_INT bitsize;
14385
14386   if (TREE_CODE (exp) == ADDR_EXPR)
14387     {
14388       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
14389                                   poffset, &mode, &unsignedp, &volatilep,
14390                                   false);
14391       core = build_fold_addr_expr (core);
14392     }
14393   else
14394     {
14395       core = exp;
14396       *pbitpos = 0;
14397       *poffset = NULL_TREE;
14398     }
14399
14400   return core;
14401 }
14402
14403 /* Returns true if addresses of E1 and E2 differ by a constant, false
14404    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
14405
14406 bool
14407 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
14408 {
14409   tree core1, core2;
14410   HOST_WIDE_INT bitpos1, bitpos2;
14411   tree toffset1, toffset2, tdiff, type;
14412
14413   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
14414   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
14415
14416   if (bitpos1 % BITS_PER_UNIT != 0
14417       || bitpos2 % BITS_PER_UNIT != 0
14418       || !operand_equal_p (core1, core2, 0))
14419     return false;
14420
14421   if (toffset1 && toffset2)
14422     {
14423       type = TREE_TYPE (toffset1);
14424       if (type != TREE_TYPE (toffset2))
14425         toffset2 = fold_convert (type, toffset2);
14426
14427       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
14428       if (!cst_and_fits_in_hwi (tdiff))
14429         return false;
14430
14431       *diff = int_cst_value (tdiff);
14432     }
14433   else if (toffset1 || toffset2)
14434     {
14435       /* If only one of the offsets is non-constant, the difference cannot
14436          be a constant.  */
14437       return false;
14438     }
14439   else
14440     *diff = 0;
14441
14442   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
14443   return true;
14444 }
14445
14446 /* Simplify the floating point expression EXP when the sign of the
14447    result is not significant.  Return NULL_TREE if no simplification
14448    is possible.  */
14449
14450 tree
14451 fold_strip_sign_ops (tree exp)
14452 {
14453   tree arg0, arg1;
14454
14455   switch (TREE_CODE (exp))
14456     {
14457     case ABS_EXPR:
14458     case NEGATE_EXPR:
14459       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14460       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
14461
14462     case MULT_EXPR:
14463     case RDIV_EXPR:
14464       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
14465         return NULL_TREE;
14466       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
14467       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14468       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
14469         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
14470                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
14471                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
14472       break;
14473
14474     case COMPOUND_EXPR:
14475       arg0 = TREE_OPERAND (exp, 0);
14476       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14477       if (arg1)
14478         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
14479       break;
14480       
14481     case COND_EXPR:
14482       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
14483       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
14484       if (arg0 || arg1)
14485         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
14486                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
14487                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
14488       break;
14489       
14490     case CALL_EXPR:
14491       {
14492         const enum built_in_function fcode = builtin_mathfn_code (exp);
14493         switch (fcode)
14494         {
14495         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14496           /* Strip copysign function call, return the 1st argument. */
14497           arg0 = CALL_EXPR_ARG (exp, 0);
14498           arg1 = CALL_EXPR_ARG (exp, 1);
14499           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
14500
14501         default:
14502           /* Strip sign ops from the argument of "odd" math functions.  */
14503           if (negate_mathfn_p (fcode))
14504             {
14505               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
14506               if (arg0)
14507                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
14508             }
14509           break;
14510         }
14511       }
14512       break;
14513
14514     default:
14515       break;
14516     }
14517   return NULL_TREE;
14518 }