OSDN Git Service

* decl.c (MAX_FIXED_MODE_SIZE): Define if not already defined.
[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 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*@@ This file should be rewritten to use an arbitrary precision
23   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25   @@ The routines that translate from the ap rep should
26   @@ warn if precision et. al. is lost.
27   @@ This would also make life easier when this technology is used
28   @@ for cross-compilers.  */
29
30 /* The entry points in this file are fold, size_int_wide, size_binop
31    and force_fit_type_double.
32
33    fold takes a tree as argument and returns a simplified tree.
34
35    size_binop takes a tree code for an arithmetic operation
36    and two operands that are trees, and produces a tree for the
37    result, assuming the type comes from `sizetype'.
38
39    size_int takes an integer value, and creates a tree constant
40    with type from `sizetype'.
41
42    force_fit_type_double takes a constant, an overflowable flag and a
43    prior overflow indicator.  It forces the value to fit the type and
44    sets TREE_OVERFLOW.
45
46    Note: Since the folders get called on non-gimple code as well as
47    gimple code, we need to handle GIMPLE tuples as well as their
48    corresponding tree equivalents.  */
49
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include "flags.h"
55 #include "tree.h"
56 #include "real.h"
57 #include "fixed-value.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "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 decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
113                                     enum machine_mode *, int *, int *,
114                                     tree *, tree *);
115 static tree sign_bit_p (tree, const_tree);
116 static int simple_operand_p (const_tree);
117 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
118 static tree range_predecessor (tree);
119 static tree range_successor (tree);
120 static tree make_range (tree, int *, tree *, tree *, bool *);
121 static tree build_range_check (tree, tree, int, tree, tree);
122 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
123                          tree);
124 static tree fold_range_test (enum tree_code, tree, tree, tree);
125 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
126 static tree unextend (tree, int, int, tree);
127 static tree fold_truthop (enum tree_code, tree, tree, tree);
128 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
129 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
130 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
131 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
132                                                  tree, tree,
133                                                  tree, tree, int);
134 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
135                                  tree, tree, tree);
136 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
137 static tree fold_div_compare (enum tree_code, tree, tree, tree);
138 static bool reorder_operands_p (const_tree, const_tree);
139 static tree fold_negate_const (tree, tree);
140 static tree fold_not_const (tree, tree);
141 static tree fold_relational_const (enum tree_code, tree, tree, tree);
142
143
144 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
145    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
146    and SUM1.  Then this yields nonzero if overflow occurred during the
147    addition.
148
149    Overflow occurs if A and B have the same sign, but A and SUM differ in
150    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
151    sign.  */
152 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
153 \f
154 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
155    We do that by representing the two-word integer in 4 words, with only
156    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
157    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
158
159 #define LOWPART(x) \
160   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
161 #define HIGHPART(x) \
162   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
163 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
164
165 /* Unpack a two-word integer into 4 words.
166    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
167    WORDS points to the array of HOST_WIDE_INTs.  */
168
169 static void
170 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
171 {
172   words[0] = LOWPART (low);
173   words[1] = HIGHPART (low);
174   words[2] = LOWPART (hi);
175   words[3] = HIGHPART (hi);
176 }
177
178 /* Pack an array of 4 words into a two-word integer.
179    WORDS points to the array of words.
180    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
181
182 static void
183 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
184         HOST_WIDE_INT *hi)
185 {
186   *low = words[0] + words[1] * BASE;
187   *hi = words[2] + words[3] * BASE;
188 }
189 \f
190 /* Force the double-word integer L1, H1 to be within the range of the
191    integer type TYPE.  Stores the properly truncated and sign-extended
192    double-word integer in *LV, *HV.  Returns true if the operation
193    overflows, that is, argument and result are different.  */
194
195 int
196 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
197                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
198 {
199   unsigned HOST_WIDE_INT low0 = l1;
200   HOST_WIDE_INT high0 = h1;
201   unsigned int prec;
202   int sign_extended_type;
203
204   if (POINTER_TYPE_P (type)
205       || TREE_CODE (type) == OFFSET_TYPE)
206     prec = POINTER_SIZE;
207   else
208     prec = TYPE_PRECISION (type);
209
210   /* Size types *are* sign extended.  */
211   sign_extended_type = (!TYPE_UNSIGNED (type)
212                         || (TREE_CODE (type) == INTEGER_TYPE
213                             && TYPE_IS_SIZETYPE (type)));
214
215   /* First clear all bits that are beyond the type's precision.  */
216   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
217     ;
218   else if (prec > HOST_BITS_PER_WIDE_INT)
219     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
220   else
221     {
222       h1 = 0;
223       if (prec < HOST_BITS_PER_WIDE_INT)
224         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
225     }
226
227   /* Then do sign extension if necessary.  */
228   if (!sign_extended_type)
229     /* No sign extension */;
230   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
231     /* Correct width already.  */;
232   else if (prec > HOST_BITS_PER_WIDE_INT)
233     {
234       /* Sign extend top half? */
235       if (h1 & ((unsigned HOST_WIDE_INT)1
236                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
237         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
238     }
239   else if (prec == HOST_BITS_PER_WIDE_INT)
240     {
241       if ((HOST_WIDE_INT)l1 < 0)
242         h1 = -1;
243     }
244   else
245     {
246       /* Sign extend bottom half? */
247       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
248         {
249           h1 = -1;
250           l1 |= (HOST_WIDE_INT)(-1) << prec;
251         }
252     }
253
254   *lv = l1;
255   *hv = h1;
256
257   /* If the value didn't fit, signal overflow.  */
258   return l1 != low0 || h1 != high0;
259 }
260
261 /* We force the double-int HIGH:LOW to the range of the type TYPE by
262    sign or zero extending it.
263    OVERFLOWABLE indicates if we are interested
264    in overflow of the value, when >0 we are only interested in signed
265    overflow, for <0 we are interested in any overflow.  OVERFLOWED
266    indicates whether overflow has already occurred.  CONST_OVERFLOWED
267    indicates whether constant overflow has already occurred.  We force
268    T's value to be within range of T's type (by setting to 0 or 1 all
269    the bits outside the type's range).  We set TREE_OVERFLOWED if,
270         OVERFLOWED is nonzero,
271         or OVERFLOWABLE is >0 and signed overflow occurs
272         or OVERFLOWABLE is <0 and any overflow occurs
273    We return a new tree node for the extended double-int.  The node
274    is shared if no overflow flags are set.  */
275
276 tree
277 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
278                        HOST_WIDE_INT high, int overflowable,
279                        bool overflowed)
280 {
281   int sign_extended_type;
282   bool overflow;
283
284   /* Size types *are* sign extended.  */
285   sign_extended_type = (!TYPE_UNSIGNED (type)
286                         || (TREE_CODE (type) == INTEGER_TYPE
287                             && TYPE_IS_SIZETYPE (type)));
288
289   overflow = fit_double_type (low, high, &low, &high, type);
290
291   /* If we need to set overflow flags, return a new unshared node.  */
292   if (overflowed || overflow)
293     {
294       if (overflowed
295           || overflowable < 0
296           || (overflowable > 0 && sign_extended_type))
297         {
298           tree t = make_node (INTEGER_CST);
299           TREE_INT_CST_LOW (t) = low;
300           TREE_INT_CST_HIGH (t) = high;
301           TREE_TYPE (t) = type;
302           TREE_OVERFLOW (t) = 1;
303           return t;
304         }
305     }
306
307   /* Else build a shared node.  */
308   return build_int_cst_wide (type, low, high);
309 }
310 \f
311 /* Add two doubleword integers with doubleword result.
312    Return nonzero if the operation overflows according to UNSIGNED_P.
313    Each argument is given as two `HOST_WIDE_INT' pieces.
314    One argument is L1 and H1; the other, L2 and H2.
315    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
316
317 int
318 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
319                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
320                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
321                       bool unsigned_p)
322 {
323   unsigned HOST_WIDE_INT l;
324   HOST_WIDE_INT h;
325
326   l = l1 + l2;
327   h = h1 + h2 + (l < l1);
328
329   *lv = l;
330   *hv = h;
331
332   if (unsigned_p)
333     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
334   else
335     return OVERFLOW_SUM_SIGN (h1, h2, h);
336 }
337
338 /* Negate a doubleword integer with doubleword result.
339    Return nonzero if the operation overflows, assuming it's signed.
340    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
341    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
342
343 int
344 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
345             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
346 {
347   if (l1 == 0)
348     {
349       *lv = 0;
350       *hv = - h1;
351       return (*hv & h1) < 0;
352     }
353   else
354     {
355       *lv = -l1;
356       *hv = ~h1;
357       return 0;
358     }
359 }
360 \f
361 /* Multiply two doubleword integers with doubleword result.
362    Return nonzero if the operation overflows according to UNSIGNED_P.
363    Each argument is given as two `HOST_WIDE_INT' pieces.
364    One argument is L1 and H1; the other, L2 and H2.
365    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
366
367 int
368 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
369                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
370                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
371                       bool unsigned_p)
372 {
373   HOST_WIDE_INT arg1[4];
374   HOST_WIDE_INT arg2[4];
375   HOST_WIDE_INT prod[4 * 2];
376   unsigned HOST_WIDE_INT carry;
377   int i, j, k;
378   unsigned HOST_WIDE_INT toplow, neglow;
379   HOST_WIDE_INT tophigh, neghigh;
380
381   encode (arg1, l1, h1);
382   encode (arg2, l2, h2);
383
384   memset (prod, 0, sizeof prod);
385
386   for (i = 0; i < 4; i++)
387     {
388       carry = 0;
389       for (j = 0; j < 4; j++)
390         {
391           k = i + j;
392           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
393           carry += arg1[i] * arg2[j];
394           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
395           carry += prod[k];
396           prod[k] = LOWPART (carry);
397           carry = HIGHPART (carry);
398         }
399       prod[i + 4] = carry;
400     }
401
402   decode (prod, lv, hv);
403   decode (prod + 4, &toplow, &tophigh);
404
405   /* Unsigned overflow is immediate.  */
406   if (unsigned_p)
407     return (toplow | tophigh) != 0;
408
409   /* Check for signed overflow by calculating the signed representation of the
410      top half of the result; it should agree with the low half's sign bit.  */
411   if (h1 < 0)
412     {
413       neg_double (l2, h2, &neglow, &neghigh);
414       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
415     }
416   if (h2 < 0)
417     {
418       neg_double (l1, h1, &neglow, &neghigh);
419       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
420     }
421   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
422 }
423 \f
424 /* Shift the doubleword integer in L1, H1 left by COUNT places
425    keeping only PREC bits of result.
426    Shift right if COUNT is negative.
427    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
428    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
429
430 void
431 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
432                HOST_WIDE_INT count, unsigned int prec,
433                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
434 {
435   unsigned HOST_WIDE_INT signmask;
436
437   if (count < 0)
438     {
439       rshift_double (l1, h1, -count, prec, lv, hv, arith);
440       return;
441     }
442
443   if (SHIFT_COUNT_TRUNCATED)
444     count %= prec;
445
446   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
447     {
448       /* Shifting by the host word size is undefined according to the
449          ANSI standard, so we must handle this as a special case.  */
450       *hv = 0;
451       *lv = 0;
452     }
453   else if (count >= HOST_BITS_PER_WIDE_INT)
454     {
455       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
456       *lv = 0;
457     }
458   else
459     {
460       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
461              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
462       *lv = l1 << count;
463     }
464
465   /* Sign extend all bits that are beyond the precision.  */
466
467   signmask = -((prec > HOST_BITS_PER_WIDE_INT
468                 ? ((unsigned HOST_WIDE_INT) *hv
469                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
470                 : (*lv >> (prec - 1))) & 1);
471
472   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
473     ;
474   else if (prec >= HOST_BITS_PER_WIDE_INT)
475     {
476       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
477       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
478     }
479   else
480     {
481       *hv = signmask;
482       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
483       *lv |= signmask << prec;
484     }
485 }
486
487 /* Shift the doubleword integer in L1, H1 right by COUNT places
488    keeping only PREC bits of result.  COUNT must be positive.
489    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
490    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
491
492 void
493 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
494                HOST_WIDE_INT count, unsigned int prec,
495                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
496                int arith)
497 {
498   unsigned HOST_WIDE_INT signmask;
499
500   signmask = (arith
501               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
502               : 0);
503
504   if (SHIFT_COUNT_TRUNCATED)
505     count %= prec;
506
507   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
508     {
509       /* Shifting by the host word size is undefined according to the
510          ANSI standard, so we must handle this as a special case.  */
511       *hv = 0;
512       *lv = 0;
513     }
514   else if (count >= HOST_BITS_PER_WIDE_INT)
515     {
516       *hv = 0;
517       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
518     }
519   else
520     {
521       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
522       *lv = ((l1 >> count)
523              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
524     }
525
526   /* Zero / sign extend all bits that are beyond the precision.  */
527
528   if (count >= (HOST_WIDE_INT)prec)
529     {
530       *hv = signmask;
531       *lv = signmask;
532     }
533   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
534     ;
535   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
536     {
537       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
538       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
539     }
540   else
541     {
542       *hv = signmask;
543       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
544       *lv |= signmask << (prec - count);
545     }
546 }
547 \f
548 /* Rotate the doubleword integer in L1, H1 left by COUNT places
549    keeping only PREC bits of result.
550    Rotate right if COUNT is negative.
551    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
552
553 void
554 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
555                 HOST_WIDE_INT count, unsigned int prec,
556                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
557 {
558   unsigned HOST_WIDE_INT s1l, s2l;
559   HOST_WIDE_INT s1h, s2h;
560
561   count %= prec;
562   if (count < 0)
563     count += prec;
564
565   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
566   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
567   *lv = s1l | s2l;
568   *hv = s1h | s2h;
569 }
570
571 /* Rotate the doubleword integer in L1, H1 left by COUNT places
572    keeping only PREC bits of result.  COUNT must be positive.
573    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
574
575 void
576 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
577                 HOST_WIDE_INT count, unsigned int prec,
578                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
579 {
580   unsigned HOST_WIDE_INT s1l, s2l;
581   HOST_WIDE_INT s1h, s2h;
582
583   count %= prec;
584   if (count < 0)
585     count += prec;
586
587   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
588   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
589   *lv = s1l | s2l;
590   *hv = s1h | s2h;
591 }
592 \f
593 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
594    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
595    CODE is a tree code for a kind of division, one of
596    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
597    or EXACT_DIV_EXPR
598    It controls how the quotient is rounded to an integer.
599    Return nonzero if the operation overflows.
600    UNS nonzero says do unsigned division.  */
601
602 int
603 div_and_round_double (enum tree_code code, int uns,
604                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
605                       HOST_WIDE_INT hnum_orig,
606                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
607                       HOST_WIDE_INT hden_orig,
608                       unsigned HOST_WIDE_INT *lquo,
609                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
610                       HOST_WIDE_INT *hrem)
611 {
612   int quo_neg = 0;
613   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
614   HOST_WIDE_INT den[4], quo[4];
615   int i, j;
616   unsigned HOST_WIDE_INT work;
617   unsigned HOST_WIDE_INT carry = 0;
618   unsigned HOST_WIDE_INT lnum = lnum_orig;
619   HOST_WIDE_INT hnum = hnum_orig;
620   unsigned HOST_WIDE_INT lden = lden_orig;
621   HOST_WIDE_INT hden = hden_orig;
622   int overflow = 0;
623
624   if (hden == 0 && lden == 0)
625     overflow = 1, lden = 1;
626
627   /* Calculate quotient sign and convert operands to unsigned.  */
628   if (!uns)
629     {
630       if (hnum < 0)
631         {
632           quo_neg = ~ quo_neg;
633           /* (minimum integer) / (-1) is the only overflow case.  */
634           if (neg_double (lnum, hnum, &lnum, &hnum)
635               && ((HOST_WIDE_INT) lden & hden) == -1)
636             overflow = 1;
637         }
638       if (hden < 0)
639         {
640           quo_neg = ~ quo_neg;
641           neg_double (lden, hden, &lden, &hden);
642         }
643     }
644
645   if (hnum == 0 && hden == 0)
646     {                           /* single precision */
647       *hquo = *hrem = 0;
648       /* This unsigned division rounds toward zero.  */
649       *lquo = lnum / lden;
650       goto finish_up;
651     }
652
653   if (hnum == 0)
654     {                           /* trivial case: dividend < divisor */
655       /* hden != 0 already checked.  */
656       *hquo = *lquo = 0;
657       *hrem = hnum;
658       *lrem = lnum;
659       goto finish_up;
660     }
661
662   memset (quo, 0, sizeof quo);
663
664   memset (num, 0, sizeof num);  /* to zero 9th element */
665   memset (den, 0, sizeof den);
666
667   encode (num, lnum, hnum);
668   encode (den, lden, hden);
669
670   /* Special code for when the divisor < BASE.  */
671   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
672     {
673       /* hnum != 0 already checked.  */
674       for (i = 4 - 1; i >= 0; i--)
675         {
676           work = num[i] + carry * BASE;
677           quo[i] = work / lden;
678           carry = work % lden;
679         }
680     }
681   else
682     {
683       /* Full double precision division,
684          with thanks to Don Knuth's "Seminumerical Algorithms".  */
685       int num_hi_sig, den_hi_sig;
686       unsigned HOST_WIDE_INT quo_est, scale;
687
688       /* Find the highest nonzero divisor digit.  */
689       for (i = 4 - 1;; i--)
690         if (den[i] != 0)
691           {
692             den_hi_sig = i;
693             break;
694           }
695
696       /* Insure that the first digit of the divisor is at least BASE/2.
697          This is required by the quotient digit estimation algorithm.  */
698
699       scale = BASE / (den[den_hi_sig] + 1);
700       if (scale > 1)
701         {               /* scale divisor and dividend */
702           carry = 0;
703           for (i = 0; i <= 4 - 1; i++)
704             {
705               work = (num[i] * scale) + carry;
706               num[i] = LOWPART (work);
707               carry = HIGHPART (work);
708             }
709
710           num[4] = carry;
711           carry = 0;
712           for (i = 0; i <= 4 - 1; i++)
713             {
714               work = (den[i] * scale) + carry;
715               den[i] = LOWPART (work);
716               carry = HIGHPART (work);
717               if (den[i] != 0) den_hi_sig = i;
718             }
719         }
720
721       num_hi_sig = 4;
722
723       /* Main loop */
724       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
725         {
726           /* Guess the next quotient digit, quo_est, by dividing the first
727              two remaining dividend digits by the high order quotient digit.
728              quo_est is never low and is at most 2 high.  */
729           unsigned HOST_WIDE_INT tmp;
730
731           num_hi_sig = i + den_hi_sig + 1;
732           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
733           if (num[num_hi_sig] != den[den_hi_sig])
734             quo_est = work / den[den_hi_sig];
735           else
736             quo_est = BASE - 1;
737
738           /* Refine quo_est so it's usually correct, and at most one high.  */
739           tmp = work - quo_est * den[den_hi_sig];
740           if (tmp < BASE
741               && (den[den_hi_sig - 1] * quo_est
742                   > (tmp * BASE + num[num_hi_sig - 2])))
743             quo_est--;
744
745           /* Try QUO_EST as the quotient digit, by multiplying the
746              divisor by QUO_EST and subtracting from the remaining dividend.
747              Keep in mind that QUO_EST is the I - 1st digit.  */
748
749           carry = 0;
750           for (j = 0; j <= den_hi_sig; j++)
751             {
752               work = quo_est * den[j] + carry;
753               carry = HIGHPART (work);
754               work = num[i + j] - LOWPART (work);
755               num[i + j] = LOWPART (work);
756               carry += HIGHPART (work) != 0;
757             }
758
759           /* If quo_est was high by one, then num[i] went negative and
760              we need to correct things.  */
761           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
762             {
763               quo_est--;
764               carry = 0;                /* add divisor back in */
765               for (j = 0; j <= den_hi_sig; j++)
766                 {
767                   work = num[i + j] + den[j] + carry;
768                   carry = HIGHPART (work);
769                   num[i + j] = LOWPART (work);
770                 }
771
772               num [num_hi_sig] += carry;
773             }
774
775           /* Store the quotient digit.  */
776           quo[i] = quo_est;
777         }
778     }
779
780   decode (quo, lquo, hquo);
781
782  finish_up:
783   /* If result is negative, make it so.  */
784   if (quo_neg)
785     neg_double (*lquo, *hquo, lquo, hquo);
786
787   /* Compute trial remainder:  rem = num - (quo * den)  */
788   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
789   neg_double (*lrem, *hrem, lrem, hrem);
790   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
791
792   switch (code)
793     {
794     case TRUNC_DIV_EXPR:
795     case TRUNC_MOD_EXPR:        /* round toward zero */
796     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
797       return overflow;
798
799     case FLOOR_DIV_EXPR:
800     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
801       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
802         {
803           /* quo = quo - 1;  */
804           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
805                       lquo, hquo);
806         }
807       else
808         return overflow;
809       break;
810
811     case CEIL_DIV_EXPR:
812     case CEIL_MOD_EXPR:         /* round toward positive infinity */
813       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
814         {
815           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
816                       lquo, hquo);
817         }
818       else
819         return overflow;
820       break;
821
822     case ROUND_DIV_EXPR:
823     case ROUND_MOD_EXPR:        /* round to closest integer */
824       {
825         unsigned HOST_WIDE_INT labs_rem = *lrem;
826         HOST_WIDE_INT habs_rem = *hrem;
827         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
828         HOST_WIDE_INT habs_den = hden, htwice;
829
830         /* Get absolute values.  */
831         if (*hrem < 0)
832           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
833         if (hden < 0)
834           neg_double (lden, hden, &labs_den, &habs_den);
835
836         /* If (2 * abs (lrem) >= abs (lden)) */
837         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
838                     labs_rem, habs_rem, &ltwice, &htwice);
839
840         if (((unsigned HOST_WIDE_INT) habs_den
841              < (unsigned HOST_WIDE_INT) htwice)
842             || (((unsigned HOST_WIDE_INT) habs_den
843                  == (unsigned HOST_WIDE_INT) htwice)
844                 && (labs_den < ltwice)))
845           {
846             if (*hquo < 0)
847               /* quo = quo - 1;  */
848               add_double (*lquo, *hquo,
849                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
850             else
851               /* quo = quo + 1; */
852               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
853                           lquo, hquo);
854           }
855         else
856           return overflow;
857       }
858       break;
859
860     default:
861       gcc_unreachable ();
862     }
863
864   /* Compute true remainder:  rem = num - (quo * den)  */
865   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
866   neg_double (*lrem, *hrem, lrem, hrem);
867   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
868   return overflow;
869 }
870
871 /* If ARG2 divides ARG1 with zero remainder, carries out the division
872    of type CODE and returns the quotient.
873    Otherwise returns NULL_TREE.  */
874
875 static tree
876 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
877 {
878   unsigned HOST_WIDE_INT int1l, int2l;
879   HOST_WIDE_INT int1h, int2h;
880   unsigned HOST_WIDE_INT quol, reml;
881   HOST_WIDE_INT quoh, remh;
882   tree type = TREE_TYPE (arg1);
883   int uns = TYPE_UNSIGNED (type);
884
885   int1l = TREE_INT_CST_LOW (arg1);
886   int1h = TREE_INT_CST_HIGH (arg1);
887   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
888      &obj[some_exotic_number].  */
889   if (POINTER_TYPE_P (type))
890     {
891       uns = false;
892       type = signed_type_for (type);
893       fit_double_type (int1l, int1h, &int1l, &int1h,
894                        type);
895     }
896   else
897     fit_double_type (int1l, int1h, &int1l, &int1h, type);
898   int2l = TREE_INT_CST_LOW (arg2);
899   int2h = TREE_INT_CST_HIGH (arg2);
900
901   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
902                         &quol, &quoh, &reml, &remh);
903   if (remh != 0 || reml != 0)
904     return NULL_TREE;
905
906   return build_int_cst_wide (type, quol, quoh);
907 }
908 \f
909 /* This is nonzero if we should defer warnings about undefined
910    overflow.  This facility exists because these warnings are a
911    special case.  The code to estimate loop iterations does not want
912    to issue any warnings, since it works with expressions which do not
913    occur in user code.  Various bits of cleanup code call fold(), but
914    only use the result if it has certain characteristics (e.g., is a
915    constant); that code only wants to issue a warning if the result is
916    used.  */
917
918 static int fold_deferring_overflow_warnings;
919
920 /* If a warning about undefined overflow is deferred, this is the
921    warning.  Note that this may cause us to turn two warnings into
922    one, but that is fine since it is sufficient to only give one
923    warning per expression.  */
924
925 static const char* fold_deferred_overflow_warning;
926
927 /* If a warning about undefined overflow is deferred, this is the
928    level at which the warning should be emitted.  */
929
930 static enum warn_strict_overflow_code fold_deferred_overflow_code;
931
932 /* Start deferring overflow warnings.  We could use a stack here to
933    permit nested calls, but at present it is not necessary.  */
934
935 void
936 fold_defer_overflow_warnings (void)
937 {
938   ++fold_deferring_overflow_warnings;
939 }
940
941 /* Stop deferring overflow warnings.  If there is a pending warning,
942    and ISSUE is true, then issue the warning if appropriate.  STMT is
943    the statement with which the warning should be associated (used for
944    location information); STMT may be NULL.  CODE is the level of the
945    warning--a warn_strict_overflow_code value.  This function will use
946    the smaller of CODE and the deferred code when deciding whether to
947    issue the warning.  CODE may be zero to mean to always use the
948    deferred code.  */
949
950 void
951 fold_undefer_overflow_warnings (bool issue, const_tree stmt, int code)
952 {
953   const char *warnmsg;
954   location_t locus;
955
956   gcc_assert (fold_deferring_overflow_warnings > 0);
957   --fold_deferring_overflow_warnings;
958   if (fold_deferring_overflow_warnings > 0)
959     {
960       if (fold_deferred_overflow_warning != NULL
961           && code != 0
962           && code < (int) fold_deferred_overflow_code)
963         fold_deferred_overflow_code = code;
964       return;
965     }
966
967   warnmsg = fold_deferred_overflow_warning;
968   fold_deferred_overflow_warning = NULL;
969
970   if (!issue || warnmsg == NULL)
971     return;
972
973   if (stmt != NULL_TREE && TREE_NO_WARNING (stmt))
974     return;
975
976   /* Use the smallest code level when deciding to issue the
977      warning.  */
978   if (code == 0 || code > (int) fold_deferred_overflow_code)
979     code = fold_deferred_overflow_code;
980
981   if (!issue_strict_overflow_warning (code))
982     return;
983
984   if (stmt == NULL_TREE || !expr_has_location (stmt))
985     locus = input_location;
986   else
987     locus = expr_location (stmt);
988   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
989 }
990
991 /* Stop deferring overflow warnings, ignoring any deferred
992    warnings.  */
993
994 void
995 fold_undefer_and_ignore_overflow_warnings (void)
996 {
997   fold_undefer_overflow_warnings (false, NULL_TREE, 0);
998 }
999
1000 /* Whether we are deferring overflow warnings.  */
1001
1002 bool
1003 fold_deferring_overflow_warnings_p (void)
1004 {
1005   return fold_deferring_overflow_warnings > 0;
1006 }
1007
1008 /* This is called when we fold something based on the fact that signed
1009    overflow is undefined.  */
1010
1011 static void
1012 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1013 {
1014   gcc_assert (!flag_wrapv && !flag_trapv);
1015   if (fold_deferring_overflow_warnings > 0)
1016     {
1017       if (fold_deferred_overflow_warning == NULL
1018           || wc < fold_deferred_overflow_code)
1019         {
1020           fold_deferred_overflow_warning = gmsgid;
1021           fold_deferred_overflow_code = wc;
1022         }
1023     }
1024   else if (issue_strict_overflow_warning (wc))
1025     warning (OPT_Wstrict_overflow, gmsgid);
1026 }
1027 \f
1028 /* Return true if the built-in mathematical function specified by CODE
1029    is odd, i.e. -f(x) == f(-x).  */
1030
1031 static bool
1032 negate_mathfn_p (enum built_in_function code)
1033 {
1034   switch (code)
1035     {
1036     CASE_FLT_FN (BUILT_IN_ASIN):
1037     CASE_FLT_FN (BUILT_IN_ASINH):
1038     CASE_FLT_FN (BUILT_IN_ATAN):
1039     CASE_FLT_FN (BUILT_IN_ATANH):
1040     CASE_FLT_FN (BUILT_IN_CASIN):
1041     CASE_FLT_FN (BUILT_IN_CASINH):
1042     CASE_FLT_FN (BUILT_IN_CATAN):
1043     CASE_FLT_FN (BUILT_IN_CATANH):
1044     CASE_FLT_FN (BUILT_IN_CBRT):
1045     CASE_FLT_FN (BUILT_IN_CPROJ):
1046     CASE_FLT_FN (BUILT_IN_CSIN):
1047     CASE_FLT_FN (BUILT_IN_CSINH):
1048     CASE_FLT_FN (BUILT_IN_CTAN):
1049     CASE_FLT_FN (BUILT_IN_CTANH):
1050     CASE_FLT_FN (BUILT_IN_ERF):
1051     CASE_FLT_FN (BUILT_IN_LLROUND):
1052     CASE_FLT_FN (BUILT_IN_LROUND):
1053     CASE_FLT_FN (BUILT_IN_ROUND):
1054     CASE_FLT_FN (BUILT_IN_SIN):
1055     CASE_FLT_FN (BUILT_IN_SINH):
1056     CASE_FLT_FN (BUILT_IN_TAN):
1057     CASE_FLT_FN (BUILT_IN_TANH):
1058     CASE_FLT_FN (BUILT_IN_TRUNC):
1059       return true;
1060
1061     CASE_FLT_FN (BUILT_IN_LLRINT):
1062     CASE_FLT_FN (BUILT_IN_LRINT):
1063     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1064     CASE_FLT_FN (BUILT_IN_RINT):
1065       return !flag_rounding_math;
1066     
1067     default:
1068       break;
1069     }
1070   return false;
1071 }
1072
1073 /* Check whether we may negate an integer constant T without causing
1074    overflow.  */
1075
1076 bool
1077 may_negate_without_overflow_p (const_tree t)
1078 {
1079   unsigned HOST_WIDE_INT val;
1080   unsigned int prec;
1081   tree type;
1082
1083   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1084
1085   type = TREE_TYPE (t);
1086   if (TYPE_UNSIGNED (type))
1087     return false;
1088
1089   prec = TYPE_PRECISION (type);
1090   if (prec > HOST_BITS_PER_WIDE_INT)
1091     {
1092       if (TREE_INT_CST_LOW (t) != 0)
1093         return true;
1094       prec -= HOST_BITS_PER_WIDE_INT;
1095       val = TREE_INT_CST_HIGH (t);
1096     }
1097   else
1098     val = TREE_INT_CST_LOW (t);
1099   if (prec < HOST_BITS_PER_WIDE_INT)
1100     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1101   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1102 }
1103
1104 /* Determine whether an expression T can be cheaply negated using
1105    the function negate_expr without introducing undefined overflow.  */
1106
1107 static bool
1108 negate_expr_p (tree t)
1109 {
1110   tree type;
1111
1112   if (t == 0)
1113     return false;
1114
1115   type = TREE_TYPE (t);
1116
1117   STRIP_SIGN_NOPS (t);
1118   switch (TREE_CODE (t))
1119     {
1120     case INTEGER_CST:
1121       if (TYPE_OVERFLOW_WRAPS (type))
1122         return true;
1123
1124       /* Check that -CST will not overflow type.  */
1125       return may_negate_without_overflow_p (t);
1126     case BIT_NOT_EXPR:
1127       return (INTEGRAL_TYPE_P (type)
1128               && TYPE_OVERFLOW_WRAPS (type));
1129
1130     case FIXED_CST:
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 FIXED_CST:
1262       tem = fold_negate_const (t, type);
1263       return tem;
1264
1265     case COMPLEX_CST:
1266       {
1267         tree rpart = negate_expr (TREE_REALPART (t));
1268         tree ipart = negate_expr (TREE_IMAGPART (t));
1269
1270         if ((TREE_CODE (rpart) == REAL_CST
1271              && TREE_CODE (ipart) == REAL_CST)
1272             || (TREE_CODE (rpart) == INTEGER_CST
1273                 && TREE_CODE (ipart) == INTEGER_CST))
1274           return build_complex (type, rpart, ipart);
1275       }
1276       break;
1277
1278     case COMPLEX_EXPR:
1279       if (negate_expr_p (t))
1280         return fold_build2 (COMPLEX_EXPR, type,
1281                             fold_negate_expr (TREE_OPERAND (t, 0)),
1282                             fold_negate_expr (TREE_OPERAND (t, 1)));
1283       break;
1284       
1285     case CONJ_EXPR:
1286       if (negate_expr_p (t))
1287         return fold_build1 (CONJ_EXPR, type,
1288                             fold_negate_expr (TREE_OPERAND (t, 0)));
1289       break;
1290
1291     case NEGATE_EXPR:
1292       return TREE_OPERAND (t, 0);
1293
1294     case PLUS_EXPR:
1295       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1296           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1297         {
1298           /* -(A + B) -> (-B) - A.  */
1299           if (negate_expr_p (TREE_OPERAND (t, 1))
1300               && reorder_operands_p (TREE_OPERAND (t, 0),
1301                                      TREE_OPERAND (t, 1)))
1302             {
1303               tem = negate_expr (TREE_OPERAND (t, 1));
1304               return fold_build2 (MINUS_EXPR, type,
1305                                   tem, TREE_OPERAND (t, 0));
1306             }
1307
1308           /* -(A + B) -> (-A) - B.  */
1309           if (negate_expr_p (TREE_OPERAND (t, 0)))
1310             {
1311               tem = negate_expr (TREE_OPERAND (t, 0));
1312               return fold_build2 (MINUS_EXPR, type,
1313                                   tem, TREE_OPERAND (t, 1));
1314             }
1315         }
1316       break;
1317
1318     case MINUS_EXPR:
1319       /* - (A - B) -> B - A  */
1320       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1321           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1322           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1323         return fold_build2 (MINUS_EXPR, type,
1324                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1325       break;
1326
1327     case MULT_EXPR:
1328       if (TYPE_UNSIGNED (type))
1329         break;
1330
1331       /* Fall through.  */
1332
1333     case RDIV_EXPR:
1334       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1335         {
1336           tem = TREE_OPERAND (t, 1);
1337           if (negate_expr_p (tem))
1338             return fold_build2 (TREE_CODE (t), type,
1339                                 TREE_OPERAND (t, 0), negate_expr (tem));
1340           tem = TREE_OPERAND (t, 0);
1341           if (negate_expr_p (tem))
1342             return fold_build2 (TREE_CODE (t), type,
1343                                 negate_expr (tem), TREE_OPERAND (t, 1));
1344         }
1345       break;
1346
1347     case TRUNC_DIV_EXPR:
1348     case ROUND_DIV_EXPR:
1349     case FLOOR_DIV_EXPR:
1350     case CEIL_DIV_EXPR:
1351     case EXACT_DIV_EXPR:
1352       /* In general we can't negate A / B, because if A is INT_MIN and
1353          B is 1, we may turn this into INT_MIN / -1 which is undefined
1354          and actually traps on some architectures.  But if overflow is
1355          undefined, we can negate, because - (INT_MIN / 1) is an
1356          overflow.  */
1357       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1358         {
1359           const char * const warnmsg = G_("assuming signed overflow does not "
1360                                           "occur when negating a division");
1361           tem = TREE_OPERAND (t, 1);
1362           if (negate_expr_p (tem))
1363             {
1364               if (INTEGRAL_TYPE_P (type)
1365                   && (TREE_CODE (tem) != INTEGER_CST
1366                       || integer_onep (tem)))
1367                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1368               return fold_build2 (TREE_CODE (t), type,
1369                                   TREE_OPERAND (t, 0), negate_expr (tem));
1370             }
1371           tem = TREE_OPERAND (t, 0);
1372           if (negate_expr_p (tem))
1373             {
1374               if (INTEGRAL_TYPE_P (type)
1375                   && (TREE_CODE (tem) != INTEGER_CST
1376                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1377                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1378               return fold_build2 (TREE_CODE (t), type,
1379                                   negate_expr (tem), TREE_OPERAND (t, 1));
1380             }
1381         }
1382       break;
1383
1384     case NOP_EXPR:
1385       /* Convert -((double)float) into (double)(-float).  */
1386       if (TREE_CODE (type) == REAL_TYPE)
1387         {
1388           tem = strip_float_extensions (t);
1389           if (tem != t && negate_expr_p (tem))
1390             return fold_convert (type, negate_expr (tem));
1391         }
1392       break;
1393
1394     case CALL_EXPR:
1395       /* Negate -f(x) as f(-x).  */
1396       if (negate_mathfn_p (builtin_mathfn_code (t))
1397           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1398         {
1399           tree fndecl, arg;
1400
1401           fndecl = get_callee_fndecl (t);
1402           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1403           return build_call_expr (fndecl, 1, arg);
1404         }
1405       break;
1406
1407     case RSHIFT_EXPR:
1408       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1409       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1410         {
1411           tree op1 = TREE_OPERAND (t, 1);
1412           if (TREE_INT_CST_HIGH (op1) == 0
1413               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1414                  == TREE_INT_CST_LOW (op1))
1415             {
1416               tree ntype = TYPE_UNSIGNED (type)
1417                            ? signed_type_for (type)
1418                            : unsigned_type_for (type);
1419               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1420               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1421               return fold_convert (type, temp);
1422             }
1423         }
1424       break;
1425
1426     default:
1427       break;
1428     }
1429
1430   return NULL_TREE;
1431 }
1432
1433 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1434    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1435    return NULL_TREE. */
1436
1437 static tree
1438 negate_expr (tree t)
1439 {
1440   tree type, tem;
1441
1442   if (t == NULL_TREE)
1443     return NULL_TREE;
1444
1445   type = TREE_TYPE (t);
1446   STRIP_SIGN_NOPS (t);
1447
1448   tem = fold_negate_expr (t);
1449   if (!tem)
1450     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1451   return fold_convert (type, tem);
1452 }
1453 \f
1454 /* Split a tree IN into a constant, literal and variable parts that could be
1455    combined with CODE to make IN.  "constant" means an expression with
1456    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1457    commutative arithmetic operation.  Store the constant part into *CONP,
1458    the literal in *LITP and return the variable part.  If a part isn't
1459    present, set it to null.  If the tree does not decompose in this way,
1460    return the entire tree as the variable part and the other parts as null.
1461
1462    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1463    case, we negate an operand that was subtracted.  Except if it is a
1464    literal for which we use *MINUS_LITP instead.
1465
1466    If NEGATE_P is true, we are negating all of IN, again except a literal
1467    for which we use *MINUS_LITP instead.
1468
1469    If IN is itself a literal or constant, return it as appropriate.
1470
1471    Note that we do not guarantee that any of the three values will be the
1472    same type as IN, but they will have the same signedness and mode.  */
1473
1474 static tree
1475 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1476             tree *minus_litp, int negate_p)
1477 {
1478   tree var = 0;
1479
1480   *conp = 0;
1481   *litp = 0;
1482   *minus_litp = 0;
1483
1484   /* Strip any conversions that don't change the machine mode or signedness.  */
1485   STRIP_SIGN_NOPS (in);
1486
1487   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1488       || TREE_CODE (in) == FIXED_CST)
1489     *litp = in;
1490   else if (TREE_CODE (in) == code
1491            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1492                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1493                /* We can associate addition and subtraction together (even
1494                   though the C standard doesn't say so) for integers because
1495                   the value is not affected.  For reals, the value might be
1496                   affected, so we can't.  */
1497                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1498                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1499     {
1500       tree op0 = TREE_OPERAND (in, 0);
1501       tree op1 = TREE_OPERAND (in, 1);
1502       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1503       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1504
1505       /* First see if either of the operands is a literal, then a constant.  */
1506       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1507           || TREE_CODE (op0) == FIXED_CST)
1508         *litp = op0, op0 = 0;
1509       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1510                || TREE_CODE (op1) == FIXED_CST)
1511         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1512
1513       if (op0 != 0 && TREE_CONSTANT (op0))
1514         *conp = op0, op0 = 0;
1515       else if (op1 != 0 && TREE_CONSTANT (op1))
1516         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1517
1518       /* If we haven't dealt with either operand, this is not a case we can
1519          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1520       if (op0 != 0 && op1 != 0)
1521         var = in;
1522       else if (op0 != 0)
1523         var = op0;
1524       else
1525         var = op1, neg_var_p = neg1_p;
1526
1527       /* Now do any needed negations.  */
1528       if (neg_litp_p)
1529         *minus_litp = *litp, *litp = 0;
1530       if (neg_conp_p)
1531         *conp = negate_expr (*conp);
1532       if (neg_var_p)
1533         var = negate_expr (var);
1534     }
1535   else if (TREE_CONSTANT (in))
1536     *conp = in;
1537   else
1538     var = in;
1539
1540   if (negate_p)
1541     {
1542       if (*litp)
1543         *minus_litp = *litp, *litp = 0;
1544       else if (*minus_litp)
1545         *litp = *minus_litp, *minus_litp = 0;
1546       *conp = negate_expr (*conp);
1547       var = negate_expr (var);
1548     }
1549
1550   return var;
1551 }
1552
1553 /* Re-associate trees split by the above function.  T1 and T2 are either
1554    expressions to associate or null.  Return the new expression, if any.  If
1555    we build an operation, do it in TYPE and with CODE.  */
1556
1557 static tree
1558 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1559 {
1560   if (t1 == 0)
1561     return t2;
1562   else if (t2 == 0)
1563     return t1;
1564
1565   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1566      try to fold this since we will have infinite recursion.  But do
1567      deal with any NEGATE_EXPRs.  */
1568   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1569       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1570     {
1571       if (code == PLUS_EXPR)
1572         {
1573           if (TREE_CODE (t1) == NEGATE_EXPR)
1574             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1575                            fold_convert (type, TREE_OPERAND (t1, 0)));
1576           else if (TREE_CODE (t2) == NEGATE_EXPR)
1577             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1578                            fold_convert (type, TREE_OPERAND (t2, 0)));
1579           else if (integer_zerop (t2))
1580             return fold_convert (type, t1);
1581         }
1582       else if (code == MINUS_EXPR)
1583         {
1584           if (integer_zerop (t2))
1585             return fold_convert (type, t1);
1586         }
1587
1588       return build2 (code, type, fold_convert (type, t1),
1589                      fold_convert (type, t2));
1590     }
1591
1592   return fold_build2 (code, type, fold_convert (type, t1),
1593                       fold_convert (type, t2));
1594 }
1595 \f
1596 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1597    for use in int_const_binop, size_binop and size_diffop.  */
1598
1599 static bool
1600 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1601 {
1602   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1603     return false;
1604   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1605     return false;
1606
1607   switch (code)
1608     {
1609     case LSHIFT_EXPR:
1610     case RSHIFT_EXPR:
1611     case LROTATE_EXPR:
1612     case RROTATE_EXPR:
1613       return true;
1614
1615     default:
1616       break;
1617     }
1618
1619   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1620          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1621          && TYPE_MODE (type1) == TYPE_MODE (type2);
1622 }
1623
1624
1625 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1626    to produce a new constant.  Return NULL_TREE if we don't know how
1627    to evaluate CODE at compile-time.
1628
1629    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1630
1631 tree
1632 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1633 {
1634   unsigned HOST_WIDE_INT int1l, int2l;
1635   HOST_WIDE_INT int1h, int2h;
1636   unsigned HOST_WIDE_INT low;
1637   HOST_WIDE_INT hi;
1638   unsigned HOST_WIDE_INT garbagel;
1639   HOST_WIDE_INT garbageh;
1640   tree t;
1641   tree type = TREE_TYPE (arg1);
1642   int uns = TYPE_UNSIGNED (type);
1643   int is_sizetype
1644     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1645   int overflow = 0;
1646
1647   int1l = TREE_INT_CST_LOW (arg1);
1648   int1h = TREE_INT_CST_HIGH (arg1);
1649   int2l = TREE_INT_CST_LOW (arg2);
1650   int2h = TREE_INT_CST_HIGH (arg2);
1651
1652   switch (code)
1653     {
1654     case BIT_IOR_EXPR:
1655       low = int1l | int2l, hi = int1h | int2h;
1656       break;
1657
1658     case BIT_XOR_EXPR:
1659       low = int1l ^ int2l, hi = int1h ^ int2h;
1660       break;
1661
1662     case BIT_AND_EXPR:
1663       low = int1l & int2l, hi = int1h & int2h;
1664       break;
1665
1666     case RSHIFT_EXPR:
1667       int2l = -int2l;
1668     case LSHIFT_EXPR:
1669       /* It's unclear from the C standard whether shifts can overflow.
1670          The following code ignores overflow; perhaps a C standard
1671          interpretation ruling is needed.  */
1672       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1673                      &low, &hi, !uns);
1674       break;
1675
1676     case RROTATE_EXPR:
1677       int2l = - int2l;
1678     case LROTATE_EXPR:
1679       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1680                       &low, &hi);
1681       break;
1682
1683     case PLUS_EXPR:
1684       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1685       break;
1686
1687     case MINUS_EXPR:
1688       neg_double (int2l, int2h, &low, &hi);
1689       add_double (int1l, int1h, low, hi, &low, &hi);
1690       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1691       break;
1692
1693     case MULT_EXPR:
1694       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1695       break;
1696
1697     case TRUNC_DIV_EXPR:
1698     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1699     case EXACT_DIV_EXPR:
1700       /* This is a shortcut for a common special case.  */
1701       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1702           && !TREE_OVERFLOW (arg1)
1703           && !TREE_OVERFLOW (arg2)
1704           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1705         {
1706           if (code == CEIL_DIV_EXPR)
1707             int1l += int2l - 1;
1708
1709           low = int1l / int2l, hi = 0;
1710           break;
1711         }
1712
1713       /* ... fall through ...  */
1714
1715     case ROUND_DIV_EXPR:
1716       if (int2h == 0 && int2l == 0)
1717         return NULL_TREE;
1718       if (int2h == 0 && int2l == 1)
1719         {
1720           low = int1l, hi = int1h;
1721           break;
1722         }
1723       if (int1l == int2l && int1h == int2h
1724           && ! (int1l == 0 && int1h == 0))
1725         {
1726           low = 1, hi = 0;
1727           break;
1728         }
1729       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1730                                        &low, &hi, &garbagel, &garbageh);
1731       break;
1732
1733     case TRUNC_MOD_EXPR:
1734     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1735       /* This is a shortcut for a common special case.  */
1736       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1737           && !TREE_OVERFLOW (arg1)
1738           && !TREE_OVERFLOW (arg2)
1739           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1740         {
1741           if (code == CEIL_MOD_EXPR)
1742             int1l += int2l - 1;
1743           low = int1l % int2l, hi = 0;
1744           break;
1745         }
1746
1747       /* ... fall through ...  */
1748
1749     case ROUND_MOD_EXPR:
1750       if (int2h == 0 && int2l == 0)
1751         return NULL_TREE;
1752       overflow = div_and_round_double (code, uns,
1753                                        int1l, int1h, int2l, int2h,
1754                                        &garbagel, &garbageh, &low, &hi);
1755       break;
1756
1757     case MIN_EXPR:
1758     case MAX_EXPR:
1759       if (uns)
1760         low = (((unsigned HOST_WIDE_INT) int1h
1761                 < (unsigned HOST_WIDE_INT) int2h)
1762                || (((unsigned HOST_WIDE_INT) int1h
1763                     == (unsigned HOST_WIDE_INT) int2h)
1764                    && int1l < int2l));
1765       else
1766         low = (int1h < int2h
1767                || (int1h == int2h && int1l < int2l));
1768
1769       if (low == (code == MIN_EXPR))
1770         low = int1l, hi = int1h;
1771       else
1772         low = int2l, hi = int2h;
1773       break;
1774
1775     default:
1776       return NULL_TREE;
1777     }
1778
1779   if (notrunc)
1780     {
1781       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1782
1783       /* Propagate overflow flags ourselves.  */
1784       if (((!uns || is_sizetype) && overflow)
1785           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1786         {
1787           t = copy_node (t);
1788           TREE_OVERFLOW (t) = 1;
1789         }
1790     }
1791   else
1792     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1793                                ((!uns || is_sizetype) && overflow)
1794                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1795
1796   return t;
1797 }
1798
1799 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1800    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1801    are the same kind of constant and the same machine mode.  Return zero if
1802    combining the constants is not allowed in the current operating mode.
1803
1804    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1805
1806 static tree
1807 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1808 {
1809   /* Sanity check for the recursive cases.  */
1810   if (!arg1 || !arg2)
1811     return NULL_TREE;
1812
1813   STRIP_NOPS (arg1);
1814   STRIP_NOPS (arg2);
1815
1816   if (TREE_CODE (arg1) == INTEGER_CST)
1817     return int_const_binop (code, arg1, arg2, notrunc);
1818
1819   if (TREE_CODE (arg1) == REAL_CST)
1820     {
1821       enum machine_mode mode;
1822       REAL_VALUE_TYPE d1;
1823       REAL_VALUE_TYPE d2;
1824       REAL_VALUE_TYPE value;
1825       REAL_VALUE_TYPE result;
1826       bool inexact;
1827       tree t, type;
1828
1829       /* The following codes are handled by real_arithmetic.  */
1830       switch (code)
1831         {
1832         case PLUS_EXPR:
1833         case MINUS_EXPR:
1834         case MULT_EXPR:
1835         case RDIV_EXPR:
1836         case MIN_EXPR:
1837         case MAX_EXPR:
1838           break;
1839
1840         default:
1841           return NULL_TREE;
1842         }
1843
1844       d1 = TREE_REAL_CST (arg1);
1845       d2 = TREE_REAL_CST (arg2);
1846
1847       type = TREE_TYPE (arg1);
1848       mode = TYPE_MODE (type);
1849
1850       /* Don't perform operation if we honor signaling NaNs and
1851          either operand is a NaN.  */
1852       if (HONOR_SNANS (mode)
1853           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1854         return NULL_TREE;
1855
1856       /* Don't perform operation if it would raise a division
1857          by zero exception.  */
1858       if (code == RDIV_EXPR
1859           && REAL_VALUES_EQUAL (d2, dconst0)
1860           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1861         return NULL_TREE;
1862
1863       /* If either operand is a NaN, just return it.  Otherwise, set up
1864          for floating-point trap; we return an overflow.  */
1865       if (REAL_VALUE_ISNAN (d1))
1866         return arg1;
1867       else if (REAL_VALUE_ISNAN (d2))
1868         return arg2;
1869
1870       inexact = real_arithmetic (&value, code, &d1, &d2);
1871       real_convert (&result, mode, &value);
1872
1873       /* Don't constant fold this floating point operation if
1874          the result has overflowed and flag_trapping_math.  */
1875       if (flag_trapping_math
1876           && MODE_HAS_INFINITIES (mode)
1877           && REAL_VALUE_ISINF (result)
1878           && !REAL_VALUE_ISINF (d1)
1879           && !REAL_VALUE_ISINF (d2))
1880         return NULL_TREE;
1881
1882       /* Don't constant fold this floating point operation if the
1883          result may dependent upon the run-time rounding mode and
1884          flag_rounding_math is set, or if GCC's software emulation
1885          is unable to accurately represent the result.  */
1886       if ((flag_rounding_math
1887            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1888                && !flag_unsafe_math_optimizations))
1889           && (inexact || !real_identical (&result, &value)))
1890         return NULL_TREE;
1891
1892       t = build_real (type, result);
1893
1894       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1895       return t;
1896     }
1897
1898   if (TREE_CODE (arg1) == FIXED_CST)
1899     {
1900       FIXED_VALUE_TYPE f1;
1901       FIXED_VALUE_TYPE f2;
1902       FIXED_VALUE_TYPE result;
1903       tree t, type;
1904       int sat_p;
1905       bool overflow_p;
1906
1907       /* The following codes are handled by fixed_arithmetic.  */
1908       switch (code)
1909         {
1910         case PLUS_EXPR:
1911         case MINUS_EXPR:
1912         case MULT_EXPR:
1913         case TRUNC_DIV_EXPR:
1914           f2 = TREE_FIXED_CST (arg2);
1915           break;
1916
1917         case LSHIFT_EXPR:
1918         case RSHIFT_EXPR:
1919           f2.data.high = TREE_INT_CST_HIGH (arg2);
1920           f2.data.low = TREE_INT_CST_LOW (arg2);
1921           f2.mode = SImode;
1922           break;
1923
1924         default:
1925           return NULL_TREE;
1926         }
1927
1928       f1 = TREE_FIXED_CST (arg1);
1929       type = TREE_TYPE (arg1);
1930       sat_p = TYPE_SATURATING (type);
1931       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1932       t = build_fixed (type, result);
1933       /* Propagate overflow flags.  */
1934       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1935         {
1936           TREE_OVERFLOW (t) = 1;
1937           TREE_CONSTANT_OVERFLOW (t) = 1;
1938         }
1939       else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1940         TREE_CONSTANT_OVERFLOW (t) = 1;
1941       return t;
1942     }
1943
1944   if (TREE_CODE (arg1) == COMPLEX_CST)
1945     {
1946       tree type = TREE_TYPE (arg1);
1947       tree r1 = TREE_REALPART (arg1);
1948       tree i1 = TREE_IMAGPART (arg1);
1949       tree r2 = TREE_REALPART (arg2);
1950       tree i2 = TREE_IMAGPART (arg2);
1951       tree real, imag;
1952
1953       switch (code)
1954         {
1955         case PLUS_EXPR:
1956         case MINUS_EXPR:
1957           real = const_binop (code, r1, r2, notrunc);
1958           imag = const_binop (code, i1, i2, notrunc);
1959           break;
1960
1961         case MULT_EXPR:
1962           real = const_binop (MINUS_EXPR,
1963                               const_binop (MULT_EXPR, r1, r2, notrunc),
1964                               const_binop (MULT_EXPR, i1, i2, notrunc),
1965                               notrunc);
1966           imag = const_binop (PLUS_EXPR,
1967                               const_binop (MULT_EXPR, r1, i2, notrunc),
1968                               const_binop (MULT_EXPR, i1, r2, notrunc),
1969                               notrunc);
1970           break;
1971
1972         case RDIV_EXPR:
1973           {
1974             tree magsquared
1975               = const_binop (PLUS_EXPR,
1976                              const_binop (MULT_EXPR, r2, r2, notrunc),
1977                              const_binop (MULT_EXPR, i2, i2, notrunc),
1978                              notrunc);
1979             tree t1
1980               = const_binop (PLUS_EXPR,
1981                              const_binop (MULT_EXPR, r1, r2, notrunc),
1982                              const_binop (MULT_EXPR, i1, i2, notrunc),
1983                              notrunc);
1984             tree t2
1985               = const_binop (MINUS_EXPR,
1986                              const_binop (MULT_EXPR, i1, r2, notrunc),
1987                              const_binop (MULT_EXPR, r1, i2, notrunc),
1988                              notrunc);
1989
1990             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1991               code = TRUNC_DIV_EXPR;
1992
1993             real = const_binop (code, t1, magsquared, notrunc);
1994             imag = const_binop (code, t2, magsquared, notrunc);
1995           }
1996           break;
1997
1998         default:
1999           return NULL_TREE;
2000         }
2001
2002       if (real && imag)
2003         return build_complex (type, real, imag);
2004     }
2005
2006   return NULL_TREE;
2007 }
2008
2009 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2010    indicates which particular sizetype to create.  */
2011
2012 tree
2013 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2014 {
2015   return build_int_cst (sizetype_tab[(int) kind], number);
2016 }
2017 \f
2018 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2019    is a tree code.  The type of the result is taken from the operands.
2020    Both must be equivalent integer types, ala int_binop_types_match_p.
2021    If the operands are constant, so is the result.  */
2022
2023 tree
2024 size_binop (enum tree_code code, tree arg0, tree arg1)
2025 {
2026   tree type = TREE_TYPE (arg0);
2027
2028   if (arg0 == error_mark_node || arg1 == error_mark_node)
2029     return error_mark_node;
2030
2031   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2032                                        TREE_TYPE (arg1)));
2033
2034   /* Handle the special case of two integer constants faster.  */
2035   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2036     {
2037       /* And some specific cases even faster than that.  */
2038       if (code == PLUS_EXPR)
2039         {
2040           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2041             return arg1;
2042           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2043             return arg0;
2044         }
2045       else if (code == MINUS_EXPR)
2046         {
2047           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2048             return arg0;
2049         }
2050       else if (code == MULT_EXPR)
2051         {
2052           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2053             return arg1;
2054         }
2055
2056       /* Handle general case of two integer constants.  */
2057       return int_const_binop (code, arg0, arg1, 0);
2058     }
2059
2060   return fold_build2 (code, type, arg0, arg1);
2061 }
2062
2063 /* Given two values, either both of sizetype or both of bitsizetype,
2064    compute the difference between the two values.  Return the value
2065    in signed type corresponding to the type of the operands.  */
2066
2067 tree
2068 size_diffop (tree arg0, tree arg1)
2069 {
2070   tree type = TREE_TYPE (arg0);
2071   tree ctype;
2072
2073   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2074                                        TREE_TYPE (arg1)));
2075
2076   /* If the type is already signed, just do the simple thing.  */
2077   if (!TYPE_UNSIGNED (type))
2078     return size_binop (MINUS_EXPR, arg0, arg1);
2079
2080   if (type == sizetype)
2081     ctype = ssizetype;
2082   else if (type == bitsizetype)
2083     ctype = sbitsizetype;
2084   else
2085     ctype = signed_type_for (type);
2086
2087   /* If either operand is not a constant, do the conversions to the signed
2088      type and subtract.  The hardware will do the right thing with any
2089      overflow in the subtraction.  */
2090   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2091     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2092                        fold_convert (ctype, arg1));
2093
2094   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2095      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2096      overflow) and negate (which can't either).  Special-case a result
2097      of zero while we're here.  */
2098   if (tree_int_cst_equal (arg0, arg1))
2099     return build_int_cst (ctype, 0);
2100   else if (tree_int_cst_lt (arg1, arg0))
2101     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2102   else
2103     return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2104                        fold_convert (ctype, size_binop (MINUS_EXPR,
2105                                                         arg1, arg0)));
2106 }
2107 \f
2108 /* A subroutine of fold_convert_const handling conversions of an
2109    INTEGER_CST to another integer type.  */
2110
2111 static tree
2112 fold_convert_const_int_from_int (tree type, const_tree arg1)
2113 {
2114   tree t;
2115
2116   /* Given an integer constant, make new constant with new type,
2117      appropriately sign-extended or truncated.  */
2118   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2119                              TREE_INT_CST_HIGH (arg1),
2120                              /* Don't set the overflow when
2121                                 converting from a pointer,  */
2122                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2123                              /* or to a sizetype with same signedness
2124                                 and the precision is unchanged.
2125                                 ???  sizetype is always sign-extended,
2126                                 but its signedness depends on the
2127                                 frontend.  Thus we see spurious overflows
2128                                 here if we do not check this.  */
2129                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2130                                    == TYPE_PRECISION (type))
2131                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2132                                       == TYPE_UNSIGNED (type))
2133                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2134                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2135                                       || (TREE_CODE (type) == INTEGER_TYPE
2136                                           && TYPE_IS_SIZETYPE (type)))),
2137                              (TREE_INT_CST_HIGH (arg1) < 0
2138                               && (TYPE_UNSIGNED (type)
2139                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2140                              | TREE_OVERFLOW (arg1));
2141
2142   return t;
2143 }
2144
2145 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2146    to an integer type.  */
2147
2148 static tree
2149 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2150 {
2151   int overflow = 0;
2152   tree t;
2153
2154   /* The following code implements the floating point to integer
2155      conversion rules required by the Java Language Specification,
2156      that IEEE NaNs are mapped to zero and values that overflow
2157      the target precision saturate, i.e. values greater than
2158      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2159      are mapped to INT_MIN.  These semantics are allowed by the
2160      C and C++ standards that simply state that the behavior of
2161      FP-to-integer conversion is unspecified upon overflow.  */
2162
2163   HOST_WIDE_INT high, low;
2164   REAL_VALUE_TYPE r;
2165   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2166
2167   switch (code)
2168     {
2169     case FIX_TRUNC_EXPR:
2170       real_trunc (&r, VOIDmode, &x);
2171       break;
2172
2173     default:
2174       gcc_unreachable ();
2175     }
2176
2177   /* If R is NaN, return zero and show we have an overflow.  */
2178   if (REAL_VALUE_ISNAN (r))
2179     {
2180       overflow = 1;
2181       high = 0;
2182       low = 0;
2183     }
2184
2185   /* See if R is less than the lower bound or greater than the
2186      upper bound.  */
2187
2188   if (! overflow)
2189     {
2190       tree lt = TYPE_MIN_VALUE (type);
2191       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2192       if (REAL_VALUES_LESS (r, l))
2193         {
2194           overflow = 1;
2195           high = TREE_INT_CST_HIGH (lt);
2196           low = TREE_INT_CST_LOW (lt);
2197         }
2198     }
2199
2200   if (! overflow)
2201     {
2202       tree ut = TYPE_MAX_VALUE (type);
2203       if (ut)
2204         {
2205           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2206           if (REAL_VALUES_LESS (u, r))
2207             {
2208               overflow = 1;
2209               high = TREE_INT_CST_HIGH (ut);
2210               low = TREE_INT_CST_LOW (ut);
2211             }
2212         }
2213     }
2214
2215   if (! overflow)
2216     REAL_VALUE_TO_INT (&low, &high, r);
2217
2218   t = force_fit_type_double (type, low, high, -1,
2219                              overflow | TREE_OVERFLOW (arg1));
2220   return t;
2221 }
2222
2223 /* A subroutine of fold_convert_const handling conversions of a
2224    FIXED_CST to an integer type.  */
2225
2226 static tree
2227 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2228 {
2229   tree t;
2230   double_int temp, temp_trunc;
2231   unsigned int mode;
2232
2233   /* Right shift FIXED_CST to temp by fbit.  */
2234   temp = TREE_FIXED_CST (arg1).data;
2235   mode = TREE_FIXED_CST (arg1).mode;
2236   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2237     {
2238       lshift_double (temp.low, temp.high,
2239                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2240                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2241
2242       /* Left shift temp to temp_trunc by fbit.  */
2243       lshift_double (temp.low, temp.high,
2244                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2245                      &temp_trunc.low, &temp_trunc.high,
2246                      SIGNED_FIXED_POINT_MODE_P (mode));
2247     }
2248   else
2249     {
2250       temp.low = 0;
2251       temp.high = 0;
2252       temp_trunc.low = 0;
2253       temp_trunc.high = 0;
2254     }
2255
2256   /* If FIXED_CST is negative, we need to round the value toward 0.
2257      By checking if the fractional bits are not zero to add 1 to temp.  */
2258   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2259       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2260     {
2261       double_int one;
2262       one.low = 1;
2263       one.high = 0;
2264       temp = double_int_add (temp, one);
2265     }
2266
2267   /* Given a fixed-point constant, make new constant with new type,
2268      appropriately sign-extended or truncated.  */
2269   t = force_fit_type_double (type, temp.low, temp.high, -1,
2270                              (temp.high < 0
2271                               && (TYPE_UNSIGNED (type)
2272                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2273                              | TREE_OVERFLOW (arg1));
2274
2275   return t;
2276 }
2277
2278 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2279    to another floating point type.  */
2280
2281 static tree
2282 fold_convert_const_real_from_real (tree type, const_tree arg1)
2283 {
2284   REAL_VALUE_TYPE value;
2285   tree t;
2286
2287   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2288   t = build_real (type, value);
2289
2290   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2291   return t;
2292 }
2293
2294 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2295    to a floating point type.  */
2296
2297 static tree
2298 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2299 {
2300   REAL_VALUE_TYPE value;
2301   tree t;
2302
2303   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2304   t = build_real (type, value);
2305
2306   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2307   TREE_CONSTANT_OVERFLOW (t)
2308     = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
2309   return t;
2310 }
2311
2312 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2313    to another fixed-point type.  */
2314
2315 static tree
2316 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2317 {
2318   FIXED_VALUE_TYPE value;
2319   tree t;
2320   bool overflow_p;
2321
2322   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2323                               TYPE_SATURATING (type));
2324   t = build_fixed (type, value);
2325
2326   /* Propagate overflow flags.  */
2327   if (overflow_p | TREE_OVERFLOW (arg1))
2328     {
2329       TREE_OVERFLOW (t) = 1;
2330       TREE_CONSTANT_OVERFLOW (t) = 1;
2331     }
2332   else if (TREE_CONSTANT_OVERFLOW (arg1))
2333     TREE_CONSTANT_OVERFLOW (t) = 1;
2334   return t;
2335 }
2336
2337 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2338    to a fixed-point type.  */
2339
2340 static tree
2341 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2342 {
2343   FIXED_VALUE_TYPE value;
2344   tree t;
2345   bool overflow_p;
2346
2347   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2348                                        TREE_INT_CST (arg1),
2349                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2350                                        TYPE_SATURATING (type));
2351   t = build_fixed (type, value);
2352
2353   /* Propagate overflow flags.  */
2354   if (overflow_p | TREE_OVERFLOW (arg1))
2355     {
2356       TREE_OVERFLOW (t) = 1;
2357       TREE_CONSTANT_OVERFLOW (t) = 1;
2358     }
2359   else if (TREE_CONSTANT_OVERFLOW (arg1))
2360     TREE_CONSTANT_OVERFLOW (t) = 1;
2361   return t;
2362 }
2363
2364 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2365    to a fixed-point type.  */
2366
2367 static tree
2368 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2369 {
2370   FIXED_VALUE_TYPE value;
2371   tree t;
2372   bool overflow_p;
2373
2374   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2375                                         &TREE_REAL_CST (arg1),
2376                                         TYPE_SATURATING (type));
2377   t = build_fixed (type, value);
2378
2379   /* Propagate overflow flags.  */
2380   if (overflow_p | TREE_OVERFLOW (arg1))
2381     {
2382       TREE_OVERFLOW (t) = 1;
2383       TREE_CONSTANT_OVERFLOW (t) = 1;
2384     }
2385   else if (TREE_CONSTANT_OVERFLOW (arg1))
2386     TREE_CONSTANT_OVERFLOW (t) = 1;
2387   return t;
2388 }
2389
2390 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2391    type TYPE.  If no simplification can be done return NULL_TREE.  */
2392
2393 static tree
2394 fold_convert_const (enum tree_code code, tree type, tree arg1)
2395 {
2396   if (TREE_TYPE (arg1) == type)
2397     return arg1;
2398
2399   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2400     {
2401       if (TREE_CODE (arg1) == INTEGER_CST)
2402         return fold_convert_const_int_from_int (type, arg1);
2403       else if (TREE_CODE (arg1) == REAL_CST)
2404         return fold_convert_const_int_from_real (code, type, arg1);
2405       else if (TREE_CODE (arg1) == FIXED_CST)
2406         return fold_convert_const_int_from_fixed (type, arg1);
2407     }
2408   else if (TREE_CODE (type) == REAL_TYPE)
2409     {
2410       if (TREE_CODE (arg1) == INTEGER_CST)
2411         return build_real_from_int_cst (type, arg1);
2412       else if (TREE_CODE (arg1) == REAL_CST)
2413         return fold_convert_const_real_from_real (type, arg1);
2414       else if (TREE_CODE (arg1) == FIXED_CST)
2415         return fold_convert_const_real_from_fixed (type, arg1);
2416     }
2417   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2418     {
2419       if (TREE_CODE (arg1) == FIXED_CST)
2420         return fold_convert_const_fixed_from_fixed (type, arg1);
2421       else if (TREE_CODE (arg1) == INTEGER_CST)
2422         return fold_convert_const_fixed_from_int (type, arg1);
2423       else if (TREE_CODE (arg1) == REAL_CST)
2424         return fold_convert_const_fixed_from_real (type, arg1);
2425     }
2426   return NULL_TREE;
2427 }
2428
2429 /* Construct a vector of zero elements of vector type TYPE.  */
2430
2431 static tree
2432 build_zero_vector (tree type)
2433 {
2434   tree elem, list;
2435   int i, units;
2436
2437   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2438   units = TYPE_VECTOR_SUBPARTS (type);
2439   
2440   list = NULL_TREE;
2441   for (i = 0; i < units; i++)
2442     list = tree_cons (NULL_TREE, elem, list);
2443   return build_vector (type, list);
2444 }
2445
2446 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2447
2448 bool
2449 fold_convertible_p (const_tree type, const_tree arg)
2450 {
2451   tree orig = TREE_TYPE (arg);
2452
2453   if (type == orig)
2454     return true;
2455
2456   if (TREE_CODE (arg) == ERROR_MARK
2457       || TREE_CODE (type) == ERROR_MARK
2458       || TREE_CODE (orig) == ERROR_MARK)
2459     return false;
2460
2461   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2462     return true;
2463
2464   switch (TREE_CODE (type))
2465     {
2466     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2467     case POINTER_TYPE: case REFERENCE_TYPE:
2468     case OFFSET_TYPE:
2469       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2470           || TREE_CODE (orig) == OFFSET_TYPE)
2471         return true;
2472       return (TREE_CODE (orig) == VECTOR_TYPE
2473               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2474
2475     case REAL_TYPE:
2476     case FIXED_POINT_TYPE:
2477     case COMPLEX_TYPE:
2478     case VECTOR_TYPE:
2479     case VOID_TYPE:
2480       return TREE_CODE (type) == TREE_CODE (orig);
2481
2482     default:
2483       return false;
2484     }
2485 }
2486
2487 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2488    simple conversions in preference to calling the front-end's convert.  */
2489
2490 tree
2491 fold_convert (tree type, tree arg)
2492 {
2493   tree orig = TREE_TYPE (arg);
2494   tree tem;
2495
2496   if (type == orig)
2497     return arg;
2498
2499   if (TREE_CODE (arg) == ERROR_MARK
2500       || TREE_CODE (type) == ERROR_MARK
2501       || TREE_CODE (orig) == ERROR_MARK)
2502     return error_mark_node;
2503
2504   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2505     return fold_build1 (NOP_EXPR, type, arg);
2506
2507   switch (TREE_CODE (type))
2508     {
2509     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2510     case POINTER_TYPE: case REFERENCE_TYPE:
2511     case OFFSET_TYPE:
2512       if (TREE_CODE (arg) == INTEGER_CST)
2513         {
2514           tem = fold_convert_const (NOP_EXPR, type, arg);
2515           if (tem != NULL_TREE)
2516             return tem;
2517         }
2518       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2519           || TREE_CODE (orig) == OFFSET_TYPE)
2520         return fold_build1 (NOP_EXPR, type, arg);
2521       if (TREE_CODE (orig) == COMPLEX_TYPE)
2522         {
2523           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2524           return fold_convert (type, tem);
2525         }
2526       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2527                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2528       return fold_build1 (NOP_EXPR, type, arg);
2529
2530     case REAL_TYPE:
2531       if (TREE_CODE (arg) == INTEGER_CST)
2532         {
2533           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2534           if (tem != NULL_TREE)
2535             return tem;
2536         }
2537       else if (TREE_CODE (arg) == REAL_CST)
2538         {
2539           tem = fold_convert_const (NOP_EXPR, type, arg);
2540           if (tem != NULL_TREE)
2541             return tem;
2542         }
2543       else if (TREE_CODE (arg) == FIXED_CST)
2544         {
2545           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2546           if (tem != NULL_TREE)
2547             return tem;
2548         }
2549
2550       switch (TREE_CODE (orig))
2551         {
2552         case INTEGER_TYPE:
2553         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2554         case POINTER_TYPE: case REFERENCE_TYPE:
2555           return fold_build1 (FLOAT_EXPR, type, arg);
2556
2557         case REAL_TYPE:
2558           return fold_build1 (NOP_EXPR, type, arg);
2559
2560         case FIXED_POINT_TYPE:
2561           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2562
2563         case COMPLEX_TYPE:
2564           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2565           return fold_convert (type, tem);
2566
2567         default:
2568           gcc_unreachable ();
2569         }
2570
2571     case FIXED_POINT_TYPE:
2572       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2573           || TREE_CODE (arg) == REAL_CST)
2574         {
2575           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2576           if (tem != NULL_TREE)
2577             return tem;
2578         }
2579
2580       switch (TREE_CODE (orig))
2581         {
2582         case FIXED_POINT_TYPE:
2583         case INTEGER_TYPE:
2584         case ENUMERAL_TYPE:
2585         case BOOLEAN_TYPE:
2586         case REAL_TYPE:
2587           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2588
2589         case COMPLEX_TYPE:
2590           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2591           return fold_convert (type, tem);
2592
2593         default:
2594           gcc_unreachable ();
2595         }
2596
2597     case COMPLEX_TYPE:
2598       switch (TREE_CODE (orig))
2599         {
2600         case INTEGER_TYPE:
2601         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2602         case POINTER_TYPE: case REFERENCE_TYPE:
2603         case REAL_TYPE:
2604         case FIXED_POINT_TYPE:
2605           return build2 (COMPLEX_EXPR, type,
2606                          fold_convert (TREE_TYPE (type), arg),
2607                          fold_convert (TREE_TYPE (type), integer_zero_node));
2608         case COMPLEX_TYPE:
2609           {
2610             tree rpart, ipart;
2611
2612             if (TREE_CODE (arg) == COMPLEX_EXPR)
2613               {
2614                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2615                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2616                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2617               }
2618
2619             arg = save_expr (arg);
2620             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2621             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2622             rpart = fold_convert (TREE_TYPE (type), rpart);
2623             ipart = fold_convert (TREE_TYPE (type), ipart);
2624             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2625           }
2626
2627         default:
2628           gcc_unreachable ();
2629         }
2630
2631     case VECTOR_TYPE:
2632       if (integer_zerop (arg))
2633         return build_zero_vector (type);
2634       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2635       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2636                   || TREE_CODE (orig) == VECTOR_TYPE);
2637       return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2638
2639     case VOID_TYPE:
2640       tem = fold_ignored_result (arg);
2641       if (TREE_CODE (tem) == GIMPLE_MODIFY_STMT)
2642         return tem;
2643       return fold_build1 (NOP_EXPR, type, tem);
2644
2645     default:
2646       gcc_unreachable ();
2647     }
2648 }
2649 \f
2650 /* Return false if expr can be assumed not to be an lvalue, true
2651    otherwise.  */
2652
2653 static bool
2654 maybe_lvalue_p (const_tree x)
2655 {
2656   /* We only need to wrap lvalue tree codes.  */
2657   switch (TREE_CODE (x))
2658   {
2659   case VAR_DECL:
2660   case PARM_DECL:
2661   case RESULT_DECL:
2662   case LABEL_DECL:
2663   case FUNCTION_DECL:
2664   case SSA_NAME:
2665
2666   case COMPONENT_REF:
2667   case INDIRECT_REF:
2668   case ALIGN_INDIRECT_REF:
2669   case MISALIGNED_INDIRECT_REF:
2670   case ARRAY_REF:
2671   case ARRAY_RANGE_REF:
2672   case BIT_FIELD_REF:
2673   case OBJ_TYPE_REF:
2674
2675   case REALPART_EXPR:
2676   case IMAGPART_EXPR:
2677   case PREINCREMENT_EXPR:
2678   case PREDECREMENT_EXPR:
2679   case SAVE_EXPR:
2680   case TRY_CATCH_EXPR:
2681   case WITH_CLEANUP_EXPR:
2682   case COMPOUND_EXPR:
2683   case MODIFY_EXPR:
2684   case GIMPLE_MODIFY_STMT:
2685   case TARGET_EXPR:
2686   case COND_EXPR:
2687   case BIND_EXPR:
2688   case MIN_EXPR:
2689   case MAX_EXPR:
2690     break;
2691
2692   default:
2693     /* Assume the worst for front-end tree codes.  */
2694     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2695       break;
2696     return false;
2697   }
2698
2699   return true;
2700 }
2701
2702 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2703
2704 tree
2705 non_lvalue (tree x)
2706 {
2707   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2708      us.  */
2709   if (in_gimple_form)
2710     return x;
2711
2712   if (! maybe_lvalue_p (x))
2713     return x;
2714   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2715 }
2716
2717 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2718    Zero means allow extended lvalues.  */
2719
2720 int pedantic_lvalues;
2721
2722 /* When pedantic, return an expr equal to X but certainly not valid as a
2723    pedantic lvalue.  Otherwise, return X.  */
2724
2725 static tree
2726 pedantic_non_lvalue (tree x)
2727 {
2728   if (pedantic_lvalues)
2729     return non_lvalue (x);
2730   else
2731     return x;
2732 }
2733 \f
2734 /* Given a tree comparison code, return the code that is the logical inverse
2735    of the given code.  It is not safe to do this for floating-point
2736    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2737    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2738
2739 enum tree_code
2740 invert_tree_comparison (enum tree_code code, bool honor_nans)
2741 {
2742   if (honor_nans && flag_trapping_math)
2743     return ERROR_MARK;
2744
2745   switch (code)
2746     {
2747     case EQ_EXPR:
2748       return NE_EXPR;
2749     case NE_EXPR:
2750       return EQ_EXPR;
2751     case GT_EXPR:
2752       return honor_nans ? UNLE_EXPR : LE_EXPR;
2753     case GE_EXPR:
2754       return honor_nans ? UNLT_EXPR : LT_EXPR;
2755     case LT_EXPR:
2756       return honor_nans ? UNGE_EXPR : GE_EXPR;
2757     case LE_EXPR:
2758       return honor_nans ? UNGT_EXPR : GT_EXPR;
2759     case LTGT_EXPR:
2760       return UNEQ_EXPR;
2761     case UNEQ_EXPR:
2762       return LTGT_EXPR;
2763     case UNGT_EXPR:
2764       return LE_EXPR;
2765     case UNGE_EXPR:
2766       return LT_EXPR;
2767     case UNLT_EXPR:
2768       return GE_EXPR;
2769     case UNLE_EXPR:
2770       return GT_EXPR;
2771     case ORDERED_EXPR:
2772       return UNORDERED_EXPR;
2773     case UNORDERED_EXPR:
2774       return ORDERED_EXPR;
2775     default:
2776       gcc_unreachable ();
2777     }
2778 }
2779
2780 /* Similar, but return the comparison that results if the operands are
2781    swapped.  This is safe for floating-point.  */
2782
2783 enum tree_code
2784 swap_tree_comparison (enum tree_code code)
2785 {
2786   switch (code)
2787     {
2788     case EQ_EXPR:
2789     case NE_EXPR:
2790     case ORDERED_EXPR:
2791     case UNORDERED_EXPR:
2792     case LTGT_EXPR:
2793     case UNEQ_EXPR:
2794       return code;
2795     case GT_EXPR:
2796       return LT_EXPR;
2797     case GE_EXPR:
2798       return LE_EXPR;
2799     case LT_EXPR:
2800       return GT_EXPR;
2801     case LE_EXPR:
2802       return GE_EXPR;
2803     case UNGT_EXPR:
2804       return UNLT_EXPR;
2805     case UNGE_EXPR:
2806       return UNLE_EXPR;
2807     case UNLT_EXPR:
2808       return UNGT_EXPR;
2809     case UNLE_EXPR:
2810       return UNGE_EXPR;
2811     default:
2812       gcc_unreachable ();
2813     }
2814 }
2815
2816
2817 /* Convert a comparison tree code from an enum tree_code representation
2818    into a compcode bit-based encoding.  This function is the inverse of
2819    compcode_to_comparison.  */
2820
2821 static enum comparison_code
2822 comparison_to_compcode (enum tree_code code)
2823 {
2824   switch (code)
2825     {
2826     case LT_EXPR:
2827       return COMPCODE_LT;
2828     case EQ_EXPR:
2829       return COMPCODE_EQ;
2830     case LE_EXPR:
2831       return COMPCODE_LE;
2832     case GT_EXPR:
2833       return COMPCODE_GT;
2834     case NE_EXPR:
2835       return COMPCODE_NE;
2836     case GE_EXPR:
2837       return COMPCODE_GE;
2838     case ORDERED_EXPR:
2839       return COMPCODE_ORD;
2840     case UNORDERED_EXPR:
2841       return COMPCODE_UNORD;
2842     case UNLT_EXPR:
2843       return COMPCODE_UNLT;
2844     case UNEQ_EXPR:
2845       return COMPCODE_UNEQ;
2846     case UNLE_EXPR:
2847       return COMPCODE_UNLE;
2848     case UNGT_EXPR:
2849       return COMPCODE_UNGT;
2850     case LTGT_EXPR:
2851       return COMPCODE_LTGT;
2852     case UNGE_EXPR:
2853       return COMPCODE_UNGE;
2854     default:
2855       gcc_unreachable ();
2856     }
2857 }
2858
2859 /* Convert a compcode bit-based encoding of a comparison operator back
2860    to GCC's enum tree_code representation.  This function is the
2861    inverse of comparison_to_compcode.  */
2862
2863 static enum tree_code
2864 compcode_to_comparison (enum comparison_code code)
2865 {
2866   switch (code)
2867     {
2868     case COMPCODE_LT:
2869       return LT_EXPR;
2870     case COMPCODE_EQ:
2871       return EQ_EXPR;
2872     case COMPCODE_LE:
2873       return LE_EXPR;
2874     case COMPCODE_GT:
2875       return GT_EXPR;
2876     case COMPCODE_NE:
2877       return NE_EXPR;
2878     case COMPCODE_GE:
2879       return GE_EXPR;
2880     case COMPCODE_ORD:
2881       return ORDERED_EXPR;
2882     case COMPCODE_UNORD:
2883       return UNORDERED_EXPR;
2884     case COMPCODE_UNLT:
2885       return UNLT_EXPR;
2886     case COMPCODE_UNEQ:
2887       return UNEQ_EXPR;
2888     case COMPCODE_UNLE:
2889       return UNLE_EXPR;
2890     case COMPCODE_UNGT:
2891       return UNGT_EXPR;
2892     case COMPCODE_LTGT:
2893       return LTGT_EXPR;
2894     case COMPCODE_UNGE:
2895       return UNGE_EXPR;
2896     default:
2897       gcc_unreachable ();
2898     }
2899 }
2900
2901 /* Return a tree for the comparison which is the combination of
2902    doing the AND or OR (depending on CODE) of the two operations LCODE
2903    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2904    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2905    if this makes the transformation invalid.  */
2906
2907 tree
2908 combine_comparisons (enum tree_code code, enum tree_code lcode,
2909                      enum tree_code rcode, tree truth_type,
2910                      tree ll_arg, tree lr_arg)
2911 {
2912   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2913   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2914   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2915   enum comparison_code compcode;
2916
2917   switch (code)
2918     {
2919     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2920       compcode = lcompcode & rcompcode;
2921       break;
2922
2923     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2924       compcode = lcompcode | rcompcode;
2925       break;
2926
2927     default:
2928       return NULL_TREE;
2929     }
2930
2931   if (!honor_nans)
2932     {
2933       /* Eliminate unordered comparisons, as well as LTGT and ORD
2934          which are not used unless the mode has NaNs.  */
2935       compcode &= ~COMPCODE_UNORD;
2936       if (compcode == COMPCODE_LTGT)
2937         compcode = COMPCODE_NE;
2938       else if (compcode == COMPCODE_ORD)
2939         compcode = COMPCODE_TRUE;
2940     }
2941    else if (flag_trapping_math)
2942      {
2943         /* Check that the original operation and the optimized ones will trap
2944            under the same condition.  */
2945         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2946                      && (lcompcode != COMPCODE_EQ)
2947                      && (lcompcode != COMPCODE_ORD);
2948         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2949                      && (rcompcode != COMPCODE_EQ)
2950                      && (rcompcode != COMPCODE_ORD);
2951         bool trap = (compcode & COMPCODE_UNORD) == 0
2952                     && (compcode != COMPCODE_EQ)
2953                     && (compcode != COMPCODE_ORD);
2954
2955         /* In a short-circuited boolean expression the LHS might be
2956            such that the RHS, if evaluated, will never trap.  For
2957            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2958            if neither x nor y is NaN.  (This is a mixed blessing: for
2959            example, the expression above will never trap, hence
2960            optimizing it to x < y would be invalid).  */
2961         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2962             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2963           rtrap = false;
2964
2965         /* If the comparison was short-circuited, and only the RHS
2966            trapped, we may now generate a spurious trap.  */
2967         if (rtrap && !ltrap
2968             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2969           return NULL_TREE;
2970
2971         /* If we changed the conditions that cause a trap, we lose.  */
2972         if ((ltrap || rtrap) != trap)
2973           return NULL_TREE;
2974       }
2975
2976   if (compcode == COMPCODE_TRUE)
2977     return constant_boolean_node (true, truth_type);
2978   else if (compcode == COMPCODE_FALSE)
2979     return constant_boolean_node (false, truth_type);
2980   else
2981     return fold_build2 (compcode_to_comparison (compcode),
2982                         truth_type, ll_arg, lr_arg);
2983 }
2984
2985 /* Return nonzero if CODE is a tree code that represents a truth value.  */
2986
2987 static int
2988 truth_value_p (enum tree_code code)
2989 {
2990   return (TREE_CODE_CLASS (code) == tcc_comparison
2991           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2992           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2993           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2994 }
2995 \f
2996 /* Return nonzero if two operands (typically of the same tree node)
2997    are necessarily equal.  If either argument has side-effects this
2998    function returns zero.  FLAGS modifies behavior as follows:
2999
3000    If OEP_ONLY_CONST is set, only return nonzero for constants.
3001    This function tests whether the operands are indistinguishable;
3002    it does not test whether they are equal using C's == operation.
3003    The distinction is important for IEEE floating point, because
3004    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3005    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3006
3007    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3008    even though it may hold multiple values during a function.
3009    This is because a GCC tree node guarantees that nothing else is
3010    executed between the evaluation of its "operands" (which may often
3011    be evaluated in arbitrary order).  Hence if the operands themselves
3012    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3013    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3014    unset means assuming isochronic (or instantaneous) tree equivalence.
3015    Unless comparing arbitrary expression trees, such as from different
3016    statements, this flag can usually be left unset.
3017
3018    If OEP_PURE_SAME is set, then pure functions with identical arguments
3019    are considered the same.  It is used when the caller has other ways
3020    to ensure that global memory is unchanged in between.  */
3021
3022 int
3023 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3024 {
3025   /* If either is ERROR_MARK, they aren't equal.  */
3026   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3027     return 0;
3028
3029   /* If both types don't have the same signedness, then we can't consider
3030      them equal.  We must check this before the STRIP_NOPS calls
3031      because they may change the signedness of the arguments.  */
3032   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3033     return 0;
3034
3035   /* If both types don't have the same precision, then it is not safe
3036      to strip NOPs.  */
3037   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3038     return 0;
3039
3040   STRIP_NOPS (arg0);
3041   STRIP_NOPS (arg1);
3042
3043   /* In case both args are comparisons but with different comparison
3044      code, try to swap the comparison operands of one arg to produce
3045      a match and compare that variant.  */
3046   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3047       && COMPARISON_CLASS_P (arg0)
3048       && COMPARISON_CLASS_P (arg1))
3049     {
3050       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3051
3052       if (TREE_CODE (arg0) == swap_code)
3053         return operand_equal_p (TREE_OPERAND (arg0, 0),
3054                                 TREE_OPERAND (arg1, 1), flags)
3055                && operand_equal_p (TREE_OPERAND (arg0, 1),
3056                                    TREE_OPERAND (arg1, 0), flags);
3057     }
3058
3059   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3060       /* This is needed for conversions and for COMPONENT_REF.
3061          Might as well play it safe and always test this.  */
3062       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3063       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3064       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3065     return 0;
3066
3067   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3068      We don't care about side effects in that case because the SAVE_EXPR
3069      takes care of that for us. In all other cases, two expressions are
3070      equal if they have no side effects.  If we have two identical
3071      expressions with side effects that should be treated the same due
3072      to the only side effects being identical SAVE_EXPR's, that will
3073      be detected in the recursive calls below.  */
3074   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3075       && (TREE_CODE (arg0) == SAVE_EXPR
3076           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3077     return 1;
3078
3079   /* Next handle constant cases, those for which we can return 1 even
3080      if ONLY_CONST is set.  */
3081   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3082     switch (TREE_CODE (arg0))
3083       {
3084       case INTEGER_CST:
3085         return tree_int_cst_equal (arg0, arg1);
3086
3087       case FIXED_CST:
3088         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3089                                        TREE_FIXED_CST (arg1));
3090
3091       case REAL_CST:
3092         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3093                                    TREE_REAL_CST (arg1)))
3094           return 1;
3095
3096         
3097         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3098           {
3099             /* If we do not distinguish between signed and unsigned zero,
3100                consider them equal.  */
3101             if (real_zerop (arg0) && real_zerop (arg1))
3102               return 1;
3103           }
3104         return 0;
3105
3106       case VECTOR_CST:
3107         {
3108           tree v1, v2;
3109
3110           v1 = TREE_VECTOR_CST_ELTS (arg0);
3111           v2 = TREE_VECTOR_CST_ELTS (arg1);
3112           while (v1 && v2)
3113             {
3114               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3115                                     flags))
3116                 return 0;
3117               v1 = TREE_CHAIN (v1);
3118               v2 = TREE_CHAIN (v2);
3119             }
3120
3121           return v1 == v2;
3122         }
3123
3124       case COMPLEX_CST:
3125         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3126                                  flags)
3127                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3128                                     flags));
3129
3130       case STRING_CST:
3131         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3132                 && ! memcmp (TREE_STRING_POINTER (arg0),
3133                               TREE_STRING_POINTER (arg1),
3134                               TREE_STRING_LENGTH (arg0)));
3135
3136       case ADDR_EXPR:
3137         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3138                                 0);
3139       default:
3140         break;
3141       }
3142
3143   if (flags & OEP_ONLY_CONST)
3144     return 0;
3145
3146 /* Define macros to test an operand from arg0 and arg1 for equality and a
3147    variant that allows null and views null as being different from any
3148    non-null value.  In the latter case, if either is null, the both
3149    must be; otherwise, do the normal comparison.  */
3150 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3151                                     TREE_OPERAND (arg1, N), flags)
3152
3153 #define OP_SAME_WITH_NULL(N)                            \
3154   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3155    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3156
3157   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3158     {
3159     case tcc_unary:
3160       /* Two conversions are equal only if signedness and modes match.  */
3161       switch (TREE_CODE (arg0))
3162         {
3163         case NOP_EXPR:
3164         case CONVERT_EXPR:
3165         case FIX_TRUNC_EXPR:
3166           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3167               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3168             return 0;
3169           break;
3170         default:
3171           break;
3172         }
3173
3174       return OP_SAME (0);
3175
3176
3177     case tcc_comparison:
3178     case tcc_binary:
3179       if (OP_SAME (0) && OP_SAME (1))
3180         return 1;
3181
3182       /* For commutative ops, allow the other order.  */
3183       return (commutative_tree_code (TREE_CODE (arg0))
3184               && operand_equal_p (TREE_OPERAND (arg0, 0),
3185                                   TREE_OPERAND (arg1, 1), flags)
3186               && operand_equal_p (TREE_OPERAND (arg0, 1),
3187                                   TREE_OPERAND (arg1, 0), flags));
3188
3189     case tcc_reference:
3190       /* If either of the pointer (or reference) expressions we are
3191          dereferencing contain a side effect, these cannot be equal.  */
3192       if (TREE_SIDE_EFFECTS (arg0)
3193           || TREE_SIDE_EFFECTS (arg1))
3194         return 0;
3195
3196       switch (TREE_CODE (arg0))
3197         {
3198         case INDIRECT_REF:
3199         case ALIGN_INDIRECT_REF:
3200         case MISALIGNED_INDIRECT_REF:
3201         case REALPART_EXPR:
3202         case IMAGPART_EXPR:
3203           return OP_SAME (0);
3204
3205         case ARRAY_REF:
3206         case ARRAY_RANGE_REF:
3207           /* Operands 2 and 3 may be null.
3208              Compare the array index by value if it is constant first as we
3209              may have different types but same value here.  */
3210           return (OP_SAME (0)
3211                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3212                                           TREE_OPERAND (arg1, 1))
3213                       || OP_SAME (1))
3214                   && OP_SAME_WITH_NULL (2)
3215                   && OP_SAME_WITH_NULL (3));
3216
3217         case COMPONENT_REF:
3218           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3219              may be NULL when we're called to compare MEM_EXPRs.  */
3220           return OP_SAME_WITH_NULL (0)
3221                  && OP_SAME (1)
3222                  && OP_SAME_WITH_NULL (2);
3223
3224         case BIT_FIELD_REF:
3225           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3226
3227         default:
3228           return 0;
3229         }
3230
3231     case tcc_expression:
3232       switch (TREE_CODE (arg0))
3233         {
3234         case ADDR_EXPR:
3235         case TRUTH_NOT_EXPR:
3236           return OP_SAME (0);
3237
3238         case TRUTH_ANDIF_EXPR:
3239         case TRUTH_ORIF_EXPR:
3240           return OP_SAME (0) && OP_SAME (1);
3241
3242         case TRUTH_AND_EXPR:
3243         case TRUTH_OR_EXPR:
3244         case TRUTH_XOR_EXPR:
3245           if (OP_SAME (0) && OP_SAME (1))
3246             return 1;
3247
3248           /* Otherwise take into account this is a commutative operation.  */
3249           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3250                                    TREE_OPERAND (arg1, 1), flags)
3251                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3252                                       TREE_OPERAND (arg1, 0), flags));
3253
3254         default:
3255           return 0;
3256         }
3257
3258     case tcc_vl_exp:
3259       switch (TREE_CODE (arg0))
3260         {
3261         case CALL_EXPR:
3262           /* If the CALL_EXPRs call different functions, then they
3263              clearly can not be equal.  */
3264           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3265                                  flags))
3266             return 0;
3267
3268           {
3269             unsigned int cef = call_expr_flags (arg0);
3270             if (flags & OEP_PURE_SAME)
3271               cef &= ECF_CONST | ECF_PURE;
3272             else
3273               cef &= ECF_CONST;
3274             if (!cef)
3275               return 0;
3276           }
3277
3278           /* Now see if all the arguments are the same.  */
3279           {
3280             const_call_expr_arg_iterator iter0, iter1;
3281             const_tree a0, a1;
3282             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3283                    a1 = first_const_call_expr_arg (arg1, &iter1);
3284                  a0 && a1;
3285                  a0 = next_const_call_expr_arg (&iter0),
3286                    a1 = next_const_call_expr_arg (&iter1))
3287               if (! operand_equal_p (a0, a1, flags))
3288                 return 0;
3289
3290             /* If we get here and both argument lists are exhausted
3291                then the CALL_EXPRs are equal.  */
3292             return ! (a0 || a1);
3293           }
3294         default:
3295           return 0;
3296         }
3297
3298     case tcc_declaration:
3299       /* Consider __builtin_sqrt equal to sqrt.  */
3300       return (TREE_CODE (arg0) == FUNCTION_DECL
3301               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3302               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3303               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3304
3305     default:
3306       return 0;
3307     }
3308
3309 #undef OP_SAME
3310 #undef OP_SAME_WITH_NULL
3311 }
3312 \f
3313 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3314    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3315
3316    When in doubt, return 0.  */
3317
3318 static int
3319 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3320 {
3321   int unsignedp1, unsignedpo;
3322   tree primarg0, primarg1, primother;
3323   unsigned int correct_width;
3324
3325   if (operand_equal_p (arg0, arg1, 0))
3326     return 1;
3327
3328   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3329       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3330     return 0;
3331
3332   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3333      and see if the inner values are the same.  This removes any
3334      signedness comparison, which doesn't matter here.  */
3335   primarg0 = arg0, primarg1 = arg1;
3336   STRIP_NOPS (primarg0);
3337   STRIP_NOPS (primarg1);
3338   if (operand_equal_p (primarg0, primarg1, 0))
3339     return 1;
3340
3341   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3342      actual comparison operand, ARG0.
3343
3344      First throw away any conversions to wider types
3345      already present in the operands.  */
3346
3347   primarg1 = get_narrower (arg1, &unsignedp1);
3348   primother = get_narrower (other, &unsignedpo);
3349
3350   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3351   if (unsignedp1 == unsignedpo
3352       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3353       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3354     {
3355       tree type = TREE_TYPE (arg0);
3356
3357       /* Make sure shorter operand is extended the right way
3358          to match the longer operand.  */
3359       primarg1 = fold_convert (signed_or_unsigned_type_for
3360                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3361
3362       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3363         return 1;
3364     }
3365
3366   return 0;
3367 }
3368 \f
3369 /* See if ARG is an expression that is either a comparison or is performing
3370    arithmetic on comparisons.  The comparisons must only be comparing
3371    two different values, which will be stored in *CVAL1 and *CVAL2; if
3372    they are nonzero it means that some operands have already been found.
3373    No variables may be used anywhere else in the expression except in the
3374    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3375    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3376
3377    If this is true, return 1.  Otherwise, return zero.  */
3378
3379 static int
3380 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3381 {
3382   enum tree_code code = TREE_CODE (arg);
3383   enum tree_code_class class = TREE_CODE_CLASS (code);
3384
3385   /* We can handle some of the tcc_expression cases here.  */
3386   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3387     class = tcc_unary;
3388   else if (class == tcc_expression
3389            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3390                || code == COMPOUND_EXPR))
3391     class = tcc_binary;
3392
3393   else if (class == tcc_expression && code == SAVE_EXPR
3394            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3395     {
3396       /* If we've already found a CVAL1 or CVAL2, this expression is
3397          two complex to handle.  */
3398       if (*cval1 || *cval2)
3399         return 0;
3400
3401       class = tcc_unary;
3402       *save_p = 1;
3403     }
3404
3405   switch (class)
3406     {
3407     case tcc_unary:
3408       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3409
3410     case tcc_binary:
3411       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3412               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3413                                       cval1, cval2, save_p));
3414
3415     case tcc_constant:
3416       return 1;
3417
3418     case tcc_expression:
3419       if (code == COND_EXPR)
3420         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3421                                      cval1, cval2, save_p)
3422                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3423                                         cval1, cval2, save_p)
3424                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3425                                         cval1, cval2, save_p));
3426       return 0;
3427
3428     case tcc_comparison:
3429       /* First see if we can handle the first operand, then the second.  For
3430          the second operand, we know *CVAL1 can't be zero.  It must be that
3431          one side of the comparison is each of the values; test for the
3432          case where this isn't true by failing if the two operands
3433          are the same.  */
3434
3435       if (operand_equal_p (TREE_OPERAND (arg, 0),
3436                            TREE_OPERAND (arg, 1), 0))
3437         return 0;
3438
3439       if (*cval1 == 0)
3440         *cval1 = TREE_OPERAND (arg, 0);
3441       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3442         ;
3443       else if (*cval2 == 0)
3444         *cval2 = TREE_OPERAND (arg, 0);
3445       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3446         ;
3447       else
3448         return 0;
3449
3450       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3451         ;
3452       else if (*cval2 == 0)
3453         *cval2 = TREE_OPERAND (arg, 1);
3454       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3455         ;
3456       else
3457         return 0;
3458
3459       return 1;
3460
3461     default:
3462       return 0;
3463     }
3464 }
3465 \f
3466 /* ARG is a tree that is known to contain just arithmetic operations and
3467    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3468    any occurrence of OLD0 as an operand of a comparison and likewise for
3469    NEW1 and OLD1.  */
3470
3471 static tree
3472 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3473 {
3474   tree type = TREE_TYPE (arg);
3475   enum tree_code code = TREE_CODE (arg);
3476   enum tree_code_class class = TREE_CODE_CLASS (code);
3477
3478   /* We can handle some of the tcc_expression cases here.  */
3479   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3480     class = tcc_unary;
3481   else if (class == tcc_expression
3482            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3483     class = tcc_binary;
3484
3485   switch (class)
3486     {
3487     case tcc_unary:
3488       return fold_build1 (code, type,
3489                           eval_subst (TREE_OPERAND (arg, 0),
3490                                       old0, new0, old1, new1));
3491
3492     case tcc_binary:
3493       return fold_build2 (code, type,
3494                           eval_subst (TREE_OPERAND (arg, 0),
3495                                       old0, new0, old1, new1),
3496                           eval_subst (TREE_OPERAND (arg, 1),
3497                                       old0, new0, old1, new1));
3498
3499     case tcc_expression:
3500       switch (code)
3501         {
3502         case SAVE_EXPR:
3503           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3504
3505         case COMPOUND_EXPR:
3506           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3507
3508         case COND_EXPR:
3509           return fold_build3 (code, type,
3510                               eval_subst (TREE_OPERAND (arg, 0),
3511                                           old0, new0, old1, new1),
3512                               eval_subst (TREE_OPERAND (arg, 1),
3513                                           old0, new0, old1, new1),
3514                               eval_subst (TREE_OPERAND (arg, 2),
3515                                           old0, new0, old1, new1));
3516         default:
3517           break;
3518         }
3519       /* Fall through - ???  */
3520
3521     case tcc_comparison:
3522       {
3523         tree arg0 = TREE_OPERAND (arg, 0);
3524         tree arg1 = TREE_OPERAND (arg, 1);
3525
3526         /* We need to check both for exact equality and tree equality.  The
3527            former will be true if the operand has a side-effect.  In that
3528            case, we know the operand occurred exactly once.  */
3529
3530         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3531           arg0 = new0;
3532         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3533           arg0 = new1;
3534
3535         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3536           arg1 = new0;
3537         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3538           arg1 = new1;
3539
3540         return fold_build2 (code, type, arg0, arg1);
3541       }
3542
3543     default:
3544       return arg;
3545     }
3546 }
3547 \f
3548 /* Return a tree for the case when the result of an expression is RESULT
3549    converted to TYPE and OMITTED was previously an operand of the expression
3550    but is now not needed (e.g., we folded OMITTED * 0).
3551
3552    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3553    the conversion of RESULT to TYPE.  */
3554
3555 tree
3556 omit_one_operand (tree type, tree result, tree omitted)
3557 {
3558   tree t = fold_convert (type, result);
3559
3560   /* If the resulting operand is an empty statement, just return the omitted
3561      statement casted to void. */
3562   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3563     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3564
3565   if (TREE_SIDE_EFFECTS (omitted))
3566     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3567
3568   return non_lvalue (t);
3569 }
3570
3571 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3572
3573 static tree
3574 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3575 {
3576   tree t = fold_convert (type, result);
3577
3578   /* If the resulting operand is an empty statement, just return the omitted
3579      statement casted to void. */
3580   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3581     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3582
3583   if (TREE_SIDE_EFFECTS (omitted))
3584     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3585
3586   return pedantic_non_lvalue (t);
3587 }
3588
3589 /* Return a tree for the case when the result of an expression is RESULT
3590    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3591    of the expression but are now not needed.
3592
3593    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3594    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3595    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3596    just do the conversion of RESULT to TYPE.  */
3597
3598 tree
3599 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3600 {
3601   tree t = fold_convert (type, result);
3602
3603   if (TREE_SIDE_EFFECTS (omitted2))
3604     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3605   if (TREE_SIDE_EFFECTS (omitted1))
3606     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3607
3608   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3609 }
3610
3611 \f
3612 /* Return a simplified tree node for the truth-negation of ARG.  This
3613    never alters ARG itself.  We assume that ARG is an operation that
3614    returns a truth value (0 or 1).
3615
3616    FIXME: one would think we would fold the result, but it causes
3617    problems with the dominator optimizer.  */
3618
3619 tree
3620 fold_truth_not_expr (tree arg)
3621 {
3622   tree type = TREE_TYPE (arg);
3623   enum tree_code code = TREE_CODE (arg);
3624
3625   /* If this is a comparison, we can simply invert it, except for
3626      floating-point non-equality comparisons, in which case we just
3627      enclose a TRUTH_NOT_EXPR around what we have.  */
3628
3629   if (TREE_CODE_CLASS (code) == tcc_comparison)
3630     {
3631       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3632       if (FLOAT_TYPE_P (op_type)
3633           && flag_trapping_math
3634           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3635           && code != NE_EXPR && code != EQ_EXPR)
3636         return NULL_TREE;
3637       else
3638         {
3639           code = invert_tree_comparison (code,
3640                                          HONOR_NANS (TYPE_MODE (op_type)));
3641           if (code == ERROR_MARK)
3642             return NULL_TREE;
3643           else
3644             return build2 (code, type,
3645                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3646         }
3647     }
3648
3649   switch (code)
3650     {
3651     case INTEGER_CST:
3652       return constant_boolean_node (integer_zerop (arg), type);
3653
3654     case TRUTH_AND_EXPR:
3655       return build2 (TRUTH_OR_EXPR, type,
3656                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3657                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3658
3659     case TRUTH_OR_EXPR:
3660       return build2 (TRUTH_AND_EXPR, type,
3661                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3662                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3663
3664     case TRUTH_XOR_EXPR:
3665       /* Here we can invert either operand.  We invert the first operand
3666          unless the second operand is a TRUTH_NOT_EXPR in which case our
3667          result is the XOR of the first operand with the inside of the
3668          negation of the second operand.  */
3669
3670       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3671         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3672                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3673       else
3674         return build2 (TRUTH_XOR_EXPR, type,
3675                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3676                        TREE_OPERAND (arg, 1));
3677
3678     case TRUTH_ANDIF_EXPR:
3679       return build2 (TRUTH_ORIF_EXPR, type,
3680                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3681                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3682
3683     case TRUTH_ORIF_EXPR:
3684       return build2 (TRUTH_ANDIF_EXPR, type,
3685                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3686                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3687
3688     case TRUTH_NOT_EXPR:
3689       return TREE_OPERAND (arg, 0);
3690
3691     case COND_EXPR:
3692       {
3693         tree arg1 = TREE_OPERAND (arg, 1);
3694         tree arg2 = TREE_OPERAND (arg, 2);
3695         /* A COND_EXPR may have a throw as one operand, which
3696            then has void type.  Just leave void operands
3697            as they are.  */
3698         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3699                        VOID_TYPE_P (TREE_TYPE (arg1))
3700                        ? arg1 : invert_truthvalue (arg1),
3701                        VOID_TYPE_P (TREE_TYPE (arg2))
3702                        ? arg2 : invert_truthvalue (arg2));
3703       }
3704
3705     case COMPOUND_EXPR:
3706       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3707                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3708
3709     case NON_LVALUE_EXPR:
3710       return invert_truthvalue (TREE_OPERAND (arg, 0));
3711
3712     case NOP_EXPR:
3713       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3714         return build1 (TRUTH_NOT_EXPR, type, arg);
3715
3716     case CONVERT_EXPR:
3717     case FLOAT_EXPR:
3718       return build1 (TREE_CODE (arg), type,
3719                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3720
3721     case BIT_AND_EXPR:
3722       if (!integer_onep (TREE_OPERAND (arg, 1)))
3723         break;
3724       return build2 (EQ_EXPR, type, arg,
3725                      build_int_cst (type, 0));
3726
3727     case SAVE_EXPR:
3728       return build1 (TRUTH_NOT_EXPR, type, arg);
3729
3730     case CLEANUP_POINT_EXPR:
3731       return build1 (CLEANUP_POINT_EXPR, type,
3732                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3733
3734     default:
3735       break;
3736     }
3737
3738   return NULL_TREE;
3739 }
3740
3741 /* Return a simplified tree node for the truth-negation of ARG.  This
3742    never alters ARG itself.  We assume that ARG is an operation that
3743    returns a truth value (0 or 1).
3744
3745    FIXME: one would think we would fold the result, but it causes
3746    problems with the dominator optimizer.  */
3747
3748 tree
3749 invert_truthvalue (tree arg)
3750 {
3751   tree tem;
3752
3753   if (TREE_CODE (arg) == ERROR_MARK)
3754     return arg;
3755
3756   tem = fold_truth_not_expr (arg);
3757   if (!tem)
3758     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3759
3760   return tem;
3761 }
3762
3763 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3764    operands are another bit-wise operation with a common input.  If so,
3765    distribute the bit operations to save an operation and possibly two if
3766    constants are involved.  For example, convert
3767         (A | B) & (A | C) into A | (B & C)
3768    Further simplification will occur if B and C are constants.
3769
3770    If this optimization cannot be done, 0 will be returned.  */
3771
3772 static tree
3773 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3774 {
3775   tree common;
3776   tree left, right;
3777
3778   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3779       || TREE_CODE (arg0) == code
3780       || (TREE_CODE (arg0) != BIT_AND_EXPR
3781           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3782     return 0;
3783
3784   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3785     {
3786       common = TREE_OPERAND (arg0, 0);
3787       left = TREE_OPERAND (arg0, 1);
3788       right = TREE_OPERAND (arg1, 1);
3789     }
3790   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3791     {
3792       common = TREE_OPERAND (arg0, 0);
3793       left = TREE_OPERAND (arg0, 1);
3794       right = TREE_OPERAND (arg1, 0);
3795     }
3796   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3797     {
3798       common = TREE_OPERAND (arg0, 1);
3799       left = TREE_OPERAND (arg0, 0);
3800       right = TREE_OPERAND (arg1, 1);
3801     }
3802   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3803     {
3804       common = TREE_OPERAND (arg0, 1);
3805       left = TREE_OPERAND (arg0, 0);
3806       right = TREE_OPERAND (arg1, 0);
3807     }
3808   else
3809     return 0;
3810
3811   return fold_build2 (TREE_CODE (arg0), type, common,
3812                       fold_build2 (code, type, left, right));
3813 }
3814
3815 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3816    with code CODE.  This optimization is unsafe.  */
3817 static tree
3818 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3819 {
3820   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3821   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3822
3823   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3824   if (mul0 == mul1
3825       && operand_equal_p (TREE_OPERAND (arg0, 1),
3826                        TREE_OPERAND (arg1, 1), 0))
3827     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3828                         fold_build2 (code, type,
3829                                      TREE_OPERAND (arg0, 0),
3830                                      TREE_OPERAND (arg1, 0)),
3831                         TREE_OPERAND (arg0, 1));
3832
3833   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3834   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3835                        TREE_OPERAND (arg1, 0), 0)
3836       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3837       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3838     {
3839       REAL_VALUE_TYPE r0, r1;
3840       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3841       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3842       if (!mul0)
3843         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3844       if (!mul1)
3845         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3846       real_arithmetic (&r0, code, &r0, &r1);
3847       return fold_build2 (MULT_EXPR, type,
3848                           TREE_OPERAND (arg0, 0),
3849                           build_real (type, r0));
3850     }
3851
3852   return NULL_TREE;
3853 }
3854 \f
3855 /* Subroutine for fold_truthop: decode a field reference.
3856
3857    If EXP is a comparison reference, we return the innermost reference.
3858
3859    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3860    set to the starting bit number.
3861
3862    If the innermost field can be completely contained in a mode-sized
3863    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3864
3865    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3866    otherwise it is not changed.
3867
3868    *PUNSIGNEDP is set to the signedness of the field.
3869
3870    *PMASK is set to the mask used.  This is either contained in a
3871    BIT_AND_EXPR or derived from the width of the field.
3872
3873    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3874
3875    Return 0 if this is not a component reference or is one that we can't
3876    do anything with.  */
3877
3878 static tree
3879 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3880                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3881                         int *punsignedp, int *pvolatilep,
3882                         tree *pmask, tree *pand_mask)
3883 {
3884   tree outer_type = 0;
3885   tree and_mask = 0;
3886   tree mask, inner, offset;
3887   tree unsigned_type;
3888   unsigned int precision;
3889
3890   /* All the optimizations using this function assume integer fields.
3891      There are problems with FP fields since the type_for_size call
3892      below can fail for, e.g., XFmode.  */
3893   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3894     return 0;
3895
3896   /* We are interested in the bare arrangement of bits, so strip everything
3897      that doesn't affect the machine mode.  However, record the type of the
3898      outermost expression if it may matter below.  */
3899   if (TREE_CODE (exp) == NOP_EXPR
3900       || TREE_CODE (exp) == CONVERT_EXPR
3901       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3902     outer_type = TREE_TYPE (exp);
3903   STRIP_NOPS (exp);
3904
3905   if (TREE_CODE (exp) == BIT_AND_EXPR)
3906     {
3907       and_mask = TREE_OPERAND (exp, 1);
3908       exp = TREE_OPERAND (exp, 0);
3909       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3910       if (TREE_CODE (and_mask) != INTEGER_CST)
3911         return 0;
3912     }
3913
3914   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3915                                punsignedp, pvolatilep, false);
3916   if ((inner == exp && and_mask == 0)
3917       || *pbitsize < 0 || offset != 0
3918       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3919     return 0;
3920
3921   /* If the number of bits in the reference is the same as the bitsize of
3922      the outer type, then the outer type gives the signedness. Otherwise
3923      (in case of a small bitfield) the signedness is unchanged.  */
3924   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3925     *punsignedp = TYPE_UNSIGNED (outer_type);
3926
3927   /* Compute the mask to access the bitfield.  */
3928   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3929   precision = TYPE_PRECISION (unsigned_type);
3930
3931   mask = build_int_cst_type (unsigned_type, -1);
3932
3933   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3934   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3935
3936   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3937   if (and_mask != 0)
3938     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3939                         fold_convert (unsigned_type, and_mask), mask);
3940
3941   *pmask = mask;
3942   *pand_mask = and_mask;
3943   return inner;
3944 }
3945
3946 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3947    represents the sign bit of EXP's type.  If EXP represents a sign
3948    or zero extension, also test VAL against the unextended type.
3949    The return value is the (sub)expression whose sign bit is VAL,
3950    or NULL_TREE otherwise.  */
3951
3952 static tree
3953 sign_bit_p (tree exp, const_tree val)
3954 {
3955   unsigned HOST_WIDE_INT mask_lo, lo;
3956   HOST_WIDE_INT mask_hi, hi;
3957   int width;
3958   tree t;
3959
3960   /* Tree EXP must have an integral type.  */
3961   t = TREE_TYPE (exp);
3962   if (! INTEGRAL_TYPE_P (t))
3963     return NULL_TREE;
3964
3965   /* Tree VAL must be an integer constant.  */
3966   if (TREE_CODE (val) != INTEGER_CST
3967       || TREE_OVERFLOW (val))
3968     return NULL_TREE;
3969
3970   width = TYPE_PRECISION (t);
3971   if (width > HOST_BITS_PER_WIDE_INT)
3972     {
3973       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3974       lo = 0;
3975
3976       mask_hi = ((unsigned HOST_WIDE_INT) -1
3977                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3978       mask_lo = -1;
3979     }
3980   else
3981     {
3982       hi = 0;
3983       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3984
3985       mask_hi = 0;
3986       mask_lo = ((unsigned HOST_WIDE_INT) -1
3987                  >> (HOST_BITS_PER_WIDE_INT - width));
3988     }
3989
3990   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3991      treat VAL as if it were unsigned.  */
3992   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3993       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3994     return exp;
3995
3996   /* Handle extension from a narrower type.  */
3997   if (TREE_CODE (exp) == NOP_EXPR
3998       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3999     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4000
4001   return NULL_TREE;
4002 }
4003
4004 /* Subroutine for fold_truthop: determine if an operand is simple enough
4005    to be evaluated unconditionally.  */
4006
4007 static int
4008 simple_operand_p (const_tree exp)
4009 {
4010   /* Strip any conversions that don't change the machine mode.  */
4011   STRIP_NOPS (exp);
4012
4013   return (CONSTANT_CLASS_P (exp)
4014           || TREE_CODE (exp) == SSA_NAME
4015           || (DECL_P (exp)
4016               && ! TREE_ADDRESSABLE (exp)
4017               && ! TREE_THIS_VOLATILE (exp)
4018               && ! DECL_NONLOCAL (exp)
4019               /* Don't regard global variables as simple.  They may be
4020                  allocated in ways unknown to the compiler (shared memory,
4021                  #pragma weak, etc).  */
4022               && ! TREE_PUBLIC (exp)
4023               && ! DECL_EXTERNAL (exp)
4024               /* Loading a static variable is unduly expensive, but global
4025                  registers aren't expensive.  */
4026               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4027 }
4028 \f
4029 /* The following functions are subroutines to fold_range_test and allow it to
4030    try to change a logical combination of comparisons into a range test.
4031
4032    For example, both
4033         X == 2 || X == 3 || X == 4 || X == 5
4034    and
4035         X >= 2 && X <= 5
4036    are converted to
4037         (unsigned) (X - 2) <= 3
4038
4039    We describe each set of comparisons as being either inside or outside
4040    a range, using a variable named like IN_P, and then describe the
4041    range with a lower and upper bound.  If one of the bounds is omitted,
4042    it represents either the highest or lowest value of the type.
4043
4044    In the comments below, we represent a range by two numbers in brackets
4045    preceded by a "+" to designate being inside that range, or a "-" to
4046    designate being outside that range, so the condition can be inverted by
4047    flipping the prefix.  An omitted bound is represented by a "-".  For
4048    example, "- [-, 10]" means being outside the range starting at the lowest
4049    possible value and ending at 10, in other words, being greater than 10.
4050    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4051    always false.
4052
4053    We set up things so that the missing bounds are handled in a consistent
4054    manner so neither a missing bound nor "true" and "false" need to be
4055    handled using a special case.  */
4056
4057 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4058    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4059    and UPPER1_P are nonzero if the respective argument is an upper bound
4060    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4061    must be specified for a comparison.  ARG1 will be converted to ARG0's
4062    type if both are specified.  */
4063
4064 static tree
4065 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4066              tree arg1, int upper1_p)
4067 {
4068   tree tem;
4069   int result;
4070   int sgn0, sgn1;
4071
4072   /* If neither arg represents infinity, do the normal operation.
4073      Else, if not a comparison, return infinity.  Else handle the special
4074      comparison rules. Note that most of the cases below won't occur, but
4075      are handled for consistency.  */
4076
4077   if (arg0 != 0 && arg1 != 0)
4078     {
4079       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4080                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4081       STRIP_NOPS (tem);
4082       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4083     }
4084
4085   if (TREE_CODE_CLASS (code) != tcc_comparison)
4086     return 0;
4087
4088   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4089      for neither.  In real maths, we cannot assume open ended ranges are
4090      the same. But, this is computer arithmetic, where numbers are finite.
4091      We can therefore make the transformation of any unbounded range with
4092      the value Z, Z being greater than any representable number. This permits
4093      us to treat unbounded ranges as equal.  */
4094   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4095   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4096   switch (code)
4097     {
4098     case EQ_EXPR:
4099       result = sgn0 == sgn1;
4100       break;
4101     case NE_EXPR:
4102       result = sgn0 != sgn1;
4103       break;
4104     case LT_EXPR:
4105       result = sgn0 < sgn1;
4106       break;
4107     case LE_EXPR:
4108       result = sgn0 <= sgn1;
4109       break;
4110     case GT_EXPR:
4111       result = sgn0 > sgn1;
4112       break;
4113     case GE_EXPR:
4114       result = sgn0 >= sgn1;
4115       break;
4116     default:
4117       gcc_unreachable ();
4118     }
4119
4120   return constant_boolean_node (result, type);
4121 }
4122 \f
4123 /* Given EXP, a logical expression, set the range it is testing into
4124    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4125    actually being tested.  *PLOW and *PHIGH will be made of the same
4126    type as the returned expression.  If EXP is not a comparison, we
4127    will most likely not be returning a useful value and range.  Set
4128    *STRICT_OVERFLOW_P to true if the return value is only valid
4129    because signed overflow is undefined; otherwise, do not change
4130    *STRICT_OVERFLOW_P.  */
4131
4132 static tree
4133 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4134             bool *strict_overflow_p)
4135 {
4136   enum tree_code code;
4137   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4138   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4139   int in_p, n_in_p;
4140   tree low, high, n_low, n_high;
4141
4142   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4143      and see if we can refine the range.  Some of the cases below may not
4144      happen, but it doesn't seem worth worrying about this.  We "continue"
4145      the outer loop when we've changed something; otherwise we "break"
4146      the switch, which will "break" the while.  */
4147
4148   in_p = 0;
4149   low = high = build_int_cst (TREE_TYPE (exp), 0);
4150
4151   while (1)
4152     {
4153       code = TREE_CODE (exp);
4154       exp_type = TREE_TYPE (exp);
4155
4156       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4157         {
4158           if (TREE_OPERAND_LENGTH (exp) > 0)
4159             arg0 = TREE_OPERAND (exp, 0);
4160           if (TREE_CODE_CLASS (code) == tcc_comparison
4161               || TREE_CODE_CLASS (code) == tcc_unary
4162               || TREE_CODE_CLASS (code) == tcc_binary)
4163             arg0_type = TREE_TYPE (arg0);
4164           if (TREE_CODE_CLASS (code) == tcc_binary
4165               || TREE_CODE_CLASS (code) == tcc_comparison
4166               || (TREE_CODE_CLASS (code) == tcc_expression
4167                   && TREE_OPERAND_LENGTH (exp) > 1))
4168             arg1 = TREE_OPERAND (exp, 1);
4169         }
4170
4171       switch (code)
4172         {
4173         case TRUTH_NOT_EXPR:
4174           in_p = ! in_p, exp = arg0;
4175           continue;
4176
4177         case EQ_EXPR: case NE_EXPR:
4178         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4179           /* We can only do something if the range is testing for zero
4180              and if the second operand is an integer constant.  Note that
4181              saying something is "in" the range we make is done by
4182              complementing IN_P since it will set in the initial case of
4183              being not equal to zero; "out" is leaving it alone.  */
4184           if (low == 0 || high == 0
4185               || ! integer_zerop (low) || ! integer_zerop (high)
4186               || TREE_CODE (arg1) != INTEGER_CST)
4187             break;
4188
4189           switch (code)
4190             {
4191             case NE_EXPR:  /* - [c, c]  */
4192               low = high = arg1;
4193               break;
4194             case EQ_EXPR:  /* + [c, c]  */
4195               in_p = ! in_p, low = high = arg1;
4196               break;
4197             case GT_EXPR:  /* - [-, c] */
4198               low = 0, high = arg1;
4199               break;
4200             case GE_EXPR:  /* + [c, -] */
4201               in_p = ! in_p, low = arg1, high = 0;
4202               break;
4203             case LT_EXPR:  /* - [c, -] */
4204               low = arg1, high = 0;
4205               break;
4206             case LE_EXPR:  /* + [-, c] */
4207               in_p = ! in_p, low = 0, high = arg1;
4208               break;
4209             default:
4210               gcc_unreachable ();
4211             }
4212
4213           /* If this is an unsigned comparison, we also know that EXP is
4214              greater than or equal to zero.  We base the range tests we make
4215              on that fact, so we record it here so we can parse existing
4216              range tests.  We test arg0_type since often the return type
4217              of, e.g. EQ_EXPR, is boolean.  */
4218           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4219             {
4220               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4221                                   in_p, low, high, 1,
4222                                   build_int_cst (arg0_type, 0),
4223                                   NULL_TREE))
4224                 break;
4225
4226               in_p = n_in_p, low = n_low, high = n_high;
4227
4228               /* If the high bound is missing, but we have a nonzero low
4229                  bound, reverse the range so it goes from zero to the low bound
4230                  minus 1.  */
4231               if (high == 0 && low && ! integer_zerop (low))
4232                 {
4233                   in_p = ! in_p;
4234                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4235                                       integer_one_node, 0);
4236                   low = build_int_cst (arg0_type, 0);
4237                 }
4238             }
4239
4240           exp = arg0;
4241           continue;
4242
4243         case NEGATE_EXPR:
4244           /* (-x) IN [a,b] -> x in [-b, -a]  */
4245           n_low = range_binop (MINUS_EXPR, exp_type,
4246                                build_int_cst (exp_type, 0),
4247                                0, high, 1);
4248           n_high = range_binop (MINUS_EXPR, exp_type,
4249                                 build_int_cst (exp_type, 0),
4250                                 0, low, 0);
4251           low = n_low, high = n_high;
4252           exp = arg0;
4253           continue;
4254
4255         case BIT_NOT_EXPR:
4256           /* ~ X -> -X - 1  */
4257           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4258                         build_int_cst (exp_type, 1));
4259           continue;
4260
4261         case PLUS_EXPR:  case MINUS_EXPR:
4262           if (TREE_CODE (arg1) != INTEGER_CST)
4263             break;
4264
4265           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4266              move a constant to the other side.  */
4267           if (!TYPE_UNSIGNED (arg0_type)
4268               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4269             break;
4270
4271           /* If EXP is signed, any overflow in the computation is undefined,
4272              so we don't worry about it so long as our computations on
4273              the bounds don't overflow.  For unsigned, overflow is defined
4274              and this is exactly the right thing.  */
4275           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4276                                arg0_type, low, 0, arg1, 0);
4277           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4278                                 arg0_type, high, 1, arg1, 0);
4279           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4280               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4281             break;
4282
4283           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4284             *strict_overflow_p = true;
4285
4286           /* Check for an unsigned range which has wrapped around the maximum
4287              value thus making n_high < n_low, and normalize it.  */
4288           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4289             {
4290               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4291                                  integer_one_node, 0);
4292               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4293                                   integer_one_node, 0);
4294
4295               /* If the range is of the form +/- [ x+1, x ], we won't
4296                  be able to normalize it.  But then, it represents the
4297                  whole range or the empty set, so make it
4298                  +/- [ -, - ].  */
4299               if (tree_int_cst_equal (n_low, low)
4300                   && tree_int_cst_equal (n_high, high))
4301                 low = high = 0;
4302               else
4303                 in_p = ! in_p;
4304             }
4305           else
4306             low = n_low, high = n_high;
4307
4308           exp = arg0;
4309           continue;
4310
4311         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
4312           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4313             break;
4314
4315           if (! INTEGRAL_TYPE_P (arg0_type)
4316               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4317               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4318             break;
4319
4320           n_low = low, n_high = high;
4321
4322           if (n_low != 0)
4323             n_low = fold_convert (arg0_type, n_low);
4324
4325           if (n_high != 0)
4326             n_high = fold_convert (arg0_type, n_high);
4327
4328
4329           /* If we're converting arg0 from an unsigned type, to exp,
4330              a signed type,  we will be doing the comparison as unsigned.
4331              The tests above have already verified that LOW and HIGH
4332              are both positive.
4333
4334              So we have to ensure that we will handle large unsigned
4335              values the same way that the current signed bounds treat
4336              negative values.  */
4337
4338           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4339             {
4340               tree high_positive;
4341               tree equiv_type;
4342               /* For fixed-point modes, we need to pass the saturating flag
4343                  as the 2nd parameter.  */
4344               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4345                 equiv_type = lang_hooks.types.type_for_mode
4346                              (TYPE_MODE (arg0_type),
4347                               TYPE_SATURATING (arg0_type));
4348               else
4349                 equiv_type = lang_hooks.types.type_for_mode
4350                              (TYPE_MODE (arg0_type), 1);
4351
4352               /* A range without an upper bound is, naturally, unbounded.
4353                  Since convert would have cropped a very large value, use
4354                  the max value for the destination type.  */
4355               high_positive
4356                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4357                 : TYPE_MAX_VALUE (arg0_type);
4358
4359               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4360                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4361                                              fold_convert (arg0_type,
4362                                                            high_positive),
4363                                              build_int_cst (arg0_type, 1));
4364
4365               /* If the low bound is specified, "and" the range with the
4366                  range for which the original unsigned value will be
4367                  positive.  */
4368               if (low != 0)
4369                 {
4370                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4371                                       1, n_low, n_high, 1,
4372                                       fold_convert (arg0_type,
4373                                                     integer_zero_node),
4374                                       high_positive))
4375                     break;
4376
4377                   in_p = (n_in_p == in_p);
4378                 }
4379               else
4380                 {
4381                   /* Otherwise, "or" the range with the range of the input
4382                      that will be interpreted as negative.  */
4383                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4384                                       0, n_low, n_high, 1,
4385                                       fold_convert (arg0_type,
4386                                                     integer_zero_node),
4387                                       high_positive))
4388                     break;
4389
4390                   in_p = (in_p != n_in_p);
4391                 }
4392             }
4393
4394           exp = arg0;
4395           low = n_low, high = n_high;
4396           continue;
4397
4398         default:
4399           break;
4400         }
4401
4402       break;
4403     }
4404
4405   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4406   if (TREE_CODE (exp) == INTEGER_CST)
4407     {
4408       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4409                                                  exp, 0, low, 0))
4410                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4411                                                     exp, 1, high, 1)));
4412       low = high = 0;
4413       exp = 0;
4414     }
4415
4416   *pin_p = in_p, *plow = low, *phigh = high;
4417   return exp;
4418 }
4419 \f
4420 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4421    type, TYPE, return an expression to test if EXP is in (or out of, depending
4422    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4423
4424 static tree
4425 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4426 {
4427   tree etype = TREE_TYPE (exp);
4428   tree value;
4429
4430 #ifdef HAVE_canonicalize_funcptr_for_compare
4431   /* Disable this optimization for function pointer expressions
4432      on targets that require function pointer canonicalization.  */
4433   if (HAVE_canonicalize_funcptr_for_compare
4434       && TREE_CODE (etype) == POINTER_TYPE
4435       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4436     return NULL_TREE;
4437 #endif
4438
4439   if (! in_p)
4440     {
4441       value = build_range_check (type, exp, 1, low, high);
4442       if (value != 0)
4443         return invert_truthvalue (value);
4444
4445       return 0;
4446     }
4447
4448   if (low == 0 && high == 0)
4449     return build_int_cst (type, 1);
4450
4451   if (low == 0)
4452     return fold_build2 (LE_EXPR, type, exp,
4453                         fold_convert (etype, high));
4454
4455   if (high == 0)
4456     return fold_build2 (GE_EXPR, type, exp,
4457                         fold_convert (etype, low));
4458
4459   if (operand_equal_p (low, high, 0))
4460     return fold_build2 (EQ_EXPR, type, exp,
4461                         fold_convert (etype, low));
4462
4463   if (integer_zerop (low))
4464     {
4465       if (! TYPE_UNSIGNED (etype))
4466         {
4467           etype = unsigned_type_for (etype);
4468           high = fold_convert (etype, high);
4469           exp = fold_convert (etype, exp);
4470         }
4471       return build_range_check (type, exp, 1, 0, high);
4472     }
4473
4474   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4475   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4476     {
4477       unsigned HOST_WIDE_INT lo;
4478       HOST_WIDE_INT hi;
4479       int prec;
4480
4481       prec = TYPE_PRECISION (etype);
4482       if (prec <= HOST_BITS_PER_WIDE_INT)
4483         {
4484           hi = 0;
4485           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4486         }
4487       else
4488         {
4489           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4490           lo = (unsigned HOST_WIDE_INT) -1;
4491         }
4492
4493       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4494         {
4495           if (TYPE_UNSIGNED (etype))
4496             {
4497               etype = signed_type_for (etype);
4498               exp = fold_convert (etype, exp);
4499             }
4500           return fold_build2 (GT_EXPR, type, exp,
4501                               build_int_cst (etype, 0));
4502         }
4503     }
4504
4505   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4506      This requires wrap-around arithmetics for the type of the expression.  */
4507   switch (TREE_CODE (etype))
4508     {
4509     case INTEGER_TYPE:
4510       /* There is no requirement that LOW be within the range of ETYPE
4511          if the latter is a subtype.  It must, however, be within the base
4512          type of ETYPE.  So be sure we do the subtraction in that type.  */
4513       if (TREE_TYPE (etype))
4514         etype = TREE_TYPE (etype);
4515       break;
4516
4517     case ENUMERAL_TYPE:
4518     case BOOLEAN_TYPE:
4519       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4520                                               TYPE_UNSIGNED (etype));
4521       break;
4522
4523     default:
4524       break;
4525     }
4526
4527   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4528   if (TREE_CODE (etype) == INTEGER_TYPE
4529       && !TYPE_OVERFLOW_WRAPS (etype))
4530     {
4531       tree utype, minv, maxv;
4532
4533       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4534          for the type in question, as we rely on this here.  */
4535       utype = unsigned_type_for (etype);
4536       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4537       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4538                           integer_one_node, 1);
4539       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4540
4541       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4542                                       minv, 1, maxv, 1)))
4543         etype = utype;
4544       else
4545         return 0;
4546     }
4547
4548   high = fold_convert (etype, high);
4549   low = fold_convert (etype, low);
4550   exp = fold_convert (etype, exp);
4551
4552   value = const_binop (MINUS_EXPR, high, low, 0);
4553
4554
4555   if (POINTER_TYPE_P (etype))
4556     {
4557       if (value != 0 && !TREE_OVERFLOW (value))
4558         {
4559           low = fold_convert (sizetype, low);
4560           low = fold_build1 (NEGATE_EXPR, sizetype, low);
4561           return build_range_check (type,
4562                                     fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4563                                     1, build_int_cst (etype, 0), value);
4564         }
4565       return 0;
4566     }
4567
4568   if (value != 0 && !TREE_OVERFLOW (value))
4569     return build_range_check (type,
4570                               fold_build2 (MINUS_EXPR, etype, exp, low),
4571                               1, build_int_cst (etype, 0), value);
4572
4573   return 0;
4574 }
4575 \f
4576 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4577
4578 static tree
4579 range_predecessor (tree val)
4580 {
4581   tree type = TREE_TYPE (val);
4582
4583   if (INTEGRAL_TYPE_P (type)
4584       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4585     return 0;
4586   else
4587     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4588 }
4589
4590 /* Return the successor of VAL in its type, handling the infinite case.  */
4591
4592 static tree
4593 range_successor (tree val)
4594 {
4595   tree type = TREE_TYPE (val);
4596
4597   if (INTEGRAL_TYPE_P (type)
4598       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4599     return 0;
4600   else
4601     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4602 }
4603
4604 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4605    can, 0 if we can't.  Set the output range into the specified parameters.  */
4606
4607 static int
4608 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4609               tree high0, int in1_p, tree low1, tree high1)
4610 {
4611   int no_overlap;
4612   int subset;
4613   int temp;
4614   tree tem;
4615   int in_p;
4616   tree low, high;
4617   int lowequal = ((low0 == 0 && low1 == 0)
4618                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4619                                                 low0, 0, low1, 0)));
4620   int highequal = ((high0 == 0 && high1 == 0)
4621                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4622                                                  high0, 1, high1, 1)));
4623
4624   /* Make range 0 be the range that starts first, or ends last if they
4625      start at the same value.  Swap them if it isn't.  */
4626   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4627                                  low0, 0, low1, 0))
4628       || (lowequal
4629           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4630                                         high1, 1, high0, 1))))
4631     {
4632       temp = in0_p, in0_p = in1_p, in1_p = temp;
4633       tem = low0, low0 = low1, low1 = tem;
4634       tem = high0, high0 = high1, high1 = tem;
4635     }
4636
4637   /* Now flag two cases, whether the ranges are disjoint or whether the
4638      second range is totally subsumed in the first.  Note that the tests
4639      below are simplified by the ones above.  */
4640   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4641                                           high0, 1, low1, 0));
4642   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4643                                       high1, 1, high0, 1));
4644
4645   /* We now have four cases, depending on whether we are including or
4646      excluding the two ranges.  */
4647   if (in0_p && in1_p)
4648     {
4649       /* If they don't overlap, the result is false.  If the second range
4650          is a subset it is the result.  Otherwise, the range is from the start
4651          of the second to the end of the first.  */
4652       if (no_overlap)
4653         in_p = 0, low = high = 0;
4654       else if (subset)
4655         in_p = 1, low = low1, high = high1;
4656       else
4657         in_p = 1, low = low1, high = high0;
4658     }
4659
4660   else if (in0_p && ! in1_p)
4661     {
4662       /* If they don't overlap, the result is the first range.  If they are
4663          equal, the result is false.  If the second range is a subset of the
4664          first, and the ranges begin at the same place, we go from just after
4665          the end of the second range to the end of the first.  If the second
4666          range is not a subset of the first, or if it is a subset and both
4667          ranges end at the same place, the range starts at the start of the
4668          first range and ends just before the second range.
4669          Otherwise, we can't describe this as a single range.  */
4670       if (no_overlap)
4671         in_p = 1, low = low0, high = high0;
4672       else if (lowequal && highequal)
4673         in_p = 0, low = high = 0;
4674       else if (subset && lowequal)
4675         {
4676           low = range_successor (high1);
4677           high = high0;
4678           in_p = 1;
4679           if (low == 0)
4680             {
4681               /* We are in the weird situation where high0 > high1 but
4682                  high1 has no successor.  Punt.  */
4683               return 0;
4684             }
4685         }
4686       else if (! subset || highequal)
4687         {
4688           low = low0;
4689           high = range_predecessor (low1);
4690           in_p = 1;
4691           if (high == 0)
4692             {
4693               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4694               return 0;
4695             }
4696         }
4697       else
4698         return 0;
4699     }
4700
4701   else if (! in0_p && in1_p)
4702     {
4703       /* If they don't overlap, the result is the second range.  If the second
4704          is a subset of the first, the result is false.  Otherwise,
4705          the range starts just after the first range and ends at the
4706          end of the second.  */
4707       if (no_overlap)
4708         in_p = 1, low = low1, high = high1;
4709       else if (subset || highequal)
4710         in_p = 0, low = high = 0;
4711       else
4712         {
4713           low = range_successor (high0);
4714           high = high1;
4715           in_p = 1;
4716           if (low == 0)
4717             {
4718               /* high1 > high0 but high0 has no successor.  Punt.  */
4719               return 0;
4720             }
4721         }
4722     }
4723
4724   else
4725     {
4726       /* The case where we are excluding both ranges.  Here the complex case
4727          is if they don't overlap.  In that case, the only time we have a
4728          range is if they are adjacent.  If the second is a subset of the
4729          first, the result is the first.  Otherwise, the range to exclude
4730          starts at the beginning of the first range and ends at the end of the
4731          second.  */
4732       if (no_overlap)
4733         {
4734           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4735                                          range_successor (high0),
4736                                          1, low1, 0)))
4737             in_p = 0, low = low0, high = high1;
4738           else
4739             {
4740               /* Canonicalize - [min, x] into - [-, x].  */
4741               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4742                 switch (TREE_CODE (TREE_TYPE (low0)))
4743                   {
4744                   case ENUMERAL_TYPE:
4745                     if (TYPE_PRECISION (TREE_TYPE (low0))
4746                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4747                       break;
4748                     /* FALLTHROUGH */
4749                   case INTEGER_TYPE:
4750                     if (tree_int_cst_equal (low0,
4751                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4752                       low0 = 0;
4753                     break;
4754                   case POINTER_TYPE:
4755                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4756                         && integer_zerop (low0))
4757                       low0 = 0;
4758                     break;
4759                   default:
4760                     break;
4761                   }
4762
4763               /* Canonicalize - [x, max] into - [x, -].  */
4764               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4765                 switch (TREE_CODE (TREE_TYPE (high1)))
4766                   {
4767                   case ENUMERAL_TYPE:
4768                     if (TYPE_PRECISION (TREE_TYPE (high1))
4769                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4770                       break;
4771                     /* FALLTHROUGH */
4772                   case INTEGER_TYPE:
4773                     if (tree_int_cst_equal (high1,
4774                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4775                       high1 = 0;
4776                     break;
4777                   case POINTER_TYPE:
4778                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4779                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4780                                                        high1, 1,
4781                                                        integer_one_node, 1)))
4782                       high1 = 0;
4783                     break;
4784                   default:
4785                     break;
4786                   }
4787
4788               /* The ranges might be also adjacent between the maximum and
4789                  minimum values of the given type.  For
4790                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4791                  return + [x + 1, y - 1].  */
4792               if (low0 == 0 && high1 == 0)
4793                 {
4794                   low = range_successor (high0);
4795                   high = range_predecessor (low1);
4796                   if (low == 0 || high == 0)
4797                     return 0;
4798
4799                   in_p = 1;
4800                 }
4801               else
4802                 return 0;
4803             }
4804         }
4805       else if (subset)
4806         in_p = 0, low = low0, high = high0;
4807       else
4808         in_p = 0, low = low0, high = high1;
4809     }
4810
4811   *pin_p = in_p, *plow = low, *phigh = high;
4812   return 1;
4813 }
4814 \f
4815
4816 /* Subroutine of fold, looking inside expressions of the form
4817    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4818    of the COND_EXPR.  This function is being used also to optimize
4819    A op B ? C : A, by reversing the comparison first.
4820
4821    Return a folded expression whose code is not a COND_EXPR
4822    anymore, or NULL_TREE if no folding opportunity is found.  */
4823
4824 static tree
4825 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4826 {
4827   enum tree_code comp_code = TREE_CODE (arg0);
4828   tree arg00 = TREE_OPERAND (arg0, 0);
4829   tree arg01 = TREE_OPERAND (arg0, 1);
4830   tree arg1_type = TREE_TYPE (arg1);
4831   tree tem;
4832
4833   STRIP_NOPS (arg1);
4834   STRIP_NOPS (arg2);
4835
4836   /* If we have A op 0 ? A : -A, consider applying the following
4837      transformations:
4838
4839      A == 0? A : -A    same as -A
4840      A != 0? A : -A    same as A
4841      A >= 0? A : -A    same as abs (A)
4842      A > 0?  A : -A    same as abs (A)
4843      A <= 0? A : -A    same as -abs (A)
4844      A < 0?  A : -A    same as -abs (A)
4845
4846      None of these transformations work for modes with signed
4847      zeros.  If A is +/-0, the first two transformations will
4848      change the sign of the result (from +0 to -0, or vice
4849      versa).  The last four will fix the sign of the result,
4850      even though the original expressions could be positive or
4851      negative, depending on the sign of A.
4852
4853      Note that all these transformations are correct if A is
4854      NaN, since the two alternatives (A and -A) are also NaNs.  */
4855   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4856       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4857           ? real_zerop (arg01)
4858           : integer_zerop (arg01))
4859       && ((TREE_CODE (arg2) == NEGATE_EXPR
4860            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4861              /* In the case that A is of the form X-Y, '-A' (arg2) may
4862                 have already been folded to Y-X, check for that. */
4863           || (TREE_CODE (arg1) == MINUS_EXPR
4864               && TREE_CODE (arg2) == MINUS_EXPR
4865               && operand_equal_p (TREE_OPERAND (arg1, 0),
4866                                   TREE_OPERAND (arg2, 1), 0)
4867               && operand_equal_p (TREE_OPERAND (arg1, 1),
4868                                   TREE_OPERAND (arg2, 0), 0))))
4869     switch (comp_code)
4870       {
4871       case EQ_EXPR:
4872       case UNEQ_EXPR:
4873         tem = fold_convert (arg1_type, arg1);
4874         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4875       case NE_EXPR:
4876       case LTGT_EXPR:
4877         return pedantic_non_lvalue (fold_convert (type, arg1));
4878       case UNGE_EXPR:
4879       case UNGT_EXPR:
4880         if (flag_trapping_math)
4881           break;
4882         /* Fall through.  */
4883       case GE_EXPR:
4884       case GT_EXPR:
4885         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4886           arg1 = fold_convert (signed_type_for
4887                                (TREE_TYPE (arg1)), arg1);
4888         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4889         return pedantic_non_lvalue (fold_convert (type, tem));
4890       case UNLE_EXPR:
4891       case UNLT_EXPR:
4892         if (flag_trapping_math)
4893           break;
4894       case LE_EXPR:
4895       case LT_EXPR:
4896         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4897           arg1 = fold_convert (signed_type_for
4898                                (TREE_TYPE (arg1)), arg1);
4899         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4900         return negate_expr (fold_convert (type, tem));
4901       default:
4902         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4903         break;
4904       }
4905
4906   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4907      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4908      both transformations are correct when A is NaN: A != 0
4909      is then true, and A == 0 is false.  */
4910
4911   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4912       && integer_zerop (arg01) && integer_zerop (arg2))
4913     {
4914       if (comp_code == NE_EXPR)
4915         return pedantic_non_lvalue (fold_convert (type, arg1));
4916       else if (comp_code == EQ_EXPR)
4917         return build_int_cst (type, 0);
4918     }
4919
4920   /* Try some transformations of A op B ? A : B.
4921
4922      A == B? A : B    same as B
4923      A != B? A : B    same as A
4924      A >= B? A : B    same as max (A, B)
4925      A > B?  A : B    same as max (B, A)
4926      A <= B? A : B    same as min (A, B)
4927      A < B?  A : B    same as min (B, A)
4928
4929      As above, these transformations don't work in the presence
4930      of signed zeros.  For example, if A and B are zeros of
4931      opposite sign, the first two transformations will change
4932      the sign of the result.  In the last four, the original
4933      expressions give different results for (A=+0, B=-0) and
4934      (A=-0, B=+0), but the transformed expressions do not.
4935
4936      The first two transformations are correct if either A or B
4937      is a NaN.  In the first transformation, the condition will
4938      be false, and B will indeed be chosen.  In the case of the
4939      second transformation, the condition A != B will be true,
4940      and A will be chosen.
4941
4942      The conversions to max() and min() are not correct if B is
4943      a number and A is not.  The conditions in the original
4944      expressions will be false, so all four give B.  The min()
4945      and max() versions would give a NaN instead.  */
4946   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4947       && operand_equal_for_comparison_p (arg01, arg2, arg00)
4948       /* Avoid these transformations if the COND_EXPR may be used
4949          as an lvalue in the C++ front-end.  PR c++/19199.  */
4950       && (in_gimple_form
4951           || (strcmp (lang_hooks.name, "GNU C++") != 0
4952               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4953           || ! maybe_lvalue_p (arg1)
4954           || ! maybe_lvalue_p (arg2)))
4955     {
4956       tree comp_op0 = arg00;
4957       tree comp_op1 = arg01;
4958       tree comp_type = TREE_TYPE (comp_op0);
4959
4960       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4961       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4962         {
4963           comp_type = type;
4964           comp_op0 = arg1;
4965           comp_op1 = arg2;
4966         }
4967
4968       switch (comp_code)
4969         {
4970         case EQ_EXPR:
4971           return pedantic_non_lvalue (fold_convert (type, arg2));
4972         case NE_EXPR:
4973           return pedantic_non_lvalue (fold_convert (type, arg1));
4974         case LE_EXPR:
4975         case LT_EXPR:
4976         case UNLE_EXPR:
4977         case UNLT_EXPR:
4978           /* In C++ a ?: expression can be an lvalue, so put the
4979              operand which will be used if they are equal first
4980              so that we can convert this back to the
4981              corresponding COND_EXPR.  */
4982           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4983             {
4984               comp_op0 = fold_convert (comp_type, comp_op0);
4985               comp_op1 = fold_convert (comp_type, comp_op1);
4986               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4987                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4988                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4989               return pedantic_non_lvalue (fold_convert (type, tem));
4990             }
4991           break;
4992         case GE_EXPR:
4993         case GT_EXPR:
4994         case UNGE_EXPR:
4995         case UNGT_EXPR:
4996           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4997             {
4998               comp_op0 = fold_convert (comp_type, comp_op0);
4999               comp_op1 = fold_convert (comp_type, comp_op1);
5000               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5001                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5002                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5003               return pedantic_non_lvalue (fold_convert (type, tem));
5004             }
5005           break;
5006         case UNEQ_EXPR:
5007           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5008             return pedantic_non_lvalue (fold_convert (type, arg2));
5009           break;
5010         case LTGT_EXPR:
5011           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5012             return pedantic_non_lvalue (fold_convert (type, arg1));
5013           break;
5014         default:
5015           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5016           break;
5017         }
5018     }
5019
5020   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5021      we might still be able to simplify this.  For example,
5022      if C1 is one less or one more than C2, this might have started
5023      out as a MIN or MAX and been transformed by this function.
5024      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5025
5026   if (INTEGRAL_TYPE_P (type)
5027       && TREE_CODE (arg01) == INTEGER_CST
5028       && TREE_CODE (arg2) == INTEGER_CST)
5029     switch (comp_code)
5030       {
5031       case EQ_EXPR:
5032         /* We can replace A with C1 in this case.  */
5033         arg1 = fold_convert (type, arg01);
5034         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5035
5036       case LT_EXPR:
5037         /* If C1 is C2 + 1, this is min(A, C2).  */
5038         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5039                                OEP_ONLY_CONST)
5040             && operand_equal_p (arg01,
5041                                 const_binop (PLUS_EXPR, arg2,
5042                                              build_int_cst (type, 1), 0),
5043                                 OEP_ONLY_CONST))
5044           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5045                                                    type,
5046                                                    fold_convert (type, arg1),
5047                                                    arg2));
5048         break;
5049
5050       case LE_EXPR:
5051         /* If C1 is C2 - 1, this is min(A, C2).  */
5052         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5053                                OEP_ONLY_CONST)
5054             && operand_equal_p (arg01,
5055                                 const_binop (MINUS_EXPR, arg2,
5056                                              build_int_cst (type, 1), 0),
5057                                 OEP_ONLY_CONST))
5058           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5059                                                    type,
5060                                                    fold_convert (type, arg1),
5061                                                    arg2));
5062         break;
5063
5064       case GT_EXPR:
5065         /* If C1 is C2 - 1, this is max(A, C2).  */
5066         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5067                                OEP_ONLY_CONST)
5068             && operand_equal_p (arg01,
5069                                 const_binop (MINUS_EXPR, arg2,
5070                                              build_int_cst (type, 1), 0),
5071                                 OEP_ONLY_CONST))
5072           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5073                                                    type,
5074                                                    fold_convert (type, arg1),
5075                                                    arg2));
5076         break;
5077
5078       case GE_EXPR:
5079         /* If C1 is C2 + 1, this is max(A, C2).  */
5080         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5081                                OEP_ONLY_CONST)
5082             && operand_equal_p (arg01,
5083                                 const_binop (PLUS_EXPR, arg2,
5084                                              build_int_cst (type, 1), 0),
5085                                 OEP_ONLY_CONST))
5086           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5087                                                    type,
5088                                                    fold_convert (type, arg1),
5089                                                    arg2));
5090         break;
5091       case NE_EXPR:
5092         break;
5093       default:
5094         gcc_unreachable ();
5095       }
5096
5097   return NULL_TREE;
5098 }
5099
5100
5101 \f
5102 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5103 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
5104 #endif
5105
5106 /* EXP is some logical combination of boolean tests.  See if we can
5107    merge it into some range test.  Return the new tree if so.  */
5108
5109 static tree
5110 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5111 {
5112   int or_op = (code == TRUTH_ORIF_EXPR
5113                || code == TRUTH_OR_EXPR);
5114   int in0_p, in1_p, in_p;
5115   tree low0, low1, low, high0, high1, high;
5116   bool strict_overflow_p = false;
5117   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5118   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5119   tree tem;
5120   const char * const warnmsg = G_("assuming signed overflow does not occur "
5121                                   "when simplifying range test");
5122
5123   /* If this is an OR operation, invert both sides; we will invert
5124      again at the end.  */
5125   if (or_op)
5126     in0_p = ! in0_p, in1_p = ! in1_p;
5127
5128   /* If both expressions are the same, if we can merge the ranges, and we
5129      can build the range test, return it or it inverted.  If one of the
5130      ranges is always true or always false, consider it to be the same
5131      expression as the other.  */
5132   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5133       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5134                        in1_p, low1, high1)
5135       && 0 != (tem = (build_range_check (type,
5136                                          lhs != 0 ? lhs
5137                                          : rhs != 0 ? rhs : integer_zero_node,
5138                                          in_p, low, high))))
5139     {
5140       if (strict_overflow_p)
5141         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5142       return or_op ? invert_truthvalue (tem) : tem;
5143     }
5144
5145   /* On machines where the branch cost is expensive, if this is a
5146      short-circuited branch and the underlying object on both sides
5147      is the same, make a non-short-circuit operation.  */
5148   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5149            && lhs != 0 && rhs != 0
5150            && (code == TRUTH_ANDIF_EXPR
5151                || code == TRUTH_ORIF_EXPR)
5152            && operand_equal_p (lhs, rhs, 0))
5153     {
5154       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5155          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5156          which cases we can't do this.  */
5157       if (simple_operand_p (lhs))
5158         return build2 (code == TRUTH_ANDIF_EXPR
5159                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5160                        type, op0, op1);
5161
5162       else if (lang_hooks.decls.global_bindings_p () == 0
5163                && ! CONTAINS_PLACEHOLDER_P (lhs))
5164         {
5165           tree common = save_expr (lhs);
5166
5167           if (0 != (lhs = build_range_check (type, common,
5168                                              or_op ? ! in0_p : in0_p,
5169                                              low0, high0))
5170               && (0 != (rhs = build_range_check (type, common,
5171                                                  or_op ? ! in1_p : in1_p,
5172                                                  low1, high1))))
5173             {
5174               if (strict_overflow_p)
5175                 fold_overflow_warning (warnmsg,
5176                                        WARN_STRICT_OVERFLOW_COMPARISON);
5177               return build2 (code == TRUTH_ANDIF_EXPR
5178                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5179                              type, lhs, rhs);
5180             }
5181         }
5182     }
5183
5184   return 0;
5185 }
5186 \f
5187 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5188    bit value.  Arrange things so the extra bits will be set to zero if and
5189    only if C is signed-extended to its full width.  If MASK is nonzero,
5190    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5191
5192 static tree
5193 unextend (tree c, int p, int unsignedp, tree mask)
5194 {
5195   tree type = TREE_TYPE (c);
5196   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5197   tree temp;
5198
5199   if (p == modesize || unsignedp)
5200     return c;
5201
5202   /* We work by getting just the sign bit into the low-order bit, then
5203      into the high-order bit, then sign-extend.  We then XOR that value
5204      with C.  */
5205   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5206   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5207
5208   /* We must use a signed type in order to get an arithmetic right shift.
5209      However, we must also avoid introducing accidental overflows, so that
5210      a subsequent call to integer_zerop will work.  Hence we must
5211      do the type conversion here.  At this point, the constant is either
5212      zero or one, and the conversion to a signed type can never overflow.
5213      We could get an overflow if this conversion is done anywhere else.  */
5214   if (TYPE_UNSIGNED (type))
5215     temp = fold_convert (signed_type_for (type), temp);
5216
5217   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5218   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5219   if (mask != 0)
5220     temp = const_binop (BIT_AND_EXPR, temp,
5221                         fold_convert (TREE_TYPE (c), mask), 0);
5222   /* If necessary, convert the type back to match the type of C.  */
5223   if (TYPE_UNSIGNED (type))
5224     temp = fold_convert (type, temp);
5225
5226   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5227 }
5228 \f
5229 /* Find ways of folding logical expressions of LHS and RHS:
5230    Try to merge two comparisons to the same innermost item.
5231    Look for range tests like "ch >= '0' && ch <= '9'".
5232    Look for combinations of simple terms on machines with expensive branches
5233    and evaluate the RHS unconditionally.
5234
5235    For example, if we have p->a == 2 && p->b == 4 and we can make an
5236    object large enough to span both A and B, we can do this with a comparison
5237    against the object ANDed with the a mask.
5238
5239    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5240    operations to do this with one comparison.
5241
5242    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5243    function and the one above.
5244
5245    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5246    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5247
5248    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5249    two operands.
5250
5251    We return the simplified tree or 0 if no optimization is possible.  */
5252
5253 static tree
5254 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5255 {
5256   /* If this is the "or" of two comparisons, we can do something if
5257      the comparisons are NE_EXPR.  If this is the "and", we can do something
5258      if the comparisons are EQ_EXPR.  I.e.,
5259         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5260
5261      WANTED_CODE is this operation code.  For single bit fields, we can
5262      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5263      comparison for one-bit fields.  */
5264
5265   enum tree_code wanted_code;
5266   enum tree_code lcode, rcode;
5267   tree ll_arg, lr_arg, rl_arg, rr_arg;
5268   tree ll_inner, lr_inner, rl_inner, rr_inner;
5269   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5270   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5271   HOST_WIDE_INT xll_bitpos, xrl_bitpos;
5272   HOST_WIDE_INT lnbitsize, lnbitpos;
5273   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5274   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5275   enum machine_mode lnmode;
5276   tree ll_mask, lr_mask, rl_mask, rr_mask;
5277   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5278   tree l_const, r_const;
5279   tree lntype, result;
5280   int first_bit, end_bit;
5281   int volatilep;
5282   tree orig_lhs = lhs, orig_rhs = rhs;
5283   enum tree_code orig_code = code;
5284
5285   /* Start by getting the comparison codes.  Fail if anything is volatile.
5286      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5287      it were surrounded with a NE_EXPR.  */
5288
5289   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5290     return 0;
5291
5292   lcode = TREE_CODE (lhs);
5293   rcode = TREE_CODE (rhs);
5294
5295   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5296     {
5297       lhs = build2 (NE_EXPR, truth_type, lhs,
5298                     build_int_cst (TREE_TYPE (lhs), 0));
5299       lcode = NE_EXPR;
5300     }
5301
5302   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5303     {
5304       rhs = build2 (NE_EXPR, truth_type, rhs,
5305                     build_int_cst (TREE_TYPE (rhs), 0));
5306       rcode = NE_EXPR;
5307     }
5308
5309   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5310       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5311     return 0;
5312
5313   ll_arg = TREE_OPERAND (lhs, 0);
5314   lr_arg = TREE_OPERAND (lhs, 1);
5315   rl_arg = TREE_OPERAND (rhs, 0);
5316   rr_arg = TREE_OPERAND (rhs, 1);
5317
5318   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5319   if (simple_operand_p (ll_arg)
5320       && simple_operand_p (lr_arg))
5321     {
5322       tree result;
5323       if (operand_equal_p (ll_arg, rl_arg, 0)
5324           && operand_equal_p (lr_arg, rr_arg, 0))
5325         {
5326           result = combine_comparisons (code, lcode, rcode,
5327                                         truth_type, ll_arg, lr_arg);
5328           if (result)
5329             return result;
5330         }
5331       else if (operand_equal_p (ll_arg, rr_arg, 0)
5332                && operand_equal_p (lr_arg, rl_arg, 0))
5333         {
5334           result = combine_comparisons (code, lcode,
5335                                         swap_tree_comparison (rcode),
5336                                         truth_type, ll_arg, lr_arg);
5337           if (result)
5338             return result;
5339         }
5340     }
5341
5342   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5343           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5344
5345   /* If the RHS can be evaluated unconditionally and its operands are
5346      simple, it wins to evaluate the RHS unconditionally on machines
5347      with expensive branches.  In this case, this isn't a comparison
5348      that can be merged.  Avoid doing this if the RHS is a floating-point
5349      comparison since those can trap.  */
5350
5351   if (BRANCH_COST >= 2
5352       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5353       && simple_operand_p (rl_arg)
5354       && simple_operand_p (rr_arg))
5355     {
5356       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5357       if (code == TRUTH_OR_EXPR
5358           && lcode == NE_EXPR && integer_zerop (lr_arg)
5359           && rcode == NE_EXPR && integer_zerop (rr_arg)
5360           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5361         return build2 (NE_EXPR, truth_type,
5362                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5363                                ll_arg, rl_arg),
5364                        build_int_cst (TREE_TYPE (ll_arg), 0));
5365
5366       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5367       if (code == TRUTH_AND_EXPR
5368           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5369           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5370           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5371         return build2 (EQ_EXPR, truth_type,
5372                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5373                                ll_arg, rl_arg),
5374                        build_int_cst (TREE_TYPE (ll_arg), 0));
5375
5376       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5377         {
5378           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5379             return build2 (code, truth_type, lhs, rhs);
5380           return NULL_TREE;
5381         }
5382     }
5383
5384   /* See if the comparisons can be merged.  Then get all the parameters for
5385      each side.  */
5386
5387   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5388       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5389     return 0;
5390
5391   volatilep = 0;
5392   ll_inner = decode_field_reference (ll_arg,
5393                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5394                                      &ll_unsignedp, &volatilep, &ll_mask,
5395                                      &ll_and_mask);
5396   lr_inner = decode_field_reference (lr_arg,
5397                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5398                                      &lr_unsignedp, &volatilep, &lr_mask,
5399                                      &lr_and_mask);
5400   rl_inner = decode_field_reference (rl_arg,
5401                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5402                                      &rl_unsignedp, &volatilep, &rl_mask,
5403                                      &rl_and_mask);
5404   rr_inner = decode_field_reference (rr_arg,
5405                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5406                                      &rr_unsignedp, &volatilep, &rr_mask,
5407                                      &rr_and_mask);
5408
5409   /* It must be true that the inner operation on the lhs of each
5410      comparison must be the same if we are to be able to do anything.
5411      Then see if we have constants.  If not, the same must be true for
5412      the rhs's.  */
5413   if (volatilep || ll_inner == 0 || rl_inner == 0
5414       || ! operand_equal_p (ll_inner, rl_inner, 0))
5415     return 0;
5416
5417   if (TREE_CODE (lr_arg) == INTEGER_CST
5418       && TREE_CODE (rr_arg) == INTEGER_CST)
5419     l_const = lr_arg, r_const = rr_arg;
5420   else if (lr_inner == 0 || rr_inner == 0
5421            || ! operand_equal_p (lr_inner, rr_inner, 0))
5422     return 0;
5423   else
5424     l_const = r_const = 0;
5425
5426   /* If either comparison code is not correct for our logical operation,
5427      fail.  However, we can convert a one-bit comparison against zero into
5428      the opposite comparison against that bit being set in the field.  */
5429
5430   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5431   if (lcode != wanted_code)
5432     {
5433       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5434         {
5435           /* Make the left operand unsigned, since we are only interested
5436              in the value of one bit.  Otherwise we are doing the wrong
5437              thing below.  */
5438           ll_unsignedp = 1;
5439           l_const = ll_mask;
5440         }
5441       else
5442         return 0;
5443     }
5444
5445   /* This is analogous to the code for l_const above.  */
5446   if (rcode != wanted_code)
5447     {
5448       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5449         {
5450           rl_unsignedp = 1;
5451           r_const = rl_mask;
5452         }
5453       else
5454         return 0;
5455     }
5456
5457   /* See if we can find a mode that contains both fields being compared on
5458      the left.  If we can't, fail.  Otherwise, update all constants and masks
5459      to be relative to a field of that size.  */
5460   first_bit = MIN (ll_bitpos, rl_bitpos);
5461   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5462   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5463                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5464                           volatilep);
5465   if (lnmode == VOIDmode)
5466     return 0;
5467
5468   lnbitsize = GET_MODE_BITSIZE (lnmode);
5469   lnbitpos = first_bit & ~ (lnbitsize - 1);
5470   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5471   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5472
5473   if (BYTES_BIG_ENDIAN)
5474     {
5475       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5476       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5477     }
5478
5479   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5480                          size_int (xll_bitpos), 0);
5481   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5482                          size_int (xrl_bitpos), 0);
5483
5484   if (l_const)
5485     {
5486       l_const = fold_convert (lntype, l_const);
5487       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5488       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5489       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5490                                         fold_build1 (BIT_NOT_EXPR,
5491                                                      lntype, ll_mask),
5492                                         0)))
5493         {
5494           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5495
5496           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5497         }
5498     }
5499   if (r_const)
5500     {
5501       r_const = fold_convert (lntype, r_const);
5502       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5503       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5504       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5505                                         fold_build1 (BIT_NOT_EXPR,
5506                                                      lntype, rl_mask),
5507                                         0)))
5508         {
5509           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5510
5511           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5512         }
5513     }
5514
5515   /* Handle the case of comparisons with constants.  If there is something in
5516      common between the masks, those bits of the constants must be the same.
5517      If not, the condition is always false.  Test for this to avoid generating
5518      incorrect code below.  */
5519   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5520   if (! integer_zerop (result)
5521       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5522                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5523     {
5524       if (wanted_code == NE_EXPR)
5525         {
5526           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5527           return constant_boolean_node (true, truth_type);
5528         }
5529       else
5530         {
5531           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5532           return constant_boolean_node (false, truth_type);
5533         }
5534     }
5535
5536   return NULL_TREE;
5537 }
5538 \f
5539 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5540    constant.  */
5541
5542 static tree
5543 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5544 {
5545   tree arg0 = op0;
5546   enum tree_code op_code;
5547   tree comp_const = op1;
5548   tree minmax_const;
5549   int consts_equal, consts_lt;
5550   tree inner;
5551
5552   STRIP_SIGN_NOPS (arg0);
5553
5554   op_code = TREE_CODE (arg0);
5555   minmax_const = TREE_OPERAND (arg0, 1);
5556   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5557   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5558   inner = TREE_OPERAND (arg0, 0);
5559
5560   /* If something does not permit us to optimize, return the original tree.  */
5561   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5562       || TREE_CODE (comp_const) != INTEGER_CST
5563       || TREE_OVERFLOW (comp_const)
5564       || TREE_CODE (minmax_const) != INTEGER_CST
5565       || TREE_OVERFLOW (minmax_const))
5566     return NULL_TREE;
5567
5568   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5569      and GT_EXPR, doing the rest with recursive calls using logical
5570      simplifications.  */
5571   switch (code)
5572     {
5573     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5574       {
5575         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5576                                           type, op0, op1);
5577         if (tem)
5578           return invert_truthvalue (tem);
5579         return NULL_TREE;
5580       }
5581
5582     case GE_EXPR:
5583       return
5584         fold_build2 (TRUTH_ORIF_EXPR, type,
5585                      optimize_minmax_comparison
5586                      (EQ_EXPR, type, arg0, comp_const),
5587                      optimize_minmax_comparison
5588                      (GT_EXPR, type, arg0, comp_const));
5589
5590     case EQ_EXPR:
5591       if (op_code == MAX_EXPR && consts_equal)
5592         /* MAX (X, 0) == 0  ->  X <= 0  */
5593         return fold_build2 (LE_EXPR, type, inner, comp_const);
5594
5595       else if (op_code == MAX_EXPR && consts_lt)
5596         /* MAX (X, 0) == 5  ->  X == 5   */
5597         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5598
5599       else if (op_code == MAX_EXPR)
5600         /* MAX (X, 0) == -1  ->  false  */
5601         return omit_one_operand (type, integer_zero_node, inner);
5602
5603       else if (consts_equal)
5604         /* MIN (X, 0) == 0  ->  X >= 0  */
5605         return fold_build2 (GE_EXPR, type, inner, comp_const);
5606
5607       else if (consts_lt)
5608         /* MIN (X, 0) == 5  ->  false  */
5609         return omit_one_operand (type, integer_zero_node, inner);
5610
5611       else
5612         /* MIN (X, 0) == -1  ->  X == -1  */
5613         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5614
5615     case GT_EXPR:
5616       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5617         /* MAX (X, 0) > 0  ->  X > 0
5618            MAX (X, 0) > 5  ->  X > 5  */
5619         return fold_build2 (GT_EXPR, type, inner, comp_const);
5620
5621       else if (op_code == MAX_EXPR)
5622         /* MAX (X, 0) > -1  ->  true  */
5623         return omit_one_operand (type, integer_one_node, inner);
5624
5625       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5626         /* MIN (X, 0) > 0  ->  false
5627            MIN (X, 0) > 5  ->  false  */
5628         return omit_one_operand (type, integer_zero_node, inner);
5629
5630       else
5631         /* MIN (X, 0) > -1  ->  X > -1  */
5632         return fold_build2 (GT_EXPR, type, inner, comp_const);
5633
5634     default:
5635       return NULL_TREE;
5636     }
5637 }
5638 \f
5639 /* T is an integer expression that is being multiplied, divided, or taken a
5640    modulus (CODE says which and what kind of divide or modulus) by a
5641    constant C.  See if we can eliminate that operation by folding it with
5642    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5643    should be used for the computation if wider than our type.
5644
5645    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5646    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5647    expression would not overflow or that overflow is undefined for the type
5648    in the language in question.
5649
5650    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5651    the machine has a multiply-accumulate insn or that this is part of an
5652    addressing calculation.
5653
5654    If we return a non-null expression, it is an equivalent form of the
5655    original computation, but need not be in the original type.
5656
5657    We set *STRICT_OVERFLOW_P to true if the return values depends on
5658    signed overflow being undefined.  Otherwise we do not change
5659    *STRICT_OVERFLOW_P.  */
5660
5661 static tree
5662 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5663                 bool *strict_overflow_p)
5664 {
5665   /* To avoid exponential search depth, refuse to allow recursion past
5666      three levels.  Beyond that (1) it's highly unlikely that we'll find
5667      something interesting and (2) we've probably processed it before
5668      when we built the inner expression.  */
5669
5670   static int depth;
5671   tree ret;
5672
5673   if (depth > 3)
5674     return NULL;
5675
5676   depth++;
5677   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5678   depth--;
5679
5680   return ret;
5681 }
5682
5683 static tree
5684 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5685                   bool *strict_overflow_p)
5686 {
5687   tree type = TREE_TYPE (t);
5688   enum tree_code tcode = TREE_CODE (t);
5689   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5690                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5691                 ? wide_type : type);
5692   tree t1, t2;
5693   int same_p = tcode == code;
5694   tree op0 = NULL_TREE, op1 = NULL_TREE;
5695   bool sub_strict_overflow_p;
5696
5697   /* Don't deal with constants of zero here; they confuse the code below.  */
5698   if (integer_zerop (c))
5699     return NULL_TREE;
5700
5701   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5702     op0 = TREE_OPERAND (t, 0);
5703
5704   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5705     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5706
5707   /* Note that we need not handle conditional operations here since fold
5708      already handles those cases.  So just do arithmetic here.  */
5709   switch (tcode)
5710     {
5711     case INTEGER_CST:
5712       /* For a constant, we can always simplify if we are a multiply
5713          or (for divide and modulus) if it is a multiple of our constant.  */
5714       if (code == MULT_EXPR
5715           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5716         return const_binop (code, fold_convert (ctype, t),
5717                             fold_convert (ctype, c), 0);
5718       break;
5719
5720     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5721       /* If op0 is an expression ...  */
5722       if ((COMPARISON_CLASS_P (op0)
5723            || UNARY_CLASS_P (op0)
5724            || BINARY_CLASS_P (op0)
5725            || VL_EXP_CLASS_P (op0)
5726            || EXPRESSION_CLASS_P (op0))
5727           /* ... and is unsigned, and its type is smaller than ctype,
5728              then we cannot pass through as widening.  */
5729           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5730                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5731                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5732                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5733                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5734               /* ... or this is a truncation (t is narrower than op0),
5735                  then we cannot pass through this narrowing.  */
5736               || (GET_MODE_SIZE (TYPE_MODE (type))
5737                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5738               /* ... or signedness changes for division or modulus,
5739                  then we cannot pass through this conversion.  */
5740               || (code != MULT_EXPR
5741                   && (TYPE_UNSIGNED (ctype)
5742                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
5743               /* ... or has undefined overflow while the converted to
5744                  type has not, we cannot do the operation in the inner type
5745                  as that would introduce undefined overflow.  */
5746               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5747                   && !TYPE_OVERFLOW_UNDEFINED (type))))
5748         break;
5749
5750       /* Pass the constant down and see if we can make a simplification.  If
5751          we can, replace this expression with the inner simplification for
5752          possible later conversion to our or some other type.  */
5753       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5754           && TREE_CODE (t2) == INTEGER_CST
5755           && !TREE_OVERFLOW (t2)
5756           && (0 != (t1 = extract_muldiv (op0, t2, code,
5757                                          code == MULT_EXPR
5758                                          ? ctype : NULL_TREE,
5759                                          strict_overflow_p))))
5760         return t1;
5761       break;
5762
5763     case ABS_EXPR:
5764       /* If widening the type changes it from signed to unsigned, then we
5765          must avoid building ABS_EXPR itself as unsigned.  */
5766       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5767         {
5768           tree cstype = (*signed_type_for) (ctype);
5769           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5770               != 0)
5771             {
5772               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5773               return fold_convert (ctype, t1);
5774             }
5775           break;
5776         }
5777       /* If the constant is negative, we cannot simplify this.  */
5778       if (tree_int_cst_sgn (c) == -1)
5779         break;
5780       /* FALLTHROUGH */
5781     case NEGATE_EXPR:
5782       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5783           != 0)
5784         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5785       break;
5786
5787     case MIN_EXPR:  case MAX_EXPR:
5788       /* If widening the type changes the signedness, then we can't perform
5789          this optimization as that changes the result.  */
5790       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5791         break;
5792
5793       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5794       sub_strict_overflow_p = false;
5795       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5796                                 &sub_strict_overflow_p)) != 0
5797           && (t2 = extract_muldiv (op1, c, code, wide_type,
5798                                    &sub_strict_overflow_p)) != 0)
5799         {
5800           if (tree_int_cst_sgn (c) < 0)
5801             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5802           if (sub_strict_overflow_p)
5803             *strict_overflow_p = true;
5804           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5805                               fold_convert (ctype, t2));
5806         }
5807       break;
5808
5809     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5810       /* If the second operand is constant, this is a multiplication
5811          or floor division, by a power of two, so we can treat it that
5812          way unless the multiplier or divisor overflows.  Signed
5813          left-shift overflow is implementation-defined rather than
5814          undefined in C90, so do not convert signed left shift into
5815          multiplication.  */
5816       if (TREE_CODE (op1) == INTEGER_CST
5817           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5818           /* const_binop may not detect overflow correctly,
5819              so check for it explicitly here.  */
5820           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5821           && TREE_INT_CST_HIGH (op1) == 0
5822           && 0 != (t1 = fold_convert (ctype,
5823                                       const_binop (LSHIFT_EXPR,
5824                                                    size_one_node,
5825                                                    op1, 0)))
5826           && !TREE_OVERFLOW (t1))
5827         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5828                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5829                                        ctype, fold_convert (ctype, op0), t1),
5830                                c, code, wide_type, strict_overflow_p);
5831       break;
5832
5833     case PLUS_EXPR:  case MINUS_EXPR:
5834       /* See if we can eliminate the operation on both sides.  If we can, we
5835          can return a new PLUS or MINUS.  If we can't, the only remaining
5836          cases where we can do anything are if the second operand is a
5837          constant.  */
5838       sub_strict_overflow_p = false;
5839       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5840       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5841       if (t1 != 0 && t2 != 0
5842           && (code == MULT_EXPR
5843               /* If not multiplication, we can only do this if both operands
5844                  are divisible by c.  */
5845               || (multiple_of_p (ctype, op0, c)
5846                   && multiple_of_p (ctype, op1, c))))
5847         {
5848           if (sub_strict_overflow_p)
5849             *strict_overflow_p = true;
5850           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5851                               fold_convert (ctype, t2));
5852         }
5853
5854       /* If this was a subtraction, negate OP1 and set it to be an addition.
5855          This simplifies the logic below.  */
5856       if (tcode == MINUS_EXPR)
5857         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5858
5859       if (TREE_CODE (op1) != INTEGER_CST)
5860         break;
5861
5862       /* If either OP1 or C are negative, this optimization is not safe for
5863          some of the division and remainder types while for others we need
5864          to change the code.  */
5865       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5866         {
5867           if (code == CEIL_DIV_EXPR)
5868             code = FLOOR_DIV_EXPR;
5869           else if (code == FLOOR_DIV_EXPR)
5870             code = CEIL_DIV_EXPR;
5871           else if (code != MULT_EXPR
5872                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5873             break;
5874         }
5875
5876       /* If it's a multiply or a division/modulus operation of a multiple
5877          of our constant, do the operation and verify it doesn't overflow.  */
5878       if (code == MULT_EXPR
5879           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5880         {
5881           op1 = const_binop (code, fold_convert (ctype, op1),
5882                              fold_convert (ctype, c), 0);
5883           /* We allow the constant to overflow with wrapping semantics.  */
5884           if (op1 == 0
5885               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5886             break;
5887         }
5888       else
5889         break;
5890
5891       /* If we have an unsigned type is not a sizetype, we cannot widen
5892          the operation since it will change the result if the original
5893          computation overflowed.  */
5894       if (TYPE_UNSIGNED (ctype)
5895           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5896           && ctype != type)
5897         break;
5898
5899       /* If we were able to eliminate our operation from the first side,
5900          apply our operation to the second side and reform the PLUS.  */
5901       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5902         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5903
5904       /* The last case is if we are a multiply.  In that case, we can
5905          apply the distributive law to commute the multiply and addition
5906          if the multiplication of the constants doesn't overflow.  */
5907       if (code == MULT_EXPR)
5908         return fold_build2 (tcode, ctype,
5909                             fold_build2 (code, ctype,
5910                                          fold_convert (ctype, op0),
5911                                          fold_convert (ctype, c)),
5912                             op1);
5913
5914       break;
5915
5916     case MULT_EXPR:
5917       /* We have a special case here if we are doing something like
5918          (C * 8) % 4 since we know that's zero.  */
5919       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5920            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5921           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5922           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5923         return omit_one_operand (type, integer_zero_node, op0);
5924
5925       /* ... fall through ...  */
5926
5927     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5928     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5929       /* If we can extract our operation from the LHS, do so and return a
5930          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5931          do something only if the second operand is a constant.  */
5932       if (same_p
5933           && (t1 = extract_muldiv (op0, c, code, wide_type,
5934                                    strict_overflow_p)) != 0)
5935         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5936                             fold_convert (ctype, op1));
5937       else if (tcode == MULT_EXPR && code == MULT_EXPR
5938                && (t1 = extract_muldiv (op1, c, code, wide_type,
5939                                         strict_overflow_p)) != 0)
5940         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5941                             fold_convert (ctype, t1));
5942       else if (TREE_CODE (op1) != INTEGER_CST)
5943         return 0;
5944
5945       /* If these are the same operation types, we can associate them
5946          assuming no overflow.  */
5947       if (tcode == code
5948           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5949                                      fold_convert (ctype, c), 0))
5950           && !TREE_OVERFLOW (t1))
5951         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5952
5953       /* If these operations "cancel" each other, we have the main
5954          optimizations of this pass, which occur when either constant is a
5955          multiple of the other, in which case we replace this with either an
5956          operation or CODE or TCODE.
5957
5958          If we have an unsigned type that is not a sizetype, we cannot do
5959          this since it will change the result if the original computation
5960          overflowed.  */
5961       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5962            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5963           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5964               || (tcode == MULT_EXPR
5965                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5966                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5967                   && code != MULT_EXPR)))
5968         {
5969           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5970             {
5971               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5972                 *strict_overflow_p = true;
5973               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5974                                   fold_convert (ctype,
5975                                                 const_binop (TRUNC_DIV_EXPR,
5976                                                              op1, c, 0)));
5977             }
5978           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5979             {
5980               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5981                 *strict_overflow_p = true;
5982               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5983                                   fold_convert (ctype,
5984                                                 const_binop (TRUNC_DIV_EXPR,
5985                                                              c, op1, 0)));
5986             }
5987         }
5988       break;
5989
5990     default:
5991       break;
5992     }
5993
5994   return 0;
5995 }
5996 \f
5997 /* Return a node which has the indicated constant VALUE (either 0 or
5998    1), and is of the indicated TYPE.  */
5999
6000 tree
6001 constant_boolean_node (int value, tree type)
6002 {
6003   if (type == integer_type_node)
6004     return value ? integer_one_node : integer_zero_node;
6005   else if (type == boolean_type_node)
6006     return value ? boolean_true_node : boolean_false_node;
6007   else
6008     return build_int_cst (type, value);
6009 }
6010
6011
6012 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6013    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6014    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6015    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6016    COND is the first argument to CODE; otherwise (as in the example
6017    given here), it is the second argument.  TYPE is the type of the
6018    original expression.  Return NULL_TREE if no simplification is
6019    possible.  */
6020
6021 static tree
6022 fold_binary_op_with_conditional_arg (enum tree_code code,
6023                                      tree type, tree op0, tree op1,
6024                                      tree cond, tree arg, int cond_first_p)
6025 {
6026   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6027   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6028   tree test, true_value, false_value;
6029   tree lhs = NULL_TREE;
6030   tree rhs = NULL_TREE;
6031
6032   /* This transformation is only worthwhile if we don't have to wrap
6033      arg in a SAVE_EXPR, and the operation can be simplified on at least
6034      one of the branches once its pushed inside the COND_EXPR.  */
6035   if (!TREE_CONSTANT (arg))
6036     return NULL_TREE;
6037
6038   if (TREE_CODE (cond) == COND_EXPR)
6039     {
6040       test = TREE_OPERAND (cond, 0);
6041       true_value = TREE_OPERAND (cond, 1);
6042       false_value = TREE_OPERAND (cond, 2);
6043       /* If this operand throws an expression, then it does not make
6044          sense to try to perform a logical or arithmetic operation
6045          involving it.  */
6046       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6047         lhs = true_value;
6048       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6049         rhs = false_value;
6050     }
6051   else
6052     {
6053       tree testtype = TREE_TYPE (cond);
6054       test = cond;
6055       true_value = constant_boolean_node (true, testtype);
6056       false_value = constant_boolean_node (false, testtype);
6057     }
6058
6059   arg = fold_convert (arg_type, arg);
6060   if (lhs == 0)
6061     {
6062       true_value = fold_convert (cond_type, true_value);
6063       if (cond_first_p)
6064         lhs = fold_build2 (code, type, true_value, arg);
6065       else
6066         lhs = fold_build2 (code, type, arg, true_value);
6067     }
6068   if (rhs == 0)
6069     {
6070       false_value = fold_convert (cond_type, false_value);
6071       if (cond_first_p)
6072         rhs = fold_build2 (code, type, false_value, arg);
6073       else
6074         rhs = fold_build2 (code, type, arg, false_value);
6075     }
6076
6077   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6078   return fold_convert (type, test);
6079 }
6080
6081 \f
6082 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6083
6084    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6085    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6086    ADDEND is the same as X.
6087
6088    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6089    and finite.  The problematic cases are when X is zero, and its mode
6090    has signed zeros.  In the case of rounding towards -infinity,
6091    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6092    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6093
6094 bool
6095 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6096 {
6097   if (!real_zerop (addend))
6098     return false;
6099
6100   /* Don't allow the fold with -fsignaling-nans.  */
6101   if (HONOR_SNANS (TYPE_MODE (type)))
6102     return false;
6103
6104   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6105   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6106     return true;
6107
6108   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6109   if (TREE_CODE (addend) == REAL_CST
6110       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6111     negate = !negate;
6112
6113   /* The mode has signed zeros, and we have to honor their sign.
6114      In this situation, there is only one case we can return true for.
6115      X - 0 is the same as X unless rounding towards -infinity is
6116      supported.  */
6117   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6118 }
6119
6120 /* Subroutine of fold() that checks comparisons of built-in math
6121    functions against real constants.
6122
6123    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6124    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6125    is the type of the result and ARG0 and ARG1 are the operands of the
6126    comparison.  ARG1 must be a TREE_REAL_CST.
6127
6128    The function returns the constant folded tree if a simplification
6129    can be made, and NULL_TREE otherwise.  */
6130
6131 static tree
6132 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6133                      tree type, tree arg0, tree arg1)
6134 {
6135   REAL_VALUE_TYPE c;
6136
6137   if (BUILTIN_SQRT_P (fcode))
6138     {
6139       tree arg = CALL_EXPR_ARG (arg0, 0);
6140       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6141
6142       c = TREE_REAL_CST (arg1);
6143       if (REAL_VALUE_NEGATIVE (c))
6144         {
6145           /* sqrt(x) < y is always false, if y is negative.  */
6146           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6147             return omit_one_operand (type, integer_zero_node, arg);
6148
6149           /* sqrt(x) > y is always true, if y is negative and we
6150              don't care about NaNs, i.e. negative values of x.  */
6151           if (code == NE_EXPR || !HONOR_NANS (mode))
6152             return omit_one_operand (type, integer_one_node, arg);
6153
6154           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6155           return fold_build2 (GE_EXPR, type, arg,
6156                               build_real (TREE_TYPE (arg), dconst0));
6157         }
6158       else if (code == GT_EXPR || code == GE_EXPR)
6159         {
6160           REAL_VALUE_TYPE c2;
6161
6162           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6163           real_convert (&c2, mode, &c2);
6164
6165           if (REAL_VALUE_ISINF (c2))
6166             {
6167               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6168               if (HONOR_INFINITIES (mode))
6169                 return fold_build2 (EQ_EXPR, type, arg,
6170                                     build_real (TREE_TYPE (arg), c2));
6171
6172               /* sqrt(x) > y is always false, when y is very large
6173                  and we don't care about infinities.  */
6174               return omit_one_operand (type, integer_zero_node, arg);
6175             }
6176
6177           /* sqrt(x) > c is the same as x > c*c.  */
6178           return fold_build2 (code, type, arg,
6179                               build_real (TREE_TYPE (arg), c2));
6180         }
6181       else if (code == LT_EXPR || code == LE_EXPR)
6182         {
6183           REAL_VALUE_TYPE c2;
6184
6185           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6186           real_convert (&c2, mode, &c2);
6187
6188           if (REAL_VALUE_ISINF (c2))
6189             {
6190               /* sqrt(x) < y is always true, when y is a very large
6191                  value and we don't care about NaNs or Infinities.  */
6192               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6193                 return omit_one_operand (type, integer_one_node, arg);
6194
6195               /* sqrt(x) < y is x != +Inf when y is very large and we
6196                  don't care about NaNs.  */
6197               if (! HONOR_NANS (mode))
6198                 return fold_build2 (NE_EXPR, type, arg,
6199                                     build_real (TREE_TYPE (arg), c2));
6200
6201               /* sqrt(x) < y is x >= 0 when y is very large and we
6202                  don't care about Infinities.  */
6203               if (! HONOR_INFINITIES (mode))
6204                 return fold_build2 (GE_EXPR, type, arg,
6205                                     build_real (TREE_TYPE (arg), dconst0));
6206
6207               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6208               if (lang_hooks.decls.global_bindings_p () != 0
6209                   || CONTAINS_PLACEHOLDER_P (arg))
6210                 return NULL_TREE;
6211
6212               arg = save_expr (arg);
6213               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6214                                   fold_build2 (GE_EXPR, type, arg,
6215                                                build_real (TREE_TYPE (arg),
6216                                                            dconst0)),
6217                                   fold_build2 (NE_EXPR, type, arg,
6218                                                build_real (TREE_TYPE (arg),
6219                                                            c2)));
6220             }
6221
6222           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6223           if (! HONOR_NANS (mode))
6224             return fold_build2 (code, type, arg,
6225                                 build_real (TREE_TYPE (arg), c2));
6226
6227           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6228           if (lang_hooks.decls.global_bindings_p () == 0
6229               && ! CONTAINS_PLACEHOLDER_P (arg))
6230             {
6231               arg = save_expr (arg);
6232               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6233                                   fold_build2 (GE_EXPR, type, arg,
6234                                                build_real (TREE_TYPE (arg),
6235                                                            dconst0)),
6236                                   fold_build2 (code, type, arg,
6237                                                build_real (TREE_TYPE (arg),
6238                                                            c2)));
6239             }
6240         }
6241     }
6242
6243   return NULL_TREE;
6244 }
6245
6246 /* Subroutine of fold() that optimizes comparisons against Infinities,
6247    either +Inf or -Inf.
6248
6249    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6250    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6251    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6252
6253    The function returns the constant folded tree if a simplification
6254    can be made, and NULL_TREE otherwise.  */
6255
6256 static tree
6257 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6258 {
6259   enum machine_mode mode;
6260   REAL_VALUE_TYPE max;
6261   tree temp;
6262   bool neg;
6263
6264   mode = TYPE_MODE (TREE_TYPE (arg0));
6265
6266   /* For negative infinity swap the sense of the comparison.  */
6267   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6268   if (neg)
6269     code = swap_tree_comparison (code);
6270
6271   switch (code)
6272     {
6273     case GT_EXPR:
6274       /* x > +Inf is always false, if with ignore sNANs.  */
6275       if (HONOR_SNANS (mode))
6276         return NULL_TREE;
6277       return omit_one_operand (type, integer_zero_node, arg0);
6278
6279     case LE_EXPR:
6280       /* x <= +Inf is always true, if we don't case about NaNs.  */
6281       if (! HONOR_NANS (mode))
6282         return omit_one_operand (type, integer_one_node, arg0);
6283
6284       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6285       if (lang_hooks.decls.global_bindings_p () == 0
6286           && ! CONTAINS_PLACEHOLDER_P (arg0))
6287         {
6288           arg0 = save_expr (arg0);
6289           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6290         }
6291       break;
6292
6293     case EQ_EXPR:
6294     case GE_EXPR:
6295       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6296       real_maxval (&max, neg, mode);
6297       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6298                           arg0, build_real (TREE_TYPE (arg0), max));
6299
6300     case LT_EXPR:
6301       /* x < +Inf is always equal to x <= DBL_MAX.  */
6302       real_maxval (&max, neg, mode);
6303       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6304                           arg0, build_real (TREE_TYPE (arg0), max));
6305
6306     case NE_EXPR:
6307       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6308       real_maxval (&max, neg, mode);
6309       if (! HONOR_NANS (mode))
6310         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6311                             arg0, build_real (TREE_TYPE (arg0), max));
6312
6313       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6314                           arg0, build_real (TREE_TYPE (arg0), max));
6315       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6316
6317     default:
6318       break;
6319     }
6320
6321   return NULL_TREE;
6322 }
6323
6324 /* Subroutine of fold() that optimizes comparisons of a division by
6325    a nonzero integer constant against an integer constant, i.e.
6326    X/C1 op C2.
6327
6328    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6329    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6330    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6331
6332    The function returns the constant folded tree if a simplification
6333    can be made, and NULL_TREE otherwise.  */
6334
6335 static tree
6336 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6337 {
6338   tree prod, tmp, hi, lo;
6339   tree arg00 = TREE_OPERAND (arg0, 0);
6340   tree arg01 = TREE_OPERAND (arg0, 1);
6341   unsigned HOST_WIDE_INT lpart;
6342   HOST_WIDE_INT hpart;
6343   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6344   bool neg_overflow;
6345   int overflow;
6346
6347   /* We have to do this the hard way to detect unsigned overflow.
6348      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6349   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6350                                    TREE_INT_CST_HIGH (arg01),
6351                                    TREE_INT_CST_LOW (arg1),
6352                                    TREE_INT_CST_HIGH (arg1),
6353                                    &lpart, &hpart, unsigned_p);
6354   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6355                                 -1, overflow);
6356   neg_overflow = false;
6357
6358   if (unsigned_p)
6359     {
6360       tmp = int_const_binop (MINUS_EXPR, arg01,
6361                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6362       lo = prod;
6363
6364       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6365       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6366                                        TREE_INT_CST_HIGH (prod),
6367                                        TREE_INT_CST_LOW (tmp),
6368                                        TREE_INT_CST_HIGH (tmp),
6369                                        &lpart, &hpart, unsigned_p);
6370       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6371                                   -1, overflow | TREE_OVERFLOW (prod));
6372     }
6373   else if (tree_int_cst_sgn (arg01) >= 0)
6374     {
6375       tmp = int_const_binop (MINUS_EXPR, arg01,
6376                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6377       switch (tree_int_cst_sgn (arg1))
6378         {
6379         case -1:
6380           neg_overflow = true;
6381           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6382           hi = prod;
6383           break;
6384
6385         case  0:
6386           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6387           hi = tmp;
6388           break;
6389
6390         case  1:
6391           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6392           lo = prod;
6393           break;
6394
6395         default:
6396           gcc_unreachable ();
6397         }
6398     }
6399   else
6400     {
6401       /* A negative divisor reverses the relational operators.  */
6402       code = swap_tree_comparison (code);
6403
6404       tmp = int_const_binop (PLUS_EXPR, arg01,
6405                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6406       switch (tree_int_cst_sgn (arg1))
6407         {
6408         case -1:
6409           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6410           lo = prod;
6411           break;
6412
6413         case  0:
6414           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6415           lo = tmp;
6416           break;
6417
6418         case  1:
6419           neg_overflow = true;
6420           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6421           hi = prod;
6422           break;
6423
6424         default:
6425           gcc_unreachable ();
6426         }
6427     }
6428
6429   switch (code)
6430     {
6431     case EQ_EXPR:
6432       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6433         return omit_one_operand (type, integer_zero_node, arg00);
6434       if (TREE_OVERFLOW (hi))
6435         return fold_build2 (GE_EXPR, type, arg00, lo);
6436       if (TREE_OVERFLOW (lo))
6437         return fold_build2 (LE_EXPR, type, arg00, hi);
6438       return build_range_check (type, arg00, 1, lo, hi);
6439
6440     case NE_EXPR:
6441       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6442         return omit_one_operand (type, integer_one_node, arg00);
6443       if (TREE_OVERFLOW (hi))
6444         return fold_build2 (LT_EXPR, type, arg00, lo);
6445       if (TREE_OVERFLOW (lo))
6446         return fold_build2 (GT_EXPR, type, arg00, hi);
6447       return build_range_check (type, arg00, 0, lo, hi);
6448
6449     case LT_EXPR:
6450       if (TREE_OVERFLOW (lo))
6451         {
6452           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6453           return omit_one_operand (type, tmp, arg00);
6454         }
6455       return fold_build2 (LT_EXPR, type, arg00, lo);
6456
6457     case LE_EXPR:
6458       if (TREE_OVERFLOW (hi))
6459         {
6460           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6461           return omit_one_operand (type, tmp, arg00);
6462         }
6463       return fold_build2 (LE_EXPR, type, arg00, hi);
6464
6465     case GT_EXPR:
6466       if (TREE_OVERFLOW (hi))
6467         {
6468           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6469           return omit_one_operand (type, tmp, arg00);
6470         }
6471       return fold_build2 (GT_EXPR, type, arg00, hi);
6472
6473     case GE_EXPR:
6474       if (TREE_OVERFLOW (lo))
6475         {
6476           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6477           return omit_one_operand (type, tmp, arg00);
6478         }
6479       return fold_build2 (GE_EXPR, type, arg00, lo);
6480
6481     default:
6482       break;
6483     }
6484
6485   return NULL_TREE;
6486 }
6487
6488
6489 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6490    equality/inequality test, then return a simplified form of the test
6491    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6492    result type.  */
6493
6494 static tree
6495 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6496                                      tree result_type)
6497 {
6498   /* If this is testing a single bit, we can optimize the test.  */
6499   if ((code == NE_EXPR || code == EQ_EXPR)
6500       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6501       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6502     {
6503       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6504          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6505       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6506
6507       if (arg00 != NULL_TREE
6508           /* This is only a win if casting to a signed type is cheap,
6509              i.e. when arg00's type is not a partial mode.  */
6510           && TYPE_PRECISION (TREE_TYPE (arg00))
6511              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6512         {
6513           tree stype = signed_type_for (TREE_TYPE (arg00));
6514           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6515                               result_type, fold_convert (stype, arg00),
6516                               build_int_cst (stype, 0));
6517         }
6518     }
6519
6520   return NULL_TREE;
6521 }
6522
6523 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6524    equality/inequality test, then return a simplified form of
6525    the test using shifts and logical operations.  Otherwise return
6526    NULL.  TYPE is the desired result type.  */
6527
6528 tree
6529 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6530                       tree result_type)
6531 {
6532   /* If this is testing a single bit, we can optimize the test.  */
6533   if ((code == NE_EXPR || code == EQ_EXPR)
6534       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6535       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6536     {
6537       tree inner = TREE_OPERAND (arg0, 0);
6538       tree type = TREE_TYPE (arg0);
6539       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6540       enum machine_mode operand_mode = TYPE_MODE (type);
6541       int ops_unsigned;
6542       tree signed_type, unsigned_type, intermediate_type;
6543       tree tem, one;
6544
6545       /* First, see if we can fold the single bit test into a sign-bit
6546          test.  */
6547       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6548                                                  result_type);
6549       if (tem)
6550         return tem;
6551
6552       /* Otherwise we have (A & C) != 0 where C is a single bit,
6553          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6554          Similarly for (A & C) == 0.  */
6555
6556       /* If INNER is a right shift of a constant and it plus BITNUM does
6557          not overflow, adjust BITNUM and INNER.  */
6558       if (TREE_CODE (inner) == RSHIFT_EXPR
6559           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6560           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6561           && bitnum < TYPE_PRECISION (type)
6562           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6563                                    bitnum - TYPE_PRECISION (type)))
6564         {
6565           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6566           inner = TREE_OPERAND (inner, 0);
6567         }
6568
6569       /* If we are going to be able to omit the AND below, we must do our
6570          operations as unsigned.  If we must use the AND, we have a choice.
6571          Normally unsigned is faster, but for some machines signed is.  */
6572 #ifdef LOAD_EXTEND_OP
6573       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6574                       && !flag_syntax_only) ? 0 : 1;
6575 #else
6576       ops_unsigned = 1;
6577 #endif
6578
6579       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6580       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6581       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6582       inner = fold_convert (intermediate_type, inner);
6583
6584       if (bitnum != 0)
6585         inner = build2 (RSHIFT_EXPR, intermediate_type,
6586                         inner, size_int (bitnum));
6587
6588       one = build_int_cst (intermediate_type, 1);
6589
6590       if (code == EQ_EXPR)
6591         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6592
6593       /* Put the AND last so it can combine with more things.  */
6594       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6595
6596       /* Make sure to return the proper type.  */
6597       inner = fold_convert (result_type, inner);
6598
6599       return inner;
6600     }
6601   return NULL_TREE;
6602 }
6603
6604 /* Check whether we are allowed to reorder operands arg0 and arg1,
6605    such that the evaluation of arg1 occurs before arg0.  */
6606
6607 static bool
6608 reorder_operands_p (const_tree arg0, const_tree arg1)
6609 {
6610   if (! flag_evaluation_order)
6611       return true;
6612   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6613     return true;
6614   return ! TREE_SIDE_EFFECTS (arg0)
6615          && ! TREE_SIDE_EFFECTS (arg1);
6616 }
6617
6618 /* Test whether it is preferable two swap two operands, ARG0 and
6619    ARG1, for example because ARG0 is an integer constant and ARG1
6620    isn't.  If REORDER is true, only recommend swapping if we can
6621    evaluate the operands in reverse order.  */
6622
6623 bool
6624 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6625 {
6626   STRIP_SIGN_NOPS (arg0);
6627   STRIP_SIGN_NOPS (arg1);
6628
6629   if (TREE_CODE (arg1) == INTEGER_CST)
6630     return 0;
6631   if (TREE_CODE (arg0) == INTEGER_CST)
6632     return 1;
6633
6634   if (TREE_CODE (arg1) == REAL_CST)
6635     return 0;
6636   if (TREE_CODE (arg0) == REAL_CST)
6637     return 1;
6638
6639   if (TREE_CODE (arg1) == FIXED_CST)
6640     return 0;
6641   if (TREE_CODE (arg0) == FIXED_CST)
6642     return 1;
6643
6644   if (TREE_CODE (arg1) == COMPLEX_CST)
6645     return 0;
6646   if (TREE_CODE (arg0) == COMPLEX_CST)
6647     return 1;
6648
6649   if (TREE_CONSTANT (arg1))
6650     return 0;
6651   if (TREE_CONSTANT (arg0))
6652     return 1;
6653
6654   if (optimize_size)
6655     return 0;
6656
6657   if (reorder && flag_evaluation_order
6658       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6659     return 0;
6660
6661   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6662      for commutative and comparison operators.  Ensuring a canonical
6663      form allows the optimizers to find additional redundancies without
6664      having to explicitly check for both orderings.  */
6665   if (TREE_CODE (arg0) == SSA_NAME
6666       && TREE_CODE (arg1) == SSA_NAME
6667       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6668     return 1;
6669
6670   /* Put SSA_NAMEs last.  */
6671   if (TREE_CODE (arg1) == SSA_NAME)
6672     return 0;
6673   if (TREE_CODE (arg0) == SSA_NAME)
6674     return 1;
6675
6676   /* Put variables last.  */
6677   if (DECL_P (arg1))
6678     return 0;
6679   if (DECL_P (arg0))
6680     return 1;
6681
6682   return 0;
6683 }
6684
6685 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6686    ARG0 is extended to a wider type.  */
6687
6688 static tree
6689 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6690 {
6691   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6692   tree arg1_unw;
6693   tree shorter_type, outer_type;
6694   tree min, max;
6695   bool above, below;
6696
6697   if (arg0_unw == arg0)
6698     return NULL_TREE;
6699   shorter_type = TREE_TYPE (arg0_unw);
6700
6701 #ifdef HAVE_canonicalize_funcptr_for_compare
6702   /* Disable this optimization if we're casting a function pointer
6703      type on targets that require function pointer canonicalization.  */
6704   if (HAVE_canonicalize_funcptr_for_compare
6705       && TREE_CODE (shorter_type) == POINTER_TYPE
6706       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6707     return NULL_TREE;
6708 #endif
6709
6710   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6711     return NULL_TREE;
6712
6713   arg1_unw = get_unwidened (arg1, NULL_TREE);
6714
6715   /* If possible, express the comparison in the shorter mode.  */
6716   if ((code == EQ_EXPR || code == NE_EXPR
6717        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6718       && (TREE_TYPE (arg1_unw) == shorter_type
6719           || (TYPE_PRECISION (shorter_type)
6720               >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6721           || (TREE_CODE (arg1_unw) == INTEGER_CST
6722               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6723                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6724               && int_fits_type_p (arg1_unw, shorter_type))))
6725     return fold_build2 (code, type, arg0_unw,
6726                        fold_convert (shorter_type, arg1_unw));
6727
6728   if (TREE_CODE (arg1_unw) != INTEGER_CST
6729       || TREE_CODE (shorter_type) != INTEGER_TYPE
6730       || !int_fits_type_p (arg1_unw, shorter_type))
6731     return NULL_TREE;
6732
6733   /* If we are comparing with the integer that does not fit into the range
6734      of the shorter type, the result is known.  */
6735   outer_type = TREE_TYPE (arg1_unw);
6736   min = lower_bound_in_type (outer_type, shorter_type);
6737   max = upper_bound_in_type (outer_type, shorter_type);
6738
6739   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6740                                                    max, arg1_unw));
6741   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6742                                                    arg1_unw, min));
6743
6744   switch (code)
6745     {
6746     case EQ_EXPR:
6747       if (above || below)
6748         return omit_one_operand (type, integer_zero_node, arg0);
6749       break;
6750
6751     case NE_EXPR:
6752       if (above || below)
6753         return omit_one_operand (type, integer_one_node, arg0);
6754       break;
6755
6756     case LT_EXPR:
6757     case LE_EXPR:
6758       if (above)
6759         return omit_one_operand (type, integer_one_node, arg0);
6760       else if (below)
6761         return omit_one_operand (type, integer_zero_node, arg0);
6762
6763     case GT_EXPR:
6764     case GE_EXPR:
6765       if (above)
6766         return omit_one_operand (type, integer_zero_node, arg0);
6767       else if (below)
6768         return omit_one_operand (type, integer_one_node, arg0);
6769
6770     default:
6771       break;
6772     }
6773
6774   return NULL_TREE;
6775 }
6776
6777 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6778    ARG0 just the signedness is changed.  */
6779
6780 static tree
6781 fold_sign_changed_comparison (enum tree_code code, tree type,
6782                               tree arg0, tree arg1)
6783 {
6784   tree arg0_inner;
6785   tree inner_type, outer_type;
6786
6787   if (TREE_CODE (arg0) != NOP_EXPR
6788       && TREE_CODE (arg0) != CONVERT_EXPR)
6789     return NULL_TREE;
6790
6791   outer_type = TREE_TYPE (arg0);
6792   arg0_inner = TREE_OPERAND (arg0, 0);
6793   inner_type = TREE_TYPE (arg0_inner);
6794
6795 #ifdef HAVE_canonicalize_funcptr_for_compare
6796   /* Disable this optimization if we're casting a function pointer
6797      type on targets that require function pointer canonicalization.  */
6798   if (HAVE_canonicalize_funcptr_for_compare
6799       && TREE_CODE (inner_type) == POINTER_TYPE
6800       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6801     return NULL_TREE;
6802 #endif
6803
6804   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6805     return NULL_TREE;
6806
6807   if (TREE_CODE (arg1) != INTEGER_CST
6808       && !((TREE_CODE (arg1) == NOP_EXPR
6809             || TREE_CODE (arg1) == CONVERT_EXPR)
6810            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6811     return NULL_TREE;
6812
6813   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6814       && code != NE_EXPR
6815       && code != EQ_EXPR)
6816     return NULL_TREE;
6817
6818   if (TREE_CODE (arg1) == INTEGER_CST)
6819     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6820                                   TREE_INT_CST_HIGH (arg1), 0,
6821                                   TREE_OVERFLOW (arg1));
6822   else
6823     arg1 = fold_convert (inner_type, arg1);
6824
6825   return fold_build2 (code, type, arg0_inner, arg1);
6826 }
6827
6828 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6829    step of the array.  Reconstructs s and delta in the case of s * delta
6830    being an integer constant (and thus already folded).
6831    ADDR is the address. MULT is the multiplicative expression.
6832    If the function succeeds, the new address expression is returned.  Otherwise
6833    NULL_TREE is returned.  */
6834
6835 static tree
6836 try_move_mult_to_index (tree addr, tree op1)
6837 {
6838   tree s, delta, step;
6839   tree ref = TREE_OPERAND (addr, 0), pref;
6840   tree ret, pos;
6841   tree itype;
6842   bool mdim = false;
6843
6844   /*  Strip the nops that might be added when converting op1 to sizetype. */
6845   STRIP_NOPS (op1);
6846
6847   /* Canonicalize op1 into a possibly non-constant delta
6848      and an INTEGER_CST s.  */
6849   if (TREE_CODE (op1) == MULT_EXPR)
6850     {
6851       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6852
6853       STRIP_NOPS (arg0);
6854       STRIP_NOPS (arg1);
6855   
6856       if (TREE_CODE (arg0) == INTEGER_CST)
6857         {
6858           s = arg0;
6859           delta = arg1;
6860         }
6861       else if (TREE_CODE (arg1) == INTEGER_CST)
6862         {
6863           s = arg1;
6864           delta = arg0;
6865         }
6866       else
6867         return NULL_TREE;
6868     }
6869   else if (TREE_CODE (op1) == INTEGER_CST)
6870     {
6871       delta = op1;
6872       s = NULL_TREE;
6873     }
6874   else
6875     {
6876       /* Simulate we are delta * 1.  */
6877       delta = op1;
6878       s = integer_one_node;
6879     }
6880
6881   for (;; ref = TREE_OPERAND (ref, 0))
6882     {
6883       if (TREE_CODE (ref) == ARRAY_REF)
6884         {
6885           /* Remember if this was a multi-dimensional array.  */
6886           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6887             mdim = true;
6888
6889           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6890           if (! itype)
6891             continue;
6892
6893           step = array_ref_element_size (ref);
6894           if (TREE_CODE (step) != INTEGER_CST)
6895             continue;
6896
6897           if (s)
6898             {
6899               if (! tree_int_cst_equal (step, s))
6900                 continue;
6901             }
6902           else
6903             {
6904               /* Try if delta is a multiple of step.  */
6905               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6906               if (! tmp)
6907                 continue;
6908               delta = tmp;
6909             }
6910
6911           /* Only fold here if we can verify we do not overflow one
6912              dimension of a multi-dimensional array.  */
6913           if (mdim)
6914             {
6915               tree tmp;
6916
6917               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6918                   || !INTEGRAL_TYPE_P (itype)
6919                   || !TYPE_MAX_VALUE (itype)
6920                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6921                 continue;
6922
6923               tmp = fold_binary (PLUS_EXPR, itype,
6924                                  fold_convert (itype,
6925                                                TREE_OPERAND (ref, 1)),
6926                                  fold_convert (itype, delta));
6927               if (!tmp
6928                   || TREE_CODE (tmp) != INTEGER_CST
6929                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6930                 continue;
6931             }
6932
6933           break;
6934         }
6935       else
6936         mdim = false;
6937
6938       if (!handled_component_p (ref))
6939         return NULL_TREE;
6940     }
6941
6942   /* We found the suitable array reference.  So copy everything up to it,
6943      and replace the index.  */
6944
6945   pref = TREE_OPERAND (addr, 0);
6946   ret = copy_node (pref);
6947   pos = ret;
6948
6949   while (pref != ref)
6950     {
6951       pref = TREE_OPERAND (pref, 0);
6952       TREE_OPERAND (pos, 0) = copy_node (pref);
6953       pos = TREE_OPERAND (pos, 0);
6954     }
6955
6956   TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
6957                                        fold_convert (itype,
6958                                                      TREE_OPERAND (pos, 1)),
6959                                        fold_convert (itype, delta));
6960
6961   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6962 }
6963
6964
6965 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6966    means A >= Y && A != MAX, but in this case we know that
6967    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6968
6969 static tree
6970 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6971 {
6972   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6973
6974   if (TREE_CODE (bound) == LT_EXPR)
6975     a = TREE_OPERAND (bound, 0);
6976   else if (TREE_CODE (bound) == GT_EXPR)
6977     a = TREE_OPERAND (bound, 1);
6978   else
6979     return NULL_TREE;
6980
6981   typea = TREE_TYPE (a);
6982   if (!INTEGRAL_TYPE_P (typea)
6983       && !POINTER_TYPE_P (typea))
6984     return NULL_TREE;
6985
6986   if (TREE_CODE (ineq) == LT_EXPR)
6987     {
6988       a1 = TREE_OPERAND (ineq, 1);
6989       y = TREE_OPERAND (ineq, 0);
6990     }
6991   else if (TREE_CODE (ineq) == GT_EXPR)
6992     {
6993       a1 = TREE_OPERAND (ineq, 0);
6994       y = TREE_OPERAND (ineq, 1);
6995     }
6996   else
6997     return NULL_TREE;
6998
6999   if (TREE_TYPE (a1) != typea)
7000     return NULL_TREE;
7001
7002   if (POINTER_TYPE_P (typea))
7003     {
7004       /* Convert the pointer types into integer before taking the difference.  */
7005       tree ta = fold_convert (ssizetype, a);
7006       tree ta1 = fold_convert (ssizetype, a1);
7007       diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7008     }
7009   else
7010    diff = fold_binary (MINUS_EXPR, typea, a1, a);
7011
7012   if (!diff || !integer_onep (diff))
7013    return NULL_TREE;
7014
7015   return fold_build2 (GE_EXPR, type, a, y);
7016 }
7017
7018 /* Fold a sum or difference of at least one multiplication.
7019    Returns the folded tree or NULL if no simplification could be made.  */
7020
7021 static tree
7022 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7023 {
7024   tree arg00, arg01, arg10, arg11;
7025   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7026
7027   /* (A * C) +- (B * C) -> (A+-B) * C.
7028      (A * C) +- A -> A * (C+-1).
7029      We are most concerned about the case where C is a constant,
7030      but other combinations show up during loop reduction.  Since
7031      it is not difficult, try all four possibilities.  */
7032
7033   if (TREE_CODE (arg0) == MULT_EXPR)
7034     {
7035       arg00 = TREE_OPERAND (arg0, 0);
7036       arg01 = TREE_OPERAND (arg0, 1);
7037     }
7038   else if (TREE_CODE (arg0) == INTEGER_CST)
7039     {
7040       arg00 = build_one_cst (type);
7041       arg01 = arg0;
7042     }
7043   else
7044     {
7045       /* We cannot generate constant 1 for fract.  */
7046       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7047         return NULL_TREE;
7048       arg00 = arg0;
7049       arg01 = build_one_cst (type);
7050     }
7051   if (TREE_CODE (arg1) == MULT_EXPR)
7052     {
7053       arg10 = TREE_OPERAND (arg1, 0);
7054       arg11 = TREE_OPERAND (arg1, 1);
7055     }
7056   else if (TREE_CODE (arg1) == INTEGER_CST)
7057     {
7058       arg10 = build_one_cst (type);
7059       arg11 = arg1;
7060     }
7061   else
7062     {
7063       /* We cannot generate constant 1 for fract.  */
7064       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7065         return NULL_TREE;
7066       arg10 = arg1;
7067       arg11 = build_one_cst (type);
7068     }
7069   same = NULL_TREE;
7070
7071   if (operand_equal_p (arg01, arg11, 0))
7072     same = arg01, alt0 = arg00, alt1 = arg10;
7073   else if (operand_equal_p (arg00, arg10, 0))
7074     same = arg00, alt0 = arg01, alt1 = arg11;
7075   else if (operand_equal_p (arg00, arg11, 0))
7076     same = arg00, alt0 = arg01, alt1 = arg10;
7077   else if (operand_equal_p (arg01, arg10, 0))
7078     same = arg01, alt0 = arg00, alt1 = arg11;
7079
7080   /* No identical multiplicands; see if we can find a common
7081      power-of-two factor in non-power-of-two multiplies.  This
7082      can help in multi-dimensional array access.  */
7083   else if (host_integerp (arg01, 0)
7084            && host_integerp (arg11, 0))
7085     {
7086       HOST_WIDE_INT int01, int11, tmp;
7087       bool swap = false;
7088       tree maybe_same;
7089       int01 = TREE_INT_CST_LOW (arg01);
7090       int11 = TREE_INT_CST_LOW (arg11);
7091
7092       /* Move min of absolute values to int11.  */
7093       if ((int01 >= 0 ? int01 : -int01)
7094           < (int11 >= 0 ? int11 : -int11))
7095         {
7096           tmp = int01, int01 = int11, int11 = tmp;
7097           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7098           maybe_same = arg01;
7099           swap = true;
7100         }
7101       else
7102         maybe_same = arg11;
7103
7104       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7105         {
7106           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7107                               build_int_cst (TREE_TYPE (arg00),
7108                                              int01 / int11));
7109           alt1 = arg10;
7110           same = maybe_same;
7111           if (swap)
7112             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7113         }
7114     }
7115
7116   if (same)
7117     return fold_build2 (MULT_EXPR, type,
7118                         fold_build2 (code, type,
7119                                      fold_convert (type, alt0),
7120                                      fold_convert (type, alt1)),
7121                         fold_convert (type, same));
7122
7123   return NULL_TREE;
7124 }
7125
7126 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7127    specified by EXPR into the buffer PTR of length LEN bytes.
7128    Return the number of bytes placed in the buffer, or zero
7129    upon failure.  */
7130
7131 static int
7132 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7133 {
7134   tree type = TREE_TYPE (expr);
7135   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7136   int byte, offset, word, words;
7137   unsigned char value;
7138
7139   if (total_bytes > len)
7140     return 0;
7141   words = total_bytes / UNITS_PER_WORD;
7142
7143   for (byte = 0; byte < total_bytes; byte++)
7144     {
7145       int bitpos = byte * BITS_PER_UNIT;
7146       if (bitpos < HOST_BITS_PER_WIDE_INT)
7147         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7148       else
7149         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7150                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7151
7152       if (total_bytes > UNITS_PER_WORD)
7153         {
7154           word = byte / UNITS_PER_WORD;
7155           if (WORDS_BIG_ENDIAN)
7156             word = (words - 1) - word;
7157           offset = word * UNITS_PER_WORD;
7158           if (BYTES_BIG_ENDIAN)
7159             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7160           else
7161             offset += byte % UNITS_PER_WORD;
7162         }
7163       else
7164         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7165       ptr[offset] = value;
7166     }
7167   return total_bytes;
7168 }
7169
7170
7171 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7172    specified by EXPR into the buffer PTR of length LEN bytes.
7173    Return the number of bytes placed in the buffer, or zero
7174    upon failure.  */
7175
7176 static int
7177 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7178 {
7179   tree type = TREE_TYPE (expr);
7180   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7181   int byte, offset, word, words, bitpos;
7182   unsigned char value;
7183
7184   /* There are always 32 bits in each long, no matter the size of
7185      the hosts long.  We handle floating point representations with
7186      up to 192 bits.  */
7187   long tmp[6];
7188
7189   if (total_bytes > len)
7190     return 0;
7191   words = 32 / UNITS_PER_WORD;
7192
7193   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7194
7195   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7196        bitpos += BITS_PER_UNIT)
7197     {
7198       byte = (bitpos / BITS_PER_UNIT) & 3;
7199       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7200
7201       if (UNITS_PER_WORD < 4)
7202         {
7203           word = byte / UNITS_PER_WORD;
7204           if (WORDS_BIG_ENDIAN)
7205             word = (words - 1) - word;
7206           offset = word * UNITS_PER_WORD;
7207           if (BYTES_BIG_ENDIAN)
7208             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7209           else
7210             offset += byte % UNITS_PER_WORD;
7211         }
7212       else
7213         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7214       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7215     }
7216   return total_bytes;
7217 }
7218
7219 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7220    specified by EXPR into the buffer PTR of length LEN bytes.
7221    Return the number of bytes placed in the buffer, or zero
7222    upon failure.  */
7223
7224 static int
7225 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7226 {
7227   int rsize, isize;
7228   tree part;
7229
7230   part = TREE_REALPART (expr);
7231   rsize = native_encode_expr (part, ptr, len);
7232   if (rsize == 0)
7233     return 0;
7234   part = TREE_IMAGPART (expr);
7235   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7236   if (isize != rsize)
7237     return 0;
7238   return rsize + isize;
7239 }
7240
7241
7242 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7243    specified by EXPR into the buffer PTR of length LEN bytes.
7244    Return the number of bytes placed in the buffer, or zero
7245    upon failure.  */
7246
7247 static int
7248 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7249 {
7250   int i, size, offset, count;
7251   tree itype, elem, elements;
7252
7253   offset = 0;
7254   elements = TREE_VECTOR_CST_ELTS (expr);
7255   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7256   itype = TREE_TYPE (TREE_TYPE (expr));
7257   size = GET_MODE_SIZE (TYPE_MODE (itype));
7258   for (i = 0; i < count; i++)
7259     {
7260       if (elements)
7261         {
7262           elem = TREE_VALUE (elements);
7263           elements = TREE_CHAIN (elements);
7264         }
7265       else
7266         elem = NULL_TREE;
7267
7268       if (elem)
7269         {
7270           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7271             return 0;
7272         }
7273       else
7274         {
7275           if (offset + size > len)
7276             return 0;
7277           memset (ptr+offset, 0, size);
7278         }
7279       offset += size;
7280     }
7281   return offset;
7282 }
7283
7284
7285 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7286    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7287    buffer PTR of length LEN bytes.  Return the number of bytes
7288    placed in the buffer, or zero upon failure.  */
7289
7290 int
7291 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7292 {
7293   switch (TREE_CODE (expr))
7294     {
7295     case INTEGER_CST:
7296       return native_encode_int (expr, ptr, len);
7297
7298     case REAL_CST:
7299       return native_encode_real (expr, ptr, len);
7300
7301     case COMPLEX_CST:
7302       return native_encode_complex (expr, ptr, len);
7303
7304     case VECTOR_CST:
7305       return native_encode_vector (expr, ptr, len);
7306
7307     default:
7308       return 0;
7309     }
7310 }
7311
7312
7313 /* Subroutine of native_interpret_expr.  Interpret the contents of
7314    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7315    If the buffer cannot be interpreted, return NULL_TREE.  */
7316
7317 static tree
7318 native_interpret_int (tree type, const unsigned char *ptr, int len)
7319 {
7320   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7321   int byte, offset, word, words;
7322   unsigned char value;
7323   unsigned int HOST_WIDE_INT lo = 0;
7324   HOST_WIDE_INT hi = 0;
7325
7326   if (total_bytes > len)
7327     return NULL_TREE;
7328   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7329     return NULL_TREE;
7330   words = total_bytes / UNITS_PER_WORD;
7331
7332   for (byte = 0; byte < total_bytes; byte++)
7333     {
7334       int bitpos = byte * BITS_PER_UNIT;
7335       if (total_bytes > UNITS_PER_WORD)
7336         {
7337           word = byte / UNITS_PER_WORD;
7338           if (WORDS_BIG_ENDIAN)
7339             word = (words - 1) - word;
7340           offset = word * UNITS_PER_WORD;
7341           if (BYTES_BIG_ENDIAN)
7342             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7343           else
7344             offset += byte % UNITS_PER_WORD;
7345         }
7346       else
7347         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7348       value = ptr[offset];
7349
7350       if (bitpos < HOST_BITS_PER_WIDE_INT)
7351         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7352       else
7353         hi |= (unsigned HOST_WIDE_INT) value
7354               << (bitpos - HOST_BITS_PER_WIDE_INT);
7355     }
7356
7357   return build_int_cst_wide_type (type, lo, hi);
7358 }
7359
7360
7361 /* Subroutine of native_interpret_expr.  Interpret the contents of
7362    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7363    If the buffer cannot be interpreted, return NULL_TREE.  */
7364
7365 static tree
7366 native_interpret_real (tree type, const unsigned char *ptr, int len)
7367 {
7368   enum machine_mode mode = TYPE_MODE (type);
7369   int total_bytes = GET_MODE_SIZE (mode);
7370   int byte, offset, word, words, bitpos;
7371   unsigned char value;
7372   /* There are always 32 bits in each long, no matter the size of
7373      the hosts long.  We handle floating point representations with
7374      up to 192 bits.  */
7375   REAL_VALUE_TYPE r;
7376   long tmp[6];
7377
7378   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7379   if (total_bytes > len || total_bytes > 24)
7380     return NULL_TREE;
7381   words = 32 / UNITS_PER_WORD;
7382
7383   memset (tmp, 0, sizeof (tmp));
7384   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7385        bitpos += BITS_PER_UNIT)
7386     {
7387       byte = (bitpos / BITS_PER_UNIT) & 3;
7388       if (UNITS_PER_WORD < 4)
7389         {
7390           word = byte / UNITS_PER_WORD;
7391           if (WORDS_BIG_ENDIAN)
7392             word = (words - 1) - word;
7393           offset = word * UNITS_PER_WORD;
7394           if (BYTES_BIG_ENDIAN)
7395             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7396           else
7397             offset += byte % UNITS_PER_WORD;
7398         }
7399       else
7400         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7401       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7402
7403       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7404     }
7405
7406   real_from_target (&r, tmp, mode);
7407   return build_real (type, r);
7408 }
7409
7410
7411 /* Subroutine of native_interpret_expr.  Interpret the contents of
7412    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7413    If the buffer cannot be interpreted, return NULL_TREE.  */
7414
7415 static tree
7416 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7417 {
7418   tree etype, rpart, ipart;
7419   int size;
7420
7421   etype = TREE_TYPE (type);
7422   size = GET_MODE_SIZE (TYPE_MODE (etype));
7423   if (size * 2 > len)
7424     return NULL_TREE;
7425   rpart = native_interpret_expr (etype, ptr, size);
7426   if (!rpart)
7427     return NULL_TREE;
7428   ipart = native_interpret_expr (etype, ptr+size, size);
7429   if (!ipart)
7430     return NULL_TREE;
7431   return build_complex (type, rpart, ipart);
7432 }
7433
7434
7435 /* Subroutine of native_interpret_expr.  Interpret the contents of
7436    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7437    If the buffer cannot be interpreted, return NULL_TREE.  */
7438
7439 static tree
7440 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7441 {
7442   tree etype, elem, elements;
7443   int i, size, count;
7444
7445   etype = TREE_TYPE (type);
7446   size = GET_MODE_SIZE (TYPE_MODE (etype));
7447   count = TYPE_VECTOR_SUBPARTS (type);
7448   if (size * count > len)
7449     return NULL_TREE;
7450
7451   elements = NULL_TREE;
7452   for (i = count - 1; i >= 0; i--)
7453     {
7454       elem = native_interpret_expr (etype, ptr+(i*size), size);
7455       if (!elem)
7456         return NULL_TREE;
7457       elements = tree_cons (NULL_TREE, elem, elements);
7458     }
7459   return build_vector (type, elements);
7460 }
7461
7462
7463 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7464    the buffer PTR of length LEN as a constant of type TYPE.  For
7465    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7466    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7467    return NULL_TREE.  */
7468
7469 tree
7470 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7471 {
7472   switch (TREE_CODE (type))
7473     {
7474     case INTEGER_TYPE:
7475     case ENUMERAL_TYPE:
7476     case BOOLEAN_TYPE:
7477       return native_interpret_int (type, ptr, len);
7478
7479     case REAL_TYPE:
7480       return native_interpret_real (type, ptr, len);
7481
7482     case COMPLEX_TYPE:
7483       return native_interpret_complex (type, ptr, len);
7484
7485     case VECTOR_TYPE:
7486       return native_interpret_vector (type, ptr, len);
7487
7488     default:
7489       return NULL_TREE;
7490     }
7491 }
7492
7493
7494 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7495    TYPE at compile-time.  If we're unable to perform the conversion
7496    return NULL_TREE.  */
7497
7498 static tree
7499 fold_view_convert_expr (tree type, tree expr)
7500 {
7501   /* We support up to 512-bit values (for V8DFmode).  */
7502   unsigned char buffer[64];
7503   int len;
7504
7505   /* Check that the host and target are sane.  */
7506   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7507     return NULL_TREE;
7508
7509   len = native_encode_expr (expr, buffer, sizeof (buffer));
7510   if (len == 0)
7511     return NULL_TREE;
7512
7513   return native_interpret_expr (type, buffer, len);
7514 }
7515
7516 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7517    to avoid confusing the gimplify process.  When IN_FOLD is true
7518    avoid modifications of T.  */
7519
7520 static tree
7521 build_fold_addr_expr_with_type_1 (tree t, tree ptrtype, bool in_fold)
7522 {
7523   /* The size of the object is not relevant when talking about its address.  */
7524   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7525     t = TREE_OPERAND (t, 0);
7526
7527   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7528   if (TREE_CODE (t) == INDIRECT_REF
7529       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7530     {
7531       t = TREE_OPERAND (t, 0);
7532
7533       if (TREE_TYPE (t) != ptrtype)
7534         t = build1 (NOP_EXPR, ptrtype, t);
7535     }
7536   else if (!in_fold)
7537     {
7538       tree base = t;
7539
7540       while (handled_component_p (base))
7541         base = TREE_OPERAND (base, 0);
7542
7543       if (DECL_P (base))
7544         TREE_ADDRESSABLE (base) = 1;
7545
7546       t = build1 (ADDR_EXPR, ptrtype, t);
7547     }
7548   else
7549     t = build1 (ADDR_EXPR, ptrtype, t);
7550
7551   return t;
7552 }
7553
7554 /* Build an expression for the address of T with type PTRTYPE.  This
7555    function modifies the input parameter 'T' by sometimes setting the
7556    TREE_ADDRESSABLE flag.  */
7557
7558 tree
7559 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7560 {
7561   return build_fold_addr_expr_with_type_1 (t, ptrtype, false);
7562 }
7563
7564 /* Build an expression for the address of T.  This function modifies
7565    the input parameter 'T' by sometimes setting the TREE_ADDRESSABLE
7566    flag.  When called from fold functions, use fold_addr_expr instead.  */
7567
7568 tree
7569 build_fold_addr_expr (tree t)
7570 {
7571   return build_fold_addr_expr_with_type_1 (t, 
7572                                            build_pointer_type (TREE_TYPE (t)),
7573                                            false);
7574 }
7575
7576 /* Same as build_fold_addr_expr, builds an expression for the address
7577    of T, but avoids touching the input node 't'.  Fold functions
7578    should use this version.  */
7579
7580 static tree
7581 fold_addr_expr (tree t)
7582 {
7583   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7584
7585   return build_fold_addr_expr_with_type_1 (t, ptrtype, true);
7586 }
7587
7588 /* Fold a unary expression of code CODE and type TYPE with operand
7589    OP0.  Return the folded expression if folding is successful.
7590    Otherwise, return NULL_TREE.  */
7591
7592 tree
7593 fold_unary (enum tree_code code, tree type, tree op0)
7594 {
7595   tree tem;
7596   tree arg0;
7597   enum tree_code_class kind = TREE_CODE_CLASS (code);
7598
7599   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7600               && TREE_CODE_LENGTH (code) == 1);
7601
7602   arg0 = op0;
7603   if (arg0)
7604     {
7605       if (code == NOP_EXPR || code == CONVERT_EXPR
7606           || code == FLOAT_EXPR || code == ABS_EXPR)
7607         {
7608           /* Don't use STRIP_NOPS, because signedness of argument type
7609              matters.  */
7610           STRIP_SIGN_NOPS (arg0);
7611         }
7612       else
7613         {
7614           /* Strip any conversions that don't change the mode.  This
7615              is safe for every expression, except for a comparison
7616              expression because its signedness is derived from its
7617              operands.
7618
7619              Note that this is done as an internal manipulation within
7620              the constant folder, in order to find the simplest
7621              representation of the arguments so that their form can be
7622              studied.  In any cases, the appropriate type conversions
7623              should be put back in the tree that will get out of the
7624              constant folder.  */
7625           STRIP_NOPS (arg0);
7626         }
7627     }
7628
7629   if (TREE_CODE_CLASS (code) == tcc_unary)
7630     {
7631       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7632         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7633                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7634       else if (TREE_CODE (arg0) == COND_EXPR)
7635         {
7636           tree arg01 = TREE_OPERAND (arg0, 1);
7637           tree arg02 = TREE_OPERAND (arg0, 2);
7638           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7639             arg01 = fold_build1 (code, type, arg01);
7640           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7641             arg02 = fold_build1 (code, type, arg02);
7642           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7643                              arg01, arg02);
7644
7645           /* If this was a conversion, and all we did was to move into
7646              inside the COND_EXPR, bring it back out.  But leave it if
7647              it is a conversion from integer to integer and the
7648              result precision is no wider than a word since such a
7649              conversion is cheap and may be optimized away by combine,
7650              while it couldn't if it were outside the COND_EXPR.  Then return
7651              so we don't get into an infinite recursion loop taking the
7652              conversion out and then back in.  */
7653
7654           if ((code == NOP_EXPR || code == CONVERT_EXPR
7655                || code == NON_LVALUE_EXPR)
7656               && TREE_CODE (tem) == COND_EXPR
7657               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7658               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7659               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7660               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7661               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7662                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7663               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7664                      && (INTEGRAL_TYPE_P
7665                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7666                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7667                   || flag_syntax_only))
7668             tem = build1 (code, type,
7669                           build3 (COND_EXPR,
7670                                   TREE_TYPE (TREE_OPERAND
7671                                              (TREE_OPERAND (tem, 1), 0)),
7672                                   TREE_OPERAND (tem, 0),
7673                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7674                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7675           return tem;
7676         }
7677       else if (COMPARISON_CLASS_P (arg0))
7678         {
7679           if (TREE_CODE (type) == BOOLEAN_TYPE)
7680             {
7681               arg0 = copy_node (arg0);
7682               TREE_TYPE (arg0) = type;
7683               return arg0;
7684             }
7685           else if (TREE_CODE (type) != INTEGER_TYPE)
7686             return fold_build3 (COND_EXPR, type, arg0,
7687                                 fold_build1 (code, type,
7688                                              integer_one_node),
7689                                 fold_build1 (code, type,
7690                                              integer_zero_node));
7691         }
7692    }
7693
7694   switch (code)
7695     {
7696     case PAREN_EXPR:
7697       /* Re-association barriers around constants and other re-association
7698          barriers can be removed.  */
7699       if (CONSTANT_CLASS_P (op0)
7700           || TREE_CODE (op0) == PAREN_EXPR)
7701         return fold_convert (type, op0);
7702       return NULL_TREE;
7703
7704     case NOP_EXPR:
7705     case FLOAT_EXPR:
7706     case CONVERT_EXPR:
7707     case FIX_TRUNC_EXPR:
7708       if (TREE_TYPE (op0) == type)
7709         return op0;
7710       
7711       /* If we have (type) (a CMP b) and type is an integral type, return
7712          new expression involving the new type.  */
7713       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7714         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7715                             TREE_OPERAND (op0, 1));
7716
7717       /* Handle cases of two conversions in a row.  */
7718       if (TREE_CODE (op0) == NOP_EXPR
7719           || TREE_CODE (op0) == CONVERT_EXPR)
7720         {
7721           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7722           tree inter_type = TREE_TYPE (op0);
7723           int inside_int = INTEGRAL_TYPE_P (inside_type);
7724           int inside_ptr = POINTER_TYPE_P (inside_type);
7725           int inside_float = FLOAT_TYPE_P (inside_type);
7726           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7727           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7728           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7729           int inter_int = INTEGRAL_TYPE_P (inter_type);
7730           int inter_ptr = POINTER_TYPE_P (inter_type);
7731           int inter_float = FLOAT_TYPE_P (inter_type);
7732           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7733           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7734           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7735           int final_int = INTEGRAL_TYPE_P (type);
7736           int final_ptr = POINTER_TYPE_P (type);
7737           int final_float = FLOAT_TYPE_P (type);
7738           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7739           unsigned int final_prec = TYPE_PRECISION (type);
7740           int final_unsignedp = TYPE_UNSIGNED (type);
7741
7742           /* In addition to the cases of two conversions in a row
7743              handled below, if we are converting something to its own
7744              type via an object of identical or wider precision, neither
7745              conversion is needed.  */
7746           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7747               && (((inter_int || inter_ptr) && final_int)
7748                   || (inter_float && final_float))
7749               && inter_prec >= final_prec)
7750             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7751
7752           /* Likewise, if the intermediate and final types are either both
7753              float or both integer, we don't need the middle conversion if
7754              it is wider than the final type and doesn't change the signedness
7755              (for integers).  Avoid this if the final type is a pointer
7756              since then we sometimes need the inner conversion.  Likewise if
7757              the outer has a precision not equal to the size of its mode.  */
7758           if (((inter_int && inside_int)
7759                || (inter_float && inside_float)
7760                || (inter_vec && inside_vec))
7761               && inter_prec >= inside_prec
7762               && (inter_float || inter_vec
7763                   || inter_unsignedp == inside_unsignedp)
7764               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7765                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7766               && ! final_ptr
7767               && (! final_vec || inter_prec == inside_prec))
7768             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7769
7770           /* If we have a sign-extension of a zero-extended value, we can
7771              replace that by a single zero-extension.  */
7772           if (inside_int && inter_int && final_int
7773               && inside_prec < inter_prec && inter_prec < final_prec
7774               && inside_unsignedp && !inter_unsignedp)
7775             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7776
7777           /* Two conversions in a row are not needed unless:
7778              - some conversion is floating-point (overstrict for now), or
7779              - some conversion is a vector (overstrict for now), or
7780              - the intermediate type is narrower than both initial and
7781                final, or
7782              - the intermediate type and innermost type differ in signedness,
7783                and the outermost type is wider than the intermediate, or
7784              - the initial type is a pointer type and the precisions of the
7785                intermediate and final types differ, or
7786              - the final type is a pointer type and the precisions of the
7787                initial and intermediate types differ.
7788              - the initial type is a pointer to an array and the final type
7789                not.  */
7790           if (! inside_float && ! inter_float && ! final_float
7791               && ! inside_vec && ! inter_vec && ! final_vec
7792               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7793               && ! (inside_int && inter_int
7794                     && inter_unsignedp != inside_unsignedp
7795                     && inter_prec < final_prec)
7796               && ((inter_unsignedp && inter_prec > inside_prec)
7797                   == (final_unsignedp && final_prec > inter_prec))
7798               && ! (inside_ptr && inter_prec != final_prec)
7799               && ! (final_ptr && inside_prec != inter_prec)
7800               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7801                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7802               && ! (inside_ptr && final_ptr
7803                     && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
7804                     && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
7805             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7806         }
7807
7808       /* Handle (T *)&A.B.C for A being of type T and B and C
7809          living at offset zero.  This occurs frequently in
7810          C++ upcasting and then accessing the base.  */
7811       if (TREE_CODE (op0) == ADDR_EXPR
7812           && POINTER_TYPE_P (type)
7813           && handled_component_p (TREE_OPERAND (op0, 0)))
7814         {
7815           HOST_WIDE_INT bitsize, bitpos;
7816           tree offset;
7817           enum machine_mode mode;
7818           int unsignedp, volatilep;
7819           tree base = TREE_OPERAND (op0, 0);
7820           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7821                                       &mode, &unsignedp, &volatilep, false);
7822           /* If the reference was to a (constant) zero offset, we can use
7823              the address of the base if it has the same base type
7824              as the result type.  */
7825           if (! offset && bitpos == 0
7826               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7827                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7828             return fold_convert (type, fold_addr_expr (base));
7829         }
7830
7831       if ((TREE_CODE (op0) == MODIFY_EXPR
7832            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7833           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7834           /* Detect assigning a bitfield.  */
7835           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7836                && DECL_BIT_FIELD
7837                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7838         {
7839           /* Don't leave an assignment inside a conversion
7840              unless assigning a bitfield.  */
7841           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7842           /* First do the assignment, then return converted constant.  */
7843           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7844           TREE_NO_WARNING (tem) = 1;
7845           TREE_USED (tem) = 1;
7846           return tem;
7847         }
7848
7849       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7850          constants (if x has signed type, the sign bit cannot be set
7851          in c).  This folds extension into the BIT_AND_EXPR.  */
7852       if (INTEGRAL_TYPE_P (type)
7853           && TREE_CODE (type) != BOOLEAN_TYPE
7854           && TREE_CODE (op0) == BIT_AND_EXPR
7855           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7856         {
7857           tree and = op0;
7858           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7859           int change = 0;
7860
7861           if (TYPE_UNSIGNED (TREE_TYPE (and))
7862               || (TYPE_PRECISION (type)
7863                   <= TYPE_PRECISION (TREE_TYPE (and))))
7864             change = 1;
7865           else if (TYPE_PRECISION (TREE_TYPE (and1))
7866                    <= HOST_BITS_PER_WIDE_INT
7867                    && host_integerp (and1, 1))
7868             {
7869               unsigned HOST_WIDE_INT cst;
7870
7871               cst = tree_low_cst (and1, 1);
7872               cst &= (HOST_WIDE_INT) -1
7873                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7874               change = (cst == 0);
7875 #ifdef LOAD_EXTEND_OP
7876               if (change
7877                   && !flag_syntax_only
7878                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7879                       == ZERO_EXTEND))
7880                 {
7881                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7882                   and0 = fold_convert (uns, and0);
7883                   and1 = fold_convert (uns, and1);
7884                 }
7885 #endif
7886             }
7887           if (change)
7888             {
7889               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7890                                            TREE_INT_CST_HIGH (and1), 0,
7891                                            TREE_OVERFLOW (and1));
7892               return fold_build2 (BIT_AND_EXPR, type,
7893                                   fold_convert (type, and0), tem);
7894             }
7895         }
7896
7897       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
7898          when one of the new casts will fold away. Conservatively we assume
7899          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
7900       if (POINTER_TYPE_P (type)
7901           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
7902           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7903               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7904               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7905         {
7906           tree arg00 = TREE_OPERAND (arg0, 0);
7907           tree arg01 = TREE_OPERAND (arg0, 1);
7908
7909           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7910                               fold_convert (sizetype, arg01));
7911         }
7912
7913       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7914          of the same precision, and X is an integer type not narrower than
7915          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7916       if (INTEGRAL_TYPE_P (type)
7917           && TREE_CODE (op0) == BIT_NOT_EXPR
7918           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7919           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7920               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7921           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7922         {
7923           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7924           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7925               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7926             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7927         }
7928
7929       tem = fold_convert_const (code, type, op0);
7930       return tem ? tem : NULL_TREE;
7931
7932     case FIXED_CONVERT_EXPR:
7933       tem = fold_convert_const (code, type, arg0);
7934       return tem ? tem : NULL_TREE;
7935
7936     case VIEW_CONVERT_EXPR:
7937       if (TREE_TYPE (op0) == type)
7938         return op0;
7939       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7940         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7941
7942       /* For integral conversions with the same precision or pointer
7943          conversions use a NOP_EXPR instead.  */
7944       if ((INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7945            && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
7946            /* Do not muck with VIEW_CONVERT_EXPRs that convert from
7947               a sub-type to its base type as generated by the Ada FE.  */
7948            && !TREE_TYPE (TREE_TYPE (op0)))
7949           || (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE (op0))))
7950         return fold_convert (type, op0);
7951
7952       /* Strip inner integral conversions that do not change the precision.  */
7953       if ((TREE_CODE (op0) == NOP_EXPR
7954            || TREE_CODE (op0) == CONVERT_EXPR)
7955           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7956           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
7957           && (TYPE_PRECISION (TREE_TYPE (op0))
7958               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
7959         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7960
7961       return fold_view_convert_expr (type, op0);
7962
7963     case NEGATE_EXPR:
7964       tem = fold_negate_expr (arg0);
7965       if (tem)
7966         return fold_convert (type, tem);
7967       return NULL_TREE;
7968
7969     case ABS_EXPR:
7970       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7971         return fold_abs_const (arg0, type);
7972       else if (TREE_CODE (arg0) == NEGATE_EXPR)
7973         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7974       /* Convert fabs((double)float) into (double)fabsf(float).  */
7975       else if (TREE_CODE (arg0) == NOP_EXPR
7976                && TREE_CODE (type) == REAL_TYPE)
7977         {
7978           tree targ0 = strip_float_extensions (arg0);
7979           if (targ0 != arg0)
7980             return fold_convert (type, fold_build1 (ABS_EXPR,
7981                                                     TREE_TYPE (targ0),
7982                                                     targ0));
7983         }
7984       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
7985       else if (TREE_CODE (arg0) == ABS_EXPR)
7986         return arg0;
7987       else if (tree_expr_nonnegative_p (arg0))
7988         return arg0;
7989
7990       /* Strip sign ops from argument.  */
7991       if (TREE_CODE (type) == REAL_TYPE)
7992         {
7993           tem = fold_strip_sign_ops (arg0);
7994           if (tem)
7995             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7996         }
7997       return NULL_TREE;
7998
7999     case CONJ_EXPR:
8000       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8001         return fold_convert (type, arg0);
8002       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8003         {
8004           tree itype = TREE_TYPE (type);
8005           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8006           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8007           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8008         }
8009       if (TREE_CODE (arg0) == COMPLEX_CST)
8010         {
8011           tree itype = TREE_TYPE (type);
8012           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8013           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8014           return build_complex (type, rpart, negate_expr (ipart));
8015         }
8016       if (TREE_CODE (arg0) == CONJ_EXPR)
8017         return fold_convert (type, TREE_OPERAND (arg0, 0));
8018       return NULL_TREE;
8019
8020     case BIT_NOT_EXPR:
8021       if (TREE_CODE (arg0) == INTEGER_CST)
8022         return fold_not_const (arg0, type);
8023       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8024         return fold_convert (type, TREE_OPERAND (arg0, 0));
8025       /* Convert ~ (-A) to A - 1.  */
8026       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8027         return fold_build2 (MINUS_EXPR, type,
8028                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8029                             build_int_cst (type, 1));
8030       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8031       else if (INTEGRAL_TYPE_P (type)
8032                && ((TREE_CODE (arg0) == MINUS_EXPR
8033                     && integer_onep (TREE_OPERAND (arg0, 1)))
8034                    || (TREE_CODE (arg0) == PLUS_EXPR
8035                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8036         return fold_build1 (NEGATE_EXPR, type,
8037                             fold_convert (type, TREE_OPERAND (arg0, 0)));
8038       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8039       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8040                && (tem = fold_unary (BIT_NOT_EXPR, type,
8041                                      fold_convert (type,
8042                                                    TREE_OPERAND (arg0, 0)))))
8043         return fold_build2 (BIT_XOR_EXPR, type, tem,
8044                             fold_convert (type, TREE_OPERAND (arg0, 1)));
8045       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8046                && (tem = fold_unary (BIT_NOT_EXPR, type,
8047                                      fold_convert (type,
8048                                                    TREE_OPERAND (arg0, 1)))))
8049         return fold_build2 (BIT_XOR_EXPR, type,
8050                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8051       /* Perform BIT_NOT_EXPR on each element individually.  */
8052       else if (TREE_CODE (arg0) == VECTOR_CST)
8053         {
8054           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8055           int count = TYPE_VECTOR_SUBPARTS (type), i;
8056
8057           for (i = 0; i < count; i++)
8058             {
8059               if (elements)
8060                 {
8061                   elem = TREE_VALUE (elements);
8062                   elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8063                   if (elem == NULL_TREE)
8064                     break;
8065                   elements = TREE_CHAIN (elements);
8066                 }
8067               else
8068                 elem = build_int_cst (TREE_TYPE (type), -1);
8069               list = tree_cons (NULL_TREE, elem, list);
8070             }
8071           if (i == count)
8072             return build_vector (type, nreverse (list));
8073         }
8074
8075       return NULL_TREE;
8076
8077     case TRUTH_NOT_EXPR:
8078       /* The argument to invert_truthvalue must have Boolean type.  */
8079       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8080           arg0 = fold_convert (boolean_type_node, arg0);
8081
8082       /* Note that the operand of this must be an int
8083          and its values must be 0 or 1.
8084          ("true" is a fixed value perhaps depending on the language,
8085          but we don't handle values other than 1 correctly yet.)  */
8086       tem = fold_truth_not_expr (arg0);
8087       if (!tem)
8088         return NULL_TREE;
8089       return fold_convert (type, tem);
8090
8091     case REALPART_EXPR:
8092       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8093         return fold_convert (type, arg0);
8094       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8095         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8096                                  TREE_OPERAND (arg0, 1));
8097       if (TREE_CODE (arg0) == COMPLEX_CST)
8098         return fold_convert (type, TREE_REALPART (arg0));
8099       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8100         {
8101           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8102           tem = fold_build2 (TREE_CODE (arg0), itype,
8103                              fold_build1 (REALPART_EXPR, itype,
8104                                           TREE_OPERAND (arg0, 0)),
8105                              fold_build1 (REALPART_EXPR, itype,
8106                                           TREE_OPERAND (arg0, 1)));
8107           return fold_convert (type, tem);
8108         }
8109       if (TREE_CODE (arg0) == CONJ_EXPR)
8110         {
8111           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8112           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8113           return fold_convert (type, tem);
8114         }
8115       if (TREE_CODE (arg0) == CALL_EXPR)
8116         {
8117           tree fn = get_callee_fndecl (arg0);
8118           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8119             switch (DECL_FUNCTION_CODE (fn))
8120               {
8121               CASE_FLT_FN (BUILT_IN_CEXPI):
8122                 fn = mathfn_built_in (type, BUILT_IN_COS);
8123                 if (fn)
8124                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8125                 break;
8126
8127               default:
8128                 break;
8129               }
8130         }
8131       return NULL_TREE;
8132
8133     case IMAGPART_EXPR:
8134       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8135         return fold_convert (type, integer_zero_node);
8136       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8137         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8138                                  TREE_OPERAND (arg0, 0));
8139       if (TREE_CODE (arg0) == COMPLEX_CST)
8140         return fold_convert (type, TREE_IMAGPART (arg0));
8141       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8142         {
8143           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8144           tem = fold_build2 (TREE_CODE (arg0), itype,
8145                              fold_build1 (IMAGPART_EXPR, itype,
8146                                           TREE_OPERAND (arg0, 0)),
8147                              fold_build1 (IMAGPART_EXPR, itype,
8148                                           TREE_OPERAND (arg0, 1)));
8149           return fold_convert (type, tem);
8150         }
8151       if (TREE_CODE (arg0) == CONJ_EXPR)
8152         {
8153           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8154           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8155           return fold_convert (type, negate_expr (tem));
8156         }
8157       if (TREE_CODE (arg0) == CALL_EXPR)
8158         {
8159           tree fn = get_callee_fndecl (arg0);
8160           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8161             switch (DECL_FUNCTION_CODE (fn))
8162               {
8163               CASE_FLT_FN (BUILT_IN_CEXPI):
8164                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8165                 if (fn)
8166                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8167                 break;
8168
8169               default:
8170                 break;
8171               }
8172         }
8173       return NULL_TREE;
8174
8175     default:
8176       return NULL_TREE;
8177     } /* switch (code) */
8178 }
8179
8180 /* Fold a binary expression of code CODE and type TYPE with operands
8181    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8182    Return the folded expression if folding is successful.  Otherwise,
8183    return NULL_TREE.  */
8184
8185 static tree
8186 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8187 {
8188   enum tree_code compl_code;
8189
8190   if (code == MIN_EXPR)
8191     compl_code = MAX_EXPR;
8192   else if (code == MAX_EXPR)
8193     compl_code = MIN_EXPR;
8194   else
8195     gcc_unreachable ();
8196
8197   /* MIN (MAX (a, b), b) == b.  */
8198   if (TREE_CODE (op0) == compl_code
8199       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8200     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8201
8202   /* MIN (MAX (b, a), b) == b.  */
8203   if (TREE_CODE (op0) == compl_code
8204       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8205       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8206     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8207
8208   /* MIN (a, MAX (a, b)) == a.  */
8209   if (TREE_CODE (op1) == compl_code
8210       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8211       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8212     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8213
8214   /* MIN (a, MAX (b, a)) == a.  */
8215   if (TREE_CODE (op1) == compl_code
8216       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8217       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8218     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8219
8220   return NULL_TREE;
8221 }
8222
8223 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8224    by changing CODE to reduce the magnitude of constants involved in
8225    ARG0 of the comparison.
8226    Returns a canonicalized comparison tree if a simplification was
8227    possible, otherwise returns NULL_TREE.
8228    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8229    valid if signed overflow is undefined.  */
8230
8231 static tree
8232 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8233                                  tree arg0, tree arg1,
8234                                  bool *strict_overflow_p)
8235 {
8236   enum tree_code code0 = TREE_CODE (arg0);
8237   tree t, cst0 = NULL_TREE;
8238   int sgn0;
8239   bool swap = false;
8240
8241   /* Match A +- CST code arg1 and CST code arg1.  */
8242   if (!(((code0 == MINUS_EXPR
8243           || code0 == PLUS_EXPR)
8244          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8245         || code0 == INTEGER_CST))
8246     return NULL_TREE;
8247
8248   /* Identify the constant in arg0 and its sign.  */
8249   if (code0 == INTEGER_CST)
8250     cst0 = arg0;
8251   else
8252     cst0 = TREE_OPERAND (arg0, 1);
8253   sgn0 = tree_int_cst_sgn (cst0);
8254
8255   /* Overflowed constants and zero will cause problems.  */
8256   if (integer_zerop (cst0)
8257       || TREE_OVERFLOW (cst0))
8258     return NULL_TREE;
8259
8260   /* See if we can reduce the magnitude of the constant in
8261      arg0 by changing the comparison code.  */
8262   if (code0 == INTEGER_CST)
8263     {
8264       /* CST <= arg1  ->  CST-1 < arg1.  */
8265       if (code == LE_EXPR && sgn0 == 1)
8266         code = LT_EXPR;
8267       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8268       else if (code == LT_EXPR && sgn0 == -1)
8269         code = LE_EXPR;
8270       /* CST > arg1  ->  CST-1 >= arg1.  */
8271       else if (code == GT_EXPR && sgn0 == 1)
8272         code = GE_EXPR;
8273       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8274       else if (code == GE_EXPR && sgn0 == -1)
8275         code = GT_EXPR;
8276       else
8277         return NULL_TREE;
8278       /* arg1 code' CST' might be more canonical.  */
8279       swap = true;
8280     }
8281   else
8282     {
8283       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8284       if (code == LT_EXPR
8285           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8286         code = LE_EXPR;
8287       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8288       else if (code == GT_EXPR
8289                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8290         code = GE_EXPR;
8291       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8292       else if (code == LE_EXPR
8293                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8294         code = LT_EXPR;
8295       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8296       else if (code == GE_EXPR
8297                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8298         code = GT_EXPR;
8299       else
8300         return NULL_TREE;
8301       *strict_overflow_p = true;
8302     }
8303
8304   /* Now build the constant reduced in magnitude.  */
8305   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8306                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8307   if (code0 != INTEGER_CST)
8308     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8309
8310   /* If swapping might yield to a more canonical form, do so.  */
8311   if (swap)
8312     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8313   else
8314     return fold_build2 (code, type, t, arg1);
8315 }
8316
8317 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8318    overflow further.  Try to decrease the magnitude of constants involved
8319    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8320    and put sole constants at the second argument position.
8321    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8322
8323 static tree
8324 maybe_canonicalize_comparison (enum tree_code code, tree type,
8325                                tree arg0, tree arg1)
8326 {
8327   tree t;
8328   bool strict_overflow_p;
8329   const char * const warnmsg = G_("assuming signed overflow does not occur "
8330                                   "when reducing constant in comparison");
8331
8332   /* In principle pointers also have undefined overflow behavior,
8333      but that causes problems elsewhere.  */
8334   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8335       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8336     return NULL_TREE;
8337
8338   /* Try canonicalization by simplifying arg0.  */
8339   strict_overflow_p = false;
8340   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8341                                        &strict_overflow_p);
8342   if (t)
8343     {
8344       if (strict_overflow_p)
8345         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8346       return t;
8347     }
8348
8349   /* Try canonicalization by simplifying arg1 using the swapped
8350      comparison.  */
8351   code = swap_tree_comparison (code);
8352   strict_overflow_p = false;
8353   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8354                                        &strict_overflow_p);
8355   if (t && strict_overflow_p)
8356     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8357   return t;
8358 }
8359
8360 /* Subroutine of fold_binary.  This routine performs all of the
8361    transformations that are common to the equality/inequality
8362    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8363    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8364    fold_binary should call fold_binary.  Fold a comparison with
8365    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8366    the folded comparison or NULL_TREE.  */
8367
8368 static tree
8369 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8370 {
8371   tree arg0, arg1, tem;
8372
8373   arg0 = op0;
8374   arg1 = op1;
8375
8376   STRIP_SIGN_NOPS (arg0);
8377   STRIP_SIGN_NOPS (arg1);
8378
8379   tem = fold_relational_const (code, type, arg0, arg1);
8380   if (tem != NULL_TREE)
8381     return tem;
8382
8383   /* If one arg is a real or integer constant, put it last.  */
8384   if (tree_swap_operands_p (arg0, arg1, true))
8385     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8386
8387   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8388   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8389       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8390           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8391           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8392       && (TREE_CODE (arg1) == INTEGER_CST
8393           && !TREE_OVERFLOW (arg1)))
8394     {
8395       tree const1 = TREE_OPERAND (arg0, 1);
8396       tree const2 = arg1;
8397       tree variable = TREE_OPERAND (arg0, 0);
8398       tree lhs;
8399       int lhs_add;
8400       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8401
8402       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8403                          TREE_TYPE (arg1), const2, const1);
8404
8405       /* If the constant operation overflowed this can be
8406          simplified as a comparison against INT_MAX/INT_MIN.  */
8407       if (TREE_CODE (lhs) == INTEGER_CST
8408           && TREE_OVERFLOW (lhs))
8409         {
8410           int const1_sgn = tree_int_cst_sgn (const1);
8411           enum tree_code code2 = code;
8412
8413           /* Get the sign of the constant on the lhs if the
8414              operation were VARIABLE + CONST1.  */
8415           if (TREE_CODE (arg0) == MINUS_EXPR)
8416             const1_sgn = -const1_sgn;
8417
8418           /* The sign of the constant determines if we overflowed
8419              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8420              Canonicalize to the INT_MIN overflow by swapping the comparison
8421              if necessary.  */
8422           if (const1_sgn == -1)
8423             code2 = swap_tree_comparison (code);
8424
8425           /* We now can look at the canonicalized case
8426                VARIABLE + 1  CODE2  INT_MIN
8427              and decide on the result.  */
8428           if (code2 == LT_EXPR
8429               || code2 == LE_EXPR
8430               || code2 == EQ_EXPR)
8431             return omit_one_operand (type, boolean_false_node, variable);
8432           else if (code2 == NE_EXPR
8433                    || code2 == GE_EXPR
8434                    || code2 == GT_EXPR)
8435             return omit_one_operand (type, boolean_true_node, variable);
8436         }
8437
8438       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8439           && (TREE_CODE (lhs) != INTEGER_CST
8440               || !TREE_OVERFLOW (lhs)))
8441         {
8442           fold_overflow_warning (("assuming signed overflow does not occur "
8443                                   "when changing X +- C1 cmp C2 to "
8444                                   "X cmp C1 +- C2"),
8445                                  WARN_STRICT_OVERFLOW_COMPARISON);
8446           return fold_build2 (code, type, variable, lhs);
8447         }
8448     }
8449
8450   /* For comparisons of pointers we can decompose it to a compile time
8451      comparison of the base objects and the offsets into the object.
8452      This requires at least one operand being an ADDR_EXPR or a
8453      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8454   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8455       && (TREE_CODE (arg0) == ADDR_EXPR
8456           || TREE_CODE (arg1) == ADDR_EXPR
8457           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8458           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8459     {
8460       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8461       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8462       enum machine_mode mode;
8463       int volatilep, unsignedp;
8464       bool indirect_base0 = false;
8465
8466       /* Get base and offset for the access.  Strip ADDR_EXPR for
8467          get_inner_reference, but put it back by stripping INDIRECT_REF
8468          off the base object if possible.  */
8469       base0 = arg0;
8470       if (TREE_CODE (arg0) == ADDR_EXPR)
8471         {
8472           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8473                                        &bitsize, &bitpos0, &offset0, &mode,
8474                                        &unsignedp, &volatilep, false);
8475           if (TREE_CODE (base0) == INDIRECT_REF)
8476             base0 = TREE_OPERAND (base0, 0);
8477           else
8478             indirect_base0 = true;
8479         }
8480       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8481         {
8482           base0 = TREE_OPERAND (arg0, 0);
8483           offset0 = TREE_OPERAND (arg0, 1);
8484         }
8485
8486       base1 = arg1;
8487       if (TREE_CODE (arg1) == ADDR_EXPR)
8488         {
8489           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8490                                        &bitsize, &bitpos1, &offset1, &mode,
8491                                        &unsignedp, &volatilep, false);
8492           /* We have to make sure to have an indirect/non-indirect base1
8493              just the same as we did for base0.  */
8494           if (TREE_CODE (base1) == INDIRECT_REF
8495               && !indirect_base0)
8496             base1 = TREE_OPERAND (base1, 0);
8497           else if (!indirect_base0)
8498             base1 = NULL_TREE;
8499         }
8500       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8501         {
8502           base1 = TREE_OPERAND (arg1, 0);
8503           offset1 = TREE_OPERAND (arg1, 1);
8504         }
8505       else if (indirect_base0)
8506         base1 = NULL_TREE;
8507
8508       /* If we have equivalent bases we might be able to simplify.  */
8509       if (base0 && base1
8510           && operand_equal_p (base0, base1, 0))
8511         {
8512           /* We can fold this expression to a constant if the non-constant
8513              offset parts are equal.  */
8514           if (offset0 == offset1
8515               || (offset0 && offset1
8516                   && operand_equal_p (offset0, offset1, 0)))
8517             {
8518               switch (code)
8519                 {
8520                 case EQ_EXPR:
8521                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8522                 case NE_EXPR:
8523                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8524                 case LT_EXPR:
8525                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8526                 case LE_EXPR:
8527                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8528                 case GE_EXPR:
8529                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8530                 case GT_EXPR:
8531                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8532                 default:;
8533                 }
8534             }
8535           /* We can simplify the comparison to a comparison of the variable
8536              offset parts if the constant offset parts are equal.
8537              Be careful to use signed size type here because otherwise we
8538              mess with array offsets in the wrong way.  This is possible
8539              because pointer arithmetic is restricted to retain within an
8540              object and overflow on pointer differences is undefined as of
8541              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8542           else if (bitpos0 == bitpos1)
8543             {
8544               tree signed_size_type_node;
8545               signed_size_type_node = signed_type_for (size_type_node);
8546
8547               /* By converting to signed size type we cover middle-end pointer
8548                  arithmetic which operates on unsigned pointer types of size
8549                  type size and ARRAY_REF offsets which are properly sign or
8550                  zero extended from their type in case it is narrower than
8551                  size type.  */
8552               if (offset0 == NULL_TREE)
8553                 offset0 = build_int_cst (signed_size_type_node, 0);
8554               else
8555                 offset0 = fold_convert (signed_size_type_node, offset0);
8556               if (offset1 == NULL_TREE)
8557                 offset1 = build_int_cst (signed_size_type_node, 0);
8558               else
8559                 offset1 = fold_convert (signed_size_type_node, offset1);
8560
8561               return fold_build2 (code, type, offset0, offset1);
8562             }
8563         }
8564     }
8565
8566   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8567      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8568      the resulting offset is smaller in absolute value than the
8569      original one.  */
8570   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8571       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8572       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8573           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8574       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8575       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8576           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8577     {
8578       tree const1 = TREE_OPERAND (arg0, 1);
8579       tree const2 = TREE_OPERAND (arg1, 1);
8580       tree variable1 = TREE_OPERAND (arg0, 0);
8581       tree variable2 = TREE_OPERAND (arg1, 0);
8582       tree cst;
8583       const char * const warnmsg = G_("assuming signed overflow does not "
8584                                       "occur when combining constants around "
8585                                       "a comparison");
8586
8587       /* Put the constant on the side where it doesn't overflow and is
8588          of lower absolute value than before.  */
8589       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8590                              ? MINUS_EXPR : PLUS_EXPR,
8591                              const2, const1, 0);
8592       if (!TREE_OVERFLOW (cst)
8593           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8594         {
8595           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8596           return fold_build2 (code, type,
8597                               variable1,
8598                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8599                                            variable2, cst));
8600         }
8601
8602       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8603                              ? MINUS_EXPR : PLUS_EXPR,
8604                              const1, const2, 0);
8605       if (!TREE_OVERFLOW (cst)
8606           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8607         {
8608           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8609           return fold_build2 (code, type,
8610                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8611                                            variable1, cst),
8612                               variable2);
8613         }
8614     }
8615
8616   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8617      signed arithmetic case.  That form is created by the compiler
8618      often enough for folding it to be of value.  One example is in
8619      computing loop trip counts after Operator Strength Reduction.  */
8620   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8621       && TREE_CODE (arg0) == MULT_EXPR
8622       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8623           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8624       && integer_zerop (arg1))
8625     {
8626       tree const1 = TREE_OPERAND (arg0, 1);
8627       tree const2 = arg1;                       /* zero */
8628       tree variable1 = TREE_OPERAND (arg0, 0);
8629       enum tree_code cmp_code = code;
8630
8631       gcc_assert (!integer_zerop (const1));
8632
8633       fold_overflow_warning (("assuming signed overflow does not occur when "
8634                               "eliminating multiplication in comparison "
8635                               "with zero"),
8636                              WARN_STRICT_OVERFLOW_COMPARISON);
8637
8638       /* If const1 is negative we swap the sense of the comparison.  */
8639       if (tree_int_cst_sgn (const1) < 0)
8640         cmp_code = swap_tree_comparison (cmp_code);
8641
8642       return fold_build2 (cmp_code, type, variable1, const2);
8643     }
8644
8645   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8646   if (tem)
8647     return tem;
8648
8649   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8650     {
8651       tree targ0 = strip_float_extensions (arg0);
8652       tree targ1 = strip_float_extensions (arg1);
8653       tree newtype = TREE_TYPE (targ0);
8654
8655       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8656         newtype = TREE_TYPE (targ1);
8657
8658       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8659       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8660         return fold_build2 (code, type, fold_convert (newtype, targ0),
8661                             fold_convert (newtype, targ1));
8662
8663       /* (-a) CMP (-b) -> b CMP a  */
8664       if (TREE_CODE (arg0) == NEGATE_EXPR
8665           && TREE_CODE (arg1) == NEGATE_EXPR)
8666         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8667                             TREE_OPERAND (arg0, 0));
8668
8669       if (TREE_CODE (arg1) == REAL_CST)
8670         {
8671           REAL_VALUE_TYPE cst;
8672           cst = TREE_REAL_CST (arg1);
8673
8674           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8675           if (TREE_CODE (arg0) == NEGATE_EXPR)
8676             return fold_build2 (swap_tree_comparison (code), type,
8677                                 TREE_OPERAND (arg0, 0),
8678                                 build_real (TREE_TYPE (arg1),
8679                                             REAL_VALUE_NEGATE (cst)));
8680
8681           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8682           /* a CMP (-0) -> a CMP 0  */
8683           if (REAL_VALUE_MINUS_ZERO (cst))
8684             return fold_build2 (code, type, arg0,
8685                                 build_real (TREE_TYPE (arg1), dconst0));
8686
8687           /* x != NaN is always true, other ops are always false.  */
8688           if (REAL_VALUE_ISNAN (cst)
8689               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8690             {
8691               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8692               return omit_one_operand (type, tem, arg0);
8693             }
8694
8695           /* Fold comparisons against infinity.  */
8696           if (REAL_VALUE_ISINF (cst))
8697             {
8698               tem = fold_inf_compare (code, type, arg0, arg1);
8699               if (tem != NULL_TREE)
8700                 return tem;
8701             }
8702         }
8703
8704       /* If this is a comparison of a real constant with a PLUS_EXPR
8705          or a MINUS_EXPR of a real constant, we can convert it into a
8706          comparison with a revised real constant as long as no overflow
8707          occurs when unsafe_math_optimizations are enabled.  */
8708       if (flag_unsafe_math_optimizations
8709           && TREE_CODE (arg1) == REAL_CST
8710           && (TREE_CODE (arg0) == PLUS_EXPR
8711               || TREE_CODE (arg0) == MINUS_EXPR)
8712           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8713           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8714                                       ? MINUS_EXPR : PLUS_EXPR,
8715                                       arg1, TREE_OPERAND (arg0, 1), 0))
8716           && !TREE_OVERFLOW (tem))
8717         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8718
8719       /* Likewise, we can simplify a comparison of a real constant with
8720          a MINUS_EXPR whose first operand is also a real constant, i.e.
8721          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
8722          floating-point types only if -fassociative-math is set.  */
8723       if (flag_associative_math
8724           && TREE_CODE (arg1) == REAL_CST
8725           && TREE_CODE (arg0) == MINUS_EXPR
8726           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8727           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8728                                       arg1, 0))
8729           && !TREE_OVERFLOW (tem))
8730         return fold_build2 (swap_tree_comparison (code), type,
8731                             TREE_OPERAND (arg0, 1), tem);
8732
8733       /* Fold comparisons against built-in math functions.  */
8734       if (TREE_CODE (arg1) == REAL_CST
8735           && flag_unsafe_math_optimizations
8736           && ! flag_errno_math)
8737         {
8738           enum built_in_function fcode = builtin_mathfn_code (arg0);
8739
8740           if (fcode != END_BUILTINS)
8741             {
8742               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8743               if (tem != NULL_TREE)
8744                 return tem;
8745             }
8746         }
8747     }
8748
8749   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8750       && (TREE_CODE (arg0) == NOP_EXPR
8751           || TREE_CODE (arg0) == CONVERT_EXPR))
8752     {
8753       /* If we are widening one operand of an integer comparison,
8754          see if the other operand is similarly being widened.  Perhaps we
8755          can do the comparison in the narrower type.  */
8756       tem = fold_widened_comparison (code, type, arg0, arg1);
8757       if (tem)
8758         return tem;
8759
8760       /* Or if we are changing signedness.  */
8761       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8762       if (tem)
8763         return tem;
8764     }
8765
8766   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8767      constant, we can simplify it.  */
8768   if (TREE_CODE (arg1) == INTEGER_CST
8769       && (TREE_CODE (arg0) == MIN_EXPR
8770           || TREE_CODE (arg0) == MAX_EXPR)
8771       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8772     {
8773       tem = optimize_minmax_comparison (code, type, op0, op1);
8774       if (tem)
8775         return tem;
8776     }
8777
8778   /* Simplify comparison of something with itself.  (For IEEE
8779      floating-point, we can only do some of these simplifications.)  */
8780   if (operand_equal_p (arg0, arg1, 0))
8781     {
8782       switch (code)
8783         {
8784         case EQ_EXPR:
8785           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8786               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8787             return constant_boolean_node (1, type);
8788           break;
8789
8790         case GE_EXPR:
8791         case LE_EXPR:
8792           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8793               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8794             return constant_boolean_node (1, type);
8795           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8796
8797         case NE_EXPR:
8798           /* For NE, we can only do this simplification if integer
8799              or we don't honor IEEE floating point NaNs.  */
8800           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8801               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8802             break;
8803           /* ... fall through ...  */
8804         case GT_EXPR:
8805         case LT_EXPR:
8806           return constant_boolean_node (0, type);
8807         default:
8808           gcc_unreachable ();
8809         }
8810     }
8811
8812   /* If we are comparing an expression that just has comparisons
8813      of two integer values, arithmetic expressions of those comparisons,
8814      and constants, we can simplify it.  There are only three cases
8815      to check: the two values can either be equal, the first can be
8816      greater, or the second can be greater.  Fold the expression for
8817      those three values.  Since each value must be 0 or 1, we have
8818      eight possibilities, each of which corresponds to the constant 0
8819      or 1 or one of the six possible comparisons.
8820
8821      This handles common cases like (a > b) == 0 but also handles
8822      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8823      occur in macroized code.  */
8824
8825   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8826     {
8827       tree cval1 = 0, cval2 = 0;
8828       int save_p = 0;
8829
8830       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8831           /* Don't handle degenerate cases here; they should already
8832              have been handled anyway.  */
8833           && cval1 != 0 && cval2 != 0
8834           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8835           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8836           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8837           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8838           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8839           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8840                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8841         {
8842           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8843           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8844
8845           /* We can't just pass T to eval_subst in case cval1 or cval2
8846              was the same as ARG1.  */
8847
8848           tree high_result
8849                 = fold_build2 (code, type,
8850                                eval_subst (arg0, cval1, maxval,
8851                                            cval2, minval),
8852                                arg1);
8853           tree equal_result
8854                 = fold_build2 (code, type,
8855                                eval_subst (arg0, cval1, maxval,
8856                                            cval2, maxval),
8857                                arg1);
8858           tree low_result
8859                 = fold_build2 (code, type,
8860                                eval_subst (arg0, cval1, minval,
8861                                            cval2, maxval),
8862                                arg1);
8863
8864           /* All three of these results should be 0 or 1.  Confirm they are.
8865              Then use those values to select the proper code to use.  */
8866
8867           if (TREE_CODE (high_result) == INTEGER_CST
8868               && TREE_CODE (equal_result) == INTEGER_CST
8869               && TREE_CODE (low_result) == INTEGER_CST)
8870             {
8871               /* Make a 3-bit mask with the high-order bit being the
8872                  value for `>', the next for '=', and the low for '<'.  */
8873               switch ((integer_onep (high_result) * 4)
8874                       + (integer_onep (equal_result) * 2)
8875                       + integer_onep (low_result))
8876                 {
8877                 case 0:
8878                   /* Always false.  */
8879                   return omit_one_operand (type, integer_zero_node, arg0);
8880                 case 1:
8881                   code = LT_EXPR;
8882                   break;
8883                 case 2:
8884                   code = EQ_EXPR;
8885                   break;
8886                 case 3:
8887                   code = LE_EXPR;
8888                   break;
8889                 case 4:
8890                   code = GT_EXPR;
8891                   break;
8892                 case 5:
8893                   code = NE_EXPR;
8894                   break;
8895                 case 6:
8896                   code = GE_EXPR;
8897                   break;
8898                 case 7:
8899                   /* Always true.  */
8900                   return omit_one_operand (type, integer_one_node, arg0);
8901                 }
8902
8903               if (save_p)
8904                 return save_expr (build2 (code, type, cval1, cval2));
8905               return fold_build2 (code, type, cval1, cval2);
8906             }
8907         }
8908     }
8909
8910   /* Fold a comparison of the address of COMPONENT_REFs with the same
8911      type and component to a comparison of the address of the base
8912      object.  In short, &x->a OP &y->a to x OP y and
8913      &x->a OP &y.a to x OP &y  */
8914   if (TREE_CODE (arg0) == ADDR_EXPR
8915       && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8916       && TREE_CODE (arg1) == ADDR_EXPR
8917       && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8918     {
8919       tree cref0 = TREE_OPERAND (arg0, 0);
8920       tree cref1 = TREE_OPERAND (arg1, 0);
8921       if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8922         {
8923           tree op0 = TREE_OPERAND (cref0, 0);
8924           tree op1 = TREE_OPERAND (cref1, 0);
8925           return fold_build2 (code, type,
8926                               fold_addr_expr (op0),
8927                               fold_addr_expr (op1));
8928         }
8929     }
8930
8931   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8932      into a single range test.  */
8933   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8934        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8935       && TREE_CODE (arg1) == INTEGER_CST
8936       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8937       && !integer_zerop (TREE_OPERAND (arg0, 1))
8938       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8939       && !TREE_OVERFLOW (arg1))
8940     {
8941       tem = fold_div_compare (code, type, arg0, arg1);
8942       if (tem != NULL_TREE)
8943         return tem;
8944     }
8945
8946   /* Fold ~X op ~Y as Y op X.  */
8947   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8948       && TREE_CODE (arg1) == BIT_NOT_EXPR)
8949     {
8950       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8951       return fold_build2 (code, type,
8952                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8953                           TREE_OPERAND (arg0, 0));
8954     }
8955
8956   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
8957   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8958       && TREE_CODE (arg1) == INTEGER_CST)
8959     {
8960       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8961       return fold_build2 (swap_tree_comparison (code), type,
8962                           TREE_OPERAND (arg0, 0),
8963                           fold_build1 (BIT_NOT_EXPR, cmp_type,
8964                                        fold_convert (cmp_type, arg1)));
8965     }
8966
8967   return NULL_TREE;
8968 }
8969
8970
8971 /* Subroutine of fold_binary.  Optimize complex multiplications of the
8972    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
8973    argument EXPR represents the expression "z" of type TYPE.  */
8974
8975 static tree
8976 fold_mult_zconjz (tree type, tree expr)
8977 {
8978   tree itype = TREE_TYPE (type);
8979   tree rpart, ipart, tem;
8980
8981   if (TREE_CODE (expr) == COMPLEX_EXPR)
8982     {
8983       rpart = TREE_OPERAND (expr, 0);
8984       ipart = TREE_OPERAND (expr, 1);
8985     }
8986   else if (TREE_CODE (expr) == COMPLEX_CST)
8987     {
8988       rpart = TREE_REALPART (expr);
8989       ipart = TREE_IMAGPART (expr);
8990     }
8991   else
8992     {
8993       expr = save_expr (expr);
8994       rpart = fold_build1 (REALPART_EXPR, itype, expr);
8995       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8996     }
8997
8998   rpart = save_expr (rpart);
8999   ipart = save_expr (ipart);
9000   tem = fold_build2 (PLUS_EXPR, itype,
9001                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
9002                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
9003   return fold_build2 (COMPLEX_EXPR, type, tem,
9004                       fold_convert (itype, integer_zero_node));
9005 }
9006
9007
9008 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9009    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9010    guarantees that P and N have the same least significant log2(M) bits.
9011    N is not otherwise constrained.  In particular, N is not normalized to
9012    0 <= N < M as is common.  In general, the precise value of P is unknown.
9013    M is chosen as large as possible such that constant N can be determined.
9014
9015    Returns M and sets *RESIDUE to N.  */
9016
9017 static unsigned HOST_WIDE_INT
9018 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue)
9019 {
9020   enum tree_code code;
9021
9022   *residue = 0;
9023
9024   code = TREE_CODE (expr);
9025   if (code == ADDR_EXPR)
9026     {
9027       expr = TREE_OPERAND (expr, 0);
9028       if (handled_component_p (expr))
9029         {
9030           HOST_WIDE_INT bitsize, bitpos;
9031           tree offset;
9032           enum machine_mode mode;
9033           int unsignedp, volatilep;
9034
9035           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9036                                       &mode, &unsignedp, &volatilep, false);
9037           *residue = bitpos / BITS_PER_UNIT;
9038           if (offset)
9039             {
9040               if (TREE_CODE (offset) == INTEGER_CST)
9041                 *residue += TREE_INT_CST_LOW (offset);
9042               else
9043                 /* We don't handle more complicated offset expressions.  */
9044                 return 1;
9045             }
9046         }
9047
9048       if (DECL_P (expr))
9049         return DECL_ALIGN_UNIT (expr);
9050     }
9051   else if (code == POINTER_PLUS_EXPR)
9052     {
9053       tree op0, op1;
9054       unsigned HOST_WIDE_INT modulus;
9055       enum tree_code inner_code;
9056       
9057       op0 = TREE_OPERAND (expr, 0);
9058       STRIP_NOPS (op0);
9059       modulus = get_pointer_modulus_and_residue (op0, residue);
9060
9061       op1 = TREE_OPERAND (expr, 1);
9062       STRIP_NOPS (op1);
9063       inner_code = TREE_CODE (op1);
9064       if (inner_code == INTEGER_CST)
9065         {
9066           *residue += TREE_INT_CST_LOW (op1);
9067           return modulus;
9068         }
9069       else if (inner_code == MULT_EXPR)
9070         {
9071           op1 = TREE_OPERAND (op1, 1);
9072           if (TREE_CODE (op1) == INTEGER_CST)
9073             {
9074               unsigned HOST_WIDE_INT align;
9075               
9076               /* Compute the greatest power-of-2 divisor of op1.  */
9077               align = TREE_INT_CST_LOW (op1);
9078               align &= -align;
9079
9080               /* If align is non-zero and less than *modulus, replace
9081                  *modulus with align., If align is 0, then either op1 is 0
9082                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9083                  unsigned HOST_WIDE_INT.  In either case, no additional
9084                  constraint is imposed.  */
9085               if (align)
9086                 modulus = MIN (modulus, align);
9087
9088               return modulus;
9089             }
9090         }
9091     }
9092
9093     /* If we get here, we were unable to determine anything useful about the
9094        expression.  */
9095     return 1;
9096 }
9097
9098
9099 /* Fold a binary expression of code CODE and type TYPE with operands
9100    OP0 and OP1.  Return the folded expression if folding is
9101    successful.  Otherwise, return NULL_TREE.  */
9102
9103 tree
9104 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9105 {
9106   enum tree_code_class kind = TREE_CODE_CLASS (code);
9107   tree arg0, arg1, tem;
9108   tree t1 = NULL_TREE;
9109   bool strict_overflow_p;
9110
9111   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
9112                || IS_GIMPLE_STMT_CODE_CLASS (kind))
9113               && TREE_CODE_LENGTH (code) == 2
9114               && op0 != NULL_TREE
9115               && op1 != NULL_TREE);
9116
9117   arg0 = op0;
9118   arg1 = op1;
9119
9120   /* Strip any conversions that don't change the mode.  This is
9121      safe for every expression, except for a comparison expression
9122      because its signedness is derived from its operands.  So, in
9123      the latter case, only strip conversions that don't change the
9124      signedness.
9125
9126      Note that this is done as an internal manipulation within the
9127      constant folder, in order to find the simplest representation
9128      of the arguments so that their form can be studied.  In any
9129      cases, the appropriate type conversions should be put back in
9130      the tree that will get out of the constant folder.  */
9131
9132   if (kind == tcc_comparison)
9133     {
9134       STRIP_SIGN_NOPS (arg0);
9135       STRIP_SIGN_NOPS (arg1);
9136     }
9137   else
9138     {
9139       STRIP_NOPS (arg0);
9140       STRIP_NOPS (arg1);
9141     }
9142
9143   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9144      constant but we can't do arithmetic on them.  */
9145   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9146       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9147       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9148       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9149       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9150       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9151     {
9152       if (kind == tcc_binary)
9153         {
9154           /* Make sure type and arg0 have the same saturating flag.  */
9155           gcc_assert (TYPE_SATURATING (type)
9156                       == TYPE_SATURATING (TREE_TYPE (arg0)));
9157           tem = const_binop (code, arg0, arg1, 0);
9158         }
9159       else if (kind == tcc_comparison)
9160         tem = fold_relational_const (code, type, arg0, arg1);
9161       else
9162         tem = NULL_TREE;
9163
9164       if (tem != NULL_TREE)
9165         {
9166           if (TREE_TYPE (tem) != type)
9167             tem = fold_convert (type, tem);
9168           return tem;
9169         }
9170     }
9171
9172   /* If this is a commutative operation, and ARG0 is a constant, move it
9173      to ARG1 to reduce the number of tests below.  */
9174   if (commutative_tree_code (code)
9175       && tree_swap_operands_p (arg0, arg1, true))
9176     return fold_build2 (code, type, op1, op0);
9177
9178   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9179
9180      First check for cases where an arithmetic operation is applied to a
9181      compound, conditional, or comparison operation.  Push the arithmetic
9182      operation inside the compound or conditional to see if any folding
9183      can then be done.  Convert comparison to conditional for this purpose.
9184      The also optimizes non-constant cases that used to be done in
9185      expand_expr.
9186
9187      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9188      one of the operands is a comparison and the other is a comparison, a
9189      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9190      code below would make the expression more complex.  Change it to a
9191      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9192      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9193
9194   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9195        || code == EQ_EXPR || code == NE_EXPR)
9196       && ((truth_value_p (TREE_CODE (arg0))
9197            && (truth_value_p (TREE_CODE (arg1))
9198                || (TREE_CODE (arg1) == BIT_AND_EXPR
9199                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9200           || (truth_value_p (TREE_CODE (arg1))
9201               && (truth_value_p (TREE_CODE (arg0))
9202                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9203                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9204     {
9205       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9206                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9207                          : TRUTH_XOR_EXPR,
9208                          boolean_type_node,
9209                          fold_convert (boolean_type_node, arg0),
9210                          fold_convert (boolean_type_node, arg1));
9211
9212       if (code == EQ_EXPR)
9213         tem = invert_truthvalue (tem);
9214
9215       return fold_convert (type, tem);
9216     }
9217
9218   if (TREE_CODE_CLASS (code) == tcc_binary
9219       || TREE_CODE_CLASS (code) == tcc_comparison)
9220     {
9221       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9222         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9223                        fold_build2 (code, type,
9224                                     fold_convert (TREE_TYPE (op0),
9225                                                   TREE_OPERAND (arg0, 1)),
9226                                     op1));
9227       if (TREE_CODE (arg1) == COMPOUND_EXPR
9228           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9229         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9230                        fold_build2 (code, type, op0,
9231                                     fold_convert (TREE_TYPE (op1),
9232                                                   TREE_OPERAND (arg1, 1))));
9233
9234       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9235         {
9236           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9237                                                      arg0, arg1, 
9238                                                      /*cond_first_p=*/1);
9239           if (tem != NULL_TREE)
9240             return tem;
9241         }
9242
9243       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9244         {
9245           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9246                                                      arg1, arg0, 
9247                                                      /*cond_first_p=*/0);
9248           if (tem != NULL_TREE)
9249             return tem;
9250         }
9251     }
9252
9253   switch (code)
9254     {
9255     case POINTER_PLUS_EXPR:
9256       /* 0 +p index -> (type)index */
9257       if (integer_zerop (arg0))
9258         return non_lvalue (fold_convert (type, arg1));
9259
9260       /* PTR +p 0 -> PTR */
9261       if (integer_zerop (arg1))
9262         return non_lvalue (fold_convert (type, arg0));
9263
9264       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
9265       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9266            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9267         return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9268                                                 fold_convert (sizetype, arg1),
9269                                                 fold_convert (sizetype, arg0)));
9270
9271       /* index +p PTR -> PTR +p index */
9272       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9273           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9274         return fold_build2 (POINTER_PLUS_EXPR, type,
9275                             fold_convert (type, arg1),
9276                             fold_convert (sizetype, arg0));
9277
9278       /* (PTR +p B) +p A -> PTR +p (B + A) */
9279       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9280         {
9281           tree inner;
9282           tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9283           tree arg00 = TREE_OPERAND (arg0, 0);
9284           inner = fold_build2 (PLUS_EXPR, sizetype,
9285                                arg01, fold_convert (sizetype, arg1));
9286           return fold_convert (type,
9287                                fold_build2 (POINTER_PLUS_EXPR,
9288                                             TREE_TYPE (arg00), arg00, inner));
9289         }
9290
9291       /* PTR_CST +p CST -> CST1 */
9292       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9293         return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9294
9295      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9296         of the array.  Loop optimizer sometimes produce this type of
9297         expressions.  */
9298       if (TREE_CODE (arg0) == ADDR_EXPR)
9299         {
9300           tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9301           if (tem)
9302             return fold_convert (type, tem);
9303         }
9304
9305       return NULL_TREE;
9306
9307     case PLUS_EXPR:
9308       /* PTR + INT -> (INT)(PTR p+ INT) */
9309       if (POINTER_TYPE_P (TREE_TYPE (arg0))
9310           && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9311         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9312                                                 TREE_TYPE (arg0),
9313                                                 arg0,
9314                                                 fold_convert (sizetype, arg1)));
9315       /* INT + PTR -> (INT)(PTR p+ INT) */
9316       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9317           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9318         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9319                                                 TREE_TYPE (arg1),
9320                                                 arg1,
9321                                                 fold_convert (sizetype, arg0)));
9322       /* A + (-B) -> A - B */
9323       if (TREE_CODE (arg1) == NEGATE_EXPR)
9324         return fold_build2 (MINUS_EXPR, type,
9325                             fold_convert (type, arg0),
9326                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9327       /* (-A) + B -> B - A */
9328       if (TREE_CODE (arg0) == NEGATE_EXPR
9329           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9330         return fold_build2 (MINUS_EXPR, type,
9331                             fold_convert (type, arg1),
9332                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9333
9334       if (INTEGRAL_TYPE_P (type))
9335         {
9336           /* Convert ~A + 1 to -A.  */
9337           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9338               && integer_onep (arg1))
9339             return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9340
9341           /* ~X + X is -1.  */
9342           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9343               && !TYPE_OVERFLOW_TRAPS (type))
9344             {
9345               tree tem = TREE_OPERAND (arg0, 0);
9346
9347               STRIP_NOPS (tem);
9348               if (operand_equal_p (tem, arg1, 0))
9349                 {
9350                   t1 = build_int_cst_type (type, -1);
9351                   return omit_one_operand (type, t1, arg1);
9352                 }
9353             }
9354
9355           /* X + ~X is -1.  */
9356           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9357               && !TYPE_OVERFLOW_TRAPS (type))
9358             {
9359               tree tem = TREE_OPERAND (arg1, 0);
9360
9361               STRIP_NOPS (tem);
9362               if (operand_equal_p (arg0, tem, 0))
9363                 {
9364                   t1 = build_int_cst_type (type, -1);
9365                   return omit_one_operand (type, t1, arg0);
9366                 }
9367             }
9368
9369           /* X + (X / CST) * -CST is X % CST.  */
9370           if (TREE_CODE (arg1) == MULT_EXPR
9371               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9372               && operand_equal_p (arg0,
9373                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9374             {
9375               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9376               tree cst1 = TREE_OPERAND (arg1, 1);
9377               tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9378               if (sum && integer_zerop (sum))
9379                 return fold_convert (type,
9380                                      fold_build2 (TRUNC_MOD_EXPR,
9381                                                   TREE_TYPE (arg0), arg0, cst0));
9382             }
9383         }
9384
9385       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9386          same or one.  Make sure type is not saturating.
9387          fold_plusminus_mult_expr will re-associate.  */
9388       if ((TREE_CODE (arg0) == MULT_EXPR
9389            || TREE_CODE (arg1) == MULT_EXPR)
9390           && !TYPE_SATURATING (type)
9391           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9392         {
9393           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9394           if (tem)
9395             return tem;
9396         }
9397
9398       if (! FLOAT_TYPE_P (type))
9399         {
9400           if (integer_zerop (arg1))
9401             return non_lvalue (fold_convert (type, arg0));
9402
9403           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9404              with a constant, and the two constants have no bits in common,
9405              we should treat this as a BIT_IOR_EXPR since this may produce more
9406              simplifications.  */
9407           if (TREE_CODE (arg0) == BIT_AND_EXPR
9408               && TREE_CODE (arg1) == BIT_AND_EXPR
9409               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9410               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9411               && integer_zerop (const_binop (BIT_AND_EXPR,
9412                                              TREE_OPERAND (arg0, 1),
9413                                              TREE_OPERAND (arg1, 1), 0)))
9414             {
9415               code = BIT_IOR_EXPR;
9416               goto bit_ior;
9417             }
9418
9419           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9420              (plus (plus (mult) (mult)) (foo)) so that we can
9421              take advantage of the factoring cases below.  */
9422           if (((TREE_CODE (arg0) == PLUS_EXPR
9423                 || TREE_CODE (arg0) == MINUS_EXPR)
9424                && TREE_CODE (arg1) == MULT_EXPR)
9425               || ((TREE_CODE (arg1) == PLUS_EXPR
9426                    || TREE_CODE (arg1) == MINUS_EXPR)
9427                   && TREE_CODE (arg0) == MULT_EXPR))
9428             {
9429               tree parg0, parg1, parg, marg;
9430               enum tree_code pcode;
9431
9432               if (TREE_CODE (arg1) == MULT_EXPR)
9433                 parg = arg0, marg = arg1;
9434               else
9435                 parg = arg1, marg = arg0;
9436               pcode = TREE_CODE (parg);
9437               parg0 = TREE_OPERAND (parg, 0);
9438               parg1 = TREE_OPERAND (parg, 1);
9439               STRIP_NOPS (parg0);
9440               STRIP_NOPS (parg1);
9441
9442               if (TREE_CODE (parg0) == MULT_EXPR
9443                   && TREE_CODE (parg1) != MULT_EXPR)
9444                 return fold_build2 (pcode, type,
9445                                     fold_build2 (PLUS_EXPR, type,
9446                                                  fold_convert (type, parg0),
9447                                                  fold_convert (type, marg)),
9448                                     fold_convert (type, parg1));
9449               if (TREE_CODE (parg0) != MULT_EXPR
9450                   && TREE_CODE (parg1) == MULT_EXPR)
9451                 return fold_build2 (PLUS_EXPR, type,
9452                                     fold_convert (type, parg0),
9453                                     fold_build2 (pcode, type,
9454                                                  fold_convert (type, marg),
9455                                                  fold_convert (type,
9456                                                                parg1)));
9457             }
9458         }
9459       else
9460         {
9461           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9462           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9463             return non_lvalue (fold_convert (type, arg0));
9464
9465           /* Likewise if the operands are reversed.  */
9466           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9467             return non_lvalue (fold_convert (type, arg1));
9468
9469           /* Convert X + -C into X - C.  */
9470           if (TREE_CODE (arg1) == REAL_CST
9471               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9472             {
9473               tem = fold_negate_const (arg1, type);
9474               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9475                 return fold_build2 (MINUS_EXPR, type,
9476                                     fold_convert (type, arg0),
9477                                     fold_convert (type, tem));
9478             }
9479
9480           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9481              to __complex__ ( x, y ).  This is not the same for SNaNs or
9482              if signed zeros are involved.  */
9483           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9484               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9485               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9486             {
9487               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9488               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9489               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9490               bool arg0rz = false, arg0iz = false;
9491               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9492                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9493                 {
9494                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9495                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9496                   if (arg0rz && arg1i && real_zerop (arg1i))
9497                     {
9498                       tree rp = arg1r ? arg1r
9499                                   : build1 (REALPART_EXPR, rtype, arg1);
9500                       tree ip = arg0i ? arg0i
9501                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9502                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9503                     }
9504                   else if (arg0iz && arg1r && real_zerop (arg1r))
9505                     {
9506                       tree rp = arg0r ? arg0r
9507                                   : build1 (REALPART_EXPR, rtype, arg0);
9508                       tree ip = arg1i ? arg1i
9509                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9510                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9511                     }
9512                 }
9513             }
9514
9515           if (flag_unsafe_math_optimizations
9516               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9517               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9518               && (tem = distribute_real_division (code, type, arg0, arg1)))
9519             return tem;
9520
9521           /* Convert x+x into x*2.0.  */
9522           if (operand_equal_p (arg0, arg1, 0)
9523               && SCALAR_FLOAT_TYPE_P (type))
9524             return fold_build2 (MULT_EXPR, type, arg0,
9525                                 build_real (type, dconst2));
9526
9527           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
9528              We associate floats only if the user has specified
9529              -fassociative-math.  */
9530           if (flag_associative_math
9531               && TREE_CODE (arg1) == PLUS_EXPR
9532               && TREE_CODE (arg0) != MULT_EXPR)
9533             {
9534               tree tree10 = TREE_OPERAND (arg1, 0);
9535               tree tree11 = TREE_OPERAND (arg1, 1);
9536               if (TREE_CODE (tree11) == MULT_EXPR
9537                   && TREE_CODE (tree10) == MULT_EXPR)
9538                 {
9539                   tree tree0;
9540                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9541                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9542                 }
9543             }
9544           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
9545              We associate floats only if the user has specified
9546              -fassociative-math.  */
9547           if (flag_associative_math
9548               && TREE_CODE (arg0) == PLUS_EXPR
9549               && TREE_CODE (arg1) != MULT_EXPR)
9550             {
9551               tree tree00 = TREE_OPERAND (arg0, 0);
9552               tree tree01 = TREE_OPERAND (arg0, 1);
9553               if (TREE_CODE (tree01) == MULT_EXPR
9554                   && TREE_CODE (tree00) == MULT_EXPR)
9555                 {
9556                   tree tree0;
9557                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9558                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9559                 }
9560             }
9561         }
9562
9563      bit_rotate:
9564       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9565          is a rotate of A by C1 bits.  */
9566       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9567          is a rotate of A by B bits.  */
9568       {
9569         enum tree_code code0, code1;
9570         tree rtype;
9571         code0 = TREE_CODE (arg0);
9572         code1 = TREE_CODE (arg1);
9573         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9574              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9575             && operand_equal_p (TREE_OPERAND (arg0, 0),
9576                                 TREE_OPERAND (arg1, 0), 0)
9577             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
9578                 TYPE_UNSIGNED (rtype))
9579             /* Only create rotates in complete modes.  Other cases are not
9580                expanded properly.  */
9581             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
9582           {
9583             tree tree01, tree11;
9584             enum tree_code code01, code11;
9585
9586             tree01 = TREE_OPERAND (arg0, 1);
9587             tree11 = TREE_OPERAND (arg1, 1);
9588             STRIP_NOPS (tree01);
9589             STRIP_NOPS (tree11);
9590             code01 = TREE_CODE (tree01);
9591             code11 = TREE_CODE (tree11);
9592             if (code01 == INTEGER_CST
9593                 && code11 == INTEGER_CST
9594                 && TREE_INT_CST_HIGH (tree01) == 0
9595                 && TREE_INT_CST_HIGH (tree11) == 0
9596                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9597                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9598               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9599                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9600             else if (code11 == MINUS_EXPR)
9601               {
9602                 tree tree110, tree111;
9603                 tree110 = TREE_OPERAND (tree11, 0);
9604                 tree111 = TREE_OPERAND (tree11, 1);
9605                 STRIP_NOPS (tree110);
9606                 STRIP_NOPS (tree111);
9607                 if (TREE_CODE (tree110) == INTEGER_CST
9608                     && 0 == compare_tree_int (tree110,
9609                                               TYPE_PRECISION
9610                                               (TREE_TYPE (TREE_OPERAND
9611                                                           (arg0, 0))))
9612                     && operand_equal_p (tree01, tree111, 0))
9613                   return build2 ((code0 == LSHIFT_EXPR
9614                                   ? LROTATE_EXPR
9615                                   : RROTATE_EXPR),
9616                                  type, TREE_OPERAND (arg0, 0), tree01);
9617               }
9618             else if (code01 == MINUS_EXPR)
9619               {
9620                 tree tree010, tree011;
9621                 tree010 = TREE_OPERAND (tree01, 0);
9622                 tree011 = TREE_OPERAND (tree01, 1);
9623                 STRIP_NOPS (tree010);
9624                 STRIP_NOPS (tree011);
9625                 if (TREE_CODE (tree010) == INTEGER_CST
9626                     && 0 == compare_tree_int (tree010,
9627                                               TYPE_PRECISION
9628                                               (TREE_TYPE (TREE_OPERAND
9629                                                           (arg0, 0))))
9630                     && operand_equal_p (tree11, tree011, 0))
9631                   return build2 ((code0 != LSHIFT_EXPR
9632                                   ? LROTATE_EXPR
9633                                   : RROTATE_EXPR),
9634                                  type, TREE_OPERAND (arg0, 0), tree11);
9635               }
9636           }
9637       }
9638
9639     associate:
9640       /* In most languages, can't associate operations on floats through
9641          parentheses.  Rather than remember where the parentheses were, we
9642          don't associate floats at all, unless the user has specified
9643          -fassociative-math.
9644          And, we need to make sure type is not saturating.  */
9645
9646       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
9647           && !TYPE_SATURATING (type))
9648         {
9649           tree var0, con0, lit0, minus_lit0;
9650           tree var1, con1, lit1, minus_lit1;
9651           bool ok = true;
9652
9653           /* Split both trees into variables, constants, and literals.  Then
9654              associate each group together, the constants with literals,
9655              then the result with variables.  This increases the chances of
9656              literals being recombined later and of generating relocatable
9657              expressions for the sum of a constant and literal.  */
9658           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9659           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9660                              code == MINUS_EXPR);
9661
9662           /* With undefined overflow we can only associate constants
9663              with one variable.  */
9664           if ((POINTER_TYPE_P (type)
9665                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9666               && var0 && var1)
9667             {
9668               tree tmp0 = var0;
9669               tree tmp1 = var1;
9670
9671               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9672                 tmp0 = TREE_OPERAND (tmp0, 0);
9673               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9674                 tmp1 = TREE_OPERAND (tmp1, 0);
9675               /* The only case we can still associate with two variables
9676                  is if they are the same, modulo negation.  */
9677               if (!operand_equal_p (tmp0, tmp1, 0))
9678                 ok = false;
9679             }
9680
9681           /* Only do something if we found more than two objects.  Otherwise,
9682              nothing has changed and we risk infinite recursion.  */
9683           if (ok
9684               && (2 < ((var0 != 0) + (var1 != 0)
9685                        + (con0 != 0) + (con1 != 0)
9686                        + (lit0 != 0) + (lit1 != 0)
9687                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9688             {
9689               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9690               if (code == MINUS_EXPR)
9691                 code = PLUS_EXPR;
9692
9693               var0 = associate_trees (var0, var1, code, type);
9694               con0 = associate_trees (con0, con1, code, type);
9695               lit0 = associate_trees (lit0, lit1, code, type);
9696               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9697
9698               /* Preserve the MINUS_EXPR if the negative part of the literal is
9699                  greater than the positive part.  Otherwise, the multiplicative
9700                  folding code (i.e extract_muldiv) may be fooled in case
9701                  unsigned constants are subtracted, like in the following
9702                  example: ((X*2 + 4) - 8U)/2.  */
9703               if (minus_lit0 && lit0)
9704                 {
9705                   if (TREE_CODE (lit0) == INTEGER_CST
9706                       && TREE_CODE (minus_lit0) == INTEGER_CST
9707                       && tree_int_cst_lt (lit0, minus_lit0))
9708                     {
9709                       minus_lit0 = associate_trees (minus_lit0, lit0,
9710                                                     MINUS_EXPR, type);
9711                       lit0 = 0;
9712                     }
9713                   else
9714                     {
9715                       lit0 = associate_trees (lit0, minus_lit0,
9716                                               MINUS_EXPR, type);
9717                       minus_lit0 = 0;
9718                     }
9719                 }
9720               if (minus_lit0)
9721                 {
9722                   if (con0 == 0)
9723                     return fold_convert (type,
9724                                          associate_trees (var0, minus_lit0,
9725                                                           MINUS_EXPR, type));
9726                   else
9727                     {
9728                       con0 = associate_trees (con0, minus_lit0,
9729                                               MINUS_EXPR, type);
9730                       return fold_convert (type,
9731                                            associate_trees (var0, con0,
9732                                                             PLUS_EXPR, type));
9733                     }
9734                 }
9735
9736               con0 = associate_trees (con0, lit0, code, type);
9737               return fold_convert (type, associate_trees (var0, con0,
9738                                                           code, type));
9739             }
9740         }
9741
9742       return NULL_TREE;
9743
9744     case MINUS_EXPR:
9745       /* Pointer simplifications for subtraction, simple reassociations. */
9746       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
9747         {
9748           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
9749           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
9750               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9751             {
9752               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9753               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9754               tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9755               tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9756               return fold_build2 (PLUS_EXPR, type,
9757                                   fold_build2 (MINUS_EXPR, type, arg00, arg10),
9758                                   fold_build2 (MINUS_EXPR, type, arg01, arg11));
9759             }
9760           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
9761           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9762             {
9763               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9764               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9765               tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
9766               if (tmp)
9767                 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
9768             }
9769         }
9770       /* A - (-B) -> A + B */
9771       if (TREE_CODE (arg1) == NEGATE_EXPR)
9772         return fold_build2 (PLUS_EXPR, type, op0,
9773                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9774       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9775       if (TREE_CODE (arg0) == NEGATE_EXPR
9776           && (FLOAT_TYPE_P (type)
9777               || INTEGRAL_TYPE_P (type))
9778           && negate_expr_p (arg1)
9779           && reorder_operands_p (arg0, arg1))
9780         return fold_build2 (MINUS_EXPR, type,
9781                             fold_convert (type, negate_expr (arg1)),
9782                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9783       /* Convert -A - 1 to ~A.  */
9784       if (INTEGRAL_TYPE_P (type)
9785           && TREE_CODE (arg0) == NEGATE_EXPR
9786           && integer_onep (arg1)
9787           && !TYPE_OVERFLOW_TRAPS (type))
9788         return fold_build1 (BIT_NOT_EXPR, type,
9789                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9790
9791       /* Convert -1 - A to ~A.  */
9792       if (INTEGRAL_TYPE_P (type)
9793           && integer_all_onesp (arg0))
9794         return fold_build1 (BIT_NOT_EXPR, type, op1);
9795
9796
9797       /* X - (X / CST) * CST is X % CST.  */
9798       if (INTEGRAL_TYPE_P (type)
9799           && TREE_CODE (arg1) == MULT_EXPR
9800           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9801           && operand_equal_p (arg0,
9802                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
9803           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
9804                               TREE_OPERAND (arg1, 1), 0))
9805         return fold_convert (type,
9806                              fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
9807                                           arg0, TREE_OPERAND (arg1, 1)));
9808
9809       if (! FLOAT_TYPE_P (type))
9810         {
9811           if (integer_zerop (arg0))
9812             return negate_expr (fold_convert (type, arg1));
9813           if (integer_zerop (arg1))
9814             return non_lvalue (fold_convert (type, arg0));
9815
9816           /* Fold A - (A & B) into ~B & A.  */
9817           if (!TREE_SIDE_EFFECTS (arg0)
9818               && TREE_CODE (arg1) == BIT_AND_EXPR)
9819             {
9820               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9821                 {
9822                   tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9823                   return fold_build2 (BIT_AND_EXPR, type,
9824                                       fold_build1 (BIT_NOT_EXPR, type, arg10),
9825                                       fold_convert (type, arg0));
9826                 }
9827               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9828                 {
9829                   tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9830                   return fold_build2 (BIT_AND_EXPR, type,
9831                                       fold_build1 (BIT_NOT_EXPR, type, arg11),
9832                                       fold_convert (type, arg0));
9833                 }
9834             }
9835
9836           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9837              any power of 2 minus 1.  */
9838           if (TREE_CODE (arg0) == BIT_AND_EXPR
9839               && TREE_CODE (arg1) == BIT_AND_EXPR
9840               && operand_equal_p (TREE_OPERAND (arg0, 0),
9841                                   TREE_OPERAND (arg1, 0), 0))
9842             {
9843               tree mask0 = TREE_OPERAND (arg0, 1);
9844               tree mask1 = TREE_OPERAND (arg1, 1);
9845               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9846
9847               if (operand_equal_p (tem, mask1, 0))
9848                 {
9849                   tem = fold_build2 (BIT_XOR_EXPR, type,
9850                                      TREE_OPERAND (arg0, 0), mask1);
9851                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9852                 }
9853             }
9854         }
9855
9856       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9857       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9858         return non_lvalue (fold_convert (type, arg0));
9859
9860       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9861          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9862          (-ARG1 + ARG0) reduces to -ARG1.  */
9863       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9864         return negate_expr (fold_convert (type, arg1));
9865
9866       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9867          __complex__ ( x, -y ).  This is not the same for SNaNs or if
9868          signed zeros are involved.  */
9869       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9870           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9871           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9872         {
9873           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9874           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9875           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9876           bool arg0rz = false, arg0iz = false;
9877           if ((arg0r && (arg0rz = real_zerop (arg0r)))
9878               || (arg0i && (arg0iz = real_zerop (arg0i))))
9879             {
9880               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9881               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9882               if (arg0rz && arg1i && real_zerop (arg1i))
9883                 {
9884                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
9885                                          arg1r ? arg1r
9886                                          : build1 (REALPART_EXPR, rtype, arg1));
9887                   tree ip = arg0i ? arg0i
9888                     : build1 (IMAGPART_EXPR, rtype, arg0);
9889                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9890                 }
9891               else if (arg0iz && arg1r && real_zerop (arg1r))
9892                 {
9893                   tree rp = arg0r ? arg0r
9894                     : build1 (REALPART_EXPR, rtype, arg0);
9895                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
9896                                          arg1i ? arg1i
9897                                          : build1 (IMAGPART_EXPR, rtype, arg1));
9898                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9899                 }
9900             }
9901         }
9902
9903       /* Fold &x - &x.  This can happen from &x.foo - &x.
9904          This is unsafe for certain floats even in non-IEEE formats.
9905          In IEEE, it is unsafe because it does wrong for NaNs.
9906          Also note that operand_equal_p is always false if an operand
9907          is volatile.  */
9908
9909       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
9910           && operand_equal_p (arg0, arg1, 0))
9911         return fold_convert (type, integer_zero_node);
9912
9913       /* A - B -> A + (-B) if B is easily negatable.  */
9914       if (negate_expr_p (arg1)
9915           && ((FLOAT_TYPE_P (type)
9916                /* Avoid this transformation if B is a positive REAL_CST.  */
9917                && (TREE_CODE (arg1) != REAL_CST
9918                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9919               || INTEGRAL_TYPE_P (type)))
9920         return fold_build2 (PLUS_EXPR, type,
9921                             fold_convert (type, arg0),
9922                             fold_convert (type, negate_expr (arg1)));
9923
9924       /* Try folding difference of addresses.  */
9925       {
9926         HOST_WIDE_INT diff;
9927
9928         if ((TREE_CODE (arg0) == ADDR_EXPR
9929              || TREE_CODE (arg1) == ADDR_EXPR)
9930             && ptr_difference_const (arg0, arg1, &diff))
9931           return build_int_cst_type (type, diff);
9932       }
9933
9934       /* Fold &a[i] - &a[j] to i-j.  */
9935       if (TREE_CODE (arg0) == ADDR_EXPR
9936           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9937           && TREE_CODE (arg1) == ADDR_EXPR
9938           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9939         {
9940           tree aref0 = TREE_OPERAND (arg0, 0);
9941           tree aref1 = TREE_OPERAND (arg1, 0);
9942           if (operand_equal_p (TREE_OPERAND (aref0, 0),
9943                                TREE_OPERAND (aref1, 0), 0))
9944             {
9945               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9946               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9947               tree esz = array_ref_element_size (aref0);
9948               tree diff = build2 (MINUS_EXPR, type, op0, op1);
9949               return fold_build2 (MULT_EXPR, type, diff,
9950                                   fold_convert (type, esz));
9951                                   
9952             }
9953         }
9954
9955       if (flag_unsafe_math_optimizations
9956           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9957           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9958           && (tem = distribute_real_division (code, type, arg0, arg1)))
9959         return tem;
9960
9961       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9962          same or one.  Make sure type is not saturating.
9963          fold_plusminus_mult_expr will re-associate.  */
9964       if ((TREE_CODE (arg0) == MULT_EXPR
9965            || TREE_CODE (arg1) == MULT_EXPR)
9966           && !TYPE_SATURATING (type)
9967           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9968         {
9969           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9970           if (tem)
9971             return tem;
9972         }
9973
9974       goto associate;
9975
9976     case MULT_EXPR:
9977       /* (-A) * (-B) -> A * B  */
9978       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9979         return fold_build2 (MULT_EXPR, type,
9980                             fold_convert (type, TREE_OPERAND (arg0, 0)),
9981                             fold_convert (type, negate_expr (arg1)));
9982       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9983         return fold_build2 (MULT_EXPR, type,
9984                             fold_convert (type, negate_expr (arg0)),
9985                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9986
9987       if (! FLOAT_TYPE_P (type))
9988         {
9989           if (integer_zerop (arg1))
9990             return omit_one_operand (type, arg1, arg0);
9991           if (integer_onep (arg1))
9992             return non_lvalue (fold_convert (type, arg0));
9993           /* Transform x * -1 into -x.  Make sure to do the negation
9994              on the original operand with conversions not stripped
9995              because we can only strip non-sign-changing conversions.  */
9996           if (integer_all_onesp (arg1))
9997             return fold_convert (type, negate_expr (op0));
9998           /* Transform x * -C into -x * C if x is easily negatable.  */
9999           if (TREE_CODE (arg1) == INTEGER_CST
10000               && tree_int_cst_sgn (arg1) == -1
10001               && negate_expr_p (arg0)
10002               && (tem = negate_expr (arg1)) != arg1
10003               && !TREE_OVERFLOW (tem))
10004             return fold_build2 (MULT_EXPR, type,
10005                                 fold_convert (type, negate_expr (arg0)), tem);
10006
10007           /* (a * (1 << b)) is (a << b)  */
10008           if (TREE_CODE (arg1) == LSHIFT_EXPR
10009               && integer_onep (TREE_OPERAND (arg1, 0)))
10010             return fold_build2 (LSHIFT_EXPR, type, op0,
10011                                 TREE_OPERAND (arg1, 1));
10012           if (TREE_CODE (arg0) == LSHIFT_EXPR
10013               && integer_onep (TREE_OPERAND (arg0, 0)))
10014             return fold_build2 (LSHIFT_EXPR, type, op1,
10015                                 TREE_OPERAND (arg0, 1));
10016
10017           strict_overflow_p = false;
10018           if (TREE_CODE (arg1) == INTEGER_CST
10019               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10020                                              &strict_overflow_p)))
10021             {
10022               if (strict_overflow_p)
10023                 fold_overflow_warning (("assuming signed overflow does not "
10024                                         "occur when simplifying "
10025                                         "multiplication"),
10026                                        WARN_STRICT_OVERFLOW_MISC);
10027               return fold_convert (type, tem);
10028             }
10029
10030           /* Optimize z * conj(z) for integer complex numbers.  */
10031           if (TREE_CODE (arg0) == CONJ_EXPR
10032               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10033             return fold_mult_zconjz (type, arg1);
10034           if (TREE_CODE (arg1) == CONJ_EXPR
10035               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10036             return fold_mult_zconjz (type, arg0);
10037         }
10038       else
10039         {
10040           /* Maybe fold x * 0 to 0.  The expressions aren't the same
10041              when x is NaN, since x * 0 is also NaN.  Nor are they the
10042              same in modes with signed zeros, since multiplying a
10043              negative value by 0 gives -0, not +0.  */
10044           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10045               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10046               && real_zerop (arg1))
10047             return omit_one_operand (type, arg1, arg0);
10048           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
10049           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10050               && real_onep (arg1))
10051             return non_lvalue (fold_convert (type, arg0));
10052
10053           /* Transform x * -1.0 into -x.  */
10054           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10055               && real_minus_onep (arg1))
10056             return fold_convert (type, negate_expr (arg0));
10057
10058           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10059              the result for floating point types due to rounding so it is applied
10060              only if -fassociative-math was specify.  */
10061           if (flag_associative_math
10062               && TREE_CODE (arg0) == RDIV_EXPR
10063               && TREE_CODE (arg1) == REAL_CST
10064               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10065             {
10066               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10067                                       arg1, 0);
10068               if (tem)
10069                 return fold_build2 (RDIV_EXPR, type, tem,
10070                                     TREE_OPERAND (arg0, 1));
10071             }
10072
10073           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10074           if (operand_equal_p (arg0, arg1, 0))
10075             {
10076               tree tem = fold_strip_sign_ops (arg0);
10077               if (tem != NULL_TREE)
10078                 {
10079                   tem = fold_convert (type, tem);
10080                   return fold_build2 (MULT_EXPR, type, tem, tem);
10081                 }
10082             }
10083
10084           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10085              This is not the same for NaNs or if signed zeros are
10086              involved.  */
10087           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10088               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10089               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10090               && TREE_CODE (arg1) == COMPLEX_CST
10091               && real_zerop (TREE_REALPART (arg1)))
10092             {
10093               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10094               if (real_onep (TREE_IMAGPART (arg1)))
10095                 return fold_build2 (COMPLEX_EXPR, type,
10096                                     negate_expr (fold_build1 (IMAGPART_EXPR,
10097                                                               rtype, arg0)),
10098                                     fold_build1 (REALPART_EXPR, rtype, arg0));
10099               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10100                 return fold_build2 (COMPLEX_EXPR, type,
10101                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
10102                                     negate_expr (fold_build1 (REALPART_EXPR,
10103                                                               rtype, arg0)));
10104             }
10105
10106           /* Optimize z * conj(z) for floating point complex numbers.
10107              Guarded by flag_unsafe_math_optimizations as non-finite
10108              imaginary components don't produce scalar results.  */
10109           if (flag_unsafe_math_optimizations
10110               && TREE_CODE (arg0) == CONJ_EXPR
10111               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10112             return fold_mult_zconjz (type, arg1);
10113           if (flag_unsafe_math_optimizations
10114               && TREE_CODE (arg1) == CONJ_EXPR
10115               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10116             return fold_mult_zconjz (type, arg0);
10117
10118           if (flag_unsafe_math_optimizations)
10119             {
10120               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10121               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10122
10123               /* Optimizations of root(...)*root(...).  */
10124               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10125                 {
10126                   tree rootfn, arg;
10127                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10128                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10129
10130                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10131                   if (BUILTIN_SQRT_P (fcode0)
10132                       && operand_equal_p (arg00, arg10, 0)
10133                       && ! HONOR_SNANS (TYPE_MODE (type)))
10134                     return arg00;
10135
10136                   /* Optimize root(x)*root(y) as root(x*y).  */
10137                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10138                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10139                   return build_call_expr (rootfn, 1, arg);
10140                 }
10141
10142               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10143               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10144                 {
10145                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10146                   tree arg = fold_build2 (PLUS_EXPR, type,
10147                                           CALL_EXPR_ARG (arg0, 0),
10148                                           CALL_EXPR_ARG (arg1, 0));
10149                   return build_call_expr (expfn, 1, arg);
10150                 }
10151
10152               /* Optimizations of pow(...)*pow(...).  */
10153               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10154                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10155                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10156                 {
10157                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10158                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10159                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10160                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10161
10162                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10163                   if (operand_equal_p (arg01, arg11, 0))
10164                     {
10165                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10166                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10167                       return build_call_expr (powfn, 2, arg, arg01);
10168                     }
10169
10170                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10171                   if (operand_equal_p (arg00, arg10, 0))
10172                     {
10173                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10174                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10175                       return build_call_expr (powfn, 2, arg00, arg);
10176                     }
10177                 }
10178
10179               /* Optimize tan(x)*cos(x) as sin(x).  */
10180               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10181                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10182                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10183                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10184                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10185                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10186                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10187                                       CALL_EXPR_ARG (arg1, 0), 0))
10188                 {
10189                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10190
10191                   if (sinfn != NULL_TREE)
10192                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10193                 }
10194
10195               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10196               if (fcode1 == BUILT_IN_POW
10197                   || fcode1 == BUILT_IN_POWF
10198                   || fcode1 == BUILT_IN_POWL)
10199                 {
10200                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10201                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10202                   if (TREE_CODE (arg11) == REAL_CST
10203                       && !TREE_OVERFLOW (arg11)
10204                       && operand_equal_p (arg0, arg10, 0))
10205                     {
10206                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10207                       REAL_VALUE_TYPE c;
10208                       tree arg;
10209
10210                       c = TREE_REAL_CST (arg11);
10211                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10212                       arg = build_real (type, c);
10213                       return build_call_expr (powfn, 2, arg0, arg);
10214                     }
10215                 }
10216
10217               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10218               if (fcode0 == BUILT_IN_POW
10219                   || fcode0 == BUILT_IN_POWF
10220                   || fcode0 == BUILT_IN_POWL)
10221                 {
10222                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10223                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10224                   if (TREE_CODE (arg01) == REAL_CST
10225                       && !TREE_OVERFLOW (arg01)
10226                       && operand_equal_p (arg1, arg00, 0))
10227                     {
10228                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10229                       REAL_VALUE_TYPE c;
10230                       tree arg;
10231
10232                       c = TREE_REAL_CST (arg01);
10233                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10234                       arg = build_real (type, c);
10235                       return build_call_expr (powfn, 2, arg1, arg);
10236                     }
10237                 }
10238
10239               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
10240               if (! optimize_size
10241                   && operand_equal_p (arg0, arg1, 0))
10242                 {
10243                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10244
10245                   if (powfn)
10246                     {
10247                       tree arg = build_real (type, dconst2);
10248                       return build_call_expr (powfn, 2, arg0, arg);
10249                     }
10250                 }
10251             }
10252         }
10253       goto associate;
10254
10255     case BIT_IOR_EXPR:
10256     bit_ior:
10257       if (integer_all_onesp (arg1))
10258         return omit_one_operand (type, arg1, arg0);
10259       if (integer_zerop (arg1))
10260         return non_lvalue (fold_convert (type, arg0));
10261       if (operand_equal_p (arg0, arg1, 0))
10262         return non_lvalue (fold_convert (type, arg0));
10263
10264       /* ~X | X is -1.  */
10265       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10266           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10267         {
10268           t1 = fold_convert (type, integer_zero_node);
10269           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10270           return omit_one_operand (type, t1, arg1);
10271         }
10272
10273       /* X | ~X is -1.  */
10274       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10275           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10276         {
10277           t1 = fold_convert (type, integer_zero_node);
10278           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10279           return omit_one_operand (type, t1, arg0);
10280         }
10281
10282       /* Canonicalize (X & C1) | C2.  */
10283       if (TREE_CODE (arg0) == BIT_AND_EXPR
10284           && TREE_CODE (arg1) == INTEGER_CST
10285           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10286         {
10287           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10288           int width = TYPE_PRECISION (type), w;
10289           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10290           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10291           hi2 = TREE_INT_CST_HIGH (arg1);
10292           lo2 = TREE_INT_CST_LOW (arg1);
10293
10294           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10295           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10296             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10297
10298           if (width > HOST_BITS_PER_WIDE_INT)
10299             {
10300               mhi = (unsigned HOST_WIDE_INT) -1 
10301                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10302               mlo = -1;
10303             }
10304           else
10305             {
10306               mhi = 0;
10307               mlo = (unsigned HOST_WIDE_INT) -1
10308                     >> (HOST_BITS_PER_WIDE_INT - width);
10309             }
10310
10311           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10312           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10313             return fold_build2 (BIT_IOR_EXPR, type,
10314                                 TREE_OPERAND (arg0, 0), arg1);
10315
10316           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10317              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10318              mode which allows further optimizations.  */
10319           hi1 &= mhi;
10320           lo1 &= mlo;
10321           hi2 &= mhi;
10322           lo2 &= mlo;
10323           hi3 = hi1 & ~hi2;
10324           lo3 = lo1 & ~lo2;
10325           for (w = BITS_PER_UNIT;
10326                w <= width && w <= HOST_BITS_PER_WIDE_INT;
10327                w <<= 1)
10328             {
10329               unsigned HOST_WIDE_INT mask
10330                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10331               if (((lo1 | lo2) & mask) == mask
10332                   && (lo1 & ~mask) == 0 && hi1 == 0)
10333                 {
10334                   hi3 = 0;
10335                   lo3 = mask;
10336                   break;
10337                 }
10338             }
10339           if (hi3 != hi1 || lo3 != lo1)
10340             return fold_build2 (BIT_IOR_EXPR, type,
10341                                 fold_build2 (BIT_AND_EXPR, type,
10342                                              TREE_OPERAND (arg0, 0),
10343                                              build_int_cst_wide (type,
10344                                                                  lo3, hi3)),
10345                                 arg1);
10346         }
10347
10348       /* (X & Y) | Y is (X, Y).  */
10349       if (TREE_CODE (arg0) == BIT_AND_EXPR
10350           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10351         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10352       /* (X & Y) | X is (Y, X).  */
10353       if (TREE_CODE (arg0) == BIT_AND_EXPR
10354           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10355           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10356         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10357       /* X | (X & Y) is (Y, X).  */
10358       if (TREE_CODE (arg1) == BIT_AND_EXPR
10359           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10360           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10361         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10362       /* X | (Y & X) is (Y, X).  */
10363       if (TREE_CODE (arg1) == BIT_AND_EXPR
10364           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10365           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10366         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10367
10368       t1 = distribute_bit_expr (code, type, arg0, arg1);
10369       if (t1 != NULL_TREE)
10370         return t1;
10371
10372       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10373
10374          This results in more efficient code for machines without a NAND
10375          instruction.  Combine will canonicalize to the first form
10376          which will allow use of NAND instructions provided by the
10377          backend if they exist.  */
10378       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10379           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10380         {
10381           return fold_build1 (BIT_NOT_EXPR, type,
10382                               build2 (BIT_AND_EXPR, type,
10383                                       TREE_OPERAND (arg0, 0),
10384                                       TREE_OPERAND (arg1, 0)));
10385         }
10386
10387       /* See if this can be simplified into a rotate first.  If that
10388          is unsuccessful continue in the association code.  */
10389       goto bit_rotate;
10390
10391     case BIT_XOR_EXPR:
10392       if (integer_zerop (arg1))
10393         return non_lvalue (fold_convert (type, arg0));
10394       if (integer_all_onesp (arg1))
10395         return fold_build1 (BIT_NOT_EXPR, type, op0);
10396       if (operand_equal_p (arg0, arg1, 0))
10397         return omit_one_operand (type, integer_zero_node, arg0);
10398
10399       /* ~X ^ X is -1.  */
10400       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10401           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10402         {
10403           t1 = fold_convert (type, integer_zero_node);
10404           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10405           return omit_one_operand (type, t1, arg1);
10406         }
10407
10408       /* X ^ ~X is -1.  */
10409       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10410           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10411         {
10412           t1 = fold_convert (type, integer_zero_node);
10413           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10414           return omit_one_operand (type, t1, arg0);
10415         }
10416
10417       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10418          with a constant, and the two constants have no bits in common,
10419          we should treat this as a BIT_IOR_EXPR since this may produce more
10420          simplifications.  */
10421       if (TREE_CODE (arg0) == BIT_AND_EXPR
10422           && TREE_CODE (arg1) == BIT_AND_EXPR
10423           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10424           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10425           && integer_zerop (const_binop (BIT_AND_EXPR,
10426                                          TREE_OPERAND (arg0, 1),
10427                                          TREE_OPERAND (arg1, 1), 0)))
10428         {
10429           code = BIT_IOR_EXPR;
10430           goto bit_ior;
10431         }
10432
10433       /* (X | Y) ^ X -> Y & ~ X*/
10434       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10435           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10436         {
10437           tree t2 = TREE_OPERAND (arg0, 1);
10438           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10439                             arg1);
10440           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10441                             fold_convert (type, t1));
10442           return t1;
10443         }
10444
10445       /* (Y | X) ^ X -> Y & ~ X*/
10446       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10447           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10448         {
10449           tree t2 = TREE_OPERAND (arg0, 0);
10450           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10451                             arg1);
10452           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10453                             fold_convert (type, t1));
10454           return t1;
10455         }
10456
10457       /* X ^ (X | Y) -> Y & ~ X*/
10458       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10459           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10460         {
10461           tree t2 = TREE_OPERAND (arg1, 1);
10462           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10463                             arg0);
10464           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10465                             fold_convert (type, t1));
10466           return t1;
10467         }
10468
10469       /* X ^ (Y | X) -> Y & ~ X*/
10470       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10471           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10472         {
10473           tree t2 = TREE_OPERAND (arg1, 0);
10474           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10475                             arg0);
10476           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10477                             fold_convert (type, t1));
10478           return t1;
10479         }
10480         
10481       /* Convert ~X ^ ~Y to X ^ Y.  */
10482       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10483           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10484         return fold_build2 (code, type,
10485                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10486                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10487
10488       /* Convert ~X ^ C to X ^ ~C.  */
10489       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10490           && TREE_CODE (arg1) == INTEGER_CST)
10491         return fold_build2 (code, type,
10492                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10493                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10494
10495       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10496       if (TREE_CODE (arg0) == BIT_AND_EXPR
10497           && integer_onep (TREE_OPERAND (arg0, 1))
10498           && integer_onep (arg1))
10499         return fold_build2 (EQ_EXPR, type, arg0,
10500                             build_int_cst (TREE_TYPE (arg0), 0));
10501
10502       /* Fold (X & Y) ^ Y as ~X & Y.  */
10503       if (TREE_CODE (arg0) == BIT_AND_EXPR
10504           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10505         {
10506           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10507           return fold_build2 (BIT_AND_EXPR, type, 
10508                               fold_build1 (BIT_NOT_EXPR, type, tem),
10509                               fold_convert (type, arg1));
10510         }
10511       /* Fold (X & Y) ^ X as ~Y & X.  */
10512       if (TREE_CODE (arg0) == BIT_AND_EXPR
10513           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10514           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10515         {
10516           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10517           return fold_build2 (BIT_AND_EXPR, type,
10518                               fold_build1 (BIT_NOT_EXPR, type, tem),
10519                               fold_convert (type, arg1));
10520         }
10521       /* Fold X ^ (X & Y) as X & ~Y.  */
10522       if (TREE_CODE (arg1) == BIT_AND_EXPR
10523           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10524         {
10525           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10526           return fold_build2 (BIT_AND_EXPR, type,
10527                               fold_convert (type, arg0),
10528                               fold_build1 (BIT_NOT_EXPR, type, tem));
10529         }
10530       /* Fold X ^ (Y & X) as ~Y & X.  */
10531       if (TREE_CODE (arg1) == BIT_AND_EXPR
10532           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10533           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10534         {
10535           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10536           return fold_build2 (BIT_AND_EXPR, type,
10537                               fold_build1 (BIT_NOT_EXPR, type, tem),
10538                               fold_convert (type, arg0));
10539         }
10540
10541       /* See if this can be simplified into a rotate first.  If that
10542          is unsuccessful continue in the association code.  */
10543       goto bit_rotate;
10544
10545     case BIT_AND_EXPR:
10546       if (integer_all_onesp (arg1))
10547         return non_lvalue (fold_convert (type, arg0));
10548       if (integer_zerop (arg1))
10549         return omit_one_operand (type, arg1, arg0);
10550       if (operand_equal_p (arg0, arg1, 0))
10551         return non_lvalue (fold_convert (type, arg0));
10552
10553       /* ~X & X is always zero.  */
10554       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10555           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10556         return omit_one_operand (type, integer_zero_node, arg1);
10557
10558       /* X & ~X is always zero.  */
10559       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10560           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10561         return omit_one_operand (type, integer_zero_node, arg0);
10562
10563       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10564       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10565           && TREE_CODE (arg1) == INTEGER_CST
10566           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10567         {
10568           tree tmp1 = fold_convert (TREE_TYPE (arg0), arg1);
10569           tree tmp2 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10570                                    TREE_OPERAND (arg0, 0), tmp1);
10571           tree tmp3 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10572                                    TREE_OPERAND (arg0, 1), tmp1);
10573           return fold_convert (type,
10574                                fold_build2 (BIT_IOR_EXPR, TREE_TYPE (arg0),
10575                                             tmp2, tmp3));
10576         }
10577
10578       /* (X | Y) & Y is (X, Y).  */
10579       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10580           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10581         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10582       /* (X | Y) & X is (Y, X).  */
10583       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10584           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10585           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10586         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10587       /* X & (X | Y) is (Y, X).  */
10588       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10589           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10590           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10591         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10592       /* X & (Y | X) is (Y, X).  */
10593       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10594           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10595           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10596         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10597
10598       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10599       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10600           && integer_onep (TREE_OPERAND (arg0, 1))
10601           && integer_onep (arg1))
10602         {
10603           tem = TREE_OPERAND (arg0, 0);
10604           return fold_build2 (EQ_EXPR, type,
10605                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10606                                            build_int_cst (TREE_TYPE (tem), 1)),
10607                               build_int_cst (TREE_TYPE (tem), 0));
10608         }
10609       /* Fold ~X & 1 as (X & 1) == 0.  */
10610       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10611           && integer_onep (arg1))
10612         {
10613           tem = TREE_OPERAND (arg0, 0);
10614           return fold_build2 (EQ_EXPR, type,
10615                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10616                                            build_int_cst (TREE_TYPE (tem), 1)),
10617                               build_int_cst (TREE_TYPE (tem), 0));
10618         }
10619
10620       /* Fold (X ^ Y) & Y as ~X & Y.  */
10621       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10622           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10623         {
10624           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10625           return fold_build2 (BIT_AND_EXPR, type, 
10626                               fold_build1 (BIT_NOT_EXPR, type, tem),
10627                               fold_convert (type, arg1));
10628         }
10629       /* Fold (X ^ Y) & X as ~Y & X.  */
10630       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10631           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10632           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10633         {
10634           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10635           return fold_build2 (BIT_AND_EXPR, type,
10636                               fold_build1 (BIT_NOT_EXPR, type, tem),
10637                               fold_convert (type, arg1));
10638         }
10639       /* Fold X & (X ^ Y) as X & ~Y.  */
10640       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10641           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10642         {
10643           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10644           return fold_build2 (BIT_AND_EXPR, type,
10645                               fold_convert (type, arg0),
10646                               fold_build1 (BIT_NOT_EXPR, type, tem));
10647         }
10648       /* Fold X & (Y ^ X) as ~Y & X.  */
10649       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10650           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10651           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10652         {
10653           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10654           return fold_build2 (BIT_AND_EXPR, type,
10655                               fold_build1 (BIT_NOT_EXPR, type, tem),
10656                               fold_convert (type, arg0));
10657         }
10658
10659       t1 = distribute_bit_expr (code, type, arg0, arg1);
10660       if (t1 != NULL_TREE)
10661         return t1;
10662       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10663       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10664           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10665         {
10666           unsigned int prec
10667             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10668
10669           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10670               && (~TREE_INT_CST_LOW (arg1)
10671                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10672             return fold_convert (type, TREE_OPERAND (arg0, 0));
10673         }
10674
10675       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10676
10677          This results in more efficient code for machines without a NOR
10678          instruction.  Combine will canonicalize to the first form
10679          which will allow use of NOR instructions provided by the
10680          backend if they exist.  */
10681       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10682           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10683         {
10684           return fold_build1 (BIT_NOT_EXPR, type,
10685                               build2 (BIT_IOR_EXPR, type,
10686                                       fold_convert (type,
10687                                                     TREE_OPERAND (arg0, 0)),
10688                                       fold_convert (type,
10689                                                     TREE_OPERAND (arg1, 0))));
10690         }
10691
10692       /* If arg0 is derived from the address of an object or function, we may
10693          be able to fold this expression using the object or function's
10694          alignment.  */
10695       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
10696         {
10697           unsigned HOST_WIDE_INT modulus, residue;
10698           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
10699
10700           modulus = get_pointer_modulus_and_residue (arg0, &residue);
10701
10702           /* This works because modulus is a power of 2.  If this weren't the
10703              case, we'd have to replace it by its greatest power-of-2
10704              divisor: modulus & -modulus.  */
10705           if (low < modulus)
10706             return build_int_cst (type, residue & low);
10707         }
10708
10709       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
10710               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
10711          if the new mask might be further optimized.  */
10712       if ((TREE_CODE (arg0) == LSHIFT_EXPR
10713            || TREE_CODE (arg0) == RSHIFT_EXPR)
10714           && host_integerp (TREE_OPERAND (arg0, 1), 1)
10715           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
10716           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
10717              < TYPE_PRECISION (TREE_TYPE (arg0))
10718           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
10719           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
10720         {
10721           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
10722           unsigned HOST_WIDE_INT mask
10723             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
10724           unsigned HOST_WIDE_INT newmask, zerobits = 0;
10725           tree shift_type = TREE_TYPE (arg0);
10726
10727           if (TREE_CODE (arg0) == LSHIFT_EXPR)
10728             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
10729           else if (TREE_CODE (arg0) == RSHIFT_EXPR
10730                    && TYPE_PRECISION (TREE_TYPE (arg0))
10731                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
10732             {
10733               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
10734               tree arg00 = TREE_OPERAND (arg0, 0);
10735               /* See if more bits can be proven as zero because of
10736                  zero extension.  */
10737               if (TREE_CODE (arg00) == NOP_EXPR
10738                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
10739                 {
10740                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
10741                   if (TYPE_PRECISION (inner_type)
10742                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
10743                       && TYPE_PRECISION (inner_type) < prec)
10744                     {
10745                       prec = TYPE_PRECISION (inner_type);
10746                       /* See if we can shorten the right shift.  */
10747                       if (shiftc < prec)
10748                         shift_type = inner_type;
10749                     }
10750                 }
10751               zerobits = ~(unsigned HOST_WIDE_INT) 0;
10752               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
10753               zerobits <<= prec - shiftc;
10754               /* For arithmetic shift if sign bit could be set, zerobits
10755                  can contain actually sign bits, so no transformation is
10756                  possible, unless MASK masks them all away.  In that
10757                  case the shift needs to be converted into logical shift.  */
10758               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
10759                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
10760                 {
10761                   if ((mask & zerobits) == 0)
10762                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
10763                   else
10764                     zerobits = 0;
10765                 }
10766             }
10767
10768           /* ((X << 16) & 0xff00) is (X, 0).  */
10769           if ((mask & zerobits) == mask)
10770             return omit_one_operand (type, build_int_cst (type, 0), arg0);
10771
10772           newmask = mask | zerobits;
10773           if (newmask != mask && (newmask & (newmask + 1)) == 0)
10774             {
10775               unsigned int prec;
10776
10777               /* Only do the transformation if NEWMASK is some integer
10778                  mode's mask.  */
10779               for (prec = BITS_PER_UNIT;
10780                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
10781                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
10782                   break;
10783               if (prec < HOST_BITS_PER_WIDE_INT
10784                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
10785                 {
10786                   if (shift_type != TREE_TYPE (arg0))
10787                     {
10788                       tem = fold_build2 (TREE_CODE (arg0), shift_type,
10789                                          fold_convert (shift_type,
10790                                                        TREE_OPERAND (arg0, 0)),
10791                                          TREE_OPERAND (arg0, 1));
10792                       tem = fold_convert (type, tem);
10793                     }
10794                   else
10795                     tem = op0;
10796                   return fold_build2 (BIT_AND_EXPR, type, tem,
10797                                       build_int_cst_type (TREE_TYPE (op1),
10798                                                           newmask));
10799                 }
10800             }
10801         }
10802
10803       goto associate;
10804
10805     case RDIV_EXPR:
10806       /* Don't touch a floating-point divide by zero unless the mode
10807          of the constant can represent infinity.  */
10808       if (TREE_CODE (arg1) == REAL_CST
10809           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10810           && real_zerop (arg1))
10811         return NULL_TREE;
10812
10813       /* Optimize A / A to 1.0 if we don't care about
10814          NaNs or Infinities.  Skip the transformation
10815          for non-real operands.  */
10816       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10817           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10818           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10819           && operand_equal_p (arg0, arg1, 0))
10820         {
10821           tree r = build_real (TREE_TYPE (arg0), dconst1);
10822
10823           return omit_two_operands (type, r, arg0, arg1);
10824         }
10825
10826       /* The complex version of the above A / A optimization.  */
10827       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10828           && operand_equal_p (arg0, arg1, 0))
10829         {
10830           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10831           if (! HONOR_NANS (TYPE_MODE (elem_type))
10832               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10833             {
10834               tree r = build_real (elem_type, dconst1);
10835               /* omit_two_operands will call fold_convert for us.  */
10836               return omit_two_operands (type, r, arg0, arg1);
10837             }
10838         }
10839
10840       /* (-A) / (-B) -> A / B  */
10841       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10842         return fold_build2 (RDIV_EXPR, type,
10843                             TREE_OPERAND (arg0, 0),
10844                             negate_expr (arg1));
10845       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10846         return fold_build2 (RDIV_EXPR, type,
10847                             negate_expr (arg0),
10848                             TREE_OPERAND (arg1, 0));
10849
10850       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10851       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10852           && real_onep (arg1))
10853         return non_lvalue (fold_convert (type, arg0));
10854
10855       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10856       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10857           && real_minus_onep (arg1))
10858         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10859
10860       /* If ARG1 is a constant, we can convert this to a multiply by the
10861          reciprocal.  This does not have the same rounding properties,
10862          so only do this if -freciprocal-math.  We can actually
10863          always safely do it if ARG1 is a power of two, but it's hard to
10864          tell if it is or not in a portable manner.  */
10865       if (TREE_CODE (arg1) == REAL_CST)
10866         {
10867           if (flag_reciprocal_math
10868               && 0 != (tem = const_binop (code, build_real (type, dconst1),
10869                                           arg1, 0)))
10870             return fold_build2 (MULT_EXPR, type, arg0, tem);
10871           /* Find the reciprocal if optimizing and the result is exact.  */
10872           if (optimize)
10873             {
10874               REAL_VALUE_TYPE r;
10875               r = TREE_REAL_CST (arg1);
10876               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10877                 {
10878                   tem = build_real (type, r);
10879                   return fold_build2 (MULT_EXPR, type,
10880                                       fold_convert (type, arg0), tem);
10881                 }
10882             }
10883         }
10884       /* Convert A/B/C to A/(B*C).  */ 
10885       if (flag_reciprocal_math
10886           && TREE_CODE (arg0) == RDIV_EXPR)
10887         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10888                             fold_build2 (MULT_EXPR, type,
10889                                          TREE_OPERAND (arg0, 1), arg1));
10890
10891       /* Convert A/(B/C) to (A/B)*C.  */
10892       if (flag_reciprocal_math
10893           && TREE_CODE (arg1) == RDIV_EXPR)
10894         return fold_build2 (MULT_EXPR, type,
10895                             fold_build2 (RDIV_EXPR, type, arg0,
10896                                          TREE_OPERAND (arg1, 0)),
10897                             TREE_OPERAND (arg1, 1));
10898
10899       /* Convert C1/(X*C2) into (C1/C2)/X.  */
10900       if (flag_reciprocal_math
10901           && TREE_CODE (arg1) == MULT_EXPR
10902           && TREE_CODE (arg0) == REAL_CST
10903           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10904         {
10905           tree tem = const_binop (RDIV_EXPR, arg0,
10906                                   TREE_OPERAND (arg1, 1), 0);
10907           if (tem)
10908             return fold_build2 (RDIV_EXPR, type, tem,
10909                                 TREE_OPERAND (arg1, 0));
10910         }
10911
10912       if (flag_unsafe_math_optimizations)
10913         {
10914           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10915           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10916
10917           /* Optimize sin(x)/cos(x) as tan(x).  */
10918           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10919                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10920                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10921               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10922                                   CALL_EXPR_ARG (arg1, 0), 0))
10923             {
10924               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10925
10926               if (tanfn != NULL_TREE)
10927                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10928             }
10929
10930           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
10931           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10932                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10933                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10934               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10935                                   CALL_EXPR_ARG (arg1, 0), 0))
10936             {
10937               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10938
10939               if (tanfn != NULL_TREE)
10940                 {
10941                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10942                   return fold_build2 (RDIV_EXPR, type,
10943                                       build_real (type, dconst1), tmp);
10944                 }
10945             }
10946
10947           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10948              NaNs or Infinities.  */
10949           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10950                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10951                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
10952             {
10953               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10954               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10955
10956               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10957                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10958                   && operand_equal_p (arg00, arg01, 0))
10959                 {
10960                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10961
10962                   if (cosfn != NULL_TREE)
10963                     return build_call_expr (cosfn, 1, arg00);
10964                 }
10965             }
10966
10967           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
10968              NaNs or Infinities.  */
10969           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
10970                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
10971                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
10972             {
10973               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10974               tree arg01 = CALL_EXPR_ARG (arg1, 0);
10975
10976               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10977                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10978                   && operand_equal_p (arg00, arg01, 0))
10979                 {
10980                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10981
10982                   if (cosfn != NULL_TREE)
10983                     {
10984                       tree tmp = build_call_expr (cosfn, 1, arg00);
10985                       return fold_build2 (RDIV_EXPR, type,
10986                                           build_real (type, dconst1),
10987                                           tmp);
10988                     }
10989                 }
10990             }
10991
10992           /* Optimize pow(x,c)/x as pow(x,c-1).  */
10993           if (fcode0 == BUILT_IN_POW
10994               || fcode0 == BUILT_IN_POWF
10995               || fcode0 == BUILT_IN_POWL)
10996             {
10997               tree arg00 = CALL_EXPR_ARG (arg0, 0);
10998               tree arg01 = CALL_EXPR_ARG (arg0, 1);
10999               if (TREE_CODE (arg01) == REAL_CST
11000                   && !TREE_OVERFLOW (arg01)
11001                   && operand_equal_p (arg1, arg00, 0))
11002                 {
11003                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11004                   REAL_VALUE_TYPE c;
11005                   tree arg;
11006
11007                   c = TREE_REAL_CST (arg01);
11008                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11009                   arg = build_real (type, c);
11010                   return build_call_expr (powfn, 2, arg1, arg);
11011                 }
11012             }
11013
11014           /* Optimize a/root(b/c) into a*root(c/b).  */
11015           if (BUILTIN_ROOT_P (fcode1))
11016             {
11017               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11018
11019               if (TREE_CODE (rootarg) == RDIV_EXPR)
11020                 {
11021                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11022                   tree b = TREE_OPERAND (rootarg, 0);
11023                   tree c = TREE_OPERAND (rootarg, 1);
11024
11025                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11026
11027                   tmp = build_call_expr (rootfn, 1, tmp);
11028                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
11029                 }
11030             }
11031
11032           /* Optimize x/expN(y) into x*expN(-y).  */
11033           if (BUILTIN_EXPONENT_P (fcode1))
11034             {
11035               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11036               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11037               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11038               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11039             }
11040
11041           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11042           if (fcode1 == BUILT_IN_POW
11043               || fcode1 == BUILT_IN_POWF
11044               || fcode1 == BUILT_IN_POWL)
11045             {
11046               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11047               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11048               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11049               tree neg11 = fold_convert (type, negate_expr (arg11));
11050               arg1 = build_call_expr (powfn, 2, arg10, neg11);
11051               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11052             }
11053         }
11054       return NULL_TREE;
11055
11056     case TRUNC_DIV_EXPR:
11057     case FLOOR_DIV_EXPR:
11058       /* Simplify A / (B << N) where A and B are positive and B is
11059          a power of 2, to A >> (N + log2(B)).  */
11060       strict_overflow_p = false;
11061       if (TREE_CODE (arg1) == LSHIFT_EXPR
11062           && (TYPE_UNSIGNED (type)
11063               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11064         {
11065           tree sval = TREE_OPERAND (arg1, 0);
11066           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11067             {
11068               tree sh_cnt = TREE_OPERAND (arg1, 1);
11069               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11070
11071               if (strict_overflow_p)
11072                 fold_overflow_warning (("assuming signed overflow does not "
11073                                         "occur when simplifying A / (B << N)"),
11074                                        WARN_STRICT_OVERFLOW_MISC);
11075
11076               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11077                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
11078               return fold_build2 (RSHIFT_EXPR, type,
11079                                   fold_convert (type, arg0), sh_cnt);
11080             }
11081         }
11082
11083       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11084          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
11085       if (INTEGRAL_TYPE_P (type)
11086           && TYPE_UNSIGNED (type)
11087           && code == FLOOR_DIV_EXPR)
11088         return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11089
11090       /* Fall thru */
11091
11092     case ROUND_DIV_EXPR:
11093     case CEIL_DIV_EXPR:
11094     case EXACT_DIV_EXPR:
11095       if (integer_onep (arg1))
11096         return non_lvalue (fold_convert (type, arg0));
11097       if (integer_zerop (arg1))
11098         return NULL_TREE;
11099       /* X / -1 is -X.  */
11100       if (!TYPE_UNSIGNED (type)
11101           && TREE_CODE (arg1) == INTEGER_CST
11102           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11103           && TREE_INT_CST_HIGH (arg1) == -1)
11104         return fold_convert (type, negate_expr (arg0));
11105
11106       /* Convert -A / -B to A / B when the type is signed and overflow is
11107          undefined.  */
11108       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11109           && TREE_CODE (arg0) == NEGATE_EXPR
11110           && negate_expr_p (arg1))
11111         {
11112           if (INTEGRAL_TYPE_P (type))
11113             fold_overflow_warning (("assuming signed overflow does not occur "
11114                                     "when distributing negation across "
11115                                     "division"),
11116                                    WARN_STRICT_OVERFLOW_MISC);
11117           return fold_build2 (code, type,
11118                               fold_convert (type, TREE_OPERAND (arg0, 0)),
11119                               negate_expr (arg1));
11120         }
11121       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11122           && TREE_CODE (arg1) == NEGATE_EXPR
11123           && negate_expr_p (arg0))
11124         {
11125           if (INTEGRAL_TYPE_P (type))
11126             fold_overflow_warning (("assuming signed overflow does not occur "
11127                                     "when distributing negation across "
11128                                     "division"),
11129                                    WARN_STRICT_OVERFLOW_MISC);
11130           return fold_build2 (code, type, negate_expr (arg0),
11131                               TREE_OPERAND (arg1, 0));
11132         }
11133
11134       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11135          operation, EXACT_DIV_EXPR.
11136
11137          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11138          At one time others generated faster code, it's not clear if they do
11139          after the last round to changes to the DIV code in expmed.c.  */
11140       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11141           && multiple_of_p (type, arg0, arg1))
11142         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11143
11144       strict_overflow_p = false;
11145       if (TREE_CODE (arg1) == INTEGER_CST
11146           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11147                                          &strict_overflow_p)))
11148         {
11149           if (strict_overflow_p)
11150             fold_overflow_warning (("assuming signed overflow does not occur "
11151                                     "when simplifying division"),
11152                                    WARN_STRICT_OVERFLOW_MISC);
11153           return fold_convert (type, tem);
11154         }
11155
11156       return NULL_TREE;
11157
11158     case CEIL_MOD_EXPR:
11159     case FLOOR_MOD_EXPR:
11160     case ROUND_MOD_EXPR:
11161     case TRUNC_MOD_EXPR:
11162       /* X % 1 is always zero, but be sure to preserve any side
11163          effects in X.  */
11164       if (integer_onep (arg1))
11165         return omit_one_operand (type, integer_zero_node, arg0);
11166
11167       /* X % 0, return X % 0 unchanged so that we can get the
11168          proper warnings and errors.  */
11169       if (integer_zerop (arg1))
11170         return NULL_TREE;
11171
11172       /* 0 % X is always zero, but be sure to preserve any side
11173          effects in X.  Place this after checking for X == 0.  */
11174       if (integer_zerop (arg0))
11175         return omit_one_operand (type, integer_zero_node, arg1);
11176
11177       /* X % -1 is zero.  */
11178       if (!TYPE_UNSIGNED (type)
11179           && TREE_CODE (arg1) == INTEGER_CST
11180           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11181           && TREE_INT_CST_HIGH (arg1) == -1)
11182         return omit_one_operand (type, integer_zero_node, arg0);
11183
11184       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11185          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11186       strict_overflow_p = false;
11187       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11188           && (TYPE_UNSIGNED (type)
11189               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11190         {
11191           tree c = arg1;
11192           /* Also optimize A % (C << N)  where C is a power of 2,
11193              to A & ((C << N) - 1).  */
11194           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11195             c = TREE_OPERAND (arg1, 0);
11196
11197           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11198             {
11199               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11200                                        build_int_cst (TREE_TYPE (arg1), 1));
11201               if (strict_overflow_p)
11202                 fold_overflow_warning (("assuming signed overflow does not "
11203                                         "occur when simplifying "
11204                                         "X % (power of two)"),
11205                                        WARN_STRICT_OVERFLOW_MISC);
11206               return fold_build2 (BIT_AND_EXPR, type,
11207                                   fold_convert (type, arg0),
11208                                   fold_convert (type, mask));
11209             }
11210         }
11211
11212       /* X % -C is the same as X % C.  */
11213       if (code == TRUNC_MOD_EXPR
11214           && !TYPE_UNSIGNED (type)
11215           && TREE_CODE (arg1) == INTEGER_CST
11216           && !TREE_OVERFLOW (arg1)
11217           && TREE_INT_CST_HIGH (arg1) < 0
11218           && !TYPE_OVERFLOW_TRAPS (type)
11219           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
11220           && !sign_bit_p (arg1, arg1))
11221         return fold_build2 (code, type, fold_convert (type, arg0),
11222                             fold_convert (type, negate_expr (arg1)));
11223
11224       /* X % -Y is the same as X % Y.  */
11225       if (code == TRUNC_MOD_EXPR
11226           && !TYPE_UNSIGNED (type)
11227           && TREE_CODE (arg1) == NEGATE_EXPR
11228           && !TYPE_OVERFLOW_TRAPS (type))
11229         return fold_build2 (code, type, fold_convert (type, arg0),
11230                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11231
11232       if (TREE_CODE (arg1) == INTEGER_CST
11233           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11234                                          &strict_overflow_p)))
11235         {
11236           if (strict_overflow_p)
11237             fold_overflow_warning (("assuming signed overflow does not occur "
11238                                     "when simplifying modulos"),
11239                                    WARN_STRICT_OVERFLOW_MISC);
11240           return fold_convert (type, tem);
11241         }
11242
11243       return NULL_TREE;
11244
11245     case LROTATE_EXPR:
11246     case RROTATE_EXPR:
11247       if (integer_all_onesp (arg0))
11248         return omit_one_operand (type, arg0, arg1);
11249       goto shift;
11250
11251     case RSHIFT_EXPR:
11252       /* Optimize -1 >> x for arithmetic right shifts.  */
11253       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
11254         return omit_one_operand (type, arg0, arg1);
11255       /* ... fall through ...  */
11256
11257     case LSHIFT_EXPR:
11258     shift:
11259       if (integer_zerop (arg1))
11260         return non_lvalue (fold_convert (type, arg0));
11261       if (integer_zerop (arg0))
11262         return omit_one_operand (type, arg0, arg1);
11263
11264       /* Since negative shift count is not well-defined,
11265          don't try to compute it in the compiler.  */
11266       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11267         return NULL_TREE;
11268
11269       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
11270       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11271           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11272           && host_integerp (TREE_OPERAND (arg0, 1), false)
11273           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11274         {
11275           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11276                                + TREE_INT_CST_LOW (arg1));
11277
11278           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11279              being well defined.  */
11280           if (low >= TYPE_PRECISION (type))
11281             {
11282               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11283                 low = low % TYPE_PRECISION (type);
11284               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11285                 return build_int_cst (type, 0);
11286               else
11287                 low = TYPE_PRECISION (type) - 1;
11288             }
11289
11290           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11291                               build_int_cst (type, low));
11292         }
11293
11294       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11295          into x & ((unsigned)-1 >> c) for unsigned types.  */
11296       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11297            || (TYPE_UNSIGNED (type)
11298                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11299           && host_integerp (arg1, false)
11300           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11301           && host_integerp (TREE_OPERAND (arg0, 1), false)
11302           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11303         {
11304           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11305           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11306           tree lshift;
11307           tree arg00;
11308
11309           if (low0 == low1)
11310             {
11311               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11312
11313               lshift = build_int_cst (type, -1);
11314               lshift = int_const_binop (code, lshift, arg1, 0);
11315
11316               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11317             }
11318         }
11319
11320       /* Rewrite an LROTATE_EXPR by a constant into an
11321          RROTATE_EXPR by a new constant.  */
11322       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11323         {
11324           tree tem = build_int_cst (TREE_TYPE (arg1),
11325                                     TYPE_PRECISION (type));
11326           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11327           return fold_build2 (RROTATE_EXPR, type, op0, tem);
11328         }
11329
11330       /* If we have a rotate of a bit operation with the rotate count and
11331          the second operand of the bit operation both constant,
11332          permute the two operations.  */
11333       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11334           && (TREE_CODE (arg0) == BIT_AND_EXPR
11335               || TREE_CODE (arg0) == BIT_IOR_EXPR
11336               || TREE_CODE (arg0) == BIT_XOR_EXPR)
11337           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11338         return fold_build2 (TREE_CODE (arg0), type,
11339                             fold_build2 (code, type,
11340                                          TREE_OPERAND (arg0, 0), arg1),
11341                             fold_build2 (code, type,
11342                                          TREE_OPERAND (arg0, 1), arg1));
11343
11344       /* Two consecutive rotates adding up to the precision of the
11345          type can be ignored.  */
11346       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11347           && TREE_CODE (arg0) == RROTATE_EXPR
11348           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11349           && TREE_INT_CST_HIGH (arg1) == 0
11350           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11351           && ((TREE_INT_CST_LOW (arg1)
11352                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11353               == (unsigned int) TYPE_PRECISION (type)))
11354         return TREE_OPERAND (arg0, 0);
11355
11356       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11357               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11358          if the latter can be further optimized.  */
11359       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11360           && TREE_CODE (arg0) == BIT_AND_EXPR
11361           && TREE_CODE (arg1) == INTEGER_CST
11362           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11363         {
11364           tree mask = fold_build2 (code, type,
11365                                    fold_convert (type, TREE_OPERAND (arg0, 1)),
11366                                    arg1);
11367           tree shift = fold_build2 (code, type,
11368                                     fold_convert (type, TREE_OPERAND (arg0, 0)),
11369                                     arg1);
11370           tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11371           if (tem)
11372             return tem;
11373         }
11374
11375       return NULL_TREE;
11376
11377     case MIN_EXPR:
11378       if (operand_equal_p (arg0, arg1, 0))
11379         return omit_one_operand (type, arg0, arg1);
11380       if (INTEGRAL_TYPE_P (type)
11381           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11382         return omit_one_operand (type, arg1, arg0);
11383       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11384       if (tem)
11385         return tem;
11386       goto associate;
11387
11388     case MAX_EXPR:
11389       if (operand_equal_p (arg0, arg1, 0))
11390         return omit_one_operand (type, arg0, arg1);
11391       if (INTEGRAL_TYPE_P (type)
11392           && TYPE_MAX_VALUE (type)
11393           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11394         return omit_one_operand (type, arg1, arg0);
11395       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11396       if (tem)
11397         return tem;
11398       goto associate;
11399
11400     case TRUTH_ANDIF_EXPR:
11401       /* Note that the operands of this must be ints
11402          and their values must be 0 or 1.
11403          ("true" is a fixed value perhaps depending on the language.)  */
11404       /* If first arg is constant zero, return it.  */
11405       if (integer_zerop (arg0))
11406         return fold_convert (type, arg0);
11407     case TRUTH_AND_EXPR:
11408       /* If either arg is constant true, drop it.  */
11409       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11410         return non_lvalue (fold_convert (type, arg1));
11411       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11412           /* Preserve sequence points.  */
11413           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11414         return non_lvalue (fold_convert (type, arg0));
11415       /* If second arg is constant zero, result is zero, but first arg
11416          must be evaluated.  */
11417       if (integer_zerop (arg1))
11418         return omit_one_operand (type, arg1, arg0);
11419       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11420          case will be handled here.  */
11421       if (integer_zerop (arg0))
11422         return omit_one_operand (type, arg0, arg1);
11423
11424       /* !X && X is always false.  */
11425       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11426           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11427         return omit_one_operand (type, integer_zero_node, arg1);
11428       /* X && !X is always false.  */
11429       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11430           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11431         return omit_one_operand (type, integer_zero_node, arg0);
11432
11433       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
11434          means A >= Y && A != MAX, but in this case we know that
11435          A < X <= MAX.  */
11436
11437       if (!TREE_SIDE_EFFECTS (arg0)
11438           && !TREE_SIDE_EFFECTS (arg1))
11439         {
11440           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
11441           if (tem && !operand_equal_p (tem, arg0, 0))
11442             return fold_build2 (code, type, tem, arg1);
11443
11444           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11445           if (tem && !operand_equal_p (tem, arg1, 0))
11446             return fold_build2 (code, type, arg0, tem);
11447         }
11448
11449     truth_andor:
11450       /* We only do these simplifications if we are optimizing.  */
11451       if (!optimize)
11452         return NULL_TREE;
11453
11454       /* Check for things like (A || B) && (A || C).  We can convert this
11455          to A || (B && C).  Note that either operator can be any of the four
11456          truth and/or operations and the transformation will still be
11457          valid.   Also note that we only care about order for the
11458          ANDIF and ORIF operators.  If B contains side effects, this
11459          might change the truth-value of A.  */
11460       if (TREE_CODE (arg0) == TREE_CODE (arg1)
11461           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11462               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11463               || TREE_CODE (arg0) == TRUTH_AND_EXPR
11464               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11465           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11466         {
11467           tree a00 = TREE_OPERAND (arg0, 0);
11468           tree a01 = TREE_OPERAND (arg0, 1);
11469           tree a10 = TREE_OPERAND (arg1, 0);
11470           tree a11 = TREE_OPERAND (arg1, 1);
11471           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11472                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11473                              && (code == TRUTH_AND_EXPR
11474                                  || code == TRUTH_OR_EXPR));
11475
11476           if (operand_equal_p (a00, a10, 0))
11477             return fold_build2 (TREE_CODE (arg0), type, a00,
11478                                 fold_build2 (code, type, a01, a11));
11479           else if (commutative && operand_equal_p (a00, a11, 0))
11480             return fold_build2 (TREE_CODE (arg0), type, a00,
11481                                 fold_build2 (code, type, a01, a10));
11482           else if (commutative && operand_equal_p (a01, a10, 0))
11483             return fold_build2 (TREE_CODE (arg0), type, a01,
11484                                 fold_build2 (code, type, a00, a11));
11485
11486           /* This case if tricky because we must either have commutative
11487              operators or else A10 must not have side-effects.  */
11488
11489           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11490                    && operand_equal_p (a01, a11, 0))
11491             return fold_build2 (TREE_CODE (arg0), type,
11492                                 fold_build2 (code, type, a00, a10),
11493                                 a01);
11494         }
11495
11496       /* See if we can build a range comparison.  */
11497       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11498         return tem;
11499
11500       /* Check for the possibility of merging component references.  If our
11501          lhs is another similar operation, try to merge its rhs with our
11502          rhs.  Then try to merge our lhs and rhs.  */
11503       if (TREE_CODE (arg0) == code
11504           && 0 != (tem = fold_truthop (code, type,
11505                                        TREE_OPERAND (arg0, 1), arg1)))
11506         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11507
11508       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11509         return tem;
11510
11511       return NULL_TREE;
11512
11513     case TRUTH_ORIF_EXPR:
11514       /* Note that the operands of this must be ints
11515          and their values must be 0 or true.
11516          ("true" is a fixed value perhaps depending on the language.)  */
11517       /* If first arg is constant true, return it.  */
11518       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11519         return fold_convert (type, arg0);
11520     case TRUTH_OR_EXPR:
11521       /* If either arg is constant zero, drop it.  */
11522       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11523         return non_lvalue (fold_convert (type, arg1));
11524       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11525           /* Preserve sequence points.  */
11526           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11527         return non_lvalue (fold_convert (type, arg0));
11528       /* If second arg is constant true, result is true, but we must
11529          evaluate first arg.  */
11530       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11531         return omit_one_operand (type, arg1, arg0);
11532       /* Likewise for first arg, but note this only occurs here for
11533          TRUTH_OR_EXPR.  */
11534       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11535         return omit_one_operand (type, arg0, arg1);
11536
11537       /* !X || X is always true.  */
11538       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11539           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11540         return omit_one_operand (type, integer_one_node, arg1);
11541       /* X || !X is always true.  */
11542       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11543           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11544         return omit_one_operand (type, integer_one_node, arg0);
11545
11546       goto truth_andor;
11547
11548     case TRUTH_XOR_EXPR:
11549       /* If the second arg is constant zero, drop it.  */
11550       if (integer_zerop (arg1))
11551         return non_lvalue (fold_convert (type, arg0));
11552       /* If the second arg is constant true, this is a logical inversion.  */
11553       if (integer_onep (arg1))
11554         {
11555           /* Only call invert_truthvalue if operand is a truth value.  */
11556           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11557             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11558           else
11559             tem = invert_truthvalue (arg0);
11560           return non_lvalue (fold_convert (type, tem));
11561         }
11562       /* Identical arguments cancel to zero.  */
11563       if (operand_equal_p (arg0, arg1, 0))
11564         return omit_one_operand (type, integer_zero_node, arg0);
11565
11566       /* !X ^ X is always true.  */
11567       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11568           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11569         return omit_one_operand (type, integer_one_node, arg1);
11570
11571       /* X ^ !X is always true.  */
11572       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11573           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11574         return omit_one_operand (type, integer_one_node, arg0);
11575
11576       return NULL_TREE;
11577
11578     case EQ_EXPR:
11579     case NE_EXPR:
11580       tem = fold_comparison (code, type, op0, op1);
11581       if (tem != NULL_TREE)
11582         return tem;
11583
11584       /* bool_var != 0 becomes bool_var. */
11585       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11586           && code == NE_EXPR)
11587         return non_lvalue (fold_convert (type, arg0));
11588
11589       /* bool_var == 1 becomes bool_var. */
11590       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11591           && code == EQ_EXPR)
11592         return non_lvalue (fold_convert (type, arg0));
11593
11594       /* bool_var != 1 becomes !bool_var. */
11595       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11596           && code == NE_EXPR)
11597         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11598
11599       /* bool_var == 0 becomes !bool_var. */
11600       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11601           && code == EQ_EXPR)
11602         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11603
11604       /* If this is an equality comparison of the address of two non-weak,
11605          unaliased symbols neither of which are extern (since we do not
11606          have access to attributes for externs), then we know the result.  */
11607       if (TREE_CODE (arg0) == ADDR_EXPR
11608           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11609           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11610           && ! lookup_attribute ("alias",
11611                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11612           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11613           && TREE_CODE (arg1) == ADDR_EXPR
11614           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11615           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11616           && ! lookup_attribute ("alias",
11617                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11618           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11619         {
11620           /* We know that we're looking at the address of two
11621              non-weak, unaliased, static _DECL nodes.
11622
11623              It is both wasteful and incorrect to call operand_equal_p
11624              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11625              all we need to do is test pointer equality for the arguments
11626              to the two ADDR_EXPR nodes.  It is incorrect to use
11627              operand_equal_p as that function is NOT equivalent to a
11628              C equality test.  It can in fact return false for two
11629              objects which would test as equal using the C equality
11630              operator.  */
11631           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11632           return constant_boolean_node (equal
11633                                         ? code == EQ_EXPR : code != EQ_EXPR,
11634                                         type);
11635         }
11636
11637       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11638          a MINUS_EXPR of a constant, we can convert it into a comparison with
11639          a revised constant as long as no overflow occurs.  */
11640       if (TREE_CODE (arg1) == INTEGER_CST
11641           && (TREE_CODE (arg0) == PLUS_EXPR
11642               || TREE_CODE (arg0) == MINUS_EXPR)
11643           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11644           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11645                                       ? MINUS_EXPR : PLUS_EXPR,
11646                                       fold_convert (TREE_TYPE (arg0), arg1),
11647                                       TREE_OPERAND (arg0, 1), 0))
11648           && !TREE_OVERFLOW (tem))
11649         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11650
11651       /* Similarly for a NEGATE_EXPR.  */
11652       if (TREE_CODE (arg0) == NEGATE_EXPR
11653           && TREE_CODE (arg1) == INTEGER_CST
11654           && 0 != (tem = negate_expr (arg1))
11655           && TREE_CODE (tem) == INTEGER_CST
11656           && !TREE_OVERFLOW (tem))
11657         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11658
11659       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11660       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11661           && TREE_CODE (arg1) == INTEGER_CST
11662           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11663         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11664                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11665                                          fold_convert (TREE_TYPE (arg0), arg1),
11666                                          TREE_OPERAND (arg0, 1)));
11667
11668       /* Transform comparisons of the form X +- C CMP X.  */
11669       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11670           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11671           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11672           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11673               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11674         {
11675           tree cst = TREE_OPERAND (arg0, 1);
11676
11677           if (code == EQ_EXPR
11678               && !integer_zerop (cst))
11679             return omit_two_operands (type, boolean_false_node,
11680                                       TREE_OPERAND (arg0, 0), arg1);
11681           else
11682             return omit_two_operands (type, boolean_true_node,
11683                                       TREE_OPERAND (arg0, 0), arg1);
11684         }
11685
11686       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11687          for !=.  Don't do this for ordered comparisons due to overflow.  */
11688       if (TREE_CODE (arg0) == MINUS_EXPR
11689           && integer_zerop (arg1))
11690         return fold_build2 (code, type,
11691                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11692
11693       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11694       if (TREE_CODE (arg0) == ABS_EXPR
11695           && (integer_zerop (arg1) || real_zerop (arg1)))
11696         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11697
11698       /* If this is an EQ or NE comparison with zero and ARG0 is
11699          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11700          two operations, but the latter can be done in one less insn
11701          on machines that have only two-operand insns or on which a
11702          constant cannot be the first operand.  */
11703       if (TREE_CODE (arg0) == BIT_AND_EXPR
11704           && integer_zerop (arg1))
11705         {
11706           tree arg00 = TREE_OPERAND (arg0, 0);
11707           tree arg01 = TREE_OPERAND (arg0, 1);
11708           if (TREE_CODE (arg00) == LSHIFT_EXPR
11709               && integer_onep (TREE_OPERAND (arg00, 0)))
11710             {
11711               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11712                                       arg01, TREE_OPERAND (arg00, 1));
11713               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11714                                  build_int_cst (TREE_TYPE (arg0), 1));
11715               return fold_build2 (code, type,
11716                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11717             }
11718           else if (TREE_CODE (arg01) == LSHIFT_EXPR
11719                    && integer_onep (TREE_OPERAND (arg01, 0)))
11720             {
11721               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11722                                       arg00, TREE_OPERAND (arg01, 1));
11723               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11724                                  build_int_cst (TREE_TYPE (arg0), 1));
11725               return fold_build2 (code, type,
11726                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11727             }
11728         }
11729
11730       /* If this is an NE or EQ comparison of zero against the result of a
11731          signed MOD operation whose second operand is a power of 2, make
11732          the MOD operation unsigned since it is simpler and equivalent.  */
11733       if (integer_zerop (arg1)
11734           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11735           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11736               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11737               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11738               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11739           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11740         {
11741           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11742           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11743                                      fold_convert (newtype,
11744                                                    TREE_OPERAND (arg0, 0)),
11745                                      fold_convert (newtype,
11746                                                    TREE_OPERAND (arg0, 1)));
11747
11748           return fold_build2 (code, type, newmod,
11749                               fold_convert (newtype, arg1));
11750         }
11751
11752       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11753          C1 is a valid shift constant, and C2 is a power of two, i.e.
11754          a single bit.  */
11755       if (TREE_CODE (arg0) == BIT_AND_EXPR
11756           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11757           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11758              == INTEGER_CST
11759           && integer_pow2p (TREE_OPERAND (arg0, 1))
11760           && integer_zerop (arg1))
11761         {
11762           tree itype = TREE_TYPE (arg0);
11763           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11764           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11765
11766           /* Check for a valid shift count.  */
11767           if (TREE_INT_CST_HIGH (arg001) == 0
11768               && TREE_INT_CST_LOW (arg001) < prec)
11769             {
11770               tree arg01 = TREE_OPERAND (arg0, 1);
11771               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11772               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11773               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11774                  can be rewritten as (X & (C2 << C1)) != 0.  */
11775               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11776                 {
11777                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11778                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11779                   return fold_build2 (code, type, tem, arg1);
11780                 }
11781               /* Otherwise, for signed (arithmetic) shifts,
11782                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11783                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11784               else if (!TYPE_UNSIGNED (itype))
11785                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11786                                     arg000, build_int_cst (itype, 0));
11787               /* Otherwise, of unsigned (logical) shifts,
11788                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11789                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11790               else
11791                 return omit_one_operand (type,
11792                                          code == EQ_EXPR ? integer_one_node
11793                                                          : integer_zero_node,
11794                                          arg000);
11795             }
11796         }
11797
11798       /* If this is an NE comparison of zero with an AND of one, remove the
11799          comparison since the AND will give the correct value.  */
11800       if (code == NE_EXPR
11801           && integer_zerop (arg1)
11802           && TREE_CODE (arg0) == BIT_AND_EXPR
11803           && integer_onep (TREE_OPERAND (arg0, 1)))
11804         return fold_convert (type, arg0);
11805
11806       /* If we have (A & C) == C where C is a power of 2, convert this into
11807          (A & C) != 0.  Similarly for NE_EXPR.  */
11808       if (TREE_CODE (arg0) == BIT_AND_EXPR
11809           && integer_pow2p (TREE_OPERAND (arg0, 1))
11810           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11811         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11812                             arg0, fold_convert (TREE_TYPE (arg0),
11813                                                 integer_zero_node));
11814
11815       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11816          bit, then fold the expression into A < 0 or A >= 0.  */
11817       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11818       if (tem)
11819         return tem;
11820
11821       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11822          Similarly for NE_EXPR.  */
11823       if (TREE_CODE (arg0) == BIT_AND_EXPR
11824           && TREE_CODE (arg1) == INTEGER_CST
11825           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11826         {
11827           tree notc = fold_build1 (BIT_NOT_EXPR,
11828                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11829                                    TREE_OPERAND (arg0, 1));
11830           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11831                                        arg1, notc);
11832           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11833           if (integer_nonzerop (dandnotc))
11834             return omit_one_operand (type, rslt, arg0);
11835         }
11836
11837       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11838          Similarly for NE_EXPR.  */
11839       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11840           && TREE_CODE (arg1) == INTEGER_CST
11841           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11842         {
11843           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11844           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11845                                        TREE_OPERAND (arg0, 1), notd);
11846           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11847           if (integer_nonzerop (candnotd))
11848             return omit_one_operand (type, rslt, arg0);
11849         }
11850
11851       /* Optimize comparisons of strlen vs zero to a compare of the
11852          first character of the string vs zero.  To wit,
11853                 strlen(ptr) == 0   =>  *ptr == 0
11854                 strlen(ptr) != 0   =>  *ptr != 0
11855          Other cases should reduce to one of these two (or a constant)
11856          due to the return value of strlen being unsigned.  */
11857       if (TREE_CODE (arg0) == CALL_EXPR
11858           && integer_zerop (arg1))
11859         {
11860           tree fndecl = get_callee_fndecl (arg0);
11861
11862           if (fndecl
11863               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11864               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11865               && call_expr_nargs (arg0) == 1
11866               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11867             {
11868               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11869               return fold_build2 (code, type, iref,
11870                                   build_int_cst (TREE_TYPE (iref), 0));
11871             }
11872         }
11873
11874       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11875          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
11876       if (TREE_CODE (arg0) == RSHIFT_EXPR
11877           && integer_zerop (arg1)
11878           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11879         {
11880           tree arg00 = TREE_OPERAND (arg0, 0);
11881           tree arg01 = TREE_OPERAND (arg0, 1);
11882           tree itype = TREE_TYPE (arg00);
11883           if (TREE_INT_CST_HIGH (arg01) == 0
11884               && TREE_INT_CST_LOW (arg01)
11885                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11886             {
11887               if (TYPE_UNSIGNED (itype))
11888                 {
11889                   itype = signed_type_for (itype);
11890                   arg00 = fold_convert (itype, arg00);
11891                 }
11892               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11893                                   type, arg00, build_int_cst (itype, 0));
11894             }
11895         }
11896
11897       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
11898       if (integer_zerop (arg1)
11899           && TREE_CODE (arg0) == BIT_XOR_EXPR)
11900         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11901                             TREE_OPERAND (arg0, 1));
11902
11903       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
11904       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11905           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11906         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11907                             build_int_cst (TREE_TYPE (arg1), 0));
11908       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
11909       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11910           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11911           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11912         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11913                             build_int_cst (TREE_TYPE (arg1), 0));
11914
11915       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
11916       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11917           && TREE_CODE (arg1) == INTEGER_CST
11918           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11919         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11920                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11921                                          TREE_OPERAND (arg0, 1), arg1));
11922
11923       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11924          (X & C) == 0 when C is a single bit.  */
11925       if (TREE_CODE (arg0) == BIT_AND_EXPR
11926           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11927           && integer_zerop (arg1)
11928           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11929         {
11930           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11931                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11932                              TREE_OPERAND (arg0, 1));
11933           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11934                               type, tem, arg1);
11935         }
11936
11937       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11938          constant C is a power of two, i.e. a single bit.  */
11939       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11940           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11941           && integer_zerop (arg1)
11942           && integer_pow2p (TREE_OPERAND (arg0, 1))
11943           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11944                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11945         {
11946           tree arg00 = TREE_OPERAND (arg0, 0);
11947           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11948                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
11949         }
11950
11951       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
11952          when is C is a power of two, i.e. a single bit.  */
11953       if (TREE_CODE (arg0) == BIT_AND_EXPR
11954           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
11955           && integer_zerop (arg1)
11956           && integer_pow2p (TREE_OPERAND (arg0, 1))
11957           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11958                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11959         {
11960           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11961           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
11962                              arg000, TREE_OPERAND (arg0, 1));
11963           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11964                               tem, build_int_cst (TREE_TYPE (tem), 0));
11965         }
11966
11967       if (integer_zerop (arg1)
11968           && tree_expr_nonzero_p (arg0))
11969         {
11970           tree res = constant_boolean_node (code==NE_EXPR, type);
11971           return omit_one_operand (type, res, arg0);
11972         }
11973
11974       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
11975       if (TREE_CODE (arg0) == NEGATE_EXPR
11976           && TREE_CODE (arg1) == NEGATE_EXPR)
11977         return fold_build2 (code, type,
11978                             TREE_OPERAND (arg0, 0),
11979                             TREE_OPERAND (arg1, 0));
11980
11981       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
11982       if (TREE_CODE (arg0) == BIT_AND_EXPR
11983           && TREE_CODE (arg1) == BIT_AND_EXPR)
11984         {
11985           tree arg00 = TREE_OPERAND (arg0, 0);
11986           tree arg01 = TREE_OPERAND (arg0, 1);
11987           tree arg10 = TREE_OPERAND (arg1, 0);
11988           tree arg11 = TREE_OPERAND (arg1, 1);
11989           tree itype = TREE_TYPE (arg0);
11990
11991           if (operand_equal_p (arg01, arg11, 0))
11992             return fold_build2 (code, type,
11993                                 fold_build2 (BIT_AND_EXPR, itype,
11994                                              fold_build2 (BIT_XOR_EXPR, itype,
11995                                                           arg00, arg10),
11996                                              arg01),
11997                                 build_int_cst (itype, 0));
11998
11999           if (operand_equal_p (arg01, arg10, 0))
12000             return fold_build2 (code, type,
12001                                 fold_build2 (BIT_AND_EXPR, itype,
12002                                              fold_build2 (BIT_XOR_EXPR, itype,
12003                                                           arg00, arg11),
12004                                              arg01),
12005                                 build_int_cst (itype, 0));
12006
12007           if (operand_equal_p (arg00, arg11, 0))
12008             return fold_build2 (code, type,
12009                                 fold_build2 (BIT_AND_EXPR, itype,
12010                                              fold_build2 (BIT_XOR_EXPR, itype,
12011                                                           arg01, arg10),
12012                                              arg00),
12013                                 build_int_cst (itype, 0));
12014
12015           if (operand_equal_p (arg00, arg10, 0))
12016             return fold_build2 (code, type,
12017                                 fold_build2 (BIT_AND_EXPR, itype,
12018                                              fold_build2 (BIT_XOR_EXPR, itype,
12019                                                           arg01, arg11),
12020                                              arg00),
12021                                 build_int_cst (itype, 0));
12022         }
12023
12024       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12025           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12026         {
12027           tree arg00 = TREE_OPERAND (arg0, 0);
12028           tree arg01 = TREE_OPERAND (arg0, 1);
12029           tree arg10 = TREE_OPERAND (arg1, 0);
12030           tree arg11 = TREE_OPERAND (arg1, 1);
12031           tree itype = TREE_TYPE (arg0);
12032
12033           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12034              operand_equal_p guarantees no side-effects so we don't need
12035              to use omit_one_operand on Z.  */
12036           if (operand_equal_p (arg01, arg11, 0))
12037             return fold_build2 (code, type, arg00, arg10);
12038           if (operand_equal_p (arg01, arg10, 0))
12039             return fold_build2 (code, type, arg00, arg11);
12040           if (operand_equal_p (arg00, arg11, 0))
12041             return fold_build2 (code, type, arg01, arg10);
12042           if (operand_equal_p (arg00, arg10, 0))
12043             return fold_build2 (code, type, arg01, arg11);
12044
12045           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12046           if (TREE_CODE (arg01) == INTEGER_CST
12047               && TREE_CODE (arg11) == INTEGER_CST)
12048             return fold_build2 (code, type,
12049                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12050                                              fold_build2 (BIT_XOR_EXPR, itype,
12051                                                           arg01, arg11)),
12052                                 arg10);
12053         }
12054
12055       /* Attempt to simplify equality/inequality comparisons of complex
12056          values.  Only lower the comparison if the result is known or
12057          can be simplified to a single scalar comparison.  */
12058       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12059            || TREE_CODE (arg0) == COMPLEX_CST)
12060           && (TREE_CODE (arg1) == COMPLEX_EXPR
12061               || TREE_CODE (arg1) == COMPLEX_CST))
12062         {
12063           tree real0, imag0, real1, imag1;
12064           tree rcond, icond;
12065
12066           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12067             {
12068               real0 = TREE_OPERAND (arg0, 0);
12069               imag0 = TREE_OPERAND (arg0, 1);
12070             }
12071           else
12072             {
12073               real0 = TREE_REALPART (arg0);
12074               imag0 = TREE_IMAGPART (arg0);
12075             }
12076
12077           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12078             {
12079               real1 = TREE_OPERAND (arg1, 0);
12080               imag1 = TREE_OPERAND (arg1, 1);
12081             }
12082           else
12083             {
12084               real1 = TREE_REALPART (arg1);
12085               imag1 = TREE_IMAGPART (arg1);
12086             }
12087
12088           rcond = fold_binary (code, type, real0, real1);
12089           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12090             {
12091               if (integer_zerop (rcond))
12092                 {
12093                   if (code == EQ_EXPR)
12094                     return omit_two_operands (type, boolean_false_node,
12095                                               imag0, imag1);
12096                   return fold_build2 (NE_EXPR, type, imag0, imag1);
12097                 }
12098               else
12099                 {
12100                   if (code == NE_EXPR)
12101                     return omit_two_operands (type, boolean_true_node,
12102                                               imag0, imag1);
12103                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
12104                 }
12105             }
12106
12107           icond = fold_binary (code, type, imag0, imag1);
12108           if (icond && TREE_CODE (icond) == INTEGER_CST)
12109             {
12110               if (integer_zerop (icond))
12111                 {
12112                   if (code == EQ_EXPR)
12113                     return omit_two_operands (type, boolean_false_node,
12114                                               real0, real1);
12115                   return fold_build2 (NE_EXPR, type, real0, real1);
12116                 }
12117               else
12118                 {
12119                   if (code == NE_EXPR)
12120                     return omit_two_operands (type, boolean_true_node,
12121                                               real0, real1);
12122                   return fold_build2 (EQ_EXPR, type, real0, real1);
12123                 }
12124             }
12125         }
12126
12127       return NULL_TREE;
12128
12129     case LT_EXPR:
12130     case GT_EXPR:
12131     case LE_EXPR:
12132     case GE_EXPR:
12133       tem = fold_comparison (code, type, op0, op1);
12134       if (tem != NULL_TREE)
12135         return tem;
12136
12137       /* Transform comparisons of the form X +- C CMP X.  */
12138       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12139           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12140           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12141                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12142               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12143                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12144         {
12145           tree arg01 = TREE_OPERAND (arg0, 1);
12146           enum tree_code code0 = TREE_CODE (arg0);
12147           int is_positive;
12148
12149           if (TREE_CODE (arg01) == REAL_CST)
12150             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12151           else
12152             is_positive = tree_int_cst_sgn (arg01);
12153
12154           /* (X - c) > X becomes false.  */
12155           if (code == GT_EXPR
12156               && ((code0 == MINUS_EXPR && is_positive >= 0)
12157                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12158             {
12159               if (TREE_CODE (arg01) == INTEGER_CST
12160                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12161                 fold_overflow_warning (("assuming signed overflow does not "
12162                                         "occur when assuming that (X - c) > X "
12163                                         "is always false"),
12164                                        WARN_STRICT_OVERFLOW_ALL);
12165               return constant_boolean_node (0, type);
12166             }
12167
12168           /* Likewise (X + c) < X becomes false.  */
12169           if (code == LT_EXPR
12170               && ((code0 == PLUS_EXPR && is_positive >= 0)
12171                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12172             {
12173               if (TREE_CODE (arg01) == INTEGER_CST
12174                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12175                 fold_overflow_warning (("assuming signed overflow does not "
12176                                         "occur when assuming that "
12177                                         "(X + c) < X is always false"),
12178                                        WARN_STRICT_OVERFLOW_ALL);
12179               return constant_boolean_node (0, type);
12180             }
12181
12182           /* Convert (X - c) <= X to true.  */
12183           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12184               && code == LE_EXPR
12185               && ((code0 == MINUS_EXPR && is_positive >= 0)
12186                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12187             {
12188               if (TREE_CODE (arg01) == INTEGER_CST
12189                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12190                 fold_overflow_warning (("assuming signed overflow does not "
12191                                         "occur when assuming that "
12192                                         "(X - c) <= X is always true"),
12193                                        WARN_STRICT_OVERFLOW_ALL);
12194               return constant_boolean_node (1, type);
12195             }
12196
12197           /* Convert (X + c) >= X to true.  */
12198           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12199               && code == GE_EXPR
12200               && ((code0 == PLUS_EXPR && is_positive >= 0)
12201                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12202             {
12203               if (TREE_CODE (arg01) == INTEGER_CST
12204                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12205                 fold_overflow_warning (("assuming signed overflow does not "
12206                                         "occur when assuming that "
12207                                         "(X + c) >= X is always true"),
12208                                        WARN_STRICT_OVERFLOW_ALL);
12209               return constant_boolean_node (1, type);
12210             }
12211
12212           if (TREE_CODE (arg01) == INTEGER_CST)
12213             {
12214               /* Convert X + c > X and X - c < X to true for integers.  */
12215               if (code == GT_EXPR
12216                   && ((code0 == PLUS_EXPR && is_positive > 0)
12217                       || (code0 == MINUS_EXPR && is_positive < 0)))
12218                 {
12219                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12220                     fold_overflow_warning (("assuming signed overflow does "
12221                                             "not occur when assuming that "
12222                                             "(X + c) > X is always true"),
12223                                            WARN_STRICT_OVERFLOW_ALL);
12224                   return constant_boolean_node (1, type);
12225                 }
12226
12227               if (code == LT_EXPR
12228                   && ((code0 == MINUS_EXPR && is_positive > 0)
12229                       || (code0 == PLUS_EXPR && is_positive < 0)))
12230                 {
12231                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12232                     fold_overflow_warning (("assuming signed overflow does "
12233                                             "not occur when assuming that "
12234                                             "(X - c) < X is always true"),
12235                                            WARN_STRICT_OVERFLOW_ALL);
12236                   return constant_boolean_node (1, type);
12237                 }
12238
12239               /* Convert X + c <= X and X - c >= X to false for integers.  */
12240               if (code == LE_EXPR
12241                   && ((code0 == PLUS_EXPR && is_positive > 0)
12242                       || (code0 == MINUS_EXPR && is_positive < 0)))
12243                 {
12244                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12245                     fold_overflow_warning (("assuming signed overflow does "
12246                                             "not occur when assuming that "
12247                                             "(X + c) <= X is always false"),
12248                                            WARN_STRICT_OVERFLOW_ALL);
12249                   return constant_boolean_node (0, type);
12250                 }
12251
12252               if (code == GE_EXPR
12253                   && ((code0 == MINUS_EXPR && is_positive > 0)
12254                       || (code0 == PLUS_EXPR && is_positive < 0)))
12255                 {
12256                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12257                     fold_overflow_warning (("assuming signed overflow does "
12258                                             "not occur when assuming that "
12259                                             "(X - c) >= X is always false"),
12260                                            WARN_STRICT_OVERFLOW_ALL);
12261                   return constant_boolean_node (0, type);
12262                 }
12263             }
12264         }
12265
12266       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
12267          This transformation affects the cases which are handled in later
12268          optimizations involving comparisons with non-negative constants.  */
12269       if (TREE_CODE (arg1) == INTEGER_CST
12270           && TREE_CODE (arg0) != INTEGER_CST
12271           && tree_int_cst_sgn (arg1) > 0)
12272         {
12273           if (code == GE_EXPR)
12274             {
12275               arg1 = const_binop (MINUS_EXPR, arg1,
12276                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12277               return fold_build2 (GT_EXPR, type, arg0,
12278                                   fold_convert (TREE_TYPE (arg0), arg1));
12279             }
12280           if (code == LT_EXPR)
12281             {
12282               arg1 = const_binop (MINUS_EXPR, arg1,
12283                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12284               return fold_build2 (LE_EXPR, type, arg0,
12285                                   fold_convert (TREE_TYPE (arg0), arg1));
12286             }
12287         }
12288
12289       /* Comparisons with the highest or lowest possible integer of
12290          the specified precision will have known values.  */
12291       {
12292         tree arg1_type = TREE_TYPE (arg1);
12293         unsigned int width = TYPE_PRECISION (arg1_type);
12294
12295         if (TREE_CODE (arg1) == INTEGER_CST
12296             && !TREE_OVERFLOW (arg1)
12297             && width <= 2 * HOST_BITS_PER_WIDE_INT
12298             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12299           {
12300             HOST_WIDE_INT signed_max_hi;
12301             unsigned HOST_WIDE_INT signed_max_lo;
12302             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12303
12304             if (width <= HOST_BITS_PER_WIDE_INT)
12305               {
12306                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12307                                 - 1;
12308                 signed_max_hi = 0;
12309                 max_hi = 0;
12310
12311                 if (TYPE_UNSIGNED (arg1_type))
12312                   {
12313                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12314                     min_lo = 0;
12315                     min_hi = 0;
12316                   }
12317                 else
12318                   {
12319                     max_lo = signed_max_lo;
12320                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12321                     min_hi = -1;
12322                   }
12323               }
12324             else
12325               {
12326                 width -= HOST_BITS_PER_WIDE_INT;
12327                 signed_max_lo = -1;
12328                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12329                                 - 1;
12330                 max_lo = -1;
12331                 min_lo = 0;
12332
12333                 if (TYPE_UNSIGNED (arg1_type))
12334                   {
12335                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12336                     min_hi = 0;
12337                   }
12338                 else
12339                   {
12340                     max_hi = signed_max_hi;
12341                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12342                   }
12343               }
12344
12345             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12346                 && TREE_INT_CST_LOW (arg1) == max_lo)
12347               switch (code)
12348                 {
12349                 case GT_EXPR:
12350                   return omit_one_operand (type, integer_zero_node, arg0);
12351
12352                 case GE_EXPR:
12353                   return fold_build2 (EQ_EXPR, type, op0, op1);
12354
12355                 case LE_EXPR:
12356                   return omit_one_operand (type, integer_one_node, arg0);
12357
12358                 case LT_EXPR:
12359                   return fold_build2 (NE_EXPR, type, op0, op1);
12360
12361                 /* The GE_EXPR and LT_EXPR cases above are not normally
12362                    reached because of previous transformations.  */
12363
12364                 default:
12365                   break;
12366                 }
12367             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12368                      == max_hi
12369                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12370               switch (code)
12371                 {
12372                 case GT_EXPR:
12373                   arg1 = const_binop (PLUS_EXPR, arg1,
12374                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12375                   return fold_build2 (EQ_EXPR, type,
12376                                       fold_convert (TREE_TYPE (arg1), arg0),
12377                                       arg1);
12378                 case LE_EXPR:
12379                   arg1 = const_binop (PLUS_EXPR, arg1,
12380                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12381                   return fold_build2 (NE_EXPR, type,
12382                                       fold_convert (TREE_TYPE (arg1), arg0),
12383                                       arg1);
12384                 default:
12385                   break;
12386                 }
12387             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12388                      == min_hi
12389                      && TREE_INT_CST_LOW (arg1) == min_lo)
12390               switch (code)
12391                 {
12392                 case LT_EXPR:
12393                   return omit_one_operand (type, integer_zero_node, arg0);
12394
12395                 case LE_EXPR:
12396                   return fold_build2 (EQ_EXPR, type, op0, op1);
12397
12398                 case GE_EXPR:
12399                   return omit_one_operand (type, integer_one_node, arg0);
12400
12401                 case GT_EXPR:
12402                   return fold_build2 (NE_EXPR, type, op0, op1);
12403
12404                 default:
12405                   break;
12406                 }
12407             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12408                      == min_hi
12409                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12410               switch (code)
12411                 {
12412                 case GE_EXPR:
12413                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12414                   return fold_build2 (NE_EXPR, type,
12415                                       fold_convert (TREE_TYPE (arg1), arg0),
12416                                       arg1);
12417                 case LT_EXPR:
12418                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12419                   return fold_build2 (EQ_EXPR, type,
12420                                       fold_convert (TREE_TYPE (arg1), arg0),
12421                                       arg1);
12422                 default:
12423                   break;
12424                 }
12425
12426             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
12427                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
12428                      && TYPE_UNSIGNED (arg1_type)
12429                      /* We will flip the signedness of the comparison operator
12430                         associated with the mode of arg1, so the sign bit is
12431                         specified by this mode.  Check that arg1 is the signed
12432                         max associated with this sign bit.  */
12433                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12434                      /* signed_type does not work on pointer types.  */
12435                      && INTEGRAL_TYPE_P (arg1_type))
12436               {
12437                 /* The following case also applies to X < signed_max+1
12438                    and X >= signed_max+1 because previous transformations.  */
12439                 if (code == LE_EXPR || code == GT_EXPR)
12440                   {
12441                     tree st;
12442                     st = signed_type_for (TREE_TYPE (arg1));
12443                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12444                                         type, fold_convert (st, arg0),
12445                                         build_int_cst (st, 0));
12446                   }
12447               }
12448           }
12449       }
12450
12451       /* If we are comparing an ABS_EXPR with a constant, we can
12452          convert all the cases into explicit comparisons, but they may
12453          well not be faster than doing the ABS and one comparison.
12454          But ABS (X) <= C is a range comparison, which becomes a subtraction
12455          and a comparison, and is probably faster.  */
12456       if (code == LE_EXPR
12457           && TREE_CODE (arg1) == INTEGER_CST
12458           && TREE_CODE (arg0) == ABS_EXPR
12459           && ! TREE_SIDE_EFFECTS (arg0)
12460           && (0 != (tem = negate_expr (arg1)))
12461           && TREE_CODE (tem) == INTEGER_CST
12462           && !TREE_OVERFLOW (tem))
12463         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12464                             build2 (GE_EXPR, type,
12465                                     TREE_OPERAND (arg0, 0), tem),
12466                             build2 (LE_EXPR, type,
12467                                     TREE_OPERAND (arg0, 0), arg1));
12468
12469       /* Convert ABS_EXPR<x> >= 0 to true.  */
12470       strict_overflow_p = false;
12471       if (code == GE_EXPR
12472           && (integer_zerop (arg1)
12473               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12474                   && real_zerop (arg1)))
12475           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12476         {
12477           if (strict_overflow_p)
12478             fold_overflow_warning (("assuming signed overflow does not occur "
12479                                     "when simplifying comparison of "
12480                                     "absolute value and zero"),
12481                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12482           return omit_one_operand (type, integer_one_node, arg0);
12483         }
12484
12485       /* Convert ABS_EXPR<x> < 0 to false.  */
12486       strict_overflow_p = false;
12487       if (code == LT_EXPR
12488           && (integer_zerop (arg1) || real_zerop (arg1))
12489           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12490         {
12491           if (strict_overflow_p)
12492             fold_overflow_warning (("assuming signed overflow does not occur "
12493                                     "when simplifying comparison of "
12494                                     "absolute value and zero"),
12495                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12496           return omit_one_operand (type, integer_zero_node, arg0);
12497         }
12498
12499       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12500          and similarly for >= into !=.  */
12501       if ((code == LT_EXPR || code == GE_EXPR)
12502           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12503           && TREE_CODE (arg1) == LSHIFT_EXPR
12504           && integer_onep (TREE_OPERAND (arg1, 0)))
12505         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12506                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12507                                TREE_OPERAND (arg1, 1)),
12508                        build_int_cst (TREE_TYPE (arg0), 0));
12509
12510       if ((code == LT_EXPR || code == GE_EXPR)
12511           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12512           && (TREE_CODE (arg1) == NOP_EXPR
12513               || TREE_CODE (arg1) == CONVERT_EXPR)
12514           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12515           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12516         return
12517           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12518                   fold_convert (TREE_TYPE (arg0),
12519                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12520                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12521                                                       1))),
12522                   build_int_cst (TREE_TYPE (arg0), 0));
12523
12524       return NULL_TREE;
12525
12526     case UNORDERED_EXPR:
12527     case ORDERED_EXPR:
12528     case UNLT_EXPR:
12529     case UNLE_EXPR:
12530     case UNGT_EXPR:
12531     case UNGE_EXPR:
12532     case UNEQ_EXPR:
12533     case LTGT_EXPR:
12534       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12535         {
12536           t1 = fold_relational_const (code, type, arg0, arg1);
12537           if (t1 != NULL_TREE)
12538             return t1;
12539         }
12540
12541       /* If the first operand is NaN, the result is constant.  */
12542       if (TREE_CODE (arg0) == REAL_CST
12543           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12544           && (code != LTGT_EXPR || ! flag_trapping_math))
12545         {
12546           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12547                ? integer_zero_node
12548                : integer_one_node;
12549           return omit_one_operand (type, t1, arg1);
12550         }
12551
12552       /* If the second operand is NaN, the result is constant.  */
12553       if (TREE_CODE (arg1) == REAL_CST
12554           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12555           && (code != LTGT_EXPR || ! flag_trapping_math))
12556         {
12557           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12558                ? integer_zero_node
12559                : integer_one_node;
12560           return omit_one_operand (type, t1, arg0);
12561         }
12562
12563       /* Simplify unordered comparison of something with itself.  */
12564       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12565           && operand_equal_p (arg0, arg1, 0))
12566         return constant_boolean_node (1, type);
12567
12568       if (code == LTGT_EXPR
12569           && !flag_trapping_math
12570           && operand_equal_p (arg0, arg1, 0))
12571         return constant_boolean_node (0, type);
12572
12573       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12574       {
12575         tree targ0 = strip_float_extensions (arg0);
12576         tree targ1 = strip_float_extensions (arg1);
12577         tree newtype = TREE_TYPE (targ0);
12578
12579         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12580           newtype = TREE_TYPE (targ1);
12581
12582         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12583           return fold_build2 (code, type, fold_convert (newtype, targ0),
12584                               fold_convert (newtype, targ1));
12585       }
12586
12587       return NULL_TREE;
12588
12589     case COMPOUND_EXPR:
12590       /* When pedantic, a compound expression can be neither an lvalue
12591          nor an integer constant expression.  */
12592       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12593         return NULL_TREE;
12594       /* Don't let (0, 0) be null pointer constant.  */
12595       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12596                                  : fold_convert (type, arg1);
12597       return pedantic_non_lvalue (tem);
12598
12599     case COMPLEX_EXPR:
12600       if ((TREE_CODE (arg0) == REAL_CST
12601            && TREE_CODE (arg1) == REAL_CST)
12602           || (TREE_CODE (arg0) == INTEGER_CST
12603               && TREE_CODE (arg1) == INTEGER_CST))
12604         return build_complex (type, arg0, arg1);
12605       return NULL_TREE;
12606
12607     case ASSERT_EXPR:
12608       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12609       gcc_unreachable ();
12610
12611     default:
12612       return NULL_TREE;
12613     } /* switch (code) */
12614 }
12615
12616 /* Callback for walk_tree, looking for LABEL_EXPR.
12617    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12618    Do not check the sub-tree of GOTO_EXPR.  */
12619
12620 static tree
12621 contains_label_1 (tree *tp,
12622                   int *walk_subtrees,
12623                   void *data ATTRIBUTE_UNUSED)
12624 {
12625   switch (TREE_CODE (*tp))
12626     {
12627     case LABEL_EXPR:
12628       return *tp;
12629     case GOTO_EXPR:
12630       *walk_subtrees = 0;
12631     /* no break */
12632     default:
12633       return NULL_TREE;
12634     }
12635 }
12636
12637 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12638    accessible from outside the sub-tree. Returns NULL_TREE if no
12639    addressable label is found.  */
12640
12641 static bool
12642 contains_label_p (tree st)
12643 {
12644   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12645 }
12646
12647 /* Fold a ternary expression of code CODE and type TYPE with operands
12648    OP0, OP1, and OP2.  Return the folded expression if folding is
12649    successful.  Otherwise, return NULL_TREE.  */
12650
12651 tree
12652 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12653 {
12654   tree tem;
12655   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12656   enum tree_code_class kind = TREE_CODE_CLASS (code);
12657
12658   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12659               && TREE_CODE_LENGTH (code) == 3);
12660
12661   /* Strip any conversions that don't change the mode.  This is safe
12662      for every expression, except for a comparison expression because
12663      its signedness is derived from its operands.  So, in the latter
12664      case, only strip conversions that don't change the signedness.
12665
12666      Note that this is done as an internal manipulation within the
12667      constant folder, in order to find the simplest representation of
12668      the arguments so that their form can be studied.  In any cases,
12669      the appropriate type conversions should be put back in the tree
12670      that will get out of the constant folder.  */
12671   if (op0)
12672     {
12673       arg0 = op0;
12674       STRIP_NOPS (arg0);
12675     }
12676
12677   if (op1)
12678     {
12679       arg1 = op1;
12680       STRIP_NOPS (arg1);
12681     }
12682
12683   switch (code)
12684     {
12685     case COMPONENT_REF:
12686       if (TREE_CODE (arg0) == CONSTRUCTOR
12687           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12688         {
12689           unsigned HOST_WIDE_INT idx;
12690           tree field, value;
12691           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12692             if (field == arg1)
12693               return value;
12694         }
12695       return NULL_TREE;
12696
12697     case COND_EXPR:
12698       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12699          so all simple results must be passed through pedantic_non_lvalue.  */
12700       if (TREE_CODE (arg0) == INTEGER_CST)
12701         {
12702           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12703           tem = integer_zerop (arg0) ? op2 : op1;
12704           /* Only optimize constant conditions when the selected branch
12705              has the same type as the COND_EXPR.  This avoids optimizing
12706              away "c ? x : throw", where the throw has a void type.
12707              Avoid throwing away that operand which contains label.  */
12708           if ((!TREE_SIDE_EFFECTS (unused_op)
12709                || !contains_label_p (unused_op))
12710               && (! VOID_TYPE_P (TREE_TYPE (tem))
12711                   || VOID_TYPE_P (type)))
12712             return pedantic_non_lvalue (tem);
12713           return NULL_TREE;
12714         }
12715       if (operand_equal_p (arg1, op2, 0))
12716         return pedantic_omit_one_operand (type, arg1, arg0);
12717
12718       /* If we have A op B ? A : C, we may be able to convert this to a
12719          simpler expression, depending on the operation and the values
12720          of B and C.  Signed zeros prevent all of these transformations,
12721          for reasons given above each one.
12722
12723          Also try swapping the arguments and inverting the conditional.  */
12724       if (COMPARISON_CLASS_P (arg0)
12725           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12726                                              arg1, TREE_OPERAND (arg0, 1))
12727           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12728         {
12729           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12730           if (tem)
12731             return tem;
12732         }
12733
12734       if (COMPARISON_CLASS_P (arg0)
12735           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12736                                              op2,
12737                                              TREE_OPERAND (arg0, 1))
12738           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12739         {
12740           tem = fold_truth_not_expr (arg0);
12741           if (tem && COMPARISON_CLASS_P (tem))
12742             {
12743               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12744               if (tem)
12745                 return tem;
12746             }
12747         }
12748
12749       /* If the second operand is simpler than the third, swap them
12750          since that produces better jump optimization results.  */
12751       if (truth_value_p (TREE_CODE (arg0))
12752           && tree_swap_operands_p (op1, op2, false))
12753         {
12754           /* See if this can be inverted.  If it can't, possibly because
12755              it was a floating-point inequality comparison, don't do
12756              anything.  */
12757           tem = fold_truth_not_expr (arg0);
12758           if (tem)
12759             return fold_build3 (code, type, tem, op2, op1);
12760         }
12761
12762       /* Convert A ? 1 : 0 to simply A.  */
12763       if (integer_onep (op1)
12764           && integer_zerop (op2)
12765           /* If we try to convert OP0 to our type, the
12766              call to fold will try to move the conversion inside
12767              a COND, which will recurse.  In that case, the COND_EXPR
12768              is probably the best choice, so leave it alone.  */
12769           && type == TREE_TYPE (arg0))
12770         return pedantic_non_lvalue (arg0);
12771
12772       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12773          over COND_EXPR in cases such as floating point comparisons.  */
12774       if (integer_zerop (op1)
12775           && integer_onep (op2)
12776           && truth_value_p (TREE_CODE (arg0)))
12777         return pedantic_non_lvalue (fold_convert (type,
12778                                                   invert_truthvalue (arg0)));
12779
12780       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12781       if (TREE_CODE (arg0) == LT_EXPR
12782           && integer_zerop (TREE_OPERAND (arg0, 1))
12783           && integer_zerop (op2)
12784           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12785         {
12786           /* sign_bit_p only checks ARG1 bits within A's precision.
12787              If <sign bit of A> has wider type than A, bits outside
12788              of A's precision in <sign bit of A> need to be checked.
12789              If they are all 0, this optimization needs to be done
12790              in unsigned A's type, if they are all 1 in signed A's type,
12791              otherwise this can't be done.  */
12792           if (TYPE_PRECISION (TREE_TYPE (tem))
12793               < TYPE_PRECISION (TREE_TYPE (arg1))
12794               && TYPE_PRECISION (TREE_TYPE (tem))
12795                  < TYPE_PRECISION (type))
12796             {
12797               unsigned HOST_WIDE_INT mask_lo;
12798               HOST_WIDE_INT mask_hi;
12799               int inner_width, outer_width;
12800               tree tem_type;
12801
12802               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12803               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12804               if (outer_width > TYPE_PRECISION (type))
12805                 outer_width = TYPE_PRECISION (type);
12806
12807               if (outer_width > HOST_BITS_PER_WIDE_INT)
12808                 {
12809                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12810                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12811                   mask_lo = -1;
12812                 }
12813               else
12814                 {
12815                   mask_hi = 0;
12816                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12817                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12818                 }
12819               if (inner_width > HOST_BITS_PER_WIDE_INT)
12820                 {
12821                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12822                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12823                   mask_lo = 0;
12824                 }
12825               else
12826                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12827                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12828
12829               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12830                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12831                 {
12832                   tem_type = signed_type_for (TREE_TYPE (tem));
12833                   tem = fold_convert (tem_type, tem);
12834                 }
12835               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12836                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12837                 {
12838                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12839                   tem = fold_convert (tem_type, tem);
12840                 }
12841               else
12842                 tem = NULL;
12843             }
12844
12845           if (tem)
12846             return fold_convert (type,
12847                                  fold_build2 (BIT_AND_EXPR,
12848                                               TREE_TYPE (tem), tem,
12849                                               fold_convert (TREE_TYPE (tem),
12850                                                             arg1)));
12851         }
12852
12853       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12854          already handled above.  */
12855       if (TREE_CODE (arg0) == BIT_AND_EXPR
12856           && integer_onep (TREE_OPERAND (arg0, 1))
12857           && integer_zerop (op2)
12858           && integer_pow2p (arg1))
12859         {
12860           tree tem = TREE_OPERAND (arg0, 0);
12861           STRIP_NOPS (tem);
12862           if (TREE_CODE (tem) == RSHIFT_EXPR
12863               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12864               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12865                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12866             return fold_build2 (BIT_AND_EXPR, type,
12867                                 TREE_OPERAND (tem, 0), arg1);
12868         }
12869
12870       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
12871          is probably obsolete because the first operand should be a
12872          truth value (that's why we have the two cases above), but let's
12873          leave it in until we can confirm this for all front-ends.  */
12874       if (integer_zerop (op2)
12875           && TREE_CODE (arg0) == NE_EXPR
12876           && integer_zerop (TREE_OPERAND (arg0, 1))
12877           && integer_pow2p (arg1)
12878           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12879           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12880                               arg1, OEP_ONLY_CONST))
12881         return pedantic_non_lvalue (fold_convert (type,
12882                                                   TREE_OPERAND (arg0, 0)));
12883
12884       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
12885       if (integer_zerop (op2)
12886           && truth_value_p (TREE_CODE (arg0))
12887           && truth_value_p (TREE_CODE (arg1)))
12888         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12889                             fold_convert (type, arg0),
12890                             arg1);
12891
12892       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
12893       if (integer_onep (op2)
12894           && truth_value_p (TREE_CODE (arg0))
12895           && truth_value_p (TREE_CODE (arg1)))
12896         {
12897           /* Only perform transformation if ARG0 is easily inverted.  */
12898           tem = fold_truth_not_expr (arg0);
12899           if (tem)
12900             return fold_build2 (TRUTH_ORIF_EXPR, type,
12901                                 fold_convert (type, tem),
12902                                 arg1);
12903         }
12904
12905       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
12906       if (integer_zerop (arg1)
12907           && truth_value_p (TREE_CODE (arg0))
12908           && truth_value_p (TREE_CODE (op2)))
12909         {
12910           /* Only perform transformation if ARG0 is easily inverted.  */
12911           tem = fold_truth_not_expr (arg0);
12912           if (tem)
12913             return fold_build2 (TRUTH_ANDIF_EXPR, type,
12914                                 fold_convert (type, tem),
12915                                 op2);
12916         }
12917
12918       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
12919       if (integer_onep (arg1)
12920           && truth_value_p (TREE_CODE (arg0))
12921           && truth_value_p (TREE_CODE (op2)))
12922         return fold_build2 (TRUTH_ORIF_EXPR, type,
12923                             fold_convert (type, arg0),
12924                             op2);
12925
12926       return NULL_TREE;
12927
12928     case CALL_EXPR:
12929       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
12930          of fold_ternary on them.  */
12931       gcc_unreachable ();
12932
12933     case BIT_FIELD_REF:
12934       if ((TREE_CODE (arg0) == VECTOR_CST
12935            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12936           && type == TREE_TYPE (TREE_TYPE (arg0)))
12937         {
12938           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12939           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12940
12941           if (width != 0
12942               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12943               && (idx % width) == 0
12944               && (idx = idx / width)
12945                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12946             {
12947               tree elements = NULL_TREE;
12948
12949               if (TREE_CODE (arg0) == VECTOR_CST)
12950                 elements = TREE_VECTOR_CST_ELTS (arg0);
12951               else
12952                 {
12953                   unsigned HOST_WIDE_INT idx;
12954                   tree value;
12955
12956                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
12957                     elements = tree_cons (NULL_TREE, value, elements);
12958                 }
12959               while (idx-- > 0 && elements)
12960                 elements = TREE_CHAIN (elements);
12961               if (elements)
12962                 return TREE_VALUE (elements);
12963               else
12964                 return fold_convert (type, integer_zero_node);
12965             }
12966         }
12967       return NULL_TREE;
12968
12969     default:
12970       return NULL_TREE;
12971     } /* switch (code) */
12972 }
12973
12974 /* Perform constant folding and related simplification of EXPR.
12975    The related simplifications include x*1 => x, x*0 => 0, etc.,
12976    and application of the associative law.
12977    NOP_EXPR conversions may be removed freely (as long as we
12978    are careful not to change the type of the overall expression).
12979    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
12980    but we can constant-fold them if they have constant operands.  */
12981
12982 #ifdef ENABLE_FOLD_CHECKING
12983 # define fold(x) fold_1 (x)
12984 static tree fold_1 (tree);
12985 static
12986 #endif
12987 tree
12988 fold (tree expr)
12989 {
12990   const tree t = expr;
12991   enum tree_code code = TREE_CODE (t);
12992   enum tree_code_class kind = TREE_CODE_CLASS (code);
12993   tree tem;
12994
12995   /* Return right away if a constant.  */
12996   if (kind == tcc_constant)
12997     return t;
12998
12999   /* CALL_EXPR-like objects with variable numbers of operands are
13000      treated specially.  */
13001   if (kind == tcc_vl_exp)
13002     {
13003       if (code == CALL_EXPR)
13004         {
13005           tem = fold_call_expr (expr, false);
13006           return tem ? tem : expr;
13007         }
13008       return expr;
13009     }
13010
13011   if (IS_EXPR_CODE_CLASS (kind)
13012       || IS_GIMPLE_STMT_CODE_CLASS (kind))
13013     {
13014       tree type = TREE_TYPE (t);
13015       tree op0, op1, op2;
13016
13017       switch (TREE_CODE_LENGTH (code))
13018         {
13019         case 1:
13020           op0 = TREE_OPERAND (t, 0);
13021           tem = fold_unary (code, type, op0);
13022           return tem ? tem : expr;
13023         case 2:
13024           op0 = TREE_OPERAND (t, 0);
13025           op1 = TREE_OPERAND (t, 1);
13026           tem = fold_binary (code, type, op0, op1);
13027           return tem ? tem : expr;
13028         case 3:
13029           op0 = TREE_OPERAND (t, 0);
13030           op1 = TREE_OPERAND (t, 1);
13031           op2 = TREE_OPERAND (t, 2);
13032           tem = fold_ternary (code, type, op0, op1, op2);
13033           return tem ? tem : expr;
13034         default:
13035           break;
13036         }
13037     }
13038
13039   switch (code)
13040     {
13041     case CONST_DECL:
13042       return fold (DECL_INITIAL (t));
13043
13044     default:
13045       return t;
13046     } /* switch (code) */
13047 }
13048
13049 #ifdef ENABLE_FOLD_CHECKING
13050 #undef fold
13051
13052 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13053 static void fold_check_failed (const_tree, const_tree);
13054 void print_fold_checksum (const_tree);
13055
13056 /* When --enable-checking=fold, compute a digest of expr before
13057    and after actual fold call to see if fold did not accidentally
13058    change original expr.  */
13059
13060 tree
13061 fold (tree expr)
13062 {
13063   tree ret;
13064   struct md5_ctx ctx;
13065   unsigned char checksum_before[16], checksum_after[16];
13066   htab_t ht;
13067
13068   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13069   md5_init_ctx (&ctx);
13070   fold_checksum_tree (expr, &ctx, ht);
13071   md5_finish_ctx (&ctx, checksum_before);
13072   htab_empty (ht);
13073
13074   ret = fold_1 (expr);
13075
13076   md5_init_ctx (&ctx);
13077   fold_checksum_tree (expr, &ctx, ht);
13078   md5_finish_ctx (&ctx, checksum_after);
13079   htab_delete (ht);
13080
13081   if (memcmp (checksum_before, checksum_after, 16))
13082     fold_check_failed (expr, ret);
13083
13084   return ret;
13085 }
13086
13087 void
13088 print_fold_checksum (const_tree expr)
13089 {
13090   struct md5_ctx ctx;
13091   unsigned char checksum[16], cnt;
13092   htab_t ht;
13093
13094   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13095   md5_init_ctx (&ctx);
13096   fold_checksum_tree (expr, &ctx, ht);
13097   md5_finish_ctx (&ctx, checksum);
13098   htab_delete (ht);
13099   for (cnt = 0; cnt < 16; ++cnt)
13100     fprintf (stderr, "%02x", checksum[cnt]);
13101   putc ('\n', stderr);
13102 }
13103
13104 static void
13105 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13106 {
13107   internal_error ("fold check: original tree changed by fold");
13108 }
13109
13110 static void
13111 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13112 {
13113   const void **slot;
13114   enum tree_code code;
13115   struct tree_function_decl buf;
13116   int i, len;
13117   
13118 recursive_label:
13119
13120   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13121                <= sizeof (struct tree_function_decl))
13122               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13123   if (expr == NULL)
13124     return;
13125   slot = (const void **) htab_find_slot (ht, expr, INSERT);
13126   if (*slot != NULL)
13127     return;
13128   *slot = expr;
13129   code = TREE_CODE (expr);
13130   if (TREE_CODE_CLASS (code) == tcc_declaration
13131       && DECL_ASSEMBLER_NAME_SET_P (expr))
13132     {
13133       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
13134       memcpy ((char *) &buf, expr, tree_size (expr));
13135       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13136       expr = (tree) &buf;
13137     }
13138   else if (TREE_CODE_CLASS (code) == tcc_type
13139            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
13140                || TYPE_CACHED_VALUES_P (expr)
13141                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
13142     {
13143       /* Allow these fields to be modified.  */
13144       tree tmp;
13145       memcpy ((char *) &buf, expr, tree_size (expr));
13146       expr = tmp = (tree) &buf;
13147       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13148       TYPE_POINTER_TO (tmp) = NULL;
13149       TYPE_REFERENCE_TO (tmp) = NULL;
13150       if (TYPE_CACHED_VALUES_P (tmp))
13151         {
13152           TYPE_CACHED_VALUES_P (tmp) = 0;
13153           TYPE_CACHED_VALUES (tmp) = NULL;
13154         }
13155     }
13156   md5_process_bytes (expr, tree_size (expr), ctx);
13157   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13158   if (TREE_CODE_CLASS (code) != tcc_type
13159       && TREE_CODE_CLASS (code) != tcc_declaration
13160       && code != TREE_LIST
13161       && code != SSA_NAME)
13162     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13163   switch (TREE_CODE_CLASS (code))
13164     {
13165     case tcc_constant:
13166       switch (code)
13167         {
13168         case STRING_CST:
13169           md5_process_bytes (TREE_STRING_POINTER (expr),
13170                              TREE_STRING_LENGTH (expr), ctx);
13171           break;
13172         case COMPLEX_CST:
13173           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13174           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13175           break;
13176         case VECTOR_CST:
13177           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13178           break;
13179         default:
13180           break;
13181         }
13182       break;
13183     case tcc_exceptional:
13184       switch (code)
13185         {
13186         case TREE_LIST:
13187           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13188           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13189           expr = TREE_CHAIN (expr);
13190           goto recursive_label;
13191           break;
13192         case TREE_VEC:
13193           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13194             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13195           break;
13196         default:
13197           break;
13198         }
13199       break;
13200     case tcc_expression:
13201     case tcc_reference:
13202     case tcc_comparison:
13203     case tcc_unary:
13204     case tcc_binary:
13205     case tcc_statement:
13206     case tcc_vl_exp:
13207       len = TREE_OPERAND_LENGTH (expr);
13208       for (i = 0; i < len; ++i)
13209         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13210       break;
13211     case tcc_declaration:
13212       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13213       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13214       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13215         {
13216           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13217           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13218           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13219           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13220           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13221         }
13222       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13223         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13224           
13225       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13226         {
13227           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13228           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13229           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13230         }
13231       break;
13232     case tcc_type:
13233       if (TREE_CODE (expr) == ENUMERAL_TYPE)
13234         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13235       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13236       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13237       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13238       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13239       if (INTEGRAL_TYPE_P (expr)
13240           || SCALAR_FLOAT_TYPE_P (expr))
13241         {
13242           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13243           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13244         }
13245       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13246       if (TREE_CODE (expr) == RECORD_TYPE
13247           || TREE_CODE (expr) == UNION_TYPE
13248           || TREE_CODE (expr) == QUAL_UNION_TYPE)
13249         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13250       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13251       break;
13252     default:
13253       break;
13254     }
13255 }
13256
13257 /* Helper function for outputting the checksum of a tree T.  When
13258    debugging with gdb, you can "define mynext" to be "next" followed
13259    by "call debug_fold_checksum (op0)", then just trace down till the
13260    outputs differ.  */
13261
13262 void
13263 debug_fold_checksum (const_tree t)
13264 {
13265   int i;
13266   unsigned char checksum[16];
13267   struct md5_ctx ctx;
13268   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13269   
13270   md5_init_ctx (&ctx);
13271   fold_checksum_tree (t, &ctx, ht);
13272   md5_finish_ctx (&ctx, checksum);
13273   htab_empty (ht);
13274
13275   for (i = 0; i < 16; i++)
13276     fprintf (stderr, "%d ", checksum[i]);
13277
13278   fprintf (stderr, "\n");
13279 }
13280
13281 #endif
13282
13283 /* Fold a unary tree expression with code CODE of type TYPE with an
13284    operand OP0.  Return a folded expression if successful.  Otherwise,
13285    return a tree expression with code CODE of type TYPE with an
13286    operand OP0.  */
13287
13288 tree
13289 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13290 {
13291   tree tem;
13292 #ifdef ENABLE_FOLD_CHECKING
13293   unsigned char checksum_before[16], checksum_after[16];
13294   struct md5_ctx ctx;
13295   htab_t ht;
13296
13297   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13298   md5_init_ctx (&ctx);
13299   fold_checksum_tree (op0, &ctx, ht);
13300   md5_finish_ctx (&ctx, checksum_before);
13301   htab_empty (ht);
13302 #endif
13303   
13304   tem = fold_unary (code, type, op0);
13305   if (!tem)
13306     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13307   
13308 #ifdef ENABLE_FOLD_CHECKING
13309   md5_init_ctx (&ctx);
13310   fold_checksum_tree (op0, &ctx, ht);
13311   md5_finish_ctx (&ctx, checksum_after);
13312   htab_delete (ht);
13313
13314   if (memcmp (checksum_before, checksum_after, 16))
13315     fold_check_failed (op0, tem);
13316 #endif
13317   return tem;
13318 }
13319
13320 /* Fold a binary tree expression with code CODE of type TYPE with
13321    operands OP0 and OP1.  Return a folded expression if successful.
13322    Otherwise, return a tree expression with code CODE of type TYPE
13323    with operands OP0 and OP1.  */
13324
13325 tree
13326 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13327                   MEM_STAT_DECL)
13328 {
13329   tree tem;
13330 #ifdef ENABLE_FOLD_CHECKING
13331   unsigned char checksum_before_op0[16],
13332                 checksum_before_op1[16],
13333                 checksum_after_op0[16],
13334                 checksum_after_op1[16];
13335   struct md5_ctx ctx;
13336   htab_t ht;
13337
13338   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13339   md5_init_ctx (&ctx);
13340   fold_checksum_tree (op0, &ctx, ht);
13341   md5_finish_ctx (&ctx, checksum_before_op0);
13342   htab_empty (ht);
13343
13344   md5_init_ctx (&ctx);
13345   fold_checksum_tree (op1, &ctx, ht);
13346   md5_finish_ctx (&ctx, checksum_before_op1);
13347   htab_empty (ht);
13348 #endif
13349
13350   tem = fold_binary (code, type, op0, op1);
13351   if (!tem)
13352     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13353   
13354 #ifdef ENABLE_FOLD_CHECKING
13355   md5_init_ctx (&ctx);
13356   fold_checksum_tree (op0, &ctx, ht);
13357   md5_finish_ctx (&ctx, checksum_after_op0);
13358   htab_empty (ht);
13359
13360   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13361     fold_check_failed (op0, tem);
13362   
13363   md5_init_ctx (&ctx);
13364   fold_checksum_tree (op1, &ctx, ht);
13365   md5_finish_ctx (&ctx, checksum_after_op1);
13366   htab_delete (ht);
13367
13368   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13369     fold_check_failed (op1, tem);
13370 #endif
13371   return tem;
13372 }
13373
13374 /* Fold a ternary tree expression with code CODE of type TYPE with
13375    operands OP0, OP1, and OP2.  Return a folded expression if
13376    successful.  Otherwise, return a tree expression with code CODE of
13377    type TYPE with operands OP0, OP1, and OP2.  */
13378
13379 tree
13380 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
13381              MEM_STAT_DECL)
13382 {
13383   tree tem;
13384 #ifdef ENABLE_FOLD_CHECKING
13385   unsigned char checksum_before_op0[16],
13386                 checksum_before_op1[16],
13387                 checksum_before_op2[16],
13388                 checksum_after_op0[16],
13389                 checksum_after_op1[16],
13390                 checksum_after_op2[16];
13391   struct md5_ctx ctx;
13392   htab_t ht;
13393
13394   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13395   md5_init_ctx (&ctx);
13396   fold_checksum_tree (op0, &ctx, ht);
13397   md5_finish_ctx (&ctx, checksum_before_op0);
13398   htab_empty (ht);
13399
13400   md5_init_ctx (&ctx);
13401   fold_checksum_tree (op1, &ctx, ht);
13402   md5_finish_ctx (&ctx, checksum_before_op1);
13403   htab_empty (ht);
13404
13405   md5_init_ctx (&ctx);
13406   fold_checksum_tree (op2, &ctx, ht);
13407   md5_finish_ctx (&ctx, checksum_before_op2);
13408   htab_empty (ht);
13409 #endif
13410
13411   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
13412   tem = fold_ternary (code, type, op0, op1, op2);
13413   if (!tem)
13414     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
13415       
13416 #ifdef ENABLE_FOLD_CHECKING
13417   md5_init_ctx (&ctx);
13418   fold_checksum_tree (op0, &ctx, ht);
13419   md5_finish_ctx (&ctx, checksum_after_op0);
13420   htab_empty (ht);
13421
13422   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13423     fold_check_failed (op0, tem);
13424   
13425   md5_init_ctx (&ctx);
13426   fold_checksum_tree (op1, &ctx, ht);
13427   md5_finish_ctx (&ctx, checksum_after_op1);
13428   htab_empty (ht);
13429
13430   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13431     fold_check_failed (op1, tem);
13432   
13433   md5_init_ctx (&ctx);
13434   fold_checksum_tree (op2, &ctx, ht);
13435   md5_finish_ctx (&ctx, checksum_after_op2);
13436   htab_delete (ht);
13437
13438   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
13439     fold_check_failed (op2, tem);
13440 #endif
13441   return tem;
13442 }
13443
13444 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
13445    arguments in ARGARRAY, and a null static chain.
13446    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
13447    of type TYPE from the given operands as constructed by build_call_array.  */
13448
13449 tree
13450 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
13451 {
13452   tree tem;
13453 #ifdef ENABLE_FOLD_CHECKING
13454   unsigned char checksum_before_fn[16],
13455                 checksum_before_arglist[16],
13456                 checksum_after_fn[16],
13457                 checksum_after_arglist[16];
13458   struct md5_ctx ctx;
13459   htab_t ht;
13460   int i;
13461
13462   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13463   md5_init_ctx (&ctx);
13464   fold_checksum_tree (fn, &ctx, ht);
13465   md5_finish_ctx (&ctx, checksum_before_fn);
13466   htab_empty (ht);
13467
13468   md5_init_ctx (&ctx);
13469   for (i = 0; i < nargs; i++)
13470     fold_checksum_tree (argarray[i], &ctx, ht);
13471   md5_finish_ctx (&ctx, checksum_before_arglist);
13472   htab_empty (ht);
13473 #endif
13474
13475   tem = fold_builtin_call_array (type, fn, nargs, argarray);
13476       
13477 #ifdef ENABLE_FOLD_CHECKING
13478   md5_init_ctx (&ctx);
13479   fold_checksum_tree (fn, &ctx, ht);
13480   md5_finish_ctx (&ctx, checksum_after_fn);
13481   htab_empty (ht);
13482
13483   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13484     fold_check_failed (fn, tem);
13485   
13486   md5_init_ctx (&ctx);
13487   for (i = 0; i < nargs; i++)
13488     fold_checksum_tree (argarray[i], &ctx, ht);
13489   md5_finish_ctx (&ctx, checksum_after_arglist);
13490   htab_delete (ht);
13491
13492   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13493     fold_check_failed (NULL_TREE, tem);
13494 #endif
13495   return tem;
13496 }
13497
13498 /* Perform constant folding and related simplification of initializer
13499    expression EXPR.  These behave identically to "fold_buildN" but ignore
13500    potential run-time traps and exceptions that fold must preserve.  */
13501
13502 #define START_FOLD_INIT \
13503   int saved_signaling_nans = flag_signaling_nans;\
13504   int saved_trapping_math = flag_trapping_math;\
13505   int saved_rounding_math = flag_rounding_math;\
13506   int saved_trapv = flag_trapv;\
13507   int saved_folding_initializer = folding_initializer;\
13508   flag_signaling_nans = 0;\
13509   flag_trapping_math = 0;\
13510   flag_rounding_math = 0;\
13511   flag_trapv = 0;\
13512   folding_initializer = 1;
13513
13514 #define END_FOLD_INIT \
13515   flag_signaling_nans = saved_signaling_nans;\
13516   flag_trapping_math = saved_trapping_math;\
13517   flag_rounding_math = saved_rounding_math;\
13518   flag_trapv = saved_trapv;\
13519   folding_initializer = saved_folding_initializer;
13520
13521 tree
13522 fold_build1_initializer (enum tree_code code, tree type, tree op)
13523 {
13524   tree result;
13525   START_FOLD_INIT;
13526
13527   result = fold_build1 (code, type, op);
13528
13529   END_FOLD_INIT;
13530   return result;
13531 }
13532
13533 tree
13534 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13535 {
13536   tree result;
13537   START_FOLD_INIT;
13538
13539   result = fold_build2 (code, type, op0, op1);
13540
13541   END_FOLD_INIT;
13542   return result;
13543 }
13544
13545 tree
13546 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13547                          tree op2)
13548 {
13549   tree result;
13550   START_FOLD_INIT;
13551
13552   result = fold_build3 (code, type, op0, op1, op2);
13553
13554   END_FOLD_INIT;
13555   return result;
13556 }
13557
13558 tree
13559 fold_build_call_array_initializer (tree type, tree fn,
13560                                    int nargs, tree *argarray)
13561 {
13562   tree result;
13563   START_FOLD_INIT;
13564
13565   result = fold_build_call_array (type, fn, nargs, argarray);
13566
13567   END_FOLD_INIT;
13568   return result;
13569 }
13570
13571 #undef START_FOLD_INIT
13572 #undef END_FOLD_INIT
13573
13574 /* Determine if first argument is a multiple of second argument.  Return 0 if
13575    it is not, or we cannot easily determined it to be.
13576
13577    An example of the sort of thing we care about (at this point; this routine
13578    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13579    fold cases do now) is discovering that
13580
13581      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13582
13583    is a multiple of
13584
13585      SAVE_EXPR (J * 8)
13586
13587    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13588
13589    This code also handles discovering that
13590
13591      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13592
13593    is a multiple of 8 so we don't have to worry about dealing with a
13594    possible remainder.
13595
13596    Note that we *look* inside a SAVE_EXPR only to determine how it was
13597    calculated; it is not safe for fold to do much of anything else with the
13598    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13599    at run time.  For example, the latter example above *cannot* be implemented
13600    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13601    evaluation time of the original SAVE_EXPR is not necessarily the same at
13602    the time the new expression is evaluated.  The only optimization of this
13603    sort that would be valid is changing
13604
13605      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13606
13607    divided by 8 to
13608
13609      SAVE_EXPR (I) * SAVE_EXPR (J)
13610
13611    (where the same SAVE_EXPR (J) is used in the original and the
13612    transformed version).  */
13613
13614 int
13615 multiple_of_p (tree type, const_tree top, const_tree bottom)
13616 {
13617   if (operand_equal_p (top, bottom, 0))
13618     return 1;
13619
13620   if (TREE_CODE (type) != INTEGER_TYPE)
13621     return 0;
13622
13623   switch (TREE_CODE (top))
13624     {
13625     case BIT_AND_EXPR:
13626       /* Bitwise and provides a power of two multiple.  If the mask is
13627          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13628       if (!integer_pow2p (bottom))
13629         return 0;
13630       /* FALLTHRU */
13631
13632     case MULT_EXPR:
13633       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13634               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13635
13636     case PLUS_EXPR:
13637     case MINUS_EXPR:
13638       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13639               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13640
13641     case LSHIFT_EXPR:
13642       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13643         {
13644           tree op1, t1;
13645
13646           op1 = TREE_OPERAND (top, 1);
13647           /* const_binop may not detect overflow correctly,
13648              so check for it explicitly here.  */
13649           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13650               > TREE_INT_CST_LOW (op1)
13651               && TREE_INT_CST_HIGH (op1) == 0
13652               && 0 != (t1 = fold_convert (type,
13653                                           const_binop (LSHIFT_EXPR,
13654                                                        size_one_node,
13655                                                        op1, 0)))
13656               && !TREE_OVERFLOW (t1))
13657             return multiple_of_p (type, t1, bottom);
13658         }
13659       return 0;
13660
13661     case NOP_EXPR:
13662       /* Can't handle conversions from non-integral or wider integral type.  */
13663       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13664           || (TYPE_PRECISION (type)
13665               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13666         return 0;
13667
13668       /* .. fall through ...  */
13669
13670     case SAVE_EXPR:
13671       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13672
13673     case INTEGER_CST:
13674       if (TREE_CODE (bottom) != INTEGER_CST
13675           || integer_zerop (bottom)
13676           || (TYPE_UNSIGNED (type)
13677               && (tree_int_cst_sgn (top) < 0
13678                   || tree_int_cst_sgn (bottom) < 0)))
13679         return 0;
13680       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13681                                              top, bottom, 0));
13682
13683     default:
13684       return 0;
13685     }
13686 }
13687
13688 /* Return true if CODE or TYPE is known to be non-negative. */
13689
13690 static bool
13691 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
13692 {
13693   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13694       && truth_value_p (code))
13695     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13696        have a signed:1 type (where the value is -1 and 0).  */
13697     return true;
13698   return false;
13699 }
13700
13701 /* Return true if (CODE OP0) is known to be non-negative.  If the return
13702    value is based on the assumption that signed overflow is undefined,
13703    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13704    *STRICT_OVERFLOW_P.  */
13705
13706 static bool
13707 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13708                                 bool *strict_overflow_p)
13709 {
13710   if (TYPE_UNSIGNED (type))
13711     return true;
13712
13713   switch (code)
13714     {
13715     case ABS_EXPR:
13716       /* We can't return 1 if flag_wrapv is set because
13717          ABS_EXPR<INT_MIN> = INT_MIN.  */
13718       if (!INTEGRAL_TYPE_P (type))
13719         return true;
13720       if (TYPE_OVERFLOW_UNDEFINED (type))
13721         {
13722           *strict_overflow_p = true;
13723           return true;
13724         }
13725       break;
13726
13727     case NON_LVALUE_EXPR:
13728     case FLOAT_EXPR:
13729     case FIX_TRUNC_EXPR:
13730       return tree_expr_nonnegative_warnv_p (op0,
13731                                             strict_overflow_p);
13732
13733     case NOP_EXPR:
13734       {
13735         tree inner_type = TREE_TYPE (op0);
13736         tree outer_type = type;
13737
13738         if (TREE_CODE (outer_type) == REAL_TYPE)
13739           {
13740             if (TREE_CODE (inner_type) == REAL_TYPE)
13741               return tree_expr_nonnegative_warnv_p (op0,
13742                                                     strict_overflow_p);
13743             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13744               {
13745                 if (TYPE_UNSIGNED (inner_type))
13746                   return true;
13747                 return tree_expr_nonnegative_warnv_p (op0,
13748                                                       strict_overflow_p);
13749               }
13750           }
13751         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13752           {
13753             if (TREE_CODE (inner_type) == REAL_TYPE)
13754               return tree_expr_nonnegative_warnv_p (op0,
13755                                                     strict_overflow_p);
13756             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13757               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13758                       && TYPE_UNSIGNED (inner_type);
13759           }
13760       }
13761       break;
13762
13763     default:
13764       return tree_simple_nonnegative_warnv_p (code, type);
13765     }
13766
13767   /* We don't know sign of `t', so be conservative and return false.  */
13768   return false;
13769 }
13770
13771 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
13772    value is based on the assumption that signed overflow is undefined,
13773    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13774    *STRICT_OVERFLOW_P.  */
13775
13776 static bool
13777 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13778                                       tree op1, bool *strict_overflow_p)
13779 {
13780   if (TYPE_UNSIGNED (type))
13781     return true;
13782
13783   switch (code)
13784     {
13785     case POINTER_PLUS_EXPR:
13786     case PLUS_EXPR:
13787       if (FLOAT_TYPE_P (type))
13788         return (tree_expr_nonnegative_warnv_p (op0,
13789                                                strict_overflow_p)
13790                 && tree_expr_nonnegative_warnv_p (op1,
13791                                                   strict_overflow_p));
13792
13793       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13794          both unsigned and at least 2 bits shorter than the result.  */
13795       if (TREE_CODE (type) == INTEGER_TYPE
13796           && TREE_CODE (op0) == NOP_EXPR
13797           && TREE_CODE (op1) == NOP_EXPR)
13798         {
13799           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13800           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13801           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13802               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13803             {
13804               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13805                                        TYPE_PRECISION (inner2)) + 1;
13806               return prec < TYPE_PRECISION (type);
13807             }
13808         }
13809       break;
13810
13811     case MULT_EXPR:
13812       if (FLOAT_TYPE_P (type))
13813         {
13814           /* x * x for floating point x is always non-negative.  */
13815           if (operand_equal_p (op0, op1, 0))
13816             return true;
13817           return (tree_expr_nonnegative_warnv_p (op0,
13818                                                  strict_overflow_p)
13819                   && tree_expr_nonnegative_warnv_p (op1,
13820                                                     strict_overflow_p));
13821         }
13822
13823       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13824          both unsigned and their total bits is shorter than the result.  */
13825       if (TREE_CODE (type) == INTEGER_TYPE
13826           && TREE_CODE (op0) == NOP_EXPR
13827           && TREE_CODE (op1) == NOP_EXPR)
13828         {
13829           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13830           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13831           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13832               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13833             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13834                    < TYPE_PRECISION (type);
13835         }
13836       return false;
13837
13838     case BIT_AND_EXPR:
13839     case MAX_EXPR:
13840       return (tree_expr_nonnegative_warnv_p (op0,
13841                                              strict_overflow_p)
13842               || tree_expr_nonnegative_warnv_p (op1,
13843                                                 strict_overflow_p));
13844
13845     case BIT_IOR_EXPR:
13846     case BIT_XOR_EXPR:
13847     case MIN_EXPR:
13848     case RDIV_EXPR:
13849     case TRUNC_DIV_EXPR:
13850     case CEIL_DIV_EXPR:
13851     case FLOOR_DIV_EXPR:
13852     case ROUND_DIV_EXPR:
13853       return (tree_expr_nonnegative_warnv_p (op0,
13854                                              strict_overflow_p)
13855               && tree_expr_nonnegative_warnv_p (op1,
13856                                                 strict_overflow_p));
13857
13858     case TRUNC_MOD_EXPR:
13859     case CEIL_MOD_EXPR:
13860     case FLOOR_MOD_EXPR:
13861     case ROUND_MOD_EXPR:
13862       return tree_expr_nonnegative_warnv_p (op0,
13863                                             strict_overflow_p);
13864     default:
13865       return tree_simple_nonnegative_warnv_p (code, type);
13866     }
13867
13868   /* We don't know sign of `t', so be conservative and return false.  */
13869   return false;
13870 }
13871
13872 /* Return true if T is known to be non-negative.  If the return
13873    value is based on the assumption that signed overflow is undefined,
13874    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13875    *STRICT_OVERFLOW_P.  */
13876
13877 static bool
13878 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13879 {
13880   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13881     return true;
13882
13883   switch (TREE_CODE (t))
13884     {
13885     case SSA_NAME:
13886       /* Query VRP to see if it has recorded any information about
13887          the range of this object.  */
13888       return ssa_name_nonnegative_p (t);
13889
13890     case INTEGER_CST:
13891       return tree_int_cst_sgn (t) >= 0;
13892
13893     case REAL_CST:
13894       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13895
13896     case FIXED_CST:
13897       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
13898
13899     case COND_EXPR:
13900       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13901                                              strict_overflow_p)
13902               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13903                                                 strict_overflow_p));
13904     default:
13905       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
13906                                                    TREE_TYPE (t));
13907     }
13908   /* We don't know sign of `t', so be conservative and return false.  */
13909   return false;
13910 }
13911
13912 /* Return true if T is known to be non-negative.  If the return
13913    value is based on the assumption that signed overflow is undefined,
13914    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13915    *STRICT_OVERFLOW_P.  */
13916
13917 static bool
13918 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13919 {
13920   enum tree_code code = TREE_CODE (t);
13921   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13922     return true;
13923
13924   switch (code)
13925     {
13926     case TARGET_EXPR:
13927       {
13928         tree temp = TARGET_EXPR_SLOT (t);
13929         t = TARGET_EXPR_INITIAL (t);
13930
13931         /* If the initializer is non-void, then it's a normal expression
13932            that will be assigned to the slot.  */
13933         if (!VOID_TYPE_P (t))
13934           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
13935
13936         /* Otherwise, the initializer sets the slot in some way.  One common
13937            way is an assignment statement at the end of the initializer.  */
13938         while (1)
13939           {
13940             if (TREE_CODE (t) == BIND_EXPR)
13941               t = expr_last (BIND_EXPR_BODY (t));
13942             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
13943                      || TREE_CODE (t) == TRY_CATCH_EXPR)
13944               t = expr_last (TREE_OPERAND (t, 0));
13945             else if (TREE_CODE (t) == STATEMENT_LIST)
13946               t = expr_last (t);
13947             else
13948               break;
13949           }
13950         if ((TREE_CODE (t) == MODIFY_EXPR
13951              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
13952             && GENERIC_TREE_OPERAND (t, 0) == temp)
13953           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13954                                                 strict_overflow_p);
13955
13956         return false;
13957       }
13958
13959     case CALL_EXPR:
13960       {
13961         tree fndecl = get_callee_fndecl (t);
13962         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
13963           switch (DECL_FUNCTION_CODE (fndecl))
13964             {
13965             CASE_FLT_FN (BUILT_IN_ACOS):
13966             CASE_FLT_FN (BUILT_IN_ACOSH):
13967             CASE_FLT_FN (BUILT_IN_CABS):
13968             CASE_FLT_FN (BUILT_IN_COSH):
13969             CASE_FLT_FN (BUILT_IN_ERFC):
13970             CASE_FLT_FN (BUILT_IN_EXP):
13971             CASE_FLT_FN (BUILT_IN_EXP10):
13972             CASE_FLT_FN (BUILT_IN_EXP2):
13973             CASE_FLT_FN (BUILT_IN_FABS):
13974             CASE_FLT_FN (BUILT_IN_FDIM):
13975             CASE_FLT_FN (BUILT_IN_HYPOT):
13976             CASE_FLT_FN (BUILT_IN_POW10):
13977             CASE_INT_FN (BUILT_IN_FFS):
13978             CASE_INT_FN (BUILT_IN_PARITY):
13979             CASE_INT_FN (BUILT_IN_POPCOUNT):
13980             case BUILT_IN_BSWAP32:
13981             case BUILT_IN_BSWAP64:
13982               /* Always true.  */
13983               return true;
13984
13985             CASE_FLT_FN (BUILT_IN_SQRT):
13986               /* sqrt(-0.0) is -0.0.  */
13987               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
13988                 return true;
13989               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13990                                                     strict_overflow_p);
13991
13992             CASE_FLT_FN (BUILT_IN_ASINH):
13993             CASE_FLT_FN (BUILT_IN_ATAN):
13994             CASE_FLT_FN (BUILT_IN_ATANH):
13995             CASE_FLT_FN (BUILT_IN_CBRT):
13996             CASE_FLT_FN (BUILT_IN_CEIL):
13997             CASE_FLT_FN (BUILT_IN_ERF):
13998             CASE_FLT_FN (BUILT_IN_EXPM1):
13999             CASE_FLT_FN (BUILT_IN_FLOOR):
14000             CASE_FLT_FN (BUILT_IN_FMOD):
14001             CASE_FLT_FN (BUILT_IN_FREXP):
14002             CASE_FLT_FN (BUILT_IN_LCEIL):
14003             CASE_FLT_FN (BUILT_IN_LDEXP):
14004             CASE_FLT_FN (BUILT_IN_LFLOOR):
14005             CASE_FLT_FN (BUILT_IN_LLCEIL):
14006             CASE_FLT_FN (BUILT_IN_LLFLOOR):
14007             CASE_FLT_FN (BUILT_IN_LLRINT):
14008             CASE_FLT_FN (BUILT_IN_LLROUND):
14009             CASE_FLT_FN (BUILT_IN_LRINT):
14010             CASE_FLT_FN (BUILT_IN_LROUND):
14011             CASE_FLT_FN (BUILT_IN_MODF):
14012             CASE_FLT_FN (BUILT_IN_NEARBYINT):
14013             CASE_FLT_FN (BUILT_IN_RINT):
14014             CASE_FLT_FN (BUILT_IN_ROUND):
14015             CASE_FLT_FN (BUILT_IN_SCALB):
14016             CASE_FLT_FN (BUILT_IN_SCALBLN):
14017             CASE_FLT_FN (BUILT_IN_SCALBN):
14018             CASE_FLT_FN (BUILT_IN_SIGNBIT):
14019             CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14020             CASE_FLT_FN (BUILT_IN_SINH):
14021             CASE_FLT_FN (BUILT_IN_TANH):
14022             CASE_FLT_FN (BUILT_IN_TRUNC):
14023               /* True if the 1st argument is nonnegative.  */
14024               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14025                                                     strict_overflow_p);
14026
14027             CASE_FLT_FN (BUILT_IN_FMAX):
14028               /* True if the 1st OR 2nd arguments are nonnegative.  */
14029               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14030                                                      strict_overflow_p)
14031                       || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14032                                                          strict_overflow_p)));
14033
14034             CASE_FLT_FN (BUILT_IN_FMIN):
14035               /* True if the 1st AND 2nd arguments are nonnegative.  */
14036               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14037                                                      strict_overflow_p)
14038                       && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14039                                                          strict_overflow_p)));
14040
14041             CASE_FLT_FN (BUILT_IN_COPYSIGN):
14042               /* True if the 2nd argument is nonnegative.  */
14043               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14044                                                     strict_overflow_p);
14045
14046             CASE_FLT_FN (BUILT_IN_POWI):
14047               /* True if the 1st argument is nonnegative or the second
14048                  argument is an even integer.  */
14049               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
14050                 {
14051                   tree arg1 = CALL_EXPR_ARG (t, 1);
14052                   if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
14053                     return true;
14054                 }
14055               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14056                                                     strict_overflow_p);
14057
14058             CASE_FLT_FN (BUILT_IN_POW):
14059               /* True if the 1st argument is nonnegative or the second
14060                  argument is an even integer valued real.  */
14061               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
14062                 {
14063                   REAL_VALUE_TYPE c;
14064                   HOST_WIDE_INT n;
14065
14066                   c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
14067                   n = real_to_integer (&c);
14068                   if ((n & 1) == 0)
14069                     {
14070                       REAL_VALUE_TYPE cint;
14071                       real_from_integer (&cint, VOIDmode, n,
14072                                          n < 0 ? -1 : 0, 0);
14073                       if (real_identical (&c, &cint))
14074                         return true;
14075                     }
14076                 }
14077               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14078                                                     strict_overflow_p);
14079
14080             default:
14081               break;
14082             }
14083         return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14084                                                      TREE_TYPE (t));
14085       }
14086       break;
14087
14088     case COMPOUND_EXPR:
14089     case MODIFY_EXPR:
14090     case GIMPLE_MODIFY_STMT:
14091       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14092                                             strict_overflow_p);
14093     case BIND_EXPR:
14094       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14095                                             strict_overflow_p);
14096     case SAVE_EXPR:
14097       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14098                                             strict_overflow_p);
14099
14100     default:
14101       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14102                                                    TREE_TYPE (t));
14103     }
14104
14105   /* We don't know sign of `t', so be conservative and return false.  */
14106   return false;
14107 }
14108
14109 /* Return true if T is known to be non-negative.  If the return
14110    value is based on the assumption that signed overflow is undefined,
14111    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14112    *STRICT_OVERFLOW_P.  */
14113
14114 bool
14115 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14116 {
14117   enum tree_code code;
14118   if (t == error_mark_node)
14119     return false;
14120
14121   code = TREE_CODE (t);
14122   switch (TREE_CODE_CLASS (code))
14123     {
14124     case tcc_binary:
14125     case tcc_comparison:
14126       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14127                                               TREE_TYPE (t),
14128                                               TREE_OPERAND (t, 0),
14129                                               TREE_OPERAND (t, 1),
14130                                               strict_overflow_p);
14131
14132     case tcc_unary:
14133       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14134                                              TREE_TYPE (t),
14135                                              TREE_OPERAND (t, 0),
14136                                              strict_overflow_p);
14137
14138     case tcc_constant:
14139     case tcc_declaration:
14140     case tcc_reference:
14141       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14142
14143     default:
14144       break;
14145     }
14146
14147   switch (code)
14148     {
14149     case TRUTH_AND_EXPR:
14150     case TRUTH_OR_EXPR:
14151     case TRUTH_XOR_EXPR:
14152       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14153                                               TREE_TYPE (t),
14154                                               TREE_OPERAND (t, 0),
14155                                               TREE_OPERAND (t, 1),
14156                                               strict_overflow_p);
14157     case TRUTH_NOT_EXPR:
14158       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14159                                              TREE_TYPE (t),
14160                                              TREE_OPERAND (t, 0),
14161                                              strict_overflow_p);
14162
14163     case COND_EXPR:
14164     case CONSTRUCTOR:
14165     case OBJ_TYPE_REF:
14166     case ASSERT_EXPR:
14167     case ADDR_EXPR:
14168     case WITH_SIZE_EXPR:
14169     case EXC_PTR_EXPR:
14170     case SSA_NAME:
14171     case FILTER_EXPR:
14172       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14173
14174     default:
14175       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14176     }
14177 }
14178
14179 /* Return true if `t' is known to be non-negative.  Handle warnings
14180    about undefined signed overflow.  */
14181
14182 bool
14183 tree_expr_nonnegative_p (tree t)
14184 {
14185   bool ret, strict_overflow_p;
14186
14187   strict_overflow_p = false;
14188   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14189   if (strict_overflow_p)
14190     fold_overflow_warning (("assuming signed overflow does not occur when "
14191                             "determining that expression is always "
14192                             "non-negative"),
14193                            WARN_STRICT_OVERFLOW_MISC);
14194   return ret;
14195 }
14196
14197
14198 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14199    For floating point we further ensure that T is not denormal.
14200    Similar logic is present in nonzero_address in rtlanal.h.
14201
14202    If the return value is based on the assumption that signed overflow
14203    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14204    change *STRICT_OVERFLOW_P.  */
14205
14206 static bool
14207 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14208                                  bool *strict_overflow_p)
14209 {
14210   switch (code)
14211     {
14212     case ABS_EXPR:
14213       return tree_expr_nonzero_warnv_p (op0,
14214                                         strict_overflow_p);
14215
14216     case NOP_EXPR:
14217       {
14218         tree inner_type = TREE_TYPE (op0);
14219         tree outer_type = type;
14220
14221         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14222                 && tree_expr_nonzero_warnv_p (op0,
14223                                               strict_overflow_p));
14224       }
14225       break;
14226
14227     case NON_LVALUE_EXPR:
14228       return tree_expr_nonzero_warnv_p (op0,
14229                                         strict_overflow_p);
14230
14231     default:
14232       break;
14233   }
14234
14235   return false;
14236 }
14237
14238 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14239    For floating point we further ensure that T is not denormal.
14240    Similar logic is present in nonzero_address in rtlanal.h.
14241
14242    If the return value is based on the assumption that signed overflow
14243    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14244    change *STRICT_OVERFLOW_P.  */
14245
14246 static bool
14247 tree_binary_nonzero_warnv_p (enum tree_code code,
14248                              tree type,
14249                              tree op0,
14250                              tree op1, bool *strict_overflow_p)
14251 {
14252   bool sub_strict_overflow_p;
14253   switch (code)
14254     {
14255     case POINTER_PLUS_EXPR:
14256     case PLUS_EXPR:
14257       if (TYPE_OVERFLOW_UNDEFINED (type))
14258         {
14259           /* With the presence of negative values it is hard
14260              to say something.  */
14261           sub_strict_overflow_p = false;
14262           if (!tree_expr_nonnegative_warnv_p (op0,
14263                                               &sub_strict_overflow_p)
14264               || !tree_expr_nonnegative_warnv_p (op1,
14265                                                  &sub_strict_overflow_p))
14266             return false;
14267           /* One of operands must be positive and the other non-negative.  */
14268           /* We don't set *STRICT_OVERFLOW_P here: even if this value
14269              overflows, on a twos-complement machine the sum of two
14270              nonnegative numbers can never be zero.  */
14271           return (tree_expr_nonzero_warnv_p (op0,
14272                                              strict_overflow_p)
14273                   || tree_expr_nonzero_warnv_p (op1,
14274                                                 strict_overflow_p));
14275         }
14276       break;
14277
14278     case MULT_EXPR:
14279       if (TYPE_OVERFLOW_UNDEFINED (type))
14280         {
14281           if (tree_expr_nonzero_warnv_p (op0,
14282                                          strict_overflow_p)
14283               && tree_expr_nonzero_warnv_p (op1,
14284                                             strict_overflow_p))
14285             {
14286               *strict_overflow_p = true;
14287               return true;
14288             }
14289         }
14290       break;
14291
14292     case MIN_EXPR:
14293       sub_strict_overflow_p = false;
14294       if (tree_expr_nonzero_warnv_p (op0,
14295                                      &sub_strict_overflow_p)
14296           && tree_expr_nonzero_warnv_p (op1,
14297                                         &sub_strict_overflow_p))
14298         {
14299           if (sub_strict_overflow_p)
14300             *strict_overflow_p = true;
14301         }
14302       break;
14303
14304     case MAX_EXPR:
14305       sub_strict_overflow_p = false;
14306       if (tree_expr_nonzero_warnv_p (op0,
14307                                      &sub_strict_overflow_p))
14308         {
14309           if (sub_strict_overflow_p)
14310             *strict_overflow_p = true;
14311
14312           /* When both operands are nonzero, then MAX must be too.  */
14313           if (tree_expr_nonzero_warnv_p (op1,
14314                                          strict_overflow_p))
14315             return true;
14316
14317           /* MAX where operand 0 is positive is positive.  */
14318           return tree_expr_nonnegative_warnv_p (op0,
14319                                                strict_overflow_p);
14320         }
14321       /* MAX where operand 1 is positive is positive.  */
14322       else if (tree_expr_nonzero_warnv_p (op1,
14323                                           &sub_strict_overflow_p)
14324                && tree_expr_nonnegative_warnv_p (op1,
14325                                                  &sub_strict_overflow_p))
14326         {
14327           if (sub_strict_overflow_p)
14328             *strict_overflow_p = true;
14329           return true;
14330         }
14331       break;
14332
14333     case BIT_IOR_EXPR:
14334       return (tree_expr_nonzero_warnv_p (op1,
14335                                          strict_overflow_p)
14336               || tree_expr_nonzero_warnv_p (op0,
14337                                             strict_overflow_p));
14338
14339     default:
14340       break;
14341   }
14342
14343   return false;
14344 }
14345
14346 /* Return true when T is an address and is known to be nonzero.
14347    For floating point we further ensure that T is not denormal.
14348    Similar logic is present in nonzero_address in rtlanal.h.
14349
14350    If the return value is based on the assumption that signed overflow
14351    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14352    change *STRICT_OVERFLOW_P.  */
14353
14354 static bool
14355 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14356 {
14357   bool sub_strict_overflow_p;
14358   switch (TREE_CODE (t))
14359     {
14360     case SSA_NAME:
14361       /* Query VRP to see if it has recorded any information about
14362          the range of this object.  */
14363       return ssa_name_nonzero_p (t);
14364
14365     case INTEGER_CST:
14366       return !integer_zerop (t);
14367
14368     case ADDR_EXPR:
14369       {
14370         tree base = get_base_address (TREE_OPERAND (t, 0));
14371
14372         if (!base)
14373           return false;
14374
14375         /* Weak declarations may link to NULL.  */
14376         if (VAR_OR_FUNCTION_DECL_P (base))
14377           return !DECL_WEAK (base);
14378
14379         /* Constants are never weak.  */
14380         if (CONSTANT_CLASS_P (base))
14381           return true;
14382
14383         return false;
14384       }
14385
14386     case COND_EXPR:
14387       sub_strict_overflow_p = false;
14388       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
14389                                      &sub_strict_overflow_p)
14390           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
14391                                         &sub_strict_overflow_p))
14392         {
14393           if (sub_strict_overflow_p)
14394             *strict_overflow_p = true;
14395           return true;
14396         }
14397       break;
14398
14399     default:
14400       break;
14401     }
14402   return false;
14403 }
14404
14405 /* Return true when T is an address and is known to be nonzero.
14406    For floating point we further ensure that T is not denormal.
14407    Similar logic is present in nonzero_address in rtlanal.h.
14408
14409    If the return value is based on the assumption that signed overflow
14410    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14411    change *STRICT_OVERFLOW_P.  */
14412
14413 bool
14414 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14415 {
14416   tree type = TREE_TYPE (t);
14417   enum tree_code code;
14418
14419   /* Doing something useful for floating point would need more work.  */
14420   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
14421     return false;
14422
14423   code = TREE_CODE (t);
14424   switch (TREE_CODE_CLASS (code))
14425     {
14426     case tcc_unary:
14427       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14428                                               strict_overflow_p);
14429     case tcc_binary:
14430     case tcc_comparison:
14431       return tree_binary_nonzero_warnv_p (code, type,
14432                                                TREE_OPERAND (t, 0),
14433                                                TREE_OPERAND (t, 1),
14434                                                strict_overflow_p);
14435     case tcc_constant:
14436     case tcc_declaration:
14437     case tcc_reference:
14438       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14439
14440     default:
14441       break;
14442     }
14443
14444   switch (code)
14445     {
14446     case TRUTH_NOT_EXPR:
14447       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14448                                               strict_overflow_p);
14449
14450     case TRUTH_AND_EXPR:
14451     case TRUTH_OR_EXPR:
14452     case TRUTH_XOR_EXPR:
14453       return tree_binary_nonzero_warnv_p (code, type,
14454                                                TREE_OPERAND (t, 0),
14455                                                TREE_OPERAND (t, 1),
14456                                                strict_overflow_p);
14457
14458     case COND_EXPR:
14459     case CONSTRUCTOR:
14460     case OBJ_TYPE_REF:
14461     case ASSERT_EXPR:
14462     case ADDR_EXPR:
14463     case WITH_SIZE_EXPR:
14464     case EXC_PTR_EXPR:
14465     case SSA_NAME:
14466     case FILTER_EXPR:
14467       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14468
14469     case COMPOUND_EXPR:
14470     case MODIFY_EXPR:
14471     case GIMPLE_MODIFY_STMT:
14472     case BIND_EXPR:
14473       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14474                                         strict_overflow_p);
14475
14476     case SAVE_EXPR:
14477       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
14478                                         strict_overflow_p);
14479
14480     case CALL_EXPR:
14481       return alloca_call_p (t);
14482
14483     default:
14484       break;
14485     }
14486   return false;
14487 }
14488
14489 /* Return true when T is an address and is known to be nonzero.
14490    Handle warnings about undefined signed overflow.  */
14491
14492 bool
14493 tree_expr_nonzero_p (tree t)
14494 {
14495   bool ret, strict_overflow_p;
14496
14497   strict_overflow_p = false;
14498   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
14499   if (strict_overflow_p)
14500     fold_overflow_warning (("assuming signed overflow does not occur when "
14501                             "determining that expression is always "
14502                             "non-zero"),
14503                            WARN_STRICT_OVERFLOW_MISC);
14504   return ret;
14505 }
14506
14507 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
14508    attempt to fold the expression to a constant without modifying TYPE,
14509    OP0 or OP1.
14510
14511    If the expression could be simplified to a constant, then return
14512    the constant.  If the expression would not be simplified to a
14513    constant, then return NULL_TREE.  */
14514
14515 tree
14516 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
14517 {
14518   tree tem = fold_binary (code, type, op0, op1);
14519   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14520 }
14521
14522 /* Given the components of a unary expression CODE, TYPE and OP0,
14523    attempt to fold the expression to a constant without modifying
14524    TYPE or OP0.
14525
14526    If the expression could be simplified to a constant, then return
14527    the constant.  If the expression would not be simplified to a
14528    constant, then return NULL_TREE.  */
14529
14530 tree
14531 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
14532 {
14533   tree tem = fold_unary (code, type, op0);
14534   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14535 }
14536
14537 /* If EXP represents referencing an element in a constant string
14538    (either via pointer arithmetic or array indexing), return the
14539    tree representing the value accessed, otherwise return NULL.  */
14540
14541 tree
14542 fold_read_from_constant_string (tree exp)
14543 {
14544   if ((TREE_CODE (exp) == INDIRECT_REF
14545        || TREE_CODE (exp) == ARRAY_REF)
14546       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
14547     {
14548       tree exp1 = TREE_OPERAND (exp, 0);
14549       tree index;
14550       tree string;
14551
14552       if (TREE_CODE (exp) == INDIRECT_REF)
14553         string = string_constant (exp1, &index);
14554       else
14555         {
14556           tree low_bound = array_ref_low_bound (exp);
14557           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
14558
14559           /* Optimize the special-case of a zero lower bound.
14560
14561              We convert the low_bound to sizetype to avoid some problems
14562              with constant folding.  (E.g. suppose the lower bound is 1,
14563              and its mode is QI.  Without the conversion,l (ARRAY
14564              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
14565              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
14566           if (! integer_zerop (low_bound))
14567             index = size_diffop (index, fold_convert (sizetype, low_bound));
14568
14569           string = exp1;
14570         }
14571
14572       if (string
14573           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
14574           && TREE_CODE (string) == STRING_CST
14575           && TREE_CODE (index) == INTEGER_CST
14576           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
14577           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
14578               == MODE_INT)
14579           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
14580         return build_int_cst_type (TREE_TYPE (exp),
14581                                    (TREE_STRING_POINTER (string)
14582                                     [TREE_INT_CST_LOW (index)]));
14583     }
14584   return NULL;
14585 }
14586
14587 /* Return the tree for neg (ARG0) when ARG0 is known to be either
14588    an integer constant, real, or fixed-point constant.
14589
14590    TYPE is the type of the result.  */
14591
14592 static tree
14593 fold_negate_const (tree arg0, tree type)
14594 {
14595   tree t = NULL_TREE;
14596
14597   switch (TREE_CODE (arg0))
14598     {
14599     case INTEGER_CST:
14600       {
14601         unsigned HOST_WIDE_INT low;
14602         HOST_WIDE_INT high;
14603         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14604                                    TREE_INT_CST_HIGH (arg0),
14605                                    &low, &high);
14606         t = force_fit_type_double (type, low, high, 1,
14607                                    (overflow | TREE_OVERFLOW (arg0))
14608                                    && !TYPE_UNSIGNED (type));
14609         break;
14610       }
14611
14612     case REAL_CST:
14613       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14614       break;
14615
14616     case FIXED_CST:
14617       {
14618         FIXED_VALUE_TYPE f;
14619         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
14620                                             &(TREE_FIXED_CST (arg0)), NULL,
14621                                             TYPE_SATURATING (type));
14622         t = build_fixed (type, f);
14623         /* Propagate overflow flags.  */
14624         if (overflow_p | TREE_OVERFLOW (arg0))
14625           {
14626             TREE_OVERFLOW (t) = 1;
14627             TREE_CONSTANT_OVERFLOW (t) = 1;
14628           }
14629         else if (TREE_CONSTANT_OVERFLOW (arg0))
14630           TREE_CONSTANT_OVERFLOW (t) = 1;
14631         break;
14632       }
14633
14634     default:
14635       gcc_unreachable ();
14636     }
14637
14638   return t;
14639 }
14640
14641 /* Return the tree for abs (ARG0) when ARG0 is known to be either
14642    an integer constant or real constant.
14643
14644    TYPE is the type of the result.  */
14645
14646 tree
14647 fold_abs_const (tree arg0, tree type)
14648 {
14649   tree t = NULL_TREE;
14650
14651   switch (TREE_CODE (arg0))
14652     {
14653     case INTEGER_CST:
14654       /* If the value is unsigned, then the absolute value is
14655          the same as the ordinary value.  */
14656       if (TYPE_UNSIGNED (type))
14657         t = arg0;
14658       /* Similarly, if the value is non-negative.  */
14659       else if (INT_CST_LT (integer_minus_one_node, arg0))
14660         t = arg0;
14661       /* If the value is negative, then the absolute value is
14662          its negation.  */
14663       else
14664         {
14665           unsigned HOST_WIDE_INT low;
14666           HOST_WIDE_INT high;
14667           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14668                                      TREE_INT_CST_HIGH (arg0),
14669                                      &low, &high);
14670           t = force_fit_type_double (type, low, high, -1,
14671                                      overflow | TREE_OVERFLOW (arg0));
14672         }
14673       break;
14674
14675     case REAL_CST:
14676       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
14677         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14678       else
14679         t =  arg0;
14680       break;
14681
14682     default:
14683       gcc_unreachable ();
14684     }
14685
14686   return t;
14687 }
14688
14689 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
14690    constant.  TYPE is the type of the result.  */
14691
14692 static tree
14693 fold_not_const (tree arg0, tree type)
14694 {
14695   tree t = NULL_TREE;
14696
14697   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
14698
14699   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
14700                              ~TREE_INT_CST_HIGH (arg0), 0,
14701                              TREE_OVERFLOW (arg0));
14702
14703   return t;
14704 }
14705
14706 /* Given CODE, a relational operator, the target type, TYPE and two
14707    constant operands OP0 and OP1, return the result of the
14708    relational operation.  If the result is not a compile time
14709    constant, then return NULL_TREE.  */
14710
14711 static tree
14712 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
14713 {
14714   int result, invert;
14715
14716   /* From here on, the only cases we handle are when the result is
14717      known to be a constant.  */
14718
14719   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
14720     {
14721       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
14722       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
14723
14724       /* Handle the cases where either operand is a NaN.  */
14725       if (real_isnan (c0) || real_isnan (c1))
14726         {
14727           switch (code)
14728             {
14729             case EQ_EXPR:
14730             case ORDERED_EXPR:
14731               result = 0;
14732               break;
14733
14734             case NE_EXPR:
14735             case UNORDERED_EXPR:
14736             case UNLT_EXPR:
14737             case UNLE_EXPR:
14738             case UNGT_EXPR:
14739             case UNGE_EXPR:
14740             case UNEQ_EXPR:
14741               result = 1;
14742               break;
14743
14744             case LT_EXPR:
14745             case LE_EXPR:
14746             case GT_EXPR:
14747             case GE_EXPR:
14748             case LTGT_EXPR:
14749               if (flag_trapping_math)
14750                 return NULL_TREE;
14751               result = 0;
14752               break;
14753
14754             default:
14755               gcc_unreachable ();
14756             }
14757
14758           return constant_boolean_node (result, type);
14759         }
14760
14761       return constant_boolean_node (real_compare (code, c0, c1), type);
14762     }
14763
14764   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
14765     {
14766       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
14767       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
14768       return constant_boolean_node (fixed_compare (code, c0, c1), type);
14769     }
14770
14771   /* Handle equality/inequality of complex constants.  */
14772   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14773     {
14774       tree rcond = fold_relational_const (code, type,
14775                                           TREE_REALPART (op0),
14776                                           TREE_REALPART (op1));
14777       tree icond = fold_relational_const (code, type,
14778                                           TREE_IMAGPART (op0),
14779                                           TREE_IMAGPART (op1));
14780       if (code == EQ_EXPR)
14781         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14782       else if (code == NE_EXPR)
14783         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14784       else
14785         return NULL_TREE;
14786     }
14787
14788   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14789
14790      To compute GT, swap the arguments and do LT.
14791      To compute GE, do LT and invert the result.
14792      To compute LE, swap the arguments, do LT and invert the result.
14793      To compute NE, do EQ and invert the result.
14794
14795      Therefore, the code below must handle only EQ and LT.  */
14796
14797   if (code == LE_EXPR || code == GT_EXPR)
14798     {
14799       tree tem = op0;
14800       op0 = op1;
14801       op1 = tem;
14802       code = swap_tree_comparison (code);
14803     }
14804
14805   /* Note that it is safe to invert for real values here because we
14806      have already handled the one case that it matters.  */
14807
14808   invert = 0;
14809   if (code == NE_EXPR || code == GE_EXPR)
14810     {
14811       invert = 1;
14812       code = invert_tree_comparison (code, false);
14813     }
14814
14815   /* Compute a result for LT or EQ if args permit;
14816      Otherwise return T.  */
14817   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14818     {
14819       if (code == EQ_EXPR)
14820         result = tree_int_cst_equal (op0, op1);
14821       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14822         result = INT_CST_LT_UNSIGNED (op0, op1);
14823       else
14824         result = INT_CST_LT (op0, op1);
14825     }
14826   else
14827     return NULL_TREE;
14828
14829   if (invert)
14830     result ^= 1;
14831   return constant_boolean_node (result, type);
14832 }
14833
14834 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
14835    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
14836    itself.  */
14837
14838 tree
14839 fold_build_cleanup_point_expr (tree type, tree expr)
14840 {
14841   /* If the expression does not have side effects then we don't have to wrap
14842      it with a cleanup point expression.  */
14843   if (!TREE_SIDE_EFFECTS (expr))
14844     return expr;
14845
14846   /* If the expression is a return, check to see if the expression inside the
14847      return has no side effects or the right hand side of the modify expression
14848      inside the return. If either don't have side effects set we don't need to
14849      wrap the expression in a cleanup point expression.  Note we don't check the
14850      left hand side of the modify because it should always be a return decl.  */
14851   if (TREE_CODE (expr) == RETURN_EXPR)
14852     {
14853       tree op = TREE_OPERAND (expr, 0);
14854       if (!op || !TREE_SIDE_EFFECTS (op))
14855         return expr;
14856       op = TREE_OPERAND (op, 1);
14857       if (!TREE_SIDE_EFFECTS (op))
14858         return expr;
14859     }
14860   
14861   return build1 (CLEANUP_POINT_EXPR, type, expr);
14862 }
14863
14864 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14865    of an indirection through OP0, or NULL_TREE if no simplification is
14866    possible.  */
14867
14868 tree
14869 fold_indirect_ref_1 (tree type, tree op0)
14870 {
14871   tree sub = op0;
14872   tree subtype;
14873
14874   STRIP_NOPS (sub);
14875   subtype = TREE_TYPE (sub);
14876   if (!POINTER_TYPE_P (subtype))
14877     return NULL_TREE;
14878
14879   if (TREE_CODE (sub) == ADDR_EXPR)
14880     {
14881       tree op = TREE_OPERAND (sub, 0);
14882       tree optype = TREE_TYPE (op);
14883       /* *&CONST_DECL -> to the value of the const decl.  */
14884       if (TREE_CODE (op) == CONST_DECL)
14885         return DECL_INITIAL (op);
14886       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
14887       if (type == optype)
14888         {
14889           tree fop = fold_read_from_constant_string (op);
14890           if (fop)
14891             return fop;
14892           else
14893             return op;
14894         }
14895       /* *(foo *)&fooarray => fooarray[0] */
14896       else if (TREE_CODE (optype) == ARRAY_TYPE
14897                && type == TREE_TYPE (optype))
14898         {
14899           tree type_domain = TYPE_DOMAIN (optype);
14900           tree min_val = size_zero_node;
14901           if (type_domain && TYPE_MIN_VALUE (type_domain))
14902             min_val = TYPE_MIN_VALUE (type_domain);
14903           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14904         }
14905       /* *(foo *)&complexfoo => __real__ complexfoo */
14906       else if (TREE_CODE (optype) == COMPLEX_TYPE
14907                && type == TREE_TYPE (optype))
14908         return fold_build1 (REALPART_EXPR, type, op);
14909       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14910       else if (TREE_CODE (optype) == VECTOR_TYPE
14911                && type == TREE_TYPE (optype))
14912         {
14913           tree part_width = TYPE_SIZE (type);
14914           tree index = bitsize_int (0);
14915           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
14916         }
14917     }
14918
14919   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
14920   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
14921       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
14922     {
14923       tree op00 = TREE_OPERAND (sub, 0);
14924       tree op01 = TREE_OPERAND (sub, 1);
14925       tree op00type;
14926
14927       STRIP_NOPS (op00);
14928       op00type = TREE_TYPE (op00);
14929       if (TREE_CODE (op00) == ADDR_EXPR
14930           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
14931           && type == TREE_TYPE (TREE_TYPE (op00type)))
14932         {
14933           tree size = TYPE_SIZE_UNIT (type);
14934           if (tree_int_cst_equal (size, op01))
14935             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
14936         }
14937     }
14938   
14939   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
14940   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
14941       && type == TREE_TYPE (TREE_TYPE (subtype)))
14942     {
14943       tree type_domain;
14944       tree min_val = size_zero_node;
14945       sub = build_fold_indirect_ref (sub);
14946       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
14947       if (type_domain && TYPE_MIN_VALUE (type_domain))
14948         min_val = TYPE_MIN_VALUE (type_domain);
14949       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
14950     }
14951
14952   return NULL_TREE;
14953 }
14954
14955 /* Builds an expression for an indirection through T, simplifying some
14956    cases.  */
14957
14958 tree
14959 build_fold_indirect_ref (tree t)
14960 {
14961   tree type = TREE_TYPE (TREE_TYPE (t));
14962   tree sub = fold_indirect_ref_1 (type, t);
14963
14964   if (sub)
14965     return sub;
14966   else
14967     return build1 (INDIRECT_REF, type, t);
14968 }
14969
14970 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
14971
14972 tree
14973 fold_indirect_ref (tree t)
14974 {
14975   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
14976
14977   if (sub)
14978     return sub;
14979   else
14980     return t;
14981 }
14982
14983 /* Strip non-trapping, non-side-effecting tree nodes from an expression
14984    whose result is ignored.  The type of the returned tree need not be
14985    the same as the original expression.  */
14986
14987 tree
14988 fold_ignored_result (tree t)
14989 {
14990   if (!TREE_SIDE_EFFECTS (t))
14991     return integer_zero_node;
14992
14993   for (;;)
14994     switch (TREE_CODE_CLASS (TREE_CODE (t)))
14995       {
14996       case tcc_unary:
14997         t = TREE_OPERAND (t, 0);
14998         break;
14999
15000       case tcc_binary:
15001       case tcc_comparison:
15002         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15003           t = TREE_OPERAND (t, 0);
15004         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15005           t = TREE_OPERAND (t, 1);
15006         else
15007           return t;
15008         break;
15009
15010       case tcc_expression:
15011         switch (TREE_CODE (t))
15012           {
15013           case COMPOUND_EXPR:
15014             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15015               return t;
15016             t = TREE_OPERAND (t, 0);
15017             break;
15018
15019           case COND_EXPR:
15020             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15021                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15022               return t;
15023             t = TREE_OPERAND (t, 0);
15024             break;
15025
15026           default:
15027             return t;
15028           }
15029         break;
15030
15031       default:
15032         return t;
15033       }
15034 }
15035
15036 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15037    This can only be applied to objects of a sizetype.  */
15038
15039 tree
15040 round_up (tree value, int divisor)
15041 {
15042   tree div = NULL_TREE;
15043
15044   gcc_assert (divisor > 0);
15045   if (divisor == 1)
15046     return value;
15047
15048   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15049      have to do anything.  Only do this when we are not given a const,
15050      because in that case, this check is more expensive than just
15051      doing it.  */
15052   if (TREE_CODE (value) != INTEGER_CST)
15053     {
15054       div = build_int_cst (TREE_TYPE (value), divisor);
15055
15056       if (multiple_of_p (TREE_TYPE (value), value, div))
15057         return value;
15058     }
15059
15060   /* If divisor is a power of two, simplify this to bit manipulation.  */
15061   if (divisor == (divisor & -divisor))
15062     {
15063       if (TREE_CODE (value) == INTEGER_CST)
15064         {
15065           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15066           unsigned HOST_WIDE_INT high;
15067           bool overflow_p;
15068
15069           if ((low & (divisor - 1)) == 0)
15070             return value;
15071
15072           overflow_p = TREE_OVERFLOW (value);
15073           high = TREE_INT_CST_HIGH (value);
15074           low &= ~(divisor - 1);
15075           low += divisor;
15076           if (low == 0)
15077             {
15078               high++;
15079               if (high == 0)
15080                 overflow_p = true;
15081             }
15082
15083           return force_fit_type_double (TREE_TYPE (value), low, high,
15084                                         -1, overflow_p);
15085         }
15086       else
15087         {
15088           tree t;
15089
15090           t = build_int_cst (TREE_TYPE (value), divisor - 1);
15091           value = size_binop (PLUS_EXPR, value, t);
15092           t = build_int_cst (TREE_TYPE (value), -divisor);
15093           value = size_binop (BIT_AND_EXPR, value, t);
15094         }
15095     }
15096   else
15097     {
15098       if (!div)
15099         div = build_int_cst (TREE_TYPE (value), divisor);
15100       value = size_binop (CEIL_DIV_EXPR, value, div);
15101       value = size_binop (MULT_EXPR, value, div);
15102     }
15103
15104   return value;
15105 }
15106
15107 /* Likewise, but round down.  */
15108
15109 tree
15110 round_down (tree value, int divisor)
15111 {
15112   tree div = NULL_TREE;
15113
15114   gcc_assert (divisor > 0);
15115   if (divisor == 1)
15116     return value;
15117
15118   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15119      have to do anything.  Only do this when we are not given a const,
15120      because in that case, this check is more expensive than just
15121      doing it.  */
15122   if (TREE_CODE (value) != INTEGER_CST)
15123     {
15124       div = build_int_cst (TREE_TYPE (value), divisor);
15125
15126       if (multiple_of_p (TREE_TYPE (value), value, div))
15127         return value;
15128     }
15129
15130   /* If divisor is a power of two, simplify this to bit manipulation.  */
15131   if (divisor == (divisor & -divisor))
15132     {
15133       tree t;
15134
15135       t = build_int_cst (TREE_TYPE (value), -divisor);
15136       value = size_binop (BIT_AND_EXPR, value, t);
15137     }
15138   else
15139     {
15140       if (!div)
15141         div = build_int_cst (TREE_TYPE (value), divisor);
15142       value = size_binop (FLOOR_DIV_EXPR, value, div);
15143       value = size_binop (MULT_EXPR, value, div);
15144     }
15145
15146   return value;
15147 }
15148
15149 /* Returns the pointer to the base of the object addressed by EXP and
15150    extracts the information about the offset of the access, storing it
15151    to PBITPOS and POFFSET.  */
15152
15153 static tree
15154 split_address_to_core_and_offset (tree exp,
15155                                   HOST_WIDE_INT *pbitpos, tree *poffset)
15156 {
15157   tree core;
15158   enum machine_mode mode;
15159   int unsignedp, volatilep;
15160   HOST_WIDE_INT bitsize;
15161
15162   if (TREE_CODE (exp) == ADDR_EXPR)
15163     {
15164       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15165                                   poffset, &mode, &unsignedp, &volatilep,
15166                                   false);
15167       core = fold_addr_expr (core);
15168     }
15169   else
15170     {
15171       core = exp;
15172       *pbitpos = 0;
15173       *poffset = NULL_TREE;
15174     }
15175
15176   return core;
15177 }
15178
15179 /* Returns true if addresses of E1 and E2 differ by a constant, false
15180    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
15181
15182 bool
15183 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15184 {
15185   tree core1, core2;
15186   HOST_WIDE_INT bitpos1, bitpos2;
15187   tree toffset1, toffset2, tdiff, type;
15188
15189   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15190   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15191
15192   if (bitpos1 % BITS_PER_UNIT != 0
15193       || bitpos2 % BITS_PER_UNIT != 0
15194       || !operand_equal_p (core1, core2, 0))
15195     return false;
15196
15197   if (toffset1 && toffset2)
15198     {
15199       type = TREE_TYPE (toffset1);
15200       if (type != TREE_TYPE (toffset2))
15201         toffset2 = fold_convert (type, toffset2);
15202
15203       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15204       if (!cst_and_fits_in_hwi (tdiff))
15205         return false;
15206
15207       *diff = int_cst_value (tdiff);
15208     }
15209   else if (toffset1 || toffset2)
15210     {
15211       /* If only one of the offsets is non-constant, the difference cannot
15212          be a constant.  */
15213       return false;
15214     }
15215   else
15216     *diff = 0;
15217
15218   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15219   return true;
15220 }
15221
15222 /* Simplify the floating point expression EXP when the sign of the
15223    result is not significant.  Return NULL_TREE if no simplification
15224    is possible.  */
15225
15226 tree
15227 fold_strip_sign_ops (tree exp)
15228 {
15229   tree arg0, arg1;
15230
15231   switch (TREE_CODE (exp))
15232     {
15233     case ABS_EXPR:
15234     case NEGATE_EXPR:
15235       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15236       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15237
15238     case MULT_EXPR:
15239     case RDIV_EXPR:
15240       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15241         return NULL_TREE;
15242       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15243       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15244       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15245         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15246                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
15247                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
15248       break;
15249
15250     case COMPOUND_EXPR:
15251       arg0 = TREE_OPERAND (exp, 0);
15252       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15253       if (arg1)
15254         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15255       break;
15256       
15257     case COND_EXPR:
15258       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15259       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15260       if (arg0 || arg1)
15261         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15262                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
15263                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
15264       break;
15265       
15266     case CALL_EXPR:
15267       {
15268         const enum built_in_function fcode = builtin_mathfn_code (exp);
15269         switch (fcode)
15270         {
15271         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15272           /* Strip copysign function call, return the 1st argument. */
15273           arg0 = CALL_EXPR_ARG (exp, 0);
15274           arg1 = CALL_EXPR_ARG (exp, 1);
15275           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15276
15277         default:
15278           /* Strip sign ops from the argument of "odd" math functions.  */
15279           if (negate_mathfn_p (fcode))
15280             {
15281               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15282               if (arg0)
15283                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
15284             }
15285           break;
15286         }
15287       }
15288       break;
15289
15290     default:
15291       break;
15292     }
15293   return NULL_TREE;
15294 }