OSDN Git Service

2008-05-06 H.J. Lu <hongjiu.lu@intel.com>
[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 "target.h"
62 #include "toplev.h"
63 #include "intl.h"
64 #include "ggc.h"
65 #include "hashtab.h"
66 #include "langhooks.h"
67 #include "md5.h"
68
69 /* Nonzero if we are folding constants inside an initializer; zero
70    otherwise.  */
71 int folding_initializer = 0;
72
73 /* The following constants represent a bit based encoding of GCC's
74    comparison operators.  This encoding simplifies transformations
75    on relational comparison operators, such as AND and OR.  */
76 enum comparison_code {
77   COMPCODE_FALSE = 0,
78   COMPCODE_LT = 1,
79   COMPCODE_EQ = 2,
80   COMPCODE_LE = 3,
81   COMPCODE_GT = 4,
82   COMPCODE_LTGT = 5,
83   COMPCODE_GE = 6,
84   COMPCODE_ORD = 7,
85   COMPCODE_UNORD = 8,
86   COMPCODE_UNLT = 9,
87   COMPCODE_UNEQ = 10,
88   COMPCODE_UNLE = 11,
89   COMPCODE_UNGT = 12,
90   COMPCODE_NE = 13,
91   COMPCODE_UNGE = 14,
92   COMPCODE_TRUE = 15
93 };
94
95 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
96 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
97 static bool negate_mathfn_p (enum built_in_function);
98 static bool negate_expr_p (tree);
99 static tree negate_expr (tree);
100 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
101 static tree associate_trees (tree, tree, enum tree_code, tree);
102 static tree const_binop (enum tree_code, tree, tree, int);
103 static enum comparison_code comparison_to_compcode (enum tree_code);
104 static enum tree_code compcode_to_comparison (enum comparison_code);
105 static tree combine_comparisons (enum tree_code, enum tree_code,
106                                  enum tree_code, tree, tree, tree);
107 static int truth_value_p (enum tree_code);
108 static int operand_equal_for_comparison_p (tree, tree, tree);
109 static int twoval_comparison_p (tree, tree *, tree *, int *);
110 static tree eval_subst (tree, tree, tree, tree, tree);
111 static tree pedantic_omit_one_operand (tree, tree, tree);
112 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
113 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
114                                     enum machine_mode *, int *, int *,
115                                     tree *, tree *);
116 static tree sign_bit_p (tree, const_tree);
117 static int simple_operand_p (const_tree);
118 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
119 static tree range_predecessor (tree);
120 static tree range_successor (tree);
121 static tree make_range (tree, int *, tree *, tree *, bool *);
122 static tree build_range_check (tree, tree, int, tree, tree);
123 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
124                          tree);
125 static tree fold_range_test (enum tree_code, tree, tree, tree);
126 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
127 static tree unextend (tree, int, int, tree);
128 static tree fold_truthop (enum tree_code, tree, tree, tree);
129 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
130 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
131 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
132 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
133                                                  tree, tree,
134                                                  tree, tree, int);
135 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
136                                  tree, tree, tree);
137 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
138 static tree fold_div_compare (enum tree_code, tree, tree, tree);
139 static bool reorder_operands_p (const_tree, const_tree);
140 static tree fold_negate_const (tree, tree);
141 static tree fold_not_const (tree, tree);
142 static tree fold_relational_const (enum tree_code, tree, tree, tree);
143
144
145 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
146    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
147    and SUM1.  Then this yields nonzero if overflow occurred during the
148    addition.
149
150    Overflow occurs if A and B have the same sign, but A and SUM differ in
151    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
152    sign.  */
153 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
154 \f
155 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
156    We do that by representing the two-word integer in 4 words, with only
157    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
158    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
159
160 #define LOWPART(x) \
161   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
162 #define HIGHPART(x) \
163   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
164 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
165
166 /* Unpack a two-word integer into 4 words.
167    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
168    WORDS points to the array of HOST_WIDE_INTs.  */
169
170 static void
171 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
172 {
173   words[0] = LOWPART (low);
174   words[1] = HIGHPART (low);
175   words[2] = LOWPART (hi);
176   words[3] = HIGHPART (hi);
177 }
178
179 /* Pack an array of 4 words into a two-word integer.
180    WORDS points to the array of words.
181    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
182
183 static void
184 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
185         HOST_WIDE_INT *hi)
186 {
187   *low = words[0] + words[1] * BASE;
188   *hi = words[2] + words[3] * BASE;
189 }
190 \f
191 /* Force the double-word integer L1, H1 to be within the range of the
192    integer type TYPE.  Stores the properly truncated and sign-extended
193    double-word integer in *LV, *HV.  Returns true if the operation
194    overflows, that is, argument and result are different.  */
195
196 int
197 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
198                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
199 {
200   unsigned HOST_WIDE_INT low0 = l1;
201   HOST_WIDE_INT high0 = h1;
202   unsigned int prec;
203   int sign_extended_type;
204
205   if (POINTER_TYPE_P (type)
206       || TREE_CODE (type) == OFFSET_TYPE)
207     prec = POINTER_SIZE;
208   else
209     prec = TYPE_PRECISION (type);
210
211   /* Size types *are* sign extended.  */
212   sign_extended_type = (!TYPE_UNSIGNED (type)
213                         || (TREE_CODE (type) == INTEGER_TYPE
214                             && TYPE_IS_SIZETYPE (type)));
215
216   /* First clear all bits that are beyond the type's precision.  */
217   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
218     ;
219   else if (prec > HOST_BITS_PER_WIDE_INT)
220     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
221   else
222     {
223       h1 = 0;
224       if (prec < HOST_BITS_PER_WIDE_INT)
225         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
226     }
227
228   /* Then do sign extension if necessary.  */
229   if (!sign_extended_type)
230     /* No sign extension */;
231   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
232     /* Correct width already.  */;
233   else if (prec > HOST_BITS_PER_WIDE_INT)
234     {
235       /* Sign extend top half? */
236       if (h1 & ((unsigned HOST_WIDE_INT)1
237                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
238         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
239     }
240   else if (prec == HOST_BITS_PER_WIDE_INT)
241     {
242       if ((HOST_WIDE_INT)l1 < 0)
243         h1 = -1;
244     }
245   else
246     {
247       /* Sign extend bottom half? */
248       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
249         {
250           h1 = -1;
251           l1 |= (HOST_WIDE_INT)(-1) << prec;
252         }
253     }
254
255   *lv = l1;
256   *hv = h1;
257
258   /* If the value didn't fit, signal overflow.  */
259   return l1 != low0 || h1 != high0;
260 }
261
262 /* We force the double-int HIGH:LOW to the range of the type TYPE by
263    sign or zero extending it.
264    OVERFLOWABLE indicates if we are interested
265    in overflow of the value, when >0 we are only interested in signed
266    overflow, for <0 we are interested in any overflow.  OVERFLOWED
267    indicates whether overflow has already occurred.  CONST_OVERFLOWED
268    indicates whether constant overflow has already occurred.  We force
269    T's value to be within range of T's type (by setting to 0 or 1 all
270    the bits outside the type's range).  We set TREE_OVERFLOWED if,
271         OVERFLOWED is nonzero,
272         or OVERFLOWABLE is >0 and signed overflow occurs
273         or OVERFLOWABLE is <0 and any overflow occurs
274    We return a new tree node for the extended double-int.  The node
275    is shared if no overflow flags are set.  */
276
277 tree
278 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
279                        HOST_WIDE_INT high, int overflowable,
280                        bool overflowed)
281 {
282   int sign_extended_type;
283   bool overflow;
284
285   /* Size types *are* sign extended.  */
286   sign_extended_type = (!TYPE_UNSIGNED (type)
287                         || (TREE_CODE (type) == INTEGER_TYPE
288                             && TYPE_IS_SIZETYPE (type)));
289
290   overflow = fit_double_type (low, high, &low, &high, type);
291
292   /* If we need to set overflow flags, return a new unshared node.  */
293   if (overflowed || overflow)
294     {
295       if (overflowed
296           || overflowable < 0
297           || (overflowable > 0 && sign_extended_type))
298         {
299           tree t = make_node (INTEGER_CST);
300           TREE_INT_CST_LOW (t) = low;
301           TREE_INT_CST_HIGH (t) = high;
302           TREE_TYPE (t) = type;
303           TREE_OVERFLOW (t) = 1;
304           return t;
305         }
306     }
307
308   /* Else build a shared node.  */
309   return build_int_cst_wide (type, low, high);
310 }
311 \f
312 /* Add two doubleword integers with doubleword result.
313    Return nonzero if the operation overflows according to UNSIGNED_P.
314    Each argument is given as two `HOST_WIDE_INT' pieces.
315    One argument is L1 and H1; the other, L2 and H2.
316    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
317
318 int
319 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
320                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
321                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
322                       bool unsigned_p)
323 {
324   unsigned HOST_WIDE_INT l;
325   HOST_WIDE_INT h;
326
327   l = l1 + l2;
328   h = h1 + h2 + (l < l1);
329
330   *lv = l;
331   *hv = h;
332
333   if (unsigned_p)
334     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
335   else
336     return OVERFLOW_SUM_SIGN (h1, h2, h);
337 }
338
339 /* Negate a doubleword integer with doubleword result.
340    Return nonzero if the operation overflows, assuming it's signed.
341    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
342    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
343
344 int
345 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
346             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
347 {
348   if (l1 == 0)
349     {
350       *lv = 0;
351       *hv = - h1;
352       return (*hv & h1) < 0;
353     }
354   else
355     {
356       *lv = -l1;
357       *hv = ~h1;
358       return 0;
359     }
360 }
361 \f
362 /* Multiply two doubleword integers with doubleword result.
363    Return nonzero if the operation overflows according to UNSIGNED_P.
364    Each argument is given as two `HOST_WIDE_INT' pieces.
365    One argument is L1 and H1; the other, L2 and H2.
366    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
367
368 int
369 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
370                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
371                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
372                       bool unsigned_p)
373 {
374   HOST_WIDE_INT arg1[4];
375   HOST_WIDE_INT arg2[4];
376   HOST_WIDE_INT prod[4 * 2];
377   unsigned HOST_WIDE_INT carry;
378   int i, j, k;
379   unsigned HOST_WIDE_INT toplow, neglow;
380   HOST_WIDE_INT tophigh, neghigh;
381
382   encode (arg1, l1, h1);
383   encode (arg2, l2, h2);
384
385   memset (prod, 0, sizeof prod);
386
387   for (i = 0; i < 4; i++)
388     {
389       carry = 0;
390       for (j = 0; j < 4; j++)
391         {
392           k = i + j;
393           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
394           carry += arg1[i] * arg2[j];
395           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
396           carry += prod[k];
397           prod[k] = LOWPART (carry);
398           carry = HIGHPART (carry);
399         }
400       prod[i + 4] = carry;
401     }
402
403   decode (prod, lv, hv);
404   decode (prod + 4, &toplow, &tophigh);
405
406   /* Unsigned overflow is immediate.  */
407   if (unsigned_p)
408     return (toplow | tophigh) != 0;
409
410   /* Check for signed overflow by calculating the signed representation of the
411      top half of the result; it should agree with the low half's sign bit.  */
412   if (h1 < 0)
413     {
414       neg_double (l2, h2, &neglow, &neghigh);
415       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
416     }
417   if (h2 < 0)
418     {
419       neg_double (l1, h1, &neglow, &neghigh);
420       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
421     }
422   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
423 }
424 \f
425 /* Shift the doubleword integer in L1, H1 left by COUNT places
426    keeping only PREC bits of result.
427    Shift right if COUNT is negative.
428    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
429    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
430
431 void
432 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
433                HOST_WIDE_INT count, unsigned int prec,
434                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
435 {
436   unsigned HOST_WIDE_INT signmask;
437
438   if (count < 0)
439     {
440       rshift_double (l1, h1, -count, prec, lv, hv, arith);
441       return;
442     }
443
444   if (SHIFT_COUNT_TRUNCATED)
445     count %= prec;
446
447   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
448     {
449       /* Shifting by the host word size is undefined according to the
450          ANSI standard, so we must handle this as a special case.  */
451       *hv = 0;
452       *lv = 0;
453     }
454   else if (count >= HOST_BITS_PER_WIDE_INT)
455     {
456       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
457       *lv = 0;
458     }
459   else
460     {
461       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
462              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
463       *lv = l1 << count;
464     }
465
466   /* Sign extend all bits that are beyond the precision.  */
467
468   signmask = -((prec > HOST_BITS_PER_WIDE_INT
469                 ? ((unsigned HOST_WIDE_INT) *hv
470                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
471                 : (*lv >> (prec - 1))) & 1);
472
473   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
474     ;
475   else if (prec >= HOST_BITS_PER_WIDE_INT)
476     {
477       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
478       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
479     }
480   else
481     {
482       *hv = signmask;
483       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
484       *lv |= signmask << prec;
485     }
486 }
487
488 /* Shift the doubleword integer in L1, H1 right by COUNT places
489    keeping only PREC bits of result.  COUNT must be positive.
490    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
491    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
492
493 void
494 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
495                HOST_WIDE_INT count, unsigned int prec,
496                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
497                int arith)
498 {
499   unsigned HOST_WIDE_INT signmask;
500
501   signmask = (arith
502               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
503               : 0);
504
505   if (SHIFT_COUNT_TRUNCATED)
506     count %= prec;
507
508   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
509     {
510       /* Shifting by the host word size is undefined according to the
511          ANSI standard, so we must handle this as a special case.  */
512       *hv = 0;
513       *lv = 0;
514     }
515   else if (count >= HOST_BITS_PER_WIDE_INT)
516     {
517       *hv = 0;
518       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
519     }
520   else
521     {
522       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
523       *lv = ((l1 >> count)
524              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
525     }
526
527   /* Zero / sign extend all bits that are beyond the precision.  */
528
529   if (count >= (HOST_WIDE_INT)prec)
530     {
531       *hv = signmask;
532       *lv = signmask;
533     }
534   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
535     ;
536   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
537     {
538       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
539       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
540     }
541   else
542     {
543       *hv = signmask;
544       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
545       *lv |= signmask << (prec - count);
546     }
547 }
548 \f
549 /* Rotate the doubleword integer in L1, H1 left by COUNT places
550    keeping only PREC bits of result.
551    Rotate right if COUNT is negative.
552    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
553
554 void
555 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
556                 HOST_WIDE_INT count, unsigned int prec,
557                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
558 {
559   unsigned HOST_WIDE_INT s1l, s2l;
560   HOST_WIDE_INT s1h, s2h;
561
562   count %= prec;
563   if (count < 0)
564     count += prec;
565
566   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
567   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
568   *lv = s1l | s2l;
569   *hv = s1h | s2h;
570 }
571
572 /* Rotate the doubleword integer in L1, H1 left by COUNT places
573    keeping only PREC bits of result.  COUNT must be positive.
574    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
575
576 void
577 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
578                 HOST_WIDE_INT count, unsigned int prec,
579                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
580 {
581   unsigned HOST_WIDE_INT s1l, s2l;
582   HOST_WIDE_INT s1h, s2h;
583
584   count %= prec;
585   if (count < 0)
586     count += prec;
587
588   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
589   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
590   *lv = s1l | s2l;
591   *hv = s1h | s2h;
592 }
593 \f
594 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
595    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
596    CODE is a tree code for a kind of division, one of
597    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
598    or EXACT_DIV_EXPR
599    It controls how the quotient is rounded to an integer.
600    Return nonzero if the operation overflows.
601    UNS nonzero says do unsigned division.  */
602
603 int
604 div_and_round_double (enum tree_code code, int uns,
605                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
606                       HOST_WIDE_INT hnum_orig,
607                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
608                       HOST_WIDE_INT hden_orig,
609                       unsigned HOST_WIDE_INT *lquo,
610                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
611                       HOST_WIDE_INT *hrem)
612 {
613   int quo_neg = 0;
614   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
615   HOST_WIDE_INT den[4], quo[4];
616   int i, j;
617   unsigned HOST_WIDE_INT work;
618   unsigned HOST_WIDE_INT carry = 0;
619   unsigned HOST_WIDE_INT lnum = lnum_orig;
620   HOST_WIDE_INT hnum = hnum_orig;
621   unsigned HOST_WIDE_INT lden = lden_orig;
622   HOST_WIDE_INT hden = hden_orig;
623   int overflow = 0;
624
625   if (hden == 0 && lden == 0)
626     overflow = 1, lden = 1;
627
628   /* Calculate quotient sign and convert operands to unsigned.  */
629   if (!uns)
630     {
631       if (hnum < 0)
632         {
633           quo_neg = ~ quo_neg;
634           /* (minimum integer) / (-1) is the only overflow case.  */
635           if (neg_double (lnum, hnum, &lnum, &hnum)
636               && ((HOST_WIDE_INT) lden & hden) == -1)
637             overflow = 1;
638         }
639       if (hden < 0)
640         {
641           quo_neg = ~ quo_neg;
642           neg_double (lden, hden, &lden, &hden);
643         }
644     }
645
646   if (hnum == 0 && hden == 0)
647     {                           /* single precision */
648       *hquo = *hrem = 0;
649       /* This unsigned division rounds toward zero.  */
650       *lquo = lnum / lden;
651       goto finish_up;
652     }
653
654   if (hnum == 0)
655     {                           /* trivial case: dividend < divisor */
656       /* hden != 0 already checked.  */
657       *hquo = *lquo = 0;
658       *hrem = hnum;
659       *lrem = lnum;
660       goto finish_up;
661     }
662
663   memset (quo, 0, sizeof quo);
664
665   memset (num, 0, sizeof num);  /* to zero 9th element */
666   memset (den, 0, sizeof den);
667
668   encode (num, lnum, hnum);
669   encode (den, lden, hden);
670
671   /* Special code for when the divisor < BASE.  */
672   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
673     {
674       /* hnum != 0 already checked.  */
675       for (i = 4 - 1; i >= 0; i--)
676         {
677           work = num[i] + carry * BASE;
678           quo[i] = work / lden;
679           carry = work % lden;
680         }
681     }
682   else
683     {
684       /* Full double precision division,
685          with thanks to Don Knuth's "Seminumerical Algorithms".  */
686       int num_hi_sig, den_hi_sig;
687       unsigned HOST_WIDE_INT quo_est, scale;
688
689       /* Find the highest nonzero divisor digit.  */
690       for (i = 4 - 1;; i--)
691         if (den[i] != 0)
692           {
693             den_hi_sig = i;
694             break;
695           }
696
697       /* Insure that the first digit of the divisor is at least BASE/2.
698          This is required by the quotient digit estimation algorithm.  */
699
700       scale = BASE / (den[den_hi_sig] + 1);
701       if (scale > 1)
702         {               /* scale divisor and dividend */
703           carry = 0;
704           for (i = 0; i <= 4 - 1; i++)
705             {
706               work = (num[i] * scale) + carry;
707               num[i] = LOWPART (work);
708               carry = HIGHPART (work);
709             }
710
711           num[4] = carry;
712           carry = 0;
713           for (i = 0; i <= 4 - 1; i++)
714             {
715               work = (den[i] * scale) + carry;
716               den[i] = LOWPART (work);
717               carry = HIGHPART (work);
718               if (den[i] != 0) den_hi_sig = i;
719             }
720         }
721
722       num_hi_sig = 4;
723
724       /* Main loop */
725       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
726         {
727           /* Guess the next quotient digit, quo_est, by dividing the first
728              two remaining dividend digits by the high order quotient digit.
729              quo_est is never low and is at most 2 high.  */
730           unsigned HOST_WIDE_INT tmp;
731
732           num_hi_sig = i + den_hi_sig + 1;
733           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
734           if (num[num_hi_sig] != den[den_hi_sig])
735             quo_est = work / den[den_hi_sig];
736           else
737             quo_est = BASE - 1;
738
739           /* Refine quo_est so it's usually correct, and at most one high.  */
740           tmp = work - quo_est * den[den_hi_sig];
741           if (tmp < BASE
742               && (den[den_hi_sig - 1] * quo_est
743                   > (tmp * BASE + num[num_hi_sig - 2])))
744             quo_est--;
745
746           /* Try QUO_EST as the quotient digit, by multiplying the
747              divisor by QUO_EST and subtracting from the remaining dividend.
748              Keep in mind that QUO_EST is the I - 1st digit.  */
749
750           carry = 0;
751           for (j = 0; j <= den_hi_sig; j++)
752             {
753               work = quo_est * den[j] + carry;
754               carry = HIGHPART (work);
755               work = num[i + j] - LOWPART (work);
756               num[i + j] = LOWPART (work);
757               carry += HIGHPART (work) != 0;
758             }
759
760           /* If quo_est was high by one, then num[i] went negative and
761              we need to correct things.  */
762           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
763             {
764               quo_est--;
765               carry = 0;                /* add divisor back in */
766               for (j = 0; j <= den_hi_sig; j++)
767                 {
768                   work = num[i + j] + den[j] + carry;
769                   carry = HIGHPART (work);
770                   num[i + j] = LOWPART (work);
771                 }
772
773               num [num_hi_sig] += carry;
774             }
775
776           /* Store the quotient digit.  */
777           quo[i] = quo_est;
778         }
779     }
780
781   decode (quo, lquo, hquo);
782
783  finish_up:
784   /* If result is negative, make it so.  */
785   if (quo_neg)
786     neg_double (*lquo, *hquo, lquo, hquo);
787
788   /* Compute trial remainder:  rem = num - (quo * den)  */
789   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
790   neg_double (*lrem, *hrem, lrem, hrem);
791   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
792
793   switch (code)
794     {
795     case TRUNC_DIV_EXPR:
796     case TRUNC_MOD_EXPR:        /* round toward zero */
797     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
798       return overflow;
799
800     case FLOOR_DIV_EXPR:
801     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
802       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
803         {
804           /* quo = quo - 1;  */
805           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
806                       lquo, hquo);
807         }
808       else
809         return overflow;
810       break;
811
812     case CEIL_DIV_EXPR:
813     case CEIL_MOD_EXPR:         /* round toward positive infinity */
814       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
815         {
816           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
817                       lquo, hquo);
818         }
819       else
820         return overflow;
821       break;
822
823     case ROUND_DIV_EXPR:
824     case ROUND_MOD_EXPR:        /* round to closest integer */
825       {
826         unsigned HOST_WIDE_INT labs_rem = *lrem;
827         HOST_WIDE_INT habs_rem = *hrem;
828         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
829         HOST_WIDE_INT habs_den = hden, htwice;
830
831         /* Get absolute values.  */
832         if (*hrem < 0)
833           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
834         if (hden < 0)
835           neg_double (lden, hden, &labs_den, &habs_den);
836
837         /* If (2 * abs (lrem) >= abs (lden)) */
838         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
839                     labs_rem, habs_rem, &ltwice, &htwice);
840
841         if (((unsigned HOST_WIDE_INT) habs_den
842              < (unsigned HOST_WIDE_INT) htwice)
843             || (((unsigned HOST_WIDE_INT) habs_den
844                  == (unsigned HOST_WIDE_INT) htwice)
845                 && (labs_den < ltwice)))
846           {
847             if (*hquo < 0)
848               /* quo = quo - 1;  */
849               add_double (*lquo, *hquo,
850                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
851             else
852               /* quo = quo + 1; */
853               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
854                           lquo, hquo);
855           }
856         else
857           return overflow;
858       }
859       break;
860
861     default:
862       gcc_unreachable ();
863     }
864
865   /* Compute true remainder:  rem = num - (quo * den)  */
866   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
867   neg_double (*lrem, *hrem, lrem, hrem);
868   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
869   return overflow;
870 }
871
872 /* If ARG2 divides ARG1 with zero remainder, carries out the division
873    of type CODE and returns the quotient.
874    Otherwise returns NULL_TREE.  */
875
876 static tree
877 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
878 {
879   unsigned HOST_WIDE_INT int1l, int2l;
880   HOST_WIDE_INT int1h, int2h;
881   unsigned HOST_WIDE_INT quol, reml;
882   HOST_WIDE_INT quoh, remh;
883   tree type = TREE_TYPE (arg1);
884   int uns = TYPE_UNSIGNED (type);
885
886   int1l = TREE_INT_CST_LOW (arg1);
887   int1h = TREE_INT_CST_HIGH (arg1);
888   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
889      &obj[some_exotic_number].  */
890   if (POINTER_TYPE_P (type))
891     {
892       uns = false;
893       type = signed_type_for (type);
894       fit_double_type (int1l, int1h, &int1l, &int1h,
895                        type);
896     }
897   else
898     fit_double_type (int1l, int1h, &int1l, &int1h, type);
899   int2l = TREE_INT_CST_LOW (arg2);
900   int2h = TREE_INT_CST_HIGH (arg2);
901
902   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
903                         &quol, &quoh, &reml, &remh);
904   if (remh != 0 || reml != 0)
905     return NULL_TREE;
906
907   return build_int_cst_wide (type, quol, quoh);
908 }
909 \f
910 /* This is nonzero if we should defer warnings about undefined
911    overflow.  This facility exists because these warnings are a
912    special case.  The code to estimate loop iterations does not want
913    to issue any warnings, since it works with expressions which do not
914    occur in user code.  Various bits of cleanup code call fold(), but
915    only use the result if it has certain characteristics (e.g., is a
916    constant); that code only wants to issue a warning if the result is
917    used.  */
918
919 static int fold_deferring_overflow_warnings;
920
921 /* If a warning about undefined overflow is deferred, this is the
922    warning.  Note that this may cause us to turn two warnings into
923    one, but that is fine since it is sufficient to only give one
924    warning per expression.  */
925
926 static const char* fold_deferred_overflow_warning;
927
928 /* If a warning about undefined overflow is deferred, this is the
929    level at which the warning should be emitted.  */
930
931 static enum warn_strict_overflow_code fold_deferred_overflow_code;
932
933 /* Start deferring overflow warnings.  We could use a stack here to
934    permit nested calls, but at present it is not necessary.  */
935
936 void
937 fold_defer_overflow_warnings (void)
938 {
939   ++fold_deferring_overflow_warnings;
940 }
941
942 /* Stop deferring overflow warnings.  If there is a pending warning,
943    and ISSUE is true, then issue the warning if appropriate.  STMT is
944    the statement with which the warning should be associated (used for
945    location information); STMT may be NULL.  CODE is the level of the
946    warning--a warn_strict_overflow_code value.  This function will use
947    the smaller of CODE and the deferred code when deciding whether to
948    issue the warning.  CODE may be zero to mean to always use the
949    deferred code.  */
950
951 void
952 fold_undefer_overflow_warnings (bool issue, const_tree stmt, int code)
953 {
954   const char *warnmsg;
955   location_t locus;
956
957   gcc_assert (fold_deferring_overflow_warnings > 0);
958   --fold_deferring_overflow_warnings;
959   if (fold_deferring_overflow_warnings > 0)
960     {
961       if (fold_deferred_overflow_warning != NULL
962           && code != 0
963           && code < (int) fold_deferred_overflow_code)
964         fold_deferred_overflow_code = code;
965       return;
966     }
967
968   warnmsg = fold_deferred_overflow_warning;
969   fold_deferred_overflow_warning = NULL;
970
971   if (!issue || warnmsg == NULL)
972     return;
973
974   if (stmt != NULL_TREE && TREE_NO_WARNING (stmt))
975     return;
976
977   /* Use the smallest code level when deciding to issue the
978      warning.  */
979   if (code == 0 || code > (int) fold_deferred_overflow_code)
980     code = fold_deferred_overflow_code;
981
982   if (!issue_strict_overflow_warning (code))
983     return;
984
985   if (stmt == NULL_TREE || !expr_has_location (stmt))
986     locus = input_location;
987   else
988     locus = expr_location (stmt);
989   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
990 }
991
992 /* Stop deferring overflow warnings, ignoring any deferred
993    warnings.  */
994
995 void
996 fold_undefer_and_ignore_overflow_warnings (void)
997 {
998   fold_undefer_overflow_warnings (false, NULL_TREE, 0);
999 }
1000
1001 /* Whether we are deferring overflow warnings.  */
1002
1003 bool
1004 fold_deferring_overflow_warnings_p (void)
1005 {
1006   return fold_deferring_overflow_warnings > 0;
1007 }
1008
1009 /* This is called when we fold something based on the fact that signed
1010    overflow is undefined.  */
1011
1012 static void
1013 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1014 {
1015   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   /* Check equality of integer constants before bailing out due to
3030      precision differences.  */
3031   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
3032     return tree_int_cst_equal (arg0, arg1);
3033
3034   /* If both types don't have the same signedness, then we can't consider
3035      them equal.  We must check this before the STRIP_NOPS calls
3036      because they may change the signedness of the arguments.  */
3037   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3038     return 0;
3039
3040   /* If both types don't have the same precision, then it is not safe
3041      to strip NOPs.  */
3042   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3043     return 0;
3044
3045   STRIP_NOPS (arg0);
3046   STRIP_NOPS (arg1);
3047
3048   /* In case both args are comparisons but with different comparison
3049      code, try to swap the comparison operands of one arg to produce
3050      a match and compare that variant.  */
3051   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3052       && COMPARISON_CLASS_P (arg0)
3053       && COMPARISON_CLASS_P (arg1))
3054     {
3055       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3056
3057       if (TREE_CODE (arg0) == swap_code)
3058         return operand_equal_p (TREE_OPERAND (arg0, 0),
3059                                 TREE_OPERAND (arg1, 1), flags)
3060                && operand_equal_p (TREE_OPERAND (arg0, 1),
3061                                    TREE_OPERAND (arg1, 0), flags);
3062     }
3063
3064   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3065       /* This is needed for conversions and for COMPONENT_REF.
3066          Might as well play it safe and always test this.  */
3067       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3068       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3069       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3070     return 0;
3071
3072   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3073      We don't care about side effects in that case because the SAVE_EXPR
3074      takes care of that for us. In all other cases, two expressions are
3075      equal if they have no side effects.  If we have two identical
3076      expressions with side effects that should be treated the same due
3077      to the only side effects being identical SAVE_EXPR's, that will
3078      be detected in the recursive calls below.  */
3079   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3080       && (TREE_CODE (arg0) == SAVE_EXPR
3081           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3082     return 1;
3083
3084   /* Next handle constant cases, those for which we can return 1 even
3085      if ONLY_CONST is set.  */
3086   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3087     switch (TREE_CODE (arg0))
3088       {
3089       case INTEGER_CST:
3090         return tree_int_cst_equal (arg0, arg1);
3091
3092       case FIXED_CST:
3093         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3094                                        TREE_FIXED_CST (arg1));
3095
3096       case REAL_CST:
3097         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3098                                    TREE_REAL_CST (arg1)))
3099           return 1;
3100
3101         
3102         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3103           {
3104             /* If we do not distinguish between signed and unsigned zero,
3105                consider them equal.  */
3106             if (real_zerop (arg0) && real_zerop (arg1))
3107               return 1;
3108           }
3109         return 0;
3110
3111       case VECTOR_CST:
3112         {
3113           tree v1, v2;
3114
3115           v1 = TREE_VECTOR_CST_ELTS (arg0);
3116           v2 = TREE_VECTOR_CST_ELTS (arg1);
3117           while (v1 && v2)
3118             {
3119               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3120                                     flags))
3121                 return 0;
3122               v1 = TREE_CHAIN (v1);
3123               v2 = TREE_CHAIN (v2);
3124             }
3125
3126           return v1 == v2;
3127         }
3128
3129       case COMPLEX_CST:
3130         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3131                                  flags)
3132                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3133                                     flags));
3134
3135       case STRING_CST:
3136         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3137                 && ! memcmp (TREE_STRING_POINTER (arg0),
3138                               TREE_STRING_POINTER (arg1),
3139                               TREE_STRING_LENGTH (arg0)));
3140
3141       case ADDR_EXPR:
3142         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3143                                 0);
3144       default:
3145         break;
3146       }
3147
3148   if (flags & OEP_ONLY_CONST)
3149     return 0;
3150
3151 /* Define macros to test an operand from arg0 and arg1 for equality and a
3152    variant that allows null and views null as being different from any
3153    non-null value.  In the latter case, if either is null, the both
3154    must be; otherwise, do the normal comparison.  */
3155 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3156                                     TREE_OPERAND (arg1, N), flags)
3157
3158 #define OP_SAME_WITH_NULL(N)                            \
3159   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3160    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3161
3162   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3163     {
3164     case tcc_unary:
3165       /* Two conversions are equal only if signedness and modes match.  */
3166       switch (TREE_CODE (arg0))
3167         {
3168         case NOP_EXPR:
3169         case CONVERT_EXPR:
3170         case FIX_TRUNC_EXPR:
3171           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3172               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3173             return 0;
3174           break;
3175         default:
3176           break;
3177         }
3178
3179       return OP_SAME (0);
3180
3181
3182     case tcc_comparison:
3183     case tcc_binary:
3184       if (OP_SAME (0) && OP_SAME (1))
3185         return 1;
3186
3187       /* For commutative ops, allow the other order.  */
3188       return (commutative_tree_code (TREE_CODE (arg0))
3189               && operand_equal_p (TREE_OPERAND (arg0, 0),
3190                                   TREE_OPERAND (arg1, 1), flags)
3191               && operand_equal_p (TREE_OPERAND (arg0, 1),
3192                                   TREE_OPERAND (arg1, 0), flags));
3193
3194     case tcc_reference:
3195       /* If either of the pointer (or reference) expressions we are
3196          dereferencing contain a side effect, these cannot be equal.  */
3197       if (TREE_SIDE_EFFECTS (arg0)
3198           || TREE_SIDE_EFFECTS (arg1))
3199         return 0;
3200
3201       switch (TREE_CODE (arg0))
3202         {
3203         case INDIRECT_REF:
3204         case ALIGN_INDIRECT_REF:
3205         case MISALIGNED_INDIRECT_REF:
3206         case REALPART_EXPR:
3207         case IMAGPART_EXPR:
3208           return OP_SAME (0);
3209
3210         case ARRAY_REF:
3211         case ARRAY_RANGE_REF:
3212           /* Operands 2 and 3 may be null.
3213              Compare the array index by value if it is constant first as we
3214              may have different types but same value here.  */
3215           return (OP_SAME (0)
3216                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3217                                           TREE_OPERAND (arg1, 1))
3218                       || OP_SAME (1))
3219                   && OP_SAME_WITH_NULL (2)
3220                   && OP_SAME_WITH_NULL (3));
3221
3222         case COMPONENT_REF:
3223           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3224              may be NULL when we're called to compare MEM_EXPRs.  */
3225           return OP_SAME_WITH_NULL (0)
3226                  && OP_SAME (1)
3227                  && OP_SAME_WITH_NULL (2);
3228
3229         case BIT_FIELD_REF:
3230           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3231
3232         default:
3233           return 0;
3234         }
3235
3236     case tcc_expression:
3237       switch (TREE_CODE (arg0))
3238         {
3239         case ADDR_EXPR:
3240         case TRUTH_NOT_EXPR:
3241           return OP_SAME (0);
3242
3243         case TRUTH_ANDIF_EXPR:
3244         case TRUTH_ORIF_EXPR:
3245           return OP_SAME (0) && OP_SAME (1);
3246
3247         case TRUTH_AND_EXPR:
3248         case TRUTH_OR_EXPR:
3249         case TRUTH_XOR_EXPR:
3250           if (OP_SAME (0) && OP_SAME (1))
3251             return 1;
3252
3253           /* Otherwise take into account this is a commutative operation.  */
3254           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3255                                    TREE_OPERAND (arg1, 1), flags)
3256                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3257                                       TREE_OPERAND (arg1, 0), flags));
3258
3259         default:
3260           return 0;
3261         }
3262
3263     case tcc_vl_exp:
3264       switch (TREE_CODE (arg0))
3265         {
3266         case CALL_EXPR:
3267           /* If the CALL_EXPRs call different functions, then they
3268              clearly can not be equal.  */
3269           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3270                                  flags))
3271             return 0;
3272
3273           {
3274             unsigned int cef = call_expr_flags (arg0);
3275             if (flags & OEP_PURE_SAME)
3276               cef &= ECF_CONST | ECF_PURE;
3277             else
3278               cef &= ECF_CONST;
3279             if (!cef)
3280               return 0;
3281           }
3282
3283           /* Now see if all the arguments are the same.  */
3284           {
3285             const_call_expr_arg_iterator iter0, iter1;
3286             const_tree a0, a1;
3287             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3288                    a1 = first_const_call_expr_arg (arg1, &iter1);
3289                  a0 && a1;
3290                  a0 = next_const_call_expr_arg (&iter0),
3291                    a1 = next_const_call_expr_arg (&iter1))
3292               if (! operand_equal_p (a0, a1, flags))
3293                 return 0;
3294
3295             /* If we get here and both argument lists are exhausted
3296                then the CALL_EXPRs are equal.  */
3297             return ! (a0 || a1);
3298           }
3299         default:
3300           return 0;
3301         }
3302
3303     case tcc_declaration:
3304       /* Consider __builtin_sqrt equal to sqrt.  */
3305       return (TREE_CODE (arg0) == FUNCTION_DECL
3306               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3307               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3308               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3309
3310     default:
3311       return 0;
3312     }
3313
3314 #undef OP_SAME
3315 #undef OP_SAME_WITH_NULL
3316 }
3317 \f
3318 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3319    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3320
3321    When in doubt, return 0.  */
3322
3323 static int
3324 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3325 {
3326   int unsignedp1, unsignedpo;
3327   tree primarg0, primarg1, primother;
3328   unsigned int correct_width;
3329
3330   if (operand_equal_p (arg0, arg1, 0))
3331     return 1;
3332
3333   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3334       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3335     return 0;
3336
3337   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3338      and see if the inner values are the same.  This removes any
3339      signedness comparison, which doesn't matter here.  */
3340   primarg0 = arg0, primarg1 = arg1;
3341   STRIP_NOPS (primarg0);
3342   STRIP_NOPS (primarg1);
3343   if (operand_equal_p (primarg0, primarg1, 0))
3344     return 1;
3345
3346   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3347      actual comparison operand, ARG0.
3348
3349      First throw away any conversions to wider types
3350      already present in the operands.  */
3351
3352   primarg1 = get_narrower (arg1, &unsignedp1);
3353   primother = get_narrower (other, &unsignedpo);
3354
3355   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3356   if (unsignedp1 == unsignedpo
3357       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3358       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3359     {
3360       tree type = TREE_TYPE (arg0);
3361
3362       /* Make sure shorter operand is extended the right way
3363          to match the longer operand.  */
3364       primarg1 = fold_convert (signed_or_unsigned_type_for
3365                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3366
3367       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3368         return 1;
3369     }
3370
3371   return 0;
3372 }
3373 \f
3374 /* See if ARG is an expression that is either a comparison or is performing
3375    arithmetic on comparisons.  The comparisons must only be comparing
3376    two different values, which will be stored in *CVAL1 and *CVAL2; if
3377    they are nonzero it means that some operands have already been found.
3378    No variables may be used anywhere else in the expression except in the
3379    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3380    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3381
3382    If this is true, return 1.  Otherwise, return zero.  */
3383
3384 static int
3385 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3386 {
3387   enum tree_code code = TREE_CODE (arg);
3388   enum tree_code_class class = TREE_CODE_CLASS (code);
3389
3390   /* We can handle some of the tcc_expression cases here.  */
3391   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3392     class = tcc_unary;
3393   else if (class == tcc_expression
3394            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3395                || code == COMPOUND_EXPR))
3396     class = tcc_binary;
3397
3398   else if (class == tcc_expression && code == SAVE_EXPR
3399            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3400     {
3401       /* If we've already found a CVAL1 or CVAL2, this expression is
3402          two complex to handle.  */
3403       if (*cval1 || *cval2)
3404         return 0;
3405
3406       class = tcc_unary;
3407       *save_p = 1;
3408     }
3409
3410   switch (class)
3411     {
3412     case tcc_unary:
3413       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3414
3415     case tcc_binary:
3416       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3417               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3418                                       cval1, cval2, save_p));
3419
3420     case tcc_constant:
3421       return 1;
3422
3423     case tcc_expression:
3424       if (code == COND_EXPR)
3425         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3426                                      cval1, cval2, save_p)
3427                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3428                                         cval1, cval2, save_p)
3429                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3430                                         cval1, cval2, save_p));
3431       return 0;
3432
3433     case tcc_comparison:
3434       /* First see if we can handle the first operand, then the second.  For
3435          the second operand, we know *CVAL1 can't be zero.  It must be that
3436          one side of the comparison is each of the values; test for the
3437          case where this isn't true by failing if the two operands
3438          are the same.  */
3439
3440       if (operand_equal_p (TREE_OPERAND (arg, 0),
3441                            TREE_OPERAND (arg, 1), 0))
3442         return 0;
3443
3444       if (*cval1 == 0)
3445         *cval1 = TREE_OPERAND (arg, 0);
3446       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3447         ;
3448       else if (*cval2 == 0)
3449         *cval2 = TREE_OPERAND (arg, 0);
3450       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3451         ;
3452       else
3453         return 0;
3454
3455       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3456         ;
3457       else if (*cval2 == 0)
3458         *cval2 = TREE_OPERAND (arg, 1);
3459       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3460         ;
3461       else
3462         return 0;
3463
3464       return 1;
3465
3466     default:
3467       return 0;
3468     }
3469 }
3470 \f
3471 /* ARG is a tree that is known to contain just arithmetic operations and
3472    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3473    any occurrence of OLD0 as an operand of a comparison and likewise for
3474    NEW1 and OLD1.  */
3475
3476 static tree
3477 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3478 {
3479   tree type = TREE_TYPE (arg);
3480   enum tree_code code = TREE_CODE (arg);
3481   enum tree_code_class class = TREE_CODE_CLASS (code);
3482
3483   /* We can handle some of the tcc_expression cases here.  */
3484   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3485     class = tcc_unary;
3486   else if (class == tcc_expression
3487            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3488     class = tcc_binary;
3489
3490   switch (class)
3491     {
3492     case tcc_unary:
3493       return fold_build1 (code, type,
3494                           eval_subst (TREE_OPERAND (arg, 0),
3495                                       old0, new0, old1, new1));
3496
3497     case tcc_binary:
3498       return fold_build2 (code, type,
3499                           eval_subst (TREE_OPERAND (arg, 0),
3500                                       old0, new0, old1, new1),
3501                           eval_subst (TREE_OPERAND (arg, 1),
3502                                       old0, new0, old1, new1));
3503
3504     case tcc_expression:
3505       switch (code)
3506         {
3507         case SAVE_EXPR:
3508           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3509
3510         case COMPOUND_EXPR:
3511           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3512
3513         case COND_EXPR:
3514           return fold_build3 (code, type,
3515                               eval_subst (TREE_OPERAND (arg, 0),
3516                                           old0, new0, old1, new1),
3517                               eval_subst (TREE_OPERAND (arg, 1),
3518                                           old0, new0, old1, new1),
3519                               eval_subst (TREE_OPERAND (arg, 2),
3520                                           old0, new0, old1, new1));
3521         default:
3522           break;
3523         }
3524       /* Fall through - ???  */
3525
3526     case tcc_comparison:
3527       {
3528         tree arg0 = TREE_OPERAND (arg, 0);
3529         tree arg1 = TREE_OPERAND (arg, 1);
3530
3531         /* We need to check both for exact equality and tree equality.  The
3532            former will be true if the operand has a side-effect.  In that
3533            case, we know the operand occurred exactly once.  */
3534
3535         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3536           arg0 = new0;
3537         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3538           arg0 = new1;
3539
3540         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3541           arg1 = new0;
3542         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3543           arg1 = new1;
3544
3545         return fold_build2 (code, type, arg0, arg1);
3546       }
3547
3548     default:
3549       return arg;
3550     }
3551 }
3552 \f
3553 /* Return a tree for the case when the result of an expression is RESULT
3554    converted to TYPE and OMITTED was previously an operand of the expression
3555    but is now not needed (e.g., we folded OMITTED * 0).
3556
3557    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3558    the conversion of RESULT to TYPE.  */
3559
3560 tree
3561 omit_one_operand (tree type, tree result, tree omitted)
3562 {
3563   tree t = fold_convert (type, result);
3564
3565   /* If the resulting operand is an empty statement, just return the omitted
3566      statement casted to void. */
3567   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3568     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3569
3570   if (TREE_SIDE_EFFECTS (omitted))
3571     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3572
3573   return non_lvalue (t);
3574 }
3575
3576 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3577
3578 static tree
3579 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3580 {
3581   tree t = fold_convert (type, result);
3582
3583   /* If the resulting operand is an empty statement, just return the omitted
3584      statement casted to void. */
3585   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3586     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3587
3588   if (TREE_SIDE_EFFECTS (omitted))
3589     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3590
3591   return pedantic_non_lvalue (t);
3592 }
3593
3594 /* Return a tree for the case when the result of an expression is RESULT
3595    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3596    of the expression but are now not needed.
3597
3598    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3599    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3600    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3601    just do the conversion of RESULT to TYPE.  */
3602
3603 tree
3604 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3605 {
3606   tree t = fold_convert (type, result);
3607
3608   if (TREE_SIDE_EFFECTS (omitted2))
3609     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3610   if (TREE_SIDE_EFFECTS (omitted1))
3611     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3612
3613   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3614 }
3615
3616 \f
3617 /* Return a simplified tree node for the truth-negation of ARG.  This
3618    never alters ARG itself.  We assume that ARG is an operation that
3619    returns a truth value (0 or 1).
3620
3621    FIXME: one would think we would fold the result, but it causes
3622    problems with the dominator optimizer.  */
3623
3624 tree
3625 fold_truth_not_expr (tree arg)
3626 {
3627   tree type = TREE_TYPE (arg);
3628   enum tree_code code = TREE_CODE (arg);
3629
3630   /* If this is a comparison, we can simply invert it, except for
3631      floating-point non-equality comparisons, in which case we just
3632      enclose a TRUTH_NOT_EXPR around what we have.  */
3633
3634   if (TREE_CODE_CLASS (code) == tcc_comparison)
3635     {
3636       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3637       if (FLOAT_TYPE_P (op_type)
3638           && flag_trapping_math
3639           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3640           && code != NE_EXPR && code != EQ_EXPR)
3641         return NULL_TREE;
3642       else
3643         {
3644           code = invert_tree_comparison (code,
3645                                          HONOR_NANS (TYPE_MODE (op_type)));
3646           if (code == ERROR_MARK)
3647             return NULL_TREE;
3648           else
3649             return build2 (code, type,
3650                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3651         }
3652     }
3653
3654   switch (code)
3655     {
3656     case INTEGER_CST:
3657       return constant_boolean_node (integer_zerop (arg), type);
3658
3659     case TRUTH_AND_EXPR:
3660       return build2 (TRUTH_OR_EXPR, type,
3661                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3662                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3663
3664     case TRUTH_OR_EXPR:
3665       return build2 (TRUTH_AND_EXPR, type,
3666                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3667                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3668
3669     case TRUTH_XOR_EXPR:
3670       /* Here we can invert either operand.  We invert the first operand
3671          unless the second operand is a TRUTH_NOT_EXPR in which case our
3672          result is the XOR of the first operand with the inside of the
3673          negation of the second operand.  */
3674
3675       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3676         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3677                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3678       else
3679         return build2 (TRUTH_XOR_EXPR, type,
3680                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3681                        TREE_OPERAND (arg, 1));
3682
3683     case TRUTH_ANDIF_EXPR:
3684       return build2 (TRUTH_ORIF_EXPR, type,
3685                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3686                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3687
3688     case TRUTH_ORIF_EXPR:
3689       return build2 (TRUTH_ANDIF_EXPR, type,
3690                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3691                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3692
3693     case TRUTH_NOT_EXPR:
3694       return TREE_OPERAND (arg, 0);
3695
3696     case COND_EXPR:
3697       {
3698         tree arg1 = TREE_OPERAND (arg, 1);
3699         tree arg2 = TREE_OPERAND (arg, 2);
3700         /* A COND_EXPR may have a throw as one operand, which
3701            then has void type.  Just leave void operands
3702            as they are.  */
3703         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3704                        VOID_TYPE_P (TREE_TYPE (arg1))
3705                        ? arg1 : invert_truthvalue (arg1),
3706                        VOID_TYPE_P (TREE_TYPE (arg2))
3707                        ? arg2 : invert_truthvalue (arg2));
3708       }
3709
3710     case COMPOUND_EXPR:
3711       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3712                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3713
3714     case NON_LVALUE_EXPR:
3715       return invert_truthvalue (TREE_OPERAND (arg, 0));
3716
3717     case NOP_EXPR:
3718       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3719         return build1 (TRUTH_NOT_EXPR, type, arg);
3720
3721     case CONVERT_EXPR:
3722     case FLOAT_EXPR:
3723       return build1 (TREE_CODE (arg), type,
3724                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3725
3726     case BIT_AND_EXPR:
3727       if (!integer_onep (TREE_OPERAND (arg, 1)))
3728         break;
3729       return build2 (EQ_EXPR, type, arg,
3730                      build_int_cst (type, 0));
3731
3732     case SAVE_EXPR:
3733       return build1 (TRUTH_NOT_EXPR, type, arg);
3734
3735     case CLEANUP_POINT_EXPR:
3736       return build1 (CLEANUP_POINT_EXPR, type,
3737                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3738
3739     default:
3740       break;
3741     }
3742
3743   return NULL_TREE;
3744 }
3745
3746 /* Return a simplified tree node for the truth-negation of ARG.  This
3747    never alters ARG itself.  We assume that ARG is an operation that
3748    returns a truth value (0 or 1).
3749
3750    FIXME: one would think we would fold the result, but it causes
3751    problems with the dominator optimizer.  */
3752
3753 tree
3754 invert_truthvalue (tree arg)
3755 {
3756   tree tem;
3757
3758   if (TREE_CODE (arg) == ERROR_MARK)
3759     return arg;
3760
3761   tem = fold_truth_not_expr (arg);
3762   if (!tem)
3763     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3764
3765   return tem;
3766 }
3767
3768 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3769    operands are another bit-wise operation with a common input.  If so,
3770    distribute the bit operations to save an operation and possibly two if
3771    constants are involved.  For example, convert
3772         (A | B) & (A | C) into A | (B & C)
3773    Further simplification will occur if B and C are constants.
3774
3775    If this optimization cannot be done, 0 will be returned.  */
3776
3777 static tree
3778 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3779 {
3780   tree common;
3781   tree left, right;
3782
3783   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3784       || TREE_CODE (arg0) == code
3785       || (TREE_CODE (arg0) != BIT_AND_EXPR
3786           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3787     return 0;
3788
3789   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3790     {
3791       common = TREE_OPERAND (arg0, 0);
3792       left = TREE_OPERAND (arg0, 1);
3793       right = TREE_OPERAND (arg1, 1);
3794     }
3795   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3796     {
3797       common = TREE_OPERAND (arg0, 0);
3798       left = TREE_OPERAND (arg0, 1);
3799       right = TREE_OPERAND (arg1, 0);
3800     }
3801   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3802     {
3803       common = TREE_OPERAND (arg0, 1);
3804       left = TREE_OPERAND (arg0, 0);
3805       right = TREE_OPERAND (arg1, 1);
3806     }
3807   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3808     {
3809       common = TREE_OPERAND (arg0, 1);
3810       left = TREE_OPERAND (arg0, 0);
3811       right = TREE_OPERAND (arg1, 0);
3812     }
3813   else
3814     return 0;
3815
3816   return fold_build2 (TREE_CODE (arg0), type, common,
3817                       fold_build2 (code, type, left, right));
3818 }
3819
3820 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3821    with code CODE.  This optimization is unsafe.  */
3822 static tree
3823 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3824 {
3825   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3826   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3827
3828   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3829   if (mul0 == mul1
3830       && operand_equal_p (TREE_OPERAND (arg0, 1),
3831                        TREE_OPERAND (arg1, 1), 0))
3832     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3833                         fold_build2 (code, type,
3834                                      TREE_OPERAND (arg0, 0),
3835                                      TREE_OPERAND (arg1, 0)),
3836                         TREE_OPERAND (arg0, 1));
3837
3838   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3839   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3840                        TREE_OPERAND (arg1, 0), 0)
3841       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3842       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3843     {
3844       REAL_VALUE_TYPE r0, r1;
3845       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3846       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3847       if (!mul0)
3848         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3849       if (!mul1)
3850         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3851       real_arithmetic (&r0, code, &r0, &r1);
3852       return fold_build2 (MULT_EXPR, type,
3853                           TREE_OPERAND (arg0, 0),
3854                           build_real (type, r0));
3855     }
3856
3857   return NULL_TREE;
3858 }
3859 \f
3860 /* Subroutine for fold_truthop: decode a field reference.
3861
3862    If EXP is a comparison reference, we return the innermost reference.
3863
3864    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3865    set to the starting bit number.
3866
3867    If the innermost field can be completely contained in a mode-sized
3868    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3869
3870    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3871    otherwise it is not changed.
3872
3873    *PUNSIGNEDP is set to the signedness of the field.
3874
3875    *PMASK is set to the mask used.  This is either contained in a
3876    BIT_AND_EXPR or derived from the width of the field.
3877
3878    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3879
3880    Return 0 if this is not a component reference or is one that we can't
3881    do anything with.  */
3882
3883 static tree
3884 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3885                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3886                         int *punsignedp, int *pvolatilep,
3887                         tree *pmask, tree *pand_mask)
3888 {
3889   tree outer_type = 0;
3890   tree and_mask = 0;
3891   tree mask, inner, offset;
3892   tree unsigned_type;
3893   unsigned int precision;
3894
3895   /* All the optimizations using this function assume integer fields.
3896      There are problems with FP fields since the type_for_size call
3897      below can fail for, e.g., XFmode.  */
3898   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3899     return 0;
3900
3901   /* We are interested in the bare arrangement of bits, so strip everything
3902      that doesn't affect the machine mode.  However, record the type of the
3903      outermost expression if it may matter below.  */
3904   if (TREE_CODE (exp) == NOP_EXPR
3905       || TREE_CODE (exp) == CONVERT_EXPR
3906       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3907     outer_type = TREE_TYPE (exp);
3908   STRIP_NOPS (exp);
3909
3910   if (TREE_CODE (exp) == BIT_AND_EXPR)
3911     {
3912       and_mask = TREE_OPERAND (exp, 1);
3913       exp = TREE_OPERAND (exp, 0);
3914       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3915       if (TREE_CODE (and_mask) != INTEGER_CST)
3916         return 0;
3917     }
3918
3919   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3920                                punsignedp, pvolatilep, false);
3921   if ((inner == exp && and_mask == 0)
3922       || *pbitsize < 0 || offset != 0
3923       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3924     return 0;
3925
3926   /* If the number of bits in the reference is the same as the bitsize of
3927      the outer type, then the outer type gives the signedness. Otherwise
3928      (in case of a small bitfield) the signedness is unchanged.  */
3929   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3930     *punsignedp = TYPE_UNSIGNED (outer_type);
3931
3932   /* Compute the mask to access the bitfield.  */
3933   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3934   precision = TYPE_PRECISION (unsigned_type);
3935
3936   mask = build_int_cst_type (unsigned_type, -1);
3937
3938   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3939   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3940
3941   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3942   if (and_mask != 0)
3943     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3944                         fold_convert (unsigned_type, and_mask), mask);
3945
3946   *pmask = mask;
3947   *pand_mask = and_mask;
3948   return inner;
3949 }
3950
3951 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3952    represents the sign bit of EXP's type.  If EXP represents a sign
3953    or zero extension, also test VAL against the unextended type.
3954    The return value is the (sub)expression whose sign bit is VAL,
3955    or NULL_TREE otherwise.  */
3956
3957 static tree
3958 sign_bit_p (tree exp, const_tree val)
3959 {
3960   unsigned HOST_WIDE_INT mask_lo, lo;
3961   HOST_WIDE_INT mask_hi, hi;
3962   int width;
3963   tree t;
3964
3965   /* Tree EXP must have an integral type.  */
3966   t = TREE_TYPE (exp);
3967   if (! INTEGRAL_TYPE_P (t))
3968     return NULL_TREE;
3969
3970   /* Tree VAL must be an integer constant.  */
3971   if (TREE_CODE (val) != INTEGER_CST
3972       || TREE_OVERFLOW (val))
3973     return NULL_TREE;
3974
3975   width = TYPE_PRECISION (t);
3976   if (width > HOST_BITS_PER_WIDE_INT)
3977     {
3978       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3979       lo = 0;
3980
3981       mask_hi = ((unsigned HOST_WIDE_INT) -1
3982                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3983       mask_lo = -1;
3984     }
3985   else
3986     {
3987       hi = 0;
3988       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3989
3990       mask_hi = 0;
3991       mask_lo = ((unsigned HOST_WIDE_INT) -1
3992                  >> (HOST_BITS_PER_WIDE_INT - width));
3993     }
3994
3995   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3996      treat VAL as if it were unsigned.  */
3997   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3998       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3999     return exp;
4000
4001   /* Handle extension from a narrower type.  */
4002   if (TREE_CODE (exp) == NOP_EXPR
4003       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4004     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4005
4006   return NULL_TREE;
4007 }
4008
4009 /* Subroutine for fold_truthop: determine if an operand is simple enough
4010    to be evaluated unconditionally.  */
4011
4012 static int
4013 simple_operand_p (const_tree exp)
4014 {
4015   /* Strip any conversions that don't change the machine mode.  */
4016   STRIP_NOPS (exp);
4017
4018   return (CONSTANT_CLASS_P (exp)
4019           || TREE_CODE (exp) == SSA_NAME
4020           || (DECL_P (exp)
4021               && ! TREE_ADDRESSABLE (exp)
4022               && ! TREE_THIS_VOLATILE (exp)
4023               && ! DECL_NONLOCAL (exp)
4024               /* Don't regard global variables as simple.  They may be
4025                  allocated in ways unknown to the compiler (shared memory,
4026                  #pragma weak, etc).  */
4027               && ! TREE_PUBLIC (exp)
4028               && ! DECL_EXTERNAL (exp)
4029               /* Loading a static variable is unduly expensive, but global
4030                  registers aren't expensive.  */
4031               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4032 }
4033 \f
4034 /* The following functions are subroutines to fold_range_test and allow it to
4035    try to change a logical combination of comparisons into a range test.
4036
4037    For example, both
4038         X == 2 || X == 3 || X == 4 || X == 5
4039    and
4040         X >= 2 && X <= 5
4041    are converted to
4042         (unsigned) (X - 2) <= 3
4043
4044    We describe each set of comparisons as being either inside or outside
4045    a range, using a variable named like IN_P, and then describe the
4046    range with a lower and upper bound.  If one of the bounds is omitted,
4047    it represents either the highest or lowest value of the type.
4048
4049    In the comments below, we represent a range by two numbers in brackets
4050    preceded by a "+" to designate being inside that range, or a "-" to
4051    designate being outside that range, so the condition can be inverted by
4052    flipping the prefix.  An omitted bound is represented by a "-".  For
4053    example, "- [-, 10]" means being outside the range starting at the lowest
4054    possible value and ending at 10, in other words, being greater than 10.
4055    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4056    always false.
4057
4058    We set up things so that the missing bounds are handled in a consistent
4059    manner so neither a missing bound nor "true" and "false" need to be
4060    handled using a special case.  */
4061
4062 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4063    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4064    and UPPER1_P are nonzero if the respective argument is an upper bound
4065    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4066    must be specified for a comparison.  ARG1 will be converted to ARG0's
4067    type if both are specified.  */
4068
4069 static tree
4070 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4071              tree arg1, int upper1_p)
4072 {
4073   tree tem;
4074   int result;
4075   int sgn0, sgn1;
4076
4077   /* If neither arg represents infinity, do the normal operation.
4078      Else, if not a comparison, return infinity.  Else handle the special
4079      comparison rules. Note that most of the cases below won't occur, but
4080      are handled for consistency.  */
4081
4082   if (arg0 != 0 && arg1 != 0)
4083     {
4084       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4085                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4086       STRIP_NOPS (tem);
4087       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4088     }
4089
4090   if (TREE_CODE_CLASS (code) != tcc_comparison)
4091     return 0;
4092
4093   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4094      for neither.  In real maths, we cannot assume open ended ranges are
4095      the same. But, this is computer arithmetic, where numbers are finite.
4096      We can therefore make the transformation of any unbounded range with
4097      the value Z, Z being greater than any representable number. This permits
4098      us to treat unbounded ranges as equal.  */
4099   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4100   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4101   switch (code)
4102     {
4103     case EQ_EXPR:
4104       result = sgn0 == sgn1;
4105       break;
4106     case NE_EXPR:
4107       result = sgn0 != sgn1;
4108       break;
4109     case LT_EXPR:
4110       result = sgn0 < sgn1;
4111       break;
4112     case LE_EXPR:
4113       result = sgn0 <= sgn1;
4114       break;
4115     case GT_EXPR:
4116       result = sgn0 > sgn1;
4117       break;
4118     case GE_EXPR:
4119       result = sgn0 >= sgn1;
4120       break;
4121     default:
4122       gcc_unreachable ();
4123     }
4124
4125   return constant_boolean_node (result, type);
4126 }
4127 \f
4128 /* Given EXP, a logical expression, set the range it is testing into
4129    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4130    actually being tested.  *PLOW and *PHIGH will be made of the same
4131    type as the returned expression.  If EXP is not a comparison, we
4132    will most likely not be returning a useful value and range.  Set
4133    *STRICT_OVERFLOW_P to true if the return value is only valid
4134    because signed overflow is undefined; otherwise, do not change
4135    *STRICT_OVERFLOW_P.  */
4136
4137 static tree
4138 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4139             bool *strict_overflow_p)
4140 {
4141   enum tree_code code;
4142   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4143   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4144   int in_p, n_in_p;
4145   tree low, high, n_low, n_high;
4146
4147   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4148      and see if we can refine the range.  Some of the cases below may not
4149      happen, but it doesn't seem worth worrying about this.  We "continue"
4150      the outer loop when we've changed something; otherwise we "break"
4151      the switch, which will "break" the while.  */
4152
4153   in_p = 0;
4154   low = high = build_int_cst (TREE_TYPE (exp), 0);
4155
4156   while (1)
4157     {
4158       code = TREE_CODE (exp);
4159       exp_type = TREE_TYPE (exp);
4160
4161       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4162         {
4163           if (TREE_OPERAND_LENGTH (exp) > 0)
4164             arg0 = TREE_OPERAND (exp, 0);
4165           if (TREE_CODE_CLASS (code) == tcc_comparison
4166               || TREE_CODE_CLASS (code) == tcc_unary
4167               || TREE_CODE_CLASS (code) == tcc_binary)
4168             arg0_type = TREE_TYPE (arg0);
4169           if (TREE_CODE_CLASS (code) == tcc_binary
4170               || TREE_CODE_CLASS (code) == tcc_comparison
4171               || (TREE_CODE_CLASS (code) == tcc_expression
4172                   && TREE_OPERAND_LENGTH (exp) > 1))
4173             arg1 = TREE_OPERAND (exp, 1);
4174         }
4175
4176       switch (code)
4177         {
4178         case TRUTH_NOT_EXPR:
4179           in_p = ! in_p, exp = arg0;
4180           continue;
4181
4182         case EQ_EXPR: case NE_EXPR:
4183         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4184           /* We can only do something if the range is testing for zero
4185              and if the second operand is an integer constant.  Note that
4186              saying something is "in" the range we make is done by
4187              complementing IN_P since it will set in the initial case of
4188              being not equal to zero; "out" is leaving it alone.  */
4189           if (low == 0 || high == 0
4190               || ! integer_zerop (low) || ! integer_zerop (high)
4191               || TREE_CODE (arg1) != INTEGER_CST)
4192             break;
4193
4194           switch (code)
4195             {
4196             case NE_EXPR:  /* - [c, c]  */
4197               low = high = arg1;
4198               break;
4199             case EQ_EXPR:  /* + [c, c]  */
4200               in_p = ! in_p, low = high = arg1;
4201               break;
4202             case GT_EXPR:  /* - [-, c] */
4203               low = 0, high = arg1;
4204               break;
4205             case GE_EXPR:  /* + [c, -] */
4206               in_p = ! in_p, low = arg1, high = 0;
4207               break;
4208             case LT_EXPR:  /* - [c, -] */
4209               low = arg1, high = 0;
4210               break;
4211             case LE_EXPR:  /* + [-, c] */
4212               in_p = ! in_p, low = 0, high = arg1;
4213               break;
4214             default:
4215               gcc_unreachable ();
4216             }
4217
4218           /* If this is an unsigned comparison, we also know that EXP is
4219              greater than or equal to zero.  We base the range tests we make
4220              on that fact, so we record it here so we can parse existing
4221              range tests.  We test arg0_type since often the return type
4222              of, e.g. EQ_EXPR, is boolean.  */
4223           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4224             {
4225               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4226                                   in_p, low, high, 1,
4227                                   build_int_cst (arg0_type, 0),
4228                                   NULL_TREE))
4229                 break;
4230
4231               in_p = n_in_p, low = n_low, high = n_high;
4232
4233               /* If the high bound is missing, but we have a nonzero low
4234                  bound, reverse the range so it goes from zero to the low bound
4235                  minus 1.  */
4236               if (high == 0 && low && ! integer_zerop (low))
4237                 {
4238                   in_p = ! in_p;
4239                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4240                                       integer_one_node, 0);
4241                   low = build_int_cst (arg0_type, 0);
4242                 }
4243             }
4244
4245           exp = arg0;
4246           continue;
4247
4248         case NEGATE_EXPR:
4249           /* (-x) IN [a,b] -> x in [-b, -a]  */
4250           n_low = range_binop (MINUS_EXPR, exp_type,
4251                                build_int_cst (exp_type, 0),
4252                                0, high, 1);
4253           n_high = range_binop (MINUS_EXPR, exp_type,
4254                                 build_int_cst (exp_type, 0),
4255                                 0, low, 0);
4256           low = n_low, high = n_high;
4257           exp = arg0;
4258           continue;
4259
4260         case BIT_NOT_EXPR:
4261           /* ~ X -> -X - 1  */
4262           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4263                         build_int_cst (exp_type, 1));
4264           continue;
4265
4266         case PLUS_EXPR:  case MINUS_EXPR:
4267           if (TREE_CODE (arg1) != INTEGER_CST)
4268             break;
4269
4270           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4271              move a constant to the other side.  */
4272           if (!TYPE_UNSIGNED (arg0_type)
4273               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4274             break;
4275
4276           /* If EXP is signed, any overflow in the computation is undefined,
4277              so we don't worry about it so long as our computations on
4278              the bounds don't overflow.  For unsigned, overflow is defined
4279              and this is exactly the right thing.  */
4280           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4281                                arg0_type, low, 0, arg1, 0);
4282           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4283                                 arg0_type, high, 1, arg1, 0);
4284           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4285               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4286             break;
4287
4288           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4289             *strict_overflow_p = true;
4290
4291           /* Check for an unsigned range which has wrapped around the maximum
4292              value thus making n_high < n_low, and normalize it.  */
4293           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4294             {
4295               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4296                                  integer_one_node, 0);
4297               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4298                                   integer_one_node, 0);
4299
4300               /* If the range is of the form +/- [ x+1, x ], we won't
4301                  be able to normalize it.  But then, it represents the
4302                  whole range or the empty set, so make it
4303                  +/- [ -, - ].  */
4304               if (tree_int_cst_equal (n_low, low)
4305                   && tree_int_cst_equal (n_high, high))
4306                 low = high = 0;
4307               else
4308                 in_p = ! in_p;
4309             }
4310           else
4311             low = n_low, high = n_high;
4312
4313           exp = arg0;
4314           continue;
4315
4316         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
4317           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4318             break;
4319
4320           if (! INTEGRAL_TYPE_P (arg0_type)
4321               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4322               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4323             break;
4324
4325           n_low = low, n_high = high;
4326
4327           if (n_low != 0)
4328             n_low = fold_convert (arg0_type, n_low);
4329
4330           if (n_high != 0)
4331             n_high = fold_convert (arg0_type, n_high);
4332
4333
4334           /* If we're converting arg0 from an unsigned type, to exp,
4335              a signed type,  we will be doing the comparison as unsigned.
4336              The tests above have already verified that LOW and HIGH
4337              are both positive.
4338
4339              So we have to ensure that we will handle large unsigned
4340              values the same way that the current signed bounds treat
4341              negative values.  */
4342
4343           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4344             {
4345               tree high_positive;
4346               tree equiv_type;
4347               /* For fixed-point modes, we need to pass the saturating flag
4348                  as the 2nd parameter.  */
4349               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4350                 equiv_type = lang_hooks.types.type_for_mode
4351                              (TYPE_MODE (arg0_type),
4352                               TYPE_SATURATING (arg0_type));
4353               else
4354                 equiv_type = lang_hooks.types.type_for_mode
4355                              (TYPE_MODE (arg0_type), 1);
4356
4357               /* A range without an upper bound is, naturally, unbounded.
4358                  Since convert would have cropped a very large value, use
4359                  the max value for the destination type.  */
4360               high_positive
4361                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4362                 : TYPE_MAX_VALUE (arg0_type);
4363
4364               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4365                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4366                                              fold_convert (arg0_type,
4367                                                            high_positive),
4368                                              build_int_cst (arg0_type, 1));
4369
4370               /* If the low bound is specified, "and" the range with the
4371                  range for which the original unsigned value will be
4372                  positive.  */
4373               if (low != 0)
4374                 {
4375                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4376                                       1, n_low, n_high, 1,
4377                                       fold_convert (arg0_type,
4378                                                     integer_zero_node),
4379                                       high_positive))
4380                     break;
4381
4382                   in_p = (n_in_p == in_p);
4383                 }
4384               else
4385                 {
4386                   /* Otherwise, "or" the range with the range of the input
4387                      that will be interpreted as negative.  */
4388                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4389                                       0, n_low, n_high, 1,
4390                                       fold_convert (arg0_type,
4391                                                     integer_zero_node),
4392                                       high_positive))
4393                     break;
4394
4395                   in_p = (in_p != n_in_p);
4396                 }
4397             }
4398
4399           exp = arg0;
4400           low = n_low, high = n_high;
4401           continue;
4402
4403         default:
4404           break;
4405         }
4406
4407       break;
4408     }
4409
4410   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4411   if (TREE_CODE (exp) == INTEGER_CST)
4412     {
4413       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4414                                                  exp, 0, low, 0))
4415                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4416                                                     exp, 1, high, 1)));
4417       low = high = 0;
4418       exp = 0;
4419     }
4420
4421   *pin_p = in_p, *plow = low, *phigh = high;
4422   return exp;
4423 }
4424 \f
4425 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4426    type, TYPE, return an expression to test if EXP is in (or out of, depending
4427    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4428
4429 static tree
4430 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4431 {
4432   tree etype = TREE_TYPE (exp);
4433   tree value;
4434
4435 #ifdef HAVE_canonicalize_funcptr_for_compare
4436   /* Disable this optimization for function pointer expressions
4437      on targets that require function pointer canonicalization.  */
4438   if (HAVE_canonicalize_funcptr_for_compare
4439       && TREE_CODE (etype) == POINTER_TYPE
4440       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4441     return NULL_TREE;
4442 #endif
4443
4444   if (! in_p)
4445     {
4446       value = build_range_check (type, exp, 1, low, high);
4447       if (value != 0)
4448         return invert_truthvalue (value);
4449
4450       return 0;
4451     }
4452
4453   if (low == 0 && high == 0)
4454     return build_int_cst (type, 1);
4455
4456   if (low == 0)
4457     return fold_build2 (LE_EXPR, type, exp,
4458                         fold_convert (etype, high));
4459
4460   if (high == 0)
4461     return fold_build2 (GE_EXPR, type, exp,
4462                         fold_convert (etype, low));
4463
4464   if (operand_equal_p (low, high, 0))
4465     return fold_build2 (EQ_EXPR, type, exp,
4466                         fold_convert (etype, low));
4467
4468   if (integer_zerop (low))
4469     {
4470       if (! TYPE_UNSIGNED (etype))
4471         {
4472           etype = unsigned_type_for (etype);
4473           high = fold_convert (etype, high);
4474           exp = fold_convert (etype, exp);
4475         }
4476       return build_range_check (type, exp, 1, 0, high);
4477     }
4478
4479   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4480   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4481     {
4482       unsigned HOST_WIDE_INT lo;
4483       HOST_WIDE_INT hi;
4484       int prec;
4485
4486       prec = TYPE_PRECISION (etype);
4487       if (prec <= HOST_BITS_PER_WIDE_INT)
4488         {
4489           hi = 0;
4490           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4491         }
4492       else
4493         {
4494           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4495           lo = (unsigned HOST_WIDE_INT) -1;
4496         }
4497
4498       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4499         {
4500           if (TYPE_UNSIGNED (etype))
4501             {
4502               etype = signed_type_for (etype);
4503               exp = fold_convert (etype, exp);
4504             }
4505           return fold_build2 (GT_EXPR, type, exp,
4506                               build_int_cst (etype, 0));
4507         }
4508     }
4509
4510   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4511      This requires wrap-around arithmetics for the type of the expression.  */
4512   switch (TREE_CODE (etype))
4513     {
4514     case INTEGER_TYPE:
4515       /* There is no requirement that LOW be within the range of ETYPE
4516          if the latter is a subtype.  It must, however, be within the base
4517          type of ETYPE.  So be sure we do the subtraction in that type.  */
4518       if (TREE_TYPE (etype))
4519         etype = TREE_TYPE (etype);
4520       break;
4521
4522     case ENUMERAL_TYPE:
4523     case BOOLEAN_TYPE:
4524       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4525                                               TYPE_UNSIGNED (etype));
4526       break;
4527
4528     default:
4529       break;
4530     }
4531
4532   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4533   if (TREE_CODE (etype) == INTEGER_TYPE
4534       && !TYPE_OVERFLOW_WRAPS (etype))
4535     {
4536       tree utype, minv, maxv;
4537
4538       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4539          for the type in question, as we rely on this here.  */
4540       utype = unsigned_type_for (etype);
4541       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4542       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4543                           integer_one_node, 1);
4544       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4545
4546       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4547                                       minv, 1, maxv, 1)))
4548         etype = utype;
4549       else
4550         return 0;
4551     }
4552
4553   high = fold_convert (etype, high);
4554   low = fold_convert (etype, low);
4555   exp = fold_convert (etype, exp);
4556
4557   value = const_binop (MINUS_EXPR, high, low, 0);
4558
4559
4560   if (POINTER_TYPE_P (etype))
4561     {
4562       if (value != 0 && !TREE_OVERFLOW (value))
4563         {
4564           low = fold_convert (sizetype, low);
4565           low = fold_build1 (NEGATE_EXPR, sizetype, low);
4566           return build_range_check (type,
4567                                     fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4568                                     1, build_int_cst (etype, 0), value);
4569         }
4570       return 0;
4571     }
4572
4573   if (value != 0 && !TREE_OVERFLOW (value))
4574     return build_range_check (type,
4575                               fold_build2 (MINUS_EXPR, etype, exp, low),
4576                               1, build_int_cst (etype, 0), value);
4577
4578   return 0;
4579 }
4580 \f
4581 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4582
4583 static tree
4584 range_predecessor (tree val)
4585 {
4586   tree type = TREE_TYPE (val);
4587
4588   if (INTEGRAL_TYPE_P (type)
4589       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4590     return 0;
4591   else
4592     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4593 }
4594
4595 /* Return the successor of VAL in its type, handling the infinite case.  */
4596
4597 static tree
4598 range_successor (tree val)
4599 {
4600   tree type = TREE_TYPE (val);
4601
4602   if (INTEGRAL_TYPE_P (type)
4603       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4604     return 0;
4605   else
4606     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4607 }
4608
4609 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4610    can, 0 if we can't.  Set the output range into the specified parameters.  */
4611
4612 static int
4613 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4614               tree high0, int in1_p, tree low1, tree high1)
4615 {
4616   int no_overlap;
4617   int subset;
4618   int temp;
4619   tree tem;
4620   int in_p;
4621   tree low, high;
4622   int lowequal = ((low0 == 0 && low1 == 0)
4623                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4624                                                 low0, 0, low1, 0)));
4625   int highequal = ((high0 == 0 && high1 == 0)
4626                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4627                                                  high0, 1, high1, 1)));
4628
4629   /* Make range 0 be the range that starts first, or ends last if they
4630      start at the same value.  Swap them if it isn't.  */
4631   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4632                                  low0, 0, low1, 0))
4633       || (lowequal
4634           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4635                                         high1, 1, high0, 1))))
4636     {
4637       temp = in0_p, in0_p = in1_p, in1_p = temp;
4638       tem = low0, low0 = low1, low1 = tem;
4639       tem = high0, high0 = high1, high1 = tem;
4640     }
4641
4642   /* Now flag two cases, whether the ranges are disjoint or whether the
4643      second range is totally subsumed in the first.  Note that the tests
4644      below are simplified by the ones above.  */
4645   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4646                                           high0, 1, low1, 0));
4647   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4648                                       high1, 1, high0, 1));
4649
4650   /* We now have four cases, depending on whether we are including or
4651      excluding the two ranges.  */
4652   if (in0_p && in1_p)
4653     {
4654       /* If they don't overlap, the result is false.  If the second range
4655          is a subset it is the result.  Otherwise, the range is from the start
4656          of the second to the end of the first.  */
4657       if (no_overlap)
4658         in_p = 0, low = high = 0;
4659       else if (subset)
4660         in_p = 1, low = low1, high = high1;
4661       else
4662         in_p = 1, low = low1, high = high0;
4663     }
4664
4665   else if (in0_p && ! in1_p)
4666     {
4667       /* If they don't overlap, the result is the first range.  If they are
4668          equal, the result is false.  If the second range is a subset of the
4669          first, and the ranges begin at the same place, we go from just after
4670          the end of the second range to the end of the first.  If the second
4671          range is not a subset of the first, or if it is a subset and both
4672          ranges end at the same place, the range starts at the start of the
4673          first range and ends just before the second range.
4674          Otherwise, we can't describe this as a single range.  */
4675       if (no_overlap)
4676         in_p = 1, low = low0, high = high0;
4677       else if (lowequal && highequal)
4678         in_p = 0, low = high = 0;
4679       else if (subset && lowequal)
4680         {
4681           low = range_successor (high1);
4682           high = high0;
4683           in_p = 1;
4684           if (low == 0)
4685             {
4686               /* We are in the weird situation where high0 > high1 but
4687                  high1 has no successor.  Punt.  */
4688               return 0;
4689             }
4690         }
4691       else if (! subset || highequal)
4692         {
4693           low = low0;
4694           high = range_predecessor (low1);
4695           in_p = 1;
4696           if (high == 0)
4697             {
4698               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4699               return 0;
4700             }
4701         }
4702       else
4703         return 0;
4704     }
4705
4706   else if (! in0_p && in1_p)
4707     {
4708       /* If they don't overlap, the result is the second range.  If the second
4709          is a subset of the first, the result is false.  Otherwise,
4710          the range starts just after the first range and ends at the
4711          end of the second.  */
4712       if (no_overlap)
4713         in_p = 1, low = low1, high = high1;
4714       else if (subset || highequal)
4715         in_p = 0, low = high = 0;
4716       else
4717         {
4718           low = range_successor (high0);
4719           high = high1;
4720           in_p = 1;
4721           if (low == 0)
4722             {
4723               /* high1 > high0 but high0 has no successor.  Punt.  */
4724               return 0;
4725             }
4726         }
4727     }
4728
4729   else
4730     {
4731       /* The case where we are excluding both ranges.  Here the complex case
4732          is if they don't overlap.  In that case, the only time we have a
4733          range is if they are adjacent.  If the second is a subset of the
4734          first, the result is the first.  Otherwise, the range to exclude
4735          starts at the beginning of the first range and ends at the end of the
4736          second.  */
4737       if (no_overlap)
4738         {
4739           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4740                                          range_successor (high0),
4741                                          1, low1, 0)))
4742             in_p = 0, low = low0, high = high1;
4743           else
4744             {
4745               /* Canonicalize - [min, x] into - [-, x].  */
4746               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4747                 switch (TREE_CODE (TREE_TYPE (low0)))
4748                   {
4749                   case ENUMERAL_TYPE:
4750                     if (TYPE_PRECISION (TREE_TYPE (low0))
4751                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4752                       break;
4753                     /* FALLTHROUGH */
4754                   case INTEGER_TYPE:
4755                     if (tree_int_cst_equal (low0,
4756                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4757                       low0 = 0;
4758                     break;
4759                   case POINTER_TYPE:
4760                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4761                         && integer_zerop (low0))
4762                       low0 = 0;
4763                     break;
4764                   default:
4765                     break;
4766                   }
4767
4768               /* Canonicalize - [x, max] into - [x, -].  */
4769               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4770                 switch (TREE_CODE (TREE_TYPE (high1)))
4771                   {
4772                   case ENUMERAL_TYPE:
4773                     if (TYPE_PRECISION (TREE_TYPE (high1))
4774                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4775                       break;
4776                     /* FALLTHROUGH */
4777                   case INTEGER_TYPE:
4778                     if (tree_int_cst_equal (high1,
4779                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4780                       high1 = 0;
4781                     break;
4782                   case POINTER_TYPE:
4783                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4784                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4785                                                        high1, 1,
4786                                                        integer_one_node, 1)))
4787                       high1 = 0;
4788                     break;
4789                   default:
4790                     break;
4791                   }
4792
4793               /* The ranges might be also adjacent between the maximum and
4794                  minimum values of the given type.  For
4795                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4796                  return + [x + 1, y - 1].  */
4797               if (low0 == 0 && high1 == 0)
4798                 {
4799                   low = range_successor (high0);
4800                   high = range_predecessor (low1);
4801                   if (low == 0 || high == 0)
4802                     return 0;
4803
4804                   in_p = 1;
4805                 }
4806               else
4807                 return 0;
4808             }
4809         }
4810       else if (subset)
4811         in_p = 0, low = low0, high = high0;
4812       else
4813         in_p = 0, low = low0, high = high1;
4814     }
4815
4816   *pin_p = in_p, *plow = low, *phigh = high;
4817   return 1;
4818 }
4819 \f
4820
4821 /* Subroutine of fold, looking inside expressions of the form
4822    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4823    of the COND_EXPR.  This function is being used also to optimize
4824    A op B ? C : A, by reversing the comparison first.
4825
4826    Return a folded expression whose code is not a COND_EXPR
4827    anymore, or NULL_TREE if no folding opportunity is found.  */
4828
4829 static tree
4830 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4831 {
4832   enum tree_code comp_code = TREE_CODE (arg0);
4833   tree arg00 = TREE_OPERAND (arg0, 0);
4834   tree arg01 = TREE_OPERAND (arg0, 1);
4835   tree arg1_type = TREE_TYPE (arg1);
4836   tree tem;
4837
4838   STRIP_NOPS (arg1);
4839   STRIP_NOPS (arg2);
4840
4841   /* If we have A op 0 ? A : -A, consider applying the following
4842      transformations:
4843
4844      A == 0? A : -A    same as -A
4845      A != 0? A : -A    same as A
4846      A >= 0? A : -A    same as abs (A)
4847      A > 0?  A : -A    same as abs (A)
4848      A <= 0? A : -A    same as -abs (A)
4849      A < 0?  A : -A    same as -abs (A)
4850
4851      None of these transformations work for modes with signed
4852      zeros.  If A is +/-0, the first two transformations will
4853      change the sign of the result (from +0 to -0, or vice
4854      versa).  The last four will fix the sign of the result,
4855      even though the original expressions could be positive or
4856      negative, depending on the sign of A.
4857
4858      Note that all these transformations are correct if A is
4859      NaN, since the two alternatives (A and -A) are also NaNs.  */
4860   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4861       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4862           ? real_zerop (arg01)
4863           : integer_zerop (arg01))
4864       && ((TREE_CODE (arg2) == NEGATE_EXPR
4865            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4866              /* In the case that A is of the form X-Y, '-A' (arg2) may
4867                 have already been folded to Y-X, check for that. */
4868           || (TREE_CODE (arg1) == MINUS_EXPR
4869               && TREE_CODE (arg2) == MINUS_EXPR
4870               && operand_equal_p (TREE_OPERAND (arg1, 0),
4871                                   TREE_OPERAND (arg2, 1), 0)
4872               && operand_equal_p (TREE_OPERAND (arg1, 1),
4873                                   TREE_OPERAND (arg2, 0), 0))))
4874     switch (comp_code)
4875       {
4876       case EQ_EXPR:
4877       case UNEQ_EXPR:
4878         tem = fold_convert (arg1_type, arg1);
4879         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4880       case NE_EXPR:
4881       case LTGT_EXPR:
4882         return pedantic_non_lvalue (fold_convert (type, arg1));
4883       case UNGE_EXPR:
4884       case UNGT_EXPR:
4885         if (flag_trapping_math)
4886           break;
4887         /* Fall through.  */
4888       case GE_EXPR:
4889       case GT_EXPR:
4890         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4891           arg1 = fold_convert (signed_type_for
4892                                (TREE_TYPE (arg1)), arg1);
4893         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4894         return pedantic_non_lvalue (fold_convert (type, tem));
4895       case UNLE_EXPR:
4896       case UNLT_EXPR:
4897         if (flag_trapping_math)
4898           break;
4899       case LE_EXPR:
4900       case LT_EXPR:
4901         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4902           arg1 = fold_convert (signed_type_for
4903                                (TREE_TYPE (arg1)), arg1);
4904         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4905         return negate_expr (fold_convert (type, tem));
4906       default:
4907         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4908         break;
4909       }
4910
4911   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4912      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4913      both transformations are correct when A is NaN: A != 0
4914      is then true, and A == 0 is false.  */
4915
4916   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4917       && integer_zerop (arg01) && integer_zerop (arg2))
4918     {
4919       if (comp_code == NE_EXPR)
4920         return pedantic_non_lvalue (fold_convert (type, arg1));
4921       else if (comp_code == EQ_EXPR)
4922         return build_int_cst (type, 0);
4923     }
4924
4925   /* Try some transformations of A op B ? A : B.
4926
4927      A == B? A : B    same as B
4928      A != B? A : B    same as A
4929      A >= B? A : B    same as max (A, B)
4930      A > B?  A : B    same as max (B, A)
4931      A <= B? A : B    same as min (A, B)
4932      A < B?  A : B    same as min (B, A)
4933
4934      As above, these transformations don't work in the presence
4935      of signed zeros.  For example, if A and B are zeros of
4936      opposite sign, the first two transformations will change
4937      the sign of the result.  In the last four, the original
4938      expressions give different results for (A=+0, B=-0) and
4939      (A=-0, B=+0), but the transformed expressions do not.
4940
4941      The first two transformations are correct if either A or B
4942      is a NaN.  In the first transformation, the condition will
4943      be false, and B will indeed be chosen.  In the case of the
4944      second transformation, the condition A != B will be true,
4945      and A will be chosen.
4946
4947      The conversions to max() and min() are not correct if B is
4948      a number and A is not.  The conditions in the original
4949      expressions will be false, so all four give B.  The min()
4950      and max() versions would give a NaN instead.  */
4951   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4952       && operand_equal_for_comparison_p (arg01, arg2, arg00)
4953       /* Avoid these transformations if the COND_EXPR may be used
4954          as an lvalue in the C++ front-end.  PR c++/19199.  */
4955       && (in_gimple_form
4956           || (strcmp (lang_hooks.name, "GNU C++") != 0
4957               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4958           || ! maybe_lvalue_p (arg1)
4959           || ! maybe_lvalue_p (arg2)))
4960     {
4961       tree comp_op0 = arg00;
4962       tree comp_op1 = arg01;
4963       tree comp_type = TREE_TYPE (comp_op0);
4964
4965       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4966       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4967         {
4968           comp_type = type;
4969           comp_op0 = arg1;
4970           comp_op1 = arg2;
4971         }
4972
4973       switch (comp_code)
4974         {
4975         case EQ_EXPR:
4976           return pedantic_non_lvalue (fold_convert (type, arg2));
4977         case NE_EXPR:
4978           return pedantic_non_lvalue (fold_convert (type, arg1));
4979         case LE_EXPR:
4980         case LT_EXPR:
4981         case UNLE_EXPR:
4982         case UNLT_EXPR:
4983           /* In C++ a ?: expression can be an lvalue, so put the
4984              operand which will be used if they are equal first
4985              so that we can convert this back to the
4986              corresponding COND_EXPR.  */
4987           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4988             {
4989               comp_op0 = fold_convert (comp_type, comp_op0);
4990               comp_op1 = fold_convert (comp_type, comp_op1);
4991               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4992                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4993                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4994               return pedantic_non_lvalue (fold_convert (type, tem));
4995             }
4996           break;
4997         case GE_EXPR:
4998         case GT_EXPR:
4999         case UNGE_EXPR:
5000         case UNGT_EXPR:
5001           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5002             {
5003               comp_op0 = fold_convert (comp_type, comp_op0);
5004               comp_op1 = fold_convert (comp_type, comp_op1);
5005               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5006                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5007                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5008               return pedantic_non_lvalue (fold_convert (type, tem));
5009             }
5010           break;
5011         case UNEQ_EXPR:
5012           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5013             return pedantic_non_lvalue (fold_convert (type, arg2));
5014           break;
5015         case LTGT_EXPR:
5016           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5017             return pedantic_non_lvalue (fold_convert (type, arg1));
5018           break;
5019         default:
5020           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5021           break;
5022         }
5023     }
5024
5025   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5026      we might still be able to simplify this.  For example,
5027      if C1 is one less or one more than C2, this might have started
5028      out as a MIN or MAX and been transformed by this function.
5029      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5030
5031   if (INTEGRAL_TYPE_P (type)
5032       && TREE_CODE (arg01) == INTEGER_CST
5033       && TREE_CODE (arg2) == INTEGER_CST)
5034     switch (comp_code)
5035       {
5036       case EQ_EXPR:
5037         /* We can replace A with C1 in this case.  */
5038         arg1 = fold_convert (type, arg01);
5039         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5040
5041       case LT_EXPR:
5042         /* If C1 is C2 + 1, this is min(A, C2).  */
5043         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5044                                OEP_ONLY_CONST)
5045             && operand_equal_p (arg01,
5046                                 const_binop (PLUS_EXPR, arg2,
5047                                              build_int_cst (type, 1), 0),
5048                                 OEP_ONLY_CONST))
5049           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5050                                                    type,
5051                                                    fold_convert (type, arg1),
5052                                                    arg2));
5053         break;
5054
5055       case LE_EXPR:
5056         /* If C1 is C2 - 1, this is min(A, C2).  */
5057         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5058                                OEP_ONLY_CONST)
5059             && operand_equal_p (arg01,
5060                                 const_binop (MINUS_EXPR, arg2,
5061                                              build_int_cst (type, 1), 0),
5062                                 OEP_ONLY_CONST))
5063           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5064                                                    type,
5065                                                    fold_convert (type, arg1),
5066                                                    arg2));
5067         break;
5068
5069       case GT_EXPR:
5070         /* If C1 is C2 - 1, this is max(A, C2).  */
5071         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5072                                OEP_ONLY_CONST)
5073             && operand_equal_p (arg01,
5074                                 const_binop (MINUS_EXPR, arg2,
5075                                              build_int_cst (type, 1), 0),
5076                                 OEP_ONLY_CONST))
5077           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5078                                                    type,
5079                                                    fold_convert (type, arg1),
5080                                                    arg2));
5081         break;
5082
5083       case GE_EXPR:
5084         /* If C1 is C2 + 1, this is max(A, C2).  */
5085         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5086                                OEP_ONLY_CONST)
5087             && operand_equal_p (arg01,
5088                                 const_binop (PLUS_EXPR, arg2,
5089                                              build_int_cst (type, 1), 0),
5090                                 OEP_ONLY_CONST))
5091           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5092                                                    type,
5093                                                    fold_convert (type, arg1),
5094                                                    arg2));
5095         break;
5096       case NE_EXPR:
5097         break;
5098       default:
5099         gcc_unreachable ();
5100       }
5101
5102   return NULL_TREE;
5103 }
5104
5105
5106 \f
5107 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5108 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
5109 #endif
5110
5111 /* EXP is some logical combination of boolean tests.  See if we can
5112    merge it into some range test.  Return the new tree if so.  */
5113
5114 static tree
5115 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5116 {
5117   int or_op = (code == TRUTH_ORIF_EXPR
5118                || code == TRUTH_OR_EXPR);
5119   int in0_p, in1_p, in_p;
5120   tree low0, low1, low, high0, high1, high;
5121   bool strict_overflow_p = false;
5122   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5123   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5124   tree tem;
5125   const char * const warnmsg = G_("assuming signed overflow does not occur "
5126                                   "when simplifying range test");
5127
5128   /* If this is an OR operation, invert both sides; we will invert
5129      again at the end.  */
5130   if (or_op)
5131     in0_p = ! in0_p, in1_p = ! in1_p;
5132
5133   /* If both expressions are the same, if we can merge the ranges, and we
5134      can build the range test, return it or it inverted.  If one of the
5135      ranges is always true or always false, consider it to be the same
5136      expression as the other.  */
5137   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5138       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5139                        in1_p, low1, high1)
5140       && 0 != (tem = (build_range_check (type,
5141                                          lhs != 0 ? lhs
5142                                          : rhs != 0 ? rhs : integer_zero_node,
5143                                          in_p, low, high))))
5144     {
5145       if (strict_overflow_p)
5146         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5147       return or_op ? invert_truthvalue (tem) : tem;
5148     }
5149
5150   /* On machines where the branch cost is expensive, if this is a
5151      short-circuited branch and the underlying object on both sides
5152      is the same, make a non-short-circuit operation.  */
5153   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5154            && lhs != 0 && rhs != 0
5155            && (code == TRUTH_ANDIF_EXPR
5156                || code == TRUTH_ORIF_EXPR)
5157            && operand_equal_p (lhs, rhs, 0))
5158     {
5159       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5160          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5161          which cases we can't do this.  */
5162       if (simple_operand_p (lhs))
5163         return build2 (code == TRUTH_ANDIF_EXPR
5164                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5165                        type, op0, op1);
5166
5167       else if (lang_hooks.decls.global_bindings_p () == 0
5168                && ! CONTAINS_PLACEHOLDER_P (lhs))
5169         {
5170           tree common = save_expr (lhs);
5171
5172           if (0 != (lhs = build_range_check (type, common,
5173                                              or_op ? ! in0_p : in0_p,
5174                                              low0, high0))
5175               && (0 != (rhs = build_range_check (type, common,
5176                                                  or_op ? ! in1_p : in1_p,
5177                                                  low1, high1))))
5178             {
5179               if (strict_overflow_p)
5180                 fold_overflow_warning (warnmsg,
5181                                        WARN_STRICT_OVERFLOW_COMPARISON);
5182               return build2 (code == TRUTH_ANDIF_EXPR
5183                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5184                              type, lhs, rhs);
5185             }
5186         }
5187     }
5188
5189   return 0;
5190 }
5191 \f
5192 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5193    bit value.  Arrange things so the extra bits will be set to zero if and
5194    only if C is signed-extended to its full width.  If MASK is nonzero,
5195    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5196
5197 static tree
5198 unextend (tree c, int p, int unsignedp, tree mask)
5199 {
5200   tree type = TREE_TYPE (c);
5201   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5202   tree temp;
5203
5204   if (p == modesize || unsignedp)
5205     return c;
5206
5207   /* We work by getting just the sign bit into the low-order bit, then
5208      into the high-order bit, then sign-extend.  We then XOR that value
5209      with C.  */
5210   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5211   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5212
5213   /* We must use a signed type in order to get an arithmetic right shift.
5214      However, we must also avoid introducing accidental overflows, so that
5215      a subsequent call to integer_zerop will work.  Hence we must
5216      do the type conversion here.  At this point, the constant is either
5217      zero or one, and the conversion to a signed type can never overflow.
5218      We could get an overflow if this conversion is done anywhere else.  */
5219   if (TYPE_UNSIGNED (type))
5220     temp = fold_convert (signed_type_for (type), temp);
5221
5222   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5223   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5224   if (mask != 0)
5225     temp = const_binop (BIT_AND_EXPR, temp,
5226                         fold_convert (TREE_TYPE (c), mask), 0);
5227   /* If necessary, convert the type back to match the type of C.  */
5228   if (TYPE_UNSIGNED (type))
5229     temp = fold_convert (type, temp);
5230
5231   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5232 }
5233 \f
5234 /* Find ways of folding logical expressions of LHS and RHS:
5235    Try to merge two comparisons to the same innermost item.
5236    Look for range tests like "ch >= '0' && ch <= '9'".
5237    Look for combinations of simple terms on machines with expensive branches
5238    and evaluate the RHS unconditionally.
5239
5240    For example, if we have p->a == 2 && p->b == 4 and we can make an
5241    object large enough to span both A and B, we can do this with a comparison
5242    against the object ANDed with the a mask.
5243
5244    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5245    operations to do this with one comparison.
5246
5247    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5248    function and the one above.
5249
5250    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5251    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5252
5253    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5254    two operands.
5255
5256    We return the simplified tree or 0 if no optimization is possible.  */
5257
5258 static tree
5259 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5260 {
5261   /* If this is the "or" of two comparisons, we can do something if
5262      the comparisons are NE_EXPR.  If this is the "and", we can do something
5263      if the comparisons are EQ_EXPR.  I.e.,
5264         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5265
5266      WANTED_CODE is this operation code.  For single bit fields, we can
5267      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5268      comparison for one-bit fields.  */
5269
5270   enum tree_code wanted_code;
5271   enum tree_code lcode, rcode;
5272   tree ll_arg, lr_arg, rl_arg, rr_arg;
5273   tree ll_inner, lr_inner, rl_inner, rr_inner;
5274   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5275   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5276   HOST_WIDE_INT xll_bitpos, xrl_bitpos;
5277   HOST_WIDE_INT lnbitsize, lnbitpos;
5278   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5279   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5280   enum machine_mode lnmode;
5281   tree ll_mask, lr_mask, rl_mask, rr_mask;
5282   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5283   tree l_const, r_const;
5284   tree lntype, result;
5285   int first_bit, end_bit;
5286   int volatilep;
5287   tree orig_lhs = lhs, orig_rhs = rhs;
5288   enum tree_code orig_code = code;
5289
5290   /* Start by getting the comparison codes.  Fail if anything is volatile.
5291      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5292      it were surrounded with a NE_EXPR.  */
5293
5294   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5295     return 0;
5296
5297   lcode = TREE_CODE (lhs);
5298   rcode = TREE_CODE (rhs);
5299
5300   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5301     {
5302       lhs = build2 (NE_EXPR, truth_type, lhs,
5303                     build_int_cst (TREE_TYPE (lhs), 0));
5304       lcode = NE_EXPR;
5305     }
5306
5307   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5308     {
5309       rhs = build2 (NE_EXPR, truth_type, rhs,
5310                     build_int_cst (TREE_TYPE (rhs), 0));
5311       rcode = NE_EXPR;
5312     }
5313
5314   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5315       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5316     return 0;
5317
5318   ll_arg = TREE_OPERAND (lhs, 0);
5319   lr_arg = TREE_OPERAND (lhs, 1);
5320   rl_arg = TREE_OPERAND (rhs, 0);
5321   rr_arg = TREE_OPERAND (rhs, 1);
5322
5323   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5324   if (simple_operand_p (ll_arg)
5325       && simple_operand_p (lr_arg))
5326     {
5327       tree result;
5328       if (operand_equal_p (ll_arg, rl_arg, 0)
5329           && operand_equal_p (lr_arg, rr_arg, 0))
5330         {
5331           result = combine_comparisons (code, lcode, rcode,
5332                                         truth_type, ll_arg, lr_arg);
5333           if (result)
5334             return result;
5335         }
5336       else if (operand_equal_p (ll_arg, rr_arg, 0)
5337                && operand_equal_p (lr_arg, rl_arg, 0))
5338         {
5339           result = combine_comparisons (code, lcode,
5340                                         swap_tree_comparison (rcode),
5341                                         truth_type, ll_arg, lr_arg);
5342           if (result)
5343             return result;
5344         }
5345     }
5346
5347   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5348           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5349
5350   /* If the RHS can be evaluated unconditionally and its operands are
5351      simple, it wins to evaluate the RHS unconditionally on machines
5352      with expensive branches.  In this case, this isn't a comparison
5353      that can be merged.  Avoid doing this if the RHS is a floating-point
5354      comparison since those can trap.  */
5355
5356   if (BRANCH_COST >= 2
5357       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5358       && simple_operand_p (rl_arg)
5359       && simple_operand_p (rr_arg))
5360     {
5361       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5362       if (code == TRUTH_OR_EXPR
5363           && lcode == NE_EXPR && integer_zerop (lr_arg)
5364           && rcode == NE_EXPR && integer_zerop (rr_arg)
5365           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5366           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5367         return build2 (NE_EXPR, truth_type,
5368                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5369                                ll_arg, rl_arg),
5370                        build_int_cst (TREE_TYPE (ll_arg), 0));
5371
5372       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5373       if (code == TRUTH_AND_EXPR
5374           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5375           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5376           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5377           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5378         return build2 (EQ_EXPR, truth_type,
5379                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5380                                ll_arg, rl_arg),
5381                        build_int_cst (TREE_TYPE (ll_arg), 0));
5382
5383       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5384         {
5385           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5386             return build2 (code, truth_type, lhs, rhs);
5387           return NULL_TREE;
5388         }
5389     }
5390
5391   /* See if the comparisons can be merged.  Then get all the parameters for
5392      each side.  */
5393
5394   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5395       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5396     return 0;
5397
5398   volatilep = 0;
5399   ll_inner = decode_field_reference (ll_arg,
5400                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5401                                      &ll_unsignedp, &volatilep, &ll_mask,
5402                                      &ll_and_mask);
5403   lr_inner = decode_field_reference (lr_arg,
5404                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5405                                      &lr_unsignedp, &volatilep, &lr_mask,
5406                                      &lr_and_mask);
5407   rl_inner = decode_field_reference (rl_arg,
5408                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5409                                      &rl_unsignedp, &volatilep, &rl_mask,
5410                                      &rl_and_mask);
5411   rr_inner = decode_field_reference (rr_arg,
5412                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5413                                      &rr_unsignedp, &volatilep, &rr_mask,
5414                                      &rr_and_mask);
5415
5416   /* It must be true that the inner operation on the lhs of each
5417      comparison must be the same if we are to be able to do anything.
5418      Then see if we have constants.  If not, the same must be true for
5419      the rhs's.  */
5420   if (volatilep || ll_inner == 0 || rl_inner == 0
5421       || ! operand_equal_p (ll_inner, rl_inner, 0))
5422     return 0;
5423
5424   if (TREE_CODE (lr_arg) == INTEGER_CST
5425       && TREE_CODE (rr_arg) == INTEGER_CST)
5426     l_const = lr_arg, r_const = rr_arg;
5427   else if (lr_inner == 0 || rr_inner == 0
5428            || ! operand_equal_p (lr_inner, rr_inner, 0))
5429     return 0;
5430   else
5431     l_const = r_const = 0;
5432
5433   /* If either comparison code is not correct for our logical operation,
5434      fail.  However, we can convert a one-bit comparison against zero into
5435      the opposite comparison against that bit being set in the field.  */
5436
5437   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5438   if (lcode != wanted_code)
5439     {
5440       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5441         {
5442           /* Make the left operand unsigned, since we are only interested
5443              in the value of one bit.  Otherwise we are doing the wrong
5444              thing below.  */
5445           ll_unsignedp = 1;
5446           l_const = ll_mask;
5447         }
5448       else
5449         return 0;
5450     }
5451
5452   /* This is analogous to the code for l_const above.  */
5453   if (rcode != wanted_code)
5454     {
5455       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5456         {
5457           rl_unsignedp = 1;
5458           r_const = rl_mask;
5459         }
5460       else
5461         return 0;
5462     }
5463
5464   /* See if we can find a mode that contains both fields being compared on
5465      the left.  If we can't, fail.  Otherwise, update all constants and masks
5466      to be relative to a field of that size.  */
5467   first_bit = MIN (ll_bitpos, rl_bitpos);
5468   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5469   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5470                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5471                           volatilep);
5472   if (lnmode == VOIDmode)
5473     return 0;
5474
5475   lnbitsize = GET_MODE_BITSIZE (lnmode);
5476   lnbitpos = first_bit & ~ (lnbitsize - 1);
5477   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5478   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5479
5480   if (BYTES_BIG_ENDIAN)
5481     {
5482       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5483       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5484     }
5485
5486   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5487                          size_int (xll_bitpos), 0);
5488   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5489                          size_int (xrl_bitpos), 0);
5490
5491   if (l_const)
5492     {
5493       l_const = fold_convert (lntype, l_const);
5494       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5495       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5496       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5497                                         fold_build1 (BIT_NOT_EXPR,
5498                                                      lntype, ll_mask),
5499                                         0)))
5500         {
5501           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5502
5503           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5504         }
5505     }
5506   if (r_const)
5507     {
5508       r_const = fold_convert (lntype, r_const);
5509       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5510       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5511       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5512                                         fold_build1 (BIT_NOT_EXPR,
5513                                                      lntype, rl_mask),
5514                                         0)))
5515         {
5516           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5517
5518           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5519         }
5520     }
5521
5522   /* Handle the case of comparisons with constants.  If there is something in
5523      common between the masks, those bits of the constants must be the same.
5524      If not, the condition is always false.  Test for this to avoid generating
5525      incorrect code below.  */
5526   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5527   if (! integer_zerop (result)
5528       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5529                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5530     {
5531       if (wanted_code == NE_EXPR)
5532         {
5533           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5534           return constant_boolean_node (true, truth_type);
5535         }
5536       else
5537         {
5538           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5539           return constant_boolean_node (false, truth_type);
5540         }
5541     }
5542
5543   return NULL_TREE;
5544 }
5545 \f
5546 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5547    constant.  */
5548
5549 static tree
5550 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5551 {
5552   tree arg0 = op0;
5553   enum tree_code op_code;
5554   tree comp_const;
5555   tree minmax_const;
5556   int consts_equal, consts_lt;
5557   tree inner;
5558
5559   STRIP_SIGN_NOPS (arg0);
5560
5561   op_code = TREE_CODE (arg0);
5562   minmax_const = TREE_OPERAND (arg0, 1);
5563   comp_const = fold_convert (TREE_TYPE (arg0), op1);
5564   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5565   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5566   inner = TREE_OPERAND (arg0, 0);
5567
5568   /* If something does not permit us to optimize, return the original tree.  */
5569   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5570       || TREE_CODE (comp_const) != INTEGER_CST
5571       || TREE_OVERFLOW (comp_const)
5572       || TREE_CODE (minmax_const) != INTEGER_CST
5573       || TREE_OVERFLOW (minmax_const))
5574     return NULL_TREE;
5575
5576   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5577      and GT_EXPR, doing the rest with recursive calls using logical
5578      simplifications.  */
5579   switch (code)
5580     {
5581     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5582       {
5583         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5584                                           type, op0, op1);
5585         if (tem)
5586           return invert_truthvalue (tem);
5587         return NULL_TREE;
5588       }
5589
5590     case GE_EXPR:
5591       return
5592         fold_build2 (TRUTH_ORIF_EXPR, type,
5593                      optimize_minmax_comparison
5594                      (EQ_EXPR, type, arg0, comp_const),
5595                      optimize_minmax_comparison
5596                      (GT_EXPR, type, arg0, comp_const));
5597
5598     case EQ_EXPR:
5599       if (op_code == MAX_EXPR && consts_equal)
5600         /* MAX (X, 0) == 0  ->  X <= 0  */
5601         return fold_build2 (LE_EXPR, type, inner, comp_const);
5602
5603       else if (op_code == MAX_EXPR && consts_lt)
5604         /* MAX (X, 0) == 5  ->  X == 5   */
5605         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5606
5607       else if (op_code == MAX_EXPR)
5608         /* MAX (X, 0) == -1  ->  false  */
5609         return omit_one_operand (type, integer_zero_node, inner);
5610
5611       else if (consts_equal)
5612         /* MIN (X, 0) == 0  ->  X >= 0  */
5613         return fold_build2 (GE_EXPR, type, inner, comp_const);
5614
5615       else if (consts_lt)
5616         /* MIN (X, 0) == 5  ->  false  */
5617         return omit_one_operand (type, integer_zero_node, inner);
5618
5619       else
5620         /* MIN (X, 0) == -1  ->  X == -1  */
5621         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5622
5623     case GT_EXPR:
5624       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5625         /* MAX (X, 0) > 0  ->  X > 0
5626            MAX (X, 0) > 5  ->  X > 5  */
5627         return fold_build2 (GT_EXPR, type, inner, comp_const);
5628
5629       else if (op_code == MAX_EXPR)
5630         /* MAX (X, 0) > -1  ->  true  */
5631         return omit_one_operand (type, integer_one_node, inner);
5632
5633       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5634         /* MIN (X, 0) > 0  ->  false
5635            MIN (X, 0) > 5  ->  false  */
5636         return omit_one_operand (type, integer_zero_node, inner);
5637
5638       else
5639         /* MIN (X, 0) > -1  ->  X > -1  */
5640         return fold_build2 (GT_EXPR, type, inner, comp_const);
5641
5642     default:
5643       return NULL_TREE;
5644     }
5645 }
5646 \f
5647 /* T is an integer expression that is being multiplied, divided, or taken a
5648    modulus (CODE says which and what kind of divide or modulus) by a
5649    constant C.  See if we can eliminate that operation by folding it with
5650    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5651    should be used for the computation if wider than our type.
5652
5653    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5654    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5655    expression would not overflow or that overflow is undefined for the type
5656    in the language in question.
5657
5658    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5659    the machine has a multiply-accumulate insn or that this is part of an
5660    addressing calculation.
5661
5662    If we return a non-null expression, it is an equivalent form of the
5663    original computation, but need not be in the original type.
5664
5665    We set *STRICT_OVERFLOW_P to true if the return values depends on
5666    signed overflow being undefined.  Otherwise we do not change
5667    *STRICT_OVERFLOW_P.  */
5668
5669 static tree
5670 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5671                 bool *strict_overflow_p)
5672 {
5673   /* To avoid exponential search depth, refuse to allow recursion past
5674      three levels.  Beyond that (1) it's highly unlikely that we'll find
5675      something interesting and (2) we've probably processed it before
5676      when we built the inner expression.  */
5677
5678   static int depth;
5679   tree ret;
5680
5681   if (depth > 3)
5682     return NULL;
5683
5684   depth++;
5685   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5686   depth--;
5687
5688   return ret;
5689 }
5690
5691 static tree
5692 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5693                   bool *strict_overflow_p)
5694 {
5695   tree type = TREE_TYPE (t);
5696   enum tree_code tcode = TREE_CODE (t);
5697   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5698                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5699                 ? wide_type : type);
5700   tree t1, t2;
5701   int same_p = tcode == code;
5702   tree op0 = NULL_TREE, op1 = NULL_TREE;
5703   bool sub_strict_overflow_p;
5704
5705   /* Don't deal with constants of zero here; they confuse the code below.  */
5706   if (integer_zerop (c))
5707     return NULL_TREE;
5708
5709   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5710     op0 = TREE_OPERAND (t, 0);
5711
5712   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5713     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5714
5715   /* Note that we need not handle conditional operations here since fold
5716      already handles those cases.  So just do arithmetic here.  */
5717   switch (tcode)
5718     {
5719     case INTEGER_CST:
5720       /* For a constant, we can always simplify if we are a multiply
5721          or (for divide and modulus) if it is a multiple of our constant.  */
5722       if (code == MULT_EXPR
5723           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5724         return const_binop (code, fold_convert (ctype, t),
5725                             fold_convert (ctype, c), 0);
5726       break;
5727
5728     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5729       /* If op0 is an expression ...  */
5730       if ((COMPARISON_CLASS_P (op0)
5731            || UNARY_CLASS_P (op0)
5732            || BINARY_CLASS_P (op0)
5733            || VL_EXP_CLASS_P (op0)
5734            || EXPRESSION_CLASS_P (op0))
5735           /* ... and is unsigned, and its type is smaller than ctype,
5736              then we cannot pass through as widening.  */
5737           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5738                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5739                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5740                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5741                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5742               /* ... or this is a truncation (t is narrower than op0),
5743                  then we cannot pass through this narrowing.  */
5744               || (GET_MODE_SIZE (TYPE_MODE (type))
5745                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5746               /* ... or signedness changes for division or modulus,
5747                  then we cannot pass through this conversion.  */
5748               || (code != MULT_EXPR
5749                   && (TYPE_UNSIGNED (ctype)
5750                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
5751               /* ... or has undefined overflow while the converted to
5752                  type has not, we cannot do the operation in the inner type
5753                  as that would introduce undefined overflow.  */
5754               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5755                   && !TYPE_OVERFLOW_UNDEFINED (type))))
5756         break;
5757
5758       /* Pass the constant down and see if we can make a simplification.  If
5759          we can, replace this expression with the inner simplification for
5760          possible later conversion to our or some other type.  */
5761       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5762           && TREE_CODE (t2) == INTEGER_CST
5763           && !TREE_OVERFLOW (t2)
5764           && (0 != (t1 = extract_muldiv (op0, t2, code,
5765                                          code == MULT_EXPR
5766                                          ? ctype : NULL_TREE,
5767                                          strict_overflow_p))))
5768         return t1;
5769       break;
5770
5771     case ABS_EXPR:
5772       /* If widening the type changes it from signed to unsigned, then we
5773          must avoid building ABS_EXPR itself as unsigned.  */
5774       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5775         {
5776           tree cstype = (*signed_type_for) (ctype);
5777           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5778               != 0)
5779             {
5780               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5781               return fold_convert (ctype, t1);
5782             }
5783           break;
5784         }
5785       /* If the constant is negative, we cannot simplify this.  */
5786       if (tree_int_cst_sgn (c) == -1)
5787         break;
5788       /* FALLTHROUGH */
5789     case NEGATE_EXPR:
5790       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5791           != 0)
5792         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5793       break;
5794
5795     case MIN_EXPR:  case MAX_EXPR:
5796       /* If widening the type changes the signedness, then we can't perform
5797          this optimization as that changes the result.  */
5798       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5799         break;
5800
5801       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5802       sub_strict_overflow_p = false;
5803       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5804                                 &sub_strict_overflow_p)) != 0
5805           && (t2 = extract_muldiv (op1, c, code, wide_type,
5806                                    &sub_strict_overflow_p)) != 0)
5807         {
5808           if (tree_int_cst_sgn (c) < 0)
5809             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5810           if (sub_strict_overflow_p)
5811             *strict_overflow_p = true;
5812           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5813                               fold_convert (ctype, t2));
5814         }
5815       break;
5816
5817     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5818       /* If the second operand is constant, this is a multiplication
5819          or floor division, by a power of two, so we can treat it that
5820          way unless the multiplier or divisor overflows.  Signed
5821          left-shift overflow is implementation-defined rather than
5822          undefined in C90, so do not convert signed left shift into
5823          multiplication.  */
5824       if (TREE_CODE (op1) == INTEGER_CST
5825           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5826           /* const_binop may not detect overflow correctly,
5827              so check for it explicitly here.  */
5828           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5829           && TREE_INT_CST_HIGH (op1) == 0
5830           && 0 != (t1 = fold_convert (ctype,
5831                                       const_binop (LSHIFT_EXPR,
5832                                                    size_one_node,
5833                                                    op1, 0)))
5834           && !TREE_OVERFLOW (t1))
5835         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5836                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5837                                        ctype, fold_convert (ctype, op0), t1),
5838                                c, code, wide_type, strict_overflow_p);
5839       break;
5840
5841     case PLUS_EXPR:  case MINUS_EXPR:
5842       /* See if we can eliminate the operation on both sides.  If we can, we
5843          can return a new PLUS or MINUS.  If we can't, the only remaining
5844          cases where we can do anything are if the second operand is a
5845          constant.  */
5846       sub_strict_overflow_p = false;
5847       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5848       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5849       if (t1 != 0 && t2 != 0
5850           && (code == MULT_EXPR
5851               /* If not multiplication, we can only do this if both operands
5852                  are divisible by c.  */
5853               || (multiple_of_p (ctype, op0, c)
5854                   && multiple_of_p (ctype, op1, c))))
5855         {
5856           if (sub_strict_overflow_p)
5857             *strict_overflow_p = true;
5858           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5859                               fold_convert (ctype, t2));
5860         }
5861
5862       /* If this was a subtraction, negate OP1 and set it to be an addition.
5863          This simplifies the logic below.  */
5864       if (tcode == MINUS_EXPR)
5865         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5866
5867       if (TREE_CODE (op1) != INTEGER_CST)
5868         break;
5869
5870       /* If either OP1 or C are negative, this optimization is not safe for
5871          some of the division and remainder types while for others we need
5872          to change the code.  */
5873       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5874         {
5875           if (code == CEIL_DIV_EXPR)
5876             code = FLOOR_DIV_EXPR;
5877           else if (code == FLOOR_DIV_EXPR)
5878             code = CEIL_DIV_EXPR;
5879           else if (code != MULT_EXPR
5880                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5881             break;
5882         }
5883
5884       /* If it's a multiply or a division/modulus operation of a multiple
5885          of our constant, do the operation and verify it doesn't overflow.  */
5886       if (code == MULT_EXPR
5887           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5888         {
5889           op1 = const_binop (code, fold_convert (ctype, op1),
5890                              fold_convert (ctype, c), 0);
5891           /* We allow the constant to overflow with wrapping semantics.  */
5892           if (op1 == 0
5893               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5894             break;
5895         }
5896       else
5897         break;
5898
5899       /* If we have an unsigned type is not a sizetype, we cannot widen
5900          the operation since it will change the result if the original
5901          computation overflowed.  */
5902       if (TYPE_UNSIGNED (ctype)
5903           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5904           && ctype != type)
5905         break;
5906
5907       /* If we were able to eliminate our operation from the first side,
5908          apply our operation to the second side and reform the PLUS.  */
5909       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5910         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5911
5912       /* The last case is if we are a multiply.  In that case, we can
5913          apply the distributive law to commute the multiply and addition
5914          if the multiplication of the constants doesn't overflow.  */
5915       if (code == MULT_EXPR)
5916         return fold_build2 (tcode, ctype,
5917                             fold_build2 (code, ctype,
5918                                          fold_convert (ctype, op0),
5919                                          fold_convert (ctype, c)),
5920                             op1);
5921
5922       break;
5923
5924     case MULT_EXPR:
5925       /* We have a special case here if we are doing something like
5926          (C * 8) % 4 since we know that's zero.  */
5927       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5928            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5929           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5930           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5931         return omit_one_operand (type, integer_zero_node, op0);
5932
5933       /* ... fall through ...  */
5934
5935     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5936     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5937       /* If we can extract our operation from the LHS, do so and return a
5938          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5939          do something only if the second operand is a constant.  */
5940       if (same_p
5941           && (t1 = extract_muldiv (op0, c, code, wide_type,
5942                                    strict_overflow_p)) != 0)
5943         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5944                             fold_convert (ctype, op1));
5945       else if (tcode == MULT_EXPR && code == MULT_EXPR
5946                && (t1 = extract_muldiv (op1, c, code, wide_type,
5947                                         strict_overflow_p)) != 0)
5948         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5949                             fold_convert (ctype, t1));
5950       else if (TREE_CODE (op1) != INTEGER_CST)
5951         return 0;
5952
5953       /* If these are the same operation types, we can associate them
5954          assuming no overflow.  */
5955       if (tcode == code
5956           && 0 != (t1 = int_const_binop (MULT_EXPR, fold_convert (ctype, op1),
5957                                          fold_convert (ctype, c), 1))
5958           && 0 != (t1 = force_fit_type_double (ctype, TREE_INT_CST_LOW (t1),
5959                                                TREE_INT_CST_HIGH (t1),
5960                                                (TYPE_UNSIGNED (ctype)
5961                                                 && tcode != MULT_EXPR) ? -1 : 1,
5962                                                TREE_OVERFLOW (t1)))
5963           && !TREE_OVERFLOW (t1))
5964         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5965
5966       /* If these operations "cancel" each other, we have the main
5967          optimizations of this pass, which occur when either constant is a
5968          multiple of the other, in which case we replace this with either an
5969          operation or CODE or TCODE.
5970
5971          If we have an unsigned type that is not a sizetype, we cannot do
5972          this since it will change the result if the original computation
5973          overflowed.  */
5974       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5975            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5976           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5977               || (tcode == MULT_EXPR
5978                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5979                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5980                   && code != MULT_EXPR)))
5981         {
5982           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5983             {
5984               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5985                 *strict_overflow_p = true;
5986               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5987                                   fold_convert (ctype,
5988                                                 const_binop (TRUNC_DIV_EXPR,
5989                                                              op1, c, 0)));
5990             }
5991           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5992             {
5993               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5994                 *strict_overflow_p = true;
5995               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5996                                   fold_convert (ctype,
5997                                                 const_binop (TRUNC_DIV_EXPR,
5998                                                              c, op1, 0)));
5999             }
6000         }
6001       break;
6002
6003     default:
6004       break;
6005     }
6006
6007   return 0;
6008 }
6009 \f
6010 /* Return a node which has the indicated constant VALUE (either 0 or
6011    1), and is of the indicated TYPE.  */
6012
6013 tree
6014 constant_boolean_node (int value, tree type)
6015 {
6016   if (type == integer_type_node)
6017     return value ? integer_one_node : integer_zero_node;
6018   else if (type == boolean_type_node)
6019     return value ? boolean_true_node : boolean_false_node;
6020   else
6021     return build_int_cst (type, value);
6022 }
6023
6024
6025 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6026    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6027    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6028    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6029    COND is the first argument to CODE; otherwise (as in the example
6030    given here), it is the second argument.  TYPE is the type of the
6031    original expression.  Return NULL_TREE if no simplification is
6032    possible.  */
6033
6034 static tree
6035 fold_binary_op_with_conditional_arg (enum tree_code code,
6036                                      tree type, tree op0, tree op1,
6037                                      tree cond, tree arg, int cond_first_p)
6038 {
6039   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6040   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6041   tree test, true_value, false_value;
6042   tree lhs = NULL_TREE;
6043   tree rhs = NULL_TREE;
6044
6045   /* This transformation is only worthwhile if we don't have to wrap
6046      arg in a SAVE_EXPR, and the operation can be simplified on at least
6047      one of the branches once its pushed inside the COND_EXPR.  */
6048   if (!TREE_CONSTANT (arg))
6049     return NULL_TREE;
6050
6051   if (TREE_CODE (cond) == COND_EXPR)
6052     {
6053       test = TREE_OPERAND (cond, 0);
6054       true_value = TREE_OPERAND (cond, 1);
6055       false_value = TREE_OPERAND (cond, 2);
6056       /* If this operand throws an expression, then it does not make
6057          sense to try to perform a logical or arithmetic operation
6058          involving it.  */
6059       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6060         lhs = true_value;
6061       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6062         rhs = false_value;
6063     }
6064   else
6065     {
6066       tree testtype = TREE_TYPE (cond);
6067       test = cond;
6068       true_value = constant_boolean_node (true, testtype);
6069       false_value = constant_boolean_node (false, testtype);
6070     }
6071
6072   arg = fold_convert (arg_type, arg);
6073   if (lhs == 0)
6074     {
6075       true_value = fold_convert (cond_type, true_value);
6076       if (cond_first_p)
6077         lhs = fold_build2 (code, type, true_value, arg);
6078       else
6079         lhs = fold_build2 (code, type, arg, true_value);
6080     }
6081   if (rhs == 0)
6082     {
6083       false_value = fold_convert (cond_type, false_value);
6084       if (cond_first_p)
6085         rhs = fold_build2 (code, type, false_value, arg);
6086       else
6087         rhs = fold_build2 (code, type, arg, false_value);
6088     }
6089
6090   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6091   return fold_convert (type, test);
6092 }
6093
6094 \f
6095 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6096
6097    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6098    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6099    ADDEND is the same as X.
6100
6101    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6102    and finite.  The problematic cases are when X is zero, and its mode
6103    has signed zeros.  In the case of rounding towards -infinity,
6104    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6105    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6106
6107 bool
6108 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6109 {
6110   if (!real_zerop (addend))
6111     return false;
6112
6113   /* Don't allow the fold with -fsignaling-nans.  */
6114   if (HONOR_SNANS (TYPE_MODE (type)))
6115     return false;
6116
6117   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6118   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6119     return true;
6120
6121   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6122   if (TREE_CODE (addend) == REAL_CST
6123       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6124     negate = !negate;
6125
6126   /* The mode has signed zeros, and we have to honor their sign.
6127      In this situation, there is only one case we can return true for.
6128      X - 0 is the same as X unless rounding towards -infinity is
6129      supported.  */
6130   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6131 }
6132
6133 /* Subroutine of fold() that checks comparisons of built-in math
6134    functions against real constants.
6135
6136    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6137    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6138    is the type of the result and ARG0 and ARG1 are the operands of the
6139    comparison.  ARG1 must be a TREE_REAL_CST.
6140
6141    The function returns the constant folded tree if a simplification
6142    can be made, and NULL_TREE otherwise.  */
6143
6144 static tree
6145 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6146                      tree type, tree arg0, tree arg1)
6147 {
6148   REAL_VALUE_TYPE c;
6149
6150   if (BUILTIN_SQRT_P (fcode))
6151     {
6152       tree arg = CALL_EXPR_ARG (arg0, 0);
6153       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6154
6155       c = TREE_REAL_CST (arg1);
6156       if (REAL_VALUE_NEGATIVE (c))
6157         {
6158           /* sqrt(x) < y is always false, if y is negative.  */
6159           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6160             return omit_one_operand (type, integer_zero_node, arg);
6161
6162           /* sqrt(x) > y is always true, if y is negative and we
6163              don't care about NaNs, i.e. negative values of x.  */
6164           if (code == NE_EXPR || !HONOR_NANS (mode))
6165             return omit_one_operand (type, integer_one_node, arg);
6166
6167           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6168           return fold_build2 (GE_EXPR, type, arg,
6169                               build_real (TREE_TYPE (arg), dconst0));
6170         }
6171       else if (code == GT_EXPR || code == GE_EXPR)
6172         {
6173           REAL_VALUE_TYPE c2;
6174
6175           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6176           real_convert (&c2, mode, &c2);
6177
6178           if (REAL_VALUE_ISINF (c2))
6179             {
6180               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6181               if (HONOR_INFINITIES (mode))
6182                 return fold_build2 (EQ_EXPR, type, arg,
6183                                     build_real (TREE_TYPE (arg), c2));
6184
6185               /* sqrt(x) > y is always false, when y is very large
6186                  and we don't care about infinities.  */
6187               return omit_one_operand (type, integer_zero_node, arg);
6188             }
6189
6190           /* sqrt(x) > c is the same as x > c*c.  */
6191           return fold_build2 (code, type, arg,
6192                               build_real (TREE_TYPE (arg), c2));
6193         }
6194       else if (code == LT_EXPR || code == LE_EXPR)
6195         {
6196           REAL_VALUE_TYPE c2;
6197
6198           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6199           real_convert (&c2, mode, &c2);
6200
6201           if (REAL_VALUE_ISINF (c2))
6202             {
6203               /* sqrt(x) < y is always true, when y is a very large
6204                  value and we don't care about NaNs or Infinities.  */
6205               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6206                 return omit_one_operand (type, integer_one_node, arg);
6207
6208               /* sqrt(x) < y is x != +Inf when y is very large and we
6209                  don't care about NaNs.  */
6210               if (! HONOR_NANS (mode))
6211                 return fold_build2 (NE_EXPR, type, arg,
6212                                     build_real (TREE_TYPE (arg), c2));
6213
6214               /* sqrt(x) < y is x >= 0 when y is very large and we
6215                  don't care about Infinities.  */
6216               if (! HONOR_INFINITIES (mode))
6217                 return fold_build2 (GE_EXPR, type, arg,
6218                                     build_real (TREE_TYPE (arg), dconst0));
6219
6220               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6221               if (lang_hooks.decls.global_bindings_p () != 0
6222                   || CONTAINS_PLACEHOLDER_P (arg))
6223                 return NULL_TREE;
6224
6225               arg = save_expr (arg);
6226               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6227                                   fold_build2 (GE_EXPR, type, arg,
6228                                                build_real (TREE_TYPE (arg),
6229                                                            dconst0)),
6230                                   fold_build2 (NE_EXPR, type, arg,
6231                                                build_real (TREE_TYPE (arg),
6232                                                            c2)));
6233             }
6234
6235           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6236           if (! HONOR_NANS (mode))
6237             return fold_build2 (code, type, arg,
6238                                 build_real (TREE_TYPE (arg), c2));
6239
6240           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6241           if (lang_hooks.decls.global_bindings_p () == 0
6242               && ! CONTAINS_PLACEHOLDER_P (arg))
6243             {
6244               arg = save_expr (arg);
6245               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6246                                   fold_build2 (GE_EXPR, type, arg,
6247                                                build_real (TREE_TYPE (arg),
6248                                                            dconst0)),
6249                                   fold_build2 (code, type, arg,
6250                                                build_real (TREE_TYPE (arg),
6251                                                            c2)));
6252             }
6253         }
6254     }
6255
6256   return NULL_TREE;
6257 }
6258
6259 /* Subroutine of fold() that optimizes comparisons against Infinities,
6260    either +Inf or -Inf.
6261
6262    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6263    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6264    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6265
6266    The function returns the constant folded tree if a simplification
6267    can be made, and NULL_TREE otherwise.  */
6268
6269 static tree
6270 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6271 {
6272   enum machine_mode mode;
6273   REAL_VALUE_TYPE max;
6274   tree temp;
6275   bool neg;
6276
6277   mode = TYPE_MODE (TREE_TYPE (arg0));
6278
6279   /* For negative infinity swap the sense of the comparison.  */
6280   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6281   if (neg)
6282     code = swap_tree_comparison (code);
6283
6284   switch (code)
6285     {
6286     case GT_EXPR:
6287       /* x > +Inf is always false, if with ignore sNANs.  */
6288       if (HONOR_SNANS (mode))
6289         return NULL_TREE;
6290       return omit_one_operand (type, integer_zero_node, arg0);
6291
6292     case LE_EXPR:
6293       /* x <= +Inf is always true, if we don't case about NaNs.  */
6294       if (! HONOR_NANS (mode))
6295         return omit_one_operand (type, integer_one_node, arg0);
6296
6297       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6298       if (lang_hooks.decls.global_bindings_p () == 0
6299           && ! CONTAINS_PLACEHOLDER_P (arg0))
6300         {
6301           arg0 = save_expr (arg0);
6302           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6303         }
6304       break;
6305
6306     case EQ_EXPR:
6307     case GE_EXPR:
6308       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6309       real_maxval (&max, neg, mode);
6310       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6311                           arg0, build_real (TREE_TYPE (arg0), max));
6312
6313     case LT_EXPR:
6314       /* x < +Inf is always equal to x <= DBL_MAX.  */
6315       real_maxval (&max, neg, mode);
6316       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6317                           arg0, build_real (TREE_TYPE (arg0), max));
6318
6319     case NE_EXPR:
6320       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6321       real_maxval (&max, neg, mode);
6322       if (! HONOR_NANS (mode))
6323         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6324                             arg0, build_real (TREE_TYPE (arg0), max));
6325
6326       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6327                           arg0, build_real (TREE_TYPE (arg0), max));
6328       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6329
6330     default:
6331       break;
6332     }
6333
6334   return NULL_TREE;
6335 }
6336
6337 /* Subroutine of fold() that optimizes comparisons of a division by
6338    a nonzero integer constant against an integer constant, i.e.
6339    X/C1 op C2.
6340
6341    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6342    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6343    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6344
6345    The function returns the constant folded tree if a simplification
6346    can be made, and NULL_TREE otherwise.  */
6347
6348 static tree
6349 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6350 {
6351   tree prod, tmp, hi, lo;
6352   tree arg00 = TREE_OPERAND (arg0, 0);
6353   tree arg01 = TREE_OPERAND (arg0, 1);
6354   unsigned HOST_WIDE_INT lpart;
6355   HOST_WIDE_INT hpart;
6356   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6357   bool neg_overflow;
6358   int overflow;
6359
6360   /* We have to do this the hard way to detect unsigned overflow.
6361      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6362   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6363                                    TREE_INT_CST_HIGH (arg01),
6364                                    TREE_INT_CST_LOW (arg1),
6365                                    TREE_INT_CST_HIGH (arg1),
6366                                    &lpart, &hpart, unsigned_p);
6367   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6368                                 -1, overflow);
6369   neg_overflow = false;
6370
6371   if (unsigned_p)
6372     {
6373       tmp = int_const_binop (MINUS_EXPR, arg01,
6374                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6375       lo = prod;
6376
6377       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6378       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6379                                        TREE_INT_CST_HIGH (prod),
6380                                        TREE_INT_CST_LOW (tmp),
6381                                        TREE_INT_CST_HIGH (tmp),
6382                                        &lpart, &hpart, unsigned_p);
6383       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6384                                   -1, overflow | TREE_OVERFLOW (prod));
6385     }
6386   else if (tree_int_cst_sgn (arg01) >= 0)
6387     {
6388       tmp = int_const_binop (MINUS_EXPR, arg01,
6389                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6390       switch (tree_int_cst_sgn (arg1))
6391         {
6392         case -1:
6393           neg_overflow = true;
6394           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6395           hi = prod;
6396           break;
6397
6398         case  0:
6399           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6400           hi = tmp;
6401           break;
6402
6403         case  1:
6404           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6405           lo = prod;
6406           break;
6407
6408         default:
6409           gcc_unreachable ();
6410         }
6411     }
6412   else
6413     {
6414       /* A negative divisor reverses the relational operators.  */
6415       code = swap_tree_comparison (code);
6416
6417       tmp = int_const_binop (PLUS_EXPR, arg01,
6418                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6419       switch (tree_int_cst_sgn (arg1))
6420         {
6421         case -1:
6422           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6423           lo = prod;
6424           break;
6425
6426         case  0:
6427           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6428           lo = tmp;
6429           break;
6430
6431         case  1:
6432           neg_overflow = true;
6433           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6434           hi = prod;
6435           break;
6436
6437         default:
6438           gcc_unreachable ();
6439         }
6440     }
6441
6442   switch (code)
6443     {
6444     case EQ_EXPR:
6445       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6446         return omit_one_operand (type, integer_zero_node, arg00);
6447       if (TREE_OVERFLOW (hi))
6448         return fold_build2 (GE_EXPR, type, arg00, lo);
6449       if (TREE_OVERFLOW (lo))
6450         return fold_build2 (LE_EXPR, type, arg00, hi);
6451       return build_range_check (type, arg00, 1, lo, hi);
6452
6453     case NE_EXPR:
6454       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6455         return omit_one_operand (type, integer_one_node, arg00);
6456       if (TREE_OVERFLOW (hi))
6457         return fold_build2 (LT_EXPR, type, arg00, lo);
6458       if (TREE_OVERFLOW (lo))
6459         return fold_build2 (GT_EXPR, type, arg00, hi);
6460       return build_range_check (type, arg00, 0, lo, hi);
6461
6462     case LT_EXPR:
6463       if (TREE_OVERFLOW (lo))
6464         {
6465           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6466           return omit_one_operand (type, tmp, arg00);
6467         }
6468       return fold_build2 (LT_EXPR, type, arg00, lo);
6469
6470     case LE_EXPR:
6471       if (TREE_OVERFLOW (hi))
6472         {
6473           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6474           return omit_one_operand (type, tmp, arg00);
6475         }
6476       return fold_build2 (LE_EXPR, type, arg00, hi);
6477
6478     case GT_EXPR:
6479       if (TREE_OVERFLOW (hi))
6480         {
6481           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6482           return omit_one_operand (type, tmp, arg00);
6483         }
6484       return fold_build2 (GT_EXPR, type, arg00, hi);
6485
6486     case GE_EXPR:
6487       if (TREE_OVERFLOW (lo))
6488         {
6489           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6490           return omit_one_operand (type, tmp, arg00);
6491         }
6492       return fold_build2 (GE_EXPR, type, arg00, lo);
6493
6494     default:
6495       break;
6496     }
6497
6498   return NULL_TREE;
6499 }
6500
6501
6502 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6503    equality/inequality test, then return a simplified form of the test
6504    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6505    result type.  */
6506
6507 static tree
6508 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6509                                      tree result_type)
6510 {
6511   /* If this is testing a single bit, we can optimize the test.  */
6512   if ((code == NE_EXPR || code == EQ_EXPR)
6513       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6514       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6515     {
6516       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6517          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6518       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6519
6520       if (arg00 != NULL_TREE
6521           /* This is only a win if casting to a signed type is cheap,
6522              i.e. when arg00's type is not a partial mode.  */
6523           && TYPE_PRECISION (TREE_TYPE (arg00))
6524              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6525         {
6526           tree stype = signed_type_for (TREE_TYPE (arg00));
6527           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6528                               result_type, fold_convert (stype, arg00),
6529                               build_int_cst (stype, 0));
6530         }
6531     }
6532
6533   return NULL_TREE;
6534 }
6535
6536 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6537    equality/inequality test, then return a simplified form of
6538    the test using shifts and logical operations.  Otherwise return
6539    NULL.  TYPE is the desired result type.  */
6540
6541 tree
6542 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6543                       tree result_type)
6544 {
6545   /* If this is testing a single bit, we can optimize the test.  */
6546   if ((code == NE_EXPR || code == EQ_EXPR)
6547       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6548       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6549     {
6550       tree inner = TREE_OPERAND (arg0, 0);
6551       tree type = TREE_TYPE (arg0);
6552       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6553       enum machine_mode operand_mode = TYPE_MODE (type);
6554       int ops_unsigned;
6555       tree signed_type, unsigned_type, intermediate_type;
6556       tree tem, one;
6557
6558       /* First, see if we can fold the single bit test into a sign-bit
6559          test.  */
6560       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6561                                                  result_type);
6562       if (tem)
6563         return tem;
6564
6565       /* Otherwise we have (A & C) != 0 where C is a single bit,
6566          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6567          Similarly for (A & C) == 0.  */
6568
6569       /* If INNER is a right shift of a constant and it plus BITNUM does
6570          not overflow, adjust BITNUM and INNER.  */
6571       if (TREE_CODE (inner) == RSHIFT_EXPR
6572           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6573           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6574           && bitnum < TYPE_PRECISION (type)
6575           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6576                                    bitnum - TYPE_PRECISION (type)))
6577         {
6578           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6579           inner = TREE_OPERAND (inner, 0);
6580         }
6581
6582       /* If we are going to be able to omit the AND below, we must do our
6583          operations as unsigned.  If we must use the AND, we have a choice.
6584          Normally unsigned is faster, but for some machines signed is.  */
6585 #ifdef LOAD_EXTEND_OP
6586       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6587                       && !flag_syntax_only) ? 0 : 1;
6588 #else
6589       ops_unsigned = 1;
6590 #endif
6591
6592       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6593       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6594       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6595       inner = fold_convert (intermediate_type, inner);
6596
6597       if (bitnum != 0)
6598         inner = build2 (RSHIFT_EXPR, intermediate_type,
6599                         inner, size_int (bitnum));
6600
6601       one = build_int_cst (intermediate_type, 1);
6602
6603       if (code == EQ_EXPR)
6604         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6605
6606       /* Put the AND last so it can combine with more things.  */
6607       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6608
6609       /* Make sure to return the proper type.  */
6610       inner = fold_convert (result_type, inner);
6611
6612       return inner;
6613     }
6614   return NULL_TREE;
6615 }
6616
6617 /* Check whether we are allowed to reorder operands arg0 and arg1,
6618    such that the evaluation of arg1 occurs before arg0.  */
6619
6620 static bool
6621 reorder_operands_p (const_tree arg0, const_tree arg1)
6622 {
6623   if (! flag_evaluation_order)
6624       return true;
6625   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6626     return true;
6627   return ! TREE_SIDE_EFFECTS (arg0)
6628          && ! TREE_SIDE_EFFECTS (arg1);
6629 }
6630
6631 /* Test whether it is preferable two swap two operands, ARG0 and
6632    ARG1, for example because ARG0 is an integer constant and ARG1
6633    isn't.  If REORDER is true, only recommend swapping if we can
6634    evaluate the operands in reverse order.  */
6635
6636 bool
6637 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6638 {
6639   STRIP_SIGN_NOPS (arg0);
6640   STRIP_SIGN_NOPS (arg1);
6641
6642   if (TREE_CODE (arg1) == INTEGER_CST)
6643     return 0;
6644   if (TREE_CODE (arg0) == INTEGER_CST)
6645     return 1;
6646
6647   if (TREE_CODE (arg1) == REAL_CST)
6648     return 0;
6649   if (TREE_CODE (arg0) == REAL_CST)
6650     return 1;
6651
6652   if (TREE_CODE (arg1) == FIXED_CST)
6653     return 0;
6654   if (TREE_CODE (arg0) == FIXED_CST)
6655     return 1;
6656
6657   if (TREE_CODE (arg1) == COMPLEX_CST)
6658     return 0;
6659   if (TREE_CODE (arg0) == COMPLEX_CST)
6660     return 1;
6661
6662   if (TREE_CONSTANT (arg1))
6663     return 0;
6664   if (TREE_CONSTANT (arg0))
6665     return 1;
6666
6667   if (optimize_size)
6668     return 0;
6669
6670   if (reorder && flag_evaluation_order
6671       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6672     return 0;
6673
6674   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6675      for commutative and comparison operators.  Ensuring a canonical
6676      form allows the optimizers to find additional redundancies without
6677      having to explicitly check for both orderings.  */
6678   if (TREE_CODE (arg0) == SSA_NAME
6679       && TREE_CODE (arg1) == SSA_NAME
6680       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6681     return 1;
6682
6683   /* Put SSA_NAMEs last.  */
6684   if (TREE_CODE (arg1) == SSA_NAME)
6685     return 0;
6686   if (TREE_CODE (arg0) == SSA_NAME)
6687     return 1;
6688
6689   /* Put variables last.  */
6690   if (DECL_P (arg1))
6691     return 0;
6692   if (DECL_P (arg0))
6693     return 1;
6694
6695   return 0;
6696 }
6697
6698 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6699    ARG0 is extended to a wider type.  */
6700
6701 static tree
6702 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6703 {
6704   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6705   tree arg1_unw;
6706   tree shorter_type, outer_type;
6707   tree min, max;
6708   bool above, below;
6709
6710   if (arg0_unw == arg0)
6711     return NULL_TREE;
6712   shorter_type = TREE_TYPE (arg0_unw);
6713
6714 #ifdef HAVE_canonicalize_funcptr_for_compare
6715   /* Disable this optimization if we're casting a function pointer
6716      type on targets that require function pointer canonicalization.  */
6717   if (HAVE_canonicalize_funcptr_for_compare
6718       && TREE_CODE (shorter_type) == POINTER_TYPE
6719       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6720     return NULL_TREE;
6721 #endif
6722
6723   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6724     return NULL_TREE;
6725
6726   arg1_unw = get_unwidened (arg1, NULL_TREE);
6727
6728   /* If possible, express the comparison in the shorter mode.  */
6729   if ((code == EQ_EXPR || code == NE_EXPR
6730        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6731       && (TREE_TYPE (arg1_unw) == shorter_type
6732           || (TYPE_PRECISION (shorter_type)
6733               > TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6734           || ((TYPE_PRECISION (shorter_type)
6735                == TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6736               && (TYPE_UNSIGNED (shorter_type)
6737                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
6738           || (TREE_CODE (arg1_unw) == INTEGER_CST
6739               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6740                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6741               && int_fits_type_p (arg1_unw, shorter_type))))
6742     return fold_build2 (code, type, arg0_unw,
6743                        fold_convert (shorter_type, arg1_unw));
6744
6745   if (TREE_CODE (arg1_unw) != INTEGER_CST
6746       || TREE_CODE (shorter_type) != INTEGER_TYPE
6747       || !int_fits_type_p (arg1_unw, shorter_type))
6748     return NULL_TREE;
6749
6750   /* If we are comparing with the integer that does not fit into the range
6751      of the shorter type, the result is known.  */
6752   outer_type = TREE_TYPE (arg1_unw);
6753   min = lower_bound_in_type (outer_type, shorter_type);
6754   max = upper_bound_in_type (outer_type, shorter_type);
6755
6756   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6757                                                    max, arg1_unw));
6758   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6759                                                    arg1_unw, min));
6760
6761   switch (code)
6762     {
6763     case EQ_EXPR:
6764       if (above || below)
6765         return omit_one_operand (type, integer_zero_node, arg0);
6766       break;
6767
6768     case NE_EXPR:
6769       if (above || below)
6770         return omit_one_operand (type, integer_one_node, arg0);
6771       break;
6772
6773     case LT_EXPR:
6774     case LE_EXPR:
6775       if (above)
6776         return omit_one_operand (type, integer_one_node, arg0);
6777       else if (below)
6778         return omit_one_operand (type, integer_zero_node, arg0);
6779
6780     case GT_EXPR:
6781     case GE_EXPR:
6782       if (above)
6783         return omit_one_operand (type, integer_zero_node, arg0);
6784       else if (below)
6785         return omit_one_operand (type, integer_one_node, arg0);
6786
6787     default:
6788       break;
6789     }
6790
6791   return NULL_TREE;
6792 }
6793
6794 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6795    ARG0 just the signedness is changed.  */
6796
6797 static tree
6798 fold_sign_changed_comparison (enum tree_code code, tree type,
6799                               tree arg0, tree arg1)
6800 {
6801   tree arg0_inner;
6802   tree inner_type, outer_type;
6803
6804   if (TREE_CODE (arg0) != NOP_EXPR
6805       && TREE_CODE (arg0) != CONVERT_EXPR)
6806     return NULL_TREE;
6807
6808   outer_type = TREE_TYPE (arg0);
6809   arg0_inner = TREE_OPERAND (arg0, 0);
6810   inner_type = TREE_TYPE (arg0_inner);
6811
6812 #ifdef HAVE_canonicalize_funcptr_for_compare
6813   /* Disable this optimization if we're casting a function pointer
6814      type on targets that require function pointer canonicalization.  */
6815   if (HAVE_canonicalize_funcptr_for_compare
6816       && TREE_CODE (inner_type) == POINTER_TYPE
6817       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6818     return NULL_TREE;
6819 #endif
6820
6821   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6822     return NULL_TREE;
6823
6824   /* If the conversion is from an integral subtype to its basetype
6825      leave it alone.  */
6826   if (TREE_TYPE (inner_type) == outer_type)
6827     return NULL_TREE;
6828
6829   if (TREE_CODE (arg1) != INTEGER_CST
6830       && !((TREE_CODE (arg1) == NOP_EXPR
6831             || TREE_CODE (arg1) == CONVERT_EXPR)
6832            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6833     return NULL_TREE;
6834
6835   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6836       && code != NE_EXPR
6837       && code != EQ_EXPR)
6838     return NULL_TREE;
6839
6840   if (TREE_CODE (arg1) == INTEGER_CST)
6841     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6842                                   TREE_INT_CST_HIGH (arg1), 0,
6843                                   TREE_OVERFLOW (arg1));
6844   else
6845     arg1 = fold_convert (inner_type, arg1);
6846
6847   return fold_build2 (code, type, arg0_inner, arg1);
6848 }
6849
6850 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6851    step of the array.  Reconstructs s and delta in the case of s * delta
6852    being an integer constant (and thus already folded).
6853    ADDR is the address. MULT is the multiplicative expression.
6854    If the function succeeds, the new address expression is returned.  Otherwise
6855    NULL_TREE is returned.  */
6856
6857 static tree
6858 try_move_mult_to_index (tree addr, tree op1)
6859 {
6860   tree s, delta, step;
6861   tree ref = TREE_OPERAND (addr, 0), pref;
6862   tree ret, pos;
6863   tree itype;
6864   bool mdim = false;
6865
6866   /*  Strip the nops that might be added when converting op1 to sizetype. */
6867   STRIP_NOPS (op1);
6868
6869   /* Canonicalize op1 into a possibly non-constant delta
6870      and an INTEGER_CST s.  */
6871   if (TREE_CODE (op1) == MULT_EXPR)
6872     {
6873       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6874
6875       STRIP_NOPS (arg0);
6876       STRIP_NOPS (arg1);
6877   
6878       if (TREE_CODE (arg0) == INTEGER_CST)
6879         {
6880           s = arg0;
6881           delta = arg1;
6882         }
6883       else if (TREE_CODE (arg1) == INTEGER_CST)
6884         {
6885           s = arg1;
6886           delta = arg0;
6887         }
6888       else
6889         return NULL_TREE;
6890     }
6891   else if (TREE_CODE (op1) == INTEGER_CST)
6892     {
6893       delta = op1;
6894       s = NULL_TREE;
6895     }
6896   else
6897     {
6898       /* Simulate we are delta * 1.  */
6899       delta = op1;
6900       s = integer_one_node;
6901     }
6902
6903   for (;; ref = TREE_OPERAND (ref, 0))
6904     {
6905       if (TREE_CODE (ref) == ARRAY_REF)
6906         {
6907           /* Remember if this was a multi-dimensional array.  */
6908           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6909             mdim = true;
6910
6911           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6912           if (! itype)
6913             continue;
6914
6915           step = array_ref_element_size (ref);
6916           if (TREE_CODE (step) != INTEGER_CST)
6917             continue;
6918
6919           if (s)
6920             {
6921               if (! tree_int_cst_equal (step, s))
6922                 continue;
6923             }
6924           else
6925             {
6926               /* Try if delta is a multiple of step.  */
6927               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
6928               if (! tmp)
6929                 continue;
6930               delta = tmp;
6931             }
6932
6933           /* Only fold here if we can verify we do not overflow one
6934              dimension of a multi-dimensional array.  */
6935           if (mdim)
6936             {
6937               tree tmp;
6938
6939               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6940                   || !INTEGRAL_TYPE_P (itype)
6941                   || !TYPE_MAX_VALUE (itype)
6942                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6943                 continue;
6944
6945               tmp = fold_binary (PLUS_EXPR, itype,
6946                                  fold_convert (itype,
6947                                                TREE_OPERAND (ref, 1)),
6948                                  fold_convert (itype, delta));
6949               if (!tmp
6950                   || TREE_CODE (tmp) != INTEGER_CST
6951                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6952                 continue;
6953             }
6954
6955           break;
6956         }
6957       else
6958         mdim = false;
6959
6960       if (!handled_component_p (ref))
6961         return NULL_TREE;
6962     }
6963
6964   /* We found the suitable array reference.  So copy everything up to it,
6965      and replace the index.  */
6966
6967   pref = TREE_OPERAND (addr, 0);
6968   ret = copy_node (pref);
6969   pos = ret;
6970
6971   while (pref != ref)
6972     {
6973       pref = TREE_OPERAND (pref, 0);
6974       TREE_OPERAND (pos, 0) = copy_node (pref);
6975       pos = TREE_OPERAND (pos, 0);
6976     }
6977
6978   TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
6979                                        fold_convert (itype,
6980                                                      TREE_OPERAND (pos, 1)),
6981                                        fold_convert (itype, delta));
6982
6983   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6984 }
6985
6986
6987 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6988    means A >= Y && A != MAX, but in this case we know that
6989    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6990
6991 static tree
6992 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6993 {
6994   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6995
6996   if (TREE_CODE (bound) == LT_EXPR)
6997     a = TREE_OPERAND (bound, 0);
6998   else if (TREE_CODE (bound) == GT_EXPR)
6999     a = TREE_OPERAND (bound, 1);
7000   else
7001     return NULL_TREE;
7002
7003   typea = TREE_TYPE (a);
7004   if (!INTEGRAL_TYPE_P (typea)
7005       && !POINTER_TYPE_P (typea))
7006     return NULL_TREE;
7007
7008   if (TREE_CODE (ineq) == LT_EXPR)
7009     {
7010       a1 = TREE_OPERAND (ineq, 1);
7011       y = TREE_OPERAND (ineq, 0);
7012     }
7013   else if (TREE_CODE (ineq) == GT_EXPR)
7014     {
7015       a1 = TREE_OPERAND (ineq, 0);
7016       y = TREE_OPERAND (ineq, 1);
7017     }
7018   else
7019     return NULL_TREE;
7020
7021   if (TREE_TYPE (a1) != typea)
7022     return NULL_TREE;
7023
7024   if (POINTER_TYPE_P (typea))
7025     {
7026       /* Convert the pointer types into integer before taking the difference.  */
7027       tree ta = fold_convert (ssizetype, a);
7028       tree ta1 = fold_convert (ssizetype, a1);
7029       diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7030     }
7031   else
7032    diff = fold_binary (MINUS_EXPR, typea, a1, a);
7033
7034   if (!diff || !integer_onep (diff))
7035    return NULL_TREE;
7036
7037   return fold_build2 (GE_EXPR, type, a, y);
7038 }
7039
7040 /* Fold a sum or difference of at least one multiplication.
7041    Returns the folded tree or NULL if no simplification could be made.  */
7042
7043 static tree
7044 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7045 {
7046   tree arg00, arg01, arg10, arg11;
7047   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7048
7049   /* (A * C) +- (B * C) -> (A+-B) * C.
7050      (A * C) +- A -> A * (C+-1).
7051      We are most concerned about the case where C is a constant,
7052      but other combinations show up during loop reduction.  Since
7053      it is not difficult, try all four possibilities.  */
7054
7055   if (TREE_CODE (arg0) == MULT_EXPR)
7056     {
7057       arg00 = TREE_OPERAND (arg0, 0);
7058       arg01 = TREE_OPERAND (arg0, 1);
7059     }
7060   else if (TREE_CODE (arg0) == INTEGER_CST)
7061     {
7062       arg00 = build_one_cst (type);
7063       arg01 = arg0;
7064     }
7065   else
7066     {
7067       /* We cannot generate constant 1 for fract.  */
7068       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7069         return NULL_TREE;
7070       arg00 = arg0;
7071       arg01 = build_one_cst (type);
7072     }
7073   if (TREE_CODE (arg1) == MULT_EXPR)
7074     {
7075       arg10 = TREE_OPERAND (arg1, 0);
7076       arg11 = TREE_OPERAND (arg1, 1);
7077     }
7078   else if (TREE_CODE (arg1) == INTEGER_CST)
7079     {
7080       arg10 = build_one_cst (type);
7081       arg11 = arg1;
7082     }
7083   else
7084     {
7085       /* We cannot generate constant 1 for fract.  */
7086       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7087         return NULL_TREE;
7088       arg10 = arg1;
7089       arg11 = build_one_cst (type);
7090     }
7091   same = NULL_TREE;
7092
7093   if (operand_equal_p (arg01, arg11, 0))
7094     same = arg01, alt0 = arg00, alt1 = arg10;
7095   else if (operand_equal_p (arg00, arg10, 0))
7096     same = arg00, alt0 = arg01, alt1 = arg11;
7097   else if (operand_equal_p (arg00, arg11, 0))
7098     same = arg00, alt0 = arg01, alt1 = arg10;
7099   else if (operand_equal_p (arg01, arg10, 0))
7100     same = arg01, alt0 = arg00, alt1 = arg11;
7101
7102   /* No identical multiplicands; see if we can find a common
7103      power-of-two factor in non-power-of-two multiplies.  This
7104      can help in multi-dimensional array access.  */
7105   else if (host_integerp (arg01, 0)
7106            && host_integerp (arg11, 0))
7107     {
7108       HOST_WIDE_INT int01, int11, tmp;
7109       bool swap = false;
7110       tree maybe_same;
7111       int01 = TREE_INT_CST_LOW (arg01);
7112       int11 = TREE_INT_CST_LOW (arg11);
7113
7114       /* Move min of absolute values to int11.  */
7115       if ((int01 >= 0 ? int01 : -int01)
7116           < (int11 >= 0 ? int11 : -int11))
7117         {
7118           tmp = int01, int01 = int11, int11 = tmp;
7119           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7120           maybe_same = arg01;
7121           swap = true;
7122         }
7123       else
7124         maybe_same = arg11;
7125
7126       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7127         {
7128           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7129                               build_int_cst (TREE_TYPE (arg00),
7130                                              int01 / int11));
7131           alt1 = arg10;
7132           same = maybe_same;
7133           if (swap)
7134             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7135         }
7136     }
7137
7138   if (same)
7139     return fold_build2 (MULT_EXPR, type,
7140                         fold_build2 (code, type,
7141                                      fold_convert (type, alt0),
7142                                      fold_convert (type, alt1)),
7143                         fold_convert (type, same));
7144
7145   return NULL_TREE;
7146 }
7147
7148 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7149    specified by EXPR into the buffer PTR of length LEN bytes.
7150    Return the number of bytes placed in the buffer, or zero
7151    upon failure.  */
7152
7153 static int
7154 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7155 {
7156   tree type = TREE_TYPE (expr);
7157   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7158   int byte, offset, word, words;
7159   unsigned char value;
7160
7161   if (total_bytes > len)
7162     return 0;
7163   words = total_bytes / UNITS_PER_WORD;
7164
7165   for (byte = 0; byte < total_bytes; byte++)
7166     {
7167       int bitpos = byte * BITS_PER_UNIT;
7168       if (bitpos < HOST_BITS_PER_WIDE_INT)
7169         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7170       else
7171         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7172                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7173
7174       if (total_bytes > UNITS_PER_WORD)
7175         {
7176           word = byte / UNITS_PER_WORD;
7177           if (WORDS_BIG_ENDIAN)
7178             word = (words - 1) - word;
7179           offset = word * UNITS_PER_WORD;
7180           if (BYTES_BIG_ENDIAN)
7181             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7182           else
7183             offset += byte % UNITS_PER_WORD;
7184         }
7185       else
7186         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7187       ptr[offset] = value;
7188     }
7189   return total_bytes;
7190 }
7191
7192
7193 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7194    specified by EXPR into the buffer PTR of length LEN bytes.
7195    Return the number of bytes placed in the buffer, or zero
7196    upon failure.  */
7197
7198 static int
7199 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7200 {
7201   tree type = TREE_TYPE (expr);
7202   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7203   int byte, offset, word, words, bitpos;
7204   unsigned char value;
7205
7206   /* There are always 32 bits in each long, no matter the size of
7207      the hosts long.  We handle floating point representations with
7208      up to 192 bits.  */
7209   long tmp[6];
7210
7211   if (total_bytes > len)
7212     return 0;
7213   words = 32 / UNITS_PER_WORD;
7214
7215   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7216
7217   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7218        bitpos += BITS_PER_UNIT)
7219     {
7220       byte = (bitpos / BITS_PER_UNIT) & 3;
7221       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7222
7223       if (UNITS_PER_WORD < 4)
7224         {
7225           word = byte / UNITS_PER_WORD;
7226           if (WORDS_BIG_ENDIAN)
7227             word = (words - 1) - word;
7228           offset = word * UNITS_PER_WORD;
7229           if (BYTES_BIG_ENDIAN)
7230             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7231           else
7232             offset += byte % UNITS_PER_WORD;
7233         }
7234       else
7235         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7236       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7237     }
7238   return total_bytes;
7239 }
7240
7241 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7242    specified by EXPR into the buffer PTR of length LEN bytes.
7243    Return the number of bytes placed in the buffer, or zero
7244    upon failure.  */
7245
7246 static int
7247 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7248 {
7249   int rsize, isize;
7250   tree part;
7251
7252   part = TREE_REALPART (expr);
7253   rsize = native_encode_expr (part, ptr, len);
7254   if (rsize == 0)
7255     return 0;
7256   part = TREE_IMAGPART (expr);
7257   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7258   if (isize != rsize)
7259     return 0;
7260   return rsize + isize;
7261 }
7262
7263
7264 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7265    specified by EXPR into the buffer PTR of length LEN bytes.
7266    Return the number of bytes placed in the buffer, or zero
7267    upon failure.  */
7268
7269 static int
7270 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7271 {
7272   int i, size, offset, count;
7273   tree itype, elem, elements;
7274
7275   offset = 0;
7276   elements = TREE_VECTOR_CST_ELTS (expr);
7277   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7278   itype = TREE_TYPE (TREE_TYPE (expr));
7279   size = GET_MODE_SIZE (TYPE_MODE (itype));
7280   for (i = 0; i < count; i++)
7281     {
7282       if (elements)
7283         {
7284           elem = TREE_VALUE (elements);
7285           elements = TREE_CHAIN (elements);
7286         }
7287       else
7288         elem = NULL_TREE;
7289
7290       if (elem)
7291         {
7292           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7293             return 0;
7294         }
7295       else
7296         {
7297           if (offset + size > len)
7298             return 0;
7299           memset (ptr+offset, 0, size);
7300         }
7301       offset += size;
7302     }
7303   return offset;
7304 }
7305
7306
7307 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7308    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7309    buffer PTR of length LEN bytes.  Return the number of bytes
7310    placed in the buffer, or zero upon failure.  */
7311
7312 int
7313 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7314 {
7315   switch (TREE_CODE (expr))
7316     {
7317     case INTEGER_CST:
7318       return native_encode_int (expr, ptr, len);
7319
7320     case REAL_CST:
7321       return native_encode_real (expr, ptr, len);
7322
7323     case COMPLEX_CST:
7324       return native_encode_complex (expr, ptr, len);
7325
7326     case VECTOR_CST:
7327       return native_encode_vector (expr, ptr, len);
7328
7329     default:
7330       return 0;
7331     }
7332 }
7333
7334
7335 /* Subroutine of native_interpret_expr.  Interpret the contents of
7336    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7337    If the buffer cannot be interpreted, return NULL_TREE.  */
7338
7339 static tree
7340 native_interpret_int (tree type, const unsigned char *ptr, int len)
7341 {
7342   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7343   int byte, offset, word, words;
7344   unsigned char value;
7345   unsigned int HOST_WIDE_INT lo = 0;
7346   HOST_WIDE_INT hi = 0;
7347
7348   if (total_bytes > len)
7349     return NULL_TREE;
7350   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7351     return NULL_TREE;
7352   words = total_bytes / UNITS_PER_WORD;
7353
7354   for (byte = 0; byte < total_bytes; byte++)
7355     {
7356       int bitpos = byte * BITS_PER_UNIT;
7357       if (total_bytes > UNITS_PER_WORD)
7358         {
7359           word = byte / UNITS_PER_WORD;
7360           if (WORDS_BIG_ENDIAN)
7361             word = (words - 1) - word;
7362           offset = word * UNITS_PER_WORD;
7363           if (BYTES_BIG_ENDIAN)
7364             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7365           else
7366             offset += byte % UNITS_PER_WORD;
7367         }
7368       else
7369         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7370       value = ptr[offset];
7371
7372       if (bitpos < HOST_BITS_PER_WIDE_INT)
7373         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7374       else
7375         hi |= (unsigned HOST_WIDE_INT) value
7376               << (bitpos - HOST_BITS_PER_WIDE_INT);
7377     }
7378
7379   return build_int_cst_wide_type (type, lo, hi);
7380 }
7381
7382
7383 /* Subroutine of native_interpret_expr.  Interpret the contents of
7384    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7385    If the buffer cannot be interpreted, return NULL_TREE.  */
7386
7387 static tree
7388 native_interpret_real (tree type, const unsigned char *ptr, int len)
7389 {
7390   enum machine_mode mode = TYPE_MODE (type);
7391   int total_bytes = GET_MODE_SIZE (mode);
7392   int byte, offset, word, words, bitpos;
7393   unsigned char value;
7394   /* There are always 32 bits in each long, no matter the size of
7395      the hosts long.  We handle floating point representations with
7396      up to 192 bits.  */
7397   REAL_VALUE_TYPE r;
7398   long tmp[6];
7399
7400   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7401   if (total_bytes > len || total_bytes > 24)
7402     return NULL_TREE;
7403   words = 32 / UNITS_PER_WORD;
7404
7405   memset (tmp, 0, sizeof (tmp));
7406   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7407        bitpos += BITS_PER_UNIT)
7408     {
7409       byte = (bitpos / BITS_PER_UNIT) & 3;
7410       if (UNITS_PER_WORD < 4)
7411         {
7412           word = byte / UNITS_PER_WORD;
7413           if (WORDS_BIG_ENDIAN)
7414             word = (words - 1) - word;
7415           offset = word * UNITS_PER_WORD;
7416           if (BYTES_BIG_ENDIAN)
7417             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7418           else
7419             offset += byte % UNITS_PER_WORD;
7420         }
7421       else
7422         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7423       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7424
7425       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7426     }
7427
7428   real_from_target (&r, tmp, mode);
7429   return build_real (type, r);
7430 }
7431
7432
7433 /* Subroutine of native_interpret_expr.  Interpret the contents of
7434    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7435    If the buffer cannot be interpreted, return NULL_TREE.  */
7436
7437 static tree
7438 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7439 {
7440   tree etype, rpart, ipart;
7441   int size;
7442
7443   etype = TREE_TYPE (type);
7444   size = GET_MODE_SIZE (TYPE_MODE (etype));
7445   if (size * 2 > len)
7446     return NULL_TREE;
7447   rpart = native_interpret_expr (etype, ptr, size);
7448   if (!rpart)
7449     return NULL_TREE;
7450   ipart = native_interpret_expr (etype, ptr+size, size);
7451   if (!ipart)
7452     return NULL_TREE;
7453   return build_complex (type, rpart, ipart);
7454 }
7455
7456
7457 /* Subroutine of native_interpret_expr.  Interpret the contents of
7458    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7459    If the buffer cannot be interpreted, return NULL_TREE.  */
7460
7461 static tree
7462 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7463 {
7464   tree etype, elem, elements;
7465   int i, size, count;
7466
7467   etype = TREE_TYPE (type);
7468   size = GET_MODE_SIZE (TYPE_MODE (etype));
7469   count = TYPE_VECTOR_SUBPARTS (type);
7470   if (size * count > len)
7471     return NULL_TREE;
7472
7473   elements = NULL_TREE;
7474   for (i = count - 1; i >= 0; i--)
7475     {
7476       elem = native_interpret_expr (etype, ptr+(i*size), size);
7477       if (!elem)
7478         return NULL_TREE;
7479       elements = tree_cons (NULL_TREE, elem, elements);
7480     }
7481   return build_vector (type, elements);
7482 }
7483
7484
7485 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7486    the buffer PTR of length LEN as a constant of type TYPE.  For
7487    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7488    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7489    return NULL_TREE.  */
7490
7491 tree
7492 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7493 {
7494   switch (TREE_CODE (type))
7495     {
7496     case INTEGER_TYPE:
7497     case ENUMERAL_TYPE:
7498     case BOOLEAN_TYPE:
7499       return native_interpret_int (type, ptr, len);
7500
7501     case REAL_TYPE:
7502       return native_interpret_real (type, ptr, len);
7503
7504     case COMPLEX_TYPE:
7505       return native_interpret_complex (type, ptr, len);
7506
7507     case VECTOR_TYPE:
7508       return native_interpret_vector (type, ptr, len);
7509
7510     default:
7511       return NULL_TREE;
7512     }
7513 }
7514
7515
7516 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7517    TYPE at compile-time.  If we're unable to perform the conversion
7518    return NULL_TREE.  */
7519
7520 static tree
7521 fold_view_convert_expr (tree type, tree expr)
7522 {
7523   /* We support up to 512-bit values (for V8DFmode).  */
7524   unsigned char buffer[64];
7525   int len;
7526
7527   /* Check that the host and target are sane.  */
7528   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7529     return NULL_TREE;
7530
7531   len = native_encode_expr (expr, buffer, sizeof (buffer));
7532   if (len == 0)
7533     return NULL_TREE;
7534
7535   return native_interpret_expr (type, buffer, len);
7536 }
7537
7538 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7539    to avoid confusing the gimplify process.  When IN_FOLD is true
7540    avoid modifications of T.  */
7541
7542 static tree
7543 build_fold_addr_expr_with_type_1 (tree t, tree ptrtype, bool in_fold)
7544 {
7545   /* The size of the object is not relevant when talking about its address.  */
7546   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7547     t = TREE_OPERAND (t, 0);
7548
7549   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7550   if (TREE_CODE (t) == INDIRECT_REF
7551       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7552     {
7553       t = TREE_OPERAND (t, 0);
7554
7555       if (TREE_TYPE (t) != ptrtype)
7556         t = build1 (NOP_EXPR, ptrtype, t);
7557     }
7558   else if (!in_fold)
7559     {
7560       tree base = t;
7561
7562       while (handled_component_p (base))
7563         base = TREE_OPERAND (base, 0);
7564
7565       if (DECL_P (base))
7566         TREE_ADDRESSABLE (base) = 1;
7567
7568       t = build1 (ADDR_EXPR, ptrtype, t);
7569     }
7570   else
7571     t = build1 (ADDR_EXPR, ptrtype, t);
7572
7573   return t;
7574 }
7575
7576 /* Build an expression for the address of T with type PTRTYPE.  This
7577    function modifies the input parameter 'T' by sometimes setting the
7578    TREE_ADDRESSABLE flag.  */
7579
7580 tree
7581 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7582 {
7583   return build_fold_addr_expr_with_type_1 (t, ptrtype, false);
7584 }
7585
7586 /* Build an expression for the address of T.  This function modifies
7587    the input parameter 'T' by sometimes setting the TREE_ADDRESSABLE
7588    flag.  When called from fold functions, use fold_addr_expr instead.  */
7589
7590 tree
7591 build_fold_addr_expr (tree t)
7592 {
7593   return build_fold_addr_expr_with_type_1 (t, 
7594                                            build_pointer_type (TREE_TYPE (t)),
7595                                            false);
7596 }
7597
7598 /* Same as build_fold_addr_expr, builds an expression for the address
7599    of T, but avoids touching the input node 't'.  Fold functions
7600    should use this version.  */
7601
7602 static tree
7603 fold_addr_expr (tree t)
7604 {
7605   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7606
7607   return build_fold_addr_expr_with_type_1 (t, ptrtype, true);
7608 }
7609
7610 /* Fold a unary expression of code CODE and type TYPE with operand
7611    OP0.  Return the folded expression if folding is successful.
7612    Otherwise, return NULL_TREE.  */
7613
7614 tree
7615 fold_unary (enum tree_code code, tree type, tree op0)
7616 {
7617   tree tem;
7618   tree arg0;
7619   enum tree_code_class kind = TREE_CODE_CLASS (code);
7620
7621   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7622               && TREE_CODE_LENGTH (code) == 1);
7623
7624   arg0 = op0;
7625   if (arg0)
7626     {
7627       if (code == NOP_EXPR || code == CONVERT_EXPR
7628           || code == FLOAT_EXPR || code == ABS_EXPR)
7629         {
7630           /* Don't use STRIP_NOPS, because signedness of argument type
7631              matters.  */
7632           STRIP_SIGN_NOPS (arg0);
7633         }
7634       else
7635         {
7636           /* Strip any conversions that don't change the mode.  This
7637              is safe for every expression, except for a comparison
7638              expression because its signedness is derived from its
7639              operands.
7640
7641              Note that this is done as an internal manipulation within
7642              the constant folder, in order to find the simplest
7643              representation of the arguments so that their form can be
7644              studied.  In any cases, the appropriate type conversions
7645              should be put back in the tree that will get out of the
7646              constant folder.  */
7647           STRIP_NOPS (arg0);
7648         }
7649     }
7650
7651   if (TREE_CODE_CLASS (code) == tcc_unary)
7652     {
7653       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7654         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7655                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7656       else if (TREE_CODE (arg0) == COND_EXPR)
7657         {
7658           tree arg01 = TREE_OPERAND (arg0, 1);
7659           tree arg02 = TREE_OPERAND (arg0, 2);
7660           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7661             arg01 = fold_build1 (code, type, arg01);
7662           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7663             arg02 = fold_build1 (code, type, arg02);
7664           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7665                              arg01, arg02);
7666
7667           /* If this was a conversion, and all we did was to move into
7668              inside the COND_EXPR, bring it back out.  But leave it if
7669              it is a conversion from integer to integer and the
7670              result precision is no wider than a word since such a
7671              conversion is cheap and may be optimized away by combine,
7672              while it couldn't if it were outside the COND_EXPR.  Then return
7673              so we don't get into an infinite recursion loop taking the
7674              conversion out and then back in.  */
7675
7676           if ((code == NOP_EXPR || code == CONVERT_EXPR
7677                || code == NON_LVALUE_EXPR)
7678               && TREE_CODE (tem) == COND_EXPR
7679               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7680               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7681               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7682               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7683               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7684                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7685               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7686                      && (INTEGRAL_TYPE_P
7687                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7688                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7689                   || flag_syntax_only))
7690             tem = build1 (code, type,
7691                           build3 (COND_EXPR,
7692                                   TREE_TYPE (TREE_OPERAND
7693                                              (TREE_OPERAND (tem, 1), 0)),
7694                                   TREE_OPERAND (tem, 0),
7695                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7696                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7697           return tem;
7698         }
7699       else if (COMPARISON_CLASS_P (arg0))
7700         {
7701           if (TREE_CODE (type) == BOOLEAN_TYPE)
7702             {
7703               arg0 = copy_node (arg0);
7704               TREE_TYPE (arg0) = type;
7705               return arg0;
7706             }
7707           else if (TREE_CODE (type) != INTEGER_TYPE)
7708             return fold_build3 (COND_EXPR, type, arg0,
7709                                 fold_build1 (code, type,
7710                                              integer_one_node),
7711                                 fold_build1 (code, type,
7712                                              integer_zero_node));
7713         }
7714    }
7715
7716   switch (code)
7717     {
7718     case PAREN_EXPR:
7719       /* Re-association barriers around constants and other re-association
7720          barriers can be removed.  */
7721       if (CONSTANT_CLASS_P (op0)
7722           || TREE_CODE (op0) == PAREN_EXPR)
7723         return fold_convert (type, op0);
7724       return NULL_TREE;
7725
7726     case NOP_EXPR:
7727     case FLOAT_EXPR:
7728     case CONVERT_EXPR:
7729     case FIX_TRUNC_EXPR:
7730       if (TREE_TYPE (op0) == type)
7731         return op0;
7732       
7733       /* If we have (type) (a CMP b) and type is an integral type, return
7734          new expression involving the new type.  */
7735       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7736         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7737                             TREE_OPERAND (op0, 1));
7738
7739       /* Handle cases of two conversions in a row.  */
7740       if (TREE_CODE (op0) == NOP_EXPR
7741           || TREE_CODE (op0) == CONVERT_EXPR)
7742         {
7743           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7744           tree inter_type = TREE_TYPE (op0);
7745           int inside_int = INTEGRAL_TYPE_P (inside_type);
7746           int inside_ptr = POINTER_TYPE_P (inside_type);
7747           int inside_float = FLOAT_TYPE_P (inside_type);
7748           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7749           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7750           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7751           int inter_int = INTEGRAL_TYPE_P (inter_type);
7752           int inter_ptr = POINTER_TYPE_P (inter_type);
7753           int inter_float = FLOAT_TYPE_P (inter_type);
7754           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7755           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7756           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7757           int final_int = INTEGRAL_TYPE_P (type);
7758           int final_ptr = POINTER_TYPE_P (type);
7759           int final_float = FLOAT_TYPE_P (type);
7760           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7761           unsigned int final_prec = TYPE_PRECISION (type);
7762           int final_unsignedp = TYPE_UNSIGNED (type);
7763
7764           /* In addition to the cases of two conversions in a row
7765              handled below, if we are converting something to its own
7766              type via an object of identical or wider precision, neither
7767              conversion is needed.  */
7768           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7769               && (((inter_int || inter_ptr) && final_int)
7770                   || (inter_float && final_float))
7771               && inter_prec >= final_prec)
7772             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7773
7774           /* Likewise, if the intermediate and final types are either both
7775              float or both integer, we don't need the middle conversion if
7776              it is wider than the final type and doesn't change the signedness
7777              (for integers).  Avoid this if the final type is a pointer
7778              since then we sometimes need the inner conversion.  Likewise if
7779              the outer has a precision not equal to the size of its mode.  */
7780           if (((inter_int && inside_int)
7781                || (inter_float && inside_float)
7782                || (inter_vec && inside_vec))
7783               && inter_prec >= inside_prec
7784               && (inter_float || inter_vec
7785                   || inter_unsignedp == inside_unsignedp)
7786               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7787                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7788               && ! final_ptr
7789               && (! final_vec || inter_prec == inside_prec))
7790             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7791
7792           /* If we have a sign-extension of a zero-extended value, we can
7793              replace that by a single zero-extension.  */
7794           if (inside_int && inter_int && final_int
7795               && inside_prec < inter_prec && inter_prec < final_prec
7796               && inside_unsignedp && !inter_unsignedp)
7797             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7798
7799           /* Two conversions in a row are not needed unless:
7800              - some conversion is floating-point (overstrict for now), or
7801              - some conversion is a vector (overstrict for now), or
7802              - the intermediate type is narrower than both initial and
7803                final, or
7804              - the intermediate type and innermost type differ in signedness,
7805                and the outermost type is wider than the intermediate, or
7806              - the initial type is a pointer type and the precisions of the
7807                intermediate and final types differ, or
7808              - the final type is a pointer type and the precisions of the
7809                initial and intermediate types differ.  */
7810           if (! inside_float && ! inter_float && ! final_float
7811               && ! inside_vec && ! inter_vec && ! final_vec
7812               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7813               && ! (inside_int && inter_int
7814                     && inter_unsignedp != inside_unsignedp
7815                     && inter_prec < final_prec)
7816               && ((inter_unsignedp && inter_prec > inside_prec)
7817                   == (final_unsignedp && final_prec > inter_prec))
7818               && ! (inside_ptr && inter_prec != final_prec)
7819               && ! (final_ptr && inside_prec != inter_prec)
7820               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7821                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
7822             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7823         }
7824
7825       /* Handle (T *)&A.B.C for A being of type T and B and C
7826          living at offset zero.  This occurs frequently in
7827          C++ upcasting and then accessing the base.  */
7828       if (TREE_CODE (op0) == ADDR_EXPR
7829           && POINTER_TYPE_P (type)
7830           && handled_component_p (TREE_OPERAND (op0, 0)))
7831         {
7832           HOST_WIDE_INT bitsize, bitpos;
7833           tree offset;
7834           enum machine_mode mode;
7835           int unsignedp, volatilep;
7836           tree base = TREE_OPERAND (op0, 0);
7837           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7838                                       &mode, &unsignedp, &volatilep, false);
7839           /* If the reference was to a (constant) zero offset, we can use
7840              the address of the base if it has the same base type
7841              as the result type.  */
7842           if (! offset && bitpos == 0
7843               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7844                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7845             return fold_convert (type, fold_addr_expr (base));
7846         }
7847
7848       if ((TREE_CODE (op0) == MODIFY_EXPR
7849            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7850           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7851           /* Detect assigning a bitfield.  */
7852           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7853                && DECL_BIT_FIELD
7854                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7855         {
7856           /* Don't leave an assignment inside a conversion
7857              unless assigning a bitfield.  */
7858           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7859           /* First do the assignment, then return converted constant.  */
7860           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7861           TREE_NO_WARNING (tem) = 1;
7862           TREE_USED (tem) = 1;
7863           return tem;
7864         }
7865
7866       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7867          constants (if x has signed type, the sign bit cannot be set
7868          in c).  This folds extension into the BIT_AND_EXPR.  */
7869       if (INTEGRAL_TYPE_P (type)
7870           && TREE_CODE (type) != BOOLEAN_TYPE
7871           && TREE_CODE (op0) == BIT_AND_EXPR
7872           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7873         {
7874           tree and = op0;
7875           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7876           int change = 0;
7877
7878           if (TYPE_UNSIGNED (TREE_TYPE (and))
7879               || (TYPE_PRECISION (type)
7880                   <= TYPE_PRECISION (TREE_TYPE (and))))
7881             change = 1;
7882           else if (TYPE_PRECISION (TREE_TYPE (and1))
7883                    <= HOST_BITS_PER_WIDE_INT
7884                    && host_integerp (and1, 1))
7885             {
7886               unsigned HOST_WIDE_INT cst;
7887
7888               cst = tree_low_cst (and1, 1);
7889               cst &= (HOST_WIDE_INT) -1
7890                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7891               change = (cst == 0);
7892 #ifdef LOAD_EXTEND_OP
7893               if (change
7894                   && !flag_syntax_only
7895                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7896                       == ZERO_EXTEND))
7897                 {
7898                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7899                   and0 = fold_convert (uns, and0);
7900                   and1 = fold_convert (uns, and1);
7901                 }
7902 #endif
7903             }
7904           if (change)
7905             {
7906               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7907                                            TREE_INT_CST_HIGH (and1), 0,
7908                                            TREE_OVERFLOW (and1));
7909               return fold_build2 (BIT_AND_EXPR, type,
7910                                   fold_convert (type, and0), tem);
7911             }
7912         }
7913
7914       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
7915          when one of the new casts will fold away. Conservatively we assume
7916          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
7917       if (POINTER_TYPE_P (type)
7918           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
7919           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7920               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7921               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7922         {
7923           tree arg00 = TREE_OPERAND (arg0, 0);
7924           tree arg01 = TREE_OPERAND (arg0, 1);
7925
7926           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7927                               fold_convert (sizetype, arg01));
7928         }
7929
7930       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7931          of the same precision, and X is an integer type not narrower than
7932          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7933       if (INTEGRAL_TYPE_P (type)
7934           && TREE_CODE (op0) == BIT_NOT_EXPR
7935           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7936           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7937               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7938           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7939         {
7940           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7941           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7942               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7943             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7944         }
7945
7946       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
7947          type of X and Y (integer types only).  */
7948       if (INTEGRAL_TYPE_P (type)
7949           && TREE_CODE (op0) == MULT_EXPR
7950           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7951           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
7952         {
7953           /* Be careful not to introduce new overflows.  */
7954           tree mult_type;
7955           if (TYPE_OVERFLOW_WRAPS (type))
7956             mult_type = type;
7957           else
7958             mult_type = unsigned_type_for (type);
7959           
7960           tem = fold_build2 (MULT_EXPR, mult_type,
7961                              fold_convert (mult_type, TREE_OPERAND (op0, 0)),
7962                              fold_convert (mult_type, TREE_OPERAND (op0, 1)));
7963           return fold_convert (type, tem);
7964         }
7965
7966       tem = fold_convert_const (code, type, op0);
7967       return tem ? tem : NULL_TREE;
7968
7969     case FIXED_CONVERT_EXPR:
7970       tem = fold_convert_const (code, type, arg0);
7971       return tem ? tem : NULL_TREE;
7972
7973     case VIEW_CONVERT_EXPR:
7974       if (TREE_TYPE (op0) == type)
7975         return op0;
7976       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7977         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7978
7979       /* For integral conversions with the same precision or pointer
7980          conversions use a NOP_EXPR instead.  */
7981       if ((INTEGRAL_TYPE_P (type)
7982            || POINTER_TYPE_P (type))
7983           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7984               || POINTER_TYPE_P (TREE_TYPE (op0)))
7985           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
7986           /* Do not muck with VIEW_CONVERT_EXPRs that convert from
7987              a sub-type to its base type as generated by the Ada FE.  */
7988           && !(INTEGRAL_TYPE_P (TREE_TYPE (op0))
7989                && TREE_TYPE (TREE_TYPE (op0))))
7990         return fold_convert (type, op0);
7991
7992       /* Strip inner integral conversions that do not change the precision.  */
7993       if ((TREE_CODE (op0) == NOP_EXPR
7994            || TREE_CODE (op0) == CONVERT_EXPR)
7995           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7996               || POINTER_TYPE_P (TREE_TYPE (op0)))
7997           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
7998               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
7999           && (TYPE_PRECISION (TREE_TYPE (op0))
8000               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
8001         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
8002
8003       return fold_view_convert_expr (type, op0);
8004
8005     case NEGATE_EXPR:
8006       tem = fold_negate_expr (arg0);
8007       if (tem)
8008         return fold_convert (type, tem);
8009       return NULL_TREE;
8010
8011     case ABS_EXPR:
8012       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8013         return fold_abs_const (arg0, type);
8014       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8015         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8016       /* Convert fabs((double)float) into (double)fabsf(float).  */
8017       else if (TREE_CODE (arg0) == NOP_EXPR
8018                && TREE_CODE (type) == REAL_TYPE)
8019         {
8020           tree targ0 = strip_float_extensions (arg0);
8021           if (targ0 != arg0)
8022             return fold_convert (type, fold_build1 (ABS_EXPR,
8023                                                     TREE_TYPE (targ0),
8024                                                     targ0));
8025         }
8026       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8027       else if (TREE_CODE (arg0) == ABS_EXPR)
8028         return arg0;
8029       else if (tree_expr_nonnegative_p (arg0))
8030         return arg0;
8031
8032       /* Strip sign ops from argument.  */
8033       if (TREE_CODE (type) == REAL_TYPE)
8034         {
8035           tem = fold_strip_sign_ops (arg0);
8036           if (tem)
8037             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
8038         }
8039       return NULL_TREE;
8040
8041     case CONJ_EXPR:
8042       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8043         return fold_convert (type, arg0);
8044       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8045         {
8046           tree itype = TREE_TYPE (type);
8047           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8048           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8049           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8050         }
8051       if (TREE_CODE (arg0) == COMPLEX_CST)
8052         {
8053           tree itype = TREE_TYPE (type);
8054           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8055           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8056           return build_complex (type, rpart, negate_expr (ipart));
8057         }
8058       if (TREE_CODE (arg0) == CONJ_EXPR)
8059         return fold_convert (type, TREE_OPERAND (arg0, 0));
8060       return NULL_TREE;
8061
8062     case BIT_NOT_EXPR:
8063       if (TREE_CODE (arg0) == INTEGER_CST)
8064         return fold_not_const (arg0, type);
8065       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8066         return fold_convert (type, TREE_OPERAND (arg0, 0));
8067       /* Convert ~ (-A) to A - 1.  */
8068       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8069         return fold_build2 (MINUS_EXPR, type,
8070                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8071                             build_int_cst (type, 1));
8072       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8073       else if (INTEGRAL_TYPE_P (type)
8074                && ((TREE_CODE (arg0) == MINUS_EXPR
8075                     && integer_onep (TREE_OPERAND (arg0, 1)))
8076                    || (TREE_CODE (arg0) == PLUS_EXPR
8077                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8078         return fold_build1 (NEGATE_EXPR, type,
8079                             fold_convert (type, TREE_OPERAND (arg0, 0)));
8080       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8081       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8082                && (tem = fold_unary (BIT_NOT_EXPR, type,
8083                                      fold_convert (type,
8084                                                    TREE_OPERAND (arg0, 0)))))
8085         return fold_build2 (BIT_XOR_EXPR, type, tem,
8086                             fold_convert (type, TREE_OPERAND (arg0, 1)));
8087       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8088                && (tem = fold_unary (BIT_NOT_EXPR, type,
8089                                      fold_convert (type,
8090                                                    TREE_OPERAND (arg0, 1)))))
8091         return fold_build2 (BIT_XOR_EXPR, type,
8092                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8093       /* Perform BIT_NOT_EXPR on each element individually.  */
8094       else if (TREE_CODE (arg0) == VECTOR_CST)
8095         {
8096           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8097           int count = TYPE_VECTOR_SUBPARTS (type), i;
8098
8099           for (i = 0; i < count; i++)
8100             {
8101               if (elements)
8102                 {
8103                   elem = TREE_VALUE (elements);
8104                   elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8105                   if (elem == NULL_TREE)
8106                     break;
8107                   elements = TREE_CHAIN (elements);
8108                 }
8109               else
8110                 elem = build_int_cst (TREE_TYPE (type), -1);
8111               list = tree_cons (NULL_TREE, elem, list);
8112             }
8113           if (i == count)
8114             return build_vector (type, nreverse (list));
8115         }
8116
8117       return NULL_TREE;
8118
8119     case TRUTH_NOT_EXPR:
8120       /* The argument to invert_truthvalue must have Boolean type.  */
8121       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8122           arg0 = fold_convert (boolean_type_node, arg0);
8123
8124       /* Note that the operand of this must be an int
8125          and its values must be 0 or 1.
8126          ("true" is a fixed value perhaps depending on the language,
8127          but we don't handle values other than 1 correctly yet.)  */
8128       tem = fold_truth_not_expr (arg0);
8129       if (!tem)
8130         return NULL_TREE;
8131       return fold_convert (type, tem);
8132
8133     case REALPART_EXPR:
8134       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8135         return fold_convert (type, arg0);
8136       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8137         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8138                                  TREE_OPERAND (arg0, 1));
8139       if (TREE_CODE (arg0) == COMPLEX_CST)
8140         return fold_convert (type, TREE_REALPART (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 (REALPART_EXPR, itype,
8146                                           TREE_OPERAND (arg0, 0)),
8147                              fold_build1 (REALPART_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 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8155           return fold_convert (type, 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_COS);
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     case IMAGPART_EXPR:
8176       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8177         return fold_convert (type, integer_zero_node);
8178       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8179         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8180                                  TREE_OPERAND (arg0, 0));
8181       if (TREE_CODE (arg0) == COMPLEX_CST)
8182         return fold_convert (type, TREE_IMAGPART (arg0));
8183       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8184         {
8185           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8186           tem = fold_build2 (TREE_CODE (arg0), itype,
8187                              fold_build1 (IMAGPART_EXPR, itype,
8188                                           TREE_OPERAND (arg0, 0)),
8189                              fold_build1 (IMAGPART_EXPR, itype,
8190                                           TREE_OPERAND (arg0, 1)));
8191           return fold_convert (type, tem);
8192         }
8193       if (TREE_CODE (arg0) == CONJ_EXPR)
8194         {
8195           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8196           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8197           return fold_convert (type, negate_expr (tem));
8198         }
8199       if (TREE_CODE (arg0) == CALL_EXPR)
8200         {
8201           tree fn = get_callee_fndecl (arg0);
8202           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8203             switch (DECL_FUNCTION_CODE (fn))
8204               {
8205               CASE_FLT_FN (BUILT_IN_CEXPI):
8206                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8207                 if (fn)
8208                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8209                 break;
8210
8211               default:
8212                 break;
8213               }
8214         }
8215       return NULL_TREE;
8216
8217     default:
8218       return NULL_TREE;
8219     } /* switch (code) */
8220 }
8221
8222 /* Fold a binary expression of code CODE and type TYPE with operands
8223    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8224    Return the folded expression if folding is successful.  Otherwise,
8225    return NULL_TREE.  */
8226
8227 static tree
8228 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8229 {
8230   enum tree_code compl_code;
8231
8232   if (code == MIN_EXPR)
8233     compl_code = MAX_EXPR;
8234   else if (code == MAX_EXPR)
8235     compl_code = MIN_EXPR;
8236   else
8237     gcc_unreachable ();
8238
8239   /* MIN (MAX (a, b), b) == b.  */
8240   if (TREE_CODE (op0) == compl_code
8241       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8242     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8243
8244   /* MIN (MAX (b, a), b) == b.  */
8245   if (TREE_CODE (op0) == compl_code
8246       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8247       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8248     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8249
8250   /* MIN (a, MAX (a, b)) == a.  */
8251   if (TREE_CODE (op1) == compl_code
8252       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8253       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8254     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8255
8256   /* MIN (a, MAX (b, a)) == a.  */
8257   if (TREE_CODE (op1) == compl_code
8258       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8259       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8260     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8261
8262   return NULL_TREE;
8263 }
8264
8265 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8266    by changing CODE to reduce the magnitude of constants involved in
8267    ARG0 of the comparison.
8268    Returns a canonicalized comparison tree if a simplification was
8269    possible, otherwise returns NULL_TREE.
8270    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8271    valid if signed overflow is undefined.  */
8272
8273 static tree
8274 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8275                                  tree arg0, tree arg1,
8276                                  bool *strict_overflow_p)
8277 {
8278   enum tree_code code0 = TREE_CODE (arg0);
8279   tree t, cst0 = NULL_TREE;
8280   int sgn0;
8281   bool swap = false;
8282
8283   /* Match A +- CST code arg1 and CST code arg1.  */
8284   if (!(((code0 == MINUS_EXPR
8285           || code0 == PLUS_EXPR)
8286          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8287         || code0 == INTEGER_CST))
8288     return NULL_TREE;
8289
8290   /* Identify the constant in arg0 and its sign.  */
8291   if (code0 == INTEGER_CST)
8292     cst0 = arg0;
8293   else
8294     cst0 = TREE_OPERAND (arg0, 1);
8295   sgn0 = tree_int_cst_sgn (cst0);
8296
8297   /* Overflowed constants and zero will cause problems.  */
8298   if (integer_zerop (cst0)
8299       || TREE_OVERFLOW (cst0))
8300     return NULL_TREE;
8301
8302   /* See if we can reduce the magnitude of the constant in
8303      arg0 by changing the comparison code.  */
8304   if (code0 == INTEGER_CST)
8305     {
8306       /* CST <= arg1  ->  CST-1 < arg1.  */
8307       if (code == LE_EXPR && sgn0 == 1)
8308         code = LT_EXPR;
8309       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8310       else if (code == LT_EXPR && sgn0 == -1)
8311         code = LE_EXPR;
8312       /* CST > arg1  ->  CST-1 >= arg1.  */
8313       else if (code == GT_EXPR && sgn0 == 1)
8314         code = GE_EXPR;
8315       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8316       else if (code == GE_EXPR && sgn0 == -1)
8317         code = GT_EXPR;
8318       else
8319         return NULL_TREE;
8320       /* arg1 code' CST' might be more canonical.  */
8321       swap = true;
8322     }
8323   else
8324     {
8325       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8326       if (code == LT_EXPR
8327           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8328         code = LE_EXPR;
8329       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8330       else if (code == GT_EXPR
8331                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8332         code = GE_EXPR;
8333       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8334       else if (code == LE_EXPR
8335                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8336         code = LT_EXPR;
8337       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8338       else if (code == GE_EXPR
8339                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8340         code = GT_EXPR;
8341       else
8342         return NULL_TREE;
8343       *strict_overflow_p = true;
8344     }
8345
8346   /* Now build the constant reduced in magnitude.  */
8347   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8348                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8349   if (code0 != INTEGER_CST)
8350     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8351
8352   /* If swapping might yield to a more canonical form, do so.  */
8353   if (swap)
8354     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8355   else
8356     return fold_build2 (code, type, t, arg1);
8357 }
8358
8359 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8360    overflow further.  Try to decrease the magnitude of constants involved
8361    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8362    and put sole constants at the second argument position.
8363    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8364
8365 static tree
8366 maybe_canonicalize_comparison (enum tree_code code, tree type,
8367                                tree arg0, tree arg1)
8368 {
8369   tree t;
8370   bool strict_overflow_p;
8371   const char * const warnmsg = G_("assuming signed overflow does not occur "
8372                                   "when reducing constant in comparison");
8373
8374   /* In principle pointers also have undefined overflow behavior,
8375      but that causes problems elsewhere.  */
8376   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8377       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8378     return NULL_TREE;
8379
8380   /* Try canonicalization by simplifying arg0.  */
8381   strict_overflow_p = false;
8382   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8383                                        &strict_overflow_p);
8384   if (t)
8385     {
8386       if (strict_overflow_p)
8387         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8388       return t;
8389     }
8390
8391   /* Try canonicalization by simplifying arg1 using the swapped
8392      comparison.  */
8393   code = swap_tree_comparison (code);
8394   strict_overflow_p = false;
8395   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8396                                        &strict_overflow_p);
8397   if (t && strict_overflow_p)
8398     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8399   return t;
8400 }
8401
8402 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
8403    space.  This is used to avoid issuing overflow warnings for
8404    expressions like &p->x which can not wrap.  */
8405
8406 static bool
8407 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8408 {
8409   unsigned HOST_WIDE_INT offset_low, total_low;
8410   HOST_WIDE_INT size, offset_high, total_high;
8411
8412   if (!POINTER_TYPE_P (TREE_TYPE (base)))
8413     return true;
8414
8415   if (bitpos < 0)
8416     return true;
8417
8418   if (offset == NULL_TREE)
8419     {
8420       offset_low = 0;
8421       offset_high = 0;
8422     }
8423   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8424     return true;
8425   else
8426     {
8427       offset_low = TREE_INT_CST_LOW (offset);
8428       offset_high = TREE_INT_CST_HIGH (offset);
8429     }
8430
8431   if (add_double_with_sign (offset_low, offset_high,
8432                             bitpos / BITS_PER_UNIT, 0,
8433                             &total_low, &total_high,
8434                             true))
8435     return true;
8436
8437   if (total_high != 0)
8438     return true;
8439
8440   size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8441   if (size <= 0)
8442     return true;
8443
8444   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8445      array.  */
8446   if (TREE_CODE (base) == ADDR_EXPR)
8447     {
8448       HOST_WIDE_INT base_size;
8449
8450       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8451       if (base_size > 0 && size < base_size)
8452         size = base_size;
8453     }
8454
8455   return total_low > (unsigned HOST_WIDE_INT) size;
8456 }
8457
8458 /* Subroutine of fold_binary.  This routine performs all of the
8459    transformations that are common to the equality/inequality
8460    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8461    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8462    fold_binary should call fold_binary.  Fold a comparison with
8463    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8464    the folded comparison or NULL_TREE.  */
8465
8466 static tree
8467 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8468 {
8469   tree arg0, arg1, tem;
8470
8471   arg0 = op0;
8472   arg1 = op1;
8473
8474   STRIP_SIGN_NOPS (arg0);
8475   STRIP_SIGN_NOPS (arg1);
8476
8477   tem = fold_relational_const (code, type, arg0, arg1);
8478   if (tem != NULL_TREE)
8479     return tem;
8480
8481   /* If one arg is a real or integer constant, put it last.  */
8482   if (tree_swap_operands_p (arg0, arg1, true))
8483     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8484
8485   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8486   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8487       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8488           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8489           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8490       && (TREE_CODE (arg1) == INTEGER_CST
8491           && !TREE_OVERFLOW (arg1)))
8492     {
8493       tree const1 = TREE_OPERAND (arg0, 1);
8494       tree const2 = arg1;
8495       tree variable = TREE_OPERAND (arg0, 0);
8496       tree lhs;
8497       int lhs_add;
8498       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8499
8500       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8501                          TREE_TYPE (arg1), const2, const1);
8502
8503       /* If the constant operation overflowed this can be
8504          simplified as a comparison against INT_MAX/INT_MIN.  */
8505       if (TREE_CODE (lhs) == INTEGER_CST
8506           && TREE_OVERFLOW (lhs))
8507         {
8508           int const1_sgn = tree_int_cst_sgn (const1);
8509           enum tree_code code2 = code;
8510
8511           /* Get the sign of the constant on the lhs if the
8512              operation were VARIABLE + CONST1.  */
8513           if (TREE_CODE (arg0) == MINUS_EXPR)
8514             const1_sgn = -const1_sgn;
8515
8516           /* The sign of the constant determines if we overflowed
8517              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8518              Canonicalize to the INT_MIN overflow by swapping the comparison
8519              if necessary.  */
8520           if (const1_sgn == -1)
8521             code2 = swap_tree_comparison (code);
8522
8523           /* We now can look at the canonicalized case
8524                VARIABLE + 1  CODE2  INT_MIN
8525              and decide on the result.  */
8526           if (code2 == LT_EXPR
8527               || code2 == LE_EXPR
8528               || code2 == EQ_EXPR)
8529             return omit_one_operand (type, boolean_false_node, variable);
8530           else if (code2 == NE_EXPR
8531                    || code2 == GE_EXPR
8532                    || code2 == GT_EXPR)
8533             return omit_one_operand (type, boolean_true_node, variable);
8534         }
8535
8536       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8537           && (TREE_CODE (lhs) != INTEGER_CST
8538               || !TREE_OVERFLOW (lhs)))
8539         {
8540           fold_overflow_warning (("assuming signed overflow does not occur "
8541                                   "when changing X +- C1 cmp C2 to "
8542                                   "X cmp C1 +- C2"),
8543                                  WARN_STRICT_OVERFLOW_COMPARISON);
8544           return fold_build2 (code, type, variable, lhs);
8545         }
8546     }
8547
8548   /* For comparisons of pointers we can decompose it to a compile time
8549      comparison of the base objects and the offsets into the object.
8550      This requires at least one operand being an ADDR_EXPR or a
8551      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8552   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8553       && (TREE_CODE (arg0) == ADDR_EXPR
8554           || TREE_CODE (arg1) == ADDR_EXPR
8555           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8556           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8557     {
8558       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8559       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8560       enum machine_mode mode;
8561       int volatilep, unsignedp;
8562       bool indirect_base0 = false, indirect_base1 = false;
8563
8564       /* Get base and offset for the access.  Strip ADDR_EXPR for
8565          get_inner_reference, but put it back by stripping INDIRECT_REF
8566          off the base object if possible.  indirect_baseN will be true
8567          if baseN is not an address but refers to the object itself.  */
8568       base0 = arg0;
8569       if (TREE_CODE (arg0) == ADDR_EXPR)
8570         {
8571           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8572                                        &bitsize, &bitpos0, &offset0, &mode,
8573                                        &unsignedp, &volatilep, false);
8574           if (TREE_CODE (base0) == INDIRECT_REF)
8575             base0 = TREE_OPERAND (base0, 0);
8576           else
8577             indirect_base0 = true;
8578         }
8579       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8580         {
8581           base0 = TREE_OPERAND (arg0, 0);
8582           offset0 = TREE_OPERAND (arg0, 1);
8583         }
8584
8585       base1 = arg1;
8586       if (TREE_CODE (arg1) == ADDR_EXPR)
8587         {
8588           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8589                                        &bitsize, &bitpos1, &offset1, &mode,
8590                                        &unsignedp, &volatilep, false);
8591           if (TREE_CODE (base1) == INDIRECT_REF)
8592             base1 = TREE_OPERAND (base1, 0);
8593           else
8594             indirect_base1 = true;
8595         }
8596       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8597         {
8598           base1 = TREE_OPERAND (arg1, 0);
8599           offset1 = TREE_OPERAND (arg1, 1);
8600         }
8601
8602       /* If we have equivalent bases we might be able to simplify.  */
8603       if (indirect_base0 == indirect_base1
8604           && operand_equal_p (base0, base1, 0))
8605         {
8606           /* We can fold this expression to a constant if the non-constant
8607              offset parts are equal.  */
8608           if ((offset0 == offset1
8609                || (offset0 && offset1
8610                    && operand_equal_p (offset0, offset1, 0)))
8611               && (code == EQ_EXPR
8612                   || code == NE_EXPR
8613                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
8614                 
8615             {
8616               if (code != EQ_EXPR
8617                   && code != NE_EXPR
8618                   && bitpos0 != bitpos1
8619                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
8620                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
8621                 fold_overflow_warning (("assuming pointer wraparound does not "
8622                                         "occur when comparing P +- C1 with "
8623                                         "P +- C2"),
8624                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
8625
8626               switch (code)
8627                 {
8628                 case EQ_EXPR:
8629                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8630                 case NE_EXPR:
8631                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8632                 case LT_EXPR:
8633                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8634                 case LE_EXPR:
8635                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8636                 case GE_EXPR:
8637                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8638                 case GT_EXPR:
8639                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8640                 default:;
8641                 }
8642             }
8643           /* We can simplify the comparison to a comparison of the variable
8644              offset parts if the constant offset parts are equal.
8645              Be careful to use signed size type here because otherwise we
8646              mess with array offsets in the wrong way.  This is possible
8647              because pointer arithmetic is restricted to retain within an
8648              object and overflow on pointer differences is undefined as of
8649              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8650           else if (bitpos0 == bitpos1
8651                    && ((code == EQ_EXPR || code == NE_EXPR)
8652                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
8653             {
8654               tree signed_size_type_node;
8655               signed_size_type_node = signed_type_for (size_type_node);
8656
8657               /* By converting to signed size type we cover middle-end pointer
8658                  arithmetic which operates on unsigned pointer types of size
8659                  type size and ARRAY_REF offsets which are properly sign or
8660                  zero extended from their type in case it is narrower than
8661                  size type.  */
8662               if (offset0 == NULL_TREE)
8663                 offset0 = build_int_cst (signed_size_type_node, 0);
8664               else
8665                 offset0 = fold_convert (signed_size_type_node, offset0);
8666               if (offset1 == NULL_TREE)
8667                 offset1 = build_int_cst (signed_size_type_node, 0);
8668               else
8669                 offset1 = fold_convert (signed_size_type_node, offset1);
8670
8671               if (code != EQ_EXPR
8672                   && code != NE_EXPR
8673                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
8674                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
8675                 fold_overflow_warning (("assuming pointer wraparound does not "
8676                                         "occur when comparing P +- C1 with "
8677                                         "P +- C2"),
8678                                        WARN_STRICT_OVERFLOW_COMPARISON);
8679
8680               return fold_build2 (code, type, offset0, offset1);
8681             }
8682         }
8683       /* For non-equal bases we can simplify if they are addresses
8684          of local binding decls or constants.  */
8685       else if (indirect_base0 && indirect_base1
8686                /* We know that !operand_equal_p (base0, base1, 0)
8687                   because the if condition was false.  But make
8688                   sure two decls are not the same.  */
8689                && base0 != base1
8690                && TREE_CODE (arg0) == ADDR_EXPR
8691                && TREE_CODE (arg1) == ADDR_EXPR
8692                && (((TREE_CODE (base0) == VAR_DECL
8693                      || TREE_CODE (base0) == PARM_DECL)
8694                     && (targetm.binds_local_p (base0)
8695                         || CONSTANT_CLASS_P (base1)))
8696                    || CONSTANT_CLASS_P (base0))
8697                && (((TREE_CODE (base1) == VAR_DECL
8698                      || TREE_CODE (base1) == PARM_DECL)
8699                     && (targetm.binds_local_p (base1)
8700                         || CONSTANT_CLASS_P (base0)))
8701                    || CONSTANT_CLASS_P (base1)))
8702         {
8703           if (code == EQ_EXPR)
8704             return omit_two_operands (type, boolean_false_node, arg0, arg1);
8705           else if (code == NE_EXPR)
8706             return omit_two_operands (type, boolean_true_node, arg0, arg1);
8707         }
8708       /* For equal offsets we can simplify to a comparison of the
8709          base addresses.  */
8710       else if (bitpos0 == bitpos1
8711                && (indirect_base0
8712                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
8713                && (indirect_base1
8714                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
8715                && ((offset0 == offset1)
8716                    || (offset0 && offset1
8717                        && operand_equal_p (offset0, offset1, 0))))
8718         {
8719           if (indirect_base0)
8720             base0 = fold_addr_expr (base0);
8721           if (indirect_base1)
8722             base1 = fold_addr_expr (base1);
8723           return fold_build2 (code, type, base0, base1);
8724         }
8725     }
8726
8727   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8728      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8729      the resulting offset is smaller in absolute value than the
8730      original one.  */
8731   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8732       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8733       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8734           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8735       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8736       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8737           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8738     {
8739       tree const1 = TREE_OPERAND (arg0, 1);
8740       tree const2 = TREE_OPERAND (arg1, 1);
8741       tree variable1 = TREE_OPERAND (arg0, 0);
8742       tree variable2 = TREE_OPERAND (arg1, 0);
8743       tree cst;
8744       const char * const warnmsg = G_("assuming signed overflow does not "
8745                                       "occur when combining constants around "
8746                                       "a comparison");
8747
8748       /* Put the constant on the side where it doesn't overflow and is
8749          of lower absolute value than before.  */
8750       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8751                              ? MINUS_EXPR : PLUS_EXPR,
8752                              const2, const1, 0);
8753       if (!TREE_OVERFLOW (cst)
8754           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8755         {
8756           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8757           return fold_build2 (code, type,
8758                               variable1,
8759                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8760                                            variable2, cst));
8761         }
8762
8763       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8764                              ? MINUS_EXPR : PLUS_EXPR,
8765                              const1, const2, 0);
8766       if (!TREE_OVERFLOW (cst)
8767           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8768         {
8769           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8770           return fold_build2 (code, type,
8771                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8772                                            variable1, cst),
8773                               variable2);
8774         }
8775     }
8776
8777   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8778      signed arithmetic case.  That form is created by the compiler
8779      often enough for folding it to be of value.  One example is in
8780      computing loop trip counts after Operator Strength Reduction.  */
8781   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8782       && TREE_CODE (arg0) == MULT_EXPR
8783       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8784           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8785       && integer_zerop (arg1))
8786     {
8787       tree const1 = TREE_OPERAND (arg0, 1);
8788       tree const2 = arg1;                       /* zero */
8789       tree variable1 = TREE_OPERAND (arg0, 0);
8790       enum tree_code cmp_code = code;
8791
8792       gcc_assert (!integer_zerop (const1));
8793
8794       fold_overflow_warning (("assuming signed overflow does not occur when "
8795                               "eliminating multiplication in comparison "
8796                               "with zero"),
8797                              WARN_STRICT_OVERFLOW_COMPARISON);
8798
8799       /* If const1 is negative we swap the sense of the comparison.  */
8800       if (tree_int_cst_sgn (const1) < 0)
8801         cmp_code = swap_tree_comparison (cmp_code);
8802
8803       return fold_build2 (cmp_code, type, variable1, const2);
8804     }
8805
8806   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8807   if (tem)
8808     return tem;
8809
8810   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8811     {
8812       tree targ0 = strip_float_extensions (arg0);
8813       tree targ1 = strip_float_extensions (arg1);
8814       tree newtype = TREE_TYPE (targ0);
8815
8816       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8817         newtype = TREE_TYPE (targ1);
8818
8819       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8820       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8821         return fold_build2 (code, type, fold_convert (newtype, targ0),
8822                             fold_convert (newtype, targ1));
8823
8824       /* (-a) CMP (-b) -> b CMP a  */
8825       if (TREE_CODE (arg0) == NEGATE_EXPR
8826           && TREE_CODE (arg1) == NEGATE_EXPR)
8827         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8828                             TREE_OPERAND (arg0, 0));
8829
8830       if (TREE_CODE (arg1) == REAL_CST)
8831         {
8832           REAL_VALUE_TYPE cst;
8833           cst = TREE_REAL_CST (arg1);
8834
8835           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8836           if (TREE_CODE (arg0) == NEGATE_EXPR)
8837             return fold_build2 (swap_tree_comparison (code), type,
8838                                 TREE_OPERAND (arg0, 0),
8839                                 build_real (TREE_TYPE (arg1),
8840                                             REAL_VALUE_NEGATE (cst)));
8841
8842           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8843           /* a CMP (-0) -> a CMP 0  */
8844           if (REAL_VALUE_MINUS_ZERO (cst))
8845             return fold_build2 (code, type, arg0,
8846                                 build_real (TREE_TYPE (arg1), dconst0));
8847
8848           /* x != NaN is always true, other ops are always false.  */
8849           if (REAL_VALUE_ISNAN (cst)
8850               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8851             {
8852               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8853               return omit_one_operand (type, tem, arg0);
8854             }
8855
8856           /* Fold comparisons against infinity.  */
8857           if (REAL_VALUE_ISINF (cst))
8858             {
8859               tem = fold_inf_compare (code, type, arg0, arg1);
8860               if (tem != NULL_TREE)
8861                 return tem;
8862             }
8863         }
8864
8865       /* If this is a comparison of a real constant with a PLUS_EXPR
8866          or a MINUS_EXPR of a real constant, we can convert it into a
8867          comparison with a revised real constant as long as no overflow
8868          occurs when unsafe_math_optimizations are enabled.  */
8869       if (flag_unsafe_math_optimizations
8870           && TREE_CODE (arg1) == REAL_CST
8871           && (TREE_CODE (arg0) == PLUS_EXPR
8872               || TREE_CODE (arg0) == MINUS_EXPR)
8873           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8874           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8875                                       ? MINUS_EXPR : PLUS_EXPR,
8876                                       arg1, TREE_OPERAND (arg0, 1), 0))
8877           && !TREE_OVERFLOW (tem))
8878         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8879
8880       /* Likewise, we can simplify a comparison of a real constant with
8881          a MINUS_EXPR whose first operand is also a real constant, i.e.
8882          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
8883          floating-point types only if -fassociative-math is set.  */
8884       if (flag_associative_math
8885           && TREE_CODE (arg1) == REAL_CST
8886           && TREE_CODE (arg0) == MINUS_EXPR
8887           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8888           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8889                                       arg1, 0))
8890           && !TREE_OVERFLOW (tem))
8891         return fold_build2 (swap_tree_comparison (code), type,
8892                             TREE_OPERAND (arg0, 1), tem);
8893
8894       /* Fold comparisons against built-in math functions.  */
8895       if (TREE_CODE (arg1) == REAL_CST
8896           && flag_unsafe_math_optimizations
8897           && ! flag_errno_math)
8898         {
8899           enum built_in_function fcode = builtin_mathfn_code (arg0);
8900
8901           if (fcode != END_BUILTINS)
8902             {
8903               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8904               if (tem != NULL_TREE)
8905                 return tem;
8906             }
8907         }
8908     }
8909
8910   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8911       && (TREE_CODE (arg0) == NOP_EXPR
8912           || TREE_CODE (arg0) == CONVERT_EXPR))
8913     {
8914       /* If we are widening one operand of an integer comparison,
8915          see if the other operand is similarly being widened.  Perhaps we
8916          can do the comparison in the narrower type.  */
8917       tem = fold_widened_comparison (code, type, arg0, arg1);
8918       if (tem)
8919         return tem;
8920
8921       /* Or if we are changing signedness.  */
8922       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8923       if (tem)
8924         return tem;
8925     }
8926
8927   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8928      constant, we can simplify it.  */
8929   if (TREE_CODE (arg1) == INTEGER_CST
8930       && (TREE_CODE (arg0) == MIN_EXPR
8931           || TREE_CODE (arg0) == MAX_EXPR)
8932       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8933     {
8934       tem = optimize_minmax_comparison (code, type, op0, op1);
8935       if (tem)
8936         return tem;
8937     }
8938
8939   /* Simplify comparison of something with itself.  (For IEEE
8940      floating-point, we can only do some of these simplifications.)  */
8941   if (operand_equal_p (arg0, arg1, 0))
8942     {
8943       switch (code)
8944         {
8945         case EQ_EXPR:
8946           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8947               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8948             return constant_boolean_node (1, type);
8949           break;
8950
8951         case GE_EXPR:
8952         case LE_EXPR:
8953           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8954               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8955             return constant_boolean_node (1, type);
8956           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8957
8958         case NE_EXPR:
8959           /* For NE, we can only do this simplification if integer
8960              or we don't honor IEEE floating point NaNs.  */
8961           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8962               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8963             break;
8964           /* ... fall through ...  */
8965         case GT_EXPR:
8966         case LT_EXPR:
8967           return constant_boolean_node (0, type);
8968         default:
8969           gcc_unreachable ();
8970         }
8971     }
8972
8973   /* If we are comparing an expression that just has comparisons
8974      of two integer values, arithmetic expressions of those comparisons,
8975      and constants, we can simplify it.  There are only three cases
8976      to check: the two values can either be equal, the first can be
8977      greater, or the second can be greater.  Fold the expression for
8978      those three values.  Since each value must be 0 or 1, we have
8979      eight possibilities, each of which corresponds to the constant 0
8980      or 1 or one of the six possible comparisons.
8981
8982      This handles common cases like (a > b) == 0 but also handles
8983      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8984      occur in macroized code.  */
8985
8986   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8987     {
8988       tree cval1 = 0, cval2 = 0;
8989       int save_p = 0;
8990
8991       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8992           /* Don't handle degenerate cases here; they should already
8993              have been handled anyway.  */
8994           && cval1 != 0 && cval2 != 0
8995           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8996           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8997           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8998           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8999           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9000           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9001                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9002         {
9003           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9004           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9005
9006           /* We can't just pass T to eval_subst in case cval1 or cval2
9007              was the same as ARG1.  */
9008
9009           tree high_result
9010                 = fold_build2 (code, type,
9011                                eval_subst (arg0, cval1, maxval,
9012                                            cval2, minval),
9013                                arg1);
9014           tree equal_result
9015                 = fold_build2 (code, type,
9016                                eval_subst (arg0, cval1, maxval,
9017                                            cval2, maxval),
9018                                arg1);
9019           tree low_result
9020                 = fold_build2 (code, type,
9021                                eval_subst (arg0, cval1, minval,
9022                                            cval2, maxval),
9023                                arg1);
9024
9025           /* All three of these results should be 0 or 1.  Confirm they are.
9026              Then use those values to select the proper code to use.  */
9027
9028           if (TREE_CODE (high_result) == INTEGER_CST
9029               && TREE_CODE (equal_result) == INTEGER_CST
9030               && TREE_CODE (low_result) == INTEGER_CST)
9031             {
9032               /* Make a 3-bit mask with the high-order bit being the
9033                  value for `>', the next for '=', and the low for '<'.  */
9034               switch ((integer_onep (high_result) * 4)
9035                       + (integer_onep (equal_result) * 2)
9036                       + integer_onep (low_result))
9037                 {
9038                 case 0:
9039                   /* Always false.  */
9040                   return omit_one_operand (type, integer_zero_node, arg0);
9041                 case 1:
9042                   code = LT_EXPR;
9043                   break;
9044                 case 2:
9045                   code = EQ_EXPR;
9046                   break;
9047                 case 3:
9048                   code = LE_EXPR;
9049                   break;
9050                 case 4:
9051                   code = GT_EXPR;
9052                   break;
9053                 case 5:
9054                   code = NE_EXPR;
9055                   break;
9056                 case 6:
9057                   code = GE_EXPR;
9058                   break;
9059                 case 7:
9060                   /* Always true.  */
9061                   return omit_one_operand (type, integer_one_node, arg0);
9062                 }
9063
9064               if (save_p)
9065                 return save_expr (build2 (code, type, cval1, cval2));
9066               return fold_build2 (code, type, cval1, cval2);
9067             }
9068         }
9069     }
9070
9071   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9072      into a single range test.  */
9073   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9074        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9075       && TREE_CODE (arg1) == INTEGER_CST
9076       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9077       && !integer_zerop (TREE_OPERAND (arg0, 1))
9078       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9079       && !TREE_OVERFLOW (arg1))
9080     {
9081       tem = fold_div_compare (code, type, arg0, arg1);
9082       if (tem != NULL_TREE)
9083         return tem;
9084     }
9085
9086   /* Fold ~X op ~Y as Y op X.  */
9087   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9088       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9089     {
9090       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9091       return fold_build2 (code, type,
9092                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
9093                           TREE_OPERAND (arg0, 0));
9094     }
9095
9096   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9097   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9098       && TREE_CODE (arg1) == INTEGER_CST)
9099     {
9100       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9101       return fold_build2 (swap_tree_comparison (code), type,
9102                           TREE_OPERAND (arg0, 0),
9103                           fold_build1 (BIT_NOT_EXPR, cmp_type,
9104                                        fold_convert (cmp_type, arg1)));
9105     }
9106
9107   return NULL_TREE;
9108 }
9109
9110
9111 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9112    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9113    argument EXPR represents the expression "z" of type TYPE.  */
9114
9115 static tree
9116 fold_mult_zconjz (tree type, tree expr)
9117 {
9118   tree itype = TREE_TYPE (type);
9119   tree rpart, ipart, tem;
9120
9121   if (TREE_CODE (expr) == COMPLEX_EXPR)
9122     {
9123       rpart = TREE_OPERAND (expr, 0);
9124       ipart = TREE_OPERAND (expr, 1);
9125     }
9126   else if (TREE_CODE (expr) == COMPLEX_CST)
9127     {
9128       rpart = TREE_REALPART (expr);
9129       ipart = TREE_IMAGPART (expr);
9130     }
9131   else
9132     {
9133       expr = save_expr (expr);
9134       rpart = fold_build1 (REALPART_EXPR, itype, expr);
9135       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
9136     }
9137
9138   rpart = save_expr (rpart);
9139   ipart = save_expr (ipart);
9140   tem = fold_build2 (PLUS_EXPR, itype,
9141                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
9142                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
9143   return fold_build2 (COMPLEX_EXPR, type, tem,
9144                       fold_convert (itype, integer_zero_node));
9145 }
9146
9147
9148 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9149    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9150    guarantees that P and N have the same least significant log2(M) bits.
9151    N is not otherwise constrained.  In particular, N is not normalized to
9152    0 <= N < M as is common.  In general, the precise value of P is unknown.
9153    M is chosen as large as possible such that constant N can be determined.
9154
9155    Returns M and sets *RESIDUE to N.  */
9156
9157 static unsigned HOST_WIDE_INT
9158 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue)
9159 {
9160   enum tree_code code;
9161
9162   *residue = 0;
9163
9164   code = TREE_CODE (expr);
9165   if (code == ADDR_EXPR)
9166     {
9167       expr = TREE_OPERAND (expr, 0);
9168       if (handled_component_p (expr))
9169         {
9170           HOST_WIDE_INT bitsize, bitpos;
9171           tree offset;
9172           enum machine_mode mode;
9173           int unsignedp, volatilep;
9174
9175           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9176                                       &mode, &unsignedp, &volatilep, false);
9177           *residue = bitpos / BITS_PER_UNIT;
9178           if (offset)
9179             {
9180               if (TREE_CODE (offset) == INTEGER_CST)
9181                 *residue += TREE_INT_CST_LOW (offset);
9182               else
9183                 /* We don't handle more complicated offset expressions.  */
9184                 return 1;
9185             }
9186         }
9187
9188       if (DECL_P (expr) && TREE_CODE (expr) != FUNCTION_DECL)
9189         return DECL_ALIGN_UNIT (expr);
9190     }
9191   else if (code == POINTER_PLUS_EXPR)
9192     {
9193       tree op0, op1;
9194       unsigned HOST_WIDE_INT modulus;
9195       enum tree_code inner_code;
9196       
9197       op0 = TREE_OPERAND (expr, 0);
9198       STRIP_NOPS (op0);
9199       modulus = get_pointer_modulus_and_residue (op0, residue);
9200
9201       op1 = TREE_OPERAND (expr, 1);
9202       STRIP_NOPS (op1);
9203       inner_code = TREE_CODE (op1);
9204       if (inner_code == INTEGER_CST)
9205         {
9206           *residue += TREE_INT_CST_LOW (op1);
9207           return modulus;
9208         }
9209       else if (inner_code == MULT_EXPR)
9210         {
9211           op1 = TREE_OPERAND (op1, 1);
9212           if (TREE_CODE (op1) == INTEGER_CST)
9213             {
9214               unsigned HOST_WIDE_INT align;
9215               
9216               /* Compute the greatest power-of-2 divisor of op1.  */
9217               align = TREE_INT_CST_LOW (op1);
9218               align &= -align;
9219
9220               /* If align is non-zero and less than *modulus, replace
9221                  *modulus with align., If align is 0, then either op1 is 0
9222                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9223                  unsigned HOST_WIDE_INT.  In either case, no additional
9224                  constraint is imposed.  */
9225               if (align)
9226                 modulus = MIN (modulus, align);
9227
9228               return modulus;
9229             }
9230         }
9231     }
9232
9233     /* If we get here, we were unable to determine anything useful about the
9234        expression.  */
9235     return 1;
9236 }
9237
9238
9239 /* Fold a binary expression of code CODE and type TYPE with operands
9240    OP0 and OP1.  Return the folded expression if folding is
9241    successful.  Otherwise, return NULL_TREE.  */
9242
9243 tree
9244 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9245 {
9246   enum tree_code_class kind = TREE_CODE_CLASS (code);
9247   tree arg0, arg1, tem;
9248   tree t1 = NULL_TREE;
9249   bool strict_overflow_p;
9250
9251   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
9252                || IS_GIMPLE_STMT_CODE_CLASS (kind))
9253               && TREE_CODE_LENGTH (code) == 2
9254               && op0 != NULL_TREE
9255               && op1 != NULL_TREE);
9256
9257   arg0 = op0;
9258   arg1 = op1;
9259
9260   /* Strip any conversions that don't change the mode.  This is
9261      safe for every expression, except for a comparison expression
9262      because its signedness is derived from its operands.  So, in
9263      the latter case, only strip conversions that don't change the
9264      signedness.
9265
9266      Note that this is done as an internal manipulation within the
9267      constant folder, in order to find the simplest representation
9268      of the arguments so that their form can be studied.  In any
9269      cases, the appropriate type conversions should be put back in
9270      the tree that will get out of the constant folder.  */
9271
9272   if (kind == tcc_comparison)
9273     {
9274       STRIP_SIGN_NOPS (arg0);
9275       STRIP_SIGN_NOPS (arg1);
9276     }
9277   else
9278     {
9279       STRIP_NOPS (arg0);
9280       STRIP_NOPS (arg1);
9281     }
9282
9283   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9284      constant but we can't do arithmetic on them.  */
9285   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9286       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9287       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9288       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9289       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9290       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9291     {
9292       if (kind == tcc_binary)
9293         {
9294           /* Make sure type and arg0 have the same saturating flag.  */
9295           gcc_assert (TYPE_SATURATING (type)
9296                       == TYPE_SATURATING (TREE_TYPE (arg0)));
9297           tem = const_binop (code, arg0, arg1, 0);
9298         }
9299       else if (kind == tcc_comparison)
9300         tem = fold_relational_const (code, type, arg0, arg1);
9301       else
9302         tem = NULL_TREE;
9303
9304       if (tem != NULL_TREE)
9305         {
9306           if (TREE_TYPE (tem) != type)
9307             tem = fold_convert (type, tem);
9308           return tem;
9309         }
9310     }
9311
9312   /* If this is a commutative operation, and ARG0 is a constant, move it
9313      to ARG1 to reduce the number of tests below.  */
9314   if (commutative_tree_code (code)
9315       && tree_swap_operands_p (arg0, arg1, true))
9316     return fold_build2 (code, type, op1, op0);
9317
9318   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9319
9320      First check for cases where an arithmetic operation is applied to a
9321      compound, conditional, or comparison operation.  Push the arithmetic
9322      operation inside the compound or conditional to see if any folding
9323      can then be done.  Convert comparison to conditional for this purpose.
9324      The also optimizes non-constant cases that used to be done in
9325      expand_expr.
9326
9327      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9328      one of the operands is a comparison and the other is a comparison, a
9329      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9330      code below would make the expression more complex.  Change it to a
9331      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9332      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9333
9334   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9335        || code == EQ_EXPR || code == NE_EXPR)
9336       && ((truth_value_p (TREE_CODE (arg0))
9337            && (truth_value_p (TREE_CODE (arg1))
9338                || (TREE_CODE (arg1) == BIT_AND_EXPR
9339                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9340           || (truth_value_p (TREE_CODE (arg1))
9341               && (truth_value_p (TREE_CODE (arg0))
9342                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9343                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9344     {
9345       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9346                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9347                          : TRUTH_XOR_EXPR,
9348                          boolean_type_node,
9349                          fold_convert (boolean_type_node, arg0),
9350                          fold_convert (boolean_type_node, arg1));
9351
9352       if (code == EQ_EXPR)
9353         tem = invert_truthvalue (tem);
9354
9355       return fold_convert (type, tem);
9356     }
9357
9358   if (TREE_CODE_CLASS (code) == tcc_binary
9359       || TREE_CODE_CLASS (code) == tcc_comparison)
9360     {
9361       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9362         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9363                        fold_build2 (code, type,
9364                                     fold_convert (TREE_TYPE (op0),
9365                                                   TREE_OPERAND (arg0, 1)),
9366                                     op1));
9367       if (TREE_CODE (arg1) == COMPOUND_EXPR
9368           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9369         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9370                        fold_build2 (code, type, op0,
9371                                     fold_convert (TREE_TYPE (op1),
9372                                                   TREE_OPERAND (arg1, 1))));
9373
9374       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9375         {
9376           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9377                                                      arg0, arg1, 
9378                                                      /*cond_first_p=*/1);
9379           if (tem != NULL_TREE)
9380             return tem;
9381         }
9382
9383       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9384         {
9385           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9386                                                      arg1, arg0, 
9387                                                      /*cond_first_p=*/0);
9388           if (tem != NULL_TREE)
9389             return tem;
9390         }
9391     }
9392
9393   switch (code)
9394     {
9395     case POINTER_PLUS_EXPR:
9396       /* 0 +p index -> (type)index */
9397       if (integer_zerop (arg0))
9398         return non_lvalue (fold_convert (type, arg1));
9399
9400       /* PTR +p 0 -> PTR */
9401       if (integer_zerop (arg1))
9402         return non_lvalue (fold_convert (type, arg0));
9403
9404       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
9405       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9406            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9407         return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9408                                                 fold_convert (sizetype, arg1),
9409                                                 fold_convert (sizetype, arg0)));
9410
9411       /* index +p PTR -> PTR +p index */
9412       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9413           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9414         return fold_build2 (POINTER_PLUS_EXPR, type,
9415                             fold_convert (type, arg1),
9416                             fold_convert (sizetype, arg0));
9417
9418       /* (PTR +p B) +p A -> PTR +p (B + A) */
9419       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9420         {
9421           tree inner;
9422           tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9423           tree arg00 = TREE_OPERAND (arg0, 0);
9424           inner = fold_build2 (PLUS_EXPR, sizetype,
9425                                arg01, fold_convert (sizetype, arg1));
9426           return fold_convert (type,
9427                                fold_build2 (POINTER_PLUS_EXPR,
9428                                             TREE_TYPE (arg00), arg00, inner));
9429         }
9430
9431       /* PTR_CST +p CST -> CST1 */
9432       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9433         return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9434
9435      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9436         of the array.  Loop optimizer sometimes produce this type of
9437         expressions.  */
9438       if (TREE_CODE (arg0) == ADDR_EXPR)
9439         {
9440           tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9441           if (tem)
9442             return fold_convert (type, tem);
9443         }
9444
9445       return NULL_TREE;
9446
9447     case PLUS_EXPR:
9448       /* PTR + INT -> (INT)(PTR p+ INT) */
9449       if (POINTER_TYPE_P (TREE_TYPE (arg0))
9450           && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9451         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9452                                                 TREE_TYPE (arg0),
9453                                                 arg0,
9454                                                 fold_convert (sizetype, arg1)));
9455       /* INT + PTR -> (INT)(PTR p+ INT) */
9456       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9457           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9458         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9459                                                 TREE_TYPE (arg1),
9460                                                 arg1,
9461                                                 fold_convert (sizetype, arg0)));
9462       /* A + (-B) -> A - B */
9463       if (TREE_CODE (arg1) == NEGATE_EXPR)
9464         return fold_build2 (MINUS_EXPR, type,
9465                             fold_convert (type, arg0),
9466                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9467       /* (-A) + B -> B - A */
9468       if (TREE_CODE (arg0) == NEGATE_EXPR
9469           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9470         return fold_build2 (MINUS_EXPR, type,
9471                             fold_convert (type, arg1),
9472                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9473
9474       if (INTEGRAL_TYPE_P (type))
9475         {
9476           /* Convert ~A + 1 to -A.  */
9477           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9478               && integer_onep (arg1))
9479             return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9480
9481           /* ~X + X is -1.  */
9482           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9483               && !TYPE_OVERFLOW_TRAPS (type))
9484             {
9485               tree tem = TREE_OPERAND (arg0, 0);
9486
9487               STRIP_NOPS (tem);
9488               if (operand_equal_p (tem, arg1, 0))
9489                 {
9490                   t1 = build_int_cst_type (type, -1);
9491                   return omit_one_operand (type, t1, arg1);
9492                 }
9493             }
9494
9495           /* X + ~X is -1.  */
9496           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9497               && !TYPE_OVERFLOW_TRAPS (type))
9498             {
9499               tree tem = TREE_OPERAND (arg1, 0);
9500
9501               STRIP_NOPS (tem);
9502               if (operand_equal_p (arg0, tem, 0))
9503                 {
9504                   t1 = build_int_cst_type (type, -1);
9505                   return omit_one_operand (type, t1, arg0);
9506                 }
9507             }
9508
9509           /* X + (X / CST) * -CST is X % CST.  */
9510           if (TREE_CODE (arg1) == MULT_EXPR
9511               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9512               && operand_equal_p (arg0,
9513                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9514             {
9515               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9516               tree cst1 = TREE_OPERAND (arg1, 1);
9517               tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9518               if (sum && integer_zerop (sum))
9519                 return fold_convert (type,
9520                                      fold_build2 (TRUNC_MOD_EXPR,
9521                                                   TREE_TYPE (arg0), arg0, cst0));
9522             }
9523         }
9524
9525       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9526          same or one.  Make sure type is not saturating.
9527          fold_plusminus_mult_expr will re-associate.  */
9528       if ((TREE_CODE (arg0) == MULT_EXPR
9529            || TREE_CODE (arg1) == MULT_EXPR)
9530           && !TYPE_SATURATING (type)
9531           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9532         {
9533           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9534           if (tem)
9535             return tem;
9536         }
9537
9538       if (! FLOAT_TYPE_P (type))
9539         {
9540           if (integer_zerop (arg1))
9541             return non_lvalue (fold_convert (type, arg0));
9542
9543           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9544              with a constant, and the two constants have no bits in common,
9545              we should treat this as a BIT_IOR_EXPR since this may produce more
9546              simplifications.  */
9547           if (TREE_CODE (arg0) == BIT_AND_EXPR
9548               && TREE_CODE (arg1) == BIT_AND_EXPR
9549               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9550               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9551               && integer_zerop (const_binop (BIT_AND_EXPR,
9552                                              TREE_OPERAND (arg0, 1),
9553                                              TREE_OPERAND (arg1, 1), 0)))
9554             {
9555               code = BIT_IOR_EXPR;
9556               goto bit_ior;
9557             }
9558
9559           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9560              (plus (plus (mult) (mult)) (foo)) so that we can
9561              take advantage of the factoring cases below.  */
9562           if (((TREE_CODE (arg0) == PLUS_EXPR
9563                 || TREE_CODE (arg0) == MINUS_EXPR)
9564                && TREE_CODE (arg1) == MULT_EXPR)
9565               || ((TREE_CODE (arg1) == PLUS_EXPR
9566                    || TREE_CODE (arg1) == MINUS_EXPR)
9567                   && TREE_CODE (arg0) == MULT_EXPR))
9568             {
9569               tree parg0, parg1, parg, marg;
9570               enum tree_code pcode;
9571
9572               if (TREE_CODE (arg1) == MULT_EXPR)
9573                 parg = arg0, marg = arg1;
9574               else
9575                 parg = arg1, marg = arg0;
9576               pcode = TREE_CODE (parg);
9577               parg0 = TREE_OPERAND (parg, 0);
9578               parg1 = TREE_OPERAND (parg, 1);
9579               STRIP_NOPS (parg0);
9580               STRIP_NOPS (parg1);
9581
9582               if (TREE_CODE (parg0) == MULT_EXPR
9583                   && TREE_CODE (parg1) != MULT_EXPR)
9584                 return fold_build2 (pcode, type,
9585                                     fold_build2 (PLUS_EXPR, type,
9586                                                  fold_convert (type, parg0),
9587                                                  fold_convert (type, marg)),
9588                                     fold_convert (type, parg1));
9589               if (TREE_CODE (parg0) != MULT_EXPR
9590                   && TREE_CODE (parg1) == MULT_EXPR)
9591                 return fold_build2 (PLUS_EXPR, type,
9592                                     fold_convert (type, parg0),
9593                                     fold_build2 (pcode, type,
9594                                                  fold_convert (type, marg),
9595                                                  fold_convert (type,
9596                                                                parg1)));
9597             }
9598         }
9599       else
9600         {
9601           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9602           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9603             return non_lvalue (fold_convert (type, arg0));
9604
9605           /* Likewise if the operands are reversed.  */
9606           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9607             return non_lvalue (fold_convert (type, arg1));
9608
9609           /* Convert X + -C into X - C.  */
9610           if (TREE_CODE (arg1) == REAL_CST
9611               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9612             {
9613               tem = fold_negate_const (arg1, type);
9614               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9615                 return fold_build2 (MINUS_EXPR, type,
9616                                     fold_convert (type, arg0),
9617                                     fold_convert (type, tem));
9618             }
9619
9620           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9621              to __complex__ ( x, y ).  This is not the same for SNaNs or
9622              if signed zeros are involved.  */
9623           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9624               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9625               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9626             {
9627               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9628               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9629               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9630               bool arg0rz = false, arg0iz = false;
9631               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9632                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9633                 {
9634                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9635                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9636                   if (arg0rz && arg1i && real_zerop (arg1i))
9637                     {
9638                       tree rp = arg1r ? arg1r
9639                                   : build1 (REALPART_EXPR, rtype, arg1);
9640                       tree ip = arg0i ? arg0i
9641                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9642                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9643                     }
9644                   else if (arg0iz && arg1r && real_zerop (arg1r))
9645                     {
9646                       tree rp = arg0r ? arg0r
9647                                   : build1 (REALPART_EXPR, rtype, arg0);
9648                       tree ip = arg1i ? arg1i
9649                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9650                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9651                     }
9652                 }
9653             }
9654
9655           if (flag_unsafe_math_optimizations
9656               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9657               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9658               && (tem = distribute_real_division (code, type, arg0, arg1)))
9659             return tem;
9660
9661           /* Convert x+x into x*2.0.  */
9662           if (operand_equal_p (arg0, arg1, 0)
9663               && SCALAR_FLOAT_TYPE_P (type))
9664             return fold_build2 (MULT_EXPR, type, arg0,
9665                                 build_real (type, dconst2));
9666
9667           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
9668              We associate floats only if the user has specified
9669              -fassociative-math.  */
9670           if (flag_associative_math
9671               && TREE_CODE (arg1) == PLUS_EXPR
9672               && TREE_CODE (arg0) != MULT_EXPR)
9673             {
9674               tree tree10 = TREE_OPERAND (arg1, 0);
9675               tree tree11 = TREE_OPERAND (arg1, 1);
9676               if (TREE_CODE (tree11) == MULT_EXPR
9677                   && TREE_CODE (tree10) == MULT_EXPR)
9678                 {
9679                   tree tree0;
9680                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9681                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9682                 }
9683             }
9684           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
9685              We associate floats only if the user has specified
9686              -fassociative-math.  */
9687           if (flag_associative_math
9688               && TREE_CODE (arg0) == PLUS_EXPR
9689               && TREE_CODE (arg1) != MULT_EXPR)
9690             {
9691               tree tree00 = TREE_OPERAND (arg0, 0);
9692               tree tree01 = TREE_OPERAND (arg0, 1);
9693               if (TREE_CODE (tree01) == MULT_EXPR
9694                   && TREE_CODE (tree00) == MULT_EXPR)
9695                 {
9696                   tree tree0;
9697                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9698                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9699                 }
9700             }
9701         }
9702
9703      bit_rotate:
9704       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9705          is a rotate of A by C1 bits.  */
9706       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9707          is a rotate of A by B bits.  */
9708       {
9709         enum tree_code code0, code1;
9710         tree rtype;
9711         code0 = TREE_CODE (arg0);
9712         code1 = TREE_CODE (arg1);
9713         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9714              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9715             && operand_equal_p (TREE_OPERAND (arg0, 0),
9716                                 TREE_OPERAND (arg1, 0), 0)
9717             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
9718                 TYPE_UNSIGNED (rtype))
9719             /* Only create rotates in complete modes.  Other cases are not
9720                expanded properly.  */
9721             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
9722           {
9723             tree tree01, tree11;
9724             enum tree_code code01, code11;
9725
9726             tree01 = TREE_OPERAND (arg0, 1);
9727             tree11 = TREE_OPERAND (arg1, 1);
9728             STRIP_NOPS (tree01);
9729             STRIP_NOPS (tree11);
9730             code01 = TREE_CODE (tree01);
9731             code11 = TREE_CODE (tree11);
9732             if (code01 == INTEGER_CST
9733                 && code11 == INTEGER_CST
9734                 && TREE_INT_CST_HIGH (tree01) == 0
9735                 && TREE_INT_CST_HIGH (tree11) == 0
9736                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9737                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9738               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9739                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9740             else if (code11 == MINUS_EXPR)
9741               {
9742                 tree tree110, tree111;
9743                 tree110 = TREE_OPERAND (tree11, 0);
9744                 tree111 = TREE_OPERAND (tree11, 1);
9745                 STRIP_NOPS (tree110);
9746                 STRIP_NOPS (tree111);
9747                 if (TREE_CODE (tree110) == INTEGER_CST
9748                     && 0 == compare_tree_int (tree110,
9749                                               TYPE_PRECISION
9750                                               (TREE_TYPE (TREE_OPERAND
9751                                                           (arg0, 0))))
9752                     && operand_equal_p (tree01, tree111, 0))
9753                   return build2 ((code0 == LSHIFT_EXPR
9754                                   ? LROTATE_EXPR
9755                                   : RROTATE_EXPR),
9756                                  type, TREE_OPERAND (arg0, 0), tree01);
9757               }
9758             else if (code01 == MINUS_EXPR)
9759               {
9760                 tree tree010, tree011;
9761                 tree010 = TREE_OPERAND (tree01, 0);
9762                 tree011 = TREE_OPERAND (tree01, 1);
9763                 STRIP_NOPS (tree010);
9764                 STRIP_NOPS (tree011);
9765                 if (TREE_CODE (tree010) == INTEGER_CST
9766                     && 0 == compare_tree_int (tree010,
9767                                               TYPE_PRECISION
9768                                               (TREE_TYPE (TREE_OPERAND
9769                                                           (arg0, 0))))
9770                     && operand_equal_p (tree11, tree011, 0))
9771                   return build2 ((code0 != LSHIFT_EXPR
9772                                   ? LROTATE_EXPR
9773                                   : RROTATE_EXPR),
9774                                  type, TREE_OPERAND (arg0, 0), tree11);
9775               }
9776           }
9777       }
9778
9779     associate:
9780       /* In most languages, can't associate operations on floats through
9781          parentheses.  Rather than remember where the parentheses were, we
9782          don't associate floats at all, unless the user has specified
9783          -fassociative-math.
9784          And, we need to make sure type is not saturating.  */
9785
9786       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
9787           && !TYPE_SATURATING (type))
9788         {
9789           tree var0, con0, lit0, minus_lit0;
9790           tree var1, con1, lit1, minus_lit1;
9791           bool ok = true;
9792
9793           /* Split both trees into variables, constants, and literals.  Then
9794              associate each group together, the constants with literals,
9795              then the result with variables.  This increases the chances of
9796              literals being recombined later and of generating relocatable
9797              expressions for the sum of a constant and literal.  */
9798           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9799           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9800                              code == MINUS_EXPR);
9801
9802           /* With undefined overflow we can only associate constants
9803              with one variable.  */
9804           if (((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
9805                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9806               && var0 && var1)
9807             {
9808               tree tmp0 = var0;
9809               tree tmp1 = var1;
9810
9811               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9812                 tmp0 = TREE_OPERAND (tmp0, 0);
9813               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9814                 tmp1 = TREE_OPERAND (tmp1, 0);
9815               /* The only case we can still associate with two variables
9816                  is if they are the same, modulo negation.  */
9817               if (!operand_equal_p (tmp0, tmp1, 0))
9818                 ok = false;
9819             }
9820
9821           /* Only do something if we found more than two objects.  Otherwise,
9822              nothing has changed and we risk infinite recursion.  */
9823           if (ok
9824               && (2 < ((var0 != 0) + (var1 != 0)
9825                        + (con0 != 0) + (con1 != 0)
9826                        + (lit0 != 0) + (lit1 != 0)
9827                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9828             {
9829               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9830               if (code == MINUS_EXPR)
9831                 code = PLUS_EXPR;
9832
9833               var0 = associate_trees (var0, var1, code, type);
9834               con0 = associate_trees (con0, con1, code, type);
9835               lit0 = associate_trees (lit0, lit1, code, type);
9836               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9837
9838               /* Preserve the MINUS_EXPR if the negative part of the literal is
9839                  greater than the positive part.  Otherwise, the multiplicative
9840                  folding code (i.e extract_muldiv) may be fooled in case
9841                  unsigned constants are subtracted, like in the following
9842                  example: ((X*2 + 4) - 8U)/2.  */
9843               if (minus_lit0 && lit0)
9844                 {
9845                   if (TREE_CODE (lit0) == INTEGER_CST
9846                       && TREE_CODE (minus_lit0) == INTEGER_CST
9847                       && tree_int_cst_lt (lit0, minus_lit0))
9848                     {
9849                       minus_lit0 = associate_trees (minus_lit0, lit0,
9850                                                     MINUS_EXPR, type);
9851                       lit0 = 0;
9852                     }
9853                   else
9854                     {
9855                       lit0 = associate_trees (lit0, minus_lit0,
9856                                               MINUS_EXPR, type);
9857                       minus_lit0 = 0;
9858                     }
9859                 }
9860               if (minus_lit0)
9861                 {
9862                   if (con0 == 0)
9863                     return fold_convert (type,
9864                                          associate_trees (var0, minus_lit0,
9865                                                           MINUS_EXPR, type));
9866                   else
9867                     {
9868                       con0 = associate_trees (con0, minus_lit0,
9869                                               MINUS_EXPR, type);
9870                       return fold_convert (type,
9871                                            associate_trees (var0, con0,
9872                                                             PLUS_EXPR, type));
9873                     }
9874                 }
9875
9876               con0 = associate_trees (con0, lit0, code, type);
9877               return fold_convert (type, associate_trees (var0, con0,
9878                                                           code, type));
9879             }
9880         }
9881
9882       return NULL_TREE;
9883
9884     case MINUS_EXPR:
9885       /* Pointer simplifications for subtraction, simple reassociations. */
9886       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
9887         {
9888           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
9889           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
9890               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9891             {
9892               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9893               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9894               tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9895               tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9896               return fold_build2 (PLUS_EXPR, type,
9897                                   fold_build2 (MINUS_EXPR, type, arg00, arg10),
9898                                   fold_build2 (MINUS_EXPR, type, arg01, arg11));
9899             }
9900           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
9901           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9902             {
9903               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9904               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9905               tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
9906               if (tmp)
9907                 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
9908             }
9909         }
9910       /* A - (-B) -> A + B */
9911       if (TREE_CODE (arg1) == NEGATE_EXPR)
9912         return fold_build2 (PLUS_EXPR, type, op0,
9913                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9914       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9915       if (TREE_CODE (arg0) == NEGATE_EXPR
9916           && (FLOAT_TYPE_P (type)
9917               || INTEGRAL_TYPE_P (type))
9918           && negate_expr_p (arg1)
9919           && reorder_operands_p (arg0, arg1))
9920         return fold_build2 (MINUS_EXPR, type,
9921                             fold_convert (type, negate_expr (arg1)),
9922                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9923       /* Convert -A - 1 to ~A.  */
9924       if (INTEGRAL_TYPE_P (type)
9925           && TREE_CODE (arg0) == NEGATE_EXPR
9926           && integer_onep (arg1)
9927           && !TYPE_OVERFLOW_TRAPS (type))
9928         return fold_build1 (BIT_NOT_EXPR, type,
9929                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9930
9931       /* Convert -1 - A to ~A.  */
9932       if (INTEGRAL_TYPE_P (type)
9933           && integer_all_onesp (arg0))
9934         return fold_build1 (BIT_NOT_EXPR, type, op1);
9935
9936
9937       /* X - (X / CST) * CST is X % CST.  */
9938       if (INTEGRAL_TYPE_P (type)
9939           && TREE_CODE (arg1) == MULT_EXPR
9940           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9941           && operand_equal_p (arg0,
9942                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
9943           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
9944                               TREE_OPERAND (arg1, 1), 0))
9945         return fold_convert (type,
9946                              fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
9947                                           arg0, TREE_OPERAND (arg1, 1)));
9948
9949       if (! FLOAT_TYPE_P (type))
9950         {
9951           if (integer_zerop (arg0))
9952             return negate_expr (fold_convert (type, arg1));
9953           if (integer_zerop (arg1))
9954             return non_lvalue (fold_convert (type, arg0));
9955
9956           /* Fold A - (A & B) into ~B & A.  */
9957           if (!TREE_SIDE_EFFECTS (arg0)
9958               && TREE_CODE (arg1) == BIT_AND_EXPR)
9959             {
9960               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9961                 {
9962                   tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9963                   return fold_build2 (BIT_AND_EXPR, type,
9964                                       fold_build1 (BIT_NOT_EXPR, type, arg10),
9965                                       fold_convert (type, arg0));
9966                 }
9967               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9968                 {
9969                   tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9970                   return fold_build2 (BIT_AND_EXPR, type,
9971                                       fold_build1 (BIT_NOT_EXPR, type, arg11),
9972                                       fold_convert (type, arg0));
9973                 }
9974             }
9975
9976           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9977              any power of 2 minus 1.  */
9978           if (TREE_CODE (arg0) == BIT_AND_EXPR
9979               && TREE_CODE (arg1) == BIT_AND_EXPR
9980               && operand_equal_p (TREE_OPERAND (arg0, 0),
9981                                   TREE_OPERAND (arg1, 0), 0))
9982             {
9983               tree mask0 = TREE_OPERAND (arg0, 1);
9984               tree mask1 = TREE_OPERAND (arg1, 1);
9985               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9986
9987               if (operand_equal_p (tem, mask1, 0))
9988                 {
9989                   tem = fold_build2 (BIT_XOR_EXPR, type,
9990                                      TREE_OPERAND (arg0, 0), mask1);
9991                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9992                 }
9993             }
9994         }
9995
9996       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9997       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9998         return non_lvalue (fold_convert (type, arg0));
9999
10000       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
10001          ARG0 is zero and X + ARG0 reduces to X, since that would mean
10002          (-ARG1 + ARG0) reduces to -ARG1.  */
10003       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10004         return negate_expr (fold_convert (type, arg1));
10005
10006       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10007          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10008          signed zeros are involved.  */
10009       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10010           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10011           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10012         {
10013           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10014           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
10015           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
10016           bool arg0rz = false, arg0iz = false;
10017           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10018               || (arg0i && (arg0iz = real_zerop (arg0i))))
10019             {
10020               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
10021               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
10022               if (arg0rz && arg1i && real_zerop (arg1i))
10023                 {
10024                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
10025                                          arg1r ? arg1r
10026                                          : build1 (REALPART_EXPR, rtype, arg1));
10027                   tree ip = arg0i ? arg0i
10028                     : build1 (IMAGPART_EXPR, rtype, arg0);
10029                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10030                 }
10031               else if (arg0iz && arg1r && real_zerop (arg1r))
10032                 {
10033                   tree rp = arg0r ? arg0r
10034                     : build1 (REALPART_EXPR, rtype, arg0);
10035                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
10036                                          arg1i ? arg1i
10037                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10038                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10039                 }
10040             }
10041         }
10042
10043       /* Fold &x - &x.  This can happen from &x.foo - &x.
10044          This is unsafe for certain floats even in non-IEEE formats.
10045          In IEEE, it is unsafe because it does wrong for NaNs.
10046          Also note that operand_equal_p is always false if an operand
10047          is volatile.  */
10048
10049       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10050           && operand_equal_p (arg0, arg1, 0))
10051         return fold_convert (type, integer_zero_node);
10052
10053       /* A - B -> A + (-B) if B is easily negatable.  */
10054       if (negate_expr_p (arg1)
10055           && ((FLOAT_TYPE_P (type)
10056                /* Avoid this transformation if B is a positive REAL_CST.  */
10057                && (TREE_CODE (arg1) != REAL_CST
10058                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10059               || INTEGRAL_TYPE_P (type)))
10060         return fold_build2 (PLUS_EXPR, type,
10061                             fold_convert (type, arg0),
10062                             fold_convert (type, negate_expr (arg1)));
10063
10064       /* Try folding difference of addresses.  */
10065       {
10066         HOST_WIDE_INT diff;
10067
10068         if ((TREE_CODE (arg0) == ADDR_EXPR
10069              || TREE_CODE (arg1) == ADDR_EXPR)
10070             && ptr_difference_const (arg0, arg1, &diff))
10071           return build_int_cst_type (type, diff);
10072       }
10073
10074       /* Fold &a[i] - &a[j] to i-j.  */
10075       if (TREE_CODE (arg0) == ADDR_EXPR
10076           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10077           && TREE_CODE (arg1) == ADDR_EXPR
10078           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10079         {
10080           tree aref0 = TREE_OPERAND (arg0, 0);
10081           tree aref1 = TREE_OPERAND (arg1, 0);
10082           if (operand_equal_p (TREE_OPERAND (aref0, 0),
10083                                TREE_OPERAND (aref1, 0), 0))
10084             {
10085               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
10086               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
10087               tree esz = array_ref_element_size (aref0);
10088               tree diff = build2 (MINUS_EXPR, type, op0, op1);
10089               return fold_build2 (MULT_EXPR, type, diff,
10090                                   fold_convert (type, esz));
10091                                   
10092             }
10093         }
10094
10095       if (flag_unsafe_math_optimizations
10096           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10097           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10098           && (tem = distribute_real_division (code, type, arg0, arg1)))
10099         return tem;
10100
10101       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10102          same or one.  Make sure type is not saturating.
10103          fold_plusminus_mult_expr will re-associate.  */
10104       if ((TREE_CODE (arg0) == MULT_EXPR
10105            || TREE_CODE (arg1) == MULT_EXPR)
10106           && !TYPE_SATURATING (type)
10107           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10108         {
10109           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
10110           if (tem)
10111             return tem;
10112         }
10113
10114       goto associate;
10115
10116     case MULT_EXPR:
10117       /* (-A) * (-B) -> A * B  */
10118       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10119         return fold_build2 (MULT_EXPR, type,
10120                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10121                             fold_convert (type, negate_expr (arg1)));
10122       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10123         return fold_build2 (MULT_EXPR, type,
10124                             fold_convert (type, negate_expr (arg0)),
10125                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10126
10127       if (! FLOAT_TYPE_P (type))
10128         {
10129           if (integer_zerop (arg1))
10130             return omit_one_operand (type, arg1, arg0);
10131           if (integer_onep (arg1))
10132             return non_lvalue (fold_convert (type, arg0));
10133           /* Transform x * -1 into -x.  Make sure to do the negation
10134              on the original operand with conversions not stripped
10135              because we can only strip non-sign-changing conversions.  */
10136           if (integer_all_onesp (arg1))
10137             return fold_convert (type, negate_expr (op0));
10138           /* Transform x * -C into -x * C if x is easily negatable.  */
10139           if (TREE_CODE (arg1) == INTEGER_CST
10140               && tree_int_cst_sgn (arg1) == -1
10141               && negate_expr_p (arg0)
10142               && (tem = negate_expr (arg1)) != arg1
10143               && !TREE_OVERFLOW (tem))
10144             return fold_build2 (MULT_EXPR, type,
10145                                 fold_convert (type, negate_expr (arg0)), tem);
10146
10147           /* (a * (1 << b)) is (a << b)  */
10148           if (TREE_CODE (arg1) == LSHIFT_EXPR
10149               && integer_onep (TREE_OPERAND (arg1, 0)))
10150             return fold_build2 (LSHIFT_EXPR, type, op0,
10151                                 TREE_OPERAND (arg1, 1));
10152           if (TREE_CODE (arg0) == LSHIFT_EXPR
10153               && integer_onep (TREE_OPERAND (arg0, 0)))
10154             return fold_build2 (LSHIFT_EXPR, type, op1,
10155                                 TREE_OPERAND (arg0, 1));
10156
10157           /* (A + A) * C -> A * 2 * C  */
10158           if (TREE_CODE (arg0) == PLUS_EXPR
10159               && TREE_CODE (arg1) == INTEGER_CST
10160               && operand_equal_p (TREE_OPERAND (arg0, 0),
10161                                   TREE_OPERAND (arg0, 1), 0))
10162             return fold_build2 (MULT_EXPR, type,
10163                                 omit_one_operand (type, TREE_OPERAND (arg0, 0),
10164                                                   TREE_OPERAND (arg0, 1)),
10165                                 fold_build2 (MULT_EXPR, type,
10166                                              build_int_cst (type, 2) , arg1));
10167
10168           strict_overflow_p = false;
10169           if (TREE_CODE (arg1) == INTEGER_CST
10170               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10171                                              &strict_overflow_p)))
10172             {
10173               if (strict_overflow_p)
10174                 fold_overflow_warning (("assuming signed overflow does not "
10175                                         "occur when simplifying "
10176                                         "multiplication"),
10177                                        WARN_STRICT_OVERFLOW_MISC);
10178               return fold_convert (type, tem);
10179             }
10180
10181           /* Optimize z * conj(z) for integer complex numbers.  */
10182           if (TREE_CODE (arg0) == CONJ_EXPR
10183               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10184             return fold_mult_zconjz (type, arg1);
10185           if (TREE_CODE (arg1) == CONJ_EXPR
10186               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10187             return fold_mult_zconjz (type, arg0);
10188         }
10189       else
10190         {
10191           /* Maybe fold x * 0 to 0.  The expressions aren't the same
10192              when x is NaN, since x * 0 is also NaN.  Nor are they the
10193              same in modes with signed zeros, since multiplying a
10194              negative value by 0 gives -0, not +0.  */
10195           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10196               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10197               && real_zerop (arg1))
10198             return omit_one_operand (type, arg1, arg0);
10199           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
10200           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10201               && real_onep (arg1))
10202             return non_lvalue (fold_convert (type, arg0));
10203
10204           /* Transform x * -1.0 into -x.  */
10205           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10206               && real_minus_onep (arg1))
10207             return fold_convert (type, negate_expr (arg0));
10208
10209           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10210              the result for floating point types due to rounding so it is applied
10211              only if -fassociative-math was specify.  */
10212           if (flag_associative_math
10213               && TREE_CODE (arg0) == RDIV_EXPR
10214               && TREE_CODE (arg1) == REAL_CST
10215               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10216             {
10217               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10218                                       arg1, 0);
10219               if (tem)
10220                 return fold_build2 (RDIV_EXPR, type, tem,
10221                                     TREE_OPERAND (arg0, 1));
10222             }
10223
10224           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10225           if (operand_equal_p (arg0, arg1, 0))
10226             {
10227               tree tem = fold_strip_sign_ops (arg0);
10228               if (tem != NULL_TREE)
10229                 {
10230                   tem = fold_convert (type, tem);
10231                   return fold_build2 (MULT_EXPR, type, tem, tem);
10232                 }
10233             }
10234
10235           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10236              This is not the same for NaNs or if signed zeros are
10237              involved.  */
10238           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10239               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10240               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10241               && TREE_CODE (arg1) == COMPLEX_CST
10242               && real_zerop (TREE_REALPART (arg1)))
10243             {
10244               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10245               if (real_onep (TREE_IMAGPART (arg1)))
10246                 return fold_build2 (COMPLEX_EXPR, type,
10247                                     negate_expr (fold_build1 (IMAGPART_EXPR,
10248                                                               rtype, arg0)),
10249                                     fold_build1 (REALPART_EXPR, rtype, arg0));
10250               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10251                 return fold_build2 (COMPLEX_EXPR, type,
10252                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
10253                                     negate_expr (fold_build1 (REALPART_EXPR,
10254                                                               rtype, arg0)));
10255             }
10256
10257           /* Optimize z * conj(z) for floating point complex numbers.
10258              Guarded by flag_unsafe_math_optimizations as non-finite
10259              imaginary components don't produce scalar results.  */
10260           if (flag_unsafe_math_optimizations
10261               && TREE_CODE (arg0) == CONJ_EXPR
10262               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10263             return fold_mult_zconjz (type, arg1);
10264           if (flag_unsafe_math_optimizations
10265               && TREE_CODE (arg1) == CONJ_EXPR
10266               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10267             return fold_mult_zconjz (type, arg0);
10268
10269           if (flag_unsafe_math_optimizations)
10270             {
10271               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10272               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10273
10274               /* Optimizations of root(...)*root(...).  */
10275               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10276                 {
10277                   tree rootfn, arg;
10278                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10279                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10280
10281                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10282                   if (BUILTIN_SQRT_P (fcode0)
10283                       && operand_equal_p (arg00, arg10, 0)
10284                       && ! HONOR_SNANS (TYPE_MODE (type)))
10285                     return arg00;
10286
10287                   /* Optimize root(x)*root(y) as root(x*y).  */
10288                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10289                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10290                   return build_call_expr (rootfn, 1, arg);
10291                 }
10292
10293               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10294               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10295                 {
10296                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10297                   tree arg = fold_build2 (PLUS_EXPR, type,
10298                                           CALL_EXPR_ARG (arg0, 0),
10299                                           CALL_EXPR_ARG (arg1, 0));
10300                   return build_call_expr (expfn, 1, arg);
10301                 }
10302
10303               /* Optimizations of pow(...)*pow(...).  */
10304               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10305                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10306                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10307                 {
10308                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10309                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10310                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10311                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10312
10313                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10314                   if (operand_equal_p (arg01, arg11, 0))
10315                     {
10316                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10317                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10318                       return build_call_expr (powfn, 2, arg, arg01);
10319                     }
10320
10321                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10322                   if (operand_equal_p (arg00, arg10, 0))
10323                     {
10324                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10325                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10326                       return build_call_expr (powfn, 2, arg00, arg);
10327                     }
10328                 }
10329
10330               /* Optimize tan(x)*cos(x) as sin(x).  */
10331               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10332                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10333                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10334                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10335                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10336                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10337                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10338                                       CALL_EXPR_ARG (arg1, 0), 0))
10339                 {
10340                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10341
10342                   if (sinfn != NULL_TREE)
10343                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10344                 }
10345
10346               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10347               if (fcode1 == BUILT_IN_POW
10348                   || fcode1 == BUILT_IN_POWF
10349                   || fcode1 == BUILT_IN_POWL)
10350                 {
10351                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10352                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10353                   if (TREE_CODE (arg11) == REAL_CST
10354                       && !TREE_OVERFLOW (arg11)
10355                       && operand_equal_p (arg0, arg10, 0))
10356                     {
10357                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10358                       REAL_VALUE_TYPE c;
10359                       tree arg;
10360
10361                       c = TREE_REAL_CST (arg11);
10362                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10363                       arg = build_real (type, c);
10364                       return build_call_expr (powfn, 2, arg0, arg);
10365                     }
10366                 }
10367
10368               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10369               if (fcode0 == BUILT_IN_POW
10370                   || fcode0 == BUILT_IN_POWF
10371                   || fcode0 == BUILT_IN_POWL)
10372                 {
10373                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10374                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10375                   if (TREE_CODE (arg01) == REAL_CST
10376                       && !TREE_OVERFLOW (arg01)
10377                       && operand_equal_p (arg1, arg00, 0))
10378                     {
10379                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10380                       REAL_VALUE_TYPE c;
10381                       tree arg;
10382
10383                       c = TREE_REAL_CST (arg01);
10384                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10385                       arg = build_real (type, c);
10386                       return build_call_expr (powfn, 2, arg1, arg);
10387                     }
10388                 }
10389
10390               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
10391               if (! optimize_size
10392                   && operand_equal_p (arg0, arg1, 0))
10393                 {
10394                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10395
10396                   if (powfn)
10397                     {
10398                       tree arg = build_real (type, dconst2);
10399                       return build_call_expr (powfn, 2, arg0, arg);
10400                     }
10401                 }
10402             }
10403         }
10404       goto associate;
10405
10406     case BIT_IOR_EXPR:
10407     bit_ior:
10408       if (integer_all_onesp (arg1))
10409         return omit_one_operand (type, arg1, arg0);
10410       if (integer_zerop (arg1))
10411         return non_lvalue (fold_convert (type, arg0));
10412       if (operand_equal_p (arg0, arg1, 0))
10413         return non_lvalue (fold_convert (type, arg0));
10414
10415       /* ~X | X is -1.  */
10416       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10417           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10418         {
10419           t1 = fold_convert (type, integer_zero_node);
10420           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10421           return omit_one_operand (type, t1, arg1);
10422         }
10423
10424       /* X | ~X is -1.  */
10425       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10426           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10427         {
10428           t1 = fold_convert (type, integer_zero_node);
10429           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10430           return omit_one_operand (type, t1, arg0);
10431         }
10432
10433       /* Canonicalize (X & C1) | C2.  */
10434       if (TREE_CODE (arg0) == BIT_AND_EXPR
10435           && TREE_CODE (arg1) == INTEGER_CST
10436           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10437         {
10438           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10439           int width = TYPE_PRECISION (type), w;
10440           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10441           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10442           hi2 = TREE_INT_CST_HIGH (arg1);
10443           lo2 = TREE_INT_CST_LOW (arg1);
10444
10445           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10446           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10447             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10448
10449           if (width > HOST_BITS_PER_WIDE_INT)
10450             {
10451               mhi = (unsigned HOST_WIDE_INT) -1 
10452                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10453               mlo = -1;
10454             }
10455           else
10456             {
10457               mhi = 0;
10458               mlo = (unsigned HOST_WIDE_INT) -1
10459                     >> (HOST_BITS_PER_WIDE_INT - width);
10460             }
10461
10462           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10463           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10464             return fold_build2 (BIT_IOR_EXPR, type,
10465                                 TREE_OPERAND (arg0, 0), arg1);
10466
10467           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10468              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10469              mode which allows further optimizations.  */
10470           hi1 &= mhi;
10471           lo1 &= mlo;
10472           hi2 &= mhi;
10473           lo2 &= mlo;
10474           hi3 = hi1 & ~hi2;
10475           lo3 = lo1 & ~lo2;
10476           for (w = BITS_PER_UNIT;
10477                w <= width && w <= HOST_BITS_PER_WIDE_INT;
10478                w <<= 1)
10479             {
10480               unsigned HOST_WIDE_INT mask
10481                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10482               if (((lo1 | lo2) & mask) == mask
10483                   && (lo1 & ~mask) == 0 && hi1 == 0)
10484                 {
10485                   hi3 = 0;
10486                   lo3 = mask;
10487                   break;
10488                 }
10489             }
10490           if (hi3 != hi1 || lo3 != lo1)
10491             return fold_build2 (BIT_IOR_EXPR, type,
10492                                 fold_build2 (BIT_AND_EXPR, type,
10493                                              TREE_OPERAND (arg0, 0),
10494                                              build_int_cst_wide (type,
10495                                                                  lo3, hi3)),
10496                                 arg1);
10497         }
10498
10499       /* (X & Y) | Y is (X, Y).  */
10500       if (TREE_CODE (arg0) == BIT_AND_EXPR
10501           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10502         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10503       /* (X & Y) | X is (Y, X).  */
10504       if (TREE_CODE (arg0) == BIT_AND_EXPR
10505           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10506           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10507         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10508       /* X | (X & Y) is (Y, X).  */
10509       if (TREE_CODE (arg1) == BIT_AND_EXPR
10510           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10511           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10512         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10513       /* X | (Y & X) is (Y, X).  */
10514       if (TREE_CODE (arg1) == BIT_AND_EXPR
10515           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10516           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10517         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10518
10519       t1 = distribute_bit_expr (code, type, arg0, arg1);
10520       if (t1 != NULL_TREE)
10521         return t1;
10522
10523       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10524
10525          This results in more efficient code for machines without a NAND
10526          instruction.  Combine will canonicalize to the first form
10527          which will allow use of NAND instructions provided by the
10528          backend if they exist.  */
10529       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10530           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10531         {
10532           return fold_build1 (BIT_NOT_EXPR, type,
10533                               build2 (BIT_AND_EXPR, type,
10534                                       fold_convert (type,
10535                                                     TREE_OPERAND (arg0, 0)),
10536                                       fold_convert (type,
10537                                                     TREE_OPERAND (arg1, 0))));
10538         }
10539
10540       /* See if this can be simplified into a rotate first.  If that
10541          is unsuccessful continue in the association code.  */
10542       goto bit_rotate;
10543
10544     case BIT_XOR_EXPR:
10545       if (integer_zerop (arg1))
10546         return non_lvalue (fold_convert (type, arg0));
10547       if (integer_all_onesp (arg1))
10548         return fold_build1 (BIT_NOT_EXPR, type, op0);
10549       if (operand_equal_p (arg0, arg1, 0))
10550         return omit_one_operand (type, integer_zero_node, arg0);
10551
10552       /* ~X ^ X is -1.  */
10553       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10554           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10555         {
10556           t1 = fold_convert (type, integer_zero_node);
10557           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10558           return omit_one_operand (type, t1, arg1);
10559         }
10560
10561       /* X ^ ~X is -1.  */
10562       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10563           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10564         {
10565           t1 = fold_convert (type, integer_zero_node);
10566           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10567           return omit_one_operand (type, t1, arg0);
10568         }
10569
10570       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10571          with a constant, and the two constants have no bits in common,
10572          we should treat this as a BIT_IOR_EXPR since this may produce more
10573          simplifications.  */
10574       if (TREE_CODE (arg0) == BIT_AND_EXPR
10575           && TREE_CODE (arg1) == BIT_AND_EXPR
10576           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10577           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10578           && integer_zerop (const_binop (BIT_AND_EXPR,
10579                                          TREE_OPERAND (arg0, 1),
10580                                          TREE_OPERAND (arg1, 1), 0)))
10581         {
10582           code = BIT_IOR_EXPR;
10583           goto bit_ior;
10584         }
10585
10586       /* (X | Y) ^ X -> Y & ~ X*/
10587       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10588           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10589         {
10590           tree t2 = TREE_OPERAND (arg0, 1);
10591           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10592                             arg1);
10593           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10594                             fold_convert (type, t1));
10595           return t1;
10596         }
10597
10598       /* (Y | X) ^ X -> Y & ~ X*/
10599       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10600           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10601         {
10602           tree t2 = TREE_OPERAND (arg0, 0);
10603           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10604                             arg1);
10605           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10606                             fold_convert (type, t1));
10607           return t1;
10608         }
10609
10610       /* X ^ (X | Y) -> Y & ~ X*/
10611       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10612           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10613         {
10614           tree t2 = TREE_OPERAND (arg1, 1);
10615           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10616                             arg0);
10617           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10618                             fold_convert (type, t1));
10619           return t1;
10620         }
10621
10622       /* X ^ (Y | X) -> Y & ~ X*/
10623       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10624           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10625         {
10626           tree t2 = TREE_OPERAND (arg1, 0);
10627           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10628                             arg0);
10629           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10630                             fold_convert (type, t1));
10631           return t1;
10632         }
10633         
10634       /* Convert ~X ^ ~Y to X ^ Y.  */
10635       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10636           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10637         return fold_build2 (code, type,
10638                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10639                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10640
10641       /* Convert ~X ^ C to X ^ ~C.  */
10642       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10643           && TREE_CODE (arg1) == INTEGER_CST)
10644         return fold_build2 (code, type,
10645                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10646                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10647
10648       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10649       if (TREE_CODE (arg0) == BIT_AND_EXPR
10650           && integer_onep (TREE_OPERAND (arg0, 1))
10651           && integer_onep (arg1))
10652         return fold_build2 (EQ_EXPR, type, arg0,
10653                             build_int_cst (TREE_TYPE (arg0), 0));
10654
10655       /* Fold (X & Y) ^ Y as ~X & Y.  */
10656       if (TREE_CODE (arg0) == BIT_AND_EXPR
10657           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10658         {
10659           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10660           return fold_build2 (BIT_AND_EXPR, type, 
10661                               fold_build1 (BIT_NOT_EXPR, type, tem),
10662                               fold_convert (type, arg1));
10663         }
10664       /* Fold (X & Y) ^ X as ~Y & X.  */
10665       if (TREE_CODE (arg0) == BIT_AND_EXPR
10666           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10667           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10668         {
10669           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10670           return fold_build2 (BIT_AND_EXPR, type,
10671                               fold_build1 (BIT_NOT_EXPR, type, tem),
10672                               fold_convert (type, arg1));
10673         }
10674       /* Fold X ^ (X & Y) as X & ~Y.  */
10675       if (TREE_CODE (arg1) == BIT_AND_EXPR
10676           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10677         {
10678           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10679           return fold_build2 (BIT_AND_EXPR, type,
10680                               fold_convert (type, arg0),
10681                               fold_build1 (BIT_NOT_EXPR, type, tem));
10682         }
10683       /* Fold X ^ (Y & X) as ~Y & X.  */
10684       if (TREE_CODE (arg1) == BIT_AND_EXPR
10685           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10686           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10687         {
10688           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10689           return fold_build2 (BIT_AND_EXPR, type,
10690                               fold_build1 (BIT_NOT_EXPR, type, tem),
10691                               fold_convert (type, arg0));
10692         }
10693
10694       /* See if this can be simplified into a rotate first.  If that
10695          is unsuccessful continue in the association code.  */
10696       goto bit_rotate;
10697
10698     case BIT_AND_EXPR:
10699       if (integer_all_onesp (arg1))
10700         return non_lvalue (fold_convert (type, arg0));
10701       if (integer_zerop (arg1))
10702         return omit_one_operand (type, arg1, arg0);
10703       if (operand_equal_p (arg0, arg1, 0))
10704         return non_lvalue (fold_convert (type, arg0));
10705
10706       /* ~X & X is always zero.  */
10707       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10708           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10709         return omit_one_operand (type, integer_zero_node, arg1);
10710
10711       /* X & ~X is always zero.  */
10712       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10713           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10714         return omit_one_operand (type, integer_zero_node, arg0);
10715
10716       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10717       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10718           && TREE_CODE (arg1) == INTEGER_CST
10719           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10720         {
10721           tree tmp1 = fold_convert (TREE_TYPE (arg0), arg1);
10722           tree tmp2 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10723                                    TREE_OPERAND (arg0, 0), tmp1);
10724           tree tmp3 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10725                                    TREE_OPERAND (arg0, 1), tmp1);
10726           return fold_convert (type,
10727                                fold_build2 (BIT_IOR_EXPR, TREE_TYPE (arg0),
10728                                             tmp2, tmp3));
10729         }
10730
10731       /* (X | Y) & Y is (X, Y).  */
10732       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10733           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10734         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10735       /* (X | Y) & X is (Y, X).  */
10736       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10737           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10738           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10739         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10740       /* X & (X | Y) is (Y, X).  */
10741       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10742           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10743           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10744         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10745       /* X & (Y | X) is (Y, X).  */
10746       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10747           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10748           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10749         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10750
10751       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10752       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10753           && integer_onep (TREE_OPERAND (arg0, 1))
10754           && integer_onep (arg1))
10755         {
10756           tem = TREE_OPERAND (arg0, 0);
10757           return fold_build2 (EQ_EXPR, type,
10758                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10759                                            build_int_cst (TREE_TYPE (tem), 1)),
10760                               build_int_cst (TREE_TYPE (tem), 0));
10761         }
10762       /* Fold ~X & 1 as (X & 1) == 0.  */
10763       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10764           && integer_onep (arg1))
10765         {
10766           tem = TREE_OPERAND (arg0, 0);
10767           return fold_build2 (EQ_EXPR, type,
10768                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10769                                            build_int_cst (TREE_TYPE (tem), 1)),
10770                               build_int_cst (TREE_TYPE (tem), 0));
10771         }
10772
10773       /* Fold (X ^ Y) & Y as ~X & Y.  */
10774       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10775           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10776         {
10777           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10778           return fold_build2 (BIT_AND_EXPR, type, 
10779                               fold_build1 (BIT_NOT_EXPR, type, tem),
10780                               fold_convert (type, arg1));
10781         }
10782       /* Fold (X ^ Y) & X as ~Y & X.  */
10783       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10784           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10785           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10786         {
10787           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10788           return fold_build2 (BIT_AND_EXPR, type,
10789                               fold_build1 (BIT_NOT_EXPR, type, tem),
10790                               fold_convert (type, arg1));
10791         }
10792       /* Fold X & (X ^ Y) as X & ~Y.  */
10793       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10794           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10795         {
10796           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10797           return fold_build2 (BIT_AND_EXPR, type,
10798                               fold_convert (type, arg0),
10799                               fold_build1 (BIT_NOT_EXPR, type, tem));
10800         }
10801       /* Fold X & (Y ^ X) as ~Y & X.  */
10802       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10803           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10804           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10805         {
10806           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10807           return fold_build2 (BIT_AND_EXPR, type,
10808                               fold_build1 (BIT_NOT_EXPR, type, tem),
10809                               fold_convert (type, arg0));
10810         }
10811
10812       t1 = distribute_bit_expr (code, type, arg0, arg1);
10813       if (t1 != NULL_TREE)
10814         return t1;
10815       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10816       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10817           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10818         {
10819           unsigned int prec
10820             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10821
10822           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10823               && (~TREE_INT_CST_LOW (arg1)
10824                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10825             return fold_convert (type, TREE_OPERAND (arg0, 0));
10826         }
10827
10828       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10829
10830          This results in more efficient code for machines without a NOR
10831          instruction.  Combine will canonicalize to the first form
10832          which will allow use of NOR instructions provided by the
10833          backend if they exist.  */
10834       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10835           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10836         {
10837           return fold_build1 (BIT_NOT_EXPR, type,
10838                               build2 (BIT_IOR_EXPR, type,
10839                                       fold_convert (type,
10840                                                     TREE_OPERAND (arg0, 0)),
10841                                       fold_convert (type,
10842                                                     TREE_OPERAND (arg1, 0))));
10843         }
10844
10845       /* If arg0 is derived from the address of an object or function, we may
10846          be able to fold this expression using the object or function's
10847          alignment.  */
10848       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
10849         {
10850           unsigned HOST_WIDE_INT modulus, residue;
10851           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
10852
10853           modulus = get_pointer_modulus_and_residue (arg0, &residue);
10854
10855           /* This works because modulus is a power of 2.  If this weren't the
10856              case, we'd have to replace it by its greatest power-of-2
10857              divisor: modulus & -modulus.  */
10858           if (low < modulus)
10859             return build_int_cst (type, residue & low);
10860         }
10861
10862       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
10863               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
10864          if the new mask might be further optimized.  */
10865       if ((TREE_CODE (arg0) == LSHIFT_EXPR
10866            || TREE_CODE (arg0) == RSHIFT_EXPR)
10867           && host_integerp (TREE_OPERAND (arg0, 1), 1)
10868           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
10869           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
10870              < TYPE_PRECISION (TREE_TYPE (arg0))
10871           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
10872           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
10873         {
10874           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
10875           unsigned HOST_WIDE_INT mask
10876             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
10877           unsigned HOST_WIDE_INT newmask, zerobits = 0;
10878           tree shift_type = TREE_TYPE (arg0);
10879
10880           if (TREE_CODE (arg0) == LSHIFT_EXPR)
10881             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
10882           else if (TREE_CODE (arg0) == RSHIFT_EXPR
10883                    && TYPE_PRECISION (TREE_TYPE (arg0))
10884                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
10885             {
10886               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
10887               tree arg00 = TREE_OPERAND (arg0, 0);
10888               /* See if more bits can be proven as zero because of
10889                  zero extension.  */
10890               if (TREE_CODE (arg00) == NOP_EXPR
10891                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
10892                 {
10893                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
10894                   if (TYPE_PRECISION (inner_type)
10895                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
10896                       && TYPE_PRECISION (inner_type) < prec)
10897                     {
10898                       prec = TYPE_PRECISION (inner_type);
10899                       /* See if we can shorten the right shift.  */
10900                       if (shiftc < prec)
10901                         shift_type = inner_type;
10902                     }
10903                 }
10904               zerobits = ~(unsigned HOST_WIDE_INT) 0;
10905               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
10906               zerobits <<= prec - shiftc;
10907               /* For arithmetic shift if sign bit could be set, zerobits
10908                  can contain actually sign bits, so no transformation is
10909                  possible, unless MASK masks them all away.  In that
10910                  case the shift needs to be converted into logical shift.  */
10911               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
10912                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
10913                 {
10914                   if ((mask & zerobits) == 0)
10915                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
10916                   else
10917                     zerobits = 0;
10918                 }
10919             }
10920
10921           /* ((X << 16) & 0xff00) is (X, 0).  */
10922           if ((mask & zerobits) == mask)
10923             return omit_one_operand (type, build_int_cst (type, 0), arg0);
10924
10925           newmask = mask | zerobits;
10926           if (newmask != mask && (newmask & (newmask + 1)) == 0)
10927             {
10928               unsigned int prec;
10929
10930               /* Only do the transformation if NEWMASK is some integer
10931                  mode's mask.  */
10932               for (prec = BITS_PER_UNIT;
10933                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
10934                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
10935                   break;
10936               if (prec < HOST_BITS_PER_WIDE_INT
10937                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
10938                 {
10939                   if (shift_type != TREE_TYPE (arg0))
10940                     {
10941                       tem = fold_build2 (TREE_CODE (arg0), shift_type,
10942                                          fold_convert (shift_type,
10943                                                        TREE_OPERAND (arg0, 0)),
10944                                          TREE_OPERAND (arg0, 1));
10945                       tem = fold_convert (type, tem);
10946                     }
10947                   else
10948                     tem = op0;
10949                   return fold_build2 (BIT_AND_EXPR, type, tem,
10950                                       build_int_cst_type (TREE_TYPE (op1),
10951                                                           newmask));
10952                 }
10953             }
10954         }
10955
10956       goto associate;
10957
10958     case RDIV_EXPR:
10959       /* Don't touch a floating-point divide by zero unless the mode
10960          of the constant can represent infinity.  */
10961       if (TREE_CODE (arg1) == REAL_CST
10962           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10963           && real_zerop (arg1))
10964         return NULL_TREE;
10965
10966       /* Optimize A / A to 1.0 if we don't care about
10967          NaNs or Infinities.  Skip the transformation
10968          for non-real operands.  */
10969       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10970           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10971           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10972           && operand_equal_p (arg0, arg1, 0))
10973         {
10974           tree r = build_real (TREE_TYPE (arg0), dconst1);
10975
10976           return omit_two_operands (type, r, arg0, arg1);
10977         }
10978
10979       /* The complex version of the above A / A optimization.  */
10980       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10981           && operand_equal_p (arg0, arg1, 0))
10982         {
10983           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10984           if (! HONOR_NANS (TYPE_MODE (elem_type))
10985               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10986             {
10987               tree r = build_real (elem_type, dconst1);
10988               /* omit_two_operands will call fold_convert for us.  */
10989               return omit_two_operands (type, r, arg0, arg1);
10990             }
10991         }
10992
10993       /* (-A) / (-B) -> A / B  */
10994       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10995         return fold_build2 (RDIV_EXPR, type,
10996                             TREE_OPERAND (arg0, 0),
10997                             negate_expr (arg1));
10998       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10999         return fold_build2 (RDIV_EXPR, type,
11000                             negate_expr (arg0),
11001                             TREE_OPERAND (arg1, 0));
11002
11003       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
11004       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11005           && real_onep (arg1))
11006         return non_lvalue (fold_convert (type, arg0));
11007
11008       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
11009       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11010           && real_minus_onep (arg1))
11011         return non_lvalue (fold_convert (type, negate_expr (arg0)));
11012
11013       /* If ARG1 is a constant, we can convert this to a multiply by the
11014          reciprocal.  This does not have the same rounding properties,
11015          so only do this if -freciprocal-math.  We can actually
11016          always safely do it if ARG1 is a power of two, but it's hard to
11017          tell if it is or not in a portable manner.  */
11018       if (TREE_CODE (arg1) == REAL_CST)
11019         {
11020           if (flag_reciprocal_math
11021               && 0 != (tem = const_binop (code, build_real (type, dconst1),
11022                                           arg1, 0)))
11023             return fold_build2 (MULT_EXPR, type, arg0, tem);
11024           /* Find the reciprocal if optimizing and the result is exact.  */
11025           if (optimize)
11026             {
11027               REAL_VALUE_TYPE r;
11028               r = TREE_REAL_CST (arg1);
11029               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11030                 {
11031                   tem = build_real (type, r);
11032                   return fold_build2 (MULT_EXPR, type,
11033                                       fold_convert (type, arg0), tem);
11034                 }
11035             }
11036         }
11037       /* Convert A/B/C to A/(B*C).  */ 
11038       if (flag_reciprocal_math
11039           && TREE_CODE (arg0) == RDIV_EXPR)
11040         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11041                             fold_build2 (MULT_EXPR, type,
11042                                          TREE_OPERAND (arg0, 1), arg1));
11043
11044       /* Convert A/(B/C) to (A/B)*C.  */
11045       if (flag_reciprocal_math
11046           && TREE_CODE (arg1) == RDIV_EXPR)
11047         return fold_build2 (MULT_EXPR, type,
11048                             fold_build2 (RDIV_EXPR, type, arg0,
11049                                          TREE_OPERAND (arg1, 0)),
11050                             TREE_OPERAND (arg1, 1));
11051
11052       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11053       if (flag_reciprocal_math
11054           && TREE_CODE (arg1) == MULT_EXPR
11055           && TREE_CODE (arg0) == REAL_CST
11056           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11057         {
11058           tree tem = const_binop (RDIV_EXPR, arg0,
11059                                   TREE_OPERAND (arg1, 1), 0);
11060           if (tem)
11061             return fold_build2 (RDIV_EXPR, type, tem,
11062                                 TREE_OPERAND (arg1, 0));
11063         }
11064
11065       if (flag_unsafe_math_optimizations)
11066         {
11067           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11068           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11069
11070           /* Optimize sin(x)/cos(x) as tan(x).  */
11071           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11072                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11073                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11074               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11075                                   CALL_EXPR_ARG (arg1, 0), 0))
11076             {
11077               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11078
11079               if (tanfn != NULL_TREE)
11080                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11081             }
11082
11083           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11084           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11085                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11086                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11087               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11088                                   CALL_EXPR_ARG (arg1, 0), 0))
11089             {
11090               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11091
11092               if (tanfn != NULL_TREE)
11093                 {
11094                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11095                   return fold_build2 (RDIV_EXPR, type,
11096                                       build_real (type, dconst1), tmp);
11097                 }
11098             }
11099
11100           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11101              NaNs or Infinities.  */
11102           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11103                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11104                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11105             {
11106               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11107               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11108
11109               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11110                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11111                   && operand_equal_p (arg00, arg01, 0))
11112                 {
11113                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11114
11115                   if (cosfn != NULL_TREE)
11116                     return build_call_expr (cosfn, 1, arg00);
11117                 }
11118             }
11119
11120           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11121              NaNs or Infinities.  */
11122           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11123                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11124                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11125             {
11126               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11127               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11128
11129               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11130                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11131                   && operand_equal_p (arg00, arg01, 0))
11132                 {
11133                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11134
11135                   if (cosfn != NULL_TREE)
11136                     {
11137                       tree tmp = build_call_expr (cosfn, 1, arg00);
11138                       return fold_build2 (RDIV_EXPR, type,
11139                                           build_real (type, dconst1),
11140                                           tmp);
11141                     }
11142                 }
11143             }
11144
11145           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11146           if (fcode0 == BUILT_IN_POW
11147               || fcode0 == BUILT_IN_POWF
11148               || fcode0 == BUILT_IN_POWL)
11149             {
11150               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11151               tree arg01 = CALL_EXPR_ARG (arg0, 1);
11152               if (TREE_CODE (arg01) == REAL_CST
11153                   && !TREE_OVERFLOW (arg01)
11154                   && operand_equal_p (arg1, arg00, 0))
11155                 {
11156                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11157                   REAL_VALUE_TYPE c;
11158                   tree arg;
11159
11160                   c = TREE_REAL_CST (arg01);
11161                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11162                   arg = build_real (type, c);
11163                   return build_call_expr (powfn, 2, arg1, arg);
11164                 }
11165             }
11166
11167           /* Optimize a/root(b/c) into a*root(c/b).  */
11168           if (BUILTIN_ROOT_P (fcode1))
11169             {
11170               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11171
11172               if (TREE_CODE (rootarg) == RDIV_EXPR)
11173                 {
11174                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11175                   tree b = TREE_OPERAND (rootarg, 0);
11176                   tree c = TREE_OPERAND (rootarg, 1);
11177
11178                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11179
11180                   tmp = build_call_expr (rootfn, 1, tmp);
11181                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
11182                 }
11183             }
11184
11185           /* Optimize x/expN(y) into x*expN(-y).  */
11186           if (BUILTIN_EXPONENT_P (fcode1))
11187             {
11188               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11189               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11190               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11191               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11192             }
11193
11194           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11195           if (fcode1 == BUILT_IN_POW
11196               || fcode1 == BUILT_IN_POWF
11197               || fcode1 == BUILT_IN_POWL)
11198             {
11199               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11200               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11201               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11202               tree neg11 = fold_convert (type, negate_expr (arg11));
11203               arg1 = build_call_expr (powfn, 2, arg10, neg11);
11204               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11205             }
11206         }
11207       return NULL_TREE;
11208
11209     case TRUNC_DIV_EXPR:
11210     case FLOOR_DIV_EXPR:
11211       /* Simplify A / (B << N) where A and B are positive and B is
11212          a power of 2, to A >> (N + log2(B)).  */
11213       strict_overflow_p = false;
11214       if (TREE_CODE (arg1) == LSHIFT_EXPR
11215           && (TYPE_UNSIGNED (type)
11216               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11217         {
11218           tree sval = TREE_OPERAND (arg1, 0);
11219           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11220             {
11221               tree sh_cnt = TREE_OPERAND (arg1, 1);
11222               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11223
11224               if (strict_overflow_p)
11225                 fold_overflow_warning (("assuming signed overflow does not "
11226                                         "occur when simplifying A / (B << N)"),
11227                                        WARN_STRICT_OVERFLOW_MISC);
11228
11229               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11230                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
11231               return fold_build2 (RSHIFT_EXPR, type,
11232                                   fold_convert (type, arg0), sh_cnt);
11233             }
11234         }
11235
11236       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11237          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
11238       if (INTEGRAL_TYPE_P (type)
11239           && TYPE_UNSIGNED (type)
11240           && code == FLOOR_DIV_EXPR)
11241         return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11242
11243       /* Fall thru */
11244
11245     case ROUND_DIV_EXPR:
11246     case CEIL_DIV_EXPR:
11247     case EXACT_DIV_EXPR:
11248       if (integer_onep (arg1))
11249         return non_lvalue (fold_convert (type, arg0));
11250       if (integer_zerop (arg1))
11251         return NULL_TREE;
11252       /* X / -1 is -X.  */
11253       if (!TYPE_UNSIGNED (type)
11254           && TREE_CODE (arg1) == INTEGER_CST
11255           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11256           && TREE_INT_CST_HIGH (arg1) == -1)
11257         return fold_convert (type, negate_expr (arg0));
11258
11259       /* Convert -A / -B to A / B when the type is signed and overflow is
11260          undefined.  */
11261       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11262           && TREE_CODE (arg0) == NEGATE_EXPR
11263           && negate_expr_p (arg1))
11264         {
11265           if (INTEGRAL_TYPE_P (type))
11266             fold_overflow_warning (("assuming signed overflow does not occur "
11267                                     "when distributing negation across "
11268                                     "division"),
11269                                    WARN_STRICT_OVERFLOW_MISC);
11270           return fold_build2 (code, type,
11271                               fold_convert (type, TREE_OPERAND (arg0, 0)),
11272                               negate_expr (arg1));
11273         }
11274       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11275           && TREE_CODE (arg1) == NEGATE_EXPR
11276           && negate_expr_p (arg0))
11277         {
11278           if (INTEGRAL_TYPE_P (type))
11279             fold_overflow_warning (("assuming signed overflow does not occur "
11280                                     "when distributing negation across "
11281                                     "division"),
11282                                    WARN_STRICT_OVERFLOW_MISC);
11283           return fold_build2 (code, type, negate_expr (arg0),
11284                               TREE_OPERAND (arg1, 0));
11285         }
11286
11287       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11288          operation, EXACT_DIV_EXPR.
11289
11290          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11291          At one time others generated faster code, it's not clear if they do
11292          after the last round to changes to the DIV code in expmed.c.  */
11293       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11294           && multiple_of_p (type, arg0, arg1))
11295         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11296
11297       strict_overflow_p = false;
11298       if (TREE_CODE (arg1) == INTEGER_CST
11299           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11300                                          &strict_overflow_p)))
11301         {
11302           if (strict_overflow_p)
11303             fold_overflow_warning (("assuming signed overflow does not occur "
11304                                     "when simplifying division"),
11305                                    WARN_STRICT_OVERFLOW_MISC);
11306           return fold_convert (type, tem);
11307         }
11308
11309       return NULL_TREE;
11310
11311     case CEIL_MOD_EXPR:
11312     case FLOOR_MOD_EXPR:
11313     case ROUND_MOD_EXPR:
11314     case TRUNC_MOD_EXPR:
11315       /* X % 1 is always zero, but be sure to preserve any side
11316          effects in X.  */
11317       if (integer_onep (arg1))
11318         return omit_one_operand (type, integer_zero_node, arg0);
11319
11320       /* X % 0, return X % 0 unchanged so that we can get the
11321          proper warnings and errors.  */
11322       if (integer_zerop (arg1))
11323         return NULL_TREE;
11324
11325       /* 0 % X is always zero, but be sure to preserve any side
11326          effects in X.  Place this after checking for X == 0.  */
11327       if (integer_zerop (arg0))
11328         return omit_one_operand (type, integer_zero_node, arg1);
11329
11330       /* X % -1 is zero.  */
11331       if (!TYPE_UNSIGNED (type)
11332           && TREE_CODE (arg1) == INTEGER_CST
11333           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11334           && TREE_INT_CST_HIGH (arg1) == -1)
11335         return omit_one_operand (type, integer_zero_node, arg0);
11336
11337       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11338          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11339       strict_overflow_p = false;
11340       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11341           && (TYPE_UNSIGNED (type)
11342               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11343         {
11344           tree c = arg1;
11345           /* Also optimize A % (C << N)  where C is a power of 2,
11346              to A & ((C << N) - 1).  */
11347           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11348             c = TREE_OPERAND (arg1, 0);
11349
11350           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11351             {
11352               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11353                                        build_int_cst (TREE_TYPE (arg1), 1));
11354               if (strict_overflow_p)
11355                 fold_overflow_warning (("assuming signed overflow does not "
11356                                         "occur when simplifying "
11357                                         "X % (power of two)"),
11358                                        WARN_STRICT_OVERFLOW_MISC);
11359               return fold_build2 (BIT_AND_EXPR, type,
11360                                   fold_convert (type, arg0),
11361                                   fold_convert (type, mask));
11362             }
11363         }
11364
11365       /* X % -C is the same as X % C.  */
11366       if (code == TRUNC_MOD_EXPR
11367           && !TYPE_UNSIGNED (type)
11368           && TREE_CODE (arg1) == INTEGER_CST
11369           && !TREE_OVERFLOW (arg1)
11370           && TREE_INT_CST_HIGH (arg1) < 0
11371           && !TYPE_OVERFLOW_TRAPS (type)
11372           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
11373           && !sign_bit_p (arg1, arg1))
11374         return fold_build2 (code, type, fold_convert (type, arg0),
11375                             fold_convert (type, negate_expr (arg1)));
11376
11377       /* X % -Y is the same as X % Y.  */
11378       if (code == TRUNC_MOD_EXPR
11379           && !TYPE_UNSIGNED (type)
11380           && TREE_CODE (arg1) == NEGATE_EXPR
11381           && !TYPE_OVERFLOW_TRAPS (type))
11382         return fold_build2 (code, type, fold_convert (type, arg0),
11383                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11384
11385       if (TREE_CODE (arg1) == INTEGER_CST
11386           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11387                                          &strict_overflow_p)))
11388         {
11389           if (strict_overflow_p)
11390             fold_overflow_warning (("assuming signed overflow does not occur "
11391                                     "when simplifying modulos"),
11392                                    WARN_STRICT_OVERFLOW_MISC);
11393           return fold_convert (type, tem);
11394         }
11395
11396       return NULL_TREE;
11397
11398     case LROTATE_EXPR:
11399     case RROTATE_EXPR:
11400       if (integer_all_onesp (arg0))
11401         return omit_one_operand (type, arg0, arg1);
11402       goto shift;
11403
11404     case RSHIFT_EXPR:
11405       /* Optimize -1 >> x for arithmetic right shifts.  */
11406       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
11407         return omit_one_operand (type, arg0, arg1);
11408       /* ... fall through ...  */
11409
11410     case LSHIFT_EXPR:
11411     shift:
11412       if (integer_zerop (arg1))
11413         return non_lvalue (fold_convert (type, arg0));
11414       if (integer_zerop (arg0))
11415         return omit_one_operand (type, arg0, arg1);
11416
11417       /* Since negative shift count is not well-defined,
11418          don't try to compute it in the compiler.  */
11419       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11420         return NULL_TREE;
11421
11422       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
11423       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11424           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11425           && host_integerp (TREE_OPERAND (arg0, 1), false)
11426           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11427         {
11428           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11429                                + TREE_INT_CST_LOW (arg1));
11430
11431           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11432              being well defined.  */
11433           if (low >= TYPE_PRECISION (type))
11434             {
11435               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11436                 low = low % TYPE_PRECISION (type);
11437               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11438                 return build_int_cst (type, 0);
11439               else
11440                 low = TYPE_PRECISION (type) - 1;
11441             }
11442
11443           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11444                               build_int_cst (type, low));
11445         }
11446
11447       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11448          into x & ((unsigned)-1 >> c) for unsigned types.  */
11449       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11450            || (TYPE_UNSIGNED (type)
11451                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11452           && host_integerp (arg1, false)
11453           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11454           && host_integerp (TREE_OPERAND (arg0, 1), false)
11455           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11456         {
11457           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11458           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11459           tree lshift;
11460           tree arg00;
11461
11462           if (low0 == low1)
11463             {
11464               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11465
11466               lshift = build_int_cst (type, -1);
11467               lshift = int_const_binop (code, lshift, arg1, 0);
11468
11469               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11470             }
11471         }
11472
11473       /* Rewrite an LROTATE_EXPR by a constant into an
11474          RROTATE_EXPR by a new constant.  */
11475       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11476         {
11477           tree tem = build_int_cst (TREE_TYPE (arg1),
11478                                     TYPE_PRECISION (type));
11479           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11480           return fold_build2 (RROTATE_EXPR, type, op0, tem);
11481         }
11482
11483       /* If we have a rotate of a bit operation with the rotate count and
11484          the second operand of the bit operation both constant,
11485          permute the two operations.  */
11486       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11487           && (TREE_CODE (arg0) == BIT_AND_EXPR
11488               || TREE_CODE (arg0) == BIT_IOR_EXPR
11489               || TREE_CODE (arg0) == BIT_XOR_EXPR)
11490           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11491         return fold_build2 (TREE_CODE (arg0), type,
11492                             fold_build2 (code, type,
11493                                          TREE_OPERAND (arg0, 0), arg1),
11494                             fold_build2 (code, type,
11495                                          TREE_OPERAND (arg0, 1), arg1));
11496
11497       /* Two consecutive rotates adding up to the precision of the
11498          type can be ignored.  */
11499       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11500           && TREE_CODE (arg0) == RROTATE_EXPR
11501           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11502           && TREE_INT_CST_HIGH (arg1) == 0
11503           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11504           && ((TREE_INT_CST_LOW (arg1)
11505                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11506               == (unsigned int) TYPE_PRECISION (type)))
11507         return TREE_OPERAND (arg0, 0);
11508
11509       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11510               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11511          if the latter can be further optimized.  */
11512       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11513           && TREE_CODE (arg0) == BIT_AND_EXPR
11514           && TREE_CODE (arg1) == INTEGER_CST
11515           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11516         {
11517           tree mask = fold_build2 (code, type,
11518                                    fold_convert (type, TREE_OPERAND (arg0, 1)),
11519                                    arg1);
11520           tree shift = fold_build2 (code, type,
11521                                     fold_convert (type, TREE_OPERAND (arg0, 0)),
11522                                     arg1);
11523           tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11524           if (tem)
11525             return tem;
11526         }
11527
11528       return NULL_TREE;
11529
11530     case MIN_EXPR:
11531       if (operand_equal_p (arg0, arg1, 0))
11532         return omit_one_operand (type, arg0, arg1);
11533       if (INTEGRAL_TYPE_P (type)
11534           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11535         return omit_one_operand (type, arg1, arg0);
11536       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11537       if (tem)
11538         return tem;
11539       goto associate;
11540
11541     case MAX_EXPR:
11542       if (operand_equal_p (arg0, arg1, 0))
11543         return omit_one_operand (type, arg0, arg1);
11544       if (INTEGRAL_TYPE_P (type)
11545           && TYPE_MAX_VALUE (type)
11546           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11547         return omit_one_operand (type, arg1, arg0);
11548       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11549       if (tem)
11550         return tem;
11551       goto associate;
11552
11553     case TRUTH_ANDIF_EXPR:
11554       /* Note that the operands of this must be ints
11555          and their values must be 0 or 1.
11556          ("true" is a fixed value perhaps depending on the language.)  */
11557       /* If first arg is constant zero, return it.  */
11558       if (integer_zerop (arg0))
11559         return fold_convert (type, arg0);
11560     case TRUTH_AND_EXPR:
11561       /* If either arg is constant true, drop it.  */
11562       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11563         return non_lvalue (fold_convert (type, arg1));
11564       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11565           /* Preserve sequence points.  */
11566           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11567         return non_lvalue (fold_convert (type, arg0));
11568       /* If second arg is constant zero, result is zero, but first arg
11569          must be evaluated.  */
11570       if (integer_zerop (arg1))
11571         return omit_one_operand (type, arg1, arg0);
11572       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11573          case will be handled here.  */
11574       if (integer_zerop (arg0))
11575         return omit_one_operand (type, arg0, arg1);
11576
11577       /* !X && X is always false.  */
11578       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11579           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11580         return omit_one_operand (type, integer_zero_node, arg1);
11581       /* X && !X is always false.  */
11582       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11583           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11584         return omit_one_operand (type, integer_zero_node, arg0);
11585
11586       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
11587          means A >= Y && A != MAX, but in this case we know that
11588          A < X <= MAX.  */
11589
11590       if (!TREE_SIDE_EFFECTS (arg0)
11591           && !TREE_SIDE_EFFECTS (arg1))
11592         {
11593           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
11594           if (tem && !operand_equal_p (tem, arg0, 0))
11595             return fold_build2 (code, type, tem, arg1);
11596
11597           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11598           if (tem && !operand_equal_p (tem, arg1, 0))
11599             return fold_build2 (code, type, arg0, tem);
11600         }
11601
11602     truth_andor:
11603       /* We only do these simplifications if we are optimizing.  */
11604       if (!optimize)
11605         return NULL_TREE;
11606
11607       /* Check for things like (A || B) && (A || C).  We can convert this
11608          to A || (B && C).  Note that either operator can be any of the four
11609          truth and/or operations and the transformation will still be
11610          valid.   Also note that we only care about order for the
11611          ANDIF and ORIF operators.  If B contains side effects, this
11612          might change the truth-value of A.  */
11613       if (TREE_CODE (arg0) == TREE_CODE (arg1)
11614           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11615               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11616               || TREE_CODE (arg0) == TRUTH_AND_EXPR
11617               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11618           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11619         {
11620           tree a00 = TREE_OPERAND (arg0, 0);
11621           tree a01 = TREE_OPERAND (arg0, 1);
11622           tree a10 = TREE_OPERAND (arg1, 0);
11623           tree a11 = TREE_OPERAND (arg1, 1);
11624           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11625                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11626                              && (code == TRUTH_AND_EXPR
11627                                  || code == TRUTH_OR_EXPR));
11628
11629           if (operand_equal_p (a00, a10, 0))
11630             return fold_build2 (TREE_CODE (arg0), type, a00,
11631                                 fold_build2 (code, type, a01, a11));
11632           else if (commutative && operand_equal_p (a00, a11, 0))
11633             return fold_build2 (TREE_CODE (arg0), type, a00,
11634                                 fold_build2 (code, type, a01, a10));
11635           else if (commutative && operand_equal_p (a01, a10, 0))
11636             return fold_build2 (TREE_CODE (arg0), type, a01,
11637                                 fold_build2 (code, type, a00, a11));
11638
11639           /* This case if tricky because we must either have commutative
11640              operators or else A10 must not have side-effects.  */
11641
11642           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11643                    && operand_equal_p (a01, a11, 0))
11644             return fold_build2 (TREE_CODE (arg0), type,
11645                                 fold_build2 (code, type, a00, a10),
11646                                 a01);
11647         }
11648
11649       /* See if we can build a range comparison.  */
11650       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11651         return tem;
11652
11653       /* Check for the possibility of merging component references.  If our
11654          lhs is another similar operation, try to merge its rhs with our
11655          rhs.  Then try to merge our lhs and rhs.  */
11656       if (TREE_CODE (arg0) == code
11657           && 0 != (tem = fold_truthop (code, type,
11658                                        TREE_OPERAND (arg0, 1), arg1)))
11659         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11660
11661       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11662         return tem;
11663
11664       return NULL_TREE;
11665
11666     case TRUTH_ORIF_EXPR:
11667       /* Note that the operands of this must be ints
11668          and their values must be 0 or true.
11669          ("true" is a fixed value perhaps depending on the language.)  */
11670       /* If first arg is constant true, return it.  */
11671       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11672         return fold_convert (type, arg0);
11673     case TRUTH_OR_EXPR:
11674       /* If either arg is constant zero, drop it.  */
11675       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11676         return non_lvalue (fold_convert (type, arg1));
11677       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11678           /* Preserve sequence points.  */
11679           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11680         return non_lvalue (fold_convert (type, arg0));
11681       /* If second arg is constant true, result is true, but we must
11682          evaluate first arg.  */
11683       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11684         return omit_one_operand (type, arg1, arg0);
11685       /* Likewise for first arg, but note this only occurs here for
11686          TRUTH_OR_EXPR.  */
11687       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11688         return omit_one_operand (type, arg0, arg1);
11689
11690       /* !X || X is always true.  */
11691       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11692           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11693         return omit_one_operand (type, integer_one_node, arg1);
11694       /* X || !X is always true.  */
11695       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11696           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11697         return omit_one_operand (type, integer_one_node, arg0);
11698
11699       goto truth_andor;
11700
11701     case TRUTH_XOR_EXPR:
11702       /* If the second arg is constant zero, drop it.  */
11703       if (integer_zerop (arg1))
11704         return non_lvalue (fold_convert (type, arg0));
11705       /* If the second arg is constant true, this is a logical inversion.  */
11706       if (integer_onep (arg1))
11707         {
11708           /* Only call invert_truthvalue if operand is a truth value.  */
11709           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11710             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11711           else
11712             tem = invert_truthvalue (arg0);
11713           return non_lvalue (fold_convert (type, tem));
11714         }
11715       /* Identical arguments cancel to zero.  */
11716       if (operand_equal_p (arg0, arg1, 0))
11717         return omit_one_operand (type, integer_zero_node, arg0);
11718
11719       /* !X ^ X is always true.  */
11720       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11721           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11722         return omit_one_operand (type, integer_one_node, arg1);
11723
11724       /* X ^ !X is always true.  */
11725       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11726           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11727         return omit_one_operand (type, integer_one_node, arg0);
11728
11729       return NULL_TREE;
11730
11731     case EQ_EXPR:
11732     case NE_EXPR:
11733       tem = fold_comparison (code, type, op0, op1);
11734       if (tem != NULL_TREE)
11735         return tem;
11736
11737       /* bool_var != 0 becomes bool_var. */
11738       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11739           && code == NE_EXPR)
11740         return non_lvalue (fold_convert (type, arg0));
11741
11742       /* bool_var == 1 becomes bool_var. */
11743       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11744           && code == EQ_EXPR)
11745         return non_lvalue (fold_convert (type, arg0));
11746
11747       /* bool_var != 1 becomes !bool_var. */
11748       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11749           && code == NE_EXPR)
11750         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11751
11752       /* bool_var == 0 becomes !bool_var. */
11753       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11754           && code == EQ_EXPR)
11755         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11756
11757       /* If this is an equality comparison of the address of two non-weak,
11758          unaliased symbols neither of which are extern (since we do not
11759          have access to attributes for externs), then we know the result.  */
11760       if (TREE_CODE (arg0) == ADDR_EXPR
11761           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11762           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11763           && ! lookup_attribute ("alias",
11764                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11765           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11766           && TREE_CODE (arg1) == ADDR_EXPR
11767           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11768           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11769           && ! lookup_attribute ("alias",
11770                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11771           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11772         {
11773           /* We know that we're looking at the address of two
11774              non-weak, unaliased, static _DECL nodes.
11775
11776              It is both wasteful and incorrect to call operand_equal_p
11777              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11778              all we need to do is test pointer equality for the arguments
11779              to the two ADDR_EXPR nodes.  It is incorrect to use
11780              operand_equal_p as that function is NOT equivalent to a
11781              C equality test.  It can in fact return false for two
11782              objects which would test as equal using the C equality
11783              operator.  */
11784           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11785           return constant_boolean_node (equal
11786                                         ? code == EQ_EXPR : code != EQ_EXPR,
11787                                         type);
11788         }
11789
11790       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11791          a MINUS_EXPR of a constant, we can convert it into a comparison with
11792          a revised constant as long as no overflow occurs.  */
11793       if (TREE_CODE (arg1) == INTEGER_CST
11794           && (TREE_CODE (arg0) == PLUS_EXPR
11795               || TREE_CODE (arg0) == MINUS_EXPR)
11796           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11797           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11798                                       ? MINUS_EXPR : PLUS_EXPR,
11799                                       fold_convert (TREE_TYPE (arg0), arg1),
11800                                       TREE_OPERAND (arg0, 1), 0))
11801           && !TREE_OVERFLOW (tem))
11802         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11803
11804       /* Similarly for a NEGATE_EXPR.  */
11805       if (TREE_CODE (arg0) == NEGATE_EXPR
11806           && TREE_CODE (arg1) == INTEGER_CST
11807           && 0 != (tem = negate_expr (arg1))
11808           && TREE_CODE (tem) == INTEGER_CST
11809           && !TREE_OVERFLOW (tem))
11810         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11811
11812       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11813       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11814           && TREE_CODE (arg1) == INTEGER_CST
11815           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11816         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11817                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11818                                          fold_convert (TREE_TYPE (arg0), arg1),
11819                                          TREE_OPERAND (arg0, 1)));
11820
11821       /* Transform comparisons of the form X +- C CMP X.  */
11822       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11823           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11824           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11825           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11826               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11827         {
11828           tree cst = TREE_OPERAND (arg0, 1);
11829
11830           if (code == EQ_EXPR
11831               && !integer_zerop (cst))
11832             return omit_two_operands (type, boolean_false_node,
11833                                       TREE_OPERAND (arg0, 0), arg1);
11834           else
11835             return omit_two_operands (type, boolean_true_node,
11836                                       TREE_OPERAND (arg0, 0), arg1);
11837         }
11838
11839       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11840          for !=.  Don't do this for ordered comparisons due to overflow.  */
11841       if (TREE_CODE (arg0) == MINUS_EXPR
11842           && integer_zerop (arg1))
11843         return fold_build2 (code, type,
11844                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11845
11846       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11847       if (TREE_CODE (arg0) == ABS_EXPR
11848           && (integer_zerop (arg1) || real_zerop (arg1)))
11849         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11850
11851       /* If this is an EQ or NE comparison with zero and ARG0 is
11852          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11853          two operations, but the latter can be done in one less insn
11854          on machines that have only two-operand insns or on which a
11855          constant cannot be the first operand.  */
11856       if (TREE_CODE (arg0) == BIT_AND_EXPR
11857           && integer_zerop (arg1))
11858         {
11859           tree arg00 = TREE_OPERAND (arg0, 0);
11860           tree arg01 = TREE_OPERAND (arg0, 1);
11861           if (TREE_CODE (arg00) == LSHIFT_EXPR
11862               && integer_onep (TREE_OPERAND (arg00, 0)))
11863             {
11864               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11865                                       arg01, TREE_OPERAND (arg00, 1));
11866               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11867                                  build_int_cst (TREE_TYPE (arg0), 1));
11868               return fold_build2 (code, type,
11869                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11870             }
11871           else if (TREE_CODE (arg01) == LSHIFT_EXPR
11872                    && integer_onep (TREE_OPERAND (arg01, 0)))
11873             {
11874               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11875                                       arg00, TREE_OPERAND (arg01, 1));
11876               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11877                                  build_int_cst (TREE_TYPE (arg0), 1));
11878               return fold_build2 (code, type,
11879                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11880             }
11881         }
11882
11883       /* If this is an NE or EQ comparison of zero against the result of a
11884          signed MOD operation whose second operand is a power of 2, make
11885          the MOD operation unsigned since it is simpler and equivalent.  */
11886       if (integer_zerop (arg1)
11887           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11888           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11889               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11890               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11891               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11892           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11893         {
11894           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11895           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11896                                      fold_convert (newtype,
11897                                                    TREE_OPERAND (arg0, 0)),
11898                                      fold_convert (newtype,
11899                                                    TREE_OPERAND (arg0, 1)));
11900
11901           return fold_build2 (code, type, newmod,
11902                               fold_convert (newtype, arg1));
11903         }
11904
11905       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11906          C1 is a valid shift constant, and C2 is a power of two, i.e.
11907          a single bit.  */
11908       if (TREE_CODE (arg0) == BIT_AND_EXPR
11909           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11910           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11911              == INTEGER_CST
11912           && integer_pow2p (TREE_OPERAND (arg0, 1))
11913           && integer_zerop (arg1))
11914         {
11915           tree itype = TREE_TYPE (arg0);
11916           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11917           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11918
11919           /* Check for a valid shift count.  */
11920           if (TREE_INT_CST_HIGH (arg001) == 0
11921               && TREE_INT_CST_LOW (arg001) < prec)
11922             {
11923               tree arg01 = TREE_OPERAND (arg0, 1);
11924               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11925               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11926               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11927                  can be rewritten as (X & (C2 << C1)) != 0.  */
11928               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11929                 {
11930                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11931                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11932                   return fold_build2 (code, type, tem, arg1);
11933                 }
11934               /* Otherwise, for signed (arithmetic) shifts,
11935                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11936                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11937               else if (!TYPE_UNSIGNED (itype))
11938                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11939                                     arg000, build_int_cst (itype, 0));
11940               /* Otherwise, of unsigned (logical) shifts,
11941                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11942                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11943               else
11944                 return omit_one_operand (type,
11945                                          code == EQ_EXPR ? integer_one_node
11946                                                          : integer_zero_node,
11947                                          arg000);
11948             }
11949         }
11950
11951       /* If this is an NE comparison of zero with an AND of one, remove the
11952          comparison since the AND will give the correct value.  */
11953       if (code == NE_EXPR
11954           && integer_zerop (arg1)
11955           && TREE_CODE (arg0) == BIT_AND_EXPR
11956           && integer_onep (TREE_OPERAND (arg0, 1)))
11957         return fold_convert (type, arg0);
11958
11959       /* If we have (A & C) == C where C is a power of 2, convert this into
11960          (A & C) != 0.  Similarly for NE_EXPR.  */
11961       if (TREE_CODE (arg0) == BIT_AND_EXPR
11962           && integer_pow2p (TREE_OPERAND (arg0, 1))
11963           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11964         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11965                             arg0, fold_convert (TREE_TYPE (arg0),
11966                                                 integer_zero_node));
11967
11968       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11969          bit, then fold the expression into A < 0 or A >= 0.  */
11970       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11971       if (tem)
11972         return tem;
11973
11974       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11975          Similarly for NE_EXPR.  */
11976       if (TREE_CODE (arg0) == BIT_AND_EXPR
11977           && TREE_CODE (arg1) == INTEGER_CST
11978           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11979         {
11980           tree notc = fold_build1 (BIT_NOT_EXPR,
11981                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11982                                    TREE_OPERAND (arg0, 1));
11983           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11984                                        arg1, notc);
11985           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11986           if (integer_nonzerop (dandnotc))
11987             return omit_one_operand (type, rslt, arg0);
11988         }
11989
11990       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11991          Similarly for NE_EXPR.  */
11992       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11993           && TREE_CODE (arg1) == INTEGER_CST
11994           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11995         {
11996           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11997           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11998                                        TREE_OPERAND (arg0, 1), notd);
11999           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12000           if (integer_nonzerop (candnotd))
12001             return omit_one_operand (type, rslt, arg0);
12002         }
12003
12004       /* Optimize comparisons of strlen vs zero to a compare of the
12005          first character of the string vs zero.  To wit,
12006                 strlen(ptr) == 0   =>  *ptr == 0
12007                 strlen(ptr) != 0   =>  *ptr != 0
12008          Other cases should reduce to one of these two (or a constant)
12009          due to the return value of strlen being unsigned.  */
12010       if (TREE_CODE (arg0) == CALL_EXPR
12011           && integer_zerop (arg1))
12012         {
12013           tree fndecl = get_callee_fndecl (arg0);
12014
12015           if (fndecl
12016               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12017               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12018               && call_expr_nargs (arg0) == 1
12019               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12020             {
12021               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
12022               return fold_build2 (code, type, iref,
12023                                   build_int_cst (TREE_TYPE (iref), 0));
12024             }
12025         }
12026
12027       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12028          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12029       if (TREE_CODE (arg0) == RSHIFT_EXPR
12030           && integer_zerop (arg1)
12031           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12032         {
12033           tree arg00 = TREE_OPERAND (arg0, 0);
12034           tree arg01 = TREE_OPERAND (arg0, 1);
12035           tree itype = TREE_TYPE (arg00);
12036           if (TREE_INT_CST_HIGH (arg01) == 0
12037               && TREE_INT_CST_LOW (arg01)
12038                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12039             {
12040               if (TYPE_UNSIGNED (itype))
12041                 {
12042                   itype = signed_type_for (itype);
12043                   arg00 = fold_convert (itype, arg00);
12044                 }
12045               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12046                                   type, arg00, build_int_cst (itype, 0));
12047             }
12048         }
12049
12050       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12051       if (integer_zerop (arg1)
12052           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12053         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12054                             TREE_OPERAND (arg0, 1));
12055
12056       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12057       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12058           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12059         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12060                             build_int_cst (TREE_TYPE (arg1), 0));
12061       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12062       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12063           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12064           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12065         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
12066                             build_int_cst (TREE_TYPE (arg1), 0));
12067
12068       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12069       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12070           && TREE_CODE (arg1) == INTEGER_CST
12071           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12072         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12073                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
12074                                          TREE_OPERAND (arg0, 1), arg1));
12075
12076       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12077          (X & C) == 0 when C is a single bit.  */
12078       if (TREE_CODE (arg0) == BIT_AND_EXPR
12079           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12080           && integer_zerop (arg1)
12081           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12082         {
12083           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
12084                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12085                              TREE_OPERAND (arg0, 1));
12086           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12087                               type, tem, arg1);
12088         }
12089
12090       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12091          constant C is a power of two, i.e. a single bit.  */
12092       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12093           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12094           && integer_zerop (arg1)
12095           && integer_pow2p (TREE_OPERAND (arg0, 1))
12096           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12097                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12098         {
12099           tree arg00 = TREE_OPERAND (arg0, 0);
12100           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12101                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
12102         }
12103
12104       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12105          when is C is a power of two, i.e. a single bit.  */
12106       if (TREE_CODE (arg0) == BIT_AND_EXPR
12107           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12108           && integer_zerop (arg1)
12109           && integer_pow2p (TREE_OPERAND (arg0, 1))
12110           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12111                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12112         {
12113           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12114           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
12115                              arg000, TREE_OPERAND (arg0, 1));
12116           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12117                               tem, build_int_cst (TREE_TYPE (tem), 0));
12118         }
12119
12120       if (integer_zerop (arg1)
12121           && tree_expr_nonzero_p (arg0))
12122         {
12123           tree res = constant_boolean_node (code==NE_EXPR, type);
12124           return omit_one_operand (type, res, arg0);
12125         }
12126
12127       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12128       if (TREE_CODE (arg0) == NEGATE_EXPR
12129           && TREE_CODE (arg1) == NEGATE_EXPR)
12130         return fold_build2 (code, type,
12131                             TREE_OPERAND (arg0, 0),
12132                             TREE_OPERAND (arg1, 0));
12133
12134       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12135       if (TREE_CODE (arg0) == BIT_AND_EXPR
12136           && TREE_CODE (arg1) == BIT_AND_EXPR)
12137         {
12138           tree arg00 = TREE_OPERAND (arg0, 0);
12139           tree arg01 = TREE_OPERAND (arg0, 1);
12140           tree arg10 = TREE_OPERAND (arg1, 0);
12141           tree arg11 = TREE_OPERAND (arg1, 1);
12142           tree itype = TREE_TYPE (arg0);
12143
12144           if (operand_equal_p (arg01, arg11, 0))
12145             return fold_build2 (code, type,
12146                                 fold_build2 (BIT_AND_EXPR, itype,
12147                                              fold_build2 (BIT_XOR_EXPR, itype,
12148                                                           arg00, arg10),
12149                                              arg01),
12150                                 build_int_cst (itype, 0));
12151
12152           if (operand_equal_p (arg01, arg10, 0))
12153             return fold_build2 (code, type,
12154                                 fold_build2 (BIT_AND_EXPR, itype,
12155                                              fold_build2 (BIT_XOR_EXPR, itype,
12156                                                           arg00, arg11),
12157                                              arg01),
12158                                 build_int_cst (itype, 0));
12159
12160           if (operand_equal_p (arg00, arg11, 0))
12161             return fold_build2 (code, type,
12162                                 fold_build2 (BIT_AND_EXPR, itype,
12163                                              fold_build2 (BIT_XOR_EXPR, itype,
12164                                                           arg01, arg10),
12165                                              arg00),
12166                                 build_int_cst (itype, 0));
12167
12168           if (operand_equal_p (arg00, arg10, 0))
12169             return fold_build2 (code, type,
12170                                 fold_build2 (BIT_AND_EXPR, itype,
12171                                              fold_build2 (BIT_XOR_EXPR, itype,
12172                                                           arg01, arg11),
12173                                              arg00),
12174                                 build_int_cst (itype, 0));
12175         }
12176
12177       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12178           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12179         {
12180           tree arg00 = TREE_OPERAND (arg0, 0);
12181           tree arg01 = TREE_OPERAND (arg0, 1);
12182           tree arg10 = TREE_OPERAND (arg1, 0);
12183           tree arg11 = TREE_OPERAND (arg1, 1);
12184           tree itype = TREE_TYPE (arg0);
12185
12186           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12187              operand_equal_p guarantees no side-effects so we don't need
12188              to use omit_one_operand on Z.  */
12189           if (operand_equal_p (arg01, arg11, 0))
12190             return fold_build2 (code, type, arg00, arg10);
12191           if (operand_equal_p (arg01, arg10, 0))
12192             return fold_build2 (code, type, arg00, arg11);
12193           if (operand_equal_p (arg00, arg11, 0))
12194             return fold_build2 (code, type, arg01, arg10);
12195           if (operand_equal_p (arg00, arg10, 0))
12196             return fold_build2 (code, type, arg01, arg11);
12197
12198           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12199           if (TREE_CODE (arg01) == INTEGER_CST
12200               && TREE_CODE (arg11) == INTEGER_CST)
12201             return fold_build2 (code, type,
12202                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12203                                              fold_build2 (BIT_XOR_EXPR, itype,
12204                                                           arg01, arg11)),
12205                                 arg10);
12206         }
12207
12208       /* Attempt to simplify equality/inequality comparisons of complex
12209          values.  Only lower the comparison if the result is known or
12210          can be simplified to a single scalar comparison.  */
12211       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12212            || TREE_CODE (arg0) == COMPLEX_CST)
12213           && (TREE_CODE (arg1) == COMPLEX_EXPR
12214               || TREE_CODE (arg1) == COMPLEX_CST))
12215         {
12216           tree real0, imag0, real1, imag1;
12217           tree rcond, icond;
12218
12219           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12220             {
12221               real0 = TREE_OPERAND (arg0, 0);
12222               imag0 = TREE_OPERAND (arg0, 1);
12223             }
12224           else
12225             {
12226               real0 = TREE_REALPART (arg0);
12227               imag0 = TREE_IMAGPART (arg0);
12228             }
12229
12230           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12231             {
12232               real1 = TREE_OPERAND (arg1, 0);
12233               imag1 = TREE_OPERAND (arg1, 1);
12234             }
12235           else
12236             {
12237               real1 = TREE_REALPART (arg1);
12238               imag1 = TREE_IMAGPART (arg1);
12239             }
12240
12241           rcond = fold_binary (code, type, real0, real1);
12242           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12243             {
12244               if (integer_zerop (rcond))
12245                 {
12246                   if (code == EQ_EXPR)
12247                     return omit_two_operands (type, boolean_false_node,
12248                                               imag0, imag1);
12249                   return fold_build2 (NE_EXPR, type, imag0, imag1);
12250                 }
12251               else
12252                 {
12253                   if (code == NE_EXPR)
12254                     return omit_two_operands (type, boolean_true_node,
12255                                               imag0, imag1);
12256                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
12257                 }
12258             }
12259
12260           icond = fold_binary (code, type, imag0, imag1);
12261           if (icond && TREE_CODE (icond) == INTEGER_CST)
12262             {
12263               if (integer_zerop (icond))
12264                 {
12265                   if (code == EQ_EXPR)
12266                     return omit_two_operands (type, boolean_false_node,
12267                                               real0, real1);
12268                   return fold_build2 (NE_EXPR, type, real0, real1);
12269                 }
12270               else
12271                 {
12272                   if (code == NE_EXPR)
12273                     return omit_two_operands (type, boolean_true_node,
12274                                               real0, real1);
12275                   return fold_build2 (EQ_EXPR, type, real0, real1);
12276                 }
12277             }
12278         }
12279
12280       return NULL_TREE;
12281
12282     case LT_EXPR:
12283     case GT_EXPR:
12284     case LE_EXPR:
12285     case GE_EXPR:
12286       tem = fold_comparison (code, type, op0, op1);
12287       if (tem != NULL_TREE)
12288         return tem;
12289
12290       /* Transform comparisons of the form X +- C CMP X.  */
12291       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12292           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12293           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12294                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12295               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12296                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12297         {
12298           tree arg01 = TREE_OPERAND (arg0, 1);
12299           enum tree_code code0 = TREE_CODE (arg0);
12300           int is_positive;
12301
12302           if (TREE_CODE (arg01) == REAL_CST)
12303             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12304           else
12305             is_positive = tree_int_cst_sgn (arg01);
12306
12307           /* (X - c) > X becomes false.  */
12308           if (code == GT_EXPR
12309               && ((code0 == MINUS_EXPR && is_positive >= 0)
12310                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12311             {
12312               if (TREE_CODE (arg01) == INTEGER_CST
12313                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12314                 fold_overflow_warning (("assuming signed overflow does not "
12315                                         "occur when assuming that (X - c) > X "
12316                                         "is always false"),
12317                                        WARN_STRICT_OVERFLOW_ALL);
12318               return constant_boolean_node (0, type);
12319             }
12320
12321           /* Likewise (X + c) < X becomes false.  */
12322           if (code == LT_EXPR
12323               && ((code0 == PLUS_EXPR && is_positive >= 0)
12324                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12325             {
12326               if (TREE_CODE (arg01) == INTEGER_CST
12327                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12328                 fold_overflow_warning (("assuming signed overflow does not "
12329                                         "occur when assuming that "
12330                                         "(X + c) < X is always false"),
12331                                        WARN_STRICT_OVERFLOW_ALL);
12332               return constant_boolean_node (0, type);
12333             }
12334
12335           /* Convert (X - c) <= X to true.  */
12336           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12337               && code == LE_EXPR
12338               && ((code0 == MINUS_EXPR && is_positive >= 0)
12339                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12340             {
12341               if (TREE_CODE (arg01) == INTEGER_CST
12342                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12343                 fold_overflow_warning (("assuming signed overflow does not "
12344                                         "occur when assuming that "
12345                                         "(X - c) <= X is always true"),
12346                                        WARN_STRICT_OVERFLOW_ALL);
12347               return constant_boolean_node (1, type);
12348             }
12349
12350           /* Convert (X + c) >= X to true.  */
12351           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12352               && code == GE_EXPR
12353               && ((code0 == PLUS_EXPR && is_positive >= 0)
12354                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12355             {
12356               if (TREE_CODE (arg01) == INTEGER_CST
12357                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12358                 fold_overflow_warning (("assuming signed overflow does not "
12359                                         "occur when assuming that "
12360                                         "(X + c) >= X is always true"),
12361                                        WARN_STRICT_OVERFLOW_ALL);
12362               return constant_boolean_node (1, type);
12363             }
12364
12365           if (TREE_CODE (arg01) == INTEGER_CST)
12366             {
12367               /* Convert X + c > X and X - c < X to true for integers.  */
12368               if (code == GT_EXPR
12369                   && ((code0 == PLUS_EXPR && is_positive > 0)
12370                       || (code0 == MINUS_EXPR && is_positive < 0)))
12371                 {
12372                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12373                     fold_overflow_warning (("assuming signed overflow does "
12374                                             "not occur when assuming that "
12375                                             "(X + c) > X is always true"),
12376                                            WARN_STRICT_OVERFLOW_ALL);
12377                   return constant_boolean_node (1, type);
12378                 }
12379
12380               if (code == LT_EXPR
12381                   && ((code0 == MINUS_EXPR && is_positive > 0)
12382                       || (code0 == PLUS_EXPR && is_positive < 0)))
12383                 {
12384                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12385                     fold_overflow_warning (("assuming signed overflow does "
12386                                             "not occur when assuming that "
12387                                             "(X - c) < X is always true"),
12388                                            WARN_STRICT_OVERFLOW_ALL);
12389                   return constant_boolean_node (1, type);
12390                 }
12391
12392               /* Convert X + c <= X and X - c >= X to false for integers.  */
12393               if (code == LE_EXPR
12394                   && ((code0 == PLUS_EXPR && is_positive > 0)
12395                       || (code0 == MINUS_EXPR && is_positive < 0)))
12396                 {
12397                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12398                     fold_overflow_warning (("assuming signed overflow does "
12399                                             "not occur when assuming that "
12400                                             "(X + c) <= X is always false"),
12401                                            WARN_STRICT_OVERFLOW_ALL);
12402                   return constant_boolean_node (0, type);
12403                 }
12404
12405               if (code == GE_EXPR
12406                   && ((code0 == MINUS_EXPR && is_positive > 0)
12407                       || (code0 == PLUS_EXPR && is_positive < 0)))
12408                 {
12409                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12410                     fold_overflow_warning (("assuming signed overflow does "
12411                                             "not occur when assuming that "
12412                                             "(X - c) >= X is always false"),
12413                                            WARN_STRICT_OVERFLOW_ALL);
12414                   return constant_boolean_node (0, type);
12415                 }
12416             }
12417         }
12418
12419       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
12420          This transformation affects the cases which are handled in later
12421          optimizations involving comparisons with non-negative constants.  */
12422       if (TREE_CODE (arg1) == INTEGER_CST
12423           && TREE_CODE (arg0) != INTEGER_CST
12424           && tree_int_cst_sgn (arg1) > 0)
12425         {
12426           if (code == GE_EXPR)
12427             {
12428               arg1 = const_binop (MINUS_EXPR, arg1,
12429                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12430               return fold_build2 (GT_EXPR, type, arg0,
12431                                   fold_convert (TREE_TYPE (arg0), arg1));
12432             }
12433           if (code == LT_EXPR)
12434             {
12435               arg1 = const_binop (MINUS_EXPR, arg1,
12436                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12437               return fold_build2 (LE_EXPR, type, arg0,
12438                                   fold_convert (TREE_TYPE (arg0), arg1));
12439             }
12440         }
12441
12442       /* Comparisons with the highest or lowest possible integer of
12443          the specified precision will have known values.  */
12444       {
12445         tree arg1_type = TREE_TYPE (arg1);
12446         unsigned int width = TYPE_PRECISION (arg1_type);
12447
12448         if (TREE_CODE (arg1) == INTEGER_CST
12449             && !TREE_OVERFLOW (arg1)
12450             && width <= 2 * HOST_BITS_PER_WIDE_INT
12451             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12452           {
12453             HOST_WIDE_INT signed_max_hi;
12454             unsigned HOST_WIDE_INT signed_max_lo;
12455             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12456
12457             if (width <= HOST_BITS_PER_WIDE_INT)
12458               {
12459                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12460                                 - 1;
12461                 signed_max_hi = 0;
12462                 max_hi = 0;
12463
12464                 if (TYPE_UNSIGNED (arg1_type))
12465                   {
12466                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12467                     min_lo = 0;
12468                     min_hi = 0;
12469                   }
12470                 else
12471                   {
12472                     max_lo = signed_max_lo;
12473                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12474                     min_hi = -1;
12475                   }
12476               }
12477             else
12478               {
12479                 width -= HOST_BITS_PER_WIDE_INT;
12480                 signed_max_lo = -1;
12481                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12482                                 - 1;
12483                 max_lo = -1;
12484                 min_lo = 0;
12485
12486                 if (TYPE_UNSIGNED (arg1_type))
12487                   {
12488                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12489                     min_hi = 0;
12490                   }
12491                 else
12492                   {
12493                     max_hi = signed_max_hi;
12494                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12495                   }
12496               }
12497
12498             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12499                 && TREE_INT_CST_LOW (arg1) == max_lo)
12500               switch (code)
12501                 {
12502                 case GT_EXPR:
12503                   return omit_one_operand (type, integer_zero_node, arg0);
12504
12505                 case GE_EXPR:
12506                   return fold_build2 (EQ_EXPR, type, op0, op1);
12507
12508                 case LE_EXPR:
12509                   return omit_one_operand (type, integer_one_node, arg0);
12510
12511                 case LT_EXPR:
12512                   return fold_build2 (NE_EXPR, type, op0, op1);
12513
12514                 /* The GE_EXPR and LT_EXPR cases above are not normally
12515                    reached because of previous transformations.  */
12516
12517                 default:
12518                   break;
12519                 }
12520             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12521                      == max_hi
12522                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12523               switch (code)
12524                 {
12525                 case GT_EXPR:
12526                   arg1 = const_binop (PLUS_EXPR, arg1,
12527                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12528                   return fold_build2 (EQ_EXPR, type,
12529                                       fold_convert (TREE_TYPE (arg1), arg0),
12530                                       arg1);
12531                 case LE_EXPR:
12532                   arg1 = const_binop (PLUS_EXPR, arg1,
12533                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12534                   return fold_build2 (NE_EXPR, type,
12535                                       fold_convert (TREE_TYPE (arg1), arg0),
12536                                       arg1);
12537                 default:
12538                   break;
12539                 }
12540             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12541                      == min_hi
12542                      && TREE_INT_CST_LOW (arg1) == min_lo)
12543               switch (code)
12544                 {
12545                 case LT_EXPR:
12546                   return omit_one_operand (type, integer_zero_node, arg0);
12547
12548                 case LE_EXPR:
12549                   return fold_build2 (EQ_EXPR, type, op0, op1);
12550
12551                 case GE_EXPR:
12552                   return omit_one_operand (type, integer_one_node, arg0);
12553
12554                 case GT_EXPR:
12555                   return fold_build2 (NE_EXPR, type, op0, op1);
12556
12557                 default:
12558                   break;
12559                 }
12560             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12561                      == min_hi
12562                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12563               switch (code)
12564                 {
12565                 case GE_EXPR:
12566                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12567                   return fold_build2 (NE_EXPR, type,
12568                                       fold_convert (TREE_TYPE (arg1), arg0),
12569                                       arg1);
12570                 case LT_EXPR:
12571                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12572                   return fold_build2 (EQ_EXPR, type,
12573                                       fold_convert (TREE_TYPE (arg1), arg0),
12574                                       arg1);
12575                 default:
12576                   break;
12577                 }
12578
12579             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
12580                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
12581                      && TYPE_UNSIGNED (arg1_type)
12582                      /* We will flip the signedness of the comparison operator
12583                         associated with the mode of arg1, so the sign bit is
12584                         specified by this mode.  Check that arg1 is the signed
12585                         max associated with this sign bit.  */
12586                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12587                      /* signed_type does not work on pointer types.  */
12588                      && INTEGRAL_TYPE_P (arg1_type))
12589               {
12590                 /* The following case also applies to X < signed_max+1
12591                    and X >= signed_max+1 because previous transformations.  */
12592                 if (code == LE_EXPR || code == GT_EXPR)
12593                   {
12594                     tree st;
12595                     st = signed_type_for (TREE_TYPE (arg1));
12596                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12597                                         type, fold_convert (st, arg0),
12598                                         build_int_cst (st, 0));
12599                   }
12600               }
12601           }
12602       }
12603
12604       /* If we are comparing an ABS_EXPR with a constant, we can
12605          convert all the cases into explicit comparisons, but they may
12606          well not be faster than doing the ABS and one comparison.
12607          But ABS (X) <= C is a range comparison, which becomes a subtraction
12608          and a comparison, and is probably faster.  */
12609       if (code == LE_EXPR
12610           && TREE_CODE (arg1) == INTEGER_CST
12611           && TREE_CODE (arg0) == ABS_EXPR
12612           && ! TREE_SIDE_EFFECTS (arg0)
12613           && (0 != (tem = negate_expr (arg1)))
12614           && TREE_CODE (tem) == INTEGER_CST
12615           && !TREE_OVERFLOW (tem))
12616         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12617                             build2 (GE_EXPR, type,
12618                                     TREE_OPERAND (arg0, 0), tem),
12619                             build2 (LE_EXPR, type,
12620                                     TREE_OPERAND (arg0, 0), arg1));
12621
12622       /* Convert ABS_EXPR<x> >= 0 to true.  */
12623       strict_overflow_p = false;
12624       if (code == GE_EXPR
12625           && (integer_zerop (arg1)
12626               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12627                   && real_zerop (arg1)))
12628           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12629         {
12630           if (strict_overflow_p)
12631             fold_overflow_warning (("assuming signed overflow does not occur "
12632                                     "when simplifying comparison of "
12633                                     "absolute value and zero"),
12634                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12635           return omit_one_operand (type, integer_one_node, arg0);
12636         }
12637
12638       /* Convert ABS_EXPR<x> < 0 to false.  */
12639       strict_overflow_p = false;
12640       if (code == LT_EXPR
12641           && (integer_zerop (arg1) || real_zerop (arg1))
12642           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12643         {
12644           if (strict_overflow_p)
12645             fold_overflow_warning (("assuming signed overflow does not occur "
12646                                     "when simplifying comparison of "
12647                                     "absolute value and zero"),
12648                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12649           return omit_one_operand (type, integer_zero_node, arg0);
12650         }
12651
12652       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12653          and similarly for >= into !=.  */
12654       if ((code == LT_EXPR || code == GE_EXPR)
12655           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12656           && TREE_CODE (arg1) == LSHIFT_EXPR
12657           && integer_onep (TREE_OPERAND (arg1, 0)))
12658         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12659                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12660                                TREE_OPERAND (arg1, 1)),
12661                        build_int_cst (TREE_TYPE (arg0), 0));
12662
12663       if ((code == LT_EXPR || code == GE_EXPR)
12664           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12665           && (TREE_CODE (arg1) == NOP_EXPR
12666               || TREE_CODE (arg1) == CONVERT_EXPR)
12667           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12668           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12669         return
12670           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12671                   fold_convert (TREE_TYPE (arg0),
12672                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12673                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12674                                                       1))),
12675                   build_int_cst (TREE_TYPE (arg0), 0));
12676
12677       return NULL_TREE;
12678
12679     case UNORDERED_EXPR:
12680     case ORDERED_EXPR:
12681     case UNLT_EXPR:
12682     case UNLE_EXPR:
12683     case UNGT_EXPR:
12684     case UNGE_EXPR:
12685     case UNEQ_EXPR:
12686     case LTGT_EXPR:
12687       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12688         {
12689           t1 = fold_relational_const (code, type, arg0, arg1);
12690           if (t1 != NULL_TREE)
12691             return t1;
12692         }
12693
12694       /* If the first operand is NaN, the result is constant.  */
12695       if (TREE_CODE (arg0) == REAL_CST
12696           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12697           && (code != LTGT_EXPR || ! flag_trapping_math))
12698         {
12699           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12700                ? integer_zero_node
12701                : integer_one_node;
12702           return omit_one_operand (type, t1, arg1);
12703         }
12704
12705       /* If the second operand is NaN, the result is constant.  */
12706       if (TREE_CODE (arg1) == REAL_CST
12707           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12708           && (code != LTGT_EXPR || ! flag_trapping_math))
12709         {
12710           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12711                ? integer_zero_node
12712                : integer_one_node;
12713           return omit_one_operand (type, t1, arg0);
12714         }
12715
12716       /* Simplify unordered comparison of something with itself.  */
12717       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12718           && operand_equal_p (arg0, arg1, 0))
12719         return constant_boolean_node (1, type);
12720
12721       if (code == LTGT_EXPR
12722           && !flag_trapping_math
12723           && operand_equal_p (arg0, arg1, 0))
12724         return constant_boolean_node (0, type);
12725
12726       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12727       {
12728         tree targ0 = strip_float_extensions (arg0);
12729         tree targ1 = strip_float_extensions (arg1);
12730         tree newtype = TREE_TYPE (targ0);
12731
12732         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12733           newtype = TREE_TYPE (targ1);
12734
12735         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12736           return fold_build2 (code, type, fold_convert (newtype, targ0),
12737                               fold_convert (newtype, targ1));
12738       }
12739
12740       return NULL_TREE;
12741
12742     case COMPOUND_EXPR:
12743       /* When pedantic, a compound expression can be neither an lvalue
12744          nor an integer constant expression.  */
12745       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12746         return NULL_TREE;
12747       /* Don't let (0, 0) be null pointer constant.  */
12748       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12749                                  : fold_convert (type, arg1);
12750       return pedantic_non_lvalue (tem);
12751
12752     case COMPLEX_EXPR:
12753       if ((TREE_CODE (arg0) == REAL_CST
12754            && TREE_CODE (arg1) == REAL_CST)
12755           || (TREE_CODE (arg0) == INTEGER_CST
12756               && TREE_CODE (arg1) == INTEGER_CST))
12757         return build_complex (type, arg0, arg1);
12758       return NULL_TREE;
12759
12760     case ASSERT_EXPR:
12761       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12762       gcc_unreachable ();
12763
12764     default:
12765       return NULL_TREE;
12766     } /* switch (code) */
12767 }
12768
12769 /* Callback for walk_tree, looking for LABEL_EXPR.
12770    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12771    Do not check the sub-tree of GOTO_EXPR.  */
12772
12773 static tree
12774 contains_label_1 (tree *tp,
12775                   int *walk_subtrees,
12776                   void *data ATTRIBUTE_UNUSED)
12777 {
12778   switch (TREE_CODE (*tp))
12779     {
12780     case LABEL_EXPR:
12781       return *tp;
12782     case GOTO_EXPR:
12783       *walk_subtrees = 0;
12784     /* no break */
12785     default:
12786       return NULL_TREE;
12787     }
12788 }
12789
12790 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12791    accessible from outside the sub-tree. Returns NULL_TREE if no
12792    addressable label is found.  */
12793
12794 static bool
12795 contains_label_p (tree st)
12796 {
12797   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12798 }
12799
12800 /* Fold a ternary expression of code CODE and type TYPE with operands
12801    OP0, OP1, and OP2.  Return the folded expression if folding is
12802    successful.  Otherwise, return NULL_TREE.  */
12803
12804 tree
12805 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12806 {
12807   tree tem;
12808   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12809   enum tree_code_class kind = TREE_CODE_CLASS (code);
12810
12811   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12812               && TREE_CODE_LENGTH (code) == 3);
12813
12814   /* Strip any conversions that don't change the mode.  This is safe
12815      for every expression, except for a comparison expression because
12816      its signedness is derived from its operands.  So, in the latter
12817      case, only strip conversions that don't change the signedness.
12818
12819      Note that this is done as an internal manipulation within the
12820      constant folder, in order to find the simplest representation of
12821      the arguments so that their form can be studied.  In any cases,
12822      the appropriate type conversions should be put back in the tree
12823      that will get out of the constant folder.  */
12824   if (op0)
12825     {
12826       arg0 = op0;
12827       STRIP_NOPS (arg0);
12828     }
12829
12830   if (op1)
12831     {
12832       arg1 = op1;
12833       STRIP_NOPS (arg1);
12834     }
12835
12836   switch (code)
12837     {
12838     case COMPONENT_REF:
12839       if (TREE_CODE (arg0) == CONSTRUCTOR
12840           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12841         {
12842           unsigned HOST_WIDE_INT idx;
12843           tree field, value;
12844           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12845             if (field == arg1)
12846               return value;
12847         }
12848       return NULL_TREE;
12849
12850     case COND_EXPR:
12851       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12852          so all simple results must be passed through pedantic_non_lvalue.  */
12853       if (TREE_CODE (arg0) == INTEGER_CST)
12854         {
12855           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12856           tem = integer_zerop (arg0) ? op2 : op1;
12857           /* Only optimize constant conditions when the selected branch
12858              has the same type as the COND_EXPR.  This avoids optimizing
12859              away "c ? x : throw", where the throw has a void type.
12860              Avoid throwing away that operand which contains label.  */
12861           if ((!TREE_SIDE_EFFECTS (unused_op)
12862                || !contains_label_p (unused_op))
12863               && (! VOID_TYPE_P (TREE_TYPE (tem))
12864                   || VOID_TYPE_P (type)))
12865             return pedantic_non_lvalue (tem);
12866           return NULL_TREE;
12867         }
12868       if (operand_equal_p (arg1, op2, 0))
12869         return pedantic_omit_one_operand (type, arg1, arg0);
12870
12871       /* If we have A op B ? A : C, we may be able to convert this to a
12872          simpler expression, depending on the operation and the values
12873          of B and C.  Signed zeros prevent all of these transformations,
12874          for reasons given above each one.
12875
12876          Also try swapping the arguments and inverting the conditional.  */
12877       if (COMPARISON_CLASS_P (arg0)
12878           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12879                                              arg1, TREE_OPERAND (arg0, 1))
12880           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12881         {
12882           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12883           if (tem)
12884             return tem;
12885         }
12886
12887       if (COMPARISON_CLASS_P (arg0)
12888           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12889                                              op2,
12890                                              TREE_OPERAND (arg0, 1))
12891           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12892         {
12893           tem = fold_truth_not_expr (arg0);
12894           if (tem && COMPARISON_CLASS_P (tem))
12895             {
12896               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12897               if (tem)
12898                 return tem;
12899             }
12900         }
12901
12902       /* If the second operand is simpler than the third, swap them
12903          since that produces better jump optimization results.  */
12904       if (truth_value_p (TREE_CODE (arg0))
12905           && tree_swap_operands_p (op1, op2, false))
12906         {
12907           /* See if this can be inverted.  If it can't, possibly because
12908              it was a floating-point inequality comparison, don't do
12909              anything.  */
12910           tem = fold_truth_not_expr (arg0);
12911           if (tem)
12912             return fold_build3 (code, type, tem, op2, op1);
12913         }
12914
12915       /* Convert A ? 1 : 0 to simply A.  */
12916       if (integer_onep (op1)
12917           && integer_zerop (op2)
12918           /* If we try to convert OP0 to our type, the
12919              call to fold will try to move the conversion inside
12920              a COND, which will recurse.  In that case, the COND_EXPR
12921              is probably the best choice, so leave it alone.  */
12922           && type == TREE_TYPE (arg0))
12923         return pedantic_non_lvalue (arg0);
12924
12925       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12926          over COND_EXPR in cases such as floating point comparisons.  */
12927       if (integer_zerop (op1)
12928           && integer_onep (op2)
12929           && truth_value_p (TREE_CODE (arg0)))
12930         return pedantic_non_lvalue (fold_convert (type,
12931                                                   invert_truthvalue (arg0)));
12932
12933       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12934       if (TREE_CODE (arg0) == LT_EXPR
12935           && integer_zerop (TREE_OPERAND (arg0, 1))
12936           && integer_zerop (op2)
12937           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12938         {
12939           /* sign_bit_p only checks ARG1 bits within A's precision.
12940              If <sign bit of A> has wider type than A, bits outside
12941              of A's precision in <sign bit of A> need to be checked.
12942              If they are all 0, this optimization needs to be done
12943              in unsigned A's type, if they are all 1 in signed A's type,
12944              otherwise this can't be done.  */
12945           if (TYPE_PRECISION (TREE_TYPE (tem))
12946               < TYPE_PRECISION (TREE_TYPE (arg1))
12947               && TYPE_PRECISION (TREE_TYPE (tem))
12948                  < TYPE_PRECISION (type))
12949             {
12950               unsigned HOST_WIDE_INT mask_lo;
12951               HOST_WIDE_INT mask_hi;
12952               int inner_width, outer_width;
12953               tree tem_type;
12954
12955               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12956               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12957               if (outer_width > TYPE_PRECISION (type))
12958                 outer_width = TYPE_PRECISION (type);
12959
12960               if (outer_width > HOST_BITS_PER_WIDE_INT)
12961                 {
12962                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12963                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12964                   mask_lo = -1;
12965                 }
12966               else
12967                 {
12968                   mask_hi = 0;
12969                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12970                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12971                 }
12972               if (inner_width > HOST_BITS_PER_WIDE_INT)
12973                 {
12974                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12975                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12976                   mask_lo = 0;
12977                 }
12978               else
12979                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12980                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12981
12982               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12983                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12984                 {
12985                   tem_type = signed_type_for (TREE_TYPE (tem));
12986                   tem = fold_convert (tem_type, tem);
12987                 }
12988               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12989                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12990                 {
12991                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12992                   tem = fold_convert (tem_type, tem);
12993                 }
12994               else
12995                 tem = NULL;
12996             }
12997
12998           if (tem)
12999             return fold_convert (type,
13000                                  fold_build2 (BIT_AND_EXPR,
13001                                               TREE_TYPE (tem), tem,
13002                                               fold_convert (TREE_TYPE (tem),
13003                                                             arg1)));
13004         }
13005
13006       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13007          already handled above.  */
13008       if (TREE_CODE (arg0) == BIT_AND_EXPR
13009           && integer_onep (TREE_OPERAND (arg0, 1))
13010           && integer_zerop (op2)
13011           && integer_pow2p (arg1))
13012         {
13013           tree tem = TREE_OPERAND (arg0, 0);
13014           STRIP_NOPS (tem);
13015           if (TREE_CODE (tem) == RSHIFT_EXPR
13016               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13017               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13018                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13019             return fold_build2 (BIT_AND_EXPR, type,
13020                                 TREE_OPERAND (tem, 0), arg1);
13021         }
13022
13023       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13024          is probably obsolete because the first operand should be a
13025          truth value (that's why we have the two cases above), but let's
13026          leave it in until we can confirm this for all front-ends.  */
13027       if (integer_zerop (op2)
13028           && TREE_CODE (arg0) == NE_EXPR
13029           && integer_zerop (TREE_OPERAND (arg0, 1))
13030           && integer_pow2p (arg1)
13031           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13032           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13033                               arg1, OEP_ONLY_CONST))
13034         return pedantic_non_lvalue (fold_convert (type,
13035                                                   TREE_OPERAND (arg0, 0)));
13036
13037       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13038       if (integer_zerop (op2)
13039           && truth_value_p (TREE_CODE (arg0))
13040           && truth_value_p (TREE_CODE (arg1)))
13041         return fold_build2 (TRUTH_ANDIF_EXPR, type,
13042                             fold_convert (type, arg0),
13043                             arg1);
13044
13045       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13046       if (integer_onep (op2)
13047           && truth_value_p (TREE_CODE (arg0))
13048           && truth_value_p (TREE_CODE (arg1)))
13049         {
13050           /* Only perform transformation if ARG0 is easily inverted.  */
13051           tem = fold_truth_not_expr (arg0);
13052           if (tem)
13053             return fold_build2 (TRUTH_ORIF_EXPR, type,
13054                                 fold_convert (type, tem),
13055                                 arg1);
13056         }
13057
13058       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13059       if (integer_zerop (arg1)
13060           && truth_value_p (TREE_CODE (arg0))
13061           && truth_value_p (TREE_CODE (op2)))
13062         {
13063           /* Only perform transformation if ARG0 is easily inverted.  */
13064           tem = fold_truth_not_expr (arg0);
13065           if (tem)
13066             return fold_build2 (TRUTH_ANDIF_EXPR, type,
13067                                 fold_convert (type, tem),
13068                                 op2);
13069         }
13070
13071       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13072       if (integer_onep (arg1)
13073           && truth_value_p (TREE_CODE (arg0))
13074           && truth_value_p (TREE_CODE (op2)))
13075         return fold_build2 (TRUTH_ORIF_EXPR, type,
13076                             fold_convert (type, arg0),
13077                             op2);
13078
13079       return NULL_TREE;
13080
13081     case CALL_EXPR:
13082       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13083          of fold_ternary on them.  */
13084       gcc_unreachable ();
13085
13086     case BIT_FIELD_REF:
13087       if ((TREE_CODE (arg0) == VECTOR_CST
13088            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
13089           && type == TREE_TYPE (TREE_TYPE (arg0)))
13090         {
13091           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
13092           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
13093
13094           if (width != 0
13095               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
13096               && (idx % width) == 0
13097               && (idx = idx / width)
13098                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
13099             {
13100               tree elements = NULL_TREE;
13101
13102               if (TREE_CODE (arg0) == VECTOR_CST)
13103                 elements = TREE_VECTOR_CST_ELTS (arg0);
13104               else
13105                 {
13106                   unsigned HOST_WIDE_INT idx;
13107                   tree value;
13108
13109                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
13110                     elements = tree_cons (NULL_TREE, value, elements);
13111                 }
13112               while (idx-- > 0 && elements)
13113                 elements = TREE_CHAIN (elements);
13114               if (elements)
13115                 return TREE_VALUE (elements);
13116               else
13117                 return fold_convert (type, integer_zero_node);
13118             }
13119         }
13120       return NULL_TREE;
13121
13122     default:
13123       return NULL_TREE;
13124     } /* switch (code) */
13125 }
13126
13127 /* Perform constant folding and related simplification of EXPR.
13128    The related simplifications include x*1 => x, x*0 => 0, etc.,
13129    and application of the associative law.
13130    NOP_EXPR conversions may be removed freely (as long as we
13131    are careful not to change the type of the overall expression).
13132    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13133    but we can constant-fold them if they have constant operands.  */
13134
13135 #ifdef ENABLE_FOLD_CHECKING
13136 # define fold(x) fold_1 (x)
13137 static tree fold_1 (tree);
13138 static
13139 #endif
13140 tree
13141 fold (tree expr)
13142 {
13143   const tree t = expr;
13144   enum tree_code code = TREE_CODE (t);
13145   enum tree_code_class kind = TREE_CODE_CLASS (code);
13146   tree tem;
13147
13148   /* Return right away if a constant.  */
13149   if (kind == tcc_constant)
13150     return t;
13151
13152   /* CALL_EXPR-like objects with variable numbers of operands are
13153      treated specially.  */
13154   if (kind == tcc_vl_exp)
13155     {
13156       if (code == CALL_EXPR)
13157         {
13158           tem = fold_call_expr (expr, false);
13159           return tem ? tem : expr;
13160         }
13161       return expr;
13162     }
13163
13164   if (IS_EXPR_CODE_CLASS (kind)
13165       || IS_GIMPLE_STMT_CODE_CLASS (kind))
13166     {
13167       tree type = TREE_TYPE (t);
13168       tree op0, op1, op2;
13169
13170       switch (TREE_CODE_LENGTH (code))
13171         {
13172         case 1:
13173           op0 = TREE_OPERAND (t, 0);
13174           tem = fold_unary (code, type, op0);
13175           return tem ? tem : expr;
13176         case 2:
13177           op0 = TREE_OPERAND (t, 0);
13178           op1 = TREE_OPERAND (t, 1);
13179           tem = fold_binary (code, type, op0, op1);
13180           return tem ? tem : expr;
13181         case 3:
13182           op0 = TREE_OPERAND (t, 0);
13183           op1 = TREE_OPERAND (t, 1);
13184           op2 = TREE_OPERAND (t, 2);
13185           tem = fold_ternary (code, type, op0, op1, op2);
13186           return tem ? tem : expr;
13187         default:
13188           break;
13189         }
13190     }
13191
13192   switch (code)
13193     {
13194     case ARRAY_REF:
13195       {
13196         tree op0 = TREE_OPERAND (t, 0);
13197         tree op1 = TREE_OPERAND (t, 1);
13198
13199         if (TREE_CODE (op1) == INTEGER_CST
13200             && TREE_CODE (op0) == CONSTRUCTOR
13201             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
13202           {
13203             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
13204             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
13205             unsigned HOST_WIDE_INT begin = 0;
13206
13207             /* Find a matching index by means of a binary search.  */
13208             while (begin != end)
13209               {
13210                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
13211                 tree index = VEC_index (constructor_elt, elts, middle)->index;
13212
13213                 if (TREE_CODE (index) == INTEGER_CST
13214                     && tree_int_cst_lt (index, op1))
13215                   begin = middle + 1;
13216                 else if (TREE_CODE (index) == INTEGER_CST
13217                          && tree_int_cst_lt (op1, index))
13218                   end = middle;
13219                 else if (TREE_CODE (index) == RANGE_EXPR
13220                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
13221                   begin = middle + 1;
13222                 else if (TREE_CODE (index) == RANGE_EXPR
13223                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
13224                   end = middle;
13225                 else
13226                   return VEC_index (constructor_elt, elts, middle)->value;
13227               }
13228           }
13229
13230         return t;
13231       }
13232
13233     case CONST_DECL:
13234       return fold (DECL_INITIAL (t));
13235
13236     default:
13237       return t;
13238     } /* switch (code) */
13239 }
13240
13241 #ifdef ENABLE_FOLD_CHECKING
13242 #undef fold
13243
13244 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13245 static void fold_check_failed (const_tree, const_tree);
13246 void print_fold_checksum (const_tree);
13247
13248 /* When --enable-checking=fold, compute a digest of expr before
13249    and after actual fold call to see if fold did not accidentally
13250    change original expr.  */
13251
13252 tree
13253 fold (tree expr)
13254 {
13255   tree ret;
13256   struct md5_ctx ctx;
13257   unsigned char checksum_before[16], checksum_after[16];
13258   htab_t ht;
13259
13260   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13261   md5_init_ctx (&ctx);
13262   fold_checksum_tree (expr, &ctx, ht);
13263   md5_finish_ctx (&ctx, checksum_before);
13264   htab_empty (ht);
13265
13266   ret = fold_1 (expr);
13267
13268   md5_init_ctx (&ctx);
13269   fold_checksum_tree (expr, &ctx, ht);
13270   md5_finish_ctx (&ctx, checksum_after);
13271   htab_delete (ht);
13272
13273   if (memcmp (checksum_before, checksum_after, 16))
13274     fold_check_failed (expr, ret);
13275
13276   return ret;
13277 }
13278
13279 void
13280 print_fold_checksum (const_tree expr)
13281 {
13282   struct md5_ctx ctx;
13283   unsigned char checksum[16], cnt;
13284   htab_t ht;
13285
13286   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13287   md5_init_ctx (&ctx);
13288   fold_checksum_tree (expr, &ctx, ht);
13289   md5_finish_ctx (&ctx, checksum);
13290   htab_delete (ht);
13291   for (cnt = 0; cnt < 16; ++cnt)
13292     fprintf (stderr, "%02x", checksum[cnt]);
13293   putc ('\n', stderr);
13294 }
13295
13296 static void
13297 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13298 {
13299   internal_error ("fold check: original tree changed by fold");
13300 }
13301
13302 static void
13303 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13304 {
13305   const void **slot;
13306   enum tree_code code;
13307   struct tree_function_decl buf;
13308   int i, len;
13309   
13310 recursive_label:
13311
13312   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13313                <= sizeof (struct tree_function_decl))
13314               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13315   if (expr == NULL)
13316     return;
13317   slot = (const void **) htab_find_slot (ht, expr, INSERT);
13318   if (*slot != NULL)
13319     return;
13320   *slot = expr;
13321   code = TREE_CODE (expr);
13322   if (TREE_CODE_CLASS (code) == tcc_declaration
13323       && DECL_ASSEMBLER_NAME_SET_P (expr))
13324     {
13325       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
13326       memcpy ((char *) &buf, expr, tree_size (expr));
13327       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13328       expr = (tree) &buf;
13329     }
13330   else if (TREE_CODE_CLASS (code) == tcc_type
13331            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
13332                || TYPE_CACHED_VALUES_P (expr)
13333                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
13334     {
13335       /* Allow these fields to be modified.  */
13336       tree tmp;
13337       memcpy ((char *) &buf, expr, tree_size (expr));
13338       expr = tmp = (tree) &buf;
13339       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13340       TYPE_POINTER_TO (tmp) = NULL;
13341       TYPE_REFERENCE_TO (tmp) = NULL;
13342       if (TYPE_CACHED_VALUES_P (tmp))
13343         {
13344           TYPE_CACHED_VALUES_P (tmp) = 0;
13345           TYPE_CACHED_VALUES (tmp) = NULL;
13346         }
13347     }
13348   md5_process_bytes (expr, tree_size (expr), ctx);
13349   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13350   if (TREE_CODE_CLASS (code) != tcc_type
13351       && TREE_CODE_CLASS (code) != tcc_declaration
13352       && code != TREE_LIST
13353       && code != SSA_NAME)
13354     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13355   switch (TREE_CODE_CLASS (code))
13356     {
13357     case tcc_constant:
13358       switch (code)
13359         {
13360         case STRING_CST:
13361           md5_process_bytes (TREE_STRING_POINTER (expr),
13362                              TREE_STRING_LENGTH (expr), ctx);
13363           break;
13364         case COMPLEX_CST:
13365           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13366           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13367           break;
13368         case VECTOR_CST:
13369           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13370           break;
13371         default:
13372           break;
13373         }
13374       break;
13375     case tcc_exceptional:
13376       switch (code)
13377         {
13378         case TREE_LIST:
13379           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13380           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13381           expr = TREE_CHAIN (expr);
13382           goto recursive_label;
13383           break;
13384         case TREE_VEC:
13385           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13386             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13387           break;
13388         default:
13389           break;
13390         }
13391       break;
13392     case tcc_expression:
13393     case tcc_reference:
13394     case tcc_comparison:
13395     case tcc_unary:
13396     case tcc_binary:
13397     case tcc_statement:
13398     case tcc_vl_exp:
13399       len = TREE_OPERAND_LENGTH (expr);
13400       for (i = 0; i < len; ++i)
13401         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13402       break;
13403     case tcc_declaration:
13404       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13405       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13406       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13407         {
13408           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13409           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13410           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13411           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13412           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13413         }
13414       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13415         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13416           
13417       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13418         {
13419           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13420           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13421           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13422         }
13423       break;
13424     case tcc_type:
13425       if (TREE_CODE (expr) == ENUMERAL_TYPE)
13426         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13427       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13428       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13429       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13430       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13431       if (INTEGRAL_TYPE_P (expr)
13432           || SCALAR_FLOAT_TYPE_P (expr))
13433         {
13434           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13435           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13436         }
13437       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13438       if (TREE_CODE (expr) == RECORD_TYPE
13439           || TREE_CODE (expr) == UNION_TYPE
13440           || TREE_CODE (expr) == QUAL_UNION_TYPE)
13441         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13442       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13443       break;
13444     default:
13445       break;
13446     }
13447 }
13448
13449 /* Helper function for outputting the checksum of a tree T.  When
13450    debugging with gdb, you can "define mynext" to be "next" followed
13451    by "call debug_fold_checksum (op0)", then just trace down till the
13452    outputs differ.  */
13453
13454 void
13455 debug_fold_checksum (const_tree t)
13456 {
13457   int i;
13458   unsigned char checksum[16];
13459   struct md5_ctx ctx;
13460   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13461   
13462   md5_init_ctx (&ctx);
13463   fold_checksum_tree (t, &ctx, ht);
13464   md5_finish_ctx (&ctx, checksum);
13465   htab_empty (ht);
13466
13467   for (i = 0; i < 16; i++)
13468     fprintf (stderr, "%d ", checksum[i]);
13469
13470   fprintf (stderr, "\n");
13471 }
13472
13473 #endif
13474
13475 /* Fold a unary tree expression with code CODE of type TYPE with an
13476    operand OP0.  Return a folded expression if successful.  Otherwise,
13477    return a tree expression with code CODE of type TYPE with an
13478    operand OP0.  */
13479
13480 tree
13481 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13482 {
13483   tree tem;
13484 #ifdef ENABLE_FOLD_CHECKING
13485   unsigned char checksum_before[16], checksum_after[16];
13486   struct md5_ctx ctx;
13487   htab_t ht;
13488
13489   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13490   md5_init_ctx (&ctx);
13491   fold_checksum_tree (op0, &ctx, ht);
13492   md5_finish_ctx (&ctx, checksum_before);
13493   htab_empty (ht);
13494 #endif
13495   
13496   tem = fold_unary (code, type, op0);
13497   if (!tem)
13498     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13499   
13500 #ifdef ENABLE_FOLD_CHECKING
13501   md5_init_ctx (&ctx);
13502   fold_checksum_tree (op0, &ctx, ht);
13503   md5_finish_ctx (&ctx, checksum_after);
13504   htab_delete (ht);
13505
13506   if (memcmp (checksum_before, checksum_after, 16))
13507     fold_check_failed (op0, tem);
13508 #endif
13509   return tem;
13510 }
13511
13512 /* Fold a binary tree expression with code CODE of type TYPE with
13513    operands OP0 and OP1.  Return a folded expression if successful.
13514    Otherwise, return a tree expression with code CODE of type TYPE
13515    with operands OP0 and OP1.  */
13516
13517 tree
13518 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13519                   MEM_STAT_DECL)
13520 {
13521   tree tem;
13522 #ifdef ENABLE_FOLD_CHECKING
13523   unsigned char checksum_before_op0[16],
13524                 checksum_before_op1[16],
13525                 checksum_after_op0[16],
13526                 checksum_after_op1[16];
13527   struct md5_ctx ctx;
13528   htab_t ht;
13529
13530   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13531   md5_init_ctx (&ctx);
13532   fold_checksum_tree (op0, &ctx, ht);
13533   md5_finish_ctx (&ctx, checksum_before_op0);
13534   htab_empty (ht);
13535
13536   md5_init_ctx (&ctx);
13537   fold_checksum_tree (op1, &ctx, ht);
13538   md5_finish_ctx (&ctx, checksum_before_op1);
13539   htab_empty (ht);
13540 #endif
13541
13542   tem = fold_binary (code, type, op0, op1);
13543   if (!tem)
13544     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13545   
13546 #ifdef ENABLE_FOLD_CHECKING
13547   md5_init_ctx (&ctx);
13548   fold_checksum_tree (op0, &ctx, ht);
13549   md5_finish_ctx (&ctx, checksum_after_op0);
13550   htab_empty (ht);
13551
13552   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13553     fold_check_failed (op0, tem);
13554   
13555   md5_init_ctx (&ctx);
13556   fold_checksum_tree (op1, &ctx, ht);
13557   md5_finish_ctx (&ctx, checksum_after_op1);
13558   htab_delete (ht);
13559
13560   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13561     fold_check_failed (op1, tem);
13562 #endif
13563   return tem;
13564 }
13565
13566 /* Fold a ternary tree expression with code CODE of type TYPE with
13567    operands OP0, OP1, and OP2.  Return a folded expression if
13568    successful.  Otherwise, return a tree expression with code CODE of
13569    type TYPE with operands OP0, OP1, and OP2.  */
13570
13571 tree
13572 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
13573              MEM_STAT_DECL)
13574 {
13575   tree tem;
13576 #ifdef ENABLE_FOLD_CHECKING
13577   unsigned char checksum_before_op0[16],
13578                 checksum_before_op1[16],
13579                 checksum_before_op2[16],
13580                 checksum_after_op0[16],
13581                 checksum_after_op1[16],
13582                 checksum_after_op2[16];
13583   struct md5_ctx ctx;
13584   htab_t ht;
13585
13586   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13587   md5_init_ctx (&ctx);
13588   fold_checksum_tree (op0, &ctx, ht);
13589   md5_finish_ctx (&ctx, checksum_before_op0);
13590   htab_empty (ht);
13591
13592   md5_init_ctx (&ctx);
13593   fold_checksum_tree (op1, &ctx, ht);
13594   md5_finish_ctx (&ctx, checksum_before_op1);
13595   htab_empty (ht);
13596
13597   md5_init_ctx (&ctx);
13598   fold_checksum_tree (op2, &ctx, ht);
13599   md5_finish_ctx (&ctx, checksum_before_op2);
13600   htab_empty (ht);
13601 #endif
13602
13603   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
13604   tem = fold_ternary (code, type, op0, op1, op2);
13605   if (!tem)
13606     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
13607       
13608 #ifdef ENABLE_FOLD_CHECKING
13609   md5_init_ctx (&ctx);
13610   fold_checksum_tree (op0, &ctx, ht);
13611   md5_finish_ctx (&ctx, checksum_after_op0);
13612   htab_empty (ht);
13613
13614   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13615     fold_check_failed (op0, tem);
13616   
13617   md5_init_ctx (&ctx);
13618   fold_checksum_tree (op1, &ctx, ht);
13619   md5_finish_ctx (&ctx, checksum_after_op1);
13620   htab_empty (ht);
13621
13622   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13623     fold_check_failed (op1, tem);
13624   
13625   md5_init_ctx (&ctx);
13626   fold_checksum_tree (op2, &ctx, ht);
13627   md5_finish_ctx (&ctx, checksum_after_op2);
13628   htab_delete (ht);
13629
13630   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
13631     fold_check_failed (op2, tem);
13632 #endif
13633   return tem;
13634 }
13635
13636 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
13637    arguments in ARGARRAY, and a null static chain.
13638    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
13639    of type TYPE from the given operands as constructed by build_call_array.  */
13640
13641 tree
13642 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
13643 {
13644   tree tem;
13645 #ifdef ENABLE_FOLD_CHECKING
13646   unsigned char checksum_before_fn[16],
13647                 checksum_before_arglist[16],
13648                 checksum_after_fn[16],
13649                 checksum_after_arglist[16];
13650   struct md5_ctx ctx;
13651   htab_t ht;
13652   int i;
13653
13654   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13655   md5_init_ctx (&ctx);
13656   fold_checksum_tree (fn, &ctx, ht);
13657   md5_finish_ctx (&ctx, checksum_before_fn);
13658   htab_empty (ht);
13659
13660   md5_init_ctx (&ctx);
13661   for (i = 0; i < nargs; i++)
13662     fold_checksum_tree (argarray[i], &ctx, ht);
13663   md5_finish_ctx (&ctx, checksum_before_arglist);
13664   htab_empty (ht);
13665 #endif
13666
13667   tem = fold_builtin_call_array (type, fn, nargs, argarray);
13668       
13669 #ifdef ENABLE_FOLD_CHECKING
13670   md5_init_ctx (&ctx);
13671   fold_checksum_tree (fn, &ctx, ht);
13672   md5_finish_ctx (&ctx, checksum_after_fn);
13673   htab_empty (ht);
13674
13675   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13676     fold_check_failed (fn, tem);
13677   
13678   md5_init_ctx (&ctx);
13679   for (i = 0; i < nargs; i++)
13680     fold_checksum_tree (argarray[i], &ctx, ht);
13681   md5_finish_ctx (&ctx, checksum_after_arglist);
13682   htab_delete (ht);
13683
13684   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13685     fold_check_failed (NULL_TREE, tem);
13686 #endif
13687   return tem;
13688 }
13689
13690 /* Perform constant folding and related simplification of initializer
13691    expression EXPR.  These behave identically to "fold_buildN" but ignore
13692    potential run-time traps and exceptions that fold must preserve.  */
13693
13694 #define START_FOLD_INIT \
13695   int saved_signaling_nans = flag_signaling_nans;\
13696   int saved_trapping_math = flag_trapping_math;\
13697   int saved_rounding_math = flag_rounding_math;\
13698   int saved_trapv = flag_trapv;\
13699   int saved_folding_initializer = folding_initializer;\
13700   flag_signaling_nans = 0;\
13701   flag_trapping_math = 0;\
13702   flag_rounding_math = 0;\
13703   flag_trapv = 0;\
13704   folding_initializer = 1;
13705
13706 #define END_FOLD_INIT \
13707   flag_signaling_nans = saved_signaling_nans;\
13708   flag_trapping_math = saved_trapping_math;\
13709   flag_rounding_math = saved_rounding_math;\
13710   flag_trapv = saved_trapv;\
13711   folding_initializer = saved_folding_initializer;
13712
13713 tree
13714 fold_build1_initializer (enum tree_code code, tree type, tree op)
13715 {
13716   tree result;
13717   START_FOLD_INIT;
13718
13719   result = fold_build1 (code, type, op);
13720
13721   END_FOLD_INIT;
13722   return result;
13723 }
13724
13725 tree
13726 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13727 {
13728   tree result;
13729   START_FOLD_INIT;
13730
13731   result = fold_build2 (code, type, op0, op1);
13732
13733   END_FOLD_INIT;
13734   return result;
13735 }
13736
13737 tree
13738 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13739                          tree op2)
13740 {
13741   tree result;
13742   START_FOLD_INIT;
13743
13744   result = fold_build3 (code, type, op0, op1, op2);
13745
13746   END_FOLD_INIT;
13747   return result;
13748 }
13749
13750 tree
13751 fold_build_call_array_initializer (tree type, tree fn,
13752                                    int nargs, tree *argarray)
13753 {
13754   tree result;
13755   START_FOLD_INIT;
13756
13757   result = fold_build_call_array (type, fn, nargs, argarray);
13758
13759   END_FOLD_INIT;
13760   return result;
13761 }
13762
13763 #undef START_FOLD_INIT
13764 #undef END_FOLD_INIT
13765
13766 /* Determine if first argument is a multiple of second argument.  Return 0 if
13767    it is not, or we cannot easily determined it to be.
13768
13769    An example of the sort of thing we care about (at this point; this routine
13770    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13771    fold cases do now) is discovering that
13772
13773      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13774
13775    is a multiple of
13776
13777      SAVE_EXPR (J * 8)
13778
13779    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13780
13781    This code also handles discovering that
13782
13783      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13784
13785    is a multiple of 8 so we don't have to worry about dealing with a
13786    possible remainder.
13787
13788    Note that we *look* inside a SAVE_EXPR only to determine how it was
13789    calculated; it is not safe for fold to do much of anything else with the
13790    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13791    at run time.  For example, the latter example above *cannot* be implemented
13792    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13793    evaluation time of the original SAVE_EXPR is not necessarily the same at
13794    the time the new expression is evaluated.  The only optimization of this
13795    sort that would be valid is changing
13796
13797      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13798
13799    divided by 8 to
13800
13801      SAVE_EXPR (I) * SAVE_EXPR (J)
13802
13803    (where the same SAVE_EXPR (J) is used in the original and the
13804    transformed version).  */
13805
13806 int
13807 multiple_of_p (tree type, const_tree top, const_tree bottom)
13808 {
13809   if (operand_equal_p (top, bottom, 0))
13810     return 1;
13811
13812   if (TREE_CODE (type) != INTEGER_TYPE)
13813     return 0;
13814
13815   switch (TREE_CODE (top))
13816     {
13817     case BIT_AND_EXPR:
13818       /* Bitwise and provides a power of two multiple.  If the mask is
13819          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13820       if (!integer_pow2p (bottom))
13821         return 0;
13822       /* FALLTHRU */
13823
13824     case MULT_EXPR:
13825       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13826               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13827
13828     case PLUS_EXPR:
13829     case MINUS_EXPR:
13830       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13831               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13832
13833     case LSHIFT_EXPR:
13834       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13835         {
13836           tree op1, t1;
13837
13838           op1 = TREE_OPERAND (top, 1);
13839           /* const_binop may not detect overflow correctly,
13840              so check for it explicitly here.  */
13841           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13842               > TREE_INT_CST_LOW (op1)
13843               && TREE_INT_CST_HIGH (op1) == 0
13844               && 0 != (t1 = fold_convert (type,
13845                                           const_binop (LSHIFT_EXPR,
13846                                                        size_one_node,
13847                                                        op1, 0)))
13848               && !TREE_OVERFLOW (t1))
13849             return multiple_of_p (type, t1, bottom);
13850         }
13851       return 0;
13852
13853     case NOP_EXPR:
13854       /* Can't handle conversions from non-integral or wider integral type.  */
13855       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13856           || (TYPE_PRECISION (type)
13857               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13858         return 0;
13859
13860       /* .. fall through ...  */
13861
13862     case SAVE_EXPR:
13863       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13864
13865     case INTEGER_CST:
13866       if (TREE_CODE (bottom) != INTEGER_CST
13867           || integer_zerop (bottom)
13868           || (TYPE_UNSIGNED (type)
13869               && (tree_int_cst_sgn (top) < 0
13870                   || tree_int_cst_sgn (bottom) < 0)))
13871         return 0;
13872       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13873                                              top, bottom, 0));
13874
13875     default:
13876       return 0;
13877     }
13878 }
13879
13880 /* Return true if CODE or TYPE is known to be non-negative. */
13881
13882 static bool
13883 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
13884 {
13885   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13886       && truth_value_p (code))
13887     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13888        have a signed:1 type (where the value is -1 and 0).  */
13889     return true;
13890   return false;
13891 }
13892
13893 /* Return true if (CODE OP0) is known to be non-negative.  If the return
13894    value is based on the assumption that signed overflow is undefined,
13895    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13896    *STRICT_OVERFLOW_P.  */
13897
13898 bool
13899 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13900                                 bool *strict_overflow_p)
13901 {
13902   if (TYPE_UNSIGNED (type))
13903     return true;
13904
13905   switch (code)
13906     {
13907     case ABS_EXPR:
13908       /* We can't return 1 if flag_wrapv is set because
13909          ABS_EXPR<INT_MIN> = INT_MIN.  */
13910       if (!INTEGRAL_TYPE_P (type))
13911         return true;
13912       if (TYPE_OVERFLOW_UNDEFINED (type))
13913         {
13914           *strict_overflow_p = true;
13915           return true;
13916         }
13917       break;
13918
13919     case NON_LVALUE_EXPR:
13920     case FLOAT_EXPR:
13921     case FIX_TRUNC_EXPR:
13922       return tree_expr_nonnegative_warnv_p (op0,
13923                                             strict_overflow_p);
13924
13925     case NOP_EXPR:
13926       {
13927         tree inner_type = TREE_TYPE (op0);
13928         tree outer_type = type;
13929
13930         if (TREE_CODE (outer_type) == REAL_TYPE)
13931           {
13932             if (TREE_CODE (inner_type) == REAL_TYPE)
13933               return tree_expr_nonnegative_warnv_p (op0,
13934                                                     strict_overflow_p);
13935             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13936               {
13937                 if (TYPE_UNSIGNED (inner_type))
13938                   return true;
13939                 return tree_expr_nonnegative_warnv_p (op0,
13940                                                       strict_overflow_p);
13941               }
13942           }
13943         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13944           {
13945             if (TREE_CODE (inner_type) == REAL_TYPE)
13946               return tree_expr_nonnegative_warnv_p (op0,
13947                                                     strict_overflow_p);
13948             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13949               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13950                       && TYPE_UNSIGNED (inner_type);
13951           }
13952       }
13953       break;
13954
13955     default:
13956       return tree_simple_nonnegative_warnv_p (code, type);
13957     }
13958
13959   /* We don't know sign of `t', so be conservative and return false.  */
13960   return false;
13961 }
13962
13963 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
13964    value is based on the assumption that signed overflow is undefined,
13965    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13966    *STRICT_OVERFLOW_P.  */
13967
13968 bool
13969 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13970                                       tree op1, bool *strict_overflow_p)
13971 {
13972   if (TYPE_UNSIGNED (type))
13973     return true;
13974
13975   switch (code)
13976     {
13977     case POINTER_PLUS_EXPR:
13978     case PLUS_EXPR:
13979       if (FLOAT_TYPE_P (type))
13980         return (tree_expr_nonnegative_warnv_p (op0,
13981                                                strict_overflow_p)
13982                 && tree_expr_nonnegative_warnv_p (op1,
13983                                                   strict_overflow_p));
13984
13985       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13986          both unsigned and at least 2 bits shorter than the result.  */
13987       if (TREE_CODE (type) == INTEGER_TYPE
13988           && TREE_CODE (op0) == NOP_EXPR
13989           && TREE_CODE (op1) == NOP_EXPR)
13990         {
13991           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13992           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13993           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13994               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13995             {
13996               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13997                                        TYPE_PRECISION (inner2)) + 1;
13998               return prec < TYPE_PRECISION (type);
13999             }
14000         }
14001       break;
14002
14003     case MULT_EXPR:
14004       if (FLOAT_TYPE_P (type))
14005         {
14006           /* x * x for floating point x is always non-negative.  */
14007           if (operand_equal_p (op0, op1, 0))
14008             return true;
14009           return (tree_expr_nonnegative_warnv_p (op0,
14010                                                  strict_overflow_p)
14011                   && tree_expr_nonnegative_warnv_p (op1,
14012                                                     strict_overflow_p));
14013         }
14014
14015       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14016          both unsigned and their total bits is shorter than the result.  */
14017       if (TREE_CODE (type) == INTEGER_TYPE
14018           && TREE_CODE (op0) == NOP_EXPR
14019           && TREE_CODE (op1) == NOP_EXPR)
14020         {
14021           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14022           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14023           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14024               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14025             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
14026                    < TYPE_PRECISION (type);
14027         }
14028       return false;
14029
14030     case BIT_AND_EXPR:
14031     case MAX_EXPR:
14032       return (tree_expr_nonnegative_warnv_p (op0,
14033                                              strict_overflow_p)
14034               || tree_expr_nonnegative_warnv_p (op1,
14035                                                 strict_overflow_p));
14036
14037     case BIT_IOR_EXPR:
14038     case BIT_XOR_EXPR:
14039     case MIN_EXPR:
14040     case RDIV_EXPR:
14041     case TRUNC_DIV_EXPR:
14042     case CEIL_DIV_EXPR:
14043     case FLOOR_DIV_EXPR:
14044     case ROUND_DIV_EXPR:
14045       return (tree_expr_nonnegative_warnv_p (op0,
14046                                              strict_overflow_p)
14047               && tree_expr_nonnegative_warnv_p (op1,
14048                                                 strict_overflow_p));
14049
14050     case TRUNC_MOD_EXPR:
14051     case CEIL_MOD_EXPR:
14052     case FLOOR_MOD_EXPR:
14053     case ROUND_MOD_EXPR:
14054       return tree_expr_nonnegative_warnv_p (op0,
14055                                             strict_overflow_p);
14056     default:
14057       return tree_simple_nonnegative_warnv_p (code, type);
14058     }
14059
14060   /* We don't know sign of `t', so be conservative and return false.  */
14061   return false;
14062 }
14063
14064 /* Return true if T is known to be non-negative.  If the return
14065    value is based on the assumption that signed overflow is undefined,
14066    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14067    *STRICT_OVERFLOW_P.  */
14068
14069 bool
14070 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14071 {
14072   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14073     return true;
14074
14075   switch (TREE_CODE (t))
14076     {
14077     case SSA_NAME:
14078       /* Query VRP to see if it has recorded any information about
14079          the range of this object.  */
14080       return ssa_name_nonnegative_p (t);
14081
14082     case INTEGER_CST:
14083       return tree_int_cst_sgn (t) >= 0;
14084
14085     case REAL_CST:
14086       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
14087
14088     case FIXED_CST:
14089       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
14090
14091     case COND_EXPR:
14092       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14093                                              strict_overflow_p)
14094               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
14095                                                 strict_overflow_p));
14096     default:
14097       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14098                                                    TREE_TYPE (t));
14099     }
14100   /* We don't know sign of `t', so be conservative and return false.  */
14101   return false;
14102 }
14103
14104 /* Return true if T is known to be non-negative.  If the return
14105    value is based on the assumption that signed overflow is undefined,
14106    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14107    *STRICT_OVERFLOW_P.  */
14108
14109 bool
14110 tree_call_nonnegative_warnv_p (enum tree_code code,  tree type, tree fndecl,
14111                                tree arg0, tree arg1, bool *strict_overflow_p)
14112 {
14113   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14114     switch (DECL_FUNCTION_CODE (fndecl))
14115       {
14116         CASE_FLT_FN (BUILT_IN_ACOS):
14117         CASE_FLT_FN (BUILT_IN_ACOSH):
14118         CASE_FLT_FN (BUILT_IN_CABS):
14119         CASE_FLT_FN (BUILT_IN_COSH):
14120         CASE_FLT_FN (BUILT_IN_ERFC):
14121         CASE_FLT_FN (BUILT_IN_EXP):
14122         CASE_FLT_FN (BUILT_IN_EXP10):
14123         CASE_FLT_FN (BUILT_IN_EXP2):
14124         CASE_FLT_FN (BUILT_IN_FABS):
14125         CASE_FLT_FN (BUILT_IN_FDIM):
14126         CASE_FLT_FN (BUILT_IN_HYPOT):
14127         CASE_FLT_FN (BUILT_IN_POW10):
14128         CASE_INT_FN (BUILT_IN_FFS):
14129         CASE_INT_FN (BUILT_IN_PARITY):
14130         CASE_INT_FN (BUILT_IN_POPCOUNT):
14131       case BUILT_IN_BSWAP32:
14132       case BUILT_IN_BSWAP64:
14133         /* Always true.  */
14134         return true;
14135
14136         CASE_FLT_FN (BUILT_IN_SQRT):
14137         /* sqrt(-0.0) is -0.0.  */
14138         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
14139           return true;
14140         return tree_expr_nonnegative_warnv_p (arg0,
14141                                               strict_overflow_p);
14142
14143         CASE_FLT_FN (BUILT_IN_ASINH):
14144         CASE_FLT_FN (BUILT_IN_ATAN):
14145         CASE_FLT_FN (BUILT_IN_ATANH):
14146         CASE_FLT_FN (BUILT_IN_CBRT):
14147         CASE_FLT_FN (BUILT_IN_CEIL):
14148         CASE_FLT_FN (BUILT_IN_ERF):
14149         CASE_FLT_FN (BUILT_IN_EXPM1):
14150         CASE_FLT_FN (BUILT_IN_FLOOR):
14151         CASE_FLT_FN (BUILT_IN_FMOD):
14152         CASE_FLT_FN (BUILT_IN_FREXP):
14153         CASE_FLT_FN (BUILT_IN_LCEIL):
14154         CASE_FLT_FN (BUILT_IN_LDEXP):
14155         CASE_FLT_FN (BUILT_IN_LFLOOR):
14156         CASE_FLT_FN (BUILT_IN_LLCEIL):
14157         CASE_FLT_FN (BUILT_IN_LLFLOOR):
14158         CASE_FLT_FN (BUILT_IN_LLRINT):
14159         CASE_FLT_FN (BUILT_IN_LLROUND):
14160         CASE_FLT_FN (BUILT_IN_LRINT):
14161         CASE_FLT_FN (BUILT_IN_LROUND):
14162         CASE_FLT_FN (BUILT_IN_MODF):
14163         CASE_FLT_FN (BUILT_IN_NEARBYINT):
14164         CASE_FLT_FN (BUILT_IN_RINT):
14165         CASE_FLT_FN (BUILT_IN_ROUND):
14166         CASE_FLT_FN (BUILT_IN_SCALB):
14167         CASE_FLT_FN (BUILT_IN_SCALBLN):
14168         CASE_FLT_FN (BUILT_IN_SCALBN):
14169         CASE_FLT_FN (BUILT_IN_SIGNBIT):
14170         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14171         CASE_FLT_FN (BUILT_IN_SINH):
14172         CASE_FLT_FN (BUILT_IN_TANH):
14173         CASE_FLT_FN (BUILT_IN_TRUNC):
14174         /* True if the 1st argument is nonnegative.  */
14175         return tree_expr_nonnegative_warnv_p (arg0,
14176                                               strict_overflow_p);
14177
14178         CASE_FLT_FN (BUILT_IN_FMAX):
14179         /* True if the 1st OR 2nd arguments are nonnegative.  */
14180         return (tree_expr_nonnegative_warnv_p (arg0,
14181                                                strict_overflow_p)
14182                 || (tree_expr_nonnegative_warnv_p (arg1,
14183                                                    strict_overflow_p)));
14184
14185         CASE_FLT_FN (BUILT_IN_FMIN):
14186         /* True if the 1st AND 2nd arguments are nonnegative.  */
14187         return (tree_expr_nonnegative_warnv_p (arg0,
14188                                                strict_overflow_p)
14189                 && (tree_expr_nonnegative_warnv_p (arg1,
14190                                                    strict_overflow_p)));
14191
14192         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14193         /* True if the 2nd argument is nonnegative.  */
14194         return tree_expr_nonnegative_warnv_p (arg1,
14195                                               strict_overflow_p);
14196
14197         CASE_FLT_FN (BUILT_IN_POWI):
14198         /* True if the 1st argument is nonnegative or the second
14199            argument is an even integer.  */
14200         if (TREE_CODE (arg1) == INTEGER_CST
14201             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
14202           return true;
14203         return tree_expr_nonnegative_warnv_p (arg0,
14204                                               strict_overflow_p);
14205
14206         CASE_FLT_FN (BUILT_IN_POW):
14207         /* True if the 1st argument is nonnegative or the second
14208            argument is an even integer valued real.  */
14209         if (TREE_CODE (arg1) == REAL_CST)
14210           {
14211             REAL_VALUE_TYPE c;
14212             HOST_WIDE_INT n;
14213
14214             c = TREE_REAL_CST (arg1);
14215             n = real_to_integer (&c);
14216             if ((n & 1) == 0)
14217               {
14218                 REAL_VALUE_TYPE cint;
14219                 real_from_integer (&cint, VOIDmode, n,
14220                                    n < 0 ? -1 : 0, 0);
14221                 if (real_identical (&c, &cint))
14222                   return true;
14223               }
14224           }
14225         return tree_expr_nonnegative_warnv_p (arg0,
14226                                               strict_overflow_p);
14227
14228       default:
14229         break;
14230       }
14231   return tree_simple_nonnegative_warnv_p (code,
14232                                           type);
14233 }
14234
14235 /* Return true if T is known to be non-negative.  If the return
14236    value is based on the assumption that signed overflow is undefined,
14237    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14238    *STRICT_OVERFLOW_P.  */
14239
14240 bool
14241 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14242 {
14243   enum tree_code code = TREE_CODE (t);
14244   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14245     return true;
14246
14247   switch (code)
14248     {
14249     case TARGET_EXPR:
14250       {
14251         tree temp = TARGET_EXPR_SLOT (t);
14252         t = TARGET_EXPR_INITIAL (t);
14253
14254         /* If the initializer is non-void, then it's a normal expression
14255            that will be assigned to the slot.  */
14256         if (!VOID_TYPE_P (t))
14257           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
14258
14259         /* Otherwise, the initializer sets the slot in some way.  One common
14260            way is an assignment statement at the end of the initializer.  */
14261         while (1)
14262           {
14263             if (TREE_CODE (t) == BIND_EXPR)
14264               t = expr_last (BIND_EXPR_BODY (t));
14265             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
14266                      || TREE_CODE (t) == TRY_CATCH_EXPR)
14267               t = expr_last (TREE_OPERAND (t, 0));
14268             else if (TREE_CODE (t) == STATEMENT_LIST)
14269               t = expr_last (t);
14270             else
14271               break;
14272           }
14273         if ((TREE_CODE (t) == MODIFY_EXPR
14274              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
14275             && GENERIC_TREE_OPERAND (t, 0) == temp)
14276           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14277                                                 strict_overflow_p);
14278
14279         return false;
14280       }
14281
14282     case CALL_EXPR:
14283       {
14284         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
14285         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
14286
14287         return tree_call_nonnegative_warnv_p (TREE_CODE (t),
14288                                               TREE_TYPE (t),
14289                                               get_callee_fndecl (t),
14290                                               arg0,
14291                                               arg1,
14292                                               strict_overflow_p);
14293       }
14294     case COMPOUND_EXPR:
14295     case MODIFY_EXPR:
14296     case GIMPLE_MODIFY_STMT:
14297       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14298                                             strict_overflow_p);
14299     case BIND_EXPR:
14300       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14301                                             strict_overflow_p);
14302     case SAVE_EXPR:
14303       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14304                                             strict_overflow_p);
14305
14306     default:
14307       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14308                                                    TREE_TYPE (t));
14309     }
14310
14311   /* We don't know sign of `t', so be conservative and return false.  */
14312   return false;
14313 }
14314
14315 /* Return true if T is known to be non-negative.  If the return
14316    value is based on the assumption that signed overflow is undefined,
14317    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14318    *STRICT_OVERFLOW_P.  */
14319
14320 bool
14321 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14322 {
14323   enum tree_code code;
14324   if (t == error_mark_node)
14325     return false;
14326
14327   code = TREE_CODE (t);
14328   switch (TREE_CODE_CLASS (code))
14329     {
14330     case tcc_binary:
14331     case tcc_comparison:
14332       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14333                                               TREE_TYPE (t),
14334                                               TREE_OPERAND (t, 0),
14335                                               TREE_OPERAND (t, 1),
14336                                               strict_overflow_p);
14337
14338     case tcc_unary:
14339       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14340                                              TREE_TYPE (t),
14341                                              TREE_OPERAND (t, 0),
14342                                              strict_overflow_p);
14343
14344     case tcc_constant:
14345     case tcc_declaration:
14346     case tcc_reference:
14347       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14348
14349     default:
14350       break;
14351     }
14352
14353   switch (code)
14354     {
14355     case TRUTH_AND_EXPR:
14356     case TRUTH_OR_EXPR:
14357     case TRUTH_XOR_EXPR:
14358       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14359                                               TREE_TYPE (t),
14360                                               TREE_OPERAND (t, 0),
14361                                               TREE_OPERAND (t, 1),
14362                                               strict_overflow_p);
14363     case TRUTH_NOT_EXPR:
14364       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14365                                              TREE_TYPE (t),
14366                                              TREE_OPERAND (t, 0),
14367                                              strict_overflow_p);
14368
14369     case COND_EXPR:
14370     case CONSTRUCTOR:
14371     case OBJ_TYPE_REF:
14372     case ASSERT_EXPR:
14373     case ADDR_EXPR:
14374     case WITH_SIZE_EXPR:
14375     case EXC_PTR_EXPR:
14376     case SSA_NAME:
14377     case FILTER_EXPR:
14378       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14379
14380     default:
14381       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14382     }
14383 }
14384
14385 /* Return true if `t' is known to be non-negative.  Handle warnings
14386    about undefined signed overflow.  */
14387
14388 bool
14389 tree_expr_nonnegative_p (tree t)
14390 {
14391   bool ret, strict_overflow_p;
14392
14393   strict_overflow_p = false;
14394   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14395   if (strict_overflow_p)
14396     fold_overflow_warning (("assuming signed overflow does not occur when "
14397                             "determining that expression is always "
14398                             "non-negative"),
14399                            WARN_STRICT_OVERFLOW_MISC);
14400   return ret;
14401 }
14402
14403
14404 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14405    For floating point we further ensure that T is not denormal.
14406    Similar logic is present in nonzero_address in rtlanal.h.
14407
14408    If the return value is based on the assumption that signed overflow
14409    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14410    change *STRICT_OVERFLOW_P.  */
14411
14412 bool
14413 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14414                                  bool *strict_overflow_p)
14415 {
14416   switch (code)
14417     {
14418     case ABS_EXPR:
14419       return tree_expr_nonzero_warnv_p (op0,
14420                                         strict_overflow_p);
14421
14422     case NOP_EXPR:
14423       {
14424         tree inner_type = TREE_TYPE (op0);
14425         tree outer_type = type;
14426
14427         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14428                 && tree_expr_nonzero_warnv_p (op0,
14429                                               strict_overflow_p));
14430       }
14431       break;
14432
14433     case NON_LVALUE_EXPR:
14434       return tree_expr_nonzero_warnv_p (op0,
14435                                         strict_overflow_p);
14436
14437     default:
14438       break;
14439   }
14440
14441   return false;
14442 }
14443
14444 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14445    For floating point we further ensure that T is not denormal.
14446    Similar logic is present in nonzero_address in rtlanal.h.
14447
14448    If the return value is based on the assumption that signed overflow
14449    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14450    change *STRICT_OVERFLOW_P.  */
14451
14452 bool
14453 tree_binary_nonzero_warnv_p (enum tree_code code,
14454                              tree type,
14455                              tree op0,
14456                              tree op1, bool *strict_overflow_p)
14457 {
14458   bool sub_strict_overflow_p;
14459   switch (code)
14460     {
14461     case POINTER_PLUS_EXPR:
14462     case PLUS_EXPR:
14463       if (TYPE_OVERFLOW_UNDEFINED (type))
14464         {
14465           /* With the presence of negative values it is hard
14466              to say something.  */
14467           sub_strict_overflow_p = false;
14468           if (!tree_expr_nonnegative_warnv_p (op0,
14469                                               &sub_strict_overflow_p)
14470               || !tree_expr_nonnegative_warnv_p (op1,
14471                                                  &sub_strict_overflow_p))
14472             return false;
14473           /* One of operands must be positive and the other non-negative.  */
14474           /* We don't set *STRICT_OVERFLOW_P here: even if this value
14475              overflows, on a twos-complement machine the sum of two
14476              nonnegative numbers can never be zero.  */
14477           return (tree_expr_nonzero_warnv_p (op0,
14478                                              strict_overflow_p)
14479                   || tree_expr_nonzero_warnv_p (op1,
14480                                                 strict_overflow_p));
14481         }
14482       break;
14483
14484     case MULT_EXPR:
14485       if (TYPE_OVERFLOW_UNDEFINED (type))
14486         {
14487           if (tree_expr_nonzero_warnv_p (op0,
14488                                          strict_overflow_p)
14489               && tree_expr_nonzero_warnv_p (op1,
14490                                             strict_overflow_p))
14491             {
14492               *strict_overflow_p = true;
14493               return true;
14494             }
14495         }
14496       break;
14497
14498     case MIN_EXPR:
14499       sub_strict_overflow_p = false;
14500       if (tree_expr_nonzero_warnv_p (op0,
14501                                      &sub_strict_overflow_p)
14502           && tree_expr_nonzero_warnv_p (op1,
14503                                         &sub_strict_overflow_p))
14504         {
14505           if (sub_strict_overflow_p)
14506             *strict_overflow_p = true;
14507         }
14508       break;
14509
14510     case MAX_EXPR:
14511       sub_strict_overflow_p = false;
14512       if (tree_expr_nonzero_warnv_p (op0,
14513                                      &sub_strict_overflow_p))
14514         {
14515           if (sub_strict_overflow_p)
14516             *strict_overflow_p = true;
14517
14518           /* When both operands are nonzero, then MAX must be too.  */
14519           if (tree_expr_nonzero_warnv_p (op1,
14520                                          strict_overflow_p))
14521             return true;
14522
14523           /* MAX where operand 0 is positive is positive.  */
14524           return tree_expr_nonnegative_warnv_p (op0,
14525                                                strict_overflow_p);
14526         }
14527       /* MAX where operand 1 is positive is positive.  */
14528       else if (tree_expr_nonzero_warnv_p (op1,
14529                                           &sub_strict_overflow_p)
14530                && tree_expr_nonnegative_warnv_p (op1,
14531                                                  &sub_strict_overflow_p))
14532         {
14533           if (sub_strict_overflow_p)
14534             *strict_overflow_p = true;
14535           return true;
14536         }
14537       break;
14538
14539     case BIT_IOR_EXPR:
14540       return (tree_expr_nonzero_warnv_p (op1,
14541                                          strict_overflow_p)
14542               || tree_expr_nonzero_warnv_p (op0,
14543                                             strict_overflow_p));
14544
14545     default:
14546       break;
14547   }
14548
14549   return false;
14550 }
14551
14552 /* Return true when T is an address and is known to be nonzero.
14553    For floating point we further ensure that T is not denormal.
14554    Similar logic is present in nonzero_address in rtlanal.h.
14555
14556    If the return value is based on the assumption that signed overflow
14557    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14558    change *STRICT_OVERFLOW_P.  */
14559
14560 bool
14561 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14562 {
14563   bool sub_strict_overflow_p;
14564   switch (TREE_CODE (t))
14565     {
14566     case SSA_NAME:
14567       /* Query VRP to see if it has recorded any information about
14568          the range of this object.  */
14569       return ssa_name_nonzero_p (t);
14570
14571     case INTEGER_CST:
14572       return !integer_zerop (t);
14573
14574     case ADDR_EXPR:
14575       {
14576         tree base = get_base_address (TREE_OPERAND (t, 0));
14577
14578         if (!base)
14579           return false;
14580
14581         /* Weak declarations may link to NULL.  */
14582         if (VAR_OR_FUNCTION_DECL_P (base))
14583           return !DECL_WEAK (base);
14584
14585         /* Constants are never weak.  */
14586         if (CONSTANT_CLASS_P (base))
14587           return true;
14588
14589         return false;
14590       }
14591
14592     case COND_EXPR:
14593       sub_strict_overflow_p = false;
14594       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
14595                                      &sub_strict_overflow_p)
14596           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
14597                                         &sub_strict_overflow_p))
14598         {
14599           if (sub_strict_overflow_p)
14600             *strict_overflow_p = true;
14601           return true;
14602         }
14603       break;
14604
14605     default:
14606       break;
14607     }
14608   return false;
14609 }
14610
14611 /* Return true when T is an address and is known to be nonzero.
14612    For floating point we further ensure that T is not denormal.
14613    Similar logic is present in nonzero_address in rtlanal.h.
14614
14615    If the return value is based on the assumption that signed overflow
14616    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14617    change *STRICT_OVERFLOW_P.  */
14618
14619 bool
14620 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14621 {
14622   tree type = TREE_TYPE (t);
14623   enum tree_code code;
14624
14625   /* Doing something useful for floating point would need more work.  */
14626   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
14627     return false;
14628
14629   code = TREE_CODE (t);
14630   switch (TREE_CODE_CLASS (code))
14631     {
14632     case tcc_unary:
14633       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14634                                               strict_overflow_p);
14635     case tcc_binary:
14636     case tcc_comparison:
14637       return tree_binary_nonzero_warnv_p (code, type,
14638                                                TREE_OPERAND (t, 0),
14639                                                TREE_OPERAND (t, 1),
14640                                                strict_overflow_p);
14641     case tcc_constant:
14642     case tcc_declaration:
14643     case tcc_reference:
14644       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14645
14646     default:
14647       break;
14648     }
14649
14650   switch (code)
14651     {
14652     case TRUTH_NOT_EXPR:
14653       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14654                                               strict_overflow_p);
14655
14656     case TRUTH_AND_EXPR:
14657     case TRUTH_OR_EXPR:
14658     case TRUTH_XOR_EXPR:
14659       return tree_binary_nonzero_warnv_p (code, type,
14660                                                TREE_OPERAND (t, 0),
14661                                                TREE_OPERAND (t, 1),
14662                                                strict_overflow_p);
14663
14664     case COND_EXPR:
14665     case CONSTRUCTOR:
14666     case OBJ_TYPE_REF:
14667     case ASSERT_EXPR:
14668     case ADDR_EXPR:
14669     case WITH_SIZE_EXPR:
14670     case EXC_PTR_EXPR:
14671     case SSA_NAME:
14672     case FILTER_EXPR:
14673       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14674
14675     case COMPOUND_EXPR:
14676     case MODIFY_EXPR:
14677     case GIMPLE_MODIFY_STMT:
14678     case BIND_EXPR:
14679       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14680                                         strict_overflow_p);
14681
14682     case SAVE_EXPR:
14683       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
14684                                         strict_overflow_p);
14685
14686     case CALL_EXPR:
14687       return alloca_call_p (t);
14688
14689     default:
14690       break;
14691     }
14692   return false;
14693 }
14694
14695 /* Return true when T is an address and is known to be nonzero.
14696    Handle warnings about undefined signed overflow.  */
14697
14698 bool
14699 tree_expr_nonzero_p (tree t)
14700 {
14701   bool ret, strict_overflow_p;
14702
14703   strict_overflow_p = false;
14704   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
14705   if (strict_overflow_p)
14706     fold_overflow_warning (("assuming signed overflow does not occur when "
14707                             "determining that expression is always "
14708                             "non-zero"),
14709                            WARN_STRICT_OVERFLOW_MISC);
14710   return ret;
14711 }
14712
14713 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
14714    attempt to fold the expression to a constant without modifying TYPE,
14715    OP0 or OP1.
14716
14717    If the expression could be simplified to a constant, then return
14718    the constant.  If the expression would not be simplified to a
14719    constant, then return NULL_TREE.  */
14720
14721 tree
14722 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
14723 {
14724   tree tem = fold_binary (code, type, op0, op1);
14725   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14726 }
14727
14728 /* Given the components of a unary expression CODE, TYPE and OP0,
14729    attempt to fold the expression to a constant without modifying
14730    TYPE or OP0.
14731
14732    If the expression could be simplified to a constant, then return
14733    the constant.  If the expression would not be simplified to a
14734    constant, then return NULL_TREE.  */
14735
14736 tree
14737 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
14738 {
14739   tree tem = fold_unary (code, type, op0);
14740   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14741 }
14742
14743 /* If EXP represents referencing an element in a constant string
14744    (either via pointer arithmetic or array indexing), return the
14745    tree representing the value accessed, otherwise return NULL.  */
14746
14747 tree
14748 fold_read_from_constant_string (tree exp)
14749 {
14750   if ((TREE_CODE (exp) == INDIRECT_REF
14751        || TREE_CODE (exp) == ARRAY_REF)
14752       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
14753     {
14754       tree exp1 = TREE_OPERAND (exp, 0);
14755       tree index;
14756       tree string;
14757
14758       if (TREE_CODE (exp) == INDIRECT_REF)
14759         string = string_constant (exp1, &index);
14760       else
14761         {
14762           tree low_bound = array_ref_low_bound (exp);
14763           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
14764
14765           /* Optimize the special-case of a zero lower bound.
14766
14767              We convert the low_bound to sizetype to avoid some problems
14768              with constant folding.  (E.g. suppose the lower bound is 1,
14769              and its mode is QI.  Without the conversion,l (ARRAY
14770              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
14771              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
14772           if (! integer_zerop (low_bound))
14773             index = size_diffop (index, fold_convert (sizetype, low_bound));
14774
14775           string = exp1;
14776         }
14777
14778       if (string
14779           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
14780           && TREE_CODE (string) == STRING_CST
14781           && TREE_CODE (index) == INTEGER_CST
14782           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
14783           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
14784               == MODE_INT)
14785           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
14786         return build_int_cst_type (TREE_TYPE (exp),
14787                                    (TREE_STRING_POINTER (string)
14788                                     [TREE_INT_CST_LOW (index)]));
14789     }
14790   return NULL;
14791 }
14792
14793 /* Return the tree for neg (ARG0) when ARG0 is known to be either
14794    an integer constant, real, or fixed-point constant.
14795
14796    TYPE is the type of the result.  */
14797
14798 static tree
14799 fold_negate_const (tree arg0, tree type)
14800 {
14801   tree t = NULL_TREE;
14802
14803   switch (TREE_CODE (arg0))
14804     {
14805     case INTEGER_CST:
14806       {
14807         unsigned HOST_WIDE_INT low;
14808         HOST_WIDE_INT high;
14809         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14810                                    TREE_INT_CST_HIGH (arg0),
14811                                    &low, &high);
14812         t = force_fit_type_double (type, low, high, 1,
14813                                    (overflow | TREE_OVERFLOW (arg0))
14814                                    && !TYPE_UNSIGNED (type));
14815         break;
14816       }
14817
14818     case REAL_CST:
14819       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14820       break;
14821
14822     case FIXED_CST:
14823       {
14824         FIXED_VALUE_TYPE f;
14825         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
14826                                             &(TREE_FIXED_CST (arg0)), NULL,
14827                                             TYPE_SATURATING (type));
14828         t = build_fixed (type, f);
14829         /* Propagate overflow flags.  */
14830         if (overflow_p | TREE_OVERFLOW (arg0))
14831           {
14832             TREE_OVERFLOW (t) = 1;
14833             TREE_CONSTANT_OVERFLOW (t) = 1;
14834           }
14835         else if (TREE_CONSTANT_OVERFLOW (arg0))
14836           TREE_CONSTANT_OVERFLOW (t) = 1;
14837         break;
14838       }
14839
14840     default:
14841       gcc_unreachable ();
14842     }
14843
14844   return t;
14845 }
14846
14847 /* Return the tree for abs (ARG0) when ARG0 is known to be either
14848    an integer constant or real constant.
14849
14850    TYPE is the type of the result.  */
14851
14852 tree
14853 fold_abs_const (tree arg0, tree type)
14854 {
14855   tree t = NULL_TREE;
14856
14857   switch (TREE_CODE (arg0))
14858     {
14859     case INTEGER_CST:
14860       /* If the value is unsigned, then the absolute value is
14861          the same as the ordinary value.  */
14862       if (TYPE_UNSIGNED (type))
14863         t = arg0;
14864       /* Similarly, if the value is non-negative.  */
14865       else if (INT_CST_LT (integer_minus_one_node, arg0))
14866         t = arg0;
14867       /* If the value is negative, then the absolute value is
14868          its negation.  */
14869       else
14870         {
14871           unsigned HOST_WIDE_INT low;
14872           HOST_WIDE_INT high;
14873           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14874                                      TREE_INT_CST_HIGH (arg0),
14875                                      &low, &high);
14876           t = force_fit_type_double (type, low, high, -1,
14877                                      overflow | TREE_OVERFLOW (arg0));
14878         }
14879       break;
14880
14881     case REAL_CST:
14882       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
14883         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14884       else
14885         t =  arg0;
14886       break;
14887
14888     default:
14889       gcc_unreachable ();
14890     }
14891
14892   return t;
14893 }
14894
14895 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
14896    constant.  TYPE is the type of the result.  */
14897
14898 static tree
14899 fold_not_const (tree arg0, tree type)
14900 {
14901   tree t = NULL_TREE;
14902
14903   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
14904
14905   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
14906                              ~TREE_INT_CST_HIGH (arg0), 0,
14907                              TREE_OVERFLOW (arg0));
14908
14909   return t;
14910 }
14911
14912 /* Given CODE, a relational operator, the target type, TYPE and two
14913    constant operands OP0 and OP1, return the result of the
14914    relational operation.  If the result is not a compile time
14915    constant, then return NULL_TREE.  */
14916
14917 static tree
14918 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
14919 {
14920   int result, invert;
14921
14922   /* From here on, the only cases we handle are when the result is
14923      known to be a constant.  */
14924
14925   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
14926     {
14927       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
14928       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
14929
14930       /* Handle the cases where either operand is a NaN.  */
14931       if (real_isnan (c0) || real_isnan (c1))
14932         {
14933           switch (code)
14934             {
14935             case EQ_EXPR:
14936             case ORDERED_EXPR:
14937               result = 0;
14938               break;
14939
14940             case NE_EXPR:
14941             case UNORDERED_EXPR:
14942             case UNLT_EXPR:
14943             case UNLE_EXPR:
14944             case UNGT_EXPR:
14945             case UNGE_EXPR:
14946             case UNEQ_EXPR:
14947               result = 1;
14948               break;
14949
14950             case LT_EXPR:
14951             case LE_EXPR:
14952             case GT_EXPR:
14953             case GE_EXPR:
14954             case LTGT_EXPR:
14955               if (flag_trapping_math)
14956                 return NULL_TREE;
14957               result = 0;
14958               break;
14959
14960             default:
14961               gcc_unreachable ();
14962             }
14963
14964           return constant_boolean_node (result, type);
14965         }
14966
14967       return constant_boolean_node (real_compare (code, c0, c1), type);
14968     }
14969
14970   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
14971     {
14972       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
14973       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
14974       return constant_boolean_node (fixed_compare (code, c0, c1), type);
14975     }
14976
14977   /* Handle equality/inequality of complex constants.  */
14978   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14979     {
14980       tree rcond = fold_relational_const (code, type,
14981                                           TREE_REALPART (op0),
14982                                           TREE_REALPART (op1));
14983       tree icond = fold_relational_const (code, type,
14984                                           TREE_IMAGPART (op0),
14985                                           TREE_IMAGPART (op1));
14986       if (code == EQ_EXPR)
14987         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14988       else if (code == NE_EXPR)
14989         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14990       else
14991         return NULL_TREE;
14992     }
14993
14994   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14995
14996      To compute GT, swap the arguments and do LT.
14997      To compute GE, do LT and invert the result.
14998      To compute LE, swap the arguments, do LT and invert the result.
14999      To compute NE, do EQ and invert the result.
15000
15001      Therefore, the code below must handle only EQ and LT.  */
15002
15003   if (code == LE_EXPR || code == GT_EXPR)
15004     {
15005       tree tem = op0;
15006       op0 = op1;
15007       op1 = tem;
15008       code = swap_tree_comparison (code);
15009     }
15010
15011   /* Note that it is safe to invert for real values here because we
15012      have already handled the one case that it matters.  */
15013
15014   invert = 0;
15015   if (code == NE_EXPR || code == GE_EXPR)
15016     {
15017       invert = 1;
15018       code = invert_tree_comparison (code, false);
15019     }
15020
15021   /* Compute a result for LT or EQ if args permit;
15022      Otherwise return T.  */
15023   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15024     {
15025       if (code == EQ_EXPR)
15026         result = tree_int_cst_equal (op0, op1);
15027       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
15028         result = INT_CST_LT_UNSIGNED (op0, op1);
15029       else
15030         result = INT_CST_LT (op0, op1);
15031     }
15032   else
15033     return NULL_TREE;
15034
15035   if (invert)
15036     result ^= 1;
15037   return constant_boolean_node (result, type);
15038 }
15039
15040 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15041    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15042    itself.  */
15043
15044 tree
15045 fold_build_cleanup_point_expr (tree type, tree expr)
15046 {
15047   /* If the expression does not have side effects then we don't have to wrap
15048      it with a cleanup point expression.  */
15049   if (!TREE_SIDE_EFFECTS (expr))
15050     return expr;
15051
15052   /* If the expression is a return, check to see if the expression inside the
15053      return has no side effects or the right hand side of the modify expression
15054      inside the return. If either don't have side effects set we don't need to
15055      wrap the expression in a cleanup point expression.  Note we don't check the
15056      left hand side of the modify because it should always be a return decl.  */
15057   if (TREE_CODE (expr) == RETURN_EXPR)
15058     {
15059       tree op = TREE_OPERAND (expr, 0);
15060       if (!op || !TREE_SIDE_EFFECTS (op))
15061         return expr;
15062       op = TREE_OPERAND (op, 1);
15063       if (!TREE_SIDE_EFFECTS (op))
15064         return expr;
15065     }
15066   
15067   return build1 (CLEANUP_POINT_EXPR, type, expr);
15068 }
15069
15070 /* Given a pointer value OP0 and a type TYPE, return a simplified version
15071    of an indirection through OP0, or NULL_TREE if no simplification is
15072    possible.  */
15073
15074 tree
15075 fold_indirect_ref_1 (tree type, tree op0)
15076 {
15077   tree sub = op0;
15078   tree subtype;
15079
15080   STRIP_NOPS (sub);
15081   subtype = TREE_TYPE (sub);
15082   if (!POINTER_TYPE_P (subtype))
15083     return NULL_TREE;
15084
15085   if (TREE_CODE (sub) == ADDR_EXPR)
15086     {
15087       tree op = TREE_OPERAND (sub, 0);
15088       tree optype = TREE_TYPE (op);
15089       /* *&CONST_DECL -> to the value of the const decl.  */
15090       if (TREE_CODE (op) == CONST_DECL)
15091         return DECL_INITIAL (op);
15092       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
15093       if (type == optype)
15094         {
15095           tree fop = fold_read_from_constant_string (op);
15096           if (fop)
15097             return fop;
15098           else
15099             return op;
15100         }
15101       /* *(foo *)&fooarray => fooarray[0] */
15102       else if (TREE_CODE (optype) == ARRAY_TYPE
15103                && type == TREE_TYPE (optype))
15104         {
15105           tree type_domain = TYPE_DOMAIN (optype);
15106           tree min_val = size_zero_node;
15107           if (type_domain && TYPE_MIN_VALUE (type_domain))
15108             min_val = TYPE_MIN_VALUE (type_domain);
15109           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
15110         }
15111       /* *(foo *)&complexfoo => __real__ complexfoo */
15112       else if (TREE_CODE (optype) == COMPLEX_TYPE
15113                && type == TREE_TYPE (optype))
15114         return fold_build1 (REALPART_EXPR, type, op);
15115       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
15116       else if (TREE_CODE (optype) == VECTOR_TYPE
15117                && type == TREE_TYPE (optype))
15118         {
15119           tree part_width = TYPE_SIZE (type);
15120           tree index = bitsize_int (0);
15121           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
15122         }
15123     }
15124
15125   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15126   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15127       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15128     { 
15129       tree op00 = TREE_OPERAND (sub, 0);
15130       tree op01 = TREE_OPERAND (sub, 1);
15131       tree op00type;
15132       
15133       STRIP_NOPS (op00);
15134       op00type = TREE_TYPE (op00);
15135       if (TREE_CODE (op00) == ADDR_EXPR
15136           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
15137           && type == TREE_TYPE (TREE_TYPE (op00type)))
15138         { 
15139           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
15140           tree part_width = TYPE_SIZE (type);
15141           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
15142           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15143           tree index = bitsize_int (indexi);
15144
15145           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
15146             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
15147                                 part_width, index);
15148         
15149         }
15150     }
15151
15152
15153   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15154   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15155       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15156     {
15157       tree op00 = TREE_OPERAND (sub, 0);
15158       tree op01 = TREE_OPERAND (sub, 1);
15159       tree op00type;
15160
15161       STRIP_NOPS (op00);
15162       op00type = TREE_TYPE (op00);
15163       if (TREE_CODE (op00) == ADDR_EXPR
15164           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
15165           && type == TREE_TYPE (TREE_TYPE (op00type)))
15166         {
15167           tree size = TYPE_SIZE_UNIT (type);
15168           if (tree_int_cst_equal (size, op01))
15169             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
15170         }
15171     }
15172   
15173   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15174   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15175       && type == TREE_TYPE (TREE_TYPE (subtype)))
15176     {
15177       tree type_domain;
15178       tree min_val = size_zero_node;
15179       sub = build_fold_indirect_ref (sub);
15180       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
15181       if (type_domain && TYPE_MIN_VALUE (type_domain))
15182         min_val = TYPE_MIN_VALUE (type_domain);
15183       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
15184     }
15185
15186   return NULL_TREE;
15187 }
15188
15189 /* Builds an expression for an indirection through T, simplifying some
15190    cases.  */
15191
15192 tree
15193 build_fold_indirect_ref (tree t)
15194 {
15195   tree type = TREE_TYPE (TREE_TYPE (t));
15196   tree sub = fold_indirect_ref_1 (type, t);
15197
15198   if (sub)
15199     return sub;
15200   else
15201     return build1 (INDIRECT_REF, type, t);
15202 }
15203
15204 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
15205
15206 tree
15207 fold_indirect_ref (tree t)
15208 {
15209   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
15210
15211   if (sub)
15212     return sub;
15213   else
15214     return t;
15215 }
15216
15217 /* Strip non-trapping, non-side-effecting tree nodes from an expression
15218    whose result is ignored.  The type of the returned tree need not be
15219    the same as the original expression.  */
15220
15221 tree
15222 fold_ignored_result (tree t)
15223 {
15224   if (!TREE_SIDE_EFFECTS (t))
15225     return integer_zero_node;
15226
15227   for (;;)
15228     switch (TREE_CODE_CLASS (TREE_CODE (t)))
15229       {
15230       case tcc_unary:
15231         t = TREE_OPERAND (t, 0);
15232         break;
15233
15234       case tcc_binary:
15235       case tcc_comparison:
15236         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15237           t = TREE_OPERAND (t, 0);
15238         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15239           t = TREE_OPERAND (t, 1);
15240         else
15241           return t;
15242         break;
15243
15244       case tcc_expression:
15245         switch (TREE_CODE (t))
15246           {
15247           case COMPOUND_EXPR:
15248             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15249               return t;
15250             t = TREE_OPERAND (t, 0);
15251             break;
15252
15253           case COND_EXPR:
15254             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15255                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15256               return t;
15257             t = TREE_OPERAND (t, 0);
15258             break;
15259
15260           default:
15261             return t;
15262           }
15263         break;
15264
15265       default:
15266         return t;
15267       }
15268 }
15269
15270 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15271    This can only be applied to objects of a sizetype.  */
15272
15273 tree
15274 round_up (tree value, int divisor)
15275 {
15276   tree div = NULL_TREE;
15277
15278   gcc_assert (divisor > 0);
15279   if (divisor == 1)
15280     return value;
15281
15282   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15283      have to do anything.  Only do this when we are not given a const,
15284      because in that case, this check is more expensive than just
15285      doing it.  */
15286   if (TREE_CODE (value) != INTEGER_CST)
15287     {
15288       div = build_int_cst (TREE_TYPE (value), divisor);
15289
15290       if (multiple_of_p (TREE_TYPE (value), value, div))
15291         return value;
15292     }
15293
15294   /* If divisor is a power of two, simplify this to bit manipulation.  */
15295   if (divisor == (divisor & -divisor))
15296     {
15297       if (TREE_CODE (value) == INTEGER_CST)
15298         {
15299           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15300           unsigned HOST_WIDE_INT high;
15301           bool overflow_p;
15302
15303           if ((low & (divisor - 1)) == 0)
15304             return value;
15305
15306           overflow_p = TREE_OVERFLOW (value);
15307           high = TREE_INT_CST_HIGH (value);
15308           low &= ~(divisor - 1);
15309           low += divisor;
15310           if (low == 0)
15311             {
15312               high++;
15313               if (high == 0)
15314                 overflow_p = true;
15315             }
15316
15317           return force_fit_type_double (TREE_TYPE (value), low, high,
15318                                         -1, overflow_p);
15319         }
15320       else
15321         {
15322           tree t;
15323
15324           t = build_int_cst (TREE_TYPE (value), divisor - 1);
15325           value = size_binop (PLUS_EXPR, value, t);
15326           t = build_int_cst (TREE_TYPE (value), -divisor);
15327           value = size_binop (BIT_AND_EXPR, value, t);
15328         }
15329     }
15330   else
15331     {
15332       if (!div)
15333         div = build_int_cst (TREE_TYPE (value), divisor);
15334       value = size_binop (CEIL_DIV_EXPR, value, div);
15335       value = size_binop (MULT_EXPR, value, div);
15336     }
15337
15338   return value;
15339 }
15340
15341 /* Likewise, but round down.  */
15342
15343 tree
15344 round_down (tree value, int divisor)
15345 {
15346   tree div = NULL_TREE;
15347
15348   gcc_assert (divisor > 0);
15349   if (divisor == 1)
15350     return value;
15351
15352   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15353      have to do anything.  Only do this when we are not given a const,
15354      because in that case, this check is more expensive than just
15355      doing it.  */
15356   if (TREE_CODE (value) != INTEGER_CST)
15357     {
15358       div = build_int_cst (TREE_TYPE (value), divisor);
15359
15360       if (multiple_of_p (TREE_TYPE (value), value, div))
15361         return value;
15362     }
15363
15364   /* If divisor is a power of two, simplify this to bit manipulation.  */
15365   if (divisor == (divisor & -divisor))
15366     {
15367       tree t;
15368
15369       t = build_int_cst (TREE_TYPE (value), -divisor);
15370       value = size_binop (BIT_AND_EXPR, value, t);
15371     }
15372   else
15373     {
15374       if (!div)
15375         div = build_int_cst (TREE_TYPE (value), divisor);
15376       value = size_binop (FLOOR_DIV_EXPR, value, div);
15377       value = size_binop (MULT_EXPR, value, div);
15378     }
15379
15380   return value;
15381 }
15382
15383 /* Returns the pointer to the base of the object addressed by EXP and
15384    extracts the information about the offset of the access, storing it
15385    to PBITPOS and POFFSET.  */
15386
15387 static tree
15388 split_address_to_core_and_offset (tree exp,
15389                                   HOST_WIDE_INT *pbitpos, tree *poffset)
15390 {
15391   tree core;
15392   enum machine_mode mode;
15393   int unsignedp, volatilep;
15394   HOST_WIDE_INT bitsize;
15395
15396   if (TREE_CODE (exp) == ADDR_EXPR)
15397     {
15398       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15399                                   poffset, &mode, &unsignedp, &volatilep,
15400                                   false);
15401       core = fold_addr_expr (core);
15402     }
15403   else
15404     {
15405       core = exp;
15406       *pbitpos = 0;
15407       *poffset = NULL_TREE;
15408     }
15409
15410   return core;
15411 }
15412
15413 /* Returns true if addresses of E1 and E2 differ by a constant, false
15414    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
15415
15416 bool
15417 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15418 {
15419   tree core1, core2;
15420   HOST_WIDE_INT bitpos1, bitpos2;
15421   tree toffset1, toffset2, tdiff, type;
15422
15423   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15424   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15425
15426   if (bitpos1 % BITS_PER_UNIT != 0
15427       || bitpos2 % BITS_PER_UNIT != 0
15428       || !operand_equal_p (core1, core2, 0))
15429     return false;
15430
15431   if (toffset1 && toffset2)
15432     {
15433       type = TREE_TYPE (toffset1);
15434       if (type != TREE_TYPE (toffset2))
15435         toffset2 = fold_convert (type, toffset2);
15436
15437       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15438       if (!cst_and_fits_in_hwi (tdiff))
15439         return false;
15440
15441       *diff = int_cst_value (tdiff);
15442     }
15443   else if (toffset1 || toffset2)
15444     {
15445       /* If only one of the offsets is non-constant, the difference cannot
15446          be a constant.  */
15447       return false;
15448     }
15449   else
15450     *diff = 0;
15451
15452   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15453   return true;
15454 }
15455
15456 /* Simplify the floating point expression EXP when the sign of the
15457    result is not significant.  Return NULL_TREE if no simplification
15458    is possible.  */
15459
15460 tree
15461 fold_strip_sign_ops (tree exp)
15462 {
15463   tree arg0, arg1;
15464
15465   switch (TREE_CODE (exp))
15466     {
15467     case ABS_EXPR:
15468     case NEGATE_EXPR:
15469       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15470       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15471
15472     case MULT_EXPR:
15473     case RDIV_EXPR:
15474       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15475         return NULL_TREE;
15476       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15477       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15478       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15479         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15480                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
15481                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
15482       break;
15483
15484     case COMPOUND_EXPR:
15485       arg0 = TREE_OPERAND (exp, 0);
15486       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15487       if (arg1)
15488         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15489       break;
15490       
15491     case COND_EXPR:
15492       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15493       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15494       if (arg0 || arg1)
15495         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15496                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
15497                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
15498       break;
15499       
15500     case CALL_EXPR:
15501       {
15502         const enum built_in_function fcode = builtin_mathfn_code (exp);
15503         switch (fcode)
15504         {
15505         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15506           /* Strip copysign function call, return the 1st argument. */
15507           arg0 = CALL_EXPR_ARG (exp, 0);
15508           arg1 = CALL_EXPR_ARG (exp, 1);
15509           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15510
15511         default:
15512           /* Strip sign ops from the argument of "odd" math functions.  */
15513           if (negate_mathfn_p (fcode))
15514             {
15515               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15516               if (arg0)
15517                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
15518             }
15519           break;
15520         }
15521       }
15522       break;
15523
15524     default:
15525       break;
15526     }
15527   return NULL_TREE;
15528 }