OSDN Git Service

5a101f27451359f5f172d483cf761fa7d9e77db2
[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   gcc_assert (!flag_wrapv && !flag_trapv);
1016   if (fold_deferring_overflow_warnings > 0)
1017     {
1018       if (fold_deferred_overflow_warning == NULL
1019           || wc < fold_deferred_overflow_code)
1020         {
1021           fold_deferred_overflow_warning = gmsgid;
1022           fold_deferred_overflow_code = wc;
1023         }
1024     }
1025   else if (issue_strict_overflow_warning (wc))
1026     warning (OPT_Wstrict_overflow, gmsgid);
1027 }
1028 \f
1029 /* Return true if the built-in mathematical function specified by CODE
1030    is odd, i.e. -f(x) == f(-x).  */
1031
1032 static bool
1033 negate_mathfn_p (enum built_in_function code)
1034 {
1035   switch (code)
1036     {
1037     CASE_FLT_FN (BUILT_IN_ASIN):
1038     CASE_FLT_FN (BUILT_IN_ASINH):
1039     CASE_FLT_FN (BUILT_IN_ATAN):
1040     CASE_FLT_FN (BUILT_IN_ATANH):
1041     CASE_FLT_FN (BUILT_IN_CASIN):
1042     CASE_FLT_FN (BUILT_IN_CASINH):
1043     CASE_FLT_FN (BUILT_IN_CATAN):
1044     CASE_FLT_FN (BUILT_IN_CATANH):
1045     CASE_FLT_FN (BUILT_IN_CBRT):
1046     CASE_FLT_FN (BUILT_IN_CPROJ):
1047     CASE_FLT_FN (BUILT_IN_CSIN):
1048     CASE_FLT_FN (BUILT_IN_CSINH):
1049     CASE_FLT_FN (BUILT_IN_CTAN):
1050     CASE_FLT_FN (BUILT_IN_CTANH):
1051     CASE_FLT_FN (BUILT_IN_ERF):
1052     CASE_FLT_FN (BUILT_IN_LLROUND):
1053     CASE_FLT_FN (BUILT_IN_LROUND):
1054     CASE_FLT_FN (BUILT_IN_ROUND):
1055     CASE_FLT_FN (BUILT_IN_SIN):
1056     CASE_FLT_FN (BUILT_IN_SINH):
1057     CASE_FLT_FN (BUILT_IN_TAN):
1058     CASE_FLT_FN (BUILT_IN_TANH):
1059     CASE_FLT_FN (BUILT_IN_TRUNC):
1060       return true;
1061
1062     CASE_FLT_FN (BUILT_IN_LLRINT):
1063     CASE_FLT_FN (BUILT_IN_LRINT):
1064     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1065     CASE_FLT_FN (BUILT_IN_RINT):
1066       return !flag_rounding_math;
1067     
1068     default:
1069       break;
1070     }
1071   return false;
1072 }
1073
1074 /* Check whether we may negate an integer constant T without causing
1075    overflow.  */
1076
1077 bool
1078 may_negate_without_overflow_p (const_tree t)
1079 {
1080   unsigned HOST_WIDE_INT val;
1081   unsigned int prec;
1082   tree type;
1083
1084   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1085
1086   type = TREE_TYPE (t);
1087   if (TYPE_UNSIGNED (type))
1088     return false;
1089
1090   prec = TYPE_PRECISION (type);
1091   if (prec > HOST_BITS_PER_WIDE_INT)
1092     {
1093       if (TREE_INT_CST_LOW (t) != 0)
1094         return true;
1095       prec -= HOST_BITS_PER_WIDE_INT;
1096       val = TREE_INT_CST_HIGH (t);
1097     }
1098   else
1099     val = TREE_INT_CST_LOW (t);
1100   if (prec < HOST_BITS_PER_WIDE_INT)
1101     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1102   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1103 }
1104
1105 /* Determine whether an expression T can be cheaply negated using
1106    the function negate_expr without introducing undefined overflow.  */
1107
1108 static bool
1109 negate_expr_p (tree t)
1110 {
1111   tree type;
1112
1113   if (t == 0)
1114     return false;
1115
1116   type = TREE_TYPE (t);
1117
1118   STRIP_SIGN_NOPS (t);
1119   switch (TREE_CODE (t))
1120     {
1121     case INTEGER_CST:
1122       if (TYPE_OVERFLOW_WRAPS (type))
1123         return true;
1124
1125       /* Check that -CST will not overflow type.  */
1126       return may_negate_without_overflow_p (t);
1127     case BIT_NOT_EXPR:
1128       return (INTEGRAL_TYPE_P (type)
1129               && TYPE_OVERFLOW_WRAPS (type));
1130
1131     case FIXED_CST:
1132     case REAL_CST:
1133     case NEGATE_EXPR:
1134       return true;
1135
1136     case COMPLEX_CST:
1137       return negate_expr_p (TREE_REALPART (t))
1138              && negate_expr_p (TREE_IMAGPART (t));
1139
1140     case COMPLEX_EXPR:
1141       return negate_expr_p (TREE_OPERAND (t, 0))
1142              && negate_expr_p (TREE_OPERAND (t, 1));
1143
1144     case CONJ_EXPR:
1145       return negate_expr_p (TREE_OPERAND (t, 0));
1146
1147     case PLUS_EXPR:
1148       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1149           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1150         return false;
1151       /* -(A + B) -> (-B) - A.  */
1152       if (negate_expr_p (TREE_OPERAND (t, 1))
1153           && reorder_operands_p (TREE_OPERAND (t, 0),
1154                                  TREE_OPERAND (t, 1)))
1155         return true;
1156       /* -(A + B) -> (-A) - B.  */
1157       return negate_expr_p (TREE_OPERAND (t, 0));
1158
1159     case MINUS_EXPR:
1160       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1161       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1162              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1163              && reorder_operands_p (TREE_OPERAND (t, 0),
1164                                     TREE_OPERAND (t, 1));
1165
1166     case MULT_EXPR:
1167       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1168         break;
1169
1170       /* Fall through.  */
1171
1172     case RDIV_EXPR:
1173       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1174         return negate_expr_p (TREE_OPERAND (t, 1))
1175                || negate_expr_p (TREE_OPERAND (t, 0));
1176       break;
1177
1178     case TRUNC_DIV_EXPR:
1179     case ROUND_DIV_EXPR:
1180     case FLOOR_DIV_EXPR:
1181     case CEIL_DIV_EXPR:
1182     case EXACT_DIV_EXPR:
1183       /* In general we can't negate A / B, because if A is INT_MIN and
1184          B is 1, we may turn this into INT_MIN / -1 which is undefined
1185          and actually traps on some architectures.  But if overflow is
1186          undefined, we can negate, because - (INT_MIN / 1) is an
1187          overflow.  */
1188       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1189           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1190         break;
1191       return negate_expr_p (TREE_OPERAND (t, 1))
1192              || negate_expr_p (TREE_OPERAND (t, 0));
1193
1194     case NOP_EXPR:
1195       /* Negate -((double)float) as (double)(-float).  */
1196       if (TREE_CODE (type) == REAL_TYPE)
1197         {
1198           tree tem = strip_float_extensions (t);
1199           if (tem != t)
1200             return negate_expr_p (tem);
1201         }
1202       break;
1203
1204     case CALL_EXPR:
1205       /* Negate -f(x) as f(-x).  */
1206       if (negate_mathfn_p (builtin_mathfn_code (t)))
1207         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1208       break;
1209
1210     case RSHIFT_EXPR:
1211       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1212       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1213         {
1214           tree op1 = TREE_OPERAND (t, 1);
1215           if (TREE_INT_CST_HIGH (op1) == 0
1216               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1217                  == TREE_INT_CST_LOW (op1))
1218             return true;
1219         }
1220       break;
1221
1222     default:
1223       break;
1224     }
1225   return false;
1226 }
1227
1228 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1229    simplification is possible.
1230    If negate_expr_p would return true for T, NULL_TREE will never be
1231    returned.  */
1232
1233 static tree
1234 fold_negate_expr (tree t)
1235 {
1236   tree type = TREE_TYPE (t);
1237   tree tem;
1238
1239   switch (TREE_CODE (t))
1240     {
1241     /* Convert - (~A) to A + 1.  */
1242     case BIT_NOT_EXPR:
1243       if (INTEGRAL_TYPE_P (type))
1244         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1245                             build_int_cst (type, 1));
1246       break;
1247       
1248     case INTEGER_CST:
1249       tem = fold_negate_const (t, type);
1250       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1251           || !TYPE_OVERFLOW_TRAPS (type))
1252         return tem;
1253       break;
1254
1255     case REAL_CST:
1256       tem = fold_negate_const (t, type);
1257       /* Two's complement FP formats, such as c4x, may overflow.  */
1258       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1259         return tem;
1260       break;
1261
1262     case FIXED_CST:
1263       tem = fold_negate_const (t, type);
1264       return tem;
1265
1266     case COMPLEX_CST:
1267       {
1268         tree rpart = negate_expr (TREE_REALPART (t));
1269         tree ipart = negate_expr (TREE_IMAGPART (t));
1270
1271         if ((TREE_CODE (rpart) == REAL_CST
1272              && TREE_CODE (ipart) == REAL_CST)
1273             || (TREE_CODE (rpart) == INTEGER_CST
1274                 && TREE_CODE (ipart) == INTEGER_CST))
1275           return build_complex (type, rpart, ipart);
1276       }
1277       break;
1278
1279     case COMPLEX_EXPR:
1280       if (negate_expr_p (t))
1281         return fold_build2 (COMPLEX_EXPR, type,
1282                             fold_negate_expr (TREE_OPERAND (t, 0)),
1283                             fold_negate_expr (TREE_OPERAND (t, 1)));
1284       break;
1285       
1286     case CONJ_EXPR:
1287       if (negate_expr_p (t))
1288         return fold_build1 (CONJ_EXPR, type,
1289                             fold_negate_expr (TREE_OPERAND (t, 0)));
1290       break;
1291
1292     case NEGATE_EXPR:
1293       return TREE_OPERAND (t, 0);
1294
1295     case PLUS_EXPR:
1296       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1297           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1298         {
1299           /* -(A + B) -> (-B) - A.  */
1300           if (negate_expr_p (TREE_OPERAND (t, 1))
1301               && reorder_operands_p (TREE_OPERAND (t, 0),
1302                                      TREE_OPERAND (t, 1)))
1303             {
1304               tem = negate_expr (TREE_OPERAND (t, 1));
1305               return fold_build2 (MINUS_EXPR, type,
1306                                   tem, TREE_OPERAND (t, 0));
1307             }
1308
1309           /* -(A + B) -> (-A) - B.  */
1310           if (negate_expr_p (TREE_OPERAND (t, 0)))
1311             {
1312               tem = negate_expr (TREE_OPERAND (t, 0));
1313               return fold_build2 (MINUS_EXPR, type,
1314                                   tem, TREE_OPERAND (t, 1));
1315             }
1316         }
1317       break;
1318
1319     case MINUS_EXPR:
1320       /* - (A - B) -> B - A  */
1321       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1322           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1323           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1324         return fold_build2 (MINUS_EXPR, type,
1325                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1326       break;
1327
1328     case MULT_EXPR:
1329       if (TYPE_UNSIGNED (type))
1330         break;
1331
1332       /* Fall through.  */
1333
1334     case RDIV_EXPR:
1335       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1336         {
1337           tem = TREE_OPERAND (t, 1);
1338           if (negate_expr_p (tem))
1339             return fold_build2 (TREE_CODE (t), type,
1340                                 TREE_OPERAND (t, 0), negate_expr (tem));
1341           tem = TREE_OPERAND (t, 0);
1342           if (negate_expr_p (tem))
1343             return fold_build2 (TREE_CODE (t), type,
1344                                 negate_expr (tem), TREE_OPERAND (t, 1));
1345         }
1346       break;
1347
1348     case TRUNC_DIV_EXPR:
1349     case ROUND_DIV_EXPR:
1350     case FLOOR_DIV_EXPR:
1351     case CEIL_DIV_EXPR:
1352     case EXACT_DIV_EXPR:
1353       /* In general we can't negate A / B, because if A is INT_MIN and
1354          B is 1, we may turn this into INT_MIN / -1 which is undefined
1355          and actually traps on some architectures.  But if overflow is
1356          undefined, we can negate, because - (INT_MIN / 1) is an
1357          overflow.  */
1358       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1359         {
1360           const char * const warnmsg = G_("assuming signed overflow does not "
1361                                           "occur when negating a division");
1362           tem = TREE_OPERAND (t, 1);
1363           if (negate_expr_p (tem))
1364             {
1365               if (INTEGRAL_TYPE_P (type)
1366                   && (TREE_CODE (tem) != INTEGER_CST
1367                       || integer_onep (tem)))
1368                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1369               return fold_build2 (TREE_CODE (t), type,
1370                                   TREE_OPERAND (t, 0), negate_expr (tem));
1371             }
1372           tem = TREE_OPERAND (t, 0);
1373           if (negate_expr_p (tem))
1374             {
1375               if (INTEGRAL_TYPE_P (type)
1376                   && (TREE_CODE (tem) != INTEGER_CST
1377                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1378                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1379               return fold_build2 (TREE_CODE (t), type,
1380                                   negate_expr (tem), TREE_OPERAND (t, 1));
1381             }
1382         }
1383       break;
1384
1385     case NOP_EXPR:
1386       /* Convert -((double)float) into (double)(-float).  */
1387       if (TREE_CODE (type) == REAL_TYPE)
1388         {
1389           tem = strip_float_extensions (t);
1390           if (tem != t && negate_expr_p (tem))
1391             return fold_convert (type, negate_expr (tem));
1392         }
1393       break;
1394
1395     case CALL_EXPR:
1396       /* Negate -f(x) as f(-x).  */
1397       if (negate_mathfn_p (builtin_mathfn_code (t))
1398           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1399         {
1400           tree fndecl, arg;
1401
1402           fndecl = get_callee_fndecl (t);
1403           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1404           return build_call_expr (fndecl, 1, arg);
1405         }
1406       break;
1407
1408     case RSHIFT_EXPR:
1409       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1410       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1411         {
1412           tree op1 = TREE_OPERAND (t, 1);
1413           if (TREE_INT_CST_HIGH (op1) == 0
1414               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1415                  == TREE_INT_CST_LOW (op1))
1416             {
1417               tree ntype = TYPE_UNSIGNED (type)
1418                            ? signed_type_for (type)
1419                            : unsigned_type_for (type);
1420               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1421               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1422               return fold_convert (type, temp);
1423             }
1424         }
1425       break;
1426
1427     default:
1428       break;
1429     }
1430
1431   return NULL_TREE;
1432 }
1433
1434 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1435    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1436    return NULL_TREE. */
1437
1438 static tree
1439 negate_expr (tree t)
1440 {
1441   tree type, tem;
1442
1443   if (t == NULL_TREE)
1444     return NULL_TREE;
1445
1446   type = TREE_TYPE (t);
1447   STRIP_SIGN_NOPS (t);
1448
1449   tem = fold_negate_expr (t);
1450   if (!tem)
1451     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1452   return fold_convert (type, tem);
1453 }
1454 \f
1455 /* Split a tree IN into a constant, literal and variable parts that could be
1456    combined with CODE to make IN.  "constant" means an expression with
1457    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1458    commutative arithmetic operation.  Store the constant part into *CONP,
1459    the literal in *LITP and return the variable part.  If a part isn't
1460    present, set it to null.  If the tree does not decompose in this way,
1461    return the entire tree as the variable part and the other parts as null.
1462
1463    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1464    case, we negate an operand that was subtracted.  Except if it is a
1465    literal for which we use *MINUS_LITP instead.
1466
1467    If NEGATE_P is true, we are negating all of IN, again except a literal
1468    for which we use *MINUS_LITP instead.
1469
1470    If IN is itself a literal or constant, return it as appropriate.
1471
1472    Note that we do not guarantee that any of the three values will be the
1473    same type as IN, but they will have the same signedness and mode.  */
1474
1475 static tree
1476 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1477             tree *minus_litp, int negate_p)
1478 {
1479   tree var = 0;
1480
1481   *conp = 0;
1482   *litp = 0;
1483   *minus_litp = 0;
1484
1485   /* Strip any conversions that don't change the machine mode or signedness.  */
1486   STRIP_SIGN_NOPS (in);
1487
1488   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1489       || TREE_CODE (in) == FIXED_CST)
1490     *litp = in;
1491   else if (TREE_CODE (in) == code
1492            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1493                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1494                /* We can associate addition and subtraction together (even
1495                   though the C standard doesn't say so) for integers because
1496                   the value is not affected.  For reals, the value might be
1497                   affected, so we can't.  */
1498                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1499                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1500     {
1501       tree op0 = TREE_OPERAND (in, 0);
1502       tree op1 = TREE_OPERAND (in, 1);
1503       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1504       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1505
1506       /* First see if either of the operands is a literal, then a constant.  */
1507       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1508           || TREE_CODE (op0) == FIXED_CST)
1509         *litp = op0, op0 = 0;
1510       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1511                || TREE_CODE (op1) == FIXED_CST)
1512         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1513
1514       if (op0 != 0 && TREE_CONSTANT (op0))
1515         *conp = op0, op0 = 0;
1516       else if (op1 != 0 && TREE_CONSTANT (op1))
1517         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1518
1519       /* If we haven't dealt with either operand, this is not a case we can
1520          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1521       if (op0 != 0 && op1 != 0)
1522         var = in;
1523       else if (op0 != 0)
1524         var = op0;
1525       else
1526         var = op1, neg_var_p = neg1_p;
1527
1528       /* Now do any needed negations.  */
1529       if (neg_litp_p)
1530         *minus_litp = *litp, *litp = 0;
1531       if (neg_conp_p)
1532         *conp = negate_expr (*conp);
1533       if (neg_var_p)
1534         var = negate_expr (var);
1535     }
1536   else if (TREE_CONSTANT (in))
1537     *conp = in;
1538   else
1539     var = in;
1540
1541   if (negate_p)
1542     {
1543       if (*litp)
1544         *minus_litp = *litp, *litp = 0;
1545       else if (*minus_litp)
1546         *litp = *minus_litp, *minus_litp = 0;
1547       *conp = negate_expr (*conp);
1548       var = negate_expr (var);
1549     }
1550
1551   return var;
1552 }
1553
1554 /* Re-associate trees split by the above function.  T1 and T2 are either
1555    expressions to associate or null.  Return the new expression, if any.  If
1556    we build an operation, do it in TYPE and with CODE.  */
1557
1558 static tree
1559 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1560 {
1561   if (t1 == 0)
1562     return t2;
1563   else if (t2 == 0)
1564     return t1;
1565
1566   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1567      try to fold this since we will have infinite recursion.  But do
1568      deal with any NEGATE_EXPRs.  */
1569   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1570       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1571     {
1572       if (code == PLUS_EXPR)
1573         {
1574           if (TREE_CODE (t1) == NEGATE_EXPR)
1575             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1576                            fold_convert (type, TREE_OPERAND (t1, 0)));
1577           else if (TREE_CODE (t2) == NEGATE_EXPR)
1578             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1579                            fold_convert (type, TREE_OPERAND (t2, 0)));
1580           else if (integer_zerop (t2))
1581             return fold_convert (type, t1);
1582         }
1583       else if (code == MINUS_EXPR)
1584         {
1585           if (integer_zerop (t2))
1586             return fold_convert (type, t1);
1587         }
1588
1589       return build2 (code, type, fold_convert (type, t1),
1590                      fold_convert (type, t2));
1591     }
1592
1593   return fold_build2 (code, type, fold_convert (type, t1),
1594                       fold_convert (type, t2));
1595 }
1596 \f
1597 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1598    for use in int_const_binop, size_binop and size_diffop.  */
1599
1600 static bool
1601 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1602 {
1603   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1604     return false;
1605   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1606     return false;
1607
1608   switch (code)
1609     {
1610     case LSHIFT_EXPR:
1611     case RSHIFT_EXPR:
1612     case LROTATE_EXPR:
1613     case RROTATE_EXPR:
1614       return true;
1615
1616     default:
1617       break;
1618     }
1619
1620   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1621          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1622          && TYPE_MODE (type1) == TYPE_MODE (type2);
1623 }
1624
1625
1626 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1627    to produce a new constant.  Return NULL_TREE if we don't know how
1628    to evaluate CODE at compile-time.
1629
1630    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1631
1632 tree
1633 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1634 {
1635   unsigned HOST_WIDE_INT int1l, int2l;
1636   HOST_WIDE_INT int1h, int2h;
1637   unsigned HOST_WIDE_INT low;
1638   HOST_WIDE_INT hi;
1639   unsigned HOST_WIDE_INT garbagel;
1640   HOST_WIDE_INT garbageh;
1641   tree t;
1642   tree type = TREE_TYPE (arg1);
1643   int uns = TYPE_UNSIGNED (type);
1644   int is_sizetype
1645     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1646   int overflow = 0;
1647
1648   int1l = TREE_INT_CST_LOW (arg1);
1649   int1h = TREE_INT_CST_HIGH (arg1);
1650   int2l = TREE_INT_CST_LOW (arg2);
1651   int2h = TREE_INT_CST_HIGH (arg2);
1652
1653   switch (code)
1654     {
1655     case BIT_IOR_EXPR:
1656       low = int1l | int2l, hi = int1h | int2h;
1657       break;
1658
1659     case BIT_XOR_EXPR:
1660       low = int1l ^ int2l, hi = int1h ^ int2h;
1661       break;
1662
1663     case BIT_AND_EXPR:
1664       low = int1l & int2l, hi = int1h & int2h;
1665       break;
1666
1667     case RSHIFT_EXPR:
1668       int2l = -int2l;
1669     case LSHIFT_EXPR:
1670       /* It's unclear from the C standard whether shifts can overflow.
1671          The following code ignores overflow; perhaps a C standard
1672          interpretation ruling is needed.  */
1673       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1674                      &low, &hi, !uns);
1675       break;
1676
1677     case RROTATE_EXPR:
1678       int2l = - int2l;
1679     case LROTATE_EXPR:
1680       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1681                       &low, &hi);
1682       break;
1683
1684     case PLUS_EXPR:
1685       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1686       break;
1687
1688     case MINUS_EXPR:
1689       neg_double (int2l, int2h, &low, &hi);
1690       add_double (int1l, int1h, low, hi, &low, &hi);
1691       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1692       break;
1693
1694     case MULT_EXPR:
1695       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1696       break;
1697
1698     case TRUNC_DIV_EXPR:
1699     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1700     case EXACT_DIV_EXPR:
1701       /* This is a shortcut for a common special case.  */
1702       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1703           && !TREE_OVERFLOW (arg1)
1704           && !TREE_OVERFLOW (arg2)
1705           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1706         {
1707           if (code == CEIL_DIV_EXPR)
1708             int1l += int2l - 1;
1709
1710           low = int1l / int2l, hi = 0;
1711           break;
1712         }
1713
1714       /* ... fall through ...  */
1715
1716     case ROUND_DIV_EXPR:
1717       if (int2h == 0 && int2l == 0)
1718         return NULL_TREE;
1719       if (int2h == 0 && int2l == 1)
1720         {
1721           low = int1l, hi = int1h;
1722           break;
1723         }
1724       if (int1l == int2l && int1h == int2h
1725           && ! (int1l == 0 && int1h == 0))
1726         {
1727           low = 1, hi = 0;
1728           break;
1729         }
1730       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1731                                        &low, &hi, &garbagel, &garbageh);
1732       break;
1733
1734     case TRUNC_MOD_EXPR:
1735     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1736       /* This is a shortcut for a common special case.  */
1737       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1738           && !TREE_OVERFLOW (arg1)
1739           && !TREE_OVERFLOW (arg2)
1740           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1741         {
1742           if (code == CEIL_MOD_EXPR)
1743             int1l += int2l - 1;
1744           low = int1l % int2l, hi = 0;
1745           break;
1746         }
1747
1748       /* ... fall through ...  */
1749
1750     case ROUND_MOD_EXPR:
1751       if (int2h == 0 && int2l == 0)
1752         return NULL_TREE;
1753       overflow = div_and_round_double (code, uns,
1754                                        int1l, int1h, int2l, int2h,
1755                                        &garbagel, &garbageh, &low, &hi);
1756       break;
1757
1758     case MIN_EXPR:
1759     case MAX_EXPR:
1760       if (uns)
1761         low = (((unsigned HOST_WIDE_INT) int1h
1762                 < (unsigned HOST_WIDE_INT) int2h)
1763                || (((unsigned HOST_WIDE_INT) int1h
1764                     == (unsigned HOST_WIDE_INT) int2h)
1765                    && int1l < int2l));
1766       else
1767         low = (int1h < int2h
1768                || (int1h == int2h && int1l < int2l));
1769
1770       if (low == (code == MIN_EXPR))
1771         low = int1l, hi = int1h;
1772       else
1773         low = int2l, hi = int2h;
1774       break;
1775
1776     default:
1777       return NULL_TREE;
1778     }
1779
1780   if (notrunc)
1781     {
1782       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1783
1784       /* Propagate overflow flags ourselves.  */
1785       if (((!uns || is_sizetype) && overflow)
1786           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1787         {
1788           t = copy_node (t);
1789           TREE_OVERFLOW (t) = 1;
1790         }
1791     }
1792   else
1793     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1794                                ((!uns || is_sizetype) && overflow)
1795                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1796
1797   return t;
1798 }
1799
1800 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1801    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1802    are the same kind of constant and the same machine mode.  Return zero if
1803    combining the constants is not allowed in the current operating mode.
1804
1805    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1806
1807 static tree
1808 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1809 {
1810   /* Sanity check for the recursive cases.  */
1811   if (!arg1 || !arg2)
1812     return NULL_TREE;
1813
1814   STRIP_NOPS (arg1);
1815   STRIP_NOPS (arg2);
1816
1817   if (TREE_CODE (arg1) == INTEGER_CST)
1818     return int_const_binop (code, arg1, arg2, notrunc);
1819
1820   if (TREE_CODE (arg1) == REAL_CST)
1821     {
1822       enum machine_mode mode;
1823       REAL_VALUE_TYPE d1;
1824       REAL_VALUE_TYPE d2;
1825       REAL_VALUE_TYPE value;
1826       REAL_VALUE_TYPE result;
1827       bool inexact;
1828       tree t, type;
1829
1830       /* The following codes are handled by real_arithmetic.  */
1831       switch (code)
1832         {
1833         case PLUS_EXPR:
1834         case MINUS_EXPR:
1835         case MULT_EXPR:
1836         case RDIV_EXPR:
1837         case MIN_EXPR:
1838         case MAX_EXPR:
1839           break;
1840
1841         default:
1842           return NULL_TREE;
1843         }
1844
1845       d1 = TREE_REAL_CST (arg1);
1846       d2 = TREE_REAL_CST (arg2);
1847
1848       type = TREE_TYPE (arg1);
1849       mode = TYPE_MODE (type);
1850
1851       /* Don't perform operation if we honor signaling NaNs and
1852          either operand is a NaN.  */
1853       if (HONOR_SNANS (mode)
1854           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1855         return NULL_TREE;
1856
1857       /* Don't perform operation if it would raise a division
1858          by zero exception.  */
1859       if (code == RDIV_EXPR
1860           && REAL_VALUES_EQUAL (d2, dconst0)
1861           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1862         return NULL_TREE;
1863
1864       /* If either operand is a NaN, just return it.  Otherwise, set up
1865          for floating-point trap; we return an overflow.  */
1866       if (REAL_VALUE_ISNAN (d1))
1867         return arg1;
1868       else if (REAL_VALUE_ISNAN (d2))
1869         return arg2;
1870
1871       inexact = real_arithmetic (&value, code, &d1, &d2);
1872       real_convert (&result, mode, &value);
1873
1874       /* Don't constant fold this floating point operation if
1875          the result has overflowed and flag_trapping_math.  */
1876       if (flag_trapping_math
1877           && MODE_HAS_INFINITIES (mode)
1878           && REAL_VALUE_ISINF (result)
1879           && !REAL_VALUE_ISINF (d1)
1880           && !REAL_VALUE_ISINF (d2))
1881         return NULL_TREE;
1882
1883       /* Don't constant fold this floating point operation if the
1884          result may dependent upon the run-time rounding mode and
1885          flag_rounding_math is set, or if GCC's software emulation
1886          is unable to accurately represent the result.  */
1887       if ((flag_rounding_math
1888            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1889                && !flag_unsafe_math_optimizations))
1890           && (inexact || !real_identical (&result, &value)))
1891         return NULL_TREE;
1892
1893       t = build_real (type, result);
1894
1895       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1896       return t;
1897     }
1898
1899   if (TREE_CODE (arg1) == FIXED_CST)
1900     {
1901       FIXED_VALUE_TYPE f1;
1902       FIXED_VALUE_TYPE f2;
1903       FIXED_VALUE_TYPE result;
1904       tree t, type;
1905       int sat_p;
1906       bool overflow_p;
1907
1908       /* The following codes are handled by fixed_arithmetic.  */
1909       switch (code)
1910         {
1911         case PLUS_EXPR:
1912         case MINUS_EXPR:
1913         case MULT_EXPR:
1914         case TRUNC_DIV_EXPR:
1915           f2 = TREE_FIXED_CST (arg2);
1916           break;
1917
1918         case LSHIFT_EXPR:
1919         case RSHIFT_EXPR:
1920           f2.data.high = TREE_INT_CST_HIGH (arg2);
1921           f2.data.low = TREE_INT_CST_LOW (arg2);
1922           f2.mode = SImode;
1923           break;
1924
1925         default:
1926           return NULL_TREE;
1927         }
1928
1929       f1 = TREE_FIXED_CST (arg1);
1930       type = TREE_TYPE (arg1);
1931       sat_p = TYPE_SATURATING (type);
1932       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1933       t = build_fixed (type, result);
1934       /* Propagate overflow flags.  */
1935       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1936         {
1937           TREE_OVERFLOW (t) = 1;
1938           TREE_CONSTANT_OVERFLOW (t) = 1;
1939         }
1940       else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1941         TREE_CONSTANT_OVERFLOW (t) = 1;
1942       return t;
1943     }
1944
1945   if (TREE_CODE (arg1) == COMPLEX_CST)
1946     {
1947       tree type = TREE_TYPE (arg1);
1948       tree r1 = TREE_REALPART (arg1);
1949       tree i1 = TREE_IMAGPART (arg1);
1950       tree r2 = TREE_REALPART (arg2);
1951       tree i2 = TREE_IMAGPART (arg2);
1952       tree real, imag;
1953
1954       switch (code)
1955         {
1956         case PLUS_EXPR:
1957         case MINUS_EXPR:
1958           real = const_binop (code, r1, r2, notrunc);
1959           imag = const_binop (code, i1, i2, notrunc);
1960           break;
1961
1962         case MULT_EXPR:
1963           real = const_binop (MINUS_EXPR,
1964                               const_binop (MULT_EXPR, r1, r2, notrunc),
1965                               const_binop (MULT_EXPR, i1, i2, notrunc),
1966                               notrunc);
1967           imag = const_binop (PLUS_EXPR,
1968                               const_binop (MULT_EXPR, r1, i2, notrunc),
1969                               const_binop (MULT_EXPR, i1, r2, notrunc),
1970                               notrunc);
1971           break;
1972
1973         case RDIV_EXPR:
1974           {
1975             tree magsquared
1976               = const_binop (PLUS_EXPR,
1977                              const_binop (MULT_EXPR, r2, r2, notrunc),
1978                              const_binop (MULT_EXPR, i2, i2, notrunc),
1979                              notrunc);
1980             tree t1
1981               = const_binop (PLUS_EXPR,
1982                              const_binop (MULT_EXPR, r1, r2, notrunc),
1983                              const_binop (MULT_EXPR, i1, i2, notrunc),
1984                              notrunc);
1985             tree t2
1986               = const_binop (MINUS_EXPR,
1987                              const_binop (MULT_EXPR, i1, r2, notrunc),
1988                              const_binop (MULT_EXPR, r1, i2, notrunc),
1989                              notrunc);
1990
1991             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1992               code = TRUNC_DIV_EXPR;
1993
1994             real = const_binop (code, t1, magsquared, notrunc);
1995             imag = const_binop (code, t2, magsquared, notrunc);
1996           }
1997           break;
1998
1999         default:
2000           return NULL_TREE;
2001         }
2002
2003       if (real && imag)
2004         return build_complex (type, real, imag);
2005     }
2006
2007   return NULL_TREE;
2008 }
2009
2010 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2011    indicates which particular sizetype to create.  */
2012
2013 tree
2014 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2015 {
2016   return build_int_cst (sizetype_tab[(int) kind], number);
2017 }
2018 \f
2019 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2020    is a tree code.  The type of the result is taken from the operands.
2021    Both must be equivalent integer types, ala int_binop_types_match_p.
2022    If the operands are constant, so is the result.  */
2023
2024 tree
2025 size_binop (enum tree_code code, tree arg0, tree arg1)
2026 {
2027   tree type = TREE_TYPE (arg0);
2028
2029   if (arg0 == error_mark_node || arg1 == error_mark_node)
2030     return error_mark_node;
2031
2032   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2033                                        TREE_TYPE (arg1)));
2034
2035   /* Handle the special case of two integer constants faster.  */
2036   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2037     {
2038       /* And some specific cases even faster than that.  */
2039       if (code == PLUS_EXPR)
2040         {
2041           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2042             return arg1;
2043           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2044             return arg0;
2045         }
2046       else if (code == MINUS_EXPR)
2047         {
2048           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2049             return arg0;
2050         }
2051       else if (code == MULT_EXPR)
2052         {
2053           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2054             return arg1;
2055         }
2056
2057       /* Handle general case of two integer constants.  */
2058       return int_const_binop (code, arg0, arg1, 0);
2059     }
2060
2061   return fold_build2 (code, type, arg0, arg1);
2062 }
2063
2064 /* Given two values, either both of sizetype or both of bitsizetype,
2065    compute the difference between the two values.  Return the value
2066    in signed type corresponding to the type of the operands.  */
2067
2068 tree
2069 size_diffop (tree arg0, tree arg1)
2070 {
2071   tree type = TREE_TYPE (arg0);
2072   tree ctype;
2073
2074   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2075                                        TREE_TYPE (arg1)));
2076
2077   /* If the type is already signed, just do the simple thing.  */
2078   if (!TYPE_UNSIGNED (type))
2079     return size_binop (MINUS_EXPR, arg0, arg1);
2080
2081   if (type == sizetype)
2082     ctype = ssizetype;
2083   else if (type == bitsizetype)
2084     ctype = sbitsizetype;
2085   else
2086     ctype = signed_type_for (type);
2087
2088   /* If either operand is not a constant, do the conversions to the signed
2089      type and subtract.  The hardware will do the right thing with any
2090      overflow in the subtraction.  */
2091   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2092     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2093                        fold_convert (ctype, arg1));
2094
2095   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2096      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2097      overflow) and negate (which can't either).  Special-case a result
2098      of zero while we're here.  */
2099   if (tree_int_cst_equal (arg0, arg1))
2100     return build_int_cst (ctype, 0);
2101   else if (tree_int_cst_lt (arg1, arg0))
2102     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2103   else
2104     return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2105                        fold_convert (ctype, size_binop (MINUS_EXPR,
2106                                                         arg1, arg0)));
2107 }
2108 \f
2109 /* A subroutine of fold_convert_const handling conversions of an
2110    INTEGER_CST to another integer type.  */
2111
2112 static tree
2113 fold_convert_const_int_from_int (tree type, const_tree arg1)
2114 {
2115   tree t;
2116
2117   /* Given an integer constant, make new constant with new type,
2118      appropriately sign-extended or truncated.  */
2119   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2120                              TREE_INT_CST_HIGH (arg1),
2121                              /* Don't set the overflow when
2122                                 converting from a pointer,  */
2123                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2124                              /* or to a sizetype with same signedness
2125                                 and the precision is unchanged.
2126                                 ???  sizetype is always sign-extended,
2127                                 but its signedness depends on the
2128                                 frontend.  Thus we see spurious overflows
2129                                 here if we do not check this.  */
2130                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2131                                    == TYPE_PRECISION (type))
2132                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2133                                       == TYPE_UNSIGNED (type))
2134                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2135                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2136                                       || (TREE_CODE (type) == INTEGER_TYPE
2137                                           && TYPE_IS_SIZETYPE (type)))),
2138                              (TREE_INT_CST_HIGH (arg1) < 0
2139                               && (TYPE_UNSIGNED (type)
2140                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2141                              | TREE_OVERFLOW (arg1));
2142
2143   return t;
2144 }
2145
2146 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2147    to an integer type.  */
2148
2149 static tree
2150 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2151 {
2152   int overflow = 0;
2153   tree t;
2154
2155   /* The following code implements the floating point to integer
2156      conversion rules required by the Java Language Specification,
2157      that IEEE NaNs are mapped to zero and values that overflow
2158      the target precision saturate, i.e. values greater than
2159      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2160      are mapped to INT_MIN.  These semantics are allowed by the
2161      C and C++ standards that simply state that the behavior of
2162      FP-to-integer conversion is unspecified upon overflow.  */
2163
2164   HOST_WIDE_INT high, low;
2165   REAL_VALUE_TYPE r;
2166   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2167
2168   switch (code)
2169     {
2170     case FIX_TRUNC_EXPR:
2171       real_trunc (&r, VOIDmode, &x);
2172       break;
2173
2174     default:
2175       gcc_unreachable ();
2176     }
2177
2178   /* If R is NaN, return zero and show we have an overflow.  */
2179   if (REAL_VALUE_ISNAN (r))
2180     {
2181       overflow = 1;
2182       high = 0;
2183       low = 0;
2184     }
2185
2186   /* See if R is less than the lower bound or greater than the
2187      upper bound.  */
2188
2189   if (! overflow)
2190     {
2191       tree lt = TYPE_MIN_VALUE (type);
2192       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2193       if (REAL_VALUES_LESS (r, l))
2194         {
2195           overflow = 1;
2196           high = TREE_INT_CST_HIGH (lt);
2197           low = TREE_INT_CST_LOW (lt);
2198         }
2199     }
2200
2201   if (! overflow)
2202     {
2203       tree ut = TYPE_MAX_VALUE (type);
2204       if (ut)
2205         {
2206           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2207           if (REAL_VALUES_LESS (u, r))
2208             {
2209               overflow = 1;
2210               high = TREE_INT_CST_HIGH (ut);
2211               low = TREE_INT_CST_LOW (ut);
2212             }
2213         }
2214     }
2215
2216   if (! overflow)
2217     REAL_VALUE_TO_INT (&low, &high, r);
2218
2219   t = force_fit_type_double (type, low, high, -1,
2220                              overflow | TREE_OVERFLOW (arg1));
2221   return t;
2222 }
2223
2224 /* A subroutine of fold_convert_const handling conversions of a
2225    FIXED_CST to an integer type.  */
2226
2227 static tree
2228 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2229 {
2230   tree t;
2231   double_int temp, temp_trunc;
2232   unsigned int mode;
2233
2234   /* Right shift FIXED_CST to temp by fbit.  */
2235   temp = TREE_FIXED_CST (arg1).data;
2236   mode = TREE_FIXED_CST (arg1).mode;
2237   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2238     {
2239       lshift_double (temp.low, temp.high,
2240                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2241                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2242
2243       /* Left shift temp to temp_trunc by fbit.  */
2244       lshift_double (temp.low, temp.high,
2245                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2246                      &temp_trunc.low, &temp_trunc.high,
2247                      SIGNED_FIXED_POINT_MODE_P (mode));
2248     }
2249   else
2250     {
2251       temp.low = 0;
2252       temp.high = 0;
2253       temp_trunc.low = 0;
2254       temp_trunc.high = 0;
2255     }
2256
2257   /* If FIXED_CST is negative, we need to round the value toward 0.
2258      By checking if the fractional bits are not zero to add 1 to temp.  */
2259   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2260       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2261     {
2262       double_int one;
2263       one.low = 1;
2264       one.high = 0;
2265       temp = double_int_add (temp, one);
2266     }
2267
2268   /* Given a fixed-point constant, make new constant with new type,
2269      appropriately sign-extended or truncated.  */
2270   t = force_fit_type_double (type, temp.low, temp.high, -1,
2271                              (temp.high < 0
2272                               && (TYPE_UNSIGNED (type)
2273                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2274                              | TREE_OVERFLOW (arg1));
2275
2276   return t;
2277 }
2278
2279 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2280    to another floating point type.  */
2281
2282 static tree
2283 fold_convert_const_real_from_real (tree type, const_tree arg1)
2284 {
2285   REAL_VALUE_TYPE value;
2286   tree t;
2287
2288   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2289   t = build_real (type, value);
2290
2291   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2292   return t;
2293 }
2294
2295 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2296    to a floating point type.  */
2297
2298 static tree
2299 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2300 {
2301   REAL_VALUE_TYPE value;
2302   tree t;
2303
2304   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2305   t = build_real (type, value);
2306
2307   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2308   TREE_CONSTANT_OVERFLOW (t)
2309     = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
2310   return t;
2311 }
2312
2313 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2314    to another fixed-point type.  */
2315
2316 static tree
2317 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2318 {
2319   FIXED_VALUE_TYPE value;
2320   tree t;
2321   bool overflow_p;
2322
2323   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2324                               TYPE_SATURATING (type));
2325   t = build_fixed (type, value);
2326
2327   /* Propagate overflow flags.  */
2328   if (overflow_p | TREE_OVERFLOW (arg1))
2329     {
2330       TREE_OVERFLOW (t) = 1;
2331       TREE_CONSTANT_OVERFLOW (t) = 1;
2332     }
2333   else if (TREE_CONSTANT_OVERFLOW (arg1))
2334     TREE_CONSTANT_OVERFLOW (t) = 1;
2335   return t;
2336 }
2337
2338 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2339    to a fixed-point type.  */
2340
2341 static tree
2342 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2343 {
2344   FIXED_VALUE_TYPE value;
2345   tree t;
2346   bool overflow_p;
2347
2348   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2349                                        TREE_INT_CST (arg1),
2350                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2351                                        TYPE_SATURATING (type));
2352   t = build_fixed (type, value);
2353
2354   /* Propagate overflow flags.  */
2355   if (overflow_p | TREE_OVERFLOW (arg1))
2356     {
2357       TREE_OVERFLOW (t) = 1;
2358       TREE_CONSTANT_OVERFLOW (t) = 1;
2359     }
2360   else if (TREE_CONSTANT_OVERFLOW (arg1))
2361     TREE_CONSTANT_OVERFLOW (t) = 1;
2362   return t;
2363 }
2364
2365 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2366    to a fixed-point type.  */
2367
2368 static tree
2369 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2370 {
2371   FIXED_VALUE_TYPE value;
2372   tree t;
2373   bool overflow_p;
2374
2375   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2376                                         &TREE_REAL_CST (arg1),
2377                                         TYPE_SATURATING (type));
2378   t = build_fixed (type, value);
2379
2380   /* Propagate overflow flags.  */
2381   if (overflow_p | TREE_OVERFLOW (arg1))
2382     {
2383       TREE_OVERFLOW (t) = 1;
2384       TREE_CONSTANT_OVERFLOW (t) = 1;
2385     }
2386   else if (TREE_CONSTANT_OVERFLOW (arg1))
2387     TREE_CONSTANT_OVERFLOW (t) = 1;
2388   return t;
2389 }
2390
2391 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2392    type TYPE.  If no simplification can be done return NULL_TREE.  */
2393
2394 static tree
2395 fold_convert_const (enum tree_code code, tree type, tree arg1)
2396 {
2397   if (TREE_TYPE (arg1) == type)
2398     return arg1;
2399
2400   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2401     {
2402       if (TREE_CODE (arg1) == INTEGER_CST)
2403         return fold_convert_const_int_from_int (type, arg1);
2404       else if (TREE_CODE (arg1) == REAL_CST)
2405         return fold_convert_const_int_from_real (code, type, arg1);
2406       else if (TREE_CODE (arg1) == FIXED_CST)
2407         return fold_convert_const_int_from_fixed (type, arg1);
2408     }
2409   else if (TREE_CODE (type) == REAL_TYPE)
2410     {
2411       if (TREE_CODE (arg1) == INTEGER_CST)
2412         return build_real_from_int_cst (type, arg1);
2413       else if (TREE_CODE (arg1) == REAL_CST)
2414         return fold_convert_const_real_from_real (type, arg1);
2415       else if (TREE_CODE (arg1) == FIXED_CST)
2416         return fold_convert_const_real_from_fixed (type, arg1);
2417     }
2418   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2419     {
2420       if (TREE_CODE (arg1) == FIXED_CST)
2421         return fold_convert_const_fixed_from_fixed (type, arg1);
2422       else if (TREE_CODE (arg1) == INTEGER_CST)
2423         return fold_convert_const_fixed_from_int (type, arg1);
2424       else if (TREE_CODE (arg1) == REAL_CST)
2425         return fold_convert_const_fixed_from_real (type, arg1);
2426     }
2427   return NULL_TREE;
2428 }
2429
2430 /* Construct a vector of zero elements of vector type TYPE.  */
2431
2432 static tree
2433 build_zero_vector (tree type)
2434 {
2435   tree elem, list;
2436   int i, units;
2437
2438   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2439   units = TYPE_VECTOR_SUBPARTS (type);
2440   
2441   list = NULL_TREE;
2442   for (i = 0; i < units; i++)
2443     list = tree_cons (NULL_TREE, elem, list);
2444   return build_vector (type, list);
2445 }
2446
2447 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2448
2449 bool
2450 fold_convertible_p (const_tree type, const_tree arg)
2451 {
2452   tree orig = TREE_TYPE (arg);
2453
2454   if (type == orig)
2455     return true;
2456
2457   if (TREE_CODE (arg) == ERROR_MARK
2458       || TREE_CODE (type) == ERROR_MARK
2459       || TREE_CODE (orig) == ERROR_MARK)
2460     return false;
2461
2462   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2463     return true;
2464
2465   switch (TREE_CODE (type))
2466     {
2467     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2468     case POINTER_TYPE: case REFERENCE_TYPE:
2469     case OFFSET_TYPE:
2470       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2471           || TREE_CODE (orig) == OFFSET_TYPE)
2472         return true;
2473       return (TREE_CODE (orig) == VECTOR_TYPE
2474               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2475
2476     case REAL_TYPE:
2477     case FIXED_POINT_TYPE:
2478     case COMPLEX_TYPE:
2479     case VECTOR_TYPE:
2480     case VOID_TYPE:
2481       return TREE_CODE (type) == TREE_CODE (orig);
2482
2483     default:
2484       return false;
2485     }
2486 }
2487
2488 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2489    simple conversions in preference to calling the front-end's convert.  */
2490
2491 tree
2492 fold_convert (tree type, tree arg)
2493 {
2494   tree orig = TREE_TYPE (arg);
2495   tree tem;
2496
2497   if (type == orig)
2498     return arg;
2499
2500   if (TREE_CODE (arg) == ERROR_MARK
2501       || TREE_CODE (type) == ERROR_MARK
2502       || TREE_CODE (orig) == ERROR_MARK)
2503     return error_mark_node;
2504
2505   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2506     return fold_build1 (NOP_EXPR, type, arg);
2507
2508   switch (TREE_CODE (type))
2509     {
2510     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2511     case POINTER_TYPE: case REFERENCE_TYPE:
2512     case OFFSET_TYPE:
2513       if (TREE_CODE (arg) == INTEGER_CST)
2514         {
2515           tem = fold_convert_const (NOP_EXPR, type, arg);
2516           if (tem != NULL_TREE)
2517             return tem;
2518         }
2519       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2520           || TREE_CODE (orig) == OFFSET_TYPE)
2521         return fold_build1 (NOP_EXPR, type, arg);
2522       if (TREE_CODE (orig) == COMPLEX_TYPE)
2523         {
2524           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2525           return fold_convert (type, tem);
2526         }
2527       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2528                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2529       return fold_build1 (NOP_EXPR, type, arg);
2530
2531     case REAL_TYPE:
2532       if (TREE_CODE (arg) == INTEGER_CST)
2533         {
2534           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2535           if (tem != NULL_TREE)
2536             return tem;
2537         }
2538       else if (TREE_CODE (arg) == REAL_CST)
2539         {
2540           tem = fold_convert_const (NOP_EXPR, type, arg);
2541           if (tem != NULL_TREE)
2542             return tem;
2543         }
2544       else if (TREE_CODE (arg) == FIXED_CST)
2545         {
2546           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2547           if (tem != NULL_TREE)
2548             return tem;
2549         }
2550
2551       switch (TREE_CODE (orig))
2552         {
2553         case INTEGER_TYPE:
2554         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2555         case POINTER_TYPE: case REFERENCE_TYPE:
2556           return fold_build1 (FLOAT_EXPR, type, arg);
2557
2558         case REAL_TYPE:
2559           return fold_build1 (NOP_EXPR, type, arg);
2560
2561         case FIXED_POINT_TYPE:
2562           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2563
2564         case COMPLEX_TYPE:
2565           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2566           return fold_convert (type, tem);
2567
2568         default:
2569           gcc_unreachable ();
2570         }
2571
2572     case FIXED_POINT_TYPE:
2573       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2574           || TREE_CODE (arg) == REAL_CST)
2575         {
2576           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2577           if (tem != NULL_TREE)
2578             return tem;
2579         }
2580
2581       switch (TREE_CODE (orig))
2582         {
2583         case FIXED_POINT_TYPE:
2584         case INTEGER_TYPE:
2585         case ENUMERAL_TYPE:
2586         case BOOLEAN_TYPE:
2587         case REAL_TYPE:
2588           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2589
2590         case COMPLEX_TYPE:
2591           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2592           return fold_convert (type, tem);
2593
2594         default:
2595           gcc_unreachable ();
2596         }
2597
2598     case COMPLEX_TYPE:
2599       switch (TREE_CODE (orig))
2600         {
2601         case INTEGER_TYPE:
2602         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2603         case POINTER_TYPE: case REFERENCE_TYPE:
2604         case REAL_TYPE:
2605         case FIXED_POINT_TYPE:
2606           return build2 (COMPLEX_EXPR, type,
2607                          fold_convert (TREE_TYPE (type), arg),
2608                          fold_convert (TREE_TYPE (type), integer_zero_node));
2609         case COMPLEX_TYPE:
2610           {
2611             tree rpart, ipart;
2612
2613             if (TREE_CODE (arg) == COMPLEX_EXPR)
2614               {
2615                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2616                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2617                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2618               }
2619
2620             arg = save_expr (arg);
2621             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2622             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2623             rpart = fold_convert (TREE_TYPE (type), rpart);
2624             ipart = fold_convert (TREE_TYPE (type), ipart);
2625             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2626           }
2627
2628         default:
2629           gcc_unreachable ();
2630         }
2631
2632     case VECTOR_TYPE:
2633       if (integer_zerop (arg))
2634         return build_zero_vector (type);
2635       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2636       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2637                   || TREE_CODE (orig) == VECTOR_TYPE);
2638       return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2639
2640     case VOID_TYPE:
2641       tem = fold_ignored_result (arg);
2642       if (TREE_CODE (tem) == GIMPLE_MODIFY_STMT)
2643         return tem;
2644       return fold_build1 (NOP_EXPR, type, tem);
2645
2646     default:
2647       gcc_unreachable ();
2648     }
2649 }
2650 \f
2651 /* Return false if expr can be assumed not to be an lvalue, true
2652    otherwise.  */
2653
2654 static bool
2655 maybe_lvalue_p (const_tree x)
2656 {
2657   /* We only need to wrap lvalue tree codes.  */
2658   switch (TREE_CODE (x))
2659   {
2660   case VAR_DECL:
2661   case PARM_DECL:
2662   case RESULT_DECL:
2663   case LABEL_DECL:
2664   case FUNCTION_DECL:
2665   case SSA_NAME:
2666
2667   case COMPONENT_REF:
2668   case INDIRECT_REF:
2669   case ALIGN_INDIRECT_REF:
2670   case MISALIGNED_INDIRECT_REF:
2671   case ARRAY_REF:
2672   case ARRAY_RANGE_REF:
2673   case BIT_FIELD_REF:
2674   case OBJ_TYPE_REF:
2675
2676   case REALPART_EXPR:
2677   case IMAGPART_EXPR:
2678   case PREINCREMENT_EXPR:
2679   case PREDECREMENT_EXPR:
2680   case SAVE_EXPR:
2681   case TRY_CATCH_EXPR:
2682   case WITH_CLEANUP_EXPR:
2683   case COMPOUND_EXPR:
2684   case MODIFY_EXPR:
2685   case GIMPLE_MODIFY_STMT:
2686   case TARGET_EXPR:
2687   case COND_EXPR:
2688   case BIND_EXPR:
2689   case MIN_EXPR:
2690   case MAX_EXPR:
2691     break;
2692
2693   default:
2694     /* Assume the worst for front-end tree codes.  */
2695     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2696       break;
2697     return false;
2698   }
2699
2700   return true;
2701 }
2702
2703 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2704
2705 tree
2706 non_lvalue (tree x)
2707 {
2708   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2709      us.  */
2710   if (in_gimple_form)
2711     return x;
2712
2713   if (! maybe_lvalue_p (x))
2714     return x;
2715   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2716 }
2717
2718 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2719    Zero means allow extended lvalues.  */
2720
2721 int pedantic_lvalues;
2722
2723 /* When pedantic, return an expr equal to X but certainly not valid as a
2724    pedantic lvalue.  Otherwise, return X.  */
2725
2726 static tree
2727 pedantic_non_lvalue (tree x)
2728 {
2729   if (pedantic_lvalues)
2730     return non_lvalue (x);
2731   else
2732     return x;
2733 }
2734 \f
2735 /* Given a tree comparison code, return the code that is the logical inverse
2736    of the given code.  It is not safe to do this for floating-point
2737    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2738    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2739
2740 enum tree_code
2741 invert_tree_comparison (enum tree_code code, bool honor_nans)
2742 {
2743   if (honor_nans && flag_trapping_math)
2744     return ERROR_MARK;
2745
2746   switch (code)
2747     {
2748     case EQ_EXPR:
2749       return NE_EXPR;
2750     case NE_EXPR:
2751       return EQ_EXPR;
2752     case GT_EXPR:
2753       return honor_nans ? UNLE_EXPR : LE_EXPR;
2754     case GE_EXPR:
2755       return honor_nans ? UNLT_EXPR : LT_EXPR;
2756     case LT_EXPR:
2757       return honor_nans ? UNGE_EXPR : GE_EXPR;
2758     case LE_EXPR:
2759       return honor_nans ? UNGT_EXPR : GT_EXPR;
2760     case LTGT_EXPR:
2761       return UNEQ_EXPR;
2762     case UNEQ_EXPR:
2763       return LTGT_EXPR;
2764     case UNGT_EXPR:
2765       return LE_EXPR;
2766     case UNGE_EXPR:
2767       return LT_EXPR;
2768     case UNLT_EXPR:
2769       return GE_EXPR;
2770     case UNLE_EXPR:
2771       return GT_EXPR;
2772     case ORDERED_EXPR:
2773       return UNORDERED_EXPR;
2774     case UNORDERED_EXPR:
2775       return ORDERED_EXPR;
2776     default:
2777       gcc_unreachable ();
2778     }
2779 }
2780
2781 /* Similar, but return the comparison that results if the operands are
2782    swapped.  This is safe for floating-point.  */
2783
2784 enum tree_code
2785 swap_tree_comparison (enum tree_code code)
2786 {
2787   switch (code)
2788     {
2789     case EQ_EXPR:
2790     case NE_EXPR:
2791     case ORDERED_EXPR:
2792     case UNORDERED_EXPR:
2793     case LTGT_EXPR:
2794     case UNEQ_EXPR:
2795       return code;
2796     case GT_EXPR:
2797       return LT_EXPR;
2798     case GE_EXPR:
2799       return LE_EXPR;
2800     case LT_EXPR:
2801       return GT_EXPR;
2802     case LE_EXPR:
2803       return GE_EXPR;
2804     case UNGT_EXPR:
2805       return UNLT_EXPR;
2806     case UNGE_EXPR:
2807       return UNLE_EXPR;
2808     case UNLT_EXPR:
2809       return UNGT_EXPR;
2810     case UNLE_EXPR:
2811       return UNGE_EXPR;
2812     default:
2813       gcc_unreachable ();
2814     }
2815 }
2816
2817
2818 /* Convert a comparison tree code from an enum tree_code representation
2819    into a compcode bit-based encoding.  This function is the inverse of
2820    compcode_to_comparison.  */
2821
2822 static enum comparison_code
2823 comparison_to_compcode (enum tree_code code)
2824 {
2825   switch (code)
2826     {
2827     case LT_EXPR:
2828       return COMPCODE_LT;
2829     case EQ_EXPR:
2830       return COMPCODE_EQ;
2831     case LE_EXPR:
2832       return COMPCODE_LE;
2833     case GT_EXPR:
2834       return COMPCODE_GT;
2835     case NE_EXPR:
2836       return COMPCODE_NE;
2837     case GE_EXPR:
2838       return COMPCODE_GE;
2839     case ORDERED_EXPR:
2840       return COMPCODE_ORD;
2841     case UNORDERED_EXPR:
2842       return COMPCODE_UNORD;
2843     case UNLT_EXPR:
2844       return COMPCODE_UNLT;
2845     case UNEQ_EXPR:
2846       return COMPCODE_UNEQ;
2847     case UNLE_EXPR:
2848       return COMPCODE_UNLE;
2849     case UNGT_EXPR:
2850       return COMPCODE_UNGT;
2851     case LTGT_EXPR:
2852       return COMPCODE_LTGT;
2853     case UNGE_EXPR:
2854       return COMPCODE_UNGE;
2855     default:
2856       gcc_unreachable ();
2857     }
2858 }
2859
2860 /* Convert a compcode bit-based encoding of a comparison operator back
2861    to GCC's enum tree_code representation.  This function is the
2862    inverse of comparison_to_compcode.  */
2863
2864 static enum tree_code
2865 compcode_to_comparison (enum comparison_code code)
2866 {
2867   switch (code)
2868     {
2869     case COMPCODE_LT:
2870       return LT_EXPR;
2871     case COMPCODE_EQ:
2872       return EQ_EXPR;
2873     case COMPCODE_LE:
2874       return LE_EXPR;
2875     case COMPCODE_GT:
2876       return GT_EXPR;
2877     case COMPCODE_NE:
2878       return NE_EXPR;
2879     case COMPCODE_GE:
2880       return GE_EXPR;
2881     case COMPCODE_ORD:
2882       return ORDERED_EXPR;
2883     case COMPCODE_UNORD:
2884       return UNORDERED_EXPR;
2885     case COMPCODE_UNLT:
2886       return UNLT_EXPR;
2887     case COMPCODE_UNEQ:
2888       return UNEQ_EXPR;
2889     case COMPCODE_UNLE:
2890       return UNLE_EXPR;
2891     case COMPCODE_UNGT:
2892       return UNGT_EXPR;
2893     case COMPCODE_LTGT:
2894       return LTGT_EXPR;
2895     case COMPCODE_UNGE:
2896       return UNGE_EXPR;
2897     default:
2898       gcc_unreachable ();
2899     }
2900 }
2901
2902 /* Return a tree for the comparison which is the combination of
2903    doing the AND or OR (depending on CODE) of the two operations LCODE
2904    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2905    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2906    if this makes the transformation invalid.  */
2907
2908 tree
2909 combine_comparisons (enum tree_code code, enum tree_code lcode,
2910                      enum tree_code rcode, tree truth_type,
2911                      tree ll_arg, tree lr_arg)
2912 {
2913   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2914   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2915   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2916   enum comparison_code compcode;
2917
2918   switch (code)
2919     {
2920     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2921       compcode = lcompcode & rcompcode;
2922       break;
2923
2924     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2925       compcode = lcompcode | rcompcode;
2926       break;
2927
2928     default:
2929       return NULL_TREE;
2930     }
2931
2932   if (!honor_nans)
2933     {
2934       /* Eliminate unordered comparisons, as well as LTGT and ORD
2935          which are not used unless the mode has NaNs.  */
2936       compcode &= ~COMPCODE_UNORD;
2937       if (compcode == COMPCODE_LTGT)
2938         compcode = COMPCODE_NE;
2939       else if (compcode == COMPCODE_ORD)
2940         compcode = COMPCODE_TRUE;
2941     }
2942    else if (flag_trapping_math)
2943      {
2944         /* Check that the original operation and the optimized ones will trap
2945            under the same condition.  */
2946         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2947                      && (lcompcode != COMPCODE_EQ)
2948                      && (lcompcode != COMPCODE_ORD);
2949         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2950                      && (rcompcode != COMPCODE_EQ)
2951                      && (rcompcode != COMPCODE_ORD);
2952         bool trap = (compcode & COMPCODE_UNORD) == 0
2953                     && (compcode != COMPCODE_EQ)
2954                     && (compcode != COMPCODE_ORD);
2955
2956         /* In a short-circuited boolean expression the LHS might be
2957            such that the RHS, if evaluated, will never trap.  For
2958            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2959            if neither x nor y is NaN.  (This is a mixed blessing: for
2960            example, the expression above will never trap, hence
2961            optimizing it to x < y would be invalid).  */
2962         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2963             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2964           rtrap = false;
2965
2966         /* If the comparison was short-circuited, and only the RHS
2967            trapped, we may now generate a spurious trap.  */
2968         if (rtrap && !ltrap
2969             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2970           return NULL_TREE;
2971
2972         /* If we changed the conditions that cause a trap, we lose.  */
2973         if ((ltrap || rtrap) != trap)
2974           return NULL_TREE;
2975       }
2976
2977   if (compcode == COMPCODE_TRUE)
2978     return constant_boolean_node (true, truth_type);
2979   else if (compcode == COMPCODE_FALSE)
2980     return constant_boolean_node (false, truth_type);
2981   else
2982     return fold_build2 (compcode_to_comparison (compcode),
2983                         truth_type, ll_arg, lr_arg);
2984 }
2985
2986 /* Return nonzero if CODE is a tree code that represents a truth value.  */
2987
2988 static int
2989 truth_value_p (enum tree_code code)
2990 {
2991   return (TREE_CODE_CLASS (code) == tcc_comparison
2992           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2993           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2994           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2995 }
2996 \f
2997 /* Return nonzero if two operands (typically of the same tree node)
2998    are necessarily equal.  If either argument has side-effects this
2999    function returns zero.  FLAGS modifies behavior as follows:
3000
3001    If OEP_ONLY_CONST is set, only return nonzero for constants.
3002    This function tests whether the operands are indistinguishable;
3003    it does not test whether they are equal using C's == operation.
3004    The distinction is important for IEEE floating point, because
3005    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3006    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3007
3008    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3009    even though it may hold multiple values during a function.
3010    This is because a GCC tree node guarantees that nothing else is
3011    executed between the evaluation of its "operands" (which may often
3012    be evaluated in arbitrary order).  Hence if the operands themselves
3013    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3014    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3015    unset means assuming isochronic (or instantaneous) tree equivalence.
3016    Unless comparing arbitrary expression trees, such as from different
3017    statements, this flag can usually be left unset.
3018
3019    If OEP_PURE_SAME is set, then pure functions with identical arguments
3020    are considered the same.  It is used when the caller has other ways
3021    to ensure that global memory is unchanged in between.  */
3022
3023 int
3024 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3025 {
3026   /* If either is ERROR_MARK, they aren't equal.  */
3027   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3028     return 0;
3029
3030   /* If both types don't have the same signedness, then we can't consider
3031      them equal.  We must check this before the STRIP_NOPS calls
3032      because they may change the signedness of the arguments.  */
3033   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3034     return 0;
3035
3036   /* If both types don't have the same precision, then it is not safe
3037      to strip NOPs.  */
3038   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3039     return 0;
3040
3041   STRIP_NOPS (arg0);
3042   STRIP_NOPS (arg1);
3043
3044   /* In case both args are comparisons but with different comparison
3045      code, try to swap the comparison operands of one arg to produce
3046      a match and compare that variant.  */
3047   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3048       && COMPARISON_CLASS_P (arg0)
3049       && COMPARISON_CLASS_P (arg1))
3050     {
3051       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3052
3053       if (TREE_CODE (arg0) == swap_code)
3054         return operand_equal_p (TREE_OPERAND (arg0, 0),
3055                                 TREE_OPERAND (arg1, 1), flags)
3056                && operand_equal_p (TREE_OPERAND (arg0, 1),
3057                                    TREE_OPERAND (arg1, 0), flags);
3058     }
3059
3060   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3061       /* This is needed for conversions and for COMPONENT_REF.
3062          Might as well play it safe and always test this.  */
3063       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3064       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3065       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3066     return 0;
3067
3068   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3069      We don't care about side effects in that case because the SAVE_EXPR
3070      takes care of that for us. In all other cases, two expressions are
3071      equal if they have no side effects.  If we have two identical
3072      expressions with side effects that should be treated the same due
3073      to the only side effects being identical SAVE_EXPR's, that will
3074      be detected in the recursive calls below.  */
3075   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3076       && (TREE_CODE (arg0) == SAVE_EXPR
3077           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3078     return 1;
3079
3080   /* Next handle constant cases, those for which we can return 1 even
3081      if ONLY_CONST is set.  */
3082   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3083     switch (TREE_CODE (arg0))
3084       {
3085       case INTEGER_CST:
3086         return tree_int_cst_equal (arg0, arg1);
3087
3088       case FIXED_CST:
3089         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3090                                        TREE_FIXED_CST (arg1));
3091
3092       case REAL_CST:
3093         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3094                                    TREE_REAL_CST (arg1)))
3095           return 1;
3096
3097         
3098         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3099           {
3100             /* If we do not distinguish between signed and unsigned zero,
3101                consider them equal.  */
3102             if (real_zerop (arg0) && real_zerop (arg1))
3103               return 1;
3104           }
3105         return 0;
3106
3107       case VECTOR_CST:
3108         {
3109           tree v1, v2;
3110
3111           v1 = TREE_VECTOR_CST_ELTS (arg0);
3112           v2 = TREE_VECTOR_CST_ELTS (arg1);
3113           while (v1 && v2)
3114             {
3115               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3116                                     flags))
3117                 return 0;
3118               v1 = TREE_CHAIN (v1);
3119               v2 = TREE_CHAIN (v2);
3120             }
3121
3122           return v1 == v2;
3123         }
3124
3125       case COMPLEX_CST:
3126         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3127                                  flags)
3128                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3129                                     flags));
3130
3131       case STRING_CST:
3132         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3133                 && ! memcmp (TREE_STRING_POINTER (arg0),
3134                               TREE_STRING_POINTER (arg1),
3135                               TREE_STRING_LENGTH (arg0)));
3136
3137       case ADDR_EXPR:
3138         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3139                                 0);
3140       default:
3141         break;
3142       }
3143
3144   if (flags & OEP_ONLY_CONST)
3145     return 0;
3146
3147 /* Define macros to test an operand from arg0 and arg1 for equality and a
3148    variant that allows null and views null as being different from any
3149    non-null value.  In the latter case, if either is null, the both
3150    must be; otherwise, do the normal comparison.  */
3151 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3152                                     TREE_OPERAND (arg1, N), flags)
3153
3154 #define OP_SAME_WITH_NULL(N)                            \
3155   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3156    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3157
3158   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3159     {
3160     case tcc_unary:
3161       /* Two conversions are equal only if signedness and modes match.  */
3162       switch (TREE_CODE (arg0))
3163         {
3164         case NOP_EXPR:
3165         case CONVERT_EXPR:
3166         case FIX_TRUNC_EXPR:
3167           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3168               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3169             return 0;
3170           break;
3171         default:
3172           break;
3173         }
3174
3175       return OP_SAME (0);
3176
3177
3178     case tcc_comparison:
3179     case tcc_binary:
3180       if (OP_SAME (0) && OP_SAME (1))
3181         return 1;
3182
3183       /* For commutative ops, allow the other order.  */
3184       return (commutative_tree_code (TREE_CODE (arg0))
3185               && operand_equal_p (TREE_OPERAND (arg0, 0),
3186                                   TREE_OPERAND (arg1, 1), flags)
3187               && operand_equal_p (TREE_OPERAND (arg0, 1),
3188                                   TREE_OPERAND (arg1, 0), flags));
3189
3190     case tcc_reference:
3191       /* If either of the pointer (or reference) expressions we are
3192          dereferencing contain a side effect, these cannot be equal.  */
3193       if (TREE_SIDE_EFFECTS (arg0)
3194           || TREE_SIDE_EFFECTS (arg1))
3195         return 0;
3196
3197       switch (TREE_CODE (arg0))
3198         {
3199         case INDIRECT_REF:
3200         case ALIGN_INDIRECT_REF:
3201         case MISALIGNED_INDIRECT_REF:
3202         case REALPART_EXPR:
3203         case IMAGPART_EXPR:
3204           return OP_SAME (0);
3205
3206         case ARRAY_REF:
3207         case ARRAY_RANGE_REF:
3208           /* Operands 2 and 3 may be null.
3209              Compare the array index by value if it is constant first as we
3210              may have different types but same value here.  */
3211           return (OP_SAME (0)
3212                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3213                                           TREE_OPERAND (arg1, 1))
3214                       || OP_SAME (1))
3215                   && OP_SAME_WITH_NULL (2)
3216                   && OP_SAME_WITH_NULL (3));
3217
3218         case COMPONENT_REF:
3219           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3220              may be NULL when we're called to compare MEM_EXPRs.  */
3221           return OP_SAME_WITH_NULL (0)
3222                  && OP_SAME (1)
3223                  && OP_SAME_WITH_NULL (2);
3224
3225         case BIT_FIELD_REF:
3226           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3227
3228         default:
3229           return 0;
3230         }
3231
3232     case tcc_expression:
3233       switch (TREE_CODE (arg0))
3234         {
3235         case ADDR_EXPR:
3236         case TRUTH_NOT_EXPR:
3237           return OP_SAME (0);
3238
3239         case TRUTH_ANDIF_EXPR:
3240         case TRUTH_ORIF_EXPR:
3241           return OP_SAME (0) && OP_SAME (1);
3242
3243         case TRUTH_AND_EXPR:
3244         case TRUTH_OR_EXPR:
3245         case TRUTH_XOR_EXPR:
3246           if (OP_SAME (0) && OP_SAME (1))
3247             return 1;
3248
3249           /* Otherwise take into account this is a commutative operation.  */
3250           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3251                                    TREE_OPERAND (arg1, 1), flags)
3252                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3253                                       TREE_OPERAND (arg1, 0), flags));
3254
3255         default:
3256           return 0;
3257         }
3258
3259     case tcc_vl_exp:
3260       switch (TREE_CODE (arg0))
3261         {
3262         case CALL_EXPR:
3263           /* If the CALL_EXPRs call different functions, then they
3264              clearly can not be equal.  */
3265           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3266                                  flags))
3267             return 0;
3268
3269           {
3270             unsigned int cef = call_expr_flags (arg0);
3271             if (flags & OEP_PURE_SAME)
3272               cef &= ECF_CONST | ECF_PURE;
3273             else
3274               cef &= ECF_CONST;
3275             if (!cef)
3276               return 0;
3277           }
3278
3279           /* Now see if all the arguments are the same.  */
3280           {
3281             const_call_expr_arg_iterator iter0, iter1;
3282             const_tree a0, a1;
3283             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3284                    a1 = first_const_call_expr_arg (arg1, &iter1);
3285                  a0 && a1;
3286                  a0 = next_const_call_expr_arg (&iter0),
3287                    a1 = next_const_call_expr_arg (&iter1))
3288               if (! operand_equal_p (a0, a1, flags))
3289                 return 0;
3290
3291             /* If we get here and both argument lists are exhausted
3292                then the CALL_EXPRs are equal.  */
3293             return ! (a0 || a1);
3294           }
3295         default:
3296           return 0;
3297         }
3298
3299     case tcc_declaration:
3300       /* Consider __builtin_sqrt equal to sqrt.  */
3301       return (TREE_CODE (arg0) == FUNCTION_DECL
3302               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3303               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3304               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3305
3306     default:
3307       return 0;
3308     }
3309
3310 #undef OP_SAME
3311 #undef OP_SAME_WITH_NULL
3312 }
3313 \f
3314 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3315    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3316
3317    When in doubt, return 0.  */
3318
3319 static int
3320 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3321 {
3322   int unsignedp1, unsignedpo;
3323   tree primarg0, primarg1, primother;
3324   unsigned int correct_width;
3325
3326   if (operand_equal_p (arg0, arg1, 0))
3327     return 1;
3328
3329   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3330       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3331     return 0;
3332
3333   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3334      and see if the inner values are the same.  This removes any
3335      signedness comparison, which doesn't matter here.  */
3336   primarg0 = arg0, primarg1 = arg1;
3337   STRIP_NOPS (primarg0);
3338   STRIP_NOPS (primarg1);
3339   if (operand_equal_p (primarg0, primarg1, 0))
3340     return 1;
3341
3342   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3343      actual comparison operand, ARG0.
3344
3345      First throw away any conversions to wider types
3346      already present in the operands.  */
3347
3348   primarg1 = get_narrower (arg1, &unsignedp1);
3349   primother = get_narrower (other, &unsignedpo);
3350
3351   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3352   if (unsignedp1 == unsignedpo
3353       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3354       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3355     {
3356       tree type = TREE_TYPE (arg0);
3357
3358       /* Make sure shorter operand is extended the right way
3359          to match the longer operand.  */
3360       primarg1 = fold_convert (signed_or_unsigned_type_for
3361                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3362
3363       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3364         return 1;
3365     }
3366
3367   return 0;
3368 }
3369 \f
3370 /* See if ARG is an expression that is either a comparison or is performing
3371    arithmetic on comparisons.  The comparisons must only be comparing
3372    two different values, which will be stored in *CVAL1 and *CVAL2; if
3373    they are nonzero it means that some operands have already been found.
3374    No variables may be used anywhere else in the expression except in the
3375    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3376    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3377
3378    If this is true, return 1.  Otherwise, return zero.  */
3379
3380 static int
3381 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3382 {
3383   enum tree_code code = TREE_CODE (arg);
3384   enum tree_code_class class = TREE_CODE_CLASS (code);
3385
3386   /* We can handle some of the tcc_expression cases here.  */
3387   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3388     class = tcc_unary;
3389   else if (class == tcc_expression
3390            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3391                || code == COMPOUND_EXPR))
3392     class = tcc_binary;
3393
3394   else if (class == tcc_expression && code == SAVE_EXPR
3395            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3396     {
3397       /* If we've already found a CVAL1 or CVAL2, this expression is
3398          two complex to handle.  */
3399       if (*cval1 || *cval2)
3400         return 0;
3401
3402       class = tcc_unary;
3403       *save_p = 1;
3404     }
3405
3406   switch (class)
3407     {
3408     case tcc_unary:
3409       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3410
3411     case tcc_binary:
3412       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3413               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3414                                       cval1, cval2, save_p));
3415
3416     case tcc_constant:
3417       return 1;
3418
3419     case tcc_expression:
3420       if (code == COND_EXPR)
3421         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3422                                      cval1, cval2, save_p)
3423                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3424                                         cval1, cval2, save_p)
3425                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3426                                         cval1, cval2, save_p));
3427       return 0;
3428
3429     case tcc_comparison:
3430       /* First see if we can handle the first operand, then the second.  For
3431          the second operand, we know *CVAL1 can't be zero.  It must be that
3432          one side of the comparison is each of the values; test for the
3433          case where this isn't true by failing if the two operands
3434          are the same.  */
3435
3436       if (operand_equal_p (TREE_OPERAND (arg, 0),
3437                            TREE_OPERAND (arg, 1), 0))
3438         return 0;
3439
3440       if (*cval1 == 0)
3441         *cval1 = TREE_OPERAND (arg, 0);
3442       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3443         ;
3444       else if (*cval2 == 0)
3445         *cval2 = TREE_OPERAND (arg, 0);
3446       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3447         ;
3448       else
3449         return 0;
3450
3451       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3452         ;
3453       else if (*cval2 == 0)
3454         *cval2 = TREE_OPERAND (arg, 1);
3455       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3456         ;
3457       else
3458         return 0;
3459
3460       return 1;
3461
3462     default:
3463       return 0;
3464     }
3465 }
3466 \f
3467 /* ARG is a tree that is known to contain just arithmetic operations and
3468    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3469    any occurrence of OLD0 as an operand of a comparison and likewise for
3470    NEW1 and OLD1.  */
3471
3472 static tree
3473 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3474 {
3475   tree type = TREE_TYPE (arg);
3476   enum tree_code code = TREE_CODE (arg);
3477   enum tree_code_class class = TREE_CODE_CLASS (code);
3478
3479   /* We can handle some of the tcc_expression cases here.  */
3480   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3481     class = tcc_unary;
3482   else if (class == tcc_expression
3483            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3484     class = tcc_binary;
3485
3486   switch (class)
3487     {
3488     case tcc_unary:
3489       return fold_build1 (code, type,
3490                           eval_subst (TREE_OPERAND (arg, 0),
3491                                       old0, new0, old1, new1));
3492
3493     case tcc_binary:
3494       return fold_build2 (code, type,
3495                           eval_subst (TREE_OPERAND (arg, 0),
3496                                       old0, new0, old1, new1),
3497                           eval_subst (TREE_OPERAND (arg, 1),
3498                                       old0, new0, old1, new1));
3499
3500     case tcc_expression:
3501       switch (code)
3502         {
3503         case SAVE_EXPR:
3504           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3505
3506         case COMPOUND_EXPR:
3507           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3508
3509         case COND_EXPR:
3510           return fold_build3 (code, type,
3511                               eval_subst (TREE_OPERAND (arg, 0),
3512                                           old0, new0, old1, new1),
3513                               eval_subst (TREE_OPERAND (arg, 1),
3514                                           old0, new0, old1, new1),
3515                               eval_subst (TREE_OPERAND (arg, 2),
3516                                           old0, new0, old1, new1));
3517         default:
3518           break;
3519         }
3520       /* Fall through - ???  */
3521
3522     case tcc_comparison:
3523       {
3524         tree arg0 = TREE_OPERAND (arg, 0);
3525         tree arg1 = TREE_OPERAND (arg, 1);
3526
3527         /* We need to check both for exact equality and tree equality.  The
3528            former will be true if the operand has a side-effect.  In that
3529            case, we know the operand occurred exactly once.  */
3530
3531         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3532           arg0 = new0;
3533         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3534           arg0 = new1;
3535
3536         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3537           arg1 = new0;
3538         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3539           arg1 = new1;
3540
3541         return fold_build2 (code, type, arg0, arg1);
3542       }
3543
3544     default:
3545       return arg;
3546     }
3547 }
3548 \f
3549 /* Return a tree for the case when the result of an expression is RESULT
3550    converted to TYPE and OMITTED was previously an operand of the expression
3551    but is now not needed (e.g., we folded OMITTED * 0).
3552
3553    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3554    the conversion of RESULT to TYPE.  */
3555
3556 tree
3557 omit_one_operand (tree type, tree result, tree omitted)
3558 {
3559   tree t = fold_convert (type, result);
3560
3561   /* If the resulting operand is an empty statement, just return the omitted
3562      statement casted to void. */
3563   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3564     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3565
3566   if (TREE_SIDE_EFFECTS (omitted))
3567     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3568
3569   return non_lvalue (t);
3570 }
3571
3572 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3573
3574 static tree
3575 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3576 {
3577   tree t = fold_convert (type, result);
3578
3579   /* If the resulting operand is an empty statement, just return the omitted
3580      statement casted to void. */
3581   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3582     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3583
3584   if (TREE_SIDE_EFFECTS (omitted))
3585     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3586
3587   return pedantic_non_lvalue (t);
3588 }
3589
3590 /* Return a tree for the case when the result of an expression is RESULT
3591    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3592    of the expression but are now not needed.
3593
3594    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3595    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3596    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3597    just do the conversion of RESULT to TYPE.  */
3598
3599 tree
3600 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3601 {
3602   tree t = fold_convert (type, result);
3603
3604   if (TREE_SIDE_EFFECTS (omitted2))
3605     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3606   if (TREE_SIDE_EFFECTS (omitted1))
3607     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3608
3609   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3610 }
3611
3612 \f
3613 /* Return a simplified tree node for the truth-negation of ARG.  This
3614    never alters ARG itself.  We assume that ARG is an operation that
3615    returns a truth value (0 or 1).
3616
3617    FIXME: one would think we would fold the result, but it causes
3618    problems with the dominator optimizer.  */
3619
3620 tree
3621 fold_truth_not_expr (tree arg)
3622 {
3623   tree type = TREE_TYPE (arg);
3624   enum tree_code code = TREE_CODE (arg);
3625
3626   /* If this is a comparison, we can simply invert it, except for
3627      floating-point non-equality comparisons, in which case we just
3628      enclose a TRUTH_NOT_EXPR around what we have.  */
3629
3630   if (TREE_CODE_CLASS (code) == tcc_comparison)
3631     {
3632       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3633       if (FLOAT_TYPE_P (op_type)
3634           && flag_trapping_math
3635           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3636           && code != NE_EXPR && code != EQ_EXPR)
3637         return NULL_TREE;
3638       else
3639         {
3640           code = invert_tree_comparison (code,
3641                                          HONOR_NANS (TYPE_MODE (op_type)));
3642           if (code == ERROR_MARK)
3643             return NULL_TREE;
3644           else
3645             return build2 (code, type,
3646                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3647         }
3648     }
3649
3650   switch (code)
3651     {
3652     case INTEGER_CST:
3653       return constant_boolean_node (integer_zerop (arg), type);
3654
3655     case TRUTH_AND_EXPR:
3656       return build2 (TRUTH_OR_EXPR, type,
3657                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3658                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3659
3660     case TRUTH_OR_EXPR:
3661       return build2 (TRUTH_AND_EXPR, type,
3662                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3663                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3664
3665     case TRUTH_XOR_EXPR:
3666       /* Here we can invert either operand.  We invert the first operand
3667          unless the second operand is a TRUTH_NOT_EXPR in which case our
3668          result is the XOR of the first operand with the inside of the
3669          negation of the second operand.  */
3670
3671       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3672         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3673                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3674       else
3675         return build2 (TRUTH_XOR_EXPR, type,
3676                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3677                        TREE_OPERAND (arg, 1));
3678
3679     case TRUTH_ANDIF_EXPR:
3680       return build2 (TRUTH_ORIF_EXPR, type,
3681                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3682                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3683
3684     case TRUTH_ORIF_EXPR:
3685       return build2 (TRUTH_ANDIF_EXPR, type,
3686                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3687                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3688
3689     case TRUTH_NOT_EXPR:
3690       return TREE_OPERAND (arg, 0);
3691
3692     case COND_EXPR:
3693       {
3694         tree arg1 = TREE_OPERAND (arg, 1);
3695         tree arg2 = TREE_OPERAND (arg, 2);
3696         /* A COND_EXPR may have a throw as one operand, which
3697            then has void type.  Just leave void operands
3698            as they are.  */
3699         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3700                        VOID_TYPE_P (TREE_TYPE (arg1))
3701                        ? arg1 : invert_truthvalue (arg1),
3702                        VOID_TYPE_P (TREE_TYPE (arg2))
3703                        ? arg2 : invert_truthvalue (arg2));
3704       }
3705
3706     case COMPOUND_EXPR:
3707       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3708                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3709
3710     case NON_LVALUE_EXPR:
3711       return invert_truthvalue (TREE_OPERAND (arg, 0));
3712
3713     case NOP_EXPR:
3714       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3715         return build1 (TRUTH_NOT_EXPR, type, arg);
3716
3717     case CONVERT_EXPR:
3718     case FLOAT_EXPR:
3719       return build1 (TREE_CODE (arg), type,
3720                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3721
3722     case BIT_AND_EXPR:
3723       if (!integer_onep (TREE_OPERAND (arg, 1)))
3724         break;
3725       return build2 (EQ_EXPR, type, arg,
3726                      build_int_cst (type, 0));
3727
3728     case SAVE_EXPR:
3729       return build1 (TRUTH_NOT_EXPR, type, arg);
3730
3731     case CLEANUP_POINT_EXPR:
3732       return build1 (CLEANUP_POINT_EXPR, type,
3733                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3734
3735     default:
3736       break;
3737     }
3738
3739   return NULL_TREE;
3740 }
3741
3742 /* Return a simplified tree node for the truth-negation of ARG.  This
3743    never alters ARG itself.  We assume that ARG is an operation that
3744    returns a truth value (0 or 1).
3745
3746    FIXME: one would think we would fold the result, but it causes
3747    problems with the dominator optimizer.  */
3748
3749 tree
3750 invert_truthvalue (tree arg)
3751 {
3752   tree tem;
3753
3754   if (TREE_CODE (arg) == ERROR_MARK)
3755     return arg;
3756
3757   tem = fold_truth_not_expr (arg);
3758   if (!tem)
3759     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3760
3761   return tem;
3762 }
3763
3764 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3765    operands are another bit-wise operation with a common input.  If so,
3766    distribute the bit operations to save an operation and possibly two if
3767    constants are involved.  For example, convert
3768         (A | B) & (A | C) into A | (B & C)
3769    Further simplification will occur if B and C are constants.
3770
3771    If this optimization cannot be done, 0 will be returned.  */
3772
3773 static tree
3774 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3775 {
3776   tree common;
3777   tree left, right;
3778
3779   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3780       || TREE_CODE (arg0) == code
3781       || (TREE_CODE (arg0) != BIT_AND_EXPR
3782           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3783     return 0;
3784
3785   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3786     {
3787       common = TREE_OPERAND (arg0, 0);
3788       left = TREE_OPERAND (arg0, 1);
3789       right = TREE_OPERAND (arg1, 1);
3790     }
3791   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3792     {
3793       common = TREE_OPERAND (arg0, 0);
3794       left = TREE_OPERAND (arg0, 1);
3795       right = TREE_OPERAND (arg1, 0);
3796     }
3797   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3798     {
3799       common = TREE_OPERAND (arg0, 1);
3800       left = TREE_OPERAND (arg0, 0);
3801       right = TREE_OPERAND (arg1, 1);
3802     }
3803   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3804     {
3805       common = TREE_OPERAND (arg0, 1);
3806       left = TREE_OPERAND (arg0, 0);
3807       right = TREE_OPERAND (arg1, 0);
3808     }
3809   else
3810     return 0;
3811
3812   return fold_build2 (TREE_CODE (arg0), type, common,
3813                       fold_build2 (code, type, left, right));
3814 }
3815
3816 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3817    with code CODE.  This optimization is unsafe.  */
3818 static tree
3819 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3820 {
3821   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3822   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3823
3824   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3825   if (mul0 == mul1
3826       && operand_equal_p (TREE_OPERAND (arg0, 1),
3827                        TREE_OPERAND (arg1, 1), 0))
3828     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3829                         fold_build2 (code, type,
3830                                      TREE_OPERAND (arg0, 0),
3831                                      TREE_OPERAND (arg1, 0)),
3832                         TREE_OPERAND (arg0, 1));
3833
3834   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3835   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3836                        TREE_OPERAND (arg1, 0), 0)
3837       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3838       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3839     {
3840       REAL_VALUE_TYPE r0, r1;
3841       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3842       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3843       if (!mul0)
3844         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3845       if (!mul1)
3846         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3847       real_arithmetic (&r0, code, &r0, &r1);
3848       return fold_build2 (MULT_EXPR, type,
3849                           TREE_OPERAND (arg0, 0),
3850                           build_real (type, r0));
3851     }
3852
3853   return NULL_TREE;
3854 }
3855 \f
3856 /* Subroutine for fold_truthop: decode a field reference.
3857
3858    If EXP is a comparison reference, we return the innermost reference.
3859
3860    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3861    set to the starting bit number.
3862
3863    If the innermost field can be completely contained in a mode-sized
3864    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3865
3866    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3867    otherwise it is not changed.
3868
3869    *PUNSIGNEDP is set to the signedness of the field.
3870
3871    *PMASK is set to the mask used.  This is either contained in a
3872    BIT_AND_EXPR or derived from the width of the field.
3873
3874    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3875
3876    Return 0 if this is not a component reference or is one that we can't
3877    do anything with.  */
3878
3879 static tree
3880 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3881                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3882                         int *punsignedp, int *pvolatilep,
3883                         tree *pmask, tree *pand_mask)
3884 {
3885   tree outer_type = 0;
3886   tree and_mask = 0;
3887   tree mask, inner, offset;
3888   tree unsigned_type;
3889   unsigned int precision;
3890
3891   /* All the optimizations using this function assume integer fields.
3892      There are problems with FP fields since the type_for_size call
3893      below can fail for, e.g., XFmode.  */
3894   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3895     return 0;
3896
3897   /* We are interested in the bare arrangement of bits, so strip everything
3898      that doesn't affect the machine mode.  However, record the type of the
3899      outermost expression if it may matter below.  */
3900   if (TREE_CODE (exp) == NOP_EXPR
3901       || TREE_CODE (exp) == CONVERT_EXPR
3902       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3903     outer_type = TREE_TYPE (exp);
3904   STRIP_NOPS (exp);
3905
3906   if (TREE_CODE (exp) == BIT_AND_EXPR)
3907     {
3908       and_mask = TREE_OPERAND (exp, 1);
3909       exp = TREE_OPERAND (exp, 0);
3910       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3911       if (TREE_CODE (and_mask) != INTEGER_CST)
3912         return 0;
3913     }
3914
3915   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3916                                punsignedp, pvolatilep, false);
3917   if ((inner == exp && and_mask == 0)
3918       || *pbitsize < 0 || offset != 0
3919       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3920     return 0;
3921
3922   /* If the number of bits in the reference is the same as the bitsize of
3923      the outer type, then the outer type gives the signedness. Otherwise
3924      (in case of a small bitfield) the signedness is unchanged.  */
3925   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3926     *punsignedp = TYPE_UNSIGNED (outer_type);
3927
3928   /* Compute the mask to access the bitfield.  */
3929   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3930   precision = TYPE_PRECISION (unsigned_type);
3931
3932   mask = build_int_cst_type (unsigned_type, -1);
3933
3934   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3935   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3936
3937   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3938   if (and_mask != 0)
3939     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3940                         fold_convert (unsigned_type, and_mask), mask);
3941
3942   *pmask = mask;
3943   *pand_mask = and_mask;
3944   return inner;
3945 }
3946
3947 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3948    represents the sign bit of EXP's type.  If EXP represents a sign
3949    or zero extension, also test VAL against the unextended type.
3950    The return value is the (sub)expression whose sign bit is VAL,
3951    or NULL_TREE otherwise.  */
3952
3953 static tree
3954 sign_bit_p (tree exp, const_tree val)
3955 {
3956   unsigned HOST_WIDE_INT mask_lo, lo;
3957   HOST_WIDE_INT mask_hi, hi;
3958   int width;
3959   tree t;
3960
3961   /* Tree EXP must have an integral type.  */
3962   t = TREE_TYPE (exp);
3963   if (! INTEGRAL_TYPE_P (t))
3964     return NULL_TREE;
3965
3966   /* Tree VAL must be an integer constant.  */
3967   if (TREE_CODE (val) != INTEGER_CST
3968       || TREE_OVERFLOW (val))
3969     return NULL_TREE;
3970
3971   width = TYPE_PRECISION (t);
3972   if (width > HOST_BITS_PER_WIDE_INT)
3973     {
3974       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3975       lo = 0;
3976
3977       mask_hi = ((unsigned HOST_WIDE_INT) -1
3978                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3979       mask_lo = -1;
3980     }
3981   else
3982     {
3983       hi = 0;
3984       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3985
3986       mask_hi = 0;
3987       mask_lo = ((unsigned HOST_WIDE_INT) -1
3988                  >> (HOST_BITS_PER_WIDE_INT - width));
3989     }
3990
3991   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3992      treat VAL as if it were unsigned.  */
3993   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3994       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3995     return exp;
3996
3997   /* Handle extension from a narrower type.  */
3998   if (TREE_CODE (exp) == NOP_EXPR
3999       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4000     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4001
4002   return NULL_TREE;
4003 }
4004
4005 /* Subroutine for fold_truthop: determine if an operand is simple enough
4006    to be evaluated unconditionally.  */
4007
4008 static int
4009 simple_operand_p (const_tree exp)
4010 {
4011   /* Strip any conversions that don't change the machine mode.  */
4012   STRIP_NOPS (exp);
4013
4014   return (CONSTANT_CLASS_P (exp)
4015           || TREE_CODE (exp) == SSA_NAME
4016           || (DECL_P (exp)
4017               && ! TREE_ADDRESSABLE (exp)
4018               && ! TREE_THIS_VOLATILE (exp)
4019               && ! DECL_NONLOCAL (exp)
4020               /* Don't regard global variables as simple.  They may be
4021                  allocated in ways unknown to the compiler (shared memory,
4022                  #pragma weak, etc).  */
4023               && ! TREE_PUBLIC (exp)
4024               && ! DECL_EXTERNAL (exp)
4025               /* Loading a static variable is unduly expensive, but global
4026                  registers aren't expensive.  */
4027               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4028 }
4029 \f
4030 /* The following functions are subroutines to fold_range_test and allow it to
4031    try to change a logical combination of comparisons into a range test.
4032
4033    For example, both
4034         X == 2 || X == 3 || X == 4 || X == 5
4035    and
4036         X >= 2 && X <= 5
4037    are converted to
4038         (unsigned) (X - 2) <= 3
4039
4040    We describe each set of comparisons as being either inside or outside
4041    a range, using a variable named like IN_P, and then describe the
4042    range with a lower and upper bound.  If one of the bounds is omitted,
4043    it represents either the highest or lowest value of the type.
4044
4045    In the comments below, we represent a range by two numbers in brackets
4046    preceded by a "+" to designate being inside that range, or a "-" to
4047    designate being outside that range, so the condition can be inverted by
4048    flipping the prefix.  An omitted bound is represented by a "-".  For
4049    example, "- [-, 10]" means being outside the range starting at the lowest
4050    possible value and ending at 10, in other words, being greater than 10.
4051    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4052    always false.
4053
4054    We set up things so that the missing bounds are handled in a consistent
4055    manner so neither a missing bound nor "true" and "false" need to be
4056    handled using a special case.  */
4057
4058 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4059    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4060    and UPPER1_P are nonzero if the respective argument is an upper bound
4061    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4062    must be specified for a comparison.  ARG1 will be converted to ARG0's
4063    type if both are specified.  */
4064
4065 static tree
4066 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4067              tree arg1, int upper1_p)
4068 {
4069   tree tem;
4070   int result;
4071   int sgn0, sgn1;
4072
4073   /* If neither arg represents infinity, do the normal operation.
4074      Else, if not a comparison, return infinity.  Else handle the special
4075      comparison rules. Note that most of the cases below won't occur, but
4076      are handled for consistency.  */
4077
4078   if (arg0 != 0 && arg1 != 0)
4079     {
4080       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4081                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4082       STRIP_NOPS (tem);
4083       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4084     }
4085
4086   if (TREE_CODE_CLASS (code) != tcc_comparison)
4087     return 0;
4088
4089   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4090      for neither.  In real maths, we cannot assume open ended ranges are
4091      the same. But, this is computer arithmetic, where numbers are finite.
4092      We can therefore make the transformation of any unbounded range with
4093      the value Z, Z being greater than any representable number. This permits
4094      us to treat unbounded ranges as equal.  */
4095   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4096   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4097   switch (code)
4098     {
4099     case EQ_EXPR:
4100       result = sgn0 == sgn1;
4101       break;
4102     case NE_EXPR:
4103       result = sgn0 != sgn1;
4104       break;
4105     case LT_EXPR:
4106       result = sgn0 < sgn1;
4107       break;
4108     case LE_EXPR:
4109       result = sgn0 <= sgn1;
4110       break;
4111     case GT_EXPR:
4112       result = sgn0 > sgn1;
4113       break;
4114     case GE_EXPR:
4115       result = sgn0 >= sgn1;
4116       break;
4117     default:
4118       gcc_unreachable ();
4119     }
4120
4121   return constant_boolean_node (result, type);
4122 }
4123 \f
4124 /* Given EXP, a logical expression, set the range it is testing into
4125    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4126    actually being tested.  *PLOW and *PHIGH will be made of the same
4127    type as the returned expression.  If EXP is not a comparison, we
4128    will most likely not be returning a useful value and range.  Set
4129    *STRICT_OVERFLOW_P to true if the return value is only valid
4130    because signed overflow is undefined; otherwise, do not change
4131    *STRICT_OVERFLOW_P.  */
4132
4133 static tree
4134 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4135             bool *strict_overflow_p)
4136 {
4137   enum tree_code code;
4138   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4139   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4140   int in_p, n_in_p;
4141   tree low, high, n_low, n_high;
4142
4143   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4144      and see if we can refine the range.  Some of the cases below may not
4145      happen, but it doesn't seem worth worrying about this.  We "continue"
4146      the outer loop when we've changed something; otherwise we "break"
4147      the switch, which will "break" the while.  */
4148
4149   in_p = 0;
4150   low = high = build_int_cst (TREE_TYPE (exp), 0);
4151
4152   while (1)
4153     {
4154       code = TREE_CODE (exp);
4155       exp_type = TREE_TYPE (exp);
4156
4157       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4158         {
4159           if (TREE_OPERAND_LENGTH (exp) > 0)
4160             arg0 = TREE_OPERAND (exp, 0);
4161           if (TREE_CODE_CLASS (code) == tcc_comparison
4162               || TREE_CODE_CLASS (code) == tcc_unary
4163               || TREE_CODE_CLASS (code) == tcc_binary)
4164             arg0_type = TREE_TYPE (arg0);
4165           if (TREE_CODE_CLASS (code) == tcc_binary
4166               || TREE_CODE_CLASS (code) == tcc_comparison
4167               || (TREE_CODE_CLASS (code) == tcc_expression
4168                   && TREE_OPERAND_LENGTH (exp) > 1))
4169             arg1 = TREE_OPERAND (exp, 1);
4170         }
4171
4172       switch (code)
4173         {
4174         case TRUTH_NOT_EXPR:
4175           in_p = ! in_p, exp = arg0;
4176           continue;
4177
4178         case EQ_EXPR: case NE_EXPR:
4179         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4180           /* We can only do something if the range is testing for zero
4181              and if the second operand is an integer constant.  Note that
4182              saying something is "in" the range we make is done by
4183              complementing IN_P since it will set in the initial case of
4184              being not equal to zero; "out" is leaving it alone.  */
4185           if (low == 0 || high == 0
4186               || ! integer_zerop (low) || ! integer_zerop (high)
4187               || TREE_CODE (arg1) != INTEGER_CST)
4188             break;
4189
4190           switch (code)
4191             {
4192             case NE_EXPR:  /* - [c, c]  */
4193               low = high = arg1;
4194               break;
4195             case EQ_EXPR:  /* + [c, c]  */
4196               in_p = ! in_p, low = high = arg1;
4197               break;
4198             case GT_EXPR:  /* - [-, c] */
4199               low = 0, high = arg1;
4200               break;
4201             case GE_EXPR:  /* + [c, -] */
4202               in_p = ! in_p, low = arg1, high = 0;
4203               break;
4204             case LT_EXPR:  /* - [c, -] */
4205               low = arg1, high = 0;
4206               break;
4207             case LE_EXPR:  /* + [-, c] */
4208               in_p = ! in_p, low = 0, high = arg1;
4209               break;
4210             default:
4211               gcc_unreachable ();
4212             }
4213
4214           /* If this is an unsigned comparison, we also know that EXP is
4215              greater than or equal to zero.  We base the range tests we make
4216              on that fact, so we record it here so we can parse existing
4217              range tests.  We test arg0_type since often the return type
4218              of, e.g. EQ_EXPR, is boolean.  */
4219           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4220             {
4221               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4222                                   in_p, low, high, 1,
4223                                   build_int_cst (arg0_type, 0),
4224                                   NULL_TREE))
4225                 break;
4226
4227               in_p = n_in_p, low = n_low, high = n_high;
4228
4229               /* If the high bound is missing, but we have a nonzero low
4230                  bound, reverse the range so it goes from zero to the low bound
4231                  minus 1.  */
4232               if (high == 0 && low && ! integer_zerop (low))
4233                 {
4234                   in_p = ! in_p;
4235                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4236                                       integer_one_node, 0);
4237                   low = build_int_cst (arg0_type, 0);
4238                 }
4239             }
4240
4241           exp = arg0;
4242           continue;
4243
4244         case NEGATE_EXPR:
4245           /* (-x) IN [a,b] -> x in [-b, -a]  */
4246           n_low = range_binop (MINUS_EXPR, exp_type,
4247                                build_int_cst (exp_type, 0),
4248                                0, high, 1);
4249           n_high = range_binop (MINUS_EXPR, exp_type,
4250                                 build_int_cst (exp_type, 0),
4251                                 0, low, 0);
4252           low = n_low, high = n_high;
4253           exp = arg0;
4254           continue;
4255
4256         case BIT_NOT_EXPR:
4257           /* ~ X -> -X - 1  */
4258           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4259                         build_int_cst (exp_type, 1));
4260           continue;
4261
4262         case PLUS_EXPR:  case MINUS_EXPR:
4263           if (TREE_CODE (arg1) != INTEGER_CST)
4264             break;
4265
4266           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4267              move a constant to the other side.  */
4268           if (!TYPE_UNSIGNED (arg0_type)
4269               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4270             break;
4271
4272           /* If EXP is signed, any overflow in the computation is undefined,
4273              so we don't worry about it so long as our computations on
4274              the bounds don't overflow.  For unsigned, overflow is defined
4275              and this is exactly the right thing.  */
4276           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4277                                arg0_type, low, 0, arg1, 0);
4278           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4279                                 arg0_type, high, 1, arg1, 0);
4280           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4281               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4282             break;
4283
4284           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4285             *strict_overflow_p = true;
4286
4287           /* Check for an unsigned range which has wrapped around the maximum
4288              value thus making n_high < n_low, and normalize it.  */
4289           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4290             {
4291               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4292                                  integer_one_node, 0);
4293               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4294                                   integer_one_node, 0);
4295
4296               /* If the range is of the form +/- [ x+1, x ], we won't
4297                  be able to normalize it.  But then, it represents the
4298                  whole range or the empty set, so make it
4299                  +/- [ -, - ].  */
4300               if (tree_int_cst_equal (n_low, low)
4301                   && tree_int_cst_equal (n_high, high))
4302                 low = high = 0;
4303               else
4304                 in_p = ! in_p;
4305             }
4306           else
4307             low = n_low, high = n_high;
4308
4309           exp = arg0;
4310           continue;
4311
4312         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
4313           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4314             break;
4315
4316           if (! INTEGRAL_TYPE_P (arg0_type)
4317               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4318               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4319             break;
4320
4321           n_low = low, n_high = high;
4322
4323           if (n_low != 0)
4324             n_low = fold_convert (arg0_type, n_low);
4325
4326           if (n_high != 0)
4327             n_high = fold_convert (arg0_type, n_high);
4328
4329
4330           /* If we're converting arg0 from an unsigned type, to exp,
4331              a signed type,  we will be doing the comparison as unsigned.
4332              The tests above have already verified that LOW and HIGH
4333              are both positive.
4334
4335              So we have to ensure that we will handle large unsigned
4336              values the same way that the current signed bounds treat
4337              negative values.  */
4338
4339           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4340             {
4341               tree high_positive;
4342               tree equiv_type;
4343               /* For fixed-point modes, we need to pass the saturating flag
4344                  as the 2nd parameter.  */
4345               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4346                 equiv_type = lang_hooks.types.type_for_mode
4347                              (TYPE_MODE (arg0_type),
4348                               TYPE_SATURATING (arg0_type));
4349               else
4350                 equiv_type = lang_hooks.types.type_for_mode
4351                              (TYPE_MODE (arg0_type), 1);
4352
4353               /* A range without an upper bound is, naturally, unbounded.
4354                  Since convert would have cropped a very large value, use
4355                  the max value for the destination type.  */
4356               high_positive
4357                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4358                 : TYPE_MAX_VALUE (arg0_type);
4359
4360               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4361                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4362                                              fold_convert (arg0_type,
4363                                                            high_positive),
4364                                              build_int_cst (arg0_type, 1));
4365
4366               /* If the low bound is specified, "and" the range with the
4367                  range for which the original unsigned value will be
4368                  positive.  */
4369               if (low != 0)
4370                 {
4371                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4372                                       1, n_low, n_high, 1,
4373                                       fold_convert (arg0_type,
4374                                                     integer_zero_node),
4375                                       high_positive))
4376                     break;
4377
4378                   in_p = (n_in_p == in_p);
4379                 }
4380               else
4381                 {
4382                   /* Otherwise, "or" the range with the range of the input
4383                      that will be interpreted as negative.  */
4384                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4385                                       0, n_low, n_high, 1,
4386                                       fold_convert (arg0_type,
4387                                                     integer_zero_node),
4388                                       high_positive))
4389                     break;
4390
4391                   in_p = (in_p != n_in_p);
4392                 }
4393             }
4394
4395           exp = arg0;
4396           low = n_low, high = n_high;
4397           continue;
4398
4399         default:
4400           break;
4401         }
4402
4403       break;
4404     }
4405
4406   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4407   if (TREE_CODE (exp) == INTEGER_CST)
4408     {
4409       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4410                                                  exp, 0, low, 0))
4411                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4412                                                     exp, 1, high, 1)));
4413       low = high = 0;
4414       exp = 0;
4415     }
4416
4417   *pin_p = in_p, *plow = low, *phigh = high;
4418   return exp;
4419 }
4420 \f
4421 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4422    type, TYPE, return an expression to test if EXP is in (or out of, depending
4423    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4424
4425 static tree
4426 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4427 {
4428   tree etype = TREE_TYPE (exp);
4429   tree value;
4430
4431 #ifdef HAVE_canonicalize_funcptr_for_compare
4432   /* Disable this optimization for function pointer expressions
4433      on targets that require function pointer canonicalization.  */
4434   if (HAVE_canonicalize_funcptr_for_compare
4435       && TREE_CODE (etype) == POINTER_TYPE
4436       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4437     return NULL_TREE;
4438 #endif
4439
4440   if (! in_p)
4441     {
4442       value = build_range_check (type, exp, 1, low, high);
4443       if (value != 0)
4444         return invert_truthvalue (value);
4445
4446       return 0;
4447     }
4448
4449   if (low == 0 && high == 0)
4450     return build_int_cst (type, 1);
4451
4452   if (low == 0)
4453     return fold_build2 (LE_EXPR, type, exp,
4454                         fold_convert (etype, high));
4455
4456   if (high == 0)
4457     return fold_build2 (GE_EXPR, type, exp,
4458                         fold_convert (etype, low));
4459
4460   if (operand_equal_p (low, high, 0))
4461     return fold_build2 (EQ_EXPR, type, exp,
4462                         fold_convert (etype, low));
4463
4464   if (integer_zerop (low))
4465     {
4466       if (! TYPE_UNSIGNED (etype))
4467         {
4468           etype = unsigned_type_for (etype);
4469           high = fold_convert (etype, high);
4470           exp = fold_convert (etype, exp);
4471         }
4472       return build_range_check (type, exp, 1, 0, high);
4473     }
4474
4475   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4476   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4477     {
4478       unsigned HOST_WIDE_INT lo;
4479       HOST_WIDE_INT hi;
4480       int prec;
4481
4482       prec = TYPE_PRECISION (etype);
4483       if (prec <= HOST_BITS_PER_WIDE_INT)
4484         {
4485           hi = 0;
4486           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4487         }
4488       else
4489         {
4490           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4491           lo = (unsigned HOST_WIDE_INT) -1;
4492         }
4493
4494       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4495         {
4496           if (TYPE_UNSIGNED (etype))
4497             {
4498               etype = signed_type_for (etype);
4499               exp = fold_convert (etype, exp);
4500             }
4501           return fold_build2 (GT_EXPR, type, exp,
4502                               build_int_cst (etype, 0));
4503         }
4504     }
4505
4506   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4507      This requires wrap-around arithmetics for the type of the expression.  */
4508   switch (TREE_CODE (etype))
4509     {
4510     case INTEGER_TYPE:
4511       /* There is no requirement that LOW be within the range of ETYPE
4512          if the latter is a subtype.  It must, however, be within the base
4513          type of ETYPE.  So be sure we do the subtraction in that type.  */
4514       if (TREE_TYPE (etype))
4515         etype = TREE_TYPE (etype);
4516       break;
4517
4518     case ENUMERAL_TYPE:
4519     case BOOLEAN_TYPE:
4520       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4521                                               TYPE_UNSIGNED (etype));
4522       break;
4523
4524     default:
4525       break;
4526     }
4527
4528   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4529   if (TREE_CODE (etype) == INTEGER_TYPE
4530       && !TYPE_OVERFLOW_WRAPS (etype))
4531     {
4532       tree utype, minv, maxv;
4533
4534       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4535          for the type in question, as we rely on this here.  */
4536       utype = unsigned_type_for (etype);
4537       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4538       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4539                           integer_one_node, 1);
4540       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4541
4542       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4543                                       minv, 1, maxv, 1)))
4544         etype = utype;
4545       else
4546         return 0;
4547     }
4548
4549   high = fold_convert (etype, high);
4550   low = fold_convert (etype, low);
4551   exp = fold_convert (etype, exp);
4552
4553   value = const_binop (MINUS_EXPR, high, low, 0);
4554
4555
4556   if (POINTER_TYPE_P (etype))
4557     {
4558       if (value != 0 && !TREE_OVERFLOW (value))
4559         {
4560           low = fold_convert (sizetype, low);
4561           low = fold_build1 (NEGATE_EXPR, sizetype, low);
4562           return build_range_check (type,
4563                                     fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4564                                     1, build_int_cst (etype, 0), value);
4565         }
4566       return 0;
4567     }
4568
4569   if (value != 0 && !TREE_OVERFLOW (value))
4570     return build_range_check (type,
4571                               fold_build2 (MINUS_EXPR, etype, exp, low),
4572                               1, build_int_cst (etype, 0), value);
4573
4574   return 0;
4575 }
4576 \f
4577 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4578
4579 static tree
4580 range_predecessor (tree val)
4581 {
4582   tree type = TREE_TYPE (val);
4583
4584   if (INTEGRAL_TYPE_P (type)
4585       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4586     return 0;
4587   else
4588     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4589 }
4590
4591 /* Return the successor of VAL in its type, handling the infinite case.  */
4592
4593 static tree
4594 range_successor (tree val)
4595 {
4596   tree type = TREE_TYPE (val);
4597
4598   if (INTEGRAL_TYPE_P (type)
4599       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4600     return 0;
4601   else
4602     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4603 }
4604
4605 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4606    can, 0 if we can't.  Set the output range into the specified parameters.  */
4607
4608 static int
4609 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4610               tree high0, int in1_p, tree low1, tree high1)
4611 {
4612   int no_overlap;
4613   int subset;
4614   int temp;
4615   tree tem;
4616   int in_p;
4617   tree low, high;
4618   int lowequal = ((low0 == 0 && low1 == 0)
4619                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4620                                                 low0, 0, low1, 0)));
4621   int highequal = ((high0 == 0 && high1 == 0)
4622                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4623                                                  high0, 1, high1, 1)));
4624
4625   /* Make range 0 be the range that starts first, or ends last if they
4626      start at the same value.  Swap them if it isn't.  */
4627   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4628                                  low0, 0, low1, 0))
4629       || (lowequal
4630           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4631                                         high1, 1, high0, 1))))
4632     {
4633       temp = in0_p, in0_p = in1_p, in1_p = temp;
4634       tem = low0, low0 = low1, low1 = tem;
4635       tem = high0, high0 = high1, high1 = tem;
4636     }
4637
4638   /* Now flag two cases, whether the ranges are disjoint or whether the
4639      second range is totally subsumed in the first.  Note that the tests
4640      below are simplified by the ones above.  */
4641   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4642                                           high0, 1, low1, 0));
4643   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4644                                       high1, 1, high0, 1));
4645
4646   /* We now have four cases, depending on whether we are including or
4647      excluding the two ranges.  */
4648   if (in0_p && in1_p)
4649     {
4650       /* If they don't overlap, the result is false.  If the second range
4651          is a subset it is the result.  Otherwise, the range is from the start
4652          of the second to the end of the first.  */
4653       if (no_overlap)
4654         in_p = 0, low = high = 0;
4655       else if (subset)
4656         in_p = 1, low = low1, high = high1;
4657       else
4658         in_p = 1, low = low1, high = high0;
4659     }
4660
4661   else if (in0_p && ! in1_p)
4662     {
4663       /* If they don't overlap, the result is the first range.  If they are
4664          equal, the result is false.  If the second range is a subset of the
4665          first, and the ranges begin at the same place, we go from just after
4666          the end of the second range to the end of the first.  If the second
4667          range is not a subset of the first, or if it is a subset and both
4668          ranges end at the same place, the range starts at the start of the
4669          first range and ends just before the second range.
4670          Otherwise, we can't describe this as a single range.  */
4671       if (no_overlap)
4672         in_p = 1, low = low0, high = high0;
4673       else if (lowequal && highequal)
4674         in_p = 0, low = high = 0;
4675       else if (subset && lowequal)
4676         {
4677           low = range_successor (high1);
4678           high = high0;
4679           in_p = 1;
4680           if (low == 0)
4681             {
4682               /* We are in the weird situation where high0 > high1 but
4683                  high1 has no successor.  Punt.  */
4684               return 0;
4685             }
4686         }
4687       else if (! subset || highequal)
4688         {
4689           low = low0;
4690           high = range_predecessor (low1);
4691           in_p = 1;
4692           if (high == 0)
4693             {
4694               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4695               return 0;
4696             }
4697         }
4698       else
4699         return 0;
4700     }
4701
4702   else if (! in0_p && in1_p)
4703     {
4704       /* If they don't overlap, the result is the second range.  If the second
4705          is a subset of the first, the result is false.  Otherwise,
4706          the range starts just after the first range and ends at the
4707          end of the second.  */
4708       if (no_overlap)
4709         in_p = 1, low = low1, high = high1;
4710       else if (subset || highequal)
4711         in_p = 0, low = high = 0;
4712       else
4713         {
4714           low = range_successor (high0);
4715           high = high1;
4716           in_p = 1;
4717           if (low == 0)
4718             {
4719               /* high1 > high0 but high0 has no successor.  Punt.  */
4720               return 0;
4721             }
4722         }
4723     }
4724
4725   else
4726     {
4727       /* The case where we are excluding both ranges.  Here the complex case
4728          is if they don't overlap.  In that case, the only time we have a
4729          range is if they are adjacent.  If the second is a subset of the
4730          first, the result is the first.  Otherwise, the range to exclude
4731          starts at the beginning of the first range and ends at the end of the
4732          second.  */
4733       if (no_overlap)
4734         {
4735           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4736                                          range_successor (high0),
4737                                          1, low1, 0)))
4738             in_p = 0, low = low0, high = high1;
4739           else
4740             {
4741               /* Canonicalize - [min, x] into - [-, x].  */
4742               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4743                 switch (TREE_CODE (TREE_TYPE (low0)))
4744                   {
4745                   case ENUMERAL_TYPE:
4746                     if (TYPE_PRECISION (TREE_TYPE (low0))
4747                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4748                       break;
4749                     /* FALLTHROUGH */
4750                   case INTEGER_TYPE:
4751                     if (tree_int_cst_equal (low0,
4752                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4753                       low0 = 0;
4754                     break;
4755                   case POINTER_TYPE:
4756                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4757                         && integer_zerop (low0))
4758                       low0 = 0;
4759                     break;
4760                   default:
4761                     break;
4762                   }
4763
4764               /* Canonicalize - [x, max] into - [x, -].  */
4765               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4766                 switch (TREE_CODE (TREE_TYPE (high1)))
4767                   {
4768                   case ENUMERAL_TYPE:
4769                     if (TYPE_PRECISION (TREE_TYPE (high1))
4770                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4771                       break;
4772                     /* FALLTHROUGH */
4773                   case INTEGER_TYPE:
4774                     if (tree_int_cst_equal (high1,
4775                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4776                       high1 = 0;
4777                     break;
4778                   case POINTER_TYPE:
4779                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4780                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4781                                                        high1, 1,
4782                                                        integer_one_node, 1)))
4783                       high1 = 0;
4784                     break;
4785                   default:
4786                     break;
4787                   }
4788
4789               /* The ranges might be also adjacent between the maximum and
4790                  minimum values of the given type.  For
4791                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4792                  return + [x + 1, y - 1].  */
4793               if (low0 == 0 && high1 == 0)
4794                 {
4795                   low = range_successor (high0);
4796                   high = range_predecessor (low1);
4797                   if (low == 0 || high == 0)
4798                     return 0;
4799
4800                   in_p = 1;
4801                 }
4802               else
4803                 return 0;
4804             }
4805         }
4806       else if (subset)
4807         in_p = 0, low = low0, high = high0;
4808       else
4809         in_p = 0, low = low0, high = high1;
4810     }
4811
4812   *pin_p = in_p, *plow = low, *phigh = high;
4813   return 1;
4814 }
4815 \f
4816
4817 /* Subroutine of fold, looking inside expressions of the form
4818    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4819    of the COND_EXPR.  This function is being used also to optimize
4820    A op B ? C : A, by reversing the comparison first.
4821
4822    Return a folded expression whose code is not a COND_EXPR
4823    anymore, or NULL_TREE if no folding opportunity is found.  */
4824
4825 static tree
4826 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4827 {
4828   enum tree_code comp_code = TREE_CODE (arg0);
4829   tree arg00 = TREE_OPERAND (arg0, 0);
4830   tree arg01 = TREE_OPERAND (arg0, 1);
4831   tree arg1_type = TREE_TYPE (arg1);
4832   tree tem;
4833
4834   STRIP_NOPS (arg1);
4835   STRIP_NOPS (arg2);
4836
4837   /* If we have A op 0 ? A : -A, consider applying the following
4838      transformations:
4839
4840      A == 0? A : -A    same as -A
4841      A != 0? A : -A    same as A
4842      A >= 0? A : -A    same as abs (A)
4843      A > 0?  A : -A    same as abs (A)
4844      A <= 0? A : -A    same as -abs (A)
4845      A < 0?  A : -A    same as -abs (A)
4846
4847      None of these transformations work for modes with signed
4848      zeros.  If A is +/-0, the first two transformations will
4849      change the sign of the result (from +0 to -0, or vice
4850      versa).  The last four will fix the sign of the result,
4851      even though the original expressions could be positive or
4852      negative, depending on the sign of A.
4853
4854      Note that all these transformations are correct if A is
4855      NaN, since the two alternatives (A and -A) are also NaNs.  */
4856   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4857       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4858           ? real_zerop (arg01)
4859           : integer_zerop (arg01))
4860       && ((TREE_CODE (arg2) == NEGATE_EXPR
4861            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4862              /* In the case that A is of the form X-Y, '-A' (arg2) may
4863                 have already been folded to Y-X, check for that. */
4864           || (TREE_CODE (arg1) == MINUS_EXPR
4865               && TREE_CODE (arg2) == MINUS_EXPR
4866               && operand_equal_p (TREE_OPERAND (arg1, 0),
4867                                   TREE_OPERAND (arg2, 1), 0)
4868               && operand_equal_p (TREE_OPERAND (arg1, 1),
4869                                   TREE_OPERAND (arg2, 0), 0))))
4870     switch (comp_code)
4871       {
4872       case EQ_EXPR:
4873       case UNEQ_EXPR:
4874         tem = fold_convert (arg1_type, arg1);
4875         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4876       case NE_EXPR:
4877       case LTGT_EXPR:
4878         return pedantic_non_lvalue (fold_convert (type, arg1));
4879       case UNGE_EXPR:
4880       case UNGT_EXPR:
4881         if (flag_trapping_math)
4882           break;
4883         /* Fall through.  */
4884       case GE_EXPR:
4885       case GT_EXPR:
4886         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4887           arg1 = fold_convert (signed_type_for
4888                                (TREE_TYPE (arg1)), arg1);
4889         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4890         return pedantic_non_lvalue (fold_convert (type, tem));
4891       case UNLE_EXPR:
4892       case UNLT_EXPR:
4893         if (flag_trapping_math)
4894           break;
4895       case LE_EXPR:
4896       case LT_EXPR:
4897         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4898           arg1 = fold_convert (signed_type_for
4899                                (TREE_TYPE (arg1)), arg1);
4900         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4901         return negate_expr (fold_convert (type, tem));
4902       default:
4903         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4904         break;
4905       }
4906
4907   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4908      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4909      both transformations are correct when A is NaN: A != 0
4910      is then true, and A == 0 is false.  */
4911
4912   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4913       && integer_zerop (arg01) && integer_zerop (arg2))
4914     {
4915       if (comp_code == NE_EXPR)
4916         return pedantic_non_lvalue (fold_convert (type, arg1));
4917       else if (comp_code == EQ_EXPR)
4918         return build_int_cst (type, 0);
4919     }
4920
4921   /* Try some transformations of A op B ? A : B.
4922
4923      A == B? A : B    same as B
4924      A != B? A : B    same as A
4925      A >= B? A : B    same as max (A, B)
4926      A > B?  A : B    same as max (B, A)
4927      A <= B? A : B    same as min (A, B)
4928      A < B?  A : B    same as min (B, A)
4929
4930      As above, these transformations don't work in the presence
4931      of signed zeros.  For example, if A and B are zeros of
4932      opposite sign, the first two transformations will change
4933      the sign of the result.  In the last four, the original
4934      expressions give different results for (A=+0, B=-0) and
4935      (A=-0, B=+0), but the transformed expressions do not.
4936
4937      The first two transformations are correct if either A or B
4938      is a NaN.  In the first transformation, the condition will
4939      be false, and B will indeed be chosen.  In the case of the
4940      second transformation, the condition A != B will be true,
4941      and A will be chosen.
4942
4943      The conversions to max() and min() are not correct if B is
4944      a number and A is not.  The conditions in the original
4945      expressions will be false, so all four give B.  The min()
4946      and max() versions would give a NaN instead.  */
4947   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4948       && operand_equal_for_comparison_p (arg01, arg2, arg00)
4949       /* Avoid these transformations if the COND_EXPR may be used
4950          as an lvalue in the C++ front-end.  PR c++/19199.  */
4951       && (in_gimple_form
4952           || (strcmp (lang_hooks.name, "GNU C++") != 0
4953               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4954           || ! maybe_lvalue_p (arg1)
4955           || ! maybe_lvalue_p (arg2)))
4956     {
4957       tree comp_op0 = arg00;
4958       tree comp_op1 = arg01;
4959       tree comp_type = TREE_TYPE (comp_op0);
4960
4961       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4962       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4963         {
4964           comp_type = type;
4965           comp_op0 = arg1;
4966           comp_op1 = arg2;
4967         }
4968
4969       switch (comp_code)
4970         {
4971         case EQ_EXPR:
4972           return pedantic_non_lvalue (fold_convert (type, arg2));
4973         case NE_EXPR:
4974           return pedantic_non_lvalue (fold_convert (type, arg1));
4975         case LE_EXPR:
4976         case LT_EXPR:
4977         case UNLE_EXPR:
4978         case UNLT_EXPR:
4979           /* In C++ a ?: expression can be an lvalue, so put the
4980              operand which will be used if they are equal first
4981              so that we can convert this back to the
4982              corresponding COND_EXPR.  */
4983           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4984             {
4985               comp_op0 = fold_convert (comp_type, comp_op0);
4986               comp_op1 = fold_convert (comp_type, comp_op1);
4987               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4988                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4989                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4990               return pedantic_non_lvalue (fold_convert (type, tem));
4991             }
4992           break;
4993         case GE_EXPR:
4994         case GT_EXPR:
4995         case UNGE_EXPR:
4996         case UNGT_EXPR:
4997           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4998             {
4999               comp_op0 = fold_convert (comp_type, comp_op0);
5000               comp_op1 = fold_convert (comp_type, comp_op1);
5001               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5002                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5003                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5004               return pedantic_non_lvalue (fold_convert (type, tem));
5005             }
5006           break;
5007         case UNEQ_EXPR:
5008           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5009             return pedantic_non_lvalue (fold_convert (type, arg2));
5010           break;
5011         case LTGT_EXPR:
5012           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5013             return pedantic_non_lvalue (fold_convert (type, arg1));
5014           break;
5015         default:
5016           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5017           break;
5018         }
5019     }
5020
5021   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5022      we might still be able to simplify this.  For example,
5023      if C1 is one less or one more than C2, this might have started
5024      out as a MIN or MAX and been transformed by this function.
5025      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5026
5027   if (INTEGRAL_TYPE_P (type)
5028       && TREE_CODE (arg01) == INTEGER_CST
5029       && TREE_CODE (arg2) == INTEGER_CST)
5030     switch (comp_code)
5031       {
5032       case EQ_EXPR:
5033         /* We can replace A with C1 in this case.  */
5034         arg1 = fold_convert (type, arg01);
5035         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5036
5037       case LT_EXPR:
5038         /* If C1 is C2 + 1, this is min(A, C2).  */
5039         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5040                                OEP_ONLY_CONST)
5041             && operand_equal_p (arg01,
5042                                 const_binop (PLUS_EXPR, arg2,
5043                                              build_int_cst (type, 1), 0),
5044                                 OEP_ONLY_CONST))
5045           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5046                                                    type,
5047                                                    fold_convert (type, arg1),
5048                                                    arg2));
5049         break;
5050
5051       case LE_EXPR:
5052         /* If C1 is C2 - 1, this is min(A, C2).  */
5053         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5054                                OEP_ONLY_CONST)
5055             && operand_equal_p (arg01,
5056                                 const_binop (MINUS_EXPR, arg2,
5057                                              build_int_cst (type, 1), 0),
5058                                 OEP_ONLY_CONST))
5059           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5060                                                    type,
5061                                                    fold_convert (type, arg1),
5062                                                    arg2));
5063         break;
5064
5065       case GT_EXPR:
5066         /* If C1 is C2 - 1, this is max(A, C2).  */
5067         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5068                                OEP_ONLY_CONST)
5069             && operand_equal_p (arg01,
5070                                 const_binop (MINUS_EXPR, arg2,
5071                                              build_int_cst (type, 1), 0),
5072                                 OEP_ONLY_CONST))
5073           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5074                                                    type,
5075                                                    fold_convert (type, arg1),
5076                                                    arg2));
5077         break;
5078
5079       case GE_EXPR:
5080         /* If C1 is C2 + 1, this is max(A, C2).  */
5081         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5082                                OEP_ONLY_CONST)
5083             && operand_equal_p (arg01,
5084                                 const_binop (PLUS_EXPR, arg2,
5085                                              build_int_cst (type, 1), 0),
5086                                 OEP_ONLY_CONST))
5087           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5088                                                    type,
5089                                                    fold_convert (type, arg1),
5090                                                    arg2));
5091         break;
5092       case NE_EXPR:
5093         break;
5094       default:
5095         gcc_unreachable ();
5096       }
5097
5098   return NULL_TREE;
5099 }
5100
5101
5102 \f
5103 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5104 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
5105 #endif
5106
5107 /* EXP is some logical combination of boolean tests.  See if we can
5108    merge it into some range test.  Return the new tree if so.  */
5109
5110 static tree
5111 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5112 {
5113   int or_op = (code == TRUTH_ORIF_EXPR
5114                || code == TRUTH_OR_EXPR);
5115   int in0_p, in1_p, in_p;
5116   tree low0, low1, low, high0, high1, high;
5117   bool strict_overflow_p = false;
5118   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5119   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5120   tree tem;
5121   const char * const warnmsg = G_("assuming signed overflow does not occur "
5122                                   "when simplifying range test");
5123
5124   /* If this is an OR operation, invert both sides; we will invert
5125      again at the end.  */
5126   if (or_op)
5127     in0_p = ! in0_p, in1_p = ! in1_p;
5128
5129   /* If both expressions are the same, if we can merge the ranges, and we
5130      can build the range test, return it or it inverted.  If one of the
5131      ranges is always true or always false, consider it to be the same
5132      expression as the other.  */
5133   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5134       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5135                        in1_p, low1, high1)
5136       && 0 != (tem = (build_range_check (type,
5137                                          lhs != 0 ? lhs
5138                                          : rhs != 0 ? rhs : integer_zero_node,
5139                                          in_p, low, high))))
5140     {
5141       if (strict_overflow_p)
5142         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5143       return or_op ? invert_truthvalue (tem) : tem;
5144     }
5145
5146   /* On machines where the branch cost is expensive, if this is a
5147      short-circuited branch and the underlying object on both sides
5148      is the same, make a non-short-circuit operation.  */
5149   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5150            && lhs != 0 && rhs != 0
5151            && (code == TRUTH_ANDIF_EXPR
5152                || code == TRUTH_ORIF_EXPR)
5153            && operand_equal_p (lhs, rhs, 0))
5154     {
5155       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5156          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5157          which cases we can't do this.  */
5158       if (simple_operand_p (lhs))
5159         return build2 (code == TRUTH_ANDIF_EXPR
5160                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5161                        type, op0, op1);
5162
5163       else if (lang_hooks.decls.global_bindings_p () == 0
5164                && ! CONTAINS_PLACEHOLDER_P (lhs))
5165         {
5166           tree common = save_expr (lhs);
5167
5168           if (0 != (lhs = build_range_check (type, common,
5169                                              or_op ? ! in0_p : in0_p,
5170                                              low0, high0))
5171               && (0 != (rhs = build_range_check (type, common,
5172                                                  or_op ? ! in1_p : in1_p,
5173                                                  low1, high1))))
5174             {
5175               if (strict_overflow_p)
5176                 fold_overflow_warning (warnmsg,
5177                                        WARN_STRICT_OVERFLOW_COMPARISON);
5178               return build2 (code == TRUTH_ANDIF_EXPR
5179                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5180                              type, lhs, rhs);
5181             }
5182         }
5183     }
5184
5185   return 0;
5186 }
5187 \f
5188 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5189    bit value.  Arrange things so the extra bits will be set to zero if and
5190    only if C is signed-extended to its full width.  If MASK is nonzero,
5191    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5192
5193 static tree
5194 unextend (tree c, int p, int unsignedp, tree mask)
5195 {
5196   tree type = TREE_TYPE (c);
5197   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5198   tree temp;
5199
5200   if (p == modesize || unsignedp)
5201     return c;
5202
5203   /* We work by getting just the sign bit into the low-order bit, then
5204      into the high-order bit, then sign-extend.  We then XOR that value
5205      with C.  */
5206   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5207   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5208
5209   /* We must use a signed type in order to get an arithmetic right shift.
5210      However, we must also avoid introducing accidental overflows, so that
5211      a subsequent call to integer_zerop will work.  Hence we must
5212      do the type conversion here.  At this point, the constant is either
5213      zero or one, and the conversion to a signed type can never overflow.
5214      We could get an overflow if this conversion is done anywhere else.  */
5215   if (TYPE_UNSIGNED (type))
5216     temp = fold_convert (signed_type_for (type), temp);
5217
5218   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5219   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5220   if (mask != 0)
5221     temp = const_binop (BIT_AND_EXPR, temp,
5222                         fold_convert (TREE_TYPE (c), mask), 0);
5223   /* If necessary, convert the type back to match the type of C.  */
5224   if (TYPE_UNSIGNED (type))
5225     temp = fold_convert (type, temp);
5226
5227   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5228 }
5229 \f
5230 /* Find ways of folding logical expressions of LHS and RHS:
5231    Try to merge two comparisons to the same innermost item.
5232    Look for range tests like "ch >= '0' && ch <= '9'".
5233    Look for combinations of simple terms on machines with expensive branches
5234    and evaluate the RHS unconditionally.
5235
5236    For example, if we have p->a == 2 && p->b == 4 and we can make an
5237    object large enough to span both A and B, we can do this with a comparison
5238    against the object ANDed with the a mask.
5239
5240    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5241    operations to do this with one comparison.
5242
5243    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5244    function and the one above.
5245
5246    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5247    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5248
5249    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5250    two operands.
5251
5252    We return the simplified tree or 0 if no optimization is possible.  */
5253
5254 static tree
5255 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5256 {
5257   /* If this is the "or" of two comparisons, we can do something if
5258      the comparisons are NE_EXPR.  If this is the "and", we can do something
5259      if the comparisons are EQ_EXPR.  I.e.,
5260         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5261
5262      WANTED_CODE is this operation code.  For single bit fields, we can
5263      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5264      comparison for one-bit fields.  */
5265
5266   enum tree_code wanted_code;
5267   enum tree_code lcode, rcode;
5268   tree ll_arg, lr_arg, rl_arg, rr_arg;
5269   tree ll_inner, lr_inner, rl_inner, rr_inner;
5270   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5271   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5272   HOST_WIDE_INT xll_bitpos, xrl_bitpos;
5273   HOST_WIDE_INT lnbitsize, lnbitpos;
5274   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5275   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5276   enum machine_mode lnmode;
5277   tree ll_mask, lr_mask, rl_mask, rr_mask;
5278   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5279   tree l_const, r_const;
5280   tree lntype, result;
5281   int first_bit, end_bit;
5282   int volatilep;
5283   tree orig_lhs = lhs, orig_rhs = rhs;
5284   enum tree_code orig_code = code;
5285
5286   /* Start by getting the comparison codes.  Fail if anything is volatile.
5287      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5288      it were surrounded with a NE_EXPR.  */
5289
5290   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5291     return 0;
5292
5293   lcode = TREE_CODE (lhs);
5294   rcode = TREE_CODE (rhs);
5295
5296   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5297     {
5298       lhs = build2 (NE_EXPR, truth_type, lhs,
5299                     build_int_cst (TREE_TYPE (lhs), 0));
5300       lcode = NE_EXPR;
5301     }
5302
5303   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5304     {
5305       rhs = build2 (NE_EXPR, truth_type, rhs,
5306                     build_int_cst (TREE_TYPE (rhs), 0));
5307       rcode = NE_EXPR;
5308     }
5309
5310   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5311       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5312     return 0;
5313
5314   ll_arg = TREE_OPERAND (lhs, 0);
5315   lr_arg = TREE_OPERAND (lhs, 1);
5316   rl_arg = TREE_OPERAND (rhs, 0);
5317   rr_arg = TREE_OPERAND (rhs, 1);
5318
5319   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5320   if (simple_operand_p (ll_arg)
5321       && simple_operand_p (lr_arg))
5322     {
5323       tree result;
5324       if (operand_equal_p (ll_arg, rl_arg, 0)
5325           && operand_equal_p (lr_arg, rr_arg, 0))
5326         {
5327           result = combine_comparisons (code, lcode, rcode,
5328                                         truth_type, ll_arg, lr_arg);
5329           if (result)
5330             return result;
5331         }
5332       else if (operand_equal_p (ll_arg, rr_arg, 0)
5333                && operand_equal_p (lr_arg, rl_arg, 0))
5334         {
5335           result = combine_comparisons (code, lcode,
5336                                         swap_tree_comparison (rcode),
5337                                         truth_type, ll_arg, lr_arg);
5338           if (result)
5339             return result;
5340         }
5341     }
5342
5343   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5344           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5345
5346   /* If the RHS can be evaluated unconditionally and its operands are
5347      simple, it wins to evaluate the RHS unconditionally on machines
5348      with expensive branches.  In this case, this isn't a comparison
5349      that can be merged.  Avoid doing this if the RHS is a floating-point
5350      comparison since those can trap.  */
5351
5352   if (BRANCH_COST >= 2
5353       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5354       && simple_operand_p (rl_arg)
5355       && simple_operand_p (rr_arg))
5356     {
5357       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5358       if (code == TRUTH_OR_EXPR
5359           && lcode == NE_EXPR && integer_zerop (lr_arg)
5360           && rcode == NE_EXPR && integer_zerop (rr_arg)
5361           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5362           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5363         return build2 (NE_EXPR, truth_type,
5364                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5365                                ll_arg, rl_arg),
5366                        build_int_cst (TREE_TYPE (ll_arg), 0));
5367
5368       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5369       if (code == TRUTH_AND_EXPR
5370           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5371           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5372           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5373           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5374         return build2 (EQ_EXPR, truth_type,
5375                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5376                                ll_arg, rl_arg),
5377                        build_int_cst (TREE_TYPE (ll_arg), 0));
5378
5379       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5380         {
5381           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5382             return build2 (code, truth_type, lhs, rhs);
5383           return NULL_TREE;
5384         }
5385     }
5386
5387   /* See if the comparisons can be merged.  Then get all the parameters for
5388      each side.  */
5389
5390   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5391       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5392     return 0;
5393
5394   volatilep = 0;
5395   ll_inner = decode_field_reference (ll_arg,
5396                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5397                                      &ll_unsignedp, &volatilep, &ll_mask,
5398                                      &ll_and_mask);
5399   lr_inner = decode_field_reference (lr_arg,
5400                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5401                                      &lr_unsignedp, &volatilep, &lr_mask,
5402                                      &lr_and_mask);
5403   rl_inner = decode_field_reference (rl_arg,
5404                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5405                                      &rl_unsignedp, &volatilep, &rl_mask,
5406                                      &rl_and_mask);
5407   rr_inner = decode_field_reference (rr_arg,
5408                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5409                                      &rr_unsignedp, &volatilep, &rr_mask,
5410                                      &rr_and_mask);
5411
5412   /* It must be true that the inner operation on the lhs of each
5413      comparison must be the same if we are to be able to do anything.
5414      Then see if we have constants.  If not, the same must be true for
5415      the rhs's.  */
5416   if (volatilep || ll_inner == 0 || rl_inner == 0
5417       || ! operand_equal_p (ll_inner, rl_inner, 0))
5418     return 0;
5419
5420   if (TREE_CODE (lr_arg) == INTEGER_CST
5421       && TREE_CODE (rr_arg) == INTEGER_CST)
5422     l_const = lr_arg, r_const = rr_arg;
5423   else if (lr_inner == 0 || rr_inner == 0
5424            || ! operand_equal_p (lr_inner, rr_inner, 0))
5425     return 0;
5426   else
5427     l_const = r_const = 0;
5428
5429   /* If either comparison code is not correct for our logical operation,
5430      fail.  However, we can convert a one-bit comparison against zero into
5431      the opposite comparison against that bit being set in the field.  */
5432
5433   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5434   if (lcode != wanted_code)
5435     {
5436       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5437         {
5438           /* Make the left operand unsigned, since we are only interested
5439              in the value of one bit.  Otherwise we are doing the wrong
5440              thing below.  */
5441           ll_unsignedp = 1;
5442           l_const = ll_mask;
5443         }
5444       else
5445         return 0;
5446     }
5447
5448   /* This is analogous to the code for l_const above.  */
5449   if (rcode != wanted_code)
5450     {
5451       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5452         {
5453           rl_unsignedp = 1;
5454           r_const = rl_mask;
5455         }
5456       else
5457         return 0;
5458     }
5459
5460   /* See if we can find a mode that contains both fields being compared on
5461      the left.  If we can't, fail.  Otherwise, update all constants and masks
5462      to be relative to a field of that size.  */
5463   first_bit = MIN (ll_bitpos, rl_bitpos);
5464   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5465   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5466                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5467                           volatilep);
5468   if (lnmode == VOIDmode)
5469     return 0;
5470
5471   lnbitsize = GET_MODE_BITSIZE (lnmode);
5472   lnbitpos = first_bit & ~ (lnbitsize - 1);
5473   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5474   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5475
5476   if (BYTES_BIG_ENDIAN)
5477     {
5478       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5479       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5480     }
5481
5482   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5483                          size_int (xll_bitpos), 0);
5484   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5485                          size_int (xrl_bitpos), 0);
5486
5487   if (l_const)
5488     {
5489       l_const = fold_convert (lntype, l_const);
5490       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5491       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5492       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5493                                         fold_build1 (BIT_NOT_EXPR,
5494                                                      lntype, ll_mask),
5495                                         0)))
5496         {
5497           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5498
5499           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5500         }
5501     }
5502   if (r_const)
5503     {
5504       r_const = fold_convert (lntype, r_const);
5505       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5506       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5507       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5508                                         fold_build1 (BIT_NOT_EXPR,
5509                                                      lntype, rl_mask),
5510                                         0)))
5511         {
5512           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5513
5514           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5515         }
5516     }
5517
5518   /* Handle the case of comparisons with constants.  If there is something in
5519      common between the masks, those bits of the constants must be the same.
5520      If not, the condition is always false.  Test for this to avoid generating
5521      incorrect code below.  */
5522   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5523   if (! integer_zerop (result)
5524       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5525                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5526     {
5527       if (wanted_code == NE_EXPR)
5528         {
5529           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5530           return constant_boolean_node (true, truth_type);
5531         }
5532       else
5533         {
5534           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5535           return constant_boolean_node (false, truth_type);
5536         }
5537     }
5538
5539   return NULL_TREE;
5540 }
5541 \f
5542 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5543    constant.  */
5544
5545 static tree
5546 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5547 {
5548   tree arg0 = op0;
5549   enum tree_code op_code;
5550   tree comp_const;
5551   tree minmax_const;
5552   int consts_equal, consts_lt;
5553   tree inner;
5554
5555   STRIP_SIGN_NOPS (arg0);
5556
5557   op_code = TREE_CODE (arg0);
5558   minmax_const = TREE_OPERAND (arg0, 1);
5559   comp_const = fold_convert (TREE_TYPE (arg0), op1);
5560   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5561   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5562   inner = TREE_OPERAND (arg0, 0);
5563
5564   /* If something does not permit us to optimize, return the original tree.  */
5565   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5566       || TREE_CODE (comp_const) != INTEGER_CST
5567       || TREE_OVERFLOW (comp_const)
5568       || TREE_CODE (minmax_const) != INTEGER_CST
5569       || TREE_OVERFLOW (minmax_const))
5570     return NULL_TREE;
5571
5572   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5573      and GT_EXPR, doing the rest with recursive calls using logical
5574      simplifications.  */
5575   switch (code)
5576     {
5577     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5578       {
5579         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5580                                           type, op0, op1);
5581         if (tem)
5582           return invert_truthvalue (tem);
5583         return NULL_TREE;
5584       }
5585
5586     case GE_EXPR:
5587       return
5588         fold_build2 (TRUTH_ORIF_EXPR, type,
5589                      optimize_minmax_comparison
5590                      (EQ_EXPR, type, arg0, comp_const),
5591                      optimize_minmax_comparison
5592                      (GT_EXPR, type, arg0, comp_const));
5593
5594     case EQ_EXPR:
5595       if (op_code == MAX_EXPR && consts_equal)
5596         /* MAX (X, 0) == 0  ->  X <= 0  */
5597         return fold_build2 (LE_EXPR, type, inner, comp_const);
5598
5599       else if (op_code == MAX_EXPR && consts_lt)
5600         /* MAX (X, 0) == 5  ->  X == 5   */
5601         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5602
5603       else if (op_code == MAX_EXPR)
5604         /* MAX (X, 0) == -1  ->  false  */
5605         return omit_one_operand (type, integer_zero_node, inner);
5606
5607       else if (consts_equal)
5608         /* MIN (X, 0) == 0  ->  X >= 0  */
5609         return fold_build2 (GE_EXPR, type, inner, comp_const);
5610
5611       else if (consts_lt)
5612         /* MIN (X, 0) == 5  ->  false  */
5613         return omit_one_operand (type, integer_zero_node, inner);
5614
5615       else
5616         /* MIN (X, 0) == -1  ->  X == -1  */
5617         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5618
5619     case GT_EXPR:
5620       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5621         /* MAX (X, 0) > 0  ->  X > 0
5622            MAX (X, 0) > 5  ->  X > 5  */
5623         return fold_build2 (GT_EXPR, type, inner, comp_const);
5624
5625       else if (op_code == MAX_EXPR)
5626         /* MAX (X, 0) > -1  ->  true  */
5627         return omit_one_operand (type, integer_one_node, inner);
5628
5629       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5630         /* MIN (X, 0) > 0  ->  false
5631            MIN (X, 0) > 5  ->  false  */
5632         return omit_one_operand (type, integer_zero_node, inner);
5633
5634       else
5635         /* MIN (X, 0) > -1  ->  X > -1  */
5636         return fold_build2 (GT_EXPR, type, inner, comp_const);
5637
5638     default:
5639       return NULL_TREE;
5640     }
5641 }
5642 \f
5643 /* T is an integer expression that is being multiplied, divided, or taken a
5644    modulus (CODE says which and what kind of divide or modulus) by a
5645    constant C.  See if we can eliminate that operation by folding it with
5646    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5647    should be used for the computation if wider than our type.
5648
5649    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5650    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5651    expression would not overflow or that overflow is undefined for the type
5652    in the language in question.
5653
5654    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5655    the machine has a multiply-accumulate insn or that this is part of an
5656    addressing calculation.
5657
5658    If we return a non-null expression, it is an equivalent form of the
5659    original computation, but need not be in the original type.
5660
5661    We set *STRICT_OVERFLOW_P to true if the return values depends on
5662    signed overflow being undefined.  Otherwise we do not change
5663    *STRICT_OVERFLOW_P.  */
5664
5665 static tree
5666 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5667                 bool *strict_overflow_p)
5668 {
5669   /* To avoid exponential search depth, refuse to allow recursion past
5670      three levels.  Beyond that (1) it's highly unlikely that we'll find
5671      something interesting and (2) we've probably processed it before
5672      when we built the inner expression.  */
5673
5674   static int depth;
5675   tree ret;
5676
5677   if (depth > 3)
5678     return NULL;
5679
5680   depth++;
5681   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5682   depth--;
5683
5684   return ret;
5685 }
5686
5687 static tree
5688 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5689                   bool *strict_overflow_p)
5690 {
5691   tree type = TREE_TYPE (t);
5692   enum tree_code tcode = TREE_CODE (t);
5693   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5694                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5695                 ? wide_type : type);
5696   tree t1, t2;
5697   int same_p = tcode == code;
5698   tree op0 = NULL_TREE, op1 = NULL_TREE;
5699   bool sub_strict_overflow_p;
5700
5701   /* Don't deal with constants of zero here; they confuse the code below.  */
5702   if (integer_zerop (c))
5703     return NULL_TREE;
5704
5705   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5706     op0 = TREE_OPERAND (t, 0);
5707
5708   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5709     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5710
5711   /* Note that we need not handle conditional operations here since fold
5712      already handles those cases.  So just do arithmetic here.  */
5713   switch (tcode)
5714     {
5715     case INTEGER_CST:
5716       /* For a constant, we can always simplify if we are a multiply
5717          or (for divide and modulus) if it is a multiple of our constant.  */
5718       if (code == MULT_EXPR
5719           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5720         return const_binop (code, fold_convert (ctype, t),
5721                             fold_convert (ctype, c), 0);
5722       break;
5723
5724     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5725       /* If op0 is an expression ...  */
5726       if ((COMPARISON_CLASS_P (op0)
5727            || UNARY_CLASS_P (op0)
5728            || BINARY_CLASS_P (op0)
5729            || VL_EXP_CLASS_P (op0)
5730            || EXPRESSION_CLASS_P (op0))
5731           /* ... and is unsigned, and its type is smaller than ctype,
5732              then we cannot pass through as widening.  */
5733           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5734                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5735                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5736                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5737                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5738               /* ... or this is a truncation (t is narrower than op0),
5739                  then we cannot pass through this narrowing.  */
5740               || (GET_MODE_SIZE (TYPE_MODE (type))
5741                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5742               /* ... or signedness changes for division or modulus,
5743                  then we cannot pass through this conversion.  */
5744               || (code != MULT_EXPR
5745                   && (TYPE_UNSIGNED (ctype)
5746                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
5747               /* ... or has undefined overflow while the converted to
5748                  type has not, we cannot do the operation in the inner type
5749                  as that would introduce undefined overflow.  */
5750               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5751                   && !TYPE_OVERFLOW_UNDEFINED (type))))
5752         break;
5753
5754       /* Pass the constant down and see if we can make a simplification.  If
5755          we can, replace this expression with the inner simplification for
5756          possible later conversion to our or some other type.  */
5757       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5758           && TREE_CODE (t2) == INTEGER_CST
5759           && !TREE_OVERFLOW (t2)
5760           && (0 != (t1 = extract_muldiv (op0, t2, code,
5761                                          code == MULT_EXPR
5762                                          ? ctype : NULL_TREE,
5763                                          strict_overflow_p))))
5764         return t1;
5765       break;
5766
5767     case ABS_EXPR:
5768       /* If widening the type changes it from signed to unsigned, then we
5769          must avoid building ABS_EXPR itself as unsigned.  */
5770       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5771         {
5772           tree cstype = (*signed_type_for) (ctype);
5773           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5774               != 0)
5775             {
5776               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5777               return fold_convert (ctype, t1);
5778             }
5779           break;
5780         }
5781       /* If the constant is negative, we cannot simplify this.  */
5782       if (tree_int_cst_sgn (c) == -1)
5783         break;
5784       /* FALLTHROUGH */
5785     case NEGATE_EXPR:
5786       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5787           != 0)
5788         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5789       break;
5790
5791     case MIN_EXPR:  case MAX_EXPR:
5792       /* If widening the type changes the signedness, then we can't perform
5793          this optimization as that changes the result.  */
5794       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5795         break;
5796
5797       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5798       sub_strict_overflow_p = false;
5799       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5800                                 &sub_strict_overflow_p)) != 0
5801           && (t2 = extract_muldiv (op1, c, code, wide_type,
5802                                    &sub_strict_overflow_p)) != 0)
5803         {
5804           if (tree_int_cst_sgn (c) < 0)
5805             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5806           if (sub_strict_overflow_p)
5807             *strict_overflow_p = true;
5808           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5809                               fold_convert (ctype, t2));
5810         }
5811       break;
5812
5813     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5814       /* If the second operand is constant, this is a multiplication
5815          or floor division, by a power of two, so we can treat it that
5816          way unless the multiplier or divisor overflows.  Signed
5817          left-shift overflow is implementation-defined rather than
5818          undefined in C90, so do not convert signed left shift into
5819          multiplication.  */
5820       if (TREE_CODE (op1) == INTEGER_CST
5821           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5822           /* const_binop may not detect overflow correctly,
5823              so check for it explicitly here.  */
5824           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5825           && TREE_INT_CST_HIGH (op1) == 0
5826           && 0 != (t1 = fold_convert (ctype,
5827                                       const_binop (LSHIFT_EXPR,
5828                                                    size_one_node,
5829                                                    op1, 0)))
5830           && !TREE_OVERFLOW (t1))
5831         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5832                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5833                                        ctype, fold_convert (ctype, op0), t1),
5834                                c, code, wide_type, strict_overflow_p);
5835       break;
5836
5837     case PLUS_EXPR:  case MINUS_EXPR:
5838       /* See if we can eliminate the operation on both sides.  If we can, we
5839          can return a new PLUS or MINUS.  If we can't, the only remaining
5840          cases where we can do anything are if the second operand is a
5841          constant.  */
5842       sub_strict_overflow_p = false;
5843       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5844       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5845       if (t1 != 0 && t2 != 0
5846           && (code == MULT_EXPR
5847               /* If not multiplication, we can only do this if both operands
5848                  are divisible by c.  */
5849               || (multiple_of_p (ctype, op0, c)
5850                   && multiple_of_p (ctype, op1, c))))
5851         {
5852           if (sub_strict_overflow_p)
5853             *strict_overflow_p = true;
5854           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5855                               fold_convert (ctype, t2));
5856         }
5857
5858       /* If this was a subtraction, negate OP1 and set it to be an addition.
5859          This simplifies the logic below.  */
5860       if (tcode == MINUS_EXPR)
5861         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5862
5863       if (TREE_CODE (op1) != INTEGER_CST)
5864         break;
5865
5866       /* If either OP1 or C are negative, this optimization is not safe for
5867          some of the division and remainder types while for others we need
5868          to change the code.  */
5869       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5870         {
5871           if (code == CEIL_DIV_EXPR)
5872             code = FLOOR_DIV_EXPR;
5873           else if (code == FLOOR_DIV_EXPR)
5874             code = CEIL_DIV_EXPR;
5875           else if (code != MULT_EXPR
5876                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5877             break;
5878         }
5879
5880       /* If it's a multiply or a division/modulus operation of a multiple
5881          of our constant, do the operation and verify it doesn't overflow.  */
5882       if (code == MULT_EXPR
5883           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5884         {
5885           op1 = const_binop (code, fold_convert (ctype, op1),
5886                              fold_convert (ctype, c), 0);
5887           /* We allow the constant to overflow with wrapping semantics.  */
5888           if (op1 == 0
5889               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5890             break;
5891         }
5892       else
5893         break;
5894
5895       /* If we have an unsigned type is not a sizetype, we cannot widen
5896          the operation since it will change the result if the original
5897          computation overflowed.  */
5898       if (TYPE_UNSIGNED (ctype)
5899           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5900           && ctype != type)
5901         break;
5902
5903       /* If we were able to eliminate our operation from the first side,
5904          apply our operation to the second side and reform the PLUS.  */
5905       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5906         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5907
5908       /* The last case is if we are a multiply.  In that case, we can
5909          apply the distributive law to commute the multiply and addition
5910          if the multiplication of the constants doesn't overflow.  */
5911       if (code == MULT_EXPR)
5912         return fold_build2 (tcode, ctype,
5913                             fold_build2 (code, ctype,
5914                                          fold_convert (ctype, op0),
5915                                          fold_convert (ctype, c)),
5916                             op1);
5917
5918       break;
5919
5920     case MULT_EXPR:
5921       /* We have a special case here if we are doing something like
5922          (C * 8) % 4 since we know that's zero.  */
5923       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5924            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5925           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5926           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5927         return omit_one_operand (type, integer_zero_node, op0);
5928
5929       /* ... fall through ...  */
5930
5931     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5932     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5933       /* If we can extract our operation from the LHS, do so and return a
5934          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5935          do something only if the second operand is a constant.  */
5936       if (same_p
5937           && (t1 = extract_muldiv (op0, c, code, wide_type,
5938                                    strict_overflow_p)) != 0)
5939         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5940                             fold_convert (ctype, op1));
5941       else if (tcode == MULT_EXPR && code == MULT_EXPR
5942                && (t1 = extract_muldiv (op1, c, code, wide_type,
5943                                         strict_overflow_p)) != 0)
5944         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5945                             fold_convert (ctype, t1));
5946       else if (TREE_CODE (op1) != INTEGER_CST)
5947         return 0;
5948
5949       /* If these are the same operation types, we can associate them
5950          assuming no overflow.  */
5951       if (tcode == code
5952           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5953                                      fold_convert (ctype, c), 0))
5954           && !TREE_OVERFLOW (t1))
5955         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5956
5957       /* If these operations "cancel" each other, we have the main
5958          optimizations of this pass, which occur when either constant is a
5959          multiple of the other, in which case we replace this with either an
5960          operation or CODE or TCODE.
5961
5962          If we have an unsigned type that is not a sizetype, we cannot do
5963          this since it will change the result if the original computation
5964          overflowed.  */
5965       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5966            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5967           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5968               || (tcode == MULT_EXPR
5969                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5970                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5971                   && code != MULT_EXPR)))
5972         {
5973           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5974             {
5975               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5976                 *strict_overflow_p = true;
5977               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5978                                   fold_convert (ctype,
5979                                                 const_binop (TRUNC_DIV_EXPR,
5980                                                              op1, c, 0)));
5981             }
5982           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5983             {
5984               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5985                 *strict_overflow_p = true;
5986               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5987                                   fold_convert (ctype,
5988                                                 const_binop (TRUNC_DIV_EXPR,
5989                                                              c, op1, 0)));
5990             }
5991         }
5992       break;
5993
5994     default:
5995       break;
5996     }
5997
5998   return 0;
5999 }
6000 \f
6001 /* Return a node which has the indicated constant VALUE (either 0 or
6002    1), and is of the indicated TYPE.  */
6003
6004 tree
6005 constant_boolean_node (int value, tree type)
6006 {
6007   if (type == integer_type_node)
6008     return value ? integer_one_node : integer_zero_node;
6009   else if (type == boolean_type_node)
6010     return value ? boolean_true_node : boolean_false_node;
6011   else
6012     return build_int_cst (type, value);
6013 }
6014
6015
6016 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6017    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6018    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6019    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6020    COND is the first argument to CODE; otherwise (as in the example
6021    given here), it is the second argument.  TYPE is the type of the
6022    original expression.  Return NULL_TREE if no simplification is
6023    possible.  */
6024
6025 static tree
6026 fold_binary_op_with_conditional_arg (enum tree_code code,
6027                                      tree type, tree op0, tree op1,
6028                                      tree cond, tree arg, int cond_first_p)
6029 {
6030   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6031   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6032   tree test, true_value, false_value;
6033   tree lhs = NULL_TREE;
6034   tree rhs = NULL_TREE;
6035
6036   /* This transformation is only worthwhile if we don't have to wrap
6037      arg in a SAVE_EXPR, and the operation can be simplified on at least
6038      one of the branches once its pushed inside the COND_EXPR.  */
6039   if (!TREE_CONSTANT (arg))
6040     return NULL_TREE;
6041
6042   if (TREE_CODE (cond) == COND_EXPR)
6043     {
6044       test = TREE_OPERAND (cond, 0);
6045       true_value = TREE_OPERAND (cond, 1);
6046       false_value = TREE_OPERAND (cond, 2);
6047       /* If this operand throws an expression, then it does not make
6048          sense to try to perform a logical or arithmetic operation
6049          involving it.  */
6050       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6051         lhs = true_value;
6052       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6053         rhs = false_value;
6054     }
6055   else
6056     {
6057       tree testtype = TREE_TYPE (cond);
6058       test = cond;
6059       true_value = constant_boolean_node (true, testtype);
6060       false_value = constant_boolean_node (false, testtype);
6061     }
6062
6063   arg = fold_convert (arg_type, arg);
6064   if (lhs == 0)
6065     {
6066       true_value = fold_convert (cond_type, true_value);
6067       if (cond_first_p)
6068         lhs = fold_build2 (code, type, true_value, arg);
6069       else
6070         lhs = fold_build2 (code, type, arg, true_value);
6071     }
6072   if (rhs == 0)
6073     {
6074       false_value = fold_convert (cond_type, false_value);
6075       if (cond_first_p)
6076         rhs = fold_build2 (code, type, false_value, arg);
6077       else
6078         rhs = fold_build2 (code, type, arg, false_value);
6079     }
6080
6081   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6082   return fold_convert (type, test);
6083 }
6084
6085 \f
6086 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6087
6088    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6089    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6090    ADDEND is the same as X.
6091
6092    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6093    and finite.  The problematic cases are when X is zero, and its mode
6094    has signed zeros.  In the case of rounding towards -infinity,
6095    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6096    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6097
6098 bool
6099 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6100 {
6101   if (!real_zerop (addend))
6102     return false;
6103
6104   /* Don't allow the fold with -fsignaling-nans.  */
6105   if (HONOR_SNANS (TYPE_MODE (type)))
6106     return false;
6107
6108   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6109   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6110     return true;
6111
6112   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6113   if (TREE_CODE (addend) == REAL_CST
6114       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6115     negate = !negate;
6116
6117   /* The mode has signed zeros, and we have to honor their sign.
6118      In this situation, there is only one case we can return true for.
6119      X - 0 is the same as X unless rounding towards -infinity is
6120      supported.  */
6121   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6122 }
6123
6124 /* Subroutine of fold() that checks comparisons of built-in math
6125    functions against real constants.
6126
6127    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6128    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6129    is the type of the result and ARG0 and ARG1 are the operands of the
6130    comparison.  ARG1 must be a TREE_REAL_CST.
6131
6132    The function returns the constant folded tree if a simplification
6133    can be made, and NULL_TREE otherwise.  */
6134
6135 static tree
6136 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6137                      tree type, tree arg0, tree arg1)
6138 {
6139   REAL_VALUE_TYPE c;
6140
6141   if (BUILTIN_SQRT_P (fcode))
6142     {
6143       tree arg = CALL_EXPR_ARG (arg0, 0);
6144       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6145
6146       c = TREE_REAL_CST (arg1);
6147       if (REAL_VALUE_NEGATIVE (c))
6148         {
6149           /* sqrt(x) < y is always false, if y is negative.  */
6150           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6151             return omit_one_operand (type, integer_zero_node, arg);
6152
6153           /* sqrt(x) > y is always true, if y is negative and we
6154              don't care about NaNs, i.e. negative values of x.  */
6155           if (code == NE_EXPR || !HONOR_NANS (mode))
6156             return omit_one_operand (type, integer_one_node, arg);
6157
6158           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6159           return fold_build2 (GE_EXPR, type, arg,
6160                               build_real (TREE_TYPE (arg), dconst0));
6161         }
6162       else if (code == GT_EXPR || code == GE_EXPR)
6163         {
6164           REAL_VALUE_TYPE c2;
6165
6166           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6167           real_convert (&c2, mode, &c2);
6168
6169           if (REAL_VALUE_ISINF (c2))
6170             {
6171               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6172               if (HONOR_INFINITIES (mode))
6173                 return fold_build2 (EQ_EXPR, type, arg,
6174                                     build_real (TREE_TYPE (arg), c2));
6175
6176               /* sqrt(x) > y is always false, when y is very large
6177                  and we don't care about infinities.  */
6178               return omit_one_operand (type, integer_zero_node, arg);
6179             }
6180
6181           /* sqrt(x) > c is the same as x > c*c.  */
6182           return fold_build2 (code, type, arg,
6183                               build_real (TREE_TYPE (arg), c2));
6184         }
6185       else if (code == LT_EXPR || code == LE_EXPR)
6186         {
6187           REAL_VALUE_TYPE c2;
6188
6189           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6190           real_convert (&c2, mode, &c2);
6191
6192           if (REAL_VALUE_ISINF (c2))
6193             {
6194               /* sqrt(x) < y is always true, when y is a very large
6195                  value and we don't care about NaNs or Infinities.  */
6196               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6197                 return omit_one_operand (type, integer_one_node, arg);
6198
6199               /* sqrt(x) < y is x != +Inf when y is very large and we
6200                  don't care about NaNs.  */
6201               if (! HONOR_NANS (mode))
6202                 return fold_build2 (NE_EXPR, type, arg,
6203                                     build_real (TREE_TYPE (arg), c2));
6204
6205               /* sqrt(x) < y is x >= 0 when y is very large and we
6206                  don't care about Infinities.  */
6207               if (! HONOR_INFINITIES (mode))
6208                 return fold_build2 (GE_EXPR, type, arg,
6209                                     build_real (TREE_TYPE (arg), dconst0));
6210
6211               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6212               if (lang_hooks.decls.global_bindings_p () != 0
6213                   || CONTAINS_PLACEHOLDER_P (arg))
6214                 return NULL_TREE;
6215
6216               arg = save_expr (arg);
6217               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6218                                   fold_build2 (GE_EXPR, type, arg,
6219                                                build_real (TREE_TYPE (arg),
6220                                                            dconst0)),
6221                                   fold_build2 (NE_EXPR, type, arg,
6222                                                build_real (TREE_TYPE (arg),
6223                                                            c2)));
6224             }
6225
6226           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6227           if (! HONOR_NANS (mode))
6228             return fold_build2 (code, type, arg,
6229                                 build_real (TREE_TYPE (arg), c2));
6230
6231           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6232           if (lang_hooks.decls.global_bindings_p () == 0
6233               && ! CONTAINS_PLACEHOLDER_P (arg))
6234             {
6235               arg = save_expr (arg);
6236               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6237                                   fold_build2 (GE_EXPR, type, arg,
6238                                                build_real (TREE_TYPE (arg),
6239                                                            dconst0)),
6240                                   fold_build2 (code, type, arg,
6241                                                build_real (TREE_TYPE (arg),
6242                                                            c2)));
6243             }
6244         }
6245     }
6246
6247   return NULL_TREE;
6248 }
6249
6250 /* Subroutine of fold() that optimizes comparisons against Infinities,
6251    either +Inf or -Inf.
6252
6253    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6254    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6255    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6256
6257    The function returns the constant folded tree if a simplification
6258    can be made, and NULL_TREE otherwise.  */
6259
6260 static tree
6261 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6262 {
6263   enum machine_mode mode;
6264   REAL_VALUE_TYPE max;
6265   tree temp;
6266   bool neg;
6267
6268   mode = TYPE_MODE (TREE_TYPE (arg0));
6269
6270   /* For negative infinity swap the sense of the comparison.  */
6271   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6272   if (neg)
6273     code = swap_tree_comparison (code);
6274
6275   switch (code)
6276     {
6277     case GT_EXPR:
6278       /* x > +Inf is always false, if with ignore sNANs.  */
6279       if (HONOR_SNANS (mode))
6280         return NULL_TREE;
6281       return omit_one_operand (type, integer_zero_node, arg0);
6282
6283     case LE_EXPR:
6284       /* x <= +Inf is always true, if we don't case about NaNs.  */
6285       if (! HONOR_NANS (mode))
6286         return omit_one_operand (type, integer_one_node, arg0);
6287
6288       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6289       if (lang_hooks.decls.global_bindings_p () == 0
6290           && ! CONTAINS_PLACEHOLDER_P (arg0))
6291         {
6292           arg0 = save_expr (arg0);
6293           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6294         }
6295       break;
6296
6297     case EQ_EXPR:
6298     case GE_EXPR:
6299       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6300       real_maxval (&max, neg, mode);
6301       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6302                           arg0, build_real (TREE_TYPE (arg0), max));
6303
6304     case LT_EXPR:
6305       /* x < +Inf is always equal to x <= DBL_MAX.  */
6306       real_maxval (&max, neg, mode);
6307       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6308                           arg0, build_real (TREE_TYPE (arg0), max));
6309
6310     case NE_EXPR:
6311       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6312       real_maxval (&max, neg, mode);
6313       if (! HONOR_NANS (mode))
6314         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6315                             arg0, build_real (TREE_TYPE (arg0), max));
6316
6317       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6318                           arg0, build_real (TREE_TYPE (arg0), max));
6319       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6320
6321     default:
6322       break;
6323     }
6324
6325   return NULL_TREE;
6326 }
6327
6328 /* Subroutine of fold() that optimizes comparisons of a division by
6329    a nonzero integer constant against an integer constant, i.e.
6330    X/C1 op C2.
6331
6332    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6333    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6334    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6335
6336    The function returns the constant folded tree if a simplification
6337    can be made, and NULL_TREE otherwise.  */
6338
6339 static tree
6340 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6341 {
6342   tree prod, tmp, hi, lo;
6343   tree arg00 = TREE_OPERAND (arg0, 0);
6344   tree arg01 = TREE_OPERAND (arg0, 1);
6345   unsigned HOST_WIDE_INT lpart;
6346   HOST_WIDE_INT hpart;
6347   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6348   bool neg_overflow;
6349   int overflow;
6350
6351   /* We have to do this the hard way to detect unsigned overflow.
6352      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6353   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6354                                    TREE_INT_CST_HIGH (arg01),
6355                                    TREE_INT_CST_LOW (arg1),
6356                                    TREE_INT_CST_HIGH (arg1),
6357                                    &lpart, &hpart, unsigned_p);
6358   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6359                                 -1, overflow);
6360   neg_overflow = false;
6361
6362   if (unsigned_p)
6363     {
6364       tmp = int_const_binop (MINUS_EXPR, arg01,
6365                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6366       lo = prod;
6367
6368       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6369       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6370                                        TREE_INT_CST_HIGH (prod),
6371                                        TREE_INT_CST_LOW (tmp),
6372                                        TREE_INT_CST_HIGH (tmp),
6373                                        &lpart, &hpart, unsigned_p);
6374       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6375                                   -1, overflow | TREE_OVERFLOW (prod));
6376     }
6377   else if (tree_int_cst_sgn (arg01) >= 0)
6378     {
6379       tmp = int_const_binop (MINUS_EXPR, arg01,
6380                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6381       switch (tree_int_cst_sgn (arg1))
6382         {
6383         case -1:
6384           neg_overflow = true;
6385           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6386           hi = prod;
6387           break;
6388
6389         case  0:
6390           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6391           hi = tmp;
6392           break;
6393
6394         case  1:
6395           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6396           lo = prod;
6397           break;
6398
6399         default:
6400           gcc_unreachable ();
6401         }
6402     }
6403   else
6404     {
6405       /* A negative divisor reverses the relational operators.  */
6406       code = swap_tree_comparison (code);
6407
6408       tmp = int_const_binop (PLUS_EXPR, arg01,
6409                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6410       switch (tree_int_cst_sgn (arg1))
6411         {
6412         case -1:
6413           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6414           lo = prod;
6415           break;
6416
6417         case  0:
6418           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6419           lo = tmp;
6420           break;
6421
6422         case  1:
6423           neg_overflow = true;
6424           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6425           hi = prod;
6426           break;
6427
6428         default:
6429           gcc_unreachable ();
6430         }
6431     }
6432
6433   switch (code)
6434     {
6435     case EQ_EXPR:
6436       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6437         return omit_one_operand (type, integer_zero_node, arg00);
6438       if (TREE_OVERFLOW (hi))
6439         return fold_build2 (GE_EXPR, type, arg00, lo);
6440       if (TREE_OVERFLOW (lo))
6441         return fold_build2 (LE_EXPR, type, arg00, hi);
6442       return build_range_check (type, arg00, 1, lo, hi);
6443
6444     case NE_EXPR:
6445       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6446         return omit_one_operand (type, integer_one_node, arg00);
6447       if (TREE_OVERFLOW (hi))
6448         return fold_build2 (LT_EXPR, type, arg00, lo);
6449       if (TREE_OVERFLOW (lo))
6450         return fold_build2 (GT_EXPR, type, arg00, hi);
6451       return build_range_check (type, arg00, 0, lo, hi);
6452
6453     case LT_EXPR:
6454       if (TREE_OVERFLOW (lo))
6455         {
6456           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6457           return omit_one_operand (type, tmp, arg00);
6458         }
6459       return fold_build2 (LT_EXPR, type, arg00, lo);
6460
6461     case LE_EXPR:
6462       if (TREE_OVERFLOW (hi))
6463         {
6464           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6465           return omit_one_operand (type, tmp, arg00);
6466         }
6467       return fold_build2 (LE_EXPR, type, arg00, hi);
6468
6469     case GT_EXPR:
6470       if (TREE_OVERFLOW (hi))
6471         {
6472           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6473           return omit_one_operand (type, tmp, arg00);
6474         }
6475       return fold_build2 (GT_EXPR, type, arg00, hi);
6476
6477     case GE_EXPR:
6478       if (TREE_OVERFLOW (lo))
6479         {
6480           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6481           return omit_one_operand (type, tmp, arg00);
6482         }
6483       return fold_build2 (GE_EXPR, type, arg00, lo);
6484
6485     default:
6486       break;
6487     }
6488
6489   return NULL_TREE;
6490 }
6491
6492
6493 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6494    equality/inequality test, then return a simplified form of the test
6495    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6496    result type.  */
6497
6498 static tree
6499 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6500                                      tree result_type)
6501 {
6502   /* If this is testing a single bit, we can optimize the test.  */
6503   if ((code == NE_EXPR || code == EQ_EXPR)
6504       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6505       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6506     {
6507       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6508          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6509       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6510
6511       if (arg00 != NULL_TREE
6512           /* This is only a win if casting to a signed type is cheap,
6513              i.e. when arg00's type is not a partial mode.  */
6514           && TYPE_PRECISION (TREE_TYPE (arg00))
6515              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6516         {
6517           tree stype = signed_type_for (TREE_TYPE (arg00));
6518           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6519                               result_type, fold_convert (stype, arg00),
6520                               build_int_cst (stype, 0));
6521         }
6522     }
6523
6524   return NULL_TREE;
6525 }
6526
6527 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6528    equality/inequality test, then return a simplified form of
6529    the test using shifts and logical operations.  Otherwise return
6530    NULL.  TYPE is the desired result type.  */
6531
6532 tree
6533 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6534                       tree result_type)
6535 {
6536   /* If this is testing a single bit, we can optimize the test.  */
6537   if ((code == NE_EXPR || code == EQ_EXPR)
6538       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6539       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6540     {
6541       tree inner = TREE_OPERAND (arg0, 0);
6542       tree type = TREE_TYPE (arg0);
6543       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6544       enum machine_mode operand_mode = TYPE_MODE (type);
6545       int ops_unsigned;
6546       tree signed_type, unsigned_type, intermediate_type;
6547       tree tem, one;
6548
6549       /* First, see if we can fold the single bit test into a sign-bit
6550          test.  */
6551       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6552                                                  result_type);
6553       if (tem)
6554         return tem;
6555
6556       /* Otherwise we have (A & C) != 0 where C is a single bit,
6557          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6558          Similarly for (A & C) == 0.  */
6559
6560       /* If INNER is a right shift of a constant and it plus BITNUM does
6561          not overflow, adjust BITNUM and INNER.  */
6562       if (TREE_CODE (inner) == RSHIFT_EXPR
6563           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6564           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6565           && bitnum < TYPE_PRECISION (type)
6566           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6567                                    bitnum - TYPE_PRECISION (type)))
6568         {
6569           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6570           inner = TREE_OPERAND (inner, 0);
6571         }
6572
6573       /* If we are going to be able to omit the AND below, we must do our
6574          operations as unsigned.  If we must use the AND, we have a choice.
6575          Normally unsigned is faster, but for some machines signed is.  */
6576 #ifdef LOAD_EXTEND_OP
6577       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6578                       && !flag_syntax_only) ? 0 : 1;
6579 #else
6580       ops_unsigned = 1;
6581 #endif
6582
6583       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6584       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6585       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6586       inner = fold_convert (intermediate_type, inner);
6587
6588       if (bitnum != 0)
6589         inner = build2 (RSHIFT_EXPR, intermediate_type,
6590                         inner, size_int (bitnum));
6591
6592       one = build_int_cst (intermediate_type, 1);
6593
6594       if (code == EQ_EXPR)
6595         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6596
6597       /* Put the AND last so it can combine with more things.  */
6598       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6599
6600       /* Make sure to return the proper type.  */
6601       inner = fold_convert (result_type, inner);
6602
6603       return inner;
6604     }
6605   return NULL_TREE;
6606 }
6607
6608 /* Check whether we are allowed to reorder operands arg0 and arg1,
6609    such that the evaluation of arg1 occurs before arg0.  */
6610
6611 static bool
6612 reorder_operands_p (const_tree arg0, const_tree arg1)
6613 {
6614   if (! flag_evaluation_order)
6615       return true;
6616   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6617     return true;
6618   return ! TREE_SIDE_EFFECTS (arg0)
6619          && ! TREE_SIDE_EFFECTS (arg1);
6620 }
6621
6622 /* Test whether it is preferable two swap two operands, ARG0 and
6623    ARG1, for example because ARG0 is an integer constant and ARG1
6624    isn't.  If REORDER is true, only recommend swapping if we can
6625    evaluate the operands in reverse order.  */
6626
6627 bool
6628 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6629 {
6630   STRIP_SIGN_NOPS (arg0);
6631   STRIP_SIGN_NOPS (arg1);
6632
6633   if (TREE_CODE (arg1) == INTEGER_CST)
6634     return 0;
6635   if (TREE_CODE (arg0) == INTEGER_CST)
6636     return 1;
6637
6638   if (TREE_CODE (arg1) == REAL_CST)
6639     return 0;
6640   if (TREE_CODE (arg0) == REAL_CST)
6641     return 1;
6642
6643   if (TREE_CODE (arg1) == FIXED_CST)
6644     return 0;
6645   if (TREE_CODE (arg0) == FIXED_CST)
6646     return 1;
6647
6648   if (TREE_CODE (arg1) == COMPLEX_CST)
6649     return 0;
6650   if (TREE_CODE (arg0) == COMPLEX_CST)
6651     return 1;
6652
6653   if (TREE_CONSTANT (arg1))
6654     return 0;
6655   if (TREE_CONSTANT (arg0))
6656     return 1;
6657
6658   if (optimize_size)
6659     return 0;
6660
6661   if (reorder && flag_evaluation_order
6662       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6663     return 0;
6664
6665   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6666      for commutative and comparison operators.  Ensuring a canonical
6667      form allows the optimizers to find additional redundancies without
6668      having to explicitly check for both orderings.  */
6669   if (TREE_CODE (arg0) == SSA_NAME
6670       && TREE_CODE (arg1) == SSA_NAME
6671       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6672     return 1;
6673
6674   /* Put SSA_NAMEs last.  */
6675   if (TREE_CODE (arg1) == SSA_NAME)
6676     return 0;
6677   if (TREE_CODE (arg0) == SSA_NAME)
6678     return 1;
6679
6680   /* Put variables last.  */
6681   if (DECL_P (arg1))
6682     return 0;
6683   if (DECL_P (arg0))
6684     return 1;
6685
6686   return 0;
6687 }
6688
6689 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6690    ARG0 is extended to a wider type.  */
6691
6692 static tree
6693 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6694 {
6695   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6696   tree arg1_unw;
6697   tree shorter_type, outer_type;
6698   tree min, max;
6699   bool above, below;
6700
6701   if (arg0_unw == arg0)
6702     return NULL_TREE;
6703   shorter_type = TREE_TYPE (arg0_unw);
6704
6705 #ifdef HAVE_canonicalize_funcptr_for_compare
6706   /* Disable this optimization if we're casting a function pointer
6707      type on targets that require function pointer canonicalization.  */
6708   if (HAVE_canonicalize_funcptr_for_compare
6709       && TREE_CODE (shorter_type) == POINTER_TYPE
6710       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6711     return NULL_TREE;
6712 #endif
6713
6714   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6715     return NULL_TREE;
6716
6717   arg1_unw = get_unwidened (arg1, NULL_TREE);
6718
6719   /* If possible, express the comparison in the shorter mode.  */
6720   if ((code == EQ_EXPR || code == NE_EXPR
6721        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6722       && (TREE_TYPE (arg1_unw) == shorter_type
6723           || (TYPE_PRECISION (shorter_type)
6724               >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6725           || (TREE_CODE (arg1_unw) == INTEGER_CST
6726               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6727                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6728               && int_fits_type_p (arg1_unw, shorter_type))))
6729     return fold_build2 (code, type, arg0_unw,
6730                        fold_convert (shorter_type, arg1_unw));
6731
6732   if (TREE_CODE (arg1_unw) != INTEGER_CST
6733       || TREE_CODE (shorter_type) != INTEGER_TYPE
6734       || !int_fits_type_p (arg1_unw, shorter_type))
6735     return NULL_TREE;
6736
6737   /* If we are comparing with the integer that does not fit into the range
6738      of the shorter type, the result is known.  */
6739   outer_type = TREE_TYPE (arg1_unw);
6740   min = lower_bound_in_type (outer_type, shorter_type);
6741   max = upper_bound_in_type (outer_type, shorter_type);
6742
6743   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6744                                                    max, arg1_unw));
6745   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6746                                                    arg1_unw, min));
6747
6748   switch (code)
6749     {
6750     case EQ_EXPR:
6751       if (above || below)
6752         return omit_one_operand (type, integer_zero_node, arg0);
6753       break;
6754
6755     case NE_EXPR:
6756       if (above || below)
6757         return omit_one_operand (type, integer_one_node, arg0);
6758       break;
6759
6760     case LT_EXPR:
6761     case LE_EXPR:
6762       if (above)
6763         return omit_one_operand (type, integer_one_node, arg0);
6764       else if (below)
6765         return omit_one_operand (type, integer_zero_node, arg0);
6766
6767     case GT_EXPR:
6768     case GE_EXPR:
6769       if (above)
6770         return omit_one_operand (type, integer_zero_node, arg0);
6771       else if (below)
6772         return omit_one_operand (type, integer_one_node, arg0);
6773
6774     default:
6775       break;
6776     }
6777
6778   return NULL_TREE;
6779 }
6780
6781 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6782    ARG0 just the signedness is changed.  */
6783
6784 static tree
6785 fold_sign_changed_comparison (enum tree_code code, tree type,
6786                               tree arg0, tree arg1)
6787 {
6788   tree arg0_inner;
6789   tree inner_type, outer_type;
6790
6791   if (TREE_CODE (arg0) != NOP_EXPR
6792       && TREE_CODE (arg0) != CONVERT_EXPR)
6793     return NULL_TREE;
6794
6795   outer_type = TREE_TYPE (arg0);
6796   arg0_inner = TREE_OPERAND (arg0, 0);
6797   inner_type = TREE_TYPE (arg0_inner);
6798
6799 #ifdef HAVE_canonicalize_funcptr_for_compare
6800   /* Disable this optimization if we're casting a function pointer
6801      type on targets that require function pointer canonicalization.  */
6802   if (HAVE_canonicalize_funcptr_for_compare
6803       && TREE_CODE (inner_type) == POINTER_TYPE
6804       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6805     return NULL_TREE;
6806 #endif
6807
6808   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6809     return NULL_TREE;
6810
6811   /* If the conversion is from an integral subtype to its basetype
6812      leave it alone.  */
6813   if (TREE_TYPE (inner_type) == outer_type)
6814     return NULL_TREE;
6815
6816   if (TREE_CODE (arg1) != INTEGER_CST
6817       && !((TREE_CODE (arg1) == NOP_EXPR
6818             || TREE_CODE (arg1) == CONVERT_EXPR)
6819            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6820     return NULL_TREE;
6821
6822   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6823       && code != NE_EXPR
6824       && code != EQ_EXPR)
6825     return NULL_TREE;
6826
6827   if (TREE_CODE (arg1) == INTEGER_CST)
6828     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6829                                   TREE_INT_CST_HIGH (arg1), 0,
6830                                   TREE_OVERFLOW (arg1));
6831   else
6832     arg1 = fold_convert (inner_type, arg1);
6833
6834   return fold_build2 (code, type, arg0_inner, arg1);
6835 }
6836
6837 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6838    step of the array.  Reconstructs s and delta in the case of s * delta
6839    being an integer constant (and thus already folded).
6840    ADDR is the address. MULT is the multiplicative expression.
6841    If the function succeeds, the new address expression is returned.  Otherwise
6842    NULL_TREE is returned.  */
6843
6844 static tree
6845 try_move_mult_to_index (tree addr, tree op1)
6846 {
6847   tree s, delta, step;
6848   tree ref = TREE_OPERAND (addr, 0), pref;
6849   tree ret, pos;
6850   tree itype;
6851   bool mdim = false;
6852
6853   /*  Strip the nops that might be added when converting op1 to sizetype. */
6854   STRIP_NOPS (op1);
6855
6856   /* Canonicalize op1 into a possibly non-constant delta
6857      and an INTEGER_CST s.  */
6858   if (TREE_CODE (op1) == MULT_EXPR)
6859     {
6860       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6861
6862       STRIP_NOPS (arg0);
6863       STRIP_NOPS (arg1);
6864   
6865       if (TREE_CODE (arg0) == INTEGER_CST)
6866         {
6867           s = arg0;
6868           delta = arg1;
6869         }
6870       else if (TREE_CODE (arg1) == INTEGER_CST)
6871         {
6872           s = arg1;
6873           delta = arg0;
6874         }
6875       else
6876         return NULL_TREE;
6877     }
6878   else if (TREE_CODE (op1) == INTEGER_CST)
6879     {
6880       delta = op1;
6881       s = NULL_TREE;
6882     }
6883   else
6884     {
6885       /* Simulate we are delta * 1.  */
6886       delta = op1;
6887       s = integer_one_node;
6888     }
6889
6890   for (;; ref = TREE_OPERAND (ref, 0))
6891     {
6892       if (TREE_CODE (ref) == ARRAY_REF)
6893         {
6894           /* Remember if this was a multi-dimensional array.  */
6895           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6896             mdim = true;
6897
6898           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6899           if (! itype)
6900             continue;
6901
6902           step = array_ref_element_size (ref);
6903           if (TREE_CODE (step) != INTEGER_CST)
6904             continue;
6905
6906           if (s)
6907             {
6908               if (! tree_int_cst_equal (step, s))
6909                 continue;
6910             }
6911           else
6912             {
6913               /* Try if delta is a multiple of step.  */
6914               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6915               if (! tmp)
6916                 continue;
6917               delta = tmp;
6918             }
6919
6920           /* Only fold here if we can verify we do not overflow one
6921              dimension of a multi-dimensional array.  */
6922           if (mdim)
6923             {
6924               tree tmp;
6925
6926               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6927                   || !INTEGRAL_TYPE_P (itype)
6928                   || !TYPE_MAX_VALUE (itype)
6929                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6930                 continue;
6931
6932               tmp = fold_binary (PLUS_EXPR, itype,
6933                                  fold_convert (itype,
6934                                                TREE_OPERAND (ref, 1)),
6935                                  fold_convert (itype, delta));
6936               if (!tmp
6937                   || TREE_CODE (tmp) != INTEGER_CST
6938                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6939                 continue;
6940             }
6941
6942           break;
6943         }
6944       else
6945         mdim = false;
6946
6947       if (!handled_component_p (ref))
6948         return NULL_TREE;
6949     }
6950
6951   /* We found the suitable array reference.  So copy everything up to it,
6952      and replace the index.  */
6953
6954   pref = TREE_OPERAND (addr, 0);
6955   ret = copy_node (pref);
6956   pos = ret;
6957
6958   while (pref != ref)
6959     {
6960       pref = TREE_OPERAND (pref, 0);
6961       TREE_OPERAND (pos, 0) = copy_node (pref);
6962       pos = TREE_OPERAND (pos, 0);
6963     }
6964
6965   TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
6966                                        fold_convert (itype,
6967                                                      TREE_OPERAND (pos, 1)),
6968                                        fold_convert (itype, delta));
6969
6970   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6971 }
6972
6973
6974 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6975    means A >= Y && A != MAX, but in this case we know that
6976    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6977
6978 static tree
6979 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6980 {
6981   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6982
6983   if (TREE_CODE (bound) == LT_EXPR)
6984     a = TREE_OPERAND (bound, 0);
6985   else if (TREE_CODE (bound) == GT_EXPR)
6986     a = TREE_OPERAND (bound, 1);
6987   else
6988     return NULL_TREE;
6989
6990   typea = TREE_TYPE (a);
6991   if (!INTEGRAL_TYPE_P (typea)
6992       && !POINTER_TYPE_P (typea))
6993     return NULL_TREE;
6994
6995   if (TREE_CODE (ineq) == LT_EXPR)
6996     {
6997       a1 = TREE_OPERAND (ineq, 1);
6998       y = TREE_OPERAND (ineq, 0);
6999     }
7000   else if (TREE_CODE (ineq) == GT_EXPR)
7001     {
7002       a1 = TREE_OPERAND (ineq, 0);
7003       y = TREE_OPERAND (ineq, 1);
7004     }
7005   else
7006     return NULL_TREE;
7007
7008   if (TREE_TYPE (a1) != typea)
7009     return NULL_TREE;
7010
7011   if (POINTER_TYPE_P (typea))
7012     {
7013       /* Convert the pointer types into integer before taking the difference.  */
7014       tree ta = fold_convert (ssizetype, a);
7015       tree ta1 = fold_convert (ssizetype, a1);
7016       diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7017     }
7018   else
7019    diff = fold_binary (MINUS_EXPR, typea, a1, a);
7020
7021   if (!diff || !integer_onep (diff))
7022    return NULL_TREE;
7023
7024   return fold_build2 (GE_EXPR, type, a, y);
7025 }
7026
7027 /* Fold a sum or difference of at least one multiplication.
7028    Returns the folded tree or NULL if no simplification could be made.  */
7029
7030 static tree
7031 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7032 {
7033   tree arg00, arg01, arg10, arg11;
7034   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7035
7036   /* (A * C) +- (B * C) -> (A+-B) * C.
7037      (A * C) +- A -> A * (C+-1).
7038      We are most concerned about the case where C is a constant,
7039      but other combinations show up during loop reduction.  Since
7040      it is not difficult, try all four possibilities.  */
7041
7042   if (TREE_CODE (arg0) == MULT_EXPR)
7043     {
7044       arg00 = TREE_OPERAND (arg0, 0);
7045       arg01 = TREE_OPERAND (arg0, 1);
7046     }
7047   else if (TREE_CODE (arg0) == INTEGER_CST)
7048     {
7049       arg00 = build_one_cst (type);
7050       arg01 = arg0;
7051     }
7052   else
7053     {
7054       /* We cannot generate constant 1 for fract.  */
7055       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7056         return NULL_TREE;
7057       arg00 = arg0;
7058       arg01 = build_one_cst (type);
7059     }
7060   if (TREE_CODE (arg1) == MULT_EXPR)
7061     {
7062       arg10 = TREE_OPERAND (arg1, 0);
7063       arg11 = TREE_OPERAND (arg1, 1);
7064     }
7065   else if (TREE_CODE (arg1) == INTEGER_CST)
7066     {
7067       arg10 = build_one_cst (type);
7068       arg11 = arg1;
7069     }
7070   else
7071     {
7072       /* We cannot generate constant 1 for fract.  */
7073       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7074         return NULL_TREE;
7075       arg10 = arg1;
7076       arg11 = build_one_cst (type);
7077     }
7078   same = NULL_TREE;
7079
7080   if (operand_equal_p (arg01, arg11, 0))
7081     same = arg01, alt0 = arg00, alt1 = arg10;
7082   else if (operand_equal_p (arg00, arg10, 0))
7083     same = arg00, alt0 = arg01, alt1 = arg11;
7084   else if (operand_equal_p (arg00, arg11, 0))
7085     same = arg00, alt0 = arg01, alt1 = arg10;
7086   else if (operand_equal_p (arg01, arg10, 0))
7087     same = arg01, alt0 = arg00, alt1 = arg11;
7088
7089   /* No identical multiplicands; see if we can find a common
7090      power-of-two factor in non-power-of-two multiplies.  This
7091      can help in multi-dimensional array access.  */
7092   else if (host_integerp (arg01, 0)
7093            && host_integerp (arg11, 0))
7094     {
7095       HOST_WIDE_INT int01, int11, tmp;
7096       bool swap = false;
7097       tree maybe_same;
7098       int01 = TREE_INT_CST_LOW (arg01);
7099       int11 = TREE_INT_CST_LOW (arg11);
7100
7101       /* Move min of absolute values to int11.  */
7102       if ((int01 >= 0 ? int01 : -int01)
7103           < (int11 >= 0 ? int11 : -int11))
7104         {
7105           tmp = int01, int01 = int11, int11 = tmp;
7106           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7107           maybe_same = arg01;
7108           swap = true;
7109         }
7110       else
7111         maybe_same = arg11;
7112
7113       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7114         {
7115           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7116                               build_int_cst (TREE_TYPE (arg00),
7117                                              int01 / int11));
7118           alt1 = arg10;
7119           same = maybe_same;
7120           if (swap)
7121             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7122         }
7123     }
7124
7125   if (same)
7126     return fold_build2 (MULT_EXPR, type,
7127                         fold_build2 (code, type,
7128                                      fold_convert (type, alt0),
7129                                      fold_convert (type, alt1)),
7130                         fold_convert (type, same));
7131
7132   return NULL_TREE;
7133 }
7134
7135 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7136    specified by EXPR into the buffer PTR of length LEN bytes.
7137    Return the number of bytes placed in the buffer, or zero
7138    upon failure.  */
7139
7140 static int
7141 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7142 {
7143   tree type = TREE_TYPE (expr);
7144   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7145   int byte, offset, word, words;
7146   unsigned char value;
7147
7148   if (total_bytes > len)
7149     return 0;
7150   words = total_bytes / UNITS_PER_WORD;
7151
7152   for (byte = 0; byte < total_bytes; byte++)
7153     {
7154       int bitpos = byte * BITS_PER_UNIT;
7155       if (bitpos < HOST_BITS_PER_WIDE_INT)
7156         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7157       else
7158         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7159                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7160
7161       if (total_bytes > UNITS_PER_WORD)
7162         {
7163           word = byte / UNITS_PER_WORD;
7164           if (WORDS_BIG_ENDIAN)
7165             word = (words - 1) - word;
7166           offset = word * UNITS_PER_WORD;
7167           if (BYTES_BIG_ENDIAN)
7168             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7169           else
7170             offset += byte % UNITS_PER_WORD;
7171         }
7172       else
7173         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7174       ptr[offset] = value;
7175     }
7176   return total_bytes;
7177 }
7178
7179
7180 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7181    specified by EXPR into the buffer PTR of length LEN bytes.
7182    Return the number of bytes placed in the buffer, or zero
7183    upon failure.  */
7184
7185 static int
7186 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7187 {
7188   tree type = TREE_TYPE (expr);
7189   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7190   int byte, offset, word, words, bitpos;
7191   unsigned char value;
7192
7193   /* There are always 32 bits in each long, no matter the size of
7194      the hosts long.  We handle floating point representations with
7195      up to 192 bits.  */
7196   long tmp[6];
7197
7198   if (total_bytes > len)
7199     return 0;
7200   words = 32 / UNITS_PER_WORD;
7201
7202   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7203
7204   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7205        bitpos += BITS_PER_UNIT)
7206     {
7207       byte = (bitpos / BITS_PER_UNIT) & 3;
7208       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7209
7210       if (UNITS_PER_WORD < 4)
7211         {
7212           word = byte / UNITS_PER_WORD;
7213           if (WORDS_BIG_ENDIAN)
7214             word = (words - 1) - word;
7215           offset = word * UNITS_PER_WORD;
7216           if (BYTES_BIG_ENDIAN)
7217             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7218           else
7219             offset += byte % UNITS_PER_WORD;
7220         }
7221       else
7222         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7223       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7224     }
7225   return total_bytes;
7226 }
7227
7228 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7229    specified by EXPR into the buffer PTR of length LEN bytes.
7230    Return the number of bytes placed in the buffer, or zero
7231    upon failure.  */
7232
7233 static int
7234 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7235 {
7236   int rsize, isize;
7237   tree part;
7238
7239   part = TREE_REALPART (expr);
7240   rsize = native_encode_expr (part, ptr, len);
7241   if (rsize == 0)
7242     return 0;
7243   part = TREE_IMAGPART (expr);
7244   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7245   if (isize != rsize)
7246     return 0;
7247   return rsize + isize;
7248 }
7249
7250
7251 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7252    specified by EXPR into the buffer PTR of length LEN bytes.
7253    Return the number of bytes placed in the buffer, or zero
7254    upon failure.  */
7255
7256 static int
7257 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7258 {
7259   int i, size, offset, count;
7260   tree itype, elem, elements;
7261
7262   offset = 0;
7263   elements = TREE_VECTOR_CST_ELTS (expr);
7264   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7265   itype = TREE_TYPE (TREE_TYPE (expr));
7266   size = GET_MODE_SIZE (TYPE_MODE (itype));
7267   for (i = 0; i < count; i++)
7268     {
7269       if (elements)
7270         {
7271           elem = TREE_VALUE (elements);
7272           elements = TREE_CHAIN (elements);
7273         }
7274       else
7275         elem = NULL_TREE;
7276
7277       if (elem)
7278         {
7279           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7280             return 0;
7281         }
7282       else
7283         {
7284           if (offset + size > len)
7285             return 0;
7286           memset (ptr+offset, 0, size);
7287         }
7288       offset += size;
7289     }
7290   return offset;
7291 }
7292
7293
7294 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7295    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7296    buffer PTR of length LEN bytes.  Return the number of bytes
7297    placed in the buffer, or zero upon failure.  */
7298
7299 int
7300 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7301 {
7302   switch (TREE_CODE (expr))
7303     {
7304     case INTEGER_CST:
7305       return native_encode_int (expr, ptr, len);
7306
7307     case REAL_CST:
7308       return native_encode_real (expr, ptr, len);
7309
7310     case COMPLEX_CST:
7311       return native_encode_complex (expr, ptr, len);
7312
7313     case VECTOR_CST:
7314       return native_encode_vector (expr, ptr, len);
7315
7316     default:
7317       return 0;
7318     }
7319 }
7320
7321
7322 /* Subroutine of native_interpret_expr.  Interpret the contents of
7323    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7324    If the buffer cannot be interpreted, return NULL_TREE.  */
7325
7326 static tree
7327 native_interpret_int (tree type, const unsigned char *ptr, int len)
7328 {
7329   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7330   int byte, offset, word, words;
7331   unsigned char value;
7332   unsigned int HOST_WIDE_INT lo = 0;
7333   HOST_WIDE_INT hi = 0;
7334
7335   if (total_bytes > len)
7336     return NULL_TREE;
7337   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7338     return NULL_TREE;
7339   words = total_bytes / UNITS_PER_WORD;
7340
7341   for (byte = 0; byte < total_bytes; byte++)
7342     {
7343       int bitpos = byte * BITS_PER_UNIT;
7344       if (total_bytes > UNITS_PER_WORD)
7345         {
7346           word = byte / UNITS_PER_WORD;
7347           if (WORDS_BIG_ENDIAN)
7348             word = (words - 1) - word;
7349           offset = word * UNITS_PER_WORD;
7350           if (BYTES_BIG_ENDIAN)
7351             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7352           else
7353             offset += byte % UNITS_PER_WORD;
7354         }
7355       else
7356         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7357       value = ptr[offset];
7358
7359       if (bitpos < HOST_BITS_PER_WIDE_INT)
7360         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7361       else
7362         hi |= (unsigned HOST_WIDE_INT) value
7363               << (bitpos - HOST_BITS_PER_WIDE_INT);
7364     }
7365
7366   return build_int_cst_wide_type (type, lo, hi);
7367 }
7368
7369
7370 /* Subroutine of native_interpret_expr.  Interpret the contents of
7371    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7372    If the buffer cannot be interpreted, return NULL_TREE.  */
7373
7374 static tree
7375 native_interpret_real (tree type, const unsigned char *ptr, int len)
7376 {
7377   enum machine_mode mode = TYPE_MODE (type);
7378   int total_bytes = GET_MODE_SIZE (mode);
7379   int byte, offset, word, words, bitpos;
7380   unsigned char value;
7381   /* There are always 32 bits in each long, no matter the size of
7382      the hosts long.  We handle floating point representations with
7383      up to 192 bits.  */
7384   REAL_VALUE_TYPE r;
7385   long tmp[6];
7386
7387   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7388   if (total_bytes > len || total_bytes > 24)
7389     return NULL_TREE;
7390   words = 32 / UNITS_PER_WORD;
7391
7392   memset (tmp, 0, sizeof (tmp));
7393   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7394        bitpos += BITS_PER_UNIT)
7395     {
7396       byte = (bitpos / BITS_PER_UNIT) & 3;
7397       if (UNITS_PER_WORD < 4)
7398         {
7399           word = byte / UNITS_PER_WORD;
7400           if (WORDS_BIG_ENDIAN)
7401             word = (words - 1) - word;
7402           offset = word * UNITS_PER_WORD;
7403           if (BYTES_BIG_ENDIAN)
7404             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7405           else
7406             offset += byte % UNITS_PER_WORD;
7407         }
7408       else
7409         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7410       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7411
7412       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7413     }
7414
7415   real_from_target (&r, tmp, mode);
7416   return build_real (type, r);
7417 }
7418
7419
7420 /* Subroutine of native_interpret_expr.  Interpret the contents of
7421    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7422    If the buffer cannot be interpreted, return NULL_TREE.  */
7423
7424 static tree
7425 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7426 {
7427   tree etype, rpart, ipart;
7428   int size;
7429
7430   etype = TREE_TYPE (type);
7431   size = GET_MODE_SIZE (TYPE_MODE (etype));
7432   if (size * 2 > len)
7433     return NULL_TREE;
7434   rpart = native_interpret_expr (etype, ptr, size);
7435   if (!rpart)
7436     return NULL_TREE;
7437   ipart = native_interpret_expr (etype, ptr+size, size);
7438   if (!ipart)
7439     return NULL_TREE;
7440   return build_complex (type, rpart, ipart);
7441 }
7442
7443
7444 /* Subroutine of native_interpret_expr.  Interpret the contents of
7445    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7446    If the buffer cannot be interpreted, return NULL_TREE.  */
7447
7448 static tree
7449 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7450 {
7451   tree etype, elem, elements;
7452   int i, size, count;
7453
7454   etype = TREE_TYPE (type);
7455   size = GET_MODE_SIZE (TYPE_MODE (etype));
7456   count = TYPE_VECTOR_SUBPARTS (type);
7457   if (size * count > len)
7458     return NULL_TREE;
7459
7460   elements = NULL_TREE;
7461   for (i = count - 1; i >= 0; i--)
7462     {
7463       elem = native_interpret_expr (etype, ptr+(i*size), size);
7464       if (!elem)
7465         return NULL_TREE;
7466       elements = tree_cons (NULL_TREE, elem, elements);
7467     }
7468   return build_vector (type, elements);
7469 }
7470
7471
7472 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7473    the buffer PTR of length LEN as a constant of type TYPE.  For
7474    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7475    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7476    return NULL_TREE.  */
7477
7478 tree
7479 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7480 {
7481   switch (TREE_CODE (type))
7482     {
7483     case INTEGER_TYPE:
7484     case ENUMERAL_TYPE:
7485     case BOOLEAN_TYPE:
7486       return native_interpret_int (type, ptr, len);
7487
7488     case REAL_TYPE:
7489       return native_interpret_real (type, ptr, len);
7490
7491     case COMPLEX_TYPE:
7492       return native_interpret_complex (type, ptr, len);
7493
7494     case VECTOR_TYPE:
7495       return native_interpret_vector (type, ptr, len);
7496
7497     default:
7498       return NULL_TREE;
7499     }
7500 }
7501
7502
7503 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7504    TYPE at compile-time.  If we're unable to perform the conversion
7505    return NULL_TREE.  */
7506
7507 static tree
7508 fold_view_convert_expr (tree type, tree expr)
7509 {
7510   /* We support up to 512-bit values (for V8DFmode).  */
7511   unsigned char buffer[64];
7512   int len;
7513
7514   /* Check that the host and target are sane.  */
7515   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7516     return NULL_TREE;
7517
7518   len = native_encode_expr (expr, buffer, sizeof (buffer));
7519   if (len == 0)
7520     return NULL_TREE;
7521
7522   return native_interpret_expr (type, buffer, len);
7523 }
7524
7525 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7526    to avoid confusing the gimplify process.  When IN_FOLD is true
7527    avoid modifications of T.  */
7528
7529 static tree
7530 build_fold_addr_expr_with_type_1 (tree t, tree ptrtype, bool in_fold)
7531 {
7532   /* The size of the object is not relevant when talking about its address.  */
7533   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7534     t = TREE_OPERAND (t, 0);
7535
7536   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7537   if (TREE_CODE (t) == INDIRECT_REF
7538       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7539     {
7540       t = TREE_OPERAND (t, 0);
7541
7542       if (TREE_TYPE (t) != ptrtype)
7543         t = build1 (NOP_EXPR, ptrtype, t);
7544     }
7545   else if (!in_fold)
7546     {
7547       tree base = t;
7548
7549       while (handled_component_p (base))
7550         base = TREE_OPERAND (base, 0);
7551
7552       if (DECL_P (base))
7553         TREE_ADDRESSABLE (base) = 1;
7554
7555       t = build1 (ADDR_EXPR, ptrtype, t);
7556     }
7557   else
7558     t = build1 (ADDR_EXPR, ptrtype, t);
7559
7560   return t;
7561 }
7562
7563 /* Build an expression for the address of T with type PTRTYPE.  This
7564    function modifies the input parameter 'T' by sometimes setting the
7565    TREE_ADDRESSABLE flag.  */
7566
7567 tree
7568 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7569 {
7570   return build_fold_addr_expr_with_type_1 (t, ptrtype, false);
7571 }
7572
7573 /* Build an expression for the address of T.  This function modifies
7574    the input parameter 'T' by sometimes setting the TREE_ADDRESSABLE
7575    flag.  When called from fold functions, use fold_addr_expr instead.  */
7576
7577 tree
7578 build_fold_addr_expr (tree t)
7579 {
7580   return build_fold_addr_expr_with_type_1 (t, 
7581                                            build_pointer_type (TREE_TYPE (t)),
7582                                            false);
7583 }
7584
7585 /* Same as build_fold_addr_expr, builds an expression for the address
7586    of T, but avoids touching the input node 't'.  Fold functions
7587    should use this version.  */
7588
7589 static tree
7590 fold_addr_expr (tree t)
7591 {
7592   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7593
7594   return build_fold_addr_expr_with_type_1 (t, ptrtype, true);
7595 }
7596
7597 /* Fold a unary expression of code CODE and type TYPE with operand
7598    OP0.  Return the folded expression if folding is successful.
7599    Otherwise, return NULL_TREE.  */
7600
7601 tree
7602 fold_unary (enum tree_code code, tree type, tree op0)
7603 {
7604   tree tem;
7605   tree arg0;
7606   enum tree_code_class kind = TREE_CODE_CLASS (code);
7607
7608   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7609               && TREE_CODE_LENGTH (code) == 1);
7610
7611   arg0 = op0;
7612   if (arg0)
7613     {
7614       if (code == NOP_EXPR || code == CONVERT_EXPR
7615           || code == FLOAT_EXPR || code == ABS_EXPR)
7616         {
7617           /* Don't use STRIP_NOPS, because signedness of argument type
7618              matters.  */
7619           STRIP_SIGN_NOPS (arg0);
7620         }
7621       else
7622         {
7623           /* Strip any conversions that don't change the mode.  This
7624              is safe for every expression, except for a comparison
7625              expression because its signedness is derived from its
7626              operands.
7627
7628              Note that this is done as an internal manipulation within
7629              the constant folder, in order to find the simplest
7630              representation of the arguments so that their form can be
7631              studied.  In any cases, the appropriate type conversions
7632              should be put back in the tree that will get out of the
7633              constant folder.  */
7634           STRIP_NOPS (arg0);
7635         }
7636     }
7637
7638   if (TREE_CODE_CLASS (code) == tcc_unary)
7639     {
7640       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7641         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7642                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7643       else if (TREE_CODE (arg0) == COND_EXPR)
7644         {
7645           tree arg01 = TREE_OPERAND (arg0, 1);
7646           tree arg02 = TREE_OPERAND (arg0, 2);
7647           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7648             arg01 = fold_build1 (code, type, arg01);
7649           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7650             arg02 = fold_build1 (code, type, arg02);
7651           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7652                              arg01, arg02);
7653
7654           /* If this was a conversion, and all we did was to move into
7655              inside the COND_EXPR, bring it back out.  But leave it if
7656              it is a conversion from integer to integer and the
7657              result precision is no wider than a word since such a
7658              conversion is cheap and may be optimized away by combine,
7659              while it couldn't if it were outside the COND_EXPR.  Then return
7660              so we don't get into an infinite recursion loop taking the
7661              conversion out and then back in.  */
7662
7663           if ((code == NOP_EXPR || code == CONVERT_EXPR
7664                || code == NON_LVALUE_EXPR)
7665               && TREE_CODE (tem) == COND_EXPR
7666               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7667               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7668               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7669               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7670               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7671                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7672               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7673                      && (INTEGRAL_TYPE_P
7674                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7675                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7676                   || flag_syntax_only))
7677             tem = build1 (code, type,
7678                           build3 (COND_EXPR,
7679                                   TREE_TYPE (TREE_OPERAND
7680                                              (TREE_OPERAND (tem, 1), 0)),
7681                                   TREE_OPERAND (tem, 0),
7682                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7683                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7684           return tem;
7685         }
7686       else if (COMPARISON_CLASS_P (arg0))
7687         {
7688           if (TREE_CODE (type) == BOOLEAN_TYPE)
7689             {
7690               arg0 = copy_node (arg0);
7691               TREE_TYPE (arg0) = type;
7692               return arg0;
7693             }
7694           else if (TREE_CODE (type) != INTEGER_TYPE)
7695             return fold_build3 (COND_EXPR, type, arg0,
7696                                 fold_build1 (code, type,
7697                                              integer_one_node),
7698                                 fold_build1 (code, type,
7699                                              integer_zero_node));
7700         }
7701    }
7702
7703   switch (code)
7704     {
7705     case PAREN_EXPR:
7706       /* Re-association barriers around constants and other re-association
7707          barriers can be removed.  */
7708       if (CONSTANT_CLASS_P (op0)
7709           || TREE_CODE (op0) == PAREN_EXPR)
7710         return fold_convert (type, op0);
7711       return NULL_TREE;
7712
7713     case NOP_EXPR:
7714     case FLOAT_EXPR:
7715     case CONVERT_EXPR:
7716     case FIX_TRUNC_EXPR:
7717       if (TREE_TYPE (op0) == type)
7718         return op0;
7719       
7720       /* If we have (type) (a CMP b) and type is an integral type, return
7721          new expression involving the new type.  */
7722       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7723         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7724                             TREE_OPERAND (op0, 1));
7725
7726       /* Handle cases of two conversions in a row.  */
7727       if (TREE_CODE (op0) == NOP_EXPR
7728           || TREE_CODE (op0) == CONVERT_EXPR)
7729         {
7730           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7731           tree inter_type = TREE_TYPE (op0);
7732           int inside_int = INTEGRAL_TYPE_P (inside_type);
7733           int inside_ptr = POINTER_TYPE_P (inside_type);
7734           int inside_float = FLOAT_TYPE_P (inside_type);
7735           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7736           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7737           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7738           int inter_int = INTEGRAL_TYPE_P (inter_type);
7739           int inter_ptr = POINTER_TYPE_P (inter_type);
7740           int inter_float = FLOAT_TYPE_P (inter_type);
7741           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7742           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7743           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7744           int final_int = INTEGRAL_TYPE_P (type);
7745           int final_ptr = POINTER_TYPE_P (type);
7746           int final_float = FLOAT_TYPE_P (type);
7747           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7748           unsigned int final_prec = TYPE_PRECISION (type);
7749           int final_unsignedp = TYPE_UNSIGNED (type);
7750
7751           /* In addition to the cases of two conversions in a row
7752              handled below, if we are converting something to its own
7753              type via an object of identical or wider precision, neither
7754              conversion is needed.  */
7755           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7756               && (((inter_int || inter_ptr) && final_int)
7757                   || (inter_float && final_float))
7758               && inter_prec >= final_prec)
7759             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7760
7761           /* Likewise, if the intermediate and final types are either both
7762              float or both integer, we don't need the middle conversion if
7763              it is wider than the final type and doesn't change the signedness
7764              (for integers).  Avoid this if the final type is a pointer
7765              since then we sometimes need the inner conversion.  Likewise if
7766              the outer has a precision not equal to the size of its mode.  */
7767           if (((inter_int && inside_int)
7768                || (inter_float && inside_float)
7769                || (inter_vec && inside_vec))
7770               && inter_prec >= inside_prec
7771               && (inter_float || inter_vec
7772                   || inter_unsignedp == inside_unsignedp)
7773               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7774                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7775               && ! final_ptr
7776               && (! final_vec || inter_prec == inside_prec))
7777             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7778
7779           /* If we have a sign-extension of a zero-extended value, we can
7780              replace that by a single zero-extension.  */
7781           if (inside_int && inter_int && final_int
7782               && inside_prec < inter_prec && inter_prec < final_prec
7783               && inside_unsignedp && !inter_unsignedp)
7784             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7785
7786           /* Two conversions in a row are not needed unless:
7787              - some conversion is floating-point (overstrict for now), or
7788              - some conversion is a vector (overstrict for now), or
7789              - the intermediate type is narrower than both initial and
7790                final, or
7791              - the intermediate type and innermost type differ in signedness,
7792                and the outermost type is wider than the intermediate, or
7793              - the initial type is a pointer type and the precisions of the
7794                intermediate and final types differ, or
7795              - the final type is a pointer type and the precisions of the
7796                initial and intermediate types differ.  */
7797           if (! inside_float && ! inter_float && ! final_float
7798               && ! inside_vec && ! inter_vec && ! final_vec
7799               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7800               && ! (inside_int && inter_int
7801                     && inter_unsignedp != inside_unsignedp
7802                     && inter_prec < final_prec)
7803               && ((inter_unsignedp && inter_prec > inside_prec)
7804                   == (final_unsignedp && final_prec > inter_prec))
7805               && ! (inside_ptr && inter_prec != final_prec)
7806               && ! (final_ptr && inside_prec != inter_prec)
7807               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7808                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
7809             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7810         }
7811
7812       /* Handle (T *)&A.B.C for A being of type T and B and C
7813          living at offset zero.  This occurs frequently in
7814          C++ upcasting and then accessing the base.  */
7815       if (TREE_CODE (op0) == ADDR_EXPR
7816           && POINTER_TYPE_P (type)
7817           && handled_component_p (TREE_OPERAND (op0, 0)))
7818         {
7819           HOST_WIDE_INT bitsize, bitpos;
7820           tree offset;
7821           enum machine_mode mode;
7822           int unsignedp, volatilep;
7823           tree base = TREE_OPERAND (op0, 0);
7824           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7825                                       &mode, &unsignedp, &volatilep, false);
7826           /* If the reference was to a (constant) zero offset, we can use
7827              the address of the base if it has the same base type
7828              as the result type.  */
7829           if (! offset && bitpos == 0
7830               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7831                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7832             return fold_convert (type, fold_addr_expr (base));
7833         }
7834
7835       if ((TREE_CODE (op0) == MODIFY_EXPR
7836            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7837           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7838           /* Detect assigning a bitfield.  */
7839           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7840                && DECL_BIT_FIELD
7841                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7842         {
7843           /* Don't leave an assignment inside a conversion
7844              unless assigning a bitfield.  */
7845           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7846           /* First do the assignment, then return converted constant.  */
7847           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7848           TREE_NO_WARNING (tem) = 1;
7849           TREE_USED (tem) = 1;
7850           return tem;
7851         }
7852
7853       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7854          constants (if x has signed type, the sign bit cannot be set
7855          in c).  This folds extension into the BIT_AND_EXPR.  */
7856       if (INTEGRAL_TYPE_P (type)
7857           && TREE_CODE (type) != BOOLEAN_TYPE
7858           && TREE_CODE (op0) == BIT_AND_EXPR
7859           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7860         {
7861           tree and = op0;
7862           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7863           int change = 0;
7864
7865           if (TYPE_UNSIGNED (TREE_TYPE (and))
7866               || (TYPE_PRECISION (type)
7867                   <= TYPE_PRECISION (TREE_TYPE (and))))
7868             change = 1;
7869           else if (TYPE_PRECISION (TREE_TYPE (and1))
7870                    <= HOST_BITS_PER_WIDE_INT
7871                    && host_integerp (and1, 1))
7872             {
7873               unsigned HOST_WIDE_INT cst;
7874
7875               cst = tree_low_cst (and1, 1);
7876               cst &= (HOST_WIDE_INT) -1
7877                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7878               change = (cst == 0);
7879 #ifdef LOAD_EXTEND_OP
7880               if (change
7881                   && !flag_syntax_only
7882                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7883                       == ZERO_EXTEND))
7884                 {
7885                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7886                   and0 = fold_convert (uns, and0);
7887                   and1 = fold_convert (uns, and1);
7888                 }
7889 #endif
7890             }
7891           if (change)
7892             {
7893               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7894                                            TREE_INT_CST_HIGH (and1), 0,
7895                                            TREE_OVERFLOW (and1));
7896               return fold_build2 (BIT_AND_EXPR, type,
7897                                   fold_convert (type, and0), tem);
7898             }
7899         }
7900
7901       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
7902          when one of the new casts will fold away. Conservatively we assume
7903          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
7904       if (POINTER_TYPE_P (type)
7905           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
7906           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7907               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7908               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7909         {
7910           tree arg00 = TREE_OPERAND (arg0, 0);
7911           tree arg01 = TREE_OPERAND (arg0, 1);
7912
7913           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7914                               fold_convert (sizetype, arg01));
7915         }
7916
7917       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7918          of the same precision, and X is an integer type not narrower than
7919          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7920       if (INTEGRAL_TYPE_P (type)
7921           && TREE_CODE (op0) == BIT_NOT_EXPR
7922           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7923           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7924               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7925           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7926         {
7927           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7928           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7929               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7930             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7931         }
7932
7933       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
7934          type of X and Y (integer types only).  */
7935       if (INTEGRAL_TYPE_P (type)
7936           && TREE_CODE (op0) == MULT_EXPR
7937           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7938           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
7939         {
7940           /* Be careful not to introduce new overflows.  */
7941           tree mult_type;
7942           if (TYPE_OVERFLOW_WRAPS (type))
7943             mult_type = type;
7944           else
7945             mult_type = unsigned_type_for (type);
7946           
7947           tem = fold_build2 (MULT_EXPR, mult_type,
7948                              fold_convert (mult_type, TREE_OPERAND (op0, 0)),
7949                              fold_convert (mult_type, TREE_OPERAND (op0, 1)));
7950           return fold_convert (type, tem);
7951         }
7952
7953       tem = fold_convert_const (code, type, op0);
7954       return tem ? tem : NULL_TREE;
7955
7956     case FIXED_CONVERT_EXPR:
7957       tem = fold_convert_const (code, type, arg0);
7958       return tem ? tem : NULL_TREE;
7959
7960     case VIEW_CONVERT_EXPR:
7961       if (TREE_TYPE (op0) == type)
7962         return op0;
7963       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7964         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7965
7966       /* For integral conversions with the same precision or pointer
7967          conversions use a NOP_EXPR instead.  */
7968       if ((INTEGRAL_TYPE_P (type)
7969            || POINTER_TYPE_P (type))
7970           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7971               || POINTER_TYPE_P (TREE_TYPE (op0)))
7972           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
7973           /* Do not muck with VIEW_CONVERT_EXPRs that convert from
7974              a sub-type to its base type as generated by the Ada FE.  */
7975           && !(INTEGRAL_TYPE_P (TREE_TYPE (op0))
7976                && TREE_TYPE (TREE_TYPE (op0))))
7977         return fold_convert (type, op0);
7978
7979       /* Strip inner integral conversions that do not change the precision.  */
7980       if ((TREE_CODE (op0) == NOP_EXPR
7981            || TREE_CODE (op0) == CONVERT_EXPR)
7982           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7983               || POINTER_TYPE_P (TREE_TYPE (op0)))
7984           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
7985               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
7986           && (TYPE_PRECISION (TREE_TYPE (op0))
7987               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
7988         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7989
7990       return fold_view_convert_expr (type, op0);
7991
7992     case NEGATE_EXPR:
7993       tem = fold_negate_expr (arg0);
7994       if (tem)
7995         return fold_convert (type, tem);
7996       return NULL_TREE;
7997
7998     case ABS_EXPR:
7999       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8000         return fold_abs_const (arg0, type);
8001       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8002         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8003       /* Convert fabs((double)float) into (double)fabsf(float).  */
8004       else if (TREE_CODE (arg0) == NOP_EXPR
8005                && TREE_CODE (type) == REAL_TYPE)
8006         {
8007           tree targ0 = strip_float_extensions (arg0);
8008           if (targ0 != arg0)
8009             return fold_convert (type, fold_build1 (ABS_EXPR,
8010                                                     TREE_TYPE (targ0),
8011                                                     targ0));
8012         }
8013       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8014       else if (TREE_CODE (arg0) == ABS_EXPR)
8015         return arg0;
8016       else if (tree_expr_nonnegative_p (arg0))
8017         return arg0;
8018
8019       /* Strip sign ops from argument.  */
8020       if (TREE_CODE (type) == REAL_TYPE)
8021         {
8022           tem = fold_strip_sign_ops (arg0);
8023           if (tem)
8024             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
8025         }
8026       return NULL_TREE;
8027
8028     case CONJ_EXPR:
8029       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8030         return fold_convert (type, arg0);
8031       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8032         {
8033           tree itype = TREE_TYPE (type);
8034           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8035           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8036           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8037         }
8038       if (TREE_CODE (arg0) == COMPLEX_CST)
8039         {
8040           tree itype = TREE_TYPE (type);
8041           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8042           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8043           return build_complex (type, rpart, negate_expr (ipart));
8044         }
8045       if (TREE_CODE (arg0) == CONJ_EXPR)
8046         return fold_convert (type, TREE_OPERAND (arg0, 0));
8047       return NULL_TREE;
8048
8049     case BIT_NOT_EXPR:
8050       if (TREE_CODE (arg0) == INTEGER_CST)
8051         return fold_not_const (arg0, type);
8052       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8053         return fold_convert (type, TREE_OPERAND (arg0, 0));
8054       /* Convert ~ (-A) to A - 1.  */
8055       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8056         return fold_build2 (MINUS_EXPR, type,
8057                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8058                             build_int_cst (type, 1));
8059       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8060       else if (INTEGRAL_TYPE_P (type)
8061                && ((TREE_CODE (arg0) == MINUS_EXPR
8062                     && integer_onep (TREE_OPERAND (arg0, 1)))
8063                    || (TREE_CODE (arg0) == PLUS_EXPR
8064                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8065         return fold_build1 (NEGATE_EXPR, type,
8066                             fold_convert (type, TREE_OPERAND (arg0, 0)));
8067       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8068       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8069                && (tem = fold_unary (BIT_NOT_EXPR, type,
8070                                      fold_convert (type,
8071                                                    TREE_OPERAND (arg0, 0)))))
8072         return fold_build2 (BIT_XOR_EXPR, type, tem,
8073                             fold_convert (type, TREE_OPERAND (arg0, 1)));
8074       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8075                && (tem = fold_unary (BIT_NOT_EXPR, type,
8076                                      fold_convert (type,
8077                                                    TREE_OPERAND (arg0, 1)))))
8078         return fold_build2 (BIT_XOR_EXPR, type,
8079                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8080       /* Perform BIT_NOT_EXPR on each element individually.  */
8081       else if (TREE_CODE (arg0) == VECTOR_CST)
8082         {
8083           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8084           int count = TYPE_VECTOR_SUBPARTS (type), i;
8085
8086           for (i = 0; i < count; i++)
8087             {
8088               if (elements)
8089                 {
8090                   elem = TREE_VALUE (elements);
8091                   elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8092                   if (elem == NULL_TREE)
8093                     break;
8094                   elements = TREE_CHAIN (elements);
8095                 }
8096               else
8097                 elem = build_int_cst (TREE_TYPE (type), -1);
8098               list = tree_cons (NULL_TREE, elem, list);
8099             }
8100           if (i == count)
8101             return build_vector (type, nreverse (list));
8102         }
8103
8104       return NULL_TREE;
8105
8106     case TRUTH_NOT_EXPR:
8107       /* The argument to invert_truthvalue must have Boolean type.  */
8108       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8109           arg0 = fold_convert (boolean_type_node, arg0);
8110
8111       /* Note that the operand of this must be an int
8112          and its values must be 0 or 1.
8113          ("true" is a fixed value perhaps depending on the language,
8114          but we don't handle values other than 1 correctly yet.)  */
8115       tem = fold_truth_not_expr (arg0);
8116       if (!tem)
8117         return NULL_TREE;
8118       return fold_convert (type, tem);
8119
8120     case REALPART_EXPR:
8121       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8122         return fold_convert (type, arg0);
8123       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8124         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8125                                  TREE_OPERAND (arg0, 1));
8126       if (TREE_CODE (arg0) == COMPLEX_CST)
8127         return fold_convert (type, TREE_REALPART (arg0));
8128       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8129         {
8130           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8131           tem = fold_build2 (TREE_CODE (arg0), itype,
8132                              fold_build1 (REALPART_EXPR, itype,
8133                                           TREE_OPERAND (arg0, 0)),
8134                              fold_build1 (REALPART_EXPR, itype,
8135                                           TREE_OPERAND (arg0, 1)));
8136           return fold_convert (type, tem);
8137         }
8138       if (TREE_CODE (arg0) == CONJ_EXPR)
8139         {
8140           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8141           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8142           return fold_convert (type, tem);
8143         }
8144       if (TREE_CODE (arg0) == CALL_EXPR)
8145         {
8146           tree fn = get_callee_fndecl (arg0);
8147           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8148             switch (DECL_FUNCTION_CODE (fn))
8149               {
8150               CASE_FLT_FN (BUILT_IN_CEXPI):
8151                 fn = mathfn_built_in (type, BUILT_IN_COS);
8152                 if (fn)
8153                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8154                 break;
8155
8156               default:
8157                 break;
8158               }
8159         }
8160       return NULL_TREE;
8161
8162     case IMAGPART_EXPR:
8163       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8164         return fold_convert (type, integer_zero_node);
8165       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8166         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8167                                  TREE_OPERAND (arg0, 0));
8168       if (TREE_CODE (arg0) == COMPLEX_CST)
8169         return fold_convert (type, TREE_IMAGPART (arg0));
8170       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8171         {
8172           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8173           tem = fold_build2 (TREE_CODE (arg0), itype,
8174                              fold_build1 (IMAGPART_EXPR, itype,
8175                                           TREE_OPERAND (arg0, 0)),
8176                              fold_build1 (IMAGPART_EXPR, itype,
8177                                           TREE_OPERAND (arg0, 1)));
8178           return fold_convert (type, tem);
8179         }
8180       if (TREE_CODE (arg0) == CONJ_EXPR)
8181         {
8182           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8183           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8184           return fold_convert (type, negate_expr (tem));
8185         }
8186       if (TREE_CODE (arg0) == CALL_EXPR)
8187         {
8188           tree fn = get_callee_fndecl (arg0);
8189           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8190             switch (DECL_FUNCTION_CODE (fn))
8191               {
8192               CASE_FLT_FN (BUILT_IN_CEXPI):
8193                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8194                 if (fn)
8195                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8196                 break;
8197
8198               default:
8199                 break;
8200               }
8201         }
8202       return NULL_TREE;
8203
8204     default:
8205       return NULL_TREE;
8206     } /* switch (code) */
8207 }
8208
8209 /* Fold a binary expression of code CODE and type TYPE with operands
8210    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8211    Return the folded expression if folding is successful.  Otherwise,
8212    return NULL_TREE.  */
8213
8214 static tree
8215 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8216 {
8217   enum tree_code compl_code;
8218
8219   if (code == MIN_EXPR)
8220     compl_code = MAX_EXPR;
8221   else if (code == MAX_EXPR)
8222     compl_code = MIN_EXPR;
8223   else
8224     gcc_unreachable ();
8225
8226   /* MIN (MAX (a, b), b) == b.  */
8227   if (TREE_CODE (op0) == compl_code
8228       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8229     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8230
8231   /* MIN (MAX (b, a), b) == b.  */
8232   if (TREE_CODE (op0) == compl_code
8233       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8234       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8235     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8236
8237   /* MIN (a, MAX (a, b)) == a.  */
8238   if (TREE_CODE (op1) == compl_code
8239       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8240       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8241     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8242
8243   /* MIN (a, MAX (b, a)) == a.  */
8244   if (TREE_CODE (op1) == compl_code
8245       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8246       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8247     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8248
8249   return NULL_TREE;
8250 }
8251
8252 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8253    by changing CODE to reduce the magnitude of constants involved in
8254    ARG0 of the comparison.
8255    Returns a canonicalized comparison tree if a simplification was
8256    possible, otherwise returns NULL_TREE.
8257    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8258    valid if signed overflow is undefined.  */
8259
8260 static tree
8261 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8262                                  tree arg0, tree arg1,
8263                                  bool *strict_overflow_p)
8264 {
8265   enum tree_code code0 = TREE_CODE (arg0);
8266   tree t, cst0 = NULL_TREE;
8267   int sgn0;
8268   bool swap = false;
8269
8270   /* Match A +- CST code arg1 and CST code arg1.  */
8271   if (!(((code0 == MINUS_EXPR
8272           || code0 == PLUS_EXPR)
8273          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8274         || code0 == INTEGER_CST))
8275     return NULL_TREE;
8276
8277   /* Identify the constant in arg0 and its sign.  */
8278   if (code0 == INTEGER_CST)
8279     cst0 = arg0;
8280   else
8281     cst0 = TREE_OPERAND (arg0, 1);
8282   sgn0 = tree_int_cst_sgn (cst0);
8283
8284   /* Overflowed constants and zero will cause problems.  */
8285   if (integer_zerop (cst0)
8286       || TREE_OVERFLOW (cst0))
8287     return NULL_TREE;
8288
8289   /* See if we can reduce the magnitude of the constant in
8290      arg0 by changing the comparison code.  */
8291   if (code0 == INTEGER_CST)
8292     {
8293       /* CST <= arg1  ->  CST-1 < arg1.  */
8294       if (code == LE_EXPR && sgn0 == 1)
8295         code = LT_EXPR;
8296       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8297       else if (code == LT_EXPR && sgn0 == -1)
8298         code = LE_EXPR;
8299       /* CST > arg1  ->  CST-1 >= arg1.  */
8300       else if (code == GT_EXPR && sgn0 == 1)
8301         code = GE_EXPR;
8302       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8303       else if (code == GE_EXPR && sgn0 == -1)
8304         code = GT_EXPR;
8305       else
8306         return NULL_TREE;
8307       /* arg1 code' CST' might be more canonical.  */
8308       swap = true;
8309     }
8310   else
8311     {
8312       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8313       if (code == LT_EXPR
8314           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8315         code = LE_EXPR;
8316       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8317       else if (code == GT_EXPR
8318                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8319         code = GE_EXPR;
8320       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8321       else if (code == LE_EXPR
8322                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8323         code = LT_EXPR;
8324       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8325       else if (code == GE_EXPR
8326                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8327         code = GT_EXPR;
8328       else
8329         return NULL_TREE;
8330       *strict_overflow_p = true;
8331     }
8332
8333   /* Now build the constant reduced in magnitude.  */
8334   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8335                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8336   if (code0 != INTEGER_CST)
8337     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8338
8339   /* If swapping might yield to a more canonical form, do so.  */
8340   if (swap)
8341     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8342   else
8343     return fold_build2 (code, type, t, arg1);
8344 }
8345
8346 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8347    overflow further.  Try to decrease the magnitude of constants involved
8348    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8349    and put sole constants at the second argument position.
8350    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8351
8352 static tree
8353 maybe_canonicalize_comparison (enum tree_code code, tree type,
8354                                tree arg0, tree arg1)
8355 {
8356   tree t;
8357   bool strict_overflow_p;
8358   const char * const warnmsg = G_("assuming signed overflow does not occur "
8359                                   "when reducing constant in comparison");
8360
8361   /* In principle pointers also have undefined overflow behavior,
8362      but that causes problems elsewhere.  */
8363   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8364       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8365     return NULL_TREE;
8366
8367   /* Try canonicalization by simplifying arg0.  */
8368   strict_overflow_p = false;
8369   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8370                                        &strict_overflow_p);
8371   if (t)
8372     {
8373       if (strict_overflow_p)
8374         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8375       return t;
8376     }
8377
8378   /* Try canonicalization by simplifying arg1 using the swapped
8379      comparison.  */
8380   code = swap_tree_comparison (code);
8381   strict_overflow_p = false;
8382   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8383                                        &strict_overflow_p);
8384   if (t && strict_overflow_p)
8385     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8386   return t;
8387 }
8388
8389 /* Subroutine of fold_binary.  This routine performs all of the
8390    transformations that are common to the equality/inequality
8391    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8392    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8393    fold_binary should call fold_binary.  Fold a comparison with
8394    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8395    the folded comparison or NULL_TREE.  */
8396
8397 static tree
8398 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8399 {
8400   tree arg0, arg1, tem;
8401
8402   arg0 = op0;
8403   arg1 = op1;
8404
8405   STRIP_SIGN_NOPS (arg0);
8406   STRIP_SIGN_NOPS (arg1);
8407
8408   tem = fold_relational_const (code, type, arg0, arg1);
8409   if (tem != NULL_TREE)
8410     return tem;
8411
8412   /* If one arg is a real or integer constant, put it last.  */
8413   if (tree_swap_operands_p (arg0, arg1, true))
8414     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8415
8416   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8417   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8418       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8419           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8420           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8421       && (TREE_CODE (arg1) == INTEGER_CST
8422           && !TREE_OVERFLOW (arg1)))
8423     {
8424       tree const1 = TREE_OPERAND (arg0, 1);
8425       tree const2 = arg1;
8426       tree variable = TREE_OPERAND (arg0, 0);
8427       tree lhs;
8428       int lhs_add;
8429       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8430
8431       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8432                          TREE_TYPE (arg1), const2, const1);
8433
8434       /* If the constant operation overflowed this can be
8435          simplified as a comparison against INT_MAX/INT_MIN.  */
8436       if (TREE_CODE (lhs) == INTEGER_CST
8437           && TREE_OVERFLOW (lhs))
8438         {
8439           int const1_sgn = tree_int_cst_sgn (const1);
8440           enum tree_code code2 = code;
8441
8442           /* Get the sign of the constant on the lhs if the
8443              operation were VARIABLE + CONST1.  */
8444           if (TREE_CODE (arg0) == MINUS_EXPR)
8445             const1_sgn = -const1_sgn;
8446
8447           /* The sign of the constant determines if we overflowed
8448              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8449              Canonicalize to the INT_MIN overflow by swapping the comparison
8450              if necessary.  */
8451           if (const1_sgn == -1)
8452             code2 = swap_tree_comparison (code);
8453
8454           /* We now can look at the canonicalized case
8455                VARIABLE + 1  CODE2  INT_MIN
8456              and decide on the result.  */
8457           if (code2 == LT_EXPR
8458               || code2 == LE_EXPR
8459               || code2 == EQ_EXPR)
8460             return omit_one_operand (type, boolean_false_node, variable);
8461           else if (code2 == NE_EXPR
8462                    || code2 == GE_EXPR
8463                    || code2 == GT_EXPR)
8464             return omit_one_operand (type, boolean_true_node, variable);
8465         }
8466
8467       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8468           && (TREE_CODE (lhs) != INTEGER_CST
8469               || !TREE_OVERFLOW (lhs)))
8470         {
8471           fold_overflow_warning (("assuming signed overflow does not occur "
8472                                   "when changing X +- C1 cmp C2 to "
8473                                   "X cmp C1 +- C2"),
8474                                  WARN_STRICT_OVERFLOW_COMPARISON);
8475           return fold_build2 (code, type, variable, lhs);
8476         }
8477     }
8478
8479   /* For comparisons of pointers we can decompose it to a compile time
8480      comparison of the base objects and the offsets into the object.
8481      This requires at least one operand being an ADDR_EXPR or a
8482      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8483   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8484       && (TREE_CODE (arg0) == ADDR_EXPR
8485           || TREE_CODE (arg1) == ADDR_EXPR
8486           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8487           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8488     {
8489       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8490       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8491       enum machine_mode mode;
8492       int volatilep, unsignedp;
8493       bool indirect_base0 = false, indirect_base1 = false;
8494
8495       /* Get base and offset for the access.  Strip ADDR_EXPR for
8496          get_inner_reference, but put it back by stripping INDIRECT_REF
8497          off the base object if possible.  indirect_baseN will be true
8498          if baseN is not an address but refers to the object itself.  */
8499       base0 = arg0;
8500       if (TREE_CODE (arg0) == ADDR_EXPR)
8501         {
8502           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8503                                        &bitsize, &bitpos0, &offset0, &mode,
8504                                        &unsignedp, &volatilep, false);
8505           if (TREE_CODE (base0) == INDIRECT_REF)
8506             base0 = TREE_OPERAND (base0, 0);
8507           else
8508             indirect_base0 = true;
8509         }
8510       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8511         {
8512           base0 = TREE_OPERAND (arg0, 0);
8513           offset0 = TREE_OPERAND (arg0, 1);
8514         }
8515
8516       base1 = arg1;
8517       if (TREE_CODE (arg1) == ADDR_EXPR)
8518         {
8519           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8520                                        &bitsize, &bitpos1, &offset1, &mode,
8521                                        &unsignedp, &volatilep, false);
8522           if (TREE_CODE (base1) == INDIRECT_REF)
8523             base1 = TREE_OPERAND (base1, 0);
8524           else
8525             indirect_base1 = true;
8526         }
8527       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8528         {
8529           base1 = TREE_OPERAND (arg1, 0);
8530           offset1 = TREE_OPERAND (arg1, 1);
8531         }
8532
8533       /* If we have equivalent bases we might be able to simplify.  */
8534       if (indirect_base0 == indirect_base1
8535           && operand_equal_p (base0, base1, 0))
8536         {
8537           /* We can fold this expression to a constant if the non-constant
8538              offset parts are equal.  */
8539           if (offset0 == offset1
8540               || (offset0 && offset1
8541                   && operand_equal_p (offset0, offset1, 0)))
8542             {
8543               switch (code)
8544                 {
8545                 case EQ_EXPR:
8546                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8547                 case NE_EXPR:
8548                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8549                 case LT_EXPR:
8550                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8551                 case LE_EXPR:
8552                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8553                 case GE_EXPR:
8554                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8555                 case GT_EXPR:
8556                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8557                 default:;
8558                 }
8559             }
8560           /* We can simplify the comparison to a comparison of the variable
8561              offset parts if the constant offset parts are equal.
8562              Be careful to use signed size type here because otherwise we
8563              mess with array offsets in the wrong way.  This is possible
8564              because pointer arithmetic is restricted to retain within an
8565              object and overflow on pointer differences is undefined as of
8566              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8567           else if (bitpos0 == bitpos1)
8568             {
8569               tree signed_size_type_node;
8570               signed_size_type_node = signed_type_for (size_type_node);
8571
8572               /* By converting to signed size type we cover middle-end pointer
8573                  arithmetic which operates on unsigned pointer types of size
8574                  type size and ARRAY_REF offsets which are properly sign or
8575                  zero extended from their type in case it is narrower than
8576                  size type.  */
8577               if (offset0 == NULL_TREE)
8578                 offset0 = build_int_cst (signed_size_type_node, 0);
8579               else
8580                 offset0 = fold_convert (signed_size_type_node, offset0);
8581               if (offset1 == NULL_TREE)
8582                 offset1 = build_int_cst (signed_size_type_node, 0);
8583               else
8584                 offset1 = fold_convert (signed_size_type_node, offset1);
8585
8586               return fold_build2 (code, type, offset0, offset1);
8587             }
8588         }
8589       /* For non-equal bases we can simplify if they are addresses
8590          of local binding decls or constants.  */
8591       else if (indirect_base0 && indirect_base1
8592                /* We know that !operand_equal_p (base0, base1, 0)
8593                   because the if condition was false.  But make
8594                   sure two decls are not the same.  */
8595                && base0 != base1
8596                && TREE_CODE (arg0) == ADDR_EXPR
8597                && TREE_CODE (arg1) == ADDR_EXPR
8598                && (((TREE_CODE (base0) == VAR_DECL
8599                      || TREE_CODE (base0) == PARM_DECL)
8600                     && (targetm.binds_local_p (base0)
8601                         || CONSTANT_CLASS_P (base1)))
8602                    || CONSTANT_CLASS_P (base0))
8603                && (((TREE_CODE (base1) == VAR_DECL
8604                      || TREE_CODE (base1) == PARM_DECL)
8605                     && (targetm.binds_local_p (base1)
8606                         || CONSTANT_CLASS_P (base0)))
8607                    || CONSTANT_CLASS_P (base1)))
8608         {
8609           if (code == EQ_EXPR)
8610             return omit_two_operands (type, boolean_false_node, arg0, arg1);
8611           else if (code == NE_EXPR)
8612             return omit_two_operands (type, boolean_true_node, arg0, arg1);
8613         }
8614       /* For equal offsets we can simplify to a comparison of the
8615          base addresses.  */
8616       else if (bitpos0 == bitpos1
8617                && (indirect_base0
8618                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
8619                && (indirect_base1
8620                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
8621                && ((offset0 == offset1)
8622                    || (offset0 && offset1
8623                        && operand_equal_p (offset0, offset1, 0))))
8624         {
8625           if (indirect_base0)
8626             base0 = fold_addr_expr (base0);
8627           if (indirect_base1)
8628             base1 = fold_addr_expr (base1);
8629           return fold_build2 (code, type, base0, base1);
8630         }
8631     }
8632
8633   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8634      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8635      the resulting offset is smaller in absolute value than the
8636      original one.  */
8637   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8638       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8639       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8640           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8641       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8642       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8643           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8644     {
8645       tree const1 = TREE_OPERAND (arg0, 1);
8646       tree const2 = TREE_OPERAND (arg1, 1);
8647       tree variable1 = TREE_OPERAND (arg0, 0);
8648       tree variable2 = TREE_OPERAND (arg1, 0);
8649       tree cst;
8650       const char * const warnmsg = G_("assuming signed overflow does not "
8651                                       "occur when combining constants around "
8652                                       "a comparison");
8653
8654       /* Put the constant on the side where it doesn't overflow and is
8655          of lower absolute value than before.  */
8656       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8657                              ? MINUS_EXPR : PLUS_EXPR,
8658                              const2, const1, 0);
8659       if (!TREE_OVERFLOW (cst)
8660           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8661         {
8662           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8663           return fold_build2 (code, type,
8664                               variable1,
8665                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8666                                            variable2, cst));
8667         }
8668
8669       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8670                              ? MINUS_EXPR : PLUS_EXPR,
8671                              const1, const2, 0);
8672       if (!TREE_OVERFLOW (cst)
8673           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8674         {
8675           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8676           return fold_build2 (code, type,
8677                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8678                                            variable1, cst),
8679                               variable2);
8680         }
8681     }
8682
8683   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8684      signed arithmetic case.  That form is created by the compiler
8685      often enough for folding it to be of value.  One example is in
8686      computing loop trip counts after Operator Strength Reduction.  */
8687   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8688       && TREE_CODE (arg0) == MULT_EXPR
8689       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8690           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8691       && integer_zerop (arg1))
8692     {
8693       tree const1 = TREE_OPERAND (arg0, 1);
8694       tree const2 = arg1;                       /* zero */
8695       tree variable1 = TREE_OPERAND (arg0, 0);
8696       enum tree_code cmp_code = code;
8697
8698       gcc_assert (!integer_zerop (const1));
8699
8700       fold_overflow_warning (("assuming signed overflow does not occur when "
8701                               "eliminating multiplication in comparison "
8702                               "with zero"),
8703                              WARN_STRICT_OVERFLOW_COMPARISON);
8704
8705       /* If const1 is negative we swap the sense of the comparison.  */
8706       if (tree_int_cst_sgn (const1) < 0)
8707         cmp_code = swap_tree_comparison (cmp_code);
8708
8709       return fold_build2 (cmp_code, type, variable1, const2);
8710     }
8711
8712   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8713   if (tem)
8714     return tem;
8715
8716   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8717     {
8718       tree targ0 = strip_float_extensions (arg0);
8719       tree targ1 = strip_float_extensions (arg1);
8720       tree newtype = TREE_TYPE (targ0);
8721
8722       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8723         newtype = TREE_TYPE (targ1);
8724
8725       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8726       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8727         return fold_build2 (code, type, fold_convert (newtype, targ0),
8728                             fold_convert (newtype, targ1));
8729
8730       /* (-a) CMP (-b) -> b CMP a  */
8731       if (TREE_CODE (arg0) == NEGATE_EXPR
8732           && TREE_CODE (arg1) == NEGATE_EXPR)
8733         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8734                             TREE_OPERAND (arg0, 0));
8735
8736       if (TREE_CODE (arg1) == REAL_CST)
8737         {
8738           REAL_VALUE_TYPE cst;
8739           cst = TREE_REAL_CST (arg1);
8740
8741           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8742           if (TREE_CODE (arg0) == NEGATE_EXPR)
8743             return fold_build2 (swap_tree_comparison (code), type,
8744                                 TREE_OPERAND (arg0, 0),
8745                                 build_real (TREE_TYPE (arg1),
8746                                             REAL_VALUE_NEGATE (cst)));
8747
8748           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8749           /* a CMP (-0) -> a CMP 0  */
8750           if (REAL_VALUE_MINUS_ZERO (cst))
8751             return fold_build2 (code, type, arg0,
8752                                 build_real (TREE_TYPE (arg1), dconst0));
8753
8754           /* x != NaN is always true, other ops are always false.  */
8755           if (REAL_VALUE_ISNAN (cst)
8756               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8757             {
8758               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8759               return omit_one_operand (type, tem, arg0);
8760             }
8761
8762           /* Fold comparisons against infinity.  */
8763           if (REAL_VALUE_ISINF (cst))
8764             {
8765               tem = fold_inf_compare (code, type, arg0, arg1);
8766               if (tem != NULL_TREE)
8767                 return tem;
8768             }
8769         }
8770
8771       /* If this is a comparison of a real constant with a PLUS_EXPR
8772          or a MINUS_EXPR of a real constant, we can convert it into a
8773          comparison with a revised real constant as long as no overflow
8774          occurs when unsafe_math_optimizations are enabled.  */
8775       if (flag_unsafe_math_optimizations
8776           && TREE_CODE (arg1) == REAL_CST
8777           && (TREE_CODE (arg0) == PLUS_EXPR
8778               || TREE_CODE (arg0) == MINUS_EXPR)
8779           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8780           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8781                                       ? MINUS_EXPR : PLUS_EXPR,
8782                                       arg1, TREE_OPERAND (arg0, 1), 0))
8783           && !TREE_OVERFLOW (tem))
8784         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8785
8786       /* Likewise, we can simplify a comparison of a real constant with
8787          a MINUS_EXPR whose first operand is also a real constant, i.e.
8788          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
8789          floating-point types only if -fassociative-math is set.  */
8790       if (flag_associative_math
8791           && TREE_CODE (arg1) == REAL_CST
8792           && TREE_CODE (arg0) == MINUS_EXPR
8793           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8794           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8795                                       arg1, 0))
8796           && !TREE_OVERFLOW (tem))
8797         return fold_build2 (swap_tree_comparison (code), type,
8798                             TREE_OPERAND (arg0, 1), tem);
8799
8800       /* Fold comparisons against built-in math functions.  */
8801       if (TREE_CODE (arg1) == REAL_CST
8802           && flag_unsafe_math_optimizations
8803           && ! flag_errno_math)
8804         {
8805           enum built_in_function fcode = builtin_mathfn_code (arg0);
8806
8807           if (fcode != END_BUILTINS)
8808             {
8809               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8810               if (tem != NULL_TREE)
8811                 return tem;
8812             }
8813         }
8814     }
8815
8816   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8817       && (TREE_CODE (arg0) == NOP_EXPR
8818           || TREE_CODE (arg0) == CONVERT_EXPR))
8819     {
8820       /* If we are widening one operand of an integer comparison,
8821          see if the other operand is similarly being widened.  Perhaps we
8822          can do the comparison in the narrower type.  */
8823       tem = fold_widened_comparison (code, type, arg0, arg1);
8824       if (tem)
8825         return tem;
8826
8827       /* Or if we are changing signedness.  */
8828       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8829       if (tem)
8830         return tem;
8831     }
8832
8833   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8834      constant, we can simplify it.  */
8835   if (TREE_CODE (arg1) == INTEGER_CST
8836       && (TREE_CODE (arg0) == MIN_EXPR
8837           || TREE_CODE (arg0) == MAX_EXPR)
8838       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8839     {
8840       tem = optimize_minmax_comparison (code, type, op0, op1);
8841       if (tem)
8842         return tem;
8843     }
8844
8845   /* Simplify comparison of something with itself.  (For IEEE
8846      floating-point, we can only do some of these simplifications.)  */
8847   if (operand_equal_p (arg0, arg1, 0))
8848     {
8849       switch (code)
8850         {
8851         case EQ_EXPR:
8852           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8853               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8854             return constant_boolean_node (1, type);
8855           break;
8856
8857         case GE_EXPR:
8858         case LE_EXPR:
8859           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8860               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8861             return constant_boolean_node (1, type);
8862           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8863
8864         case NE_EXPR:
8865           /* For NE, we can only do this simplification if integer
8866              or we don't honor IEEE floating point NaNs.  */
8867           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8868               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8869             break;
8870           /* ... fall through ...  */
8871         case GT_EXPR:
8872         case LT_EXPR:
8873           return constant_boolean_node (0, type);
8874         default:
8875           gcc_unreachable ();
8876         }
8877     }
8878
8879   /* If we are comparing an expression that just has comparisons
8880      of two integer values, arithmetic expressions of those comparisons,
8881      and constants, we can simplify it.  There are only three cases
8882      to check: the two values can either be equal, the first can be
8883      greater, or the second can be greater.  Fold the expression for
8884      those three values.  Since each value must be 0 or 1, we have
8885      eight possibilities, each of which corresponds to the constant 0
8886      or 1 or one of the six possible comparisons.
8887
8888      This handles common cases like (a > b) == 0 but also handles
8889      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8890      occur in macroized code.  */
8891
8892   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8893     {
8894       tree cval1 = 0, cval2 = 0;
8895       int save_p = 0;
8896
8897       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8898           /* Don't handle degenerate cases here; they should already
8899              have been handled anyway.  */
8900           && cval1 != 0 && cval2 != 0
8901           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8902           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8903           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8904           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8905           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8906           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8907                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8908         {
8909           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8910           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8911
8912           /* We can't just pass T to eval_subst in case cval1 or cval2
8913              was the same as ARG1.  */
8914
8915           tree high_result
8916                 = fold_build2 (code, type,
8917                                eval_subst (arg0, cval1, maxval,
8918                                            cval2, minval),
8919                                arg1);
8920           tree equal_result
8921                 = fold_build2 (code, type,
8922                                eval_subst (arg0, cval1, maxval,
8923                                            cval2, maxval),
8924                                arg1);
8925           tree low_result
8926                 = fold_build2 (code, type,
8927                                eval_subst (arg0, cval1, minval,
8928                                            cval2, maxval),
8929                                arg1);
8930
8931           /* All three of these results should be 0 or 1.  Confirm they are.
8932              Then use those values to select the proper code to use.  */
8933
8934           if (TREE_CODE (high_result) == INTEGER_CST
8935               && TREE_CODE (equal_result) == INTEGER_CST
8936               && TREE_CODE (low_result) == INTEGER_CST)
8937             {
8938               /* Make a 3-bit mask with the high-order bit being the
8939                  value for `>', the next for '=', and the low for '<'.  */
8940               switch ((integer_onep (high_result) * 4)
8941                       + (integer_onep (equal_result) * 2)
8942                       + integer_onep (low_result))
8943                 {
8944                 case 0:
8945                   /* Always false.  */
8946                   return omit_one_operand (type, integer_zero_node, arg0);
8947                 case 1:
8948                   code = LT_EXPR;
8949                   break;
8950                 case 2:
8951                   code = EQ_EXPR;
8952                   break;
8953                 case 3:
8954                   code = LE_EXPR;
8955                   break;
8956                 case 4:
8957                   code = GT_EXPR;
8958                   break;
8959                 case 5:
8960                   code = NE_EXPR;
8961                   break;
8962                 case 6:
8963                   code = GE_EXPR;
8964                   break;
8965                 case 7:
8966                   /* Always true.  */
8967                   return omit_one_operand (type, integer_one_node, arg0);
8968                 }
8969
8970               if (save_p)
8971                 return save_expr (build2 (code, type, cval1, cval2));
8972               return fold_build2 (code, type, cval1, cval2);
8973             }
8974         }
8975     }
8976
8977   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8978      into a single range test.  */
8979   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8980        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8981       && TREE_CODE (arg1) == INTEGER_CST
8982       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8983       && !integer_zerop (TREE_OPERAND (arg0, 1))
8984       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8985       && !TREE_OVERFLOW (arg1))
8986     {
8987       tem = fold_div_compare (code, type, arg0, arg1);
8988       if (tem != NULL_TREE)
8989         return tem;
8990     }
8991
8992   /* Fold ~X op ~Y as Y op X.  */
8993   if (TREE_CODE (arg0) == BIT_NOT_EXPR
8994       && TREE_CODE (arg1) == BIT_NOT_EXPR)
8995     {
8996       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8997       return fold_build2 (code, type,
8998                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8999                           TREE_OPERAND (arg0, 0));
9000     }
9001
9002   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9003   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9004       && TREE_CODE (arg1) == INTEGER_CST)
9005     {
9006       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9007       return fold_build2 (swap_tree_comparison (code), type,
9008                           TREE_OPERAND (arg0, 0),
9009                           fold_build1 (BIT_NOT_EXPR, cmp_type,
9010                                        fold_convert (cmp_type, arg1)));
9011     }
9012
9013   return NULL_TREE;
9014 }
9015
9016
9017 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9018    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9019    argument EXPR represents the expression "z" of type TYPE.  */
9020
9021 static tree
9022 fold_mult_zconjz (tree type, tree expr)
9023 {
9024   tree itype = TREE_TYPE (type);
9025   tree rpart, ipart, tem;
9026
9027   if (TREE_CODE (expr) == COMPLEX_EXPR)
9028     {
9029       rpart = TREE_OPERAND (expr, 0);
9030       ipart = TREE_OPERAND (expr, 1);
9031     }
9032   else if (TREE_CODE (expr) == COMPLEX_CST)
9033     {
9034       rpart = TREE_REALPART (expr);
9035       ipart = TREE_IMAGPART (expr);
9036     }
9037   else
9038     {
9039       expr = save_expr (expr);
9040       rpart = fold_build1 (REALPART_EXPR, itype, expr);
9041       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
9042     }
9043
9044   rpart = save_expr (rpart);
9045   ipart = save_expr (ipart);
9046   tem = fold_build2 (PLUS_EXPR, itype,
9047                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
9048                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
9049   return fold_build2 (COMPLEX_EXPR, type, tem,
9050                       fold_convert (itype, integer_zero_node));
9051 }
9052
9053
9054 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9055    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9056    guarantees that P and N have the same least significant log2(M) bits.
9057    N is not otherwise constrained.  In particular, N is not normalized to
9058    0 <= N < M as is common.  In general, the precise value of P is unknown.
9059    M is chosen as large as possible such that constant N can be determined.
9060
9061    Returns M and sets *RESIDUE to N.  */
9062
9063 static unsigned HOST_WIDE_INT
9064 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue)
9065 {
9066   enum tree_code code;
9067
9068   *residue = 0;
9069
9070   code = TREE_CODE (expr);
9071   if (code == ADDR_EXPR)
9072     {
9073       expr = TREE_OPERAND (expr, 0);
9074       if (handled_component_p (expr))
9075         {
9076           HOST_WIDE_INT bitsize, bitpos;
9077           tree offset;
9078           enum machine_mode mode;
9079           int unsignedp, volatilep;
9080
9081           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9082                                       &mode, &unsignedp, &volatilep, false);
9083           *residue = bitpos / BITS_PER_UNIT;
9084           if (offset)
9085             {
9086               if (TREE_CODE (offset) == INTEGER_CST)
9087                 *residue += TREE_INT_CST_LOW (offset);
9088               else
9089                 /* We don't handle more complicated offset expressions.  */
9090                 return 1;
9091             }
9092         }
9093
9094       if (DECL_P (expr) && TREE_CODE (expr) != FUNCTION_DECL)
9095         return DECL_ALIGN_UNIT (expr);
9096     }
9097   else if (code == POINTER_PLUS_EXPR)
9098     {
9099       tree op0, op1;
9100       unsigned HOST_WIDE_INT modulus;
9101       enum tree_code inner_code;
9102       
9103       op0 = TREE_OPERAND (expr, 0);
9104       STRIP_NOPS (op0);
9105       modulus = get_pointer_modulus_and_residue (op0, residue);
9106
9107       op1 = TREE_OPERAND (expr, 1);
9108       STRIP_NOPS (op1);
9109       inner_code = TREE_CODE (op1);
9110       if (inner_code == INTEGER_CST)
9111         {
9112           *residue += TREE_INT_CST_LOW (op1);
9113           return modulus;
9114         }
9115       else if (inner_code == MULT_EXPR)
9116         {
9117           op1 = TREE_OPERAND (op1, 1);
9118           if (TREE_CODE (op1) == INTEGER_CST)
9119             {
9120               unsigned HOST_WIDE_INT align;
9121               
9122               /* Compute the greatest power-of-2 divisor of op1.  */
9123               align = TREE_INT_CST_LOW (op1);
9124               align &= -align;
9125
9126               /* If align is non-zero and less than *modulus, replace
9127                  *modulus with align., If align is 0, then either op1 is 0
9128                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9129                  unsigned HOST_WIDE_INT.  In either case, no additional
9130                  constraint is imposed.  */
9131               if (align)
9132                 modulus = MIN (modulus, align);
9133
9134               return modulus;
9135             }
9136         }
9137     }
9138
9139     /* If we get here, we were unable to determine anything useful about the
9140        expression.  */
9141     return 1;
9142 }
9143
9144
9145 /* Fold a binary expression of code CODE and type TYPE with operands
9146    OP0 and OP1.  Return the folded expression if folding is
9147    successful.  Otherwise, return NULL_TREE.  */
9148
9149 tree
9150 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9151 {
9152   enum tree_code_class kind = TREE_CODE_CLASS (code);
9153   tree arg0, arg1, tem;
9154   tree t1 = NULL_TREE;
9155   bool strict_overflow_p;
9156
9157   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
9158                || IS_GIMPLE_STMT_CODE_CLASS (kind))
9159               && TREE_CODE_LENGTH (code) == 2
9160               && op0 != NULL_TREE
9161               && op1 != NULL_TREE);
9162
9163   arg0 = op0;
9164   arg1 = op1;
9165
9166   /* Strip any conversions that don't change the mode.  This is
9167      safe for every expression, except for a comparison expression
9168      because its signedness is derived from its operands.  So, in
9169      the latter case, only strip conversions that don't change the
9170      signedness.
9171
9172      Note that this is done as an internal manipulation within the
9173      constant folder, in order to find the simplest representation
9174      of the arguments so that their form can be studied.  In any
9175      cases, the appropriate type conversions should be put back in
9176      the tree that will get out of the constant folder.  */
9177
9178   if (kind == tcc_comparison)
9179     {
9180       STRIP_SIGN_NOPS (arg0);
9181       STRIP_SIGN_NOPS (arg1);
9182     }
9183   else
9184     {
9185       STRIP_NOPS (arg0);
9186       STRIP_NOPS (arg1);
9187     }
9188
9189   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9190      constant but we can't do arithmetic on them.  */
9191   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9192       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9193       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9194       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9195       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9196       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9197     {
9198       if (kind == tcc_binary)
9199         {
9200           /* Make sure type and arg0 have the same saturating flag.  */
9201           gcc_assert (TYPE_SATURATING (type)
9202                       == TYPE_SATURATING (TREE_TYPE (arg0)));
9203           tem = const_binop (code, arg0, arg1, 0);
9204         }
9205       else if (kind == tcc_comparison)
9206         tem = fold_relational_const (code, type, arg0, arg1);
9207       else
9208         tem = NULL_TREE;
9209
9210       if (tem != NULL_TREE)
9211         {
9212           if (TREE_TYPE (tem) != type)
9213             tem = fold_convert (type, tem);
9214           return tem;
9215         }
9216     }
9217
9218   /* If this is a commutative operation, and ARG0 is a constant, move it
9219      to ARG1 to reduce the number of tests below.  */
9220   if (commutative_tree_code (code)
9221       && tree_swap_operands_p (arg0, arg1, true))
9222     return fold_build2 (code, type, op1, op0);
9223
9224   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9225
9226      First check for cases where an arithmetic operation is applied to a
9227      compound, conditional, or comparison operation.  Push the arithmetic
9228      operation inside the compound or conditional to see if any folding
9229      can then be done.  Convert comparison to conditional for this purpose.
9230      The also optimizes non-constant cases that used to be done in
9231      expand_expr.
9232
9233      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9234      one of the operands is a comparison and the other is a comparison, a
9235      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9236      code below would make the expression more complex.  Change it to a
9237      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9238      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9239
9240   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9241        || code == EQ_EXPR || code == NE_EXPR)
9242       && ((truth_value_p (TREE_CODE (arg0))
9243            && (truth_value_p (TREE_CODE (arg1))
9244                || (TREE_CODE (arg1) == BIT_AND_EXPR
9245                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9246           || (truth_value_p (TREE_CODE (arg1))
9247               && (truth_value_p (TREE_CODE (arg0))
9248                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9249                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9250     {
9251       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9252                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9253                          : TRUTH_XOR_EXPR,
9254                          boolean_type_node,
9255                          fold_convert (boolean_type_node, arg0),
9256                          fold_convert (boolean_type_node, arg1));
9257
9258       if (code == EQ_EXPR)
9259         tem = invert_truthvalue (tem);
9260
9261       return fold_convert (type, tem);
9262     }
9263
9264   if (TREE_CODE_CLASS (code) == tcc_binary
9265       || TREE_CODE_CLASS (code) == tcc_comparison)
9266     {
9267       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9268         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9269                        fold_build2 (code, type,
9270                                     fold_convert (TREE_TYPE (op0),
9271                                                   TREE_OPERAND (arg0, 1)),
9272                                     op1));
9273       if (TREE_CODE (arg1) == COMPOUND_EXPR
9274           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9275         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9276                        fold_build2 (code, type, op0,
9277                                     fold_convert (TREE_TYPE (op1),
9278                                                   TREE_OPERAND (arg1, 1))));
9279
9280       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9281         {
9282           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9283                                                      arg0, arg1, 
9284                                                      /*cond_first_p=*/1);
9285           if (tem != NULL_TREE)
9286             return tem;
9287         }
9288
9289       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9290         {
9291           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9292                                                      arg1, arg0, 
9293                                                      /*cond_first_p=*/0);
9294           if (tem != NULL_TREE)
9295             return tem;
9296         }
9297     }
9298
9299   switch (code)
9300     {
9301     case POINTER_PLUS_EXPR:
9302       /* 0 +p index -> (type)index */
9303       if (integer_zerop (arg0))
9304         return non_lvalue (fold_convert (type, arg1));
9305
9306       /* PTR +p 0 -> PTR */
9307       if (integer_zerop (arg1))
9308         return non_lvalue (fold_convert (type, arg0));
9309
9310       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
9311       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9312            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9313         return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9314                                                 fold_convert (sizetype, arg1),
9315                                                 fold_convert (sizetype, arg0)));
9316
9317       /* index +p PTR -> PTR +p index */
9318       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9319           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9320         return fold_build2 (POINTER_PLUS_EXPR, type,
9321                             fold_convert (type, arg1),
9322                             fold_convert (sizetype, arg0));
9323
9324       /* (PTR +p B) +p A -> PTR +p (B + A) */
9325       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9326         {
9327           tree inner;
9328           tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9329           tree arg00 = TREE_OPERAND (arg0, 0);
9330           inner = fold_build2 (PLUS_EXPR, sizetype,
9331                                arg01, fold_convert (sizetype, arg1));
9332           return fold_convert (type,
9333                                fold_build2 (POINTER_PLUS_EXPR,
9334                                             TREE_TYPE (arg00), arg00, inner));
9335         }
9336
9337       /* PTR_CST +p CST -> CST1 */
9338       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9339         return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9340
9341      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9342         of the array.  Loop optimizer sometimes produce this type of
9343         expressions.  */
9344       if (TREE_CODE (arg0) == ADDR_EXPR)
9345         {
9346           tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9347           if (tem)
9348             return fold_convert (type, tem);
9349         }
9350
9351       return NULL_TREE;
9352
9353     case PLUS_EXPR:
9354       /* PTR + INT -> (INT)(PTR p+ INT) */
9355       if (POINTER_TYPE_P (TREE_TYPE (arg0))
9356           && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9357         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9358                                                 TREE_TYPE (arg0),
9359                                                 arg0,
9360                                                 fold_convert (sizetype, arg1)));
9361       /* INT + PTR -> (INT)(PTR p+ INT) */
9362       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9363           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9364         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9365                                                 TREE_TYPE (arg1),
9366                                                 arg1,
9367                                                 fold_convert (sizetype, arg0)));
9368       /* A + (-B) -> A - B */
9369       if (TREE_CODE (arg1) == NEGATE_EXPR)
9370         return fold_build2 (MINUS_EXPR, type,
9371                             fold_convert (type, arg0),
9372                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9373       /* (-A) + B -> B - A */
9374       if (TREE_CODE (arg0) == NEGATE_EXPR
9375           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9376         return fold_build2 (MINUS_EXPR, type,
9377                             fold_convert (type, arg1),
9378                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9379
9380       if (INTEGRAL_TYPE_P (type))
9381         {
9382           /* Convert ~A + 1 to -A.  */
9383           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9384               && integer_onep (arg1))
9385             return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9386
9387           /* ~X + X is -1.  */
9388           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9389               && !TYPE_OVERFLOW_TRAPS (type))
9390             {
9391               tree tem = TREE_OPERAND (arg0, 0);
9392
9393               STRIP_NOPS (tem);
9394               if (operand_equal_p (tem, arg1, 0))
9395                 {
9396                   t1 = build_int_cst_type (type, -1);
9397                   return omit_one_operand (type, t1, arg1);
9398                 }
9399             }
9400
9401           /* X + ~X is -1.  */
9402           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9403               && !TYPE_OVERFLOW_TRAPS (type))
9404             {
9405               tree tem = TREE_OPERAND (arg1, 0);
9406
9407               STRIP_NOPS (tem);
9408               if (operand_equal_p (arg0, tem, 0))
9409                 {
9410                   t1 = build_int_cst_type (type, -1);
9411                   return omit_one_operand (type, t1, arg0);
9412                 }
9413             }
9414
9415           /* X + (X / CST) * -CST is X % CST.  */
9416           if (TREE_CODE (arg1) == MULT_EXPR
9417               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9418               && operand_equal_p (arg0,
9419                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9420             {
9421               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9422               tree cst1 = TREE_OPERAND (arg1, 1);
9423               tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9424               if (sum && integer_zerop (sum))
9425                 return fold_convert (type,
9426                                      fold_build2 (TRUNC_MOD_EXPR,
9427                                                   TREE_TYPE (arg0), arg0, cst0));
9428             }
9429         }
9430
9431       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9432          same or one.  Make sure type is not saturating.
9433          fold_plusminus_mult_expr will re-associate.  */
9434       if ((TREE_CODE (arg0) == MULT_EXPR
9435            || TREE_CODE (arg1) == MULT_EXPR)
9436           && !TYPE_SATURATING (type)
9437           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9438         {
9439           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9440           if (tem)
9441             return tem;
9442         }
9443
9444       if (! FLOAT_TYPE_P (type))
9445         {
9446           if (integer_zerop (arg1))
9447             return non_lvalue (fold_convert (type, arg0));
9448
9449           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9450              with a constant, and the two constants have no bits in common,
9451              we should treat this as a BIT_IOR_EXPR since this may produce more
9452              simplifications.  */
9453           if (TREE_CODE (arg0) == BIT_AND_EXPR
9454               && TREE_CODE (arg1) == BIT_AND_EXPR
9455               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9456               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9457               && integer_zerop (const_binop (BIT_AND_EXPR,
9458                                              TREE_OPERAND (arg0, 1),
9459                                              TREE_OPERAND (arg1, 1), 0)))
9460             {
9461               code = BIT_IOR_EXPR;
9462               goto bit_ior;
9463             }
9464
9465           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9466              (plus (plus (mult) (mult)) (foo)) so that we can
9467              take advantage of the factoring cases below.  */
9468           if (((TREE_CODE (arg0) == PLUS_EXPR
9469                 || TREE_CODE (arg0) == MINUS_EXPR)
9470                && TREE_CODE (arg1) == MULT_EXPR)
9471               || ((TREE_CODE (arg1) == PLUS_EXPR
9472                    || TREE_CODE (arg1) == MINUS_EXPR)
9473                   && TREE_CODE (arg0) == MULT_EXPR))
9474             {
9475               tree parg0, parg1, parg, marg;
9476               enum tree_code pcode;
9477
9478               if (TREE_CODE (arg1) == MULT_EXPR)
9479                 parg = arg0, marg = arg1;
9480               else
9481                 parg = arg1, marg = arg0;
9482               pcode = TREE_CODE (parg);
9483               parg0 = TREE_OPERAND (parg, 0);
9484               parg1 = TREE_OPERAND (parg, 1);
9485               STRIP_NOPS (parg0);
9486               STRIP_NOPS (parg1);
9487
9488               if (TREE_CODE (parg0) == MULT_EXPR
9489                   && TREE_CODE (parg1) != MULT_EXPR)
9490                 return fold_build2 (pcode, type,
9491                                     fold_build2 (PLUS_EXPR, type,
9492                                                  fold_convert (type, parg0),
9493                                                  fold_convert (type, marg)),
9494                                     fold_convert (type, parg1));
9495               if (TREE_CODE (parg0) != MULT_EXPR
9496                   && TREE_CODE (parg1) == MULT_EXPR)
9497                 return fold_build2 (PLUS_EXPR, type,
9498                                     fold_convert (type, parg0),
9499                                     fold_build2 (pcode, type,
9500                                                  fold_convert (type, marg),
9501                                                  fold_convert (type,
9502                                                                parg1)));
9503             }
9504         }
9505       else
9506         {
9507           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9508           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9509             return non_lvalue (fold_convert (type, arg0));
9510
9511           /* Likewise if the operands are reversed.  */
9512           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9513             return non_lvalue (fold_convert (type, arg1));
9514
9515           /* Convert X + -C into X - C.  */
9516           if (TREE_CODE (arg1) == REAL_CST
9517               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9518             {
9519               tem = fold_negate_const (arg1, type);
9520               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9521                 return fold_build2 (MINUS_EXPR, type,
9522                                     fold_convert (type, arg0),
9523                                     fold_convert (type, tem));
9524             }
9525
9526           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9527              to __complex__ ( x, y ).  This is not the same for SNaNs or
9528              if signed zeros are involved.  */
9529           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9530               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9531               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9532             {
9533               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9534               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9535               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9536               bool arg0rz = false, arg0iz = false;
9537               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9538                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9539                 {
9540                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9541                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9542                   if (arg0rz && arg1i && real_zerop (arg1i))
9543                     {
9544                       tree rp = arg1r ? arg1r
9545                                   : build1 (REALPART_EXPR, rtype, arg1);
9546                       tree ip = arg0i ? arg0i
9547                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9548                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9549                     }
9550                   else if (arg0iz && arg1r && real_zerop (arg1r))
9551                     {
9552                       tree rp = arg0r ? arg0r
9553                                   : build1 (REALPART_EXPR, rtype, arg0);
9554                       tree ip = arg1i ? arg1i
9555                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9556                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9557                     }
9558                 }
9559             }
9560
9561           if (flag_unsafe_math_optimizations
9562               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9563               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9564               && (tem = distribute_real_division (code, type, arg0, arg1)))
9565             return tem;
9566
9567           /* Convert x+x into x*2.0.  */
9568           if (operand_equal_p (arg0, arg1, 0)
9569               && SCALAR_FLOAT_TYPE_P (type))
9570             return fold_build2 (MULT_EXPR, type, arg0,
9571                                 build_real (type, dconst2));
9572
9573           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
9574              We associate floats only if the user has specified
9575              -fassociative-math.  */
9576           if (flag_associative_math
9577               && TREE_CODE (arg1) == PLUS_EXPR
9578               && TREE_CODE (arg0) != MULT_EXPR)
9579             {
9580               tree tree10 = TREE_OPERAND (arg1, 0);
9581               tree tree11 = TREE_OPERAND (arg1, 1);
9582               if (TREE_CODE (tree11) == MULT_EXPR
9583                   && TREE_CODE (tree10) == MULT_EXPR)
9584                 {
9585                   tree tree0;
9586                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9587                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9588                 }
9589             }
9590           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
9591              We associate floats only if the user has specified
9592              -fassociative-math.  */
9593           if (flag_associative_math
9594               && TREE_CODE (arg0) == PLUS_EXPR
9595               && TREE_CODE (arg1) != MULT_EXPR)
9596             {
9597               tree tree00 = TREE_OPERAND (arg0, 0);
9598               tree tree01 = TREE_OPERAND (arg0, 1);
9599               if (TREE_CODE (tree01) == MULT_EXPR
9600                   && TREE_CODE (tree00) == MULT_EXPR)
9601                 {
9602                   tree tree0;
9603                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9604                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9605                 }
9606             }
9607         }
9608
9609      bit_rotate:
9610       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9611          is a rotate of A by C1 bits.  */
9612       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9613          is a rotate of A by B bits.  */
9614       {
9615         enum tree_code code0, code1;
9616         tree rtype;
9617         code0 = TREE_CODE (arg0);
9618         code1 = TREE_CODE (arg1);
9619         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9620              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9621             && operand_equal_p (TREE_OPERAND (arg0, 0),
9622                                 TREE_OPERAND (arg1, 0), 0)
9623             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
9624                 TYPE_UNSIGNED (rtype))
9625             /* Only create rotates in complete modes.  Other cases are not
9626                expanded properly.  */
9627             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
9628           {
9629             tree tree01, tree11;
9630             enum tree_code code01, code11;
9631
9632             tree01 = TREE_OPERAND (arg0, 1);
9633             tree11 = TREE_OPERAND (arg1, 1);
9634             STRIP_NOPS (tree01);
9635             STRIP_NOPS (tree11);
9636             code01 = TREE_CODE (tree01);
9637             code11 = TREE_CODE (tree11);
9638             if (code01 == INTEGER_CST
9639                 && code11 == INTEGER_CST
9640                 && TREE_INT_CST_HIGH (tree01) == 0
9641                 && TREE_INT_CST_HIGH (tree11) == 0
9642                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9643                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9644               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9645                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9646             else if (code11 == MINUS_EXPR)
9647               {
9648                 tree tree110, tree111;
9649                 tree110 = TREE_OPERAND (tree11, 0);
9650                 tree111 = TREE_OPERAND (tree11, 1);
9651                 STRIP_NOPS (tree110);
9652                 STRIP_NOPS (tree111);
9653                 if (TREE_CODE (tree110) == INTEGER_CST
9654                     && 0 == compare_tree_int (tree110,
9655                                               TYPE_PRECISION
9656                                               (TREE_TYPE (TREE_OPERAND
9657                                                           (arg0, 0))))
9658                     && operand_equal_p (tree01, tree111, 0))
9659                   return build2 ((code0 == LSHIFT_EXPR
9660                                   ? LROTATE_EXPR
9661                                   : RROTATE_EXPR),
9662                                  type, TREE_OPERAND (arg0, 0), tree01);
9663               }
9664             else if (code01 == MINUS_EXPR)
9665               {
9666                 tree tree010, tree011;
9667                 tree010 = TREE_OPERAND (tree01, 0);
9668                 tree011 = TREE_OPERAND (tree01, 1);
9669                 STRIP_NOPS (tree010);
9670                 STRIP_NOPS (tree011);
9671                 if (TREE_CODE (tree010) == INTEGER_CST
9672                     && 0 == compare_tree_int (tree010,
9673                                               TYPE_PRECISION
9674                                               (TREE_TYPE (TREE_OPERAND
9675                                                           (arg0, 0))))
9676                     && operand_equal_p (tree11, tree011, 0))
9677                   return build2 ((code0 != LSHIFT_EXPR
9678                                   ? LROTATE_EXPR
9679                                   : RROTATE_EXPR),
9680                                  type, TREE_OPERAND (arg0, 0), tree11);
9681               }
9682           }
9683       }
9684
9685     associate:
9686       /* In most languages, can't associate operations on floats through
9687          parentheses.  Rather than remember where the parentheses were, we
9688          don't associate floats at all, unless the user has specified
9689          -fassociative-math.
9690          And, we need to make sure type is not saturating.  */
9691
9692       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
9693           && !TYPE_SATURATING (type))
9694         {
9695           tree var0, con0, lit0, minus_lit0;
9696           tree var1, con1, lit1, minus_lit1;
9697           bool ok = true;
9698
9699           /* Split both trees into variables, constants, and literals.  Then
9700              associate each group together, the constants with literals,
9701              then the result with variables.  This increases the chances of
9702              literals being recombined later and of generating relocatable
9703              expressions for the sum of a constant and literal.  */
9704           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9705           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9706                              code == MINUS_EXPR);
9707
9708           /* With undefined overflow we can only associate constants
9709              with one variable.  */
9710           if ((POINTER_TYPE_P (type)
9711                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9712               && var0 && var1)
9713             {
9714               tree tmp0 = var0;
9715               tree tmp1 = var1;
9716
9717               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9718                 tmp0 = TREE_OPERAND (tmp0, 0);
9719               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9720                 tmp1 = TREE_OPERAND (tmp1, 0);
9721               /* The only case we can still associate with two variables
9722                  is if they are the same, modulo negation.  */
9723               if (!operand_equal_p (tmp0, tmp1, 0))
9724                 ok = false;
9725             }
9726
9727           /* Only do something if we found more than two objects.  Otherwise,
9728              nothing has changed and we risk infinite recursion.  */
9729           if (ok
9730               && (2 < ((var0 != 0) + (var1 != 0)
9731                        + (con0 != 0) + (con1 != 0)
9732                        + (lit0 != 0) + (lit1 != 0)
9733                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9734             {
9735               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9736               if (code == MINUS_EXPR)
9737                 code = PLUS_EXPR;
9738
9739               var0 = associate_trees (var0, var1, code, type);
9740               con0 = associate_trees (con0, con1, code, type);
9741               lit0 = associate_trees (lit0, lit1, code, type);
9742               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9743
9744               /* Preserve the MINUS_EXPR if the negative part of the literal is
9745                  greater than the positive part.  Otherwise, the multiplicative
9746                  folding code (i.e extract_muldiv) may be fooled in case
9747                  unsigned constants are subtracted, like in the following
9748                  example: ((X*2 + 4) - 8U)/2.  */
9749               if (minus_lit0 && lit0)
9750                 {
9751                   if (TREE_CODE (lit0) == INTEGER_CST
9752                       && TREE_CODE (minus_lit0) == INTEGER_CST
9753                       && tree_int_cst_lt (lit0, minus_lit0))
9754                     {
9755                       minus_lit0 = associate_trees (minus_lit0, lit0,
9756                                                     MINUS_EXPR, type);
9757                       lit0 = 0;
9758                     }
9759                   else
9760                     {
9761                       lit0 = associate_trees (lit0, minus_lit0,
9762                                               MINUS_EXPR, type);
9763                       minus_lit0 = 0;
9764                     }
9765                 }
9766               if (minus_lit0)
9767                 {
9768                   if (con0 == 0)
9769                     return fold_convert (type,
9770                                          associate_trees (var0, minus_lit0,
9771                                                           MINUS_EXPR, type));
9772                   else
9773                     {
9774                       con0 = associate_trees (con0, minus_lit0,
9775                                               MINUS_EXPR, type);
9776                       return fold_convert (type,
9777                                            associate_trees (var0, con0,
9778                                                             PLUS_EXPR, type));
9779                     }
9780                 }
9781
9782               con0 = associate_trees (con0, lit0, code, type);
9783               return fold_convert (type, associate_trees (var0, con0,
9784                                                           code, type));
9785             }
9786         }
9787
9788       return NULL_TREE;
9789
9790     case MINUS_EXPR:
9791       /* Pointer simplifications for subtraction, simple reassociations. */
9792       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
9793         {
9794           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
9795           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
9796               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9797             {
9798               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9799               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9800               tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9801               tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9802               return fold_build2 (PLUS_EXPR, type,
9803                                   fold_build2 (MINUS_EXPR, type, arg00, arg10),
9804                                   fold_build2 (MINUS_EXPR, type, arg01, arg11));
9805             }
9806           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
9807           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9808             {
9809               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9810               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9811               tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
9812               if (tmp)
9813                 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
9814             }
9815         }
9816       /* A - (-B) -> A + B */
9817       if (TREE_CODE (arg1) == NEGATE_EXPR)
9818         return fold_build2 (PLUS_EXPR, type, op0,
9819                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9820       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9821       if (TREE_CODE (arg0) == NEGATE_EXPR
9822           && (FLOAT_TYPE_P (type)
9823               || INTEGRAL_TYPE_P (type))
9824           && negate_expr_p (arg1)
9825           && reorder_operands_p (arg0, arg1))
9826         return fold_build2 (MINUS_EXPR, type,
9827                             fold_convert (type, negate_expr (arg1)),
9828                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9829       /* Convert -A - 1 to ~A.  */
9830       if (INTEGRAL_TYPE_P (type)
9831           && TREE_CODE (arg0) == NEGATE_EXPR
9832           && integer_onep (arg1)
9833           && !TYPE_OVERFLOW_TRAPS (type))
9834         return fold_build1 (BIT_NOT_EXPR, type,
9835                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9836
9837       /* Convert -1 - A to ~A.  */
9838       if (INTEGRAL_TYPE_P (type)
9839           && integer_all_onesp (arg0))
9840         return fold_build1 (BIT_NOT_EXPR, type, op1);
9841
9842
9843       /* X - (X / CST) * CST is X % CST.  */
9844       if (INTEGRAL_TYPE_P (type)
9845           && TREE_CODE (arg1) == MULT_EXPR
9846           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9847           && operand_equal_p (arg0,
9848                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
9849           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
9850                               TREE_OPERAND (arg1, 1), 0))
9851         return fold_convert (type,
9852                              fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
9853                                           arg0, TREE_OPERAND (arg1, 1)));
9854
9855       if (! FLOAT_TYPE_P (type))
9856         {
9857           if (integer_zerop (arg0))
9858             return negate_expr (fold_convert (type, arg1));
9859           if (integer_zerop (arg1))
9860             return non_lvalue (fold_convert (type, arg0));
9861
9862           /* Fold A - (A & B) into ~B & A.  */
9863           if (!TREE_SIDE_EFFECTS (arg0)
9864               && TREE_CODE (arg1) == BIT_AND_EXPR)
9865             {
9866               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9867                 {
9868                   tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9869                   return fold_build2 (BIT_AND_EXPR, type,
9870                                       fold_build1 (BIT_NOT_EXPR, type, arg10),
9871                                       fold_convert (type, arg0));
9872                 }
9873               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9874                 {
9875                   tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9876                   return fold_build2 (BIT_AND_EXPR, type,
9877                                       fold_build1 (BIT_NOT_EXPR, type, arg11),
9878                                       fold_convert (type, arg0));
9879                 }
9880             }
9881
9882           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9883              any power of 2 minus 1.  */
9884           if (TREE_CODE (arg0) == BIT_AND_EXPR
9885               && TREE_CODE (arg1) == BIT_AND_EXPR
9886               && operand_equal_p (TREE_OPERAND (arg0, 0),
9887                                   TREE_OPERAND (arg1, 0), 0))
9888             {
9889               tree mask0 = TREE_OPERAND (arg0, 1);
9890               tree mask1 = TREE_OPERAND (arg1, 1);
9891               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9892
9893               if (operand_equal_p (tem, mask1, 0))
9894                 {
9895                   tem = fold_build2 (BIT_XOR_EXPR, type,
9896                                      TREE_OPERAND (arg0, 0), mask1);
9897                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9898                 }
9899             }
9900         }
9901
9902       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9903       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9904         return non_lvalue (fold_convert (type, arg0));
9905
9906       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9907          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9908          (-ARG1 + ARG0) reduces to -ARG1.  */
9909       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9910         return negate_expr (fold_convert (type, arg1));
9911
9912       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9913          __complex__ ( x, -y ).  This is not the same for SNaNs or if
9914          signed zeros are involved.  */
9915       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9916           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9917           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9918         {
9919           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9920           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9921           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9922           bool arg0rz = false, arg0iz = false;
9923           if ((arg0r && (arg0rz = real_zerop (arg0r)))
9924               || (arg0i && (arg0iz = real_zerop (arg0i))))
9925             {
9926               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9927               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9928               if (arg0rz && arg1i && real_zerop (arg1i))
9929                 {
9930                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
9931                                          arg1r ? arg1r
9932                                          : build1 (REALPART_EXPR, rtype, arg1));
9933                   tree ip = arg0i ? arg0i
9934                     : build1 (IMAGPART_EXPR, rtype, arg0);
9935                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9936                 }
9937               else if (arg0iz && arg1r && real_zerop (arg1r))
9938                 {
9939                   tree rp = arg0r ? arg0r
9940                     : build1 (REALPART_EXPR, rtype, arg0);
9941                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
9942                                          arg1i ? arg1i
9943                                          : build1 (IMAGPART_EXPR, rtype, arg1));
9944                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9945                 }
9946             }
9947         }
9948
9949       /* Fold &x - &x.  This can happen from &x.foo - &x.
9950          This is unsafe for certain floats even in non-IEEE formats.
9951          In IEEE, it is unsafe because it does wrong for NaNs.
9952          Also note that operand_equal_p is always false if an operand
9953          is volatile.  */
9954
9955       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
9956           && operand_equal_p (arg0, arg1, 0))
9957         return fold_convert (type, integer_zero_node);
9958
9959       /* A - B -> A + (-B) if B is easily negatable.  */
9960       if (negate_expr_p (arg1)
9961           && ((FLOAT_TYPE_P (type)
9962                /* Avoid this transformation if B is a positive REAL_CST.  */
9963                && (TREE_CODE (arg1) != REAL_CST
9964                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9965               || INTEGRAL_TYPE_P (type)))
9966         return fold_build2 (PLUS_EXPR, type,
9967                             fold_convert (type, arg0),
9968                             fold_convert (type, negate_expr (arg1)));
9969
9970       /* Try folding difference of addresses.  */
9971       {
9972         HOST_WIDE_INT diff;
9973
9974         if ((TREE_CODE (arg0) == ADDR_EXPR
9975              || TREE_CODE (arg1) == ADDR_EXPR)
9976             && ptr_difference_const (arg0, arg1, &diff))
9977           return build_int_cst_type (type, diff);
9978       }
9979
9980       /* Fold &a[i] - &a[j] to i-j.  */
9981       if (TREE_CODE (arg0) == ADDR_EXPR
9982           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9983           && TREE_CODE (arg1) == ADDR_EXPR
9984           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9985         {
9986           tree aref0 = TREE_OPERAND (arg0, 0);
9987           tree aref1 = TREE_OPERAND (arg1, 0);
9988           if (operand_equal_p (TREE_OPERAND (aref0, 0),
9989                                TREE_OPERAND (aref1, 0), 0))
9990             {
9991               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9992               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9993               tree esz = array_ref_element_size (aref0);
9994               tree diff = build2 (MINUS_EXPR, type, op0, op1);
9995               return fold_build2 (MULT_EXPR, type, diff,
9996                                   fold_convert (type, esz));
9997                                   
9998             }
9999         }
10000
10001       if (flag_unsafe_math_optimizations
10002           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10003           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10004           && (tem = distribute_real_division (code, type, arg0, arg1)))
10005         return tem;
10006
10007       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10008          same or one.  Make sure type is not saturating.
10009          fold_plusminus_mult_expr will re-associate.  */
10010       if ((TREE_CODE (arg0) == MULT_EXPR
10011            || TREE_CODE (arg1) == MULT_EXPR)
10012           && !TYPE_SATURATING (type)
10013           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10014         {
10015           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
10016           if (tem)
10017             return tem;
10018         }
10019
10020       goto associate;
10021
10022     case MULT_EXPR:
10023       /* (-A) * (-B) -> A * B  */
10024       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10025         return fold_build2 (MULT_EXPR, type,
10026                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10027                             fold_convert (type, negate_expr (arg1)));
10028       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10029         return fold_build2 (MULT_EXPR, type,
10030                             fold_convert (type, negate_expr (arg0)),
10031                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10032
10033       if (! FLOAT_TYPE_P (type))
10034         {
10035           if (integer_zerop (arg1))
10036             return omit_one_operand (type, arg1, arg0);
10037           if (integer_onep (arg1))
10038             return non_lvalue (fold_convert (type, arg0));
10039           /* Transform x * -1 into -x.  Make sure to do the negation
10040              on the original operand with conversions not stripped
10041              because we can only strip non-sign-changing conversions.  */
10042           if (integer_all_onesp (arg1))
10043             return fold_convert (type, negate_expr (op0));
10044           /* Transform x * -C into -x * C if x is easily negatable.  */
10045           if (TREE_CODE (arg1) == INTEGER_CST
10046               && tree_int_cst_sgn (arg1) == -1
10047               && negate_expr_p (arg0)
10048               && (tem = negate_expr (arg1)) != arg1
10049               && !TREE_OVERFLOW (tem))
10050             return fold_build2 (MULT_EXPR, type,
10051                                 fold_convert (type, negate_expr (arg0)), tem);
10052
10053           /* (a * (1 << b)) is (a << b)  */
10054           if (TREE_CODE (arg1) == LSHIFT_EXPR
10055               && integer_onep (TREE_OPERAND (arg1, 0)))
10056             return fold_build2 (LSHIFT_EXPR, type, op0,
10057                                 TREE_OPERAND (arg1, 1));
10058           if (TREE_CODE (arg0) == LSHIFT_EXPR
10059               && integer_onep (TREE_OPERAND (arg0, 0)))
10060             return fold_build2 (LSHIFT_EXPR, type, op1,
10061                                 TREE_OPERAND (arg0, 1));
10062
10063           strict_overflow_p = false;
10064           if (TREE_CODE (arg1) == INTEGER_CST
10065               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10066                                              &strict_overflow_p)))
10067             {
10068               if (strict_overflow_p)
10069                 fold_overflow_warning (("assuming signed overflow does not "
10070                                         "occur when simplifying "
10071                                         "multiplication"),
10072                                        WARN_STRICT_OVERFLOW_MISC);
10073               return fold_convert (type, tem);
10074             }
10075
10076           /* Optimize z * conj(z) for integer complex numbers.  */
10077           if (TREE_CODE (arg0) == CONJ_EXPR
10078               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10079             return fold_mult_zconjz (type, arg1);
10080           if (TREE_CODE (arg1) == CONJ_EXPR
10081               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10082             return fold_mult_zconjz (type, arg0);
10083         }
10084       else
10085         {
10086           /* Maybe fold x * 0 to 0.  The expressions aren't the same
10087              when x is NaN, since x * 0 is also NaN.  Nor are they the
10088              same in modes with signed zeros, since multiplying a
10089              negative value by 0 gives -0, not +0.  */
10090           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10091               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10092               && real_zerop (arg1))
10093             return omit_one_operand (type, arg1, arg0);
10094           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
10095           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10096               && real_onep (arg1))
10097             return non_lvalue (fold_convert (type, arg0));
10098
10099           /* Transform x * -1.0 into -x.  */
10100           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10101               && real_minus_onep (arg1))
10102             return fold_convert (type, negate_expr (arg0));
10103
10104           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10105              the result for floating point types due to rounding so it is applied
10106              only if -fassociative-math was specify.  */
10107           if (flag_associative_math
10108               && TREE_CODE (arg0) == RDIV_EXPR
10109               && TREE_CODE (arg1) == REAL_CST
10110               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10111             {
10112               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10113                                       arg1, 0);
10114               if (tem)
10115                 return fold_build2 (RDIV_EXPR, type, tem,
10116                                     TREE_OPERAND (arg0, 1));
10117             }
10118
10119           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10120           if (operand_equal_p (arg0, arg1, 0))
10121             {
10122               tree tem = fold_strip_sign_ops (arg0);
10123               if (tem != NULL_TREE)
10124                 {
10125                   tem = fold_convert (type, tem);
10126                   return fold_build2 (MULT_EXPR, type, tem, tem);
10127                 }
10128             }
10129
10130           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10131              This is not the same for NaNs or if signed zeros are
10132              involved.  */
10133           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10134               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10135               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10136               && TREE_CODE (arg1) == COMPLEX_CST
10137               && real_zerop (TREE_REALPART (arg1)))
10138             {
10139               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10140               if (real_onep (TREE_IMAGPART (arg1)))
10141                 return fold_build2 (COMPLEX_EXPR, type,
10142                                     negate_expr (fold_build1 (IMAGPART_EXPR,
10143                                                               rtype, arg0)),
10144                                     fold_build1 (REALPART_EXPR, rtype, arg0));
10145               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10146                 return fold_build2 (COMPLEX_EXPR, type,
10147                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
10148                                     negate_expr (fold_build1 (REALPART_EXPR,
10149                                                               rtype, arg0)));
10150             }
10151
10152           /* Optimize z * conj(z) for floating point complex numbers.
10153              Guarded by flag_unsafe_math_optimizations as non-finite
10154              imaginary components don't produce scalar results.  */
10155           if (flag_unsafe_math_optimizations
10156               && TREE_CODE (arg0) == CONJ_EXPR
10157               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10158             return fold_mult_zconjz (type, arg1);
10159           if (flag_unsafe_math_optimizations
10160               && TREE_CODE (arg1) == CONJ_EXPR
10161               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10162             return fold_mult_zconjz (type, arg0);
10163
10164           if (flag_unsafe_math_optimizations)
10165             {
10166               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10167               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10168
10169               /* Optimizations of root(...)*root(...).  */
10170               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10171                 {
10172                   tree rootfn, arg;
10173                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10174                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10175
10176                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10177                   if (BUILTIN_SQRT_P (fcode0)
10178                       && operand_equal_p (arg00, arg10, 0)
10179                       && ! HONOR_SNANS (TYPE_MODE (type)))
10180                     return arg00;
10181
10182                   /* Optimize root(x)*root(y) as root(x*y).  */
10183                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10184                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10185                   return build_call_expr (rootfn, 1, arg);
10186                 }
10187
10188               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10189               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10190                 {
10191                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10192                   tree arg = fold_build2 (PLUS_EXPR, type,
10193                                           CALL_EXPR_ARG (arg0, 0),
10194                                           CALL_EXPR_ARG (arg1, 0));
10195                   return build_call_expr (expfn, 1, arg);
10196                 }
10197
10198               /* Optimizations of pow(...)*pow(...).  */
10199               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10200                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10201                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10202                 {
10203                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10204                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10205                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10206                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10207
10208                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10209                   if (operand_equal_p (arg01, arg11, 0))
10210                     {
10211                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10212                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10213                       return build_call_expr (powfn, 2, arg, arg01);
10214                     }
10215
10216                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10217                   if (operand_equal_p (arg00, arg10, 0))
10218                     {
10219                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10220                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10221                       return build_call_expr (powfn, 2, arg00, arg);
10222                     }
10223                 }
10224
10225               /* Optimize tan(x)*cos(x) as sin(x).  */
10226               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10227                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10228                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10229                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10230                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10231                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10232                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10233                                       CALL_EXPR_ARG (arg1, 0), 0))
10234                 {
10235                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10236
10237                   if (sinfn != NULL_TREE)
10238                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10239                 }
10240
10241               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10242               if (fcode1 == BUILT_IN_POW
10243                   || fcode1 == BUILT_IN_POWF
10244                   || fcode1 == BUILT_IN_POWL)
10245                 {
10246                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10247                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10248                   if (TREE_CODE (arg11) == REAL_CST
10249                       && !TREE_OVERFLOW (arg11)
10250                       && operand_equal_p (arg0, arg10, 0))
10251                     {
10252                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10253                       REAL_VALUE_TYPE c;
10254                       tree arg;
10255
10256                       c = TREE_REAL_CST (arg11);
10257                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10258                       arg = build_real (type, c);
10259                       return build_call_expr (powfn, 2, arg0, arg);
10260                     }
10261                 }
10262
10263               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10264               if (fcode0 == BUILT_IN_POW
10265                   || fcode0 == BUILT_IN_POWF
10266                   || fcode0 == BUILT_IN_POWL)
10267                 {
10268                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10269                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10270                   if (TREE_CODE (arg01) == REAL_CST
10271                       && !TREE_OVERFLOW (arg01)
10272                       && operand_equal_p (arg1, arg00, 0))
10273                     {
10274                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10275                       REAL_VALUE_TYPE c;
10276                       tree arg;
10277
10278                       c = TREE_REAL_CST (arg01);
10279                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10280                       arg = build_real (type, c);
10281                       return build_call_expr (powfn, 2, arg1, arg);
10282                     }
10283                 }
10284
10285               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
10286               if (! optimize_size
10287                   && operand_equal_p (arg0, arg1, 0))
10288                 {
10289                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10290
10291                   if (powfn)
10292                     {
10293                       tree arg = build_real (type, dconst2);
10294                       return build_call_expr (powfn, 2, arg0, arg);
10295                     }
10296                 }
10297             }
10298         }
10299       goto associate;
10300
10301     case BIT_IOR_EXPR:
10302     bit_ior:
10303       if (integer_all_onesp (arg1))
10304         return omit_one_operand (type, arg1, arg0);
10305       if (integer_zerop (arg1))
10306         return non_lvalue (fold_convert (type, arg0));
10307       if (operand_equal_p (arg0, arg1, 0))
10308         return non_lvalue (fold_convert (type, arg0));
10309
10310       /* ~X | X is -1.  */
10311       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10312           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10313         {
10314           t1 = fold_convert (type, integer_zero_node);
10315           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10316           return omit_one_operand (type, t1, arg1);
10317         }
10318
10319       /* X | ~X is -1.  */
10320       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10321           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10322         {
10323           t1 = fold_convert (type, integer_zero_node);
10324           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10325           return omit_one_operand (type, t1, arg0);
10326         }
10327
10328       /* Canonicalize (X & C1) | C2.  */
10329       if (TREE_CODE (arg0) == BIT_AND_EXPR
10330           && TREE_CODE (arg1) == INTEGER_CST
10331           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10332         {
10333           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10334           int width = TYPE_PRECISION (type), w;
10335           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10336           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10337           hi2 = TREE_INT_CST_HIGH (arg1);
10338           lo2 = TREE_INT_CST_LOW (arg1);
10339
10340           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10341           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10342             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10343
10344           if (width > HOST_BITS_PER_WIDE_INT)
10345             {
10346               mhi = (unsigned HOST_WIDE_INT) -1 
10347                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10348               mlo = -1;
10349             }
10350           else
10351             {
10352               mhi = 0;
10353               mlo = (unsigned HOST_WIDE_INT) -1
10354                     >> (HOST_BITS_PER_WIDE_INT - width);
10355             }
10356
10357           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10358           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10359             return fold_build2 (BIT_IOR_EXPR, type,
10360                                 TREE_OPERAND (arg0, 0), arg1);
10361
10362           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10363              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10364              mode which allows further optimizations.  */
10365           hi1 &= mhi;
10366           lo1 &= mlo;
10367           hi2 &= mhi;
10368           lo2 &= mlo;
10369           hi3 = hi1 & ~hi2;
10370           lo3 = lo1 & ~lo2;
10371           for (w = BITS_PER_UNIT;
10372                w <= width && w <= HOST_BITS_PER_WIDE_INT;
10373                w <<= 1)
10374             {
10375               unsigned HOST_WIDE_INT mask
10376                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10377               if (((lo1 | lo2) & mask) == mask
10378                   && (lo1 & ~mask) == 0 && hi1 == 0)
10379                 {
10380                   hi3 = 0;
10381                   lo3 = mask;
10382                   break;
10383                 }
10384             }
10385           if (hi3 != hi1 || lo3 != lo1)
10386             return fold_build2 (BIT_IOR_EXPR, type,
10387                                 fold_build2 (BIT_AND_EXPR, type,
10388                                              TREE_OPERAND (arg0, 0),
10389                                              build_int_cst_wide (type,
10390                                                                  lo3, hi3)),
10391                                 arg1);
10392         }
10393
10394       /* (X & Y) | Y is (X, Y).  */
10395       if (TREE_CODE (arg0) == BIT_AND_EXPR
10396           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10397         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10398       /* (X & Y) | X is (Y, X).  */
10399       if (TREE_CODE (arg0) == BIT_AND_EXPR
10400           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10401           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10402         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10403       /* X | (X & Y) is (Y, X).  */
10404       if (TREE_CODE (arg1) == BIT_AND_EXPR
10405           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10406           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10407         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10408       /* X | (Y & X) is (Y, X).  */
10409       if (TREE_CODE (arg1) == BIT_AND_EXPR
10410           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10411           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10412         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10413
10414       t1 = distribute_bit_expr (code, type, arg0, arg1);
10415       if (t1 != NULL_TREE)
10416         return t1;
10417
10418       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10419
10420          This results in more efficient code for machines without a NAND
10421          instruction.  Combine will canonicalize to the first form
10422          which will allow use of NAND instructions provided by the
10423          backend if they exist.  */
10424       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10425           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10426         {
10427           return fold_build1 (BIT_NOT_EXPR, type,
10428                               build2 (BIT_AND_EXPR, type,
10429                                       fold_convert (type,
10430                                                     TREE_OPERAND (arg0, 0)),
10431                                       fold_convert (type,
10432                                                     TREE_OPERAND (arg1, 0))));
10433         }
10434
10435       /* See if this can be simplified into a rotate first.  If that
10436          is unsuccessful continue in the association code.  */
10437       goto bit_rotate;
10438
10439     case BIT_XOR_EXPR:
10440       if (integer_zerop (arg1))
10441         return non_lvalue (fold_convert (type, arg0));
10442       if (integer_all_onesp (arg1))
10443         return fold_build1 (BIT_NOT_EXPR, type, op0);
10444       if (operand_equal_p (arg0, arg1, 0))
10445         return omit_one_operand (type, integer_zero_node, arg0);
10446
10447       /* ~X ^ X is -1.  */
10448       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10449           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10450         {
10451           t1 = fold_convert (type, integer_zero_node);
10452           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10453           return omit_one_operand (type, t1, arg1);
10454         }
10455
10456       /* X ^ ~X is -1.  */
10457       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10458           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10459         {
10460           t1 = fold_convert (type, integer_zero_node);
10461           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10462           return omit_one_operand (type, t1, arg0);
10463         }
10464
10465       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10466          with a constant, and the two constants have no bits in common,
10467          we should treat this as a BIT_IOR_EXPR since this may produce more
10468          simplifications.  */
10469       if (TREE_CODE (arg0) == BIT_AND_EXPR
10470           && TREE_CODE (arg1) == BIT_AND_EXPR
10471           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10472           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10473           && integer_zerop (const_binop (BIT_AND_EXPR,
10474                                          TREE_OPERAND (arg0, 1),
10475                                          TREE_OPERAND (arg1, 1), 0)))
10476         {
10477           code = BIT_IOR_EXPR;
10478           goto bit_ior;
10479         }
10480
10481       /* (X | Y) ^ X -> Y & ~ X*/
10482       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10483           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10484         {
10485           tree t2 = TREE_OPERAND (arg0, 1);
10486           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10487                             arg1);
10488           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10489                             fold_convert (type, t1));
10490           return t1;
10491         }
10492
10493       /* (Y | X) ^ X -> Y & ~ X*/
10494       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10495           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10496         {
10497           tree t2 = TREE_OPERAND (arg0, 0);
10498           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10499                             arg1);
10500           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10501                             fold_convert (type, t1));
10502           return t1;
10503         }
10504
10505       /* X ^ (X | Y) -> Y & ~ X*/
10506       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10507           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10508         {
10509           tree t2 = TREE_OPERAND (arg1, 1);
10510           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10511                             arg0);
10512           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10513                             fold_convert (type, t1));
10514           return t1;
10515         }
10516
10517       /* X ^ (Y | X) -> Y & ~ X*/
10518       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10519           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10520         {
10521           tree t2 = TREE_OPERAND (arg1, 0);
10522           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10523                             arg0);
10524           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10525                             fold_convert (type, t1));
10526           return t1;
10527         }
10528         
10529       /* Convert ~X ^ ~Y to X ^ Y.  */
10530       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10531           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10532         return fold_build2 (code, type,
10533                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10534                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10535
10536       /* Convert ~X ^ C to X ^ ~C.  */
10537       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10538           && TREE_CODE (arg1) == INTEGER_CST)
10539         return fold_build2 (code, type,
10540                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10541                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10542
10543       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10544       if (TREE_CODE (arg0) == BIT_AND_EXPR
10545           && integer_onep (TREE_OPERAND (arg0, 1))
10546           && integer_onep (arg1))
10547         return fold_build2 (EQ_EXPR, type, arg0,
10548                             build_int_cst (TREE_TYPE (arg0), 0));
10549
10550       /* Fold (X & Y) ^ Y as ~X & Y.  */
10551       if (TREE_CODE (arg0) == BIT_AND_EXPR
10552           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10553         {
10554           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10555           return fold_build2 (BIT_AND_EXPR, type, 
10556                               fold_build1 (BIT_NOT_EXPR, type, tem),
10557                               fold_convert (type, arg1));
10558         }
10559       /* Fold (X & Y) ^ X as ~Y & X.  */
10560       if (TREE_CODE (arg0) == BIT_AND_EXPR
10561           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10562           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10563         {
10564           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10565           return fold_build2 (BIT_AND_EXPR, type,
10566                               fold_build1 (BIT_NOT_EXPR, type, tem),
10567                               fold_convert (type, arg1));
10568         }
10569       /* Fold X ^ (X & Y) as X & ~Y.  */
10570       if (TREE_CODE (arg1) == BIT_AND_EXPR
10571           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10572         {
10573           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10574           return fold_build2 (BIT_AND_EXPR, type,
10575                               fold_convert (type, arg0),
10576                               fold_build1 (BIT_NOT_EXPR, type, tem));
10577         }
10578       /* Fold X ^ (Y & X) as ~Y & X.  */
10579       if (TREE_CODE (arg1) == BIT_AND_EXPR
10580           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10581           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10582         {
10583           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10584           return fold_build2 (BIT_AND_EXPR, type,
10585                               fold_build1 (BIT_NOT_EXPR, type, tem),
10586                               fold_convert (type, arg0));
10587         }
10588
10589       /* See if this can be simplified into a rotate first.  If that
10590          is unsuccessful continue in the association code.  */
10591       goto bit_rotate;
10592
10593     case BIT_AND_EXPR:
10594       if (integer_all_onesp (arg1))
10595         return non_lvalue (fold_convert (type, arg0));
10596       if (integer_zerop (arg1))
10597         return omit_one_operand (type, arg1, arg0);
10598       if (operand_equal_p (arg0, arg1, 0))
10599         return non_lvalue (fold_convert (type, arg0));
10600
10601       /* ~X & X is always zero.  */
10602       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10603           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10604         return omit_one_operand (type, integer_zero_node, arg1);
10605
10606       /* X & ~X is always zero.  */
10607       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10608           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10609         return omit_one_operand (type, integer_zero_node, arg0);
10610
10611       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10612       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10613           && TREE_CODE (arg1) == INTEGER_CST
10614           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10615         {
10616           tree tmp1 = fold_convert (TREE_TYPE (arg0), arg1);
10617           tree tmp2 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10618                                    TREE_OPERAND (arg0, 0), tmp1);
10619           tree tmp3 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10620                                    TREE_OPERAND (arg0, 1), tmp1);
10621           return fold_convert (type,
10622                                fold_build2 (BIT_IOR_EXPR, TREE_TYPE (arg0),
10623                                             tmp2, tmp3));
10624         }
10625
10626       /* (X | Y) & Y is (X, Y).  */
10627       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10628           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10629         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10630       /* (X | Y) & X is (Y, X).  */
10631       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10632           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10633           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10634         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10635       /* X & (X | Y) is (Y, X).  */
10636       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10637           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10638           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10639         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10640       /* X & (Y | X) is (Y, X).  */
10641       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10642           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10643           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10644         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10645
10646       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10647       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10648           && integer_onep (TREE_OPERAND (arg0, 1))
10649           && integer_onep (arg1))
10650         {
10651           tem = TREE_OPERAND (arg0, 0);
10652           return fold_build2 (EQ_EXPR, type,
10653                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10654                                            build_int_cst (TREE_TYPE (tem), 1)),
10655                               build_int_cst (TREE_TYPE (tem), 0));
10656         }
10657       /* Fold ~X & 1 as (X & 1) == 0.  */
10658       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10659           && integer_onep (arg1))
10660         {
10661           tem = TREE_OPERAND (arg0, 0);
10662           return fold_build2 (EQ_EXPR, type,
10663                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10664                                            build_int_cst (TREE_TYPE (tem), 1)),
10665                               build_int_cst (TREE_TYPE (tem), 0));
10666         }
10667
10668       /* Fold (X ^ Y) & Y as ~X & Y.  */
10669       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10670           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10671         {
10672           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10673           return fold_build2 (BIT_AND_EXPR, type, 
10674                               fold_build1 (BIT_NOT_EXPR, type, tem),
10675                               fold_convert (type, arg1));
10676         }
10677       /* Fold (X ^ Y) & X as ~Y & X.  */
10678       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10679           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10680           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10681         {
10682           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10683           return fold_build2 (BIT_AND_EXPR, type,
10684                               fold_build1 (BIT_NOT_EXPR, type, tem),
10685                               fold_convert (type, arg1));
10686         }
10687       /* Fold X & (X ^ Y) as X & ~Y.  */
10688       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10689           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10690         {
10691           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10692           return fold_build2 (BIT_AND_EXPR, type,
10693                               fold_convert (type, arg0),
10694                               fold_build1 (BIT_NOT_EXPR, type, tem));
10695         }
10696       /* Fold X & (Y ^ X) as ~Y & X.  */
10697       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10698           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10699           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10700         {
10701           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10702           return fold_build2 (BIT_AND_EXPR, type,
10703                               fold_build1 (BIT_NOT_EXPR, type, tem),
10704                               fold_convert (type, arg0));
10705         }
10706
10707       t1 = distribute_bit_expr (code, type, arg0, arg1);
10708       if (t1 != NULL_TREE)
10709         return t1;
10710       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10711       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10712           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10713         {
10714           unsigned int prec
10715             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10716
10717           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10718               && (~TREE_INT_CST_LOW (arg1)
10719                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10720             return fold_convert (type, TREE_OPERAND (arg0, 0));
10721         }
10722
10723       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10724
10725          This results in more efficient code for machines without a NOR
10726          instruction.  Combine will canonicalize to the first form
10727          which will allow use of NOR instructions provided by the
10728          backend if they exist.  */
10729       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10730           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10731         {
10732           return fold_build1 (BIT_NOT_EXPR, type,
10733                               build2 (BIT_IOR_EXPR, type,
10734                                       fold_convert (type,
10735                                                     TREE_OPERAND (arg0, 0)),
10736                                       fold_convert (type,
10737                                                     TREE_OPERAND (arg1, 0))));
10738         }
10739
10740       /* If arg0 is derived from the address of an object or function, we may
10741          be able to fold this expression using the object or function's
10742          alignment.  */
10743       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
10744         {
10745           unsigned HOST_WIDE_INT modulus, residue;
10746           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
10747
10748           modulus = get_pointer_modulus_and_residue (arg0, &residue);
10749
10750           /* This works because modulus is a power of 2.  If this weren't the
10751              case, we'd have to replace it by its greatest power-of-2
10752              divisor: modulus & -modulus.  */
10753           if (low < modulus)
10754             return build_int_cst (type, residue & low);
10755         }
10756
10757       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
10758               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
10759          if the new mask might be further optimized.  */
10760       if ((TREE_CODE (arg0) == LSHIFT_EXPR
10761            || TREE_CODE (arg0) == RSHIFT_EXPR)
10762           && host_integerp (TREE_OPERAND (arg0, 1), 1)
10763           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
10764           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
10765              < TYPE_PRECISION (TREE_TYPE (arg0))
10766           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
10767           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
10768         {
10769           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
10770           unsigned HOST_WIDE_INT mask
10771             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
10772           unsigned HOST_WIDE_INT newmask, zerobits = 0;
10773           tree shift_type = TREE_TYPE (arg0);
10774
10775           if (TREE_CODE (arg0) == LSHIFT_EXPR)
10776             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
10777           else if (TREE_CODE (arg0) == RSHIFT_EXPR
10778                    && TYPE_PRECISION (TREE_TYPE (arg0))
10779                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
10780             {
10781               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
10782               tree arg00 = TREE_OPERAND (arg0, 0);
10783               /* See if more bits can be proven as zero because of
10784                  zero extension.  */
10785               if (TREE_CODE (arg00) == NOP_EXPR
10786                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
10787                 {
10788                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
10789                   if (TYPE_PRECISION (inner_type)
10790                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
10791                       && TYPE_PRECISION (inner_type) < prec)
10792                     {
10793                       prec = TYPE_PRECISION (inner_type);
10794                       /* See if we can shorten the right shift.  */
10795                       if (shiftc < prec)
10796                         shift_type = inner_type;
10797                     }
10798                 }
10799               zerobits = ~(unsigned HOST_WIDE_INT) 0;
10800               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
10801               zerobits <<= prec - shiftc;
10802               /* For arithmetic shift if sign bit could be set, zerobits
10803                  can contain actually sign bits, so no transformation is
10804                  possible, unless MASK masks them all away.  In that
10805                  case the shift needs to be converted into logical shift.  */
10806               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
10807                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
10808                 {
10809                   if ((mask & zerobits) == 0)
10810                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
10811                   else
10812                     zerobits = 0;
10813                 }
10814             }
10815
10816           /* ((X << 16) & 0xff00) is (X, 0).  */
10817           if ((mask & zerobits) == mask)
10818             return omit_one_operand (type, build_int_cst (type, 0), arg0);
10819
10820           newmask = mask | zerobits;
10821           if (newmask != mask && (newmask & (newmask + 1)) == 0)
10822             {
10823               unsigned int prec;
10824
10825               /* Only do the transformation if NEWMASK is some integer
10826                  mode's mask.  */
10827               for (prec = BITS_PER_UNIT;
10828                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
10829                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
10830                   break;
10831               if (prec < HOST_BITS_PER_WIDE_INT
10832                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
10833                 {
10834                   if (shift_type != TREE_TYPE (arg0))
10835                     {
10836                       tem = fold_build2 (TREE_CODE (arg0), shift_type,
10837                                          fold_convert (shift_type,
10838                                                        TREE_OPERAND (arg0, 0)),
10839                                          TREE_OPERAND (arg0, 1));
10840                       tem = fold_convert (type, tem);
10841                     }
10842                   else
10843                     tem = op0;
10844                   return fold_build2 (BIT_AND_EXPR, type, tem,
10845                                       build_int_cst_type (TREE_TYPE (op1),
10846                                                           newmask));
10847                 }
10848             }
10849         }
10850
10851       goto associate;
10852
10853     case RDIV_EXPR:
10854       /* Don't touch a floating-point divide by zero unless the mode
10855          of the constant can represent infinity.  */
10856       if (TREE_CODE (arg1) == REAL_CST
10857           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10858           && real_zerop (arg1))
10859         return NULL_TREE;
10860
10861       /* Optimize A / A to 1.0 if we don't care about
10862          NaNs or Infinities.  Skip the transformation
10863          for non-real operands.  */
10864       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10865           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10866           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10867           && operand_equal_p (arg0, arg1, 0))
10868         {
10869           tree r = build_real (TREE_TYPE (arg0), dconst1);
10870
10871           return omit_two_operands (type, r, arg0, arg1);
10872         }
10873
10874       /* The complex version of the above A / A optimization.  */
10875       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10876           && operand_equal_p (arg0, arg1, 0))
10877         {
10878           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10879           if (! HONOR_NANS (TYPE_MODE (elem_type))
10880               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10881             {
10882               tree r = build_real (elem_type, dconst1);
10883               /* omit_two_operands will call fold_convert for us.  */
10884               return omit_two_operands (type, r, arg0, arg1);
10885             }
10886         }
10887
10888       /* (-A) / (-B) -> A / B  */
10889       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10890         return fold_build2 (RDIV_EXPR, type,
10891                             TREE_OPERAND (arg0, 0),
10892                             negate_expr (arg1));
10893       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10894         return fold_build2 (RDIV_EXPR, type,
10895                             negate_expr (arg0),
10896                             TREE_OPERAND (arg1, 0));
10897
10898       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10899       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10900           && real_onep (arg1))
10901         return non_lvalue (fold_convert (type, arg0));
10902
10903       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10904       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10905           && real_minus_onep (arg1))
10906         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10907
10908       /* If ARG1 is a constant, we can convert this to a multiply by the
10909          reciprocal.  This does not have the same rounding properties,
10910          so only do this if -freciprocal-math.  We can actually
10911          always safely do it if ARG1 is a power of two, but it's hard to
10912          tell if it is or not in a portable manner.  */
10913       if (TREE_CODE (arg1) == REAL_CST)
10914         {
10915           if (flag_reciprocal_math
10916               && 0 != (tem = const_binop (code, build_real (type, dconst1),
10917                                           arg1, 0)))
10918             return fold_build2 (MULT_EXPR, type, arg0, tem);
10919           /* Find the reciprocal if optimizing and the result is exact.  */
10920           if (optimize)
10921             {
10922               REAL_VALUE_TYPE r;
10923               r = TREE_REAL_CST (arg1);
10924               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10925                 {
10926                   tem = build_real (type, r);
10927                   return fold_build2 (MULT_EXPR, type,
10928                                       fold_convert (type, arg0), tem);
10929                 }
10930             }
10931         }
10932       /* Convert A/B/C to A/(B*C).  */ 
10933       if (flag_reciprocal_math
10934           && TREE_CODE (arg0) == RDIV_EXPR)
10935         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10936                             fold_build2 (MULT_EXPR, type,
10937                                          TREE_OPERAND (arg0, 1), arg1));
10938
10939       /* Convert A/(B/C) to (A/B)*C.  */
10940       if (flag_reciprocal_math
10941           && TREE_CODE (arg1) == RDIV_EXPR)
10942         return fold_build2 (MULT_EXPR, type,
10943                             fold_build2 (RDIV_EXPR, type, arg0,
10944                                          TREE_OPERAND (arg1, 0)),
10945                             TREE_OPERAND (arg1, 1));
10946
10947       /* Convert C1/(X*C2) into (C1/C2)/X.  */
10948       if (flag_reciprocal_math
10949           && TREE_CODE (arg1) == MULT_EXPR
10950           && TREE_CODE (arg0) == REAL_CST
10951           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10952         {
10953           tree tem = const_binop (RDIV_EXPR, arg0,
10954                                   TREE_OPERAND (arg1, 1), 0);
10955           if (tem)
10956             return fold_build2 (RDIV_EXPR, type, tem,
10957                                 TREE_OPERAND (arg1, 0));
10958         }
10959
10960       if (flag_unsafe_math_optimizations)
10961         {
10962           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10963           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10964
10965           /* Optimize sin(x)/cos(x) as tan(x).  */
10966           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10967                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10968                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10969               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10970                                   CALL_EXPR_ARG (arg1, 0), 0))
10971             {
10972               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10973
10974               if (tanfn != NULL_TREE)
10975                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10976             }
10977
10978           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
10979           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10980                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10981                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10982               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10983                                   CALL_EXPR_ARG (arg1, 0), 0))
10984             {
10985               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10986
10987               if (tanfn != NULL_TREE)
10988                 {
10989                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10990                   return fold_build2 (RDIV_EXPR, type,
10991                                       build_real (type, dconst1), tmp);
10992                 }
10993             }
10994
10995           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10996              NaNs or Infinities.  */
10997           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10998                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10999                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11000             {
11001               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11002               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11003
11004               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11005                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11006                   && operand_equal_p (arg00, arg01, 0))
11007                 {
11008                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11009
11010                   if (cosfn != NULL_TREE)
11011                     return build_call_expr (cosfn, 1, arg00);
11012                 }
11013             }
11014
11015           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11016              NaNs or Infinities.  */
11017           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11018                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11019                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11020             {
11021               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11022               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11023
11024               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11025                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11026                   && operand_equal_p (arg00, arg01, 0))
11027                 {
11028                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11029
11030                   if (cosfn != NULL_TREE)
11031                     {
11032                       tree tmp = build_call_expr (cosfn, 1, arg00);
11033                       return fold_build2 (RDIV_EXPR, type,
11034                                           build_real (type, dconst1),
11035                                           tmp);
11036                     }
11037                 }
11038             }
11039
11040           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11041           if (fcode0 == BUILT_IN_POW
11042               || fcode0 == BUILT_IN_POWF
11043               || fcode0 == BUILT_IN_POWL)
11044             {
11045               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11046               tree arg01 = CALL_EXPR_ARG (arg0, 1);
11047               if (TREE_CODE (arg01) == REAL_CST
11048                   && !TREE_OVERFLOW (arg01)
11049                   && operand_equal_p (arg1, arg00, 0))
11050                 {
11051                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11052                   REAL_VALUE_TYPE c;
11053                   tree arg;
11054
11055                   c = TREE_REAL_CST (arg01);
11056                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11057                   arg = build_real (type, c);
11058                   return build_call_expr (powfn, 2, arg1, arg);
11059                 }
11060             }
11061
11062           /* Optimize a/root(b/c) into a*root(c/b).  */
11063           if (BUILTIN_ROOT_P (fcode1))
11064             {
11065               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11066
11067               if (TREE_CODE (rootarg) == RDIV_EXPR)
11068                 {
11069                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11070                   tree b = TREE_OPERAND (rootarg, 0);
11071                   tree c = TREE_OPERAND (rootarg, 1);
11072
11073                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11074
11075                   tmp = build_call_expr (rootfn, 1, tmp);
11076                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
11077                 }
11078             }
11079
11080           /* Optimize x/expN(y) into x*expN(-y).  */
11081           if (BUILTIN_EXPONENT_P (fcode1))
11082             {
11083               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11084               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11085               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11086               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11087             }
11088
11089           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11090           if (fcode1 == BUILT_IN_POW
11091               || fcode1 == BUILT_IN_POWF
11092               || fcode1 == BUILT_IN_POWL)
11093             {
11094               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11095               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11096               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11097               tree neg11 = fold_convert (type, negate_expr (arg11));
11098               arg1 = build_call_expr (powfn, 2, arg10, neg11);
11099               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11100             }
11101         }
11102       return NULL_TREE;
11103
11104     case TRUNC_DIV_EXPR:
11105     case FLOOR_DIV_EXPR:
11106       /* Simplify A / (B << N) where A and B are positive and B is
11107          a power of 2, to A >> (N + log2(B)).  */
11108       strict_overflow_p = false;
11109       if (TREE_CODE (arg1) == LSHIFT_EXPR
11110           && (TYPE_UNSIGNED (type)
11111               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11112         {
11113           tree sval = TREE_OPERAND (arg1, 0);
11114           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11115             {
11116               tree sh_cnt = TREE_OPERAND (arg1, 1);
11117               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11118
11119               if (strict_overflow_p)
11120                 fold_overflow_warning (("assuming signed overflow does not "
11121                                         "occur when simplifying A / (B << N)"),
11122                                        WARN_STRICT_OVERFLOW_MISC);
11123
11124               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11125                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
11126               return fold_build2 (RSHIFT_EXPR, type,
11127                                   fold_convert (type, arg0), sh_cnt);
11128             }
11129         }
11130
11131       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11132          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
11133       if (INTEGRAL_TYPE_P (type)
11134           && TYPE_UNSIGNED (type)
11135           && code == FLOOR_DIV_EXPR)
11136         return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11137
11138       /* Fall thru */
11139
11140     case ROUND_DIV_EXPR:
11141     case CEIL_DIV_EXPR:
11142     case EXACT_DIV_EXPR:
11143       if (integer_onep (arg1))
11144         return non_lvalue (fold_convert (type, arg0));
11145       if (integer_zerop (arg1))
11146         return NULL_TREE;
11147       /* X / -1 is -X.  */
11148       if (!TYPE_UNSIGNED (type)
11149           && TREE_CODE (arg1) == INTEGER_CST
11150           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11151           && TREE_INT_CST_HIGH (arg1) == -1)
11152         return fold_convert (type, negate_expr (arg0));
11153
11154       /* Convert -A / -B to A / B when the type is signed and overflow is
11155          undefined.  */
11156       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11157           && TREE_CODE (arg0) == NEGATE_EXPR
11158           && negate_expr_p (arg1))
11159         {
11160           if (INTEGRAL_TYPE_P (type))
11161             fold_overflow_warning (("assuming signed overflow does not occur "
11162                                     "when distributing negation across "
11163                                     "division"),
11164                                    WARN_STRICT_OVERFLOW_MISC);
11165           return fold_build2 (code, type,
11166                               fold_convert (type, TREE_OPERAND (arg0, 0)),
11167                               negate_expr (arg1));
11168         }
11169       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11170           && TREE_CODE (arg1) == NEGATE_EXPR
11171           && negate_expr_p (arg0))
11172         {
11173           if (INTEGRAL_TYPE_P (type))
11174             fold_overflow_warning (("assuming signed overflow does not occur "
11175                                     "when distributing negation across "
11176                                     "division"),
11177                                    WARN_STRICT_OVERFLOW_MISC);
11178           return fold_build2 (code, type, negate_expr (arg0),
11179                               TREE_OPERAND (arg1, 0));
11180         }
11181
11182       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11183          operation, EXACT_DIV_EXPR.
11184
11185          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11186          At one time others generated faster code, it's not clear if they do
11187          after the last round to changes to the DIV code in expmed.c.  */
11188       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11189           && multiple_of_p (type, arg0, arg1))
11190         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11191
11192       strict_overflow_p = false;
11193       if (TREE_CODE (arg1) == INTEGER_CST
11194           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11195                                          &strict_overflow_p)))
11196         {
11197           if (strict_overflow_p)
11198             fold_overflow_warning (("assuming signed overflow does not occur "
11199                                     "when simplifying division"),
11200                                    WARN_STRICT_OVERFLOW_MISC);
11201           return fold_convert (type, tem);
11202         }
11203
11204       return NULL_TREE;
11205
11206     case CEIL_MOD_EXPR:
11207     case FLOOR_MOD_EXPR:
11208     case ROUND_MOD_EXPR:
11209     case TRUNC_MOD_EXPR:
11210       /* X % 1 is always zero, but be sure to preserve any side
11211          effects in X.  */
11212       if (integer_onep (arg1))
11213         return omit_one_operand (type, integer_zero_node, arg0);
11214
11215       /* X % 0, return X % 0 unchanged so that we can get the
11216          proper warnings and errors.  */
11217       if (integer_zerop (arg1))
11218         return NULL_TREE;
11219
11220       /* 0 % X is always zero, but be sure to preserve any side
11221          effects in X.  Place this after checking for X == 0.  */
11222       if (integer_zerop (arg0))
11223         return omit_one_operand (type, integer_zero_node, arg1);
11224
11225       /* X % -1 is zero.  */
11226       if (!TYPE_UNSIGNED (type)
11227           && TREE_CODE (arg1) == INTEGER_CST
11228           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11229           && TREE_INT_CST_HIGH (arg1) == -1)
11230         return omit_one_operand (type, integer_zero_node, arg0);
11231
11232       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11233          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11234       strict_overflow_p = false;
11235       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11236           && (TYPE_UNSIGNED (type)
11237               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11238         {
11239           tree c = arg1;
11240           /* Also optimize A % (C << N)  where C is a power of 2,
11241              to A & ((C << N) - 1).  */
11242           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11243             c = TREE_OPERAND (arg1, 0);
11244
11245           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11246             {
11247               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11248                                        build_int_cst (TREE_TYPE (arg1), 1));
11249               if (strict_overflow_p)
11250                 fold_overflow_warning (("assuming signed overflow does not "
11251                                         "occur when simplifying "
11252                                         "X % (power of two)"),
11253                                        WARN_STRICT_OVERFLOW_MISC);
11254               return fold_build2 (BIT_AND_EXPR, type,
11255                                   fold_convert (type, arg0),
11256                                   fold_convert (type, mask));
11257             }
11258         }
11259
11260       /* X % -C is the same as X % C.  */
11261       if (code == TRUNC_MOD_EXPR
11262           && !TYPE_UNSIGNED (type)
11263           && TREE_CODE (arg1) == INTEGER_CST
11264           && !TREE_OVERFLOW (arg1)
11265           && TREE_INT_CST_HIGH (arg1) < 0
11266           && !TYPE_OVERFLOW_TRAPS (type)
11267           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
11268           && !sign_bit_p (arg1, arg1))
11269         return fold_build2 (code, type, fold_convert (type, arg0),
11270                             fold_convert (type, negate_expr (arg1)));
11271
11272       /* X % -Y is the same as X % Y.  */
11273       if (code == TRUNC_MOD_EXPR
11274           && !TYPE_UNSIGNED (type)
11275           && TREE_CODE (arg1) == NEGATE_EXPR
11276           && !TYPE_OVERFLOW_TRAPS (type))
11277         return fold_build2 (code, type, fold_convert (type, arg0),
11278                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11279
11280       if (TREE_CODE (arg1) == INTEGER_CST
11281           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11282                                          &strict_overflow_p)))
11283         {
11284           if (strict_overflow_p)
11285             fold_overflow_warning (("assuming signed overflow does not occur "
11286                                     "when simplifying modulos"),
11287                                    WARN_STRICT_OVERFLOW_MISC);
11288           return fold_convert (type, tem);
11289         }
11290
11291       return NULL_TREE;
11292
11293     case LROTATE_EXPR:
11294     case RROTATE_EXPR:
11295       if (integer_all_onesp (arg0))
11296         return omit_one_operand (type, arg0, arg1);
11297       goto shift;
11298
11299     case RSHIFT_EXPR:
11300       /* Optimize -1 >> x for arithmetic right shifts.  */
11301       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
11302         return omit_one_operand (type, arg0, arg1);
11303       /* ... fall through ...  */
11304
11305     case LSHIFT_EXPR:
11306     shift:
11307       if (integer_zerop (arg1))
11308         return non_lvalue (fold_convert (type, arg0));
11309       if (integer_zerop (arg0))
11310         return omit_one_operand (type, arg0, arg1);
11311
11312       /* Since negative shift count is not well-defined,
11313          don't try to compute it in the compiler.  */
11314       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11315         return NULL_TREE;
11316
11317       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
11318       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11319           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11320           && host_integerp (TREE_OPERAND (arg0, 1), false)
11321           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11322         {
11323           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11324                                + TREE_INT_CST_LOW (arg1));
11325
11326           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11327              being well defined.  */
11328           if (low >= TYPE_PRECISION (type))
11329             {
11330               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11331                 low = low % TYPE_PRECISION (type);
11332               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11333                 return build_int_cst (type, 0);
11334               else
11335                 low = TYPE_PRECISION (type) - 1;
11336             }
11337
11338           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11339                               build_int_cst (type, low));
11340         }
11341
11342       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11343          into x & ((unsigned)-1 >> c) for unsigned types.  */
11344       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11345            || (TYPE_UNSIGNED (type)
11346                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11347           && host_integerp (arg1, false)
11348           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11349           && host_integerp (TREE_OPERAND (arg0, 1), false)
11350           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11351         {
11352           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11353           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11354           tree lshift;
11355           tree arg00;
11356
11357           if (low0 == low1)
11358             {
11359               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11360
11361               lshift = build_int_cst (type, -1);
11362               lshift = int_const_binop (code, lshift, arg1, 0);
11363
11364               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11365             }
11366         }
11367
11368       /* Rewrite an LROTATE_EXPR by a constant into an
11369          RROTATE_EXPR by a new constant.  */
11370       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11371         {
11372           tree tem = build_int_cst (TREE_TYPE (arg1),
11373                                     TYPE_PRECISION (type));
11374           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11375           return fold_build2 (RROTATE_EXPR, type, op0, tem);
11376         }
11377
11378       /* If we have a rotate of a bit operation with the rotate count and
11379          the second operand of the bit operation both constant,
11380          permute the two operations.  */
11381       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11382           && (TREE_CODE (arg0) == BIT_AND_EXPR
11383               || TREE_CODE (arg0) == BIT_IOR_EXPR
11384               || TREE_CODE (arg0) == BIT_XOR_EXPR)
11385           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11386         return fold_build2 (TREE_CODE (arg0), type,
11387                             fold_build2 (code, type,
11388                                          TREE_OPERAND (arg0, 0), arg1),
11389                             fold_build2 (code, type,
11390                                          TREE_OPERAND (arg0, 1), arg1));
11391
11392       /* Two consecutive rotates adding up to the precision of the
11393          type can be ignored.  */
11394       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11395           && TREE_CODE (arg0) == RROTATE_EXPR
11396           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11397           && TREE_INT_CST_HIGH (arg1) == 0
11398           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11399           && ((TREE_INT_CST_LOW (arg1)
11400                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11401               == (unsigned int) TYPE_PRECISION (type)))
11402         return TREE_OPERAND (arg0, 0);
11403
11404       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11405               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11406          if the latter can be further optimized.  */
11407       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11408           && TREE_CODE (arg0) == BIT_AND_EXPR
11409           && TREE_CODE (arg1) == INTEGER_CST
11410           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11411         {
11412           tree mask = fold_build2 (code, type,
11413                                    fold_convert (type, TREE_OPERAND (arg0, 1)),
11414                                    arg1);
11415           tree shift = fold_build2 (code, type,
11416                                     fold_convert (type, TREE_OPERAND (arg0, 0)),
11417                                     arg1);
11418           tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11419           if (tem)
11420             return tem;
11421         }
11422
11423       return NULL_TREE;
11424
11425     case MIN_EXPR:
11426       if (operand_equal_p (arg0, arg1, 0))
11427         return omit_one_operand (type, arg0, arg1);
11428       if (INTEGRAL_TYPE_P (type)
11429           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11430         return omit_one_operand (type, arg1, arg0);
11431       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11432       if (tem)
11433         return tem;
11434       goto associate;
11435
11436     case MAX_EXPR:
11437       if (operand_equal_p (arg0, arg1, 0))
11438         return omit_one_operand (type, arg0, arg1);
11439       if (INTEGRAL_TYPE_P (type)
11440           && TYPE_MAX_VALUE (type)
11441           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11442         return omit_one_operand (type, arg1, arg0);
11443       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11444       if (tem)
11445         return tem;
11446       goto associate;
11447
11448     case TRUTH_ANDIF_EXPR:
11449       /* Note that the operands of this must be ints
11450          and their values must be 0 or 1.
11451          ("true" is a fixed value perhaps depending on the language.)  */
11452       /* If first arg is constant zero, return it.  */
11453       if (integer_zerop (arg0))
11454         return fold_convert (type, arg0);
11455     case TRUTH_AND_EXPR:
11456       /* If either arg is constant true, drop it.  */
11457       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11458         return non_lvalue (fold_convert (type, arg1));
11459       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11460           /* Preserve sequence points.  */
11461           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11462         return non_lvalue (fold_convert (type, arg0));
11463       /* If second arg is constant zero, result is zero, but first arg
11464          must be evaluated.  */
11465       if (integer_zerop (arg1))
11466         return omit_one_operand (type, arg1, arg0);
11467       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11468          case will be handled here.  */
11469       if (integer_zerop (arg0))
11470         return omit_one_operand (type, arg0, arg1);
11471
11472       /* !X && X is always false.  */
11473       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11474           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11475         return omit_one_operand (type, integer_zero_node, arg1);
11476       /* X && !X is always false.  */
11477       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11478           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11479         return omit_one_operand (type, integer_zero_node, arg0);
11480
11481       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
11482          means A >= Y && A != MAX, but in this case we know that
11483          A < X <= MAX.  */
11484
11485       if (!TREE_SIDE_EFFECTS (arg0)
11486           && !TREE_SIDE_EFFECTS (arg1))
11487         {
11488           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
11489           if (tem && !operand_equal_p (tem, arg0, 0))
11490             return fold_build2 (code, type, tem, arg1);
11491
11492           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11493           if (tem && !operand_equal_p (tem, arg1, 0))
11494             return fold_build2 (code, type, arg0, tem);
11495         }
11496
11497     truth_andor:
11498       /* We only do these simplifications if we are optimizing.  */
11499       if (!optimize)
11500         return NULL_TREE;
11501
11502       /* Check for things like (A || B) && (A || C).  We can convert this
11503          to A || (B && C).  Note that either operator can be any of the four
11504          truth and/or operations and the transformation will still be
11505          valid.   Also note that we only care about order for the
11506          ANDIF and ORIF operators.  If B contains side effects, this
11507          might change the truth-value of A.  */
11508       if (TREE_CODE (arg0) == TREE_CODE (arg1)
11509           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11510               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11511               || TREE_CODE (arg0) == TRUTH_AND_EXPR
11512               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11513           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11514         {
11515           tree a00 = TREE_OPERAND (arg0, 0);
11516           tree a01 = TREE_OPERAND (arg0, 1);
11517           tree a10 = TREE_OPERAND (arg1, 0);
11518           tree a11 = TREE_OPERAND (arg1, 1);
11519           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11520                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11521                              && (code == TRUTH_AND_EXPR
11522                                  || code == TRUTH_OR_EXPR));
11523
11524           if (operand_equal_p (a00, a10, 0))
11525             return fold_build2 (TREE_CODE (arg0), type, a00,
11526                                 fold_build2 (code, type, a01, a11));
11527           else if (commutative && operand_equal_p (a00, a11, 0))
11528             return fold_build2 (TREE_CODE (arg0), type, a00,
11529                                 fold_build2 (code, type, a01, a10));
11530           else if (commutative && operand_equal_p (a01, a10, 0))
11531             return fold_build2 (TREE_CODE (arg0), type, a01,
11532                                 fold_build2 (code, type, a00, a11));
11533
11534           /* This case if tricky because we must either have commutative
11535              operators or else A10 must not have side-effects.  */
11536
11537           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11538                    && operand_equal_p (a01, a11, 0))
11539             return fold_build2 (TREE_CODE (arg0), type,
11540                                 fold_build2 (code, type, a00, a10),
11541                                 a01);
11542         }
11543
11544       /* See if we can build a range comparison.  */
11545       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11546         return tem;
11547
11548       /* Check for the possibility of merging component references.  If our
11549          lhs is another similar operation, try to merge its rhs with our
11550          rhs.  Then try to merge our lhs and rhs.  */
11551       if (TREE_CODE (arg0) == code
11552           && 0 != (tem = fold_truthop (code, type,
11553                                        TREE_OPERAND (arg0, 1), arg1)))
11554         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11555
11556       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11557         return tem;
11558
11559       return NULL_TREE;
11560
11561     case TRUTH_ORIF_EXPR:
11562       /* Note that the operands of this must be ints
11563          and their values must be 0 or true.
11564          ("true" is a fixed value perhaps depending on the language.)  */
11565       /* If first arg is constant true, return it.  */
11566       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11567         return fold_convert (type, arg0);
11568     case TRUTH_OR_EXPR:
11569       /* If either arg is constant zero, drop it.  */
11570       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11571         return non_lvalue (fold_convert (type, arg1));
11572       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11573           /* Preserve sequence points.  */
11574           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11575         return non_lvalue (fold_convert (type, arg0));
11576       /* If second arg is constant true, result is true, but we must
11577          evaluate first arg.  */
11578       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11579         return omit_one_operand (type, arg1, arg0);
11580       /* Likewise for first arg, but note this only occurs here for
11581          TRUTH_OR_EXPR.  */
11582       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11583         return omit_one_operand (type, arg0, arg1);
11584
11585       /* !X || X is always true.  */
11586       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11587           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11588         return omit_one_operand (type, integer_one_node, arg1);
11589       /* X || !X is always true.  */
11590       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11591           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11592         return omit_one_operand (type, integer_one_node, arg0);
11593
11594       goto truth_andor;
11595
11596     case TRUTH_XOR_EXPR:
11597       /* If the second arg is constant zero, drop it.  */
11598       if (integer_zerop (arg1))
11599         return non_lvalue (fold_convert (type, arg0));
11600       /* If the second arg is constant true, this is a logical inversion.  */
11601       if (integer_onep (arg1))
11602         {
11603           /* Only call invert_truthvalue if operand is a truth value.  */
11604           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11605             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11606           else
11607             tem = invert_truthvalue (arg0);
11608           return non_lvalue (fold_convert (type, tem));
11609         }
11610       /* Identical arguments cancel to zero.  */
11611       if (operand_equal_p (arg0, arg1, 0))
11612         return omit_one_operand (type, integer_zero_node, arg0);
11613
11614       /* !X ^ X is always true.  */
11615       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11616           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11617         return omit_one_operand (type, integer_one_node, arg1);
11618
11619       /* X ^ !X is always true.  */
11620       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11621           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11622         return omit_one_operand (type, integer_one_node, arg0);
11623
11624       return NULL_TREE;
11625
11626     case EQ_EXPR:
11627     case NE_EXPR:
11628       tem = fold_comparison (code, type, op0, op1);
11629       if (tem != NULL_TREE)
11630         return tem;
11631
11632       /* bool_var != 0 becomes bool_var. */
11633       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11634           && code == NE_EXPR)
11635         return non_lvalue (fold_convert (type, arg0));
11636
11637       /* bool_var == 1 becomes bool_var. */
11638       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11639           && code == EQ_EXPR)
11640         return non_lvalue (fold_convert (type, arg0));
11641
11642       /* bool_var != 1 becomes !bool_var. */
11643       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11644           && code == NE_EXPR)
11645         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11646
11647       /* bool_var == 0 becomes !bool_var. */
11648       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11649           && code == EQ_EXPR)
11650         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11651
11652       /* If this is an equality comparison of the address of two non-weak,
11653          unaliased symbols neither of which are extern (since we do not
11654          have access to attributes for externs), then we know the result.  */
11655       if (TREE_CODE (arg0) == ADDR_EXPR
11656           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11657           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11658           && ! lookup_attribute ("alias",
11659                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11660           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11661           && TREE_CODE (arg1) == ADDR_EXPR
11662           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11663           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11664           && ! lookup_attribute ("alias",
11665                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11666           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11667         {
11668           /* We know that we're looking at the address of two
11669              non-weak, unaliased, static _DECL nodes.
11670
11671              It is both wasteful and incorrect to call operand_equal_p
11672              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11673              all we need to do is test pointer equality for the arguments
11674              to the two ADDR_EXPR nodes.  It is incorrect to use
11675              operand_equal_p as that function is NOT equivalent to a
11676              C equality test.  It can in fact return false for two
11677              objects which would test as equal using the C equality
11678              operator.  */
11679           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11680           return constant_boolean_node (equal
11681                                         ? code == EQ_EXPR : code != EQ_EXPR,
11682                                         type);
11683         }
11684
11685       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11686          a MINUS_EXPR of a constant, we can convert it into a comparison with
11687          a revised constant as long as no overflow occurs.  */
11688       if (TREE_CODE (arg1) == INTEGER_CST
11689           && (TREE_CODE (arg0) == PLUS_EXPR
11690               || TREE_CODE (arg0) == MINUS_EXPR)
11691           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11692           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11693                                       ? MINUS_EXPR : PLUS_EXPR,
11694                                       fold_convert (TREE_TYPE (arg0), arg1),
11695                                       TREE_OPERAND (arg0, 1), 0))
11696           && !TREE_OVERFLOW (tem))
11697         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11698
11699       /* Similarly for a NEGATE_EXPR.  */
11700       if (TREE_CODE (arg0) == NEGATE_EXPR
11701           && TREE_CODE (arg1) == INTEGER_CST
11702           && 0 != (tem = negate_expr (arg1))
11703           && TREE_CODE (tem) == INTEGER_CST
11704           && !TREE_OVERFLOW (tem))
11705         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11706
11707       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11708       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11709           && TREE_CODE (arg1) == INTEGER_CST
11710           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11711         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11712                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11713                                          fold_convert (TREE_TYPE (arg0), arg1),
11714                                          TREE_OPERAND (arg0, 1)));
11715
11716       /* Transform comparisons of the form X +- C CMP X.  */
11717       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11718           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11719           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11720           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11721               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11722         {
11723           tree cst = TREE_OPERAND (arg0, 1);
11724
11725           if (code == EQ_EXPR
11726               && !integer_zerop (cst))
11727             return omit_two_operands (type, boolean_false_node,
11728                                       TREE_OPERAND (arg0, 0), arg1);
11729           else
11730             return omit_two_operands (type, boolean_true_node,
11731                                       TREE_OPERAND (arg0, 0), arg1);
11732         }
11733
11734       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11735          for !=.  Don't do this for ordered comparisons due to overflow.  */
11736       if (TREE_CODE (arg0) == MINUS_EXPR
11737           && integer_zerop (arg1))
11738         return fold_build2 (code, type,
11739                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11740
11741       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11742       if (TREE_CODE (arg0) == ABS_EXPR
11743           && (integer_zerop (arg1) || real_zerop (arg1)))
11744         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11745
11746       /* If this is an EQ or NE comparison with zero and ARG0 is
11747          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11748          two operations, but the latter can be done in one less insn
11749          on machines that have only two-operand insns or on which a
11750          constant cannot be the first operand.  */
11751       if (TREE_CODE (arg0) == BIT_AND_EXPR
11752           && integer_zerop (arg1))
11753         {
11754           tree arg00 = TREE_OPERAND (arg0, 0);
11755           tree arg01 = TREE_OPERAND (arg0, 1);
11756           if (TREE_CODE (arg00) == LSHIFT_EXPR
11757               && integer_onep (TREE_OPERAND (arg00, 0)))
11758             {
11759               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11760                                       arg01, TREE_OPERAND (arg00, 1));
11761               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11762                                  build_int_cst (TREE_TYPE (arg0), 1));
11763               return fold_build2 (code, type,
11764                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11765             }
11766           else if (TREE_CODE (arg01) == LSHIFT_EXPR
11767                    && integer_onep (TREE_OPERAND (arg01, 0)))
11768             {
11769               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11770                                       arg00, TREE_OPERAND (arg01, 1));
11771               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11772                                  build_int_cst (TREE_TYPE (arg0), 1));
11773               return fold_build2 (code, type,
11774                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11775             }
11776         }
11777
11778       /* If this is an NE or EQ comparison of zero against the result of a
11779          signed MOD operation whose second operand is a power of 2, make
11780          the MOD operation unsigned since it is simpler and equivalent.  */
11781       if (integer_zerop (arg1)
11782           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11783           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11784               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11785               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11786               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11787           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11788         {
11789           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11790           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11791                                      fold_convert (newtype,
11792                                                    TREE_OPERAND (arg0, 0)),
11793                                      fold_convert (newtype,
11794                                                    TREE_OPERAND (arg0, 1)));
11795
11796           return fold_build2 (code, type, newmod,
11797                               fold_convert (newtype, arg1));
11798         }
11799
11800       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11801          C1 is a valid shift constant, and C2 is a power of two, i.e.
11802          a single bit.  */
11803       if (TREE_CODE (arg0) == BIT_AND_EXPR
11804           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11805           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11806              == INTEGER_CST
11807           && integer_pow2p (TREE_OPERAND (arg0, 1))
11808           && integer_zerop (arg1))
11809         {
11810           tree itype = TREE_TYPE (arg0);
11811           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11812           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11813
11814           /* Check for a valid shift count.  */
11815           if (TREE_INT_CST_HIGH (arg001) == 0
11816               && TREE_INT_CST_LOW (arg001) < prec)
11817             {
11818               tree arg01 = TREE_OPERAND (arg0, 1);
11819               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11820               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11821               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11822                  can be rewritten as (X & (C2 << C1)) != 0.  */
11823               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11824                 {
11825                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11826                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11827                   return fold_build2 (code, type, tem, arg1);
11828                 }
11829               /* Otherwise, for signed (arithmetic) shifts,
11830                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11831                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11832               else if (!TYPE_UNSIGNED (itype))
11833                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11834                                     arg000, build_int_cst (itype, 0));
11835               /* Otherwise, of unsigned (logical) shifts,
11836                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11837                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11838               else
11839                 return omit_one_operand (type,
11840                                          code == EQ_EXPR ? integer_one_node
11841                                                          : integer_zero_node,
11842                                          arg000);
11843             }
11844         }
11845
11846       /* If this is an NE comparison of zero with an AND of one, remove the
11847          comparison since the AND will give the correct value.  */
11848       if (code == NE_EXPR
11849           && integer_zerop (arg1)
11850           && TREE_CODE (arg0) == BIT_AND_EXPR
11851           && integer_onep (TREE_OPERAND (arg0, 1)))
11852         return fold_convert (type, arg0);
11853
11854       /* If we have (A & C) == C where C is a power of 2, convert this into
11855          (A & C) != 0.  Similarly for NE_EXPR.  */
11856       if (TREE_CODE (arg0) == BIT_AND_EXPR
11857           && integer_pow2p (TREE_OPERAND (arg0, 1))
11858           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11859         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11860                             arg0, fold_convert (TREE_TYPE (arg0),
11861                                                 integer_zero_node));
11862
11863       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11864          bit, then fold the expression into A < 0 or A >= 0.  */
11865       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11866       if (tem)
11867         return tem;
11868
11869       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11870          Similarly for NE_EXPR.  */
11871       if (TREE_CODE (arg0) == BIT_AND_EXPR
11872           && TREE_CODE (arg1) == INTEGER_CST
11873           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11874         {
11875           tree notc = fold_build1 (BIT_NOT_EXPR,
11876                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11877                                    TREE_OPERAND (arg0, 1));
11878           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11879                                        arg1, notc);
11880           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11881           if (integer_nonzerop (dandnotc))
11882             return omit_one_operand (type, rslt, arg0);
11883         }
11884
11885       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11886          Similarly for NE_EXPR.  */
11887       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11888           && TREE_CODE (arg1) == INTEGER_CST
11889           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11890         {
11891           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11892           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11893                                        TREE_OPERAND (arg0, 1), notd);
11894           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11895           if (integer_nonzerop (candnotd))
11896             return omit_one_operand (type, rslt, arg0);
11897         }
11898
11899       /* Optimize comparisons of strlen vs zero to a compare of the
11900          first character of the string vs zero.  To wit,
11901                 strlen(ptr) == 0   =>  *ptr == 0
11902                 strlen(ptr) != 0   =>  *ptr != 0
11903          Other cases should reduce to one of these two (or a constant)
11904          due to the return value of strlen being unsigned.  */
11905       if (TREE_CODE (arg0) == CALL_EXPR
11906           && integer_zerop (arg1))
11907         {
11908           tree fndecl = get_callee_fndecl (arg0);
11909
11910           if (fndecl
11911               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11912               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11913               && call_expr_nargs (arg0) == 1
11914               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11915             {
11916               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11917               return fold_build2 (code, type, iref,
11918                                   build_int_cst (TREE_TYPE (iref), 0));
11919             }
11920         }
11921
11922       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11923          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
11924       if (TREE_CODE (arg0) == RSHIFT_EXPR
11925           && integer_zerop (arg1)
11926           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11927         {
11928           tree arg00 = TREE_OPERAND (arg0, 0);
11929           tree arg01 = TREE_OPERAND (arg0, 1);
11930           tree itype = TREE_TYPE (arg00);
11931           if (TREE_INT_CST_HIGH (arg01) == 0
11932               && TREE_INT_CST_LOW (arg01)
11933                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11934             {
11935               if (TYPE_UNSIGNED (itype))
11936                 {
11937                   itype = signed_type_for (itype);
11938                   arg00 = fold_convert (itype, arg00);
11939                 }
11940               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11941                                   type, arg00, build_int_cst (itype, 0));
11942             }
11943         }
11944
11945       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
11946       if (integer_zerop (arg1)
11947           && TREE_CODE (arg0) == BIT_XOR_EXPR)
11948         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11949                             TREE_OPERAND (arg0, 1));
11950
11951       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
11952       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11953           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11954         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11955                             build_int_cst (TREE_TYPE (arg1), 0));
11956       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
11957       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11958           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11959           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11960         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11961                             build_int_cst (TREE_TYPE (arg1), 0));
11962
11963       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
11964       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11965           && TREE_CODE (arg1) == INTEGER_CST
11966           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11967         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11968                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11969                                          TREE_OPERAND (arg0, 1), arg1));
11970
11971       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11972          (X & C) == 0 when C is a single bit.  */
11973       if (TREE_CODE (arg0) == BIT_AND_EXPR
11974           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11975           && integer_zerop (arg1)
11976           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11977         {
11978           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11979                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11980                              TREE_OPERAND (arg0, 1));
11981           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11982                               type, tem, arg1);
11983         }
11984
11985       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11986          constant C is a power of two, i.e. a single bit.  */
11987       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11988           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11989           && integer_zerop (arg1)
11990           && integer_pow2p (TREE_OPERAND (arg0, 1))
11991           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11992                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11993         {
11994           tree arg00 = TREE_OPERAND (arg0, 0);
11995           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11996                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
11997         }
11998
11999       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12000          when is C is a power of two, i.e. a single bit.  */
12001       if (TREE_CODE (arg0) == BIT_AND_EXPR
12002           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12003           && integer_zerop (arg1)
12004           && integer_pow2p (TREE_OPERAND (arg0, 1))
12005           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12006                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12007         {
12008           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12009           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
12010                              arg000, TREE_OPERAND (arg0, 1));
12011           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12012                               tem, build_int_cst (TREE_TYPE (tem), 0));
12013         }
12014
12015       if (integer_zerop (arg1)
12016           && tree_expr_nonzero_p (arg0))
12017         {
12018           tree res = constant_boolean_node (code==NE_EXPR, type);
12019           return omit_one_operand (type, res, arg0);
12020         }
12021
12022       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12023       if (TREE_CODE (arg0) == NEGATE_EXPR
12024           && TREE_CODE (arg1) == NEGATE_EXPR)
12025         return fold_build2 (code, type,
12026                             TREE_OPERAND (arg0, 0),
12027                             TREE_OPERAND (arg1, 0));
12028
12029       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12030       if (TREE_CODE (arg0) == BIT_AND_EXPR
12031           && TREE_CODE (arg1) == BIT_AND_EXPR)
12032         {
12033           tree arg00 = TREE_OPERAND (arg0, 0);
12034           tree arg01 = TREE_OPERAND (arg0, 1);
12035           tree arg10 = TREE_OPERAND (arg1, 0);
12036           tree arg11 = TREE_OPERAND (arg1, 1);
12037           tree itype = TREE_TYPE (arg0);
12038
12039           if (operand_equal_p (arg01, arg11, 0))
12040             return fold_build2 (code, type,
12041                                 fold_build2 (BIT_AND_EXPR, itype,
12042                                              fold_build2 (BIT_XOR_EXPR, itype,
12043                                                           arg00, arg10),
12044                                              arg01),
12045                                 build_int_cst (itype, 0));
12046
12047           if (operand_equal_p (arg01, arg10, 0))
12048             return fold_build2 (code, type,
12049                                 fold_build2 (BIT_AND_EXPR, itype,
12050                                              fold_build2 (BIT_XOR_EXPR, itype,
12051                                                           arg00, arg11),
12052                                              arg01),
12053                                 build_int_cst (itype, 0));
12054
12055           if (operand_equal_p (arg00, arg11, 0))
12056             return fold_build2 (code, type,
12057                                 fold_build2 (BIT_AND_EXPR, itype,
12058                                              fold_build2 (BIT_XOR_EXPR, itype,
12059                                                           arg01, arg10),
12060                                              arg00),
12061                                 build_int_cst (itype, 0));
12062
12063           if (operand_equal_p (arg00, arg10, 0))
12064             return fold_build2 (code, type,
12065                                 fold_build2 (BIT_AND_EXPR, itype,
12066                                              fold_build2 (BIT_XOR_EXPR, itype,
12067                                                           arg01, arg11),
12068                                              arg00),
12069                                 build_int_cst (itype, 0));
12070         }
12071
12072       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12073           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12074         {
12075           tree arg00 = TREE_OPERAND (arg0, 0);
12076           tree arg01 = TREE_OPERAND (arg0, 1);
12077           tree arg10 = TREE_OPERAND (arg1, 0);
12078           tree arg11 = TREE_OPERAND (arg1, 1);
12079           tree itype = TREE_TYPE (arg0);
12080
12081           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12082              operand_equal_p guarantees no side-effects so we don't need
12083              to use omit_one_operand on Z.  */
12084           if (operand_equal_p (arg01, arg11, 0))
12085             return fold_build2 (code, type, arg00, arg10);
12086           if (operand_equal_p (arg01, arg10, 0))
12087             return fold_build2 (code, type, arg00, arg11);
12088           if (operand_equal_p (arg00, arg11, 0))
12089             return fold_build2 (code, type, arg01, arg10);
12090           if (operand_equal_p (arg00, arg10, 0))
12091             return fold_build2 (code, type, arg01, arg11);
12092
12093           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12094           if (TREE_CODE (arg01) == INTEGER_CST
12095               && TREE_CODE (arg11) == INTEGER_CST)
12096             return fold_build2 (code, type,
12097                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12098                                              fold_build2 (BIT_XOR_EXPR, itype,
12099                                                           arg01, arg11)),
12100                                 arg10);
12101         }
12102
12103       /* Attempt to simplify equality/inequality comparisons of complex
12104          values.  Only lower the comparison if the result is known or
12105          can be simplified to a single scalar comparison.  */
12106       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12107            || TREE_CODE (arg0) == COMPLEX_CST)
12108           && (TREE_CODE (arg1) == COMPLEX_EXPR
12109               || TREE_CODE (arg1) == COMPLEX_CST))
12110         {
12111           tree real0, imag0, real1, imag1;
12112           tree rcond, icond;
12113
12114           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12115             {
12116               real0 = TREE_OPERAND (arg0, 0);
12117               imag0 = TREE_OPERAND (arg0, 1);
12118             }
12119           else
12120             {
12121               real0 = TREE_REALPART (arg0);
12122               imag0 = TREE_IMAGPART (arg0);
12123             }
12124
12125           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12126             {
12127               real1 = TREE_OPERAND (arg1, 0);
12128               imag1 = TREE_OPERAND (arg1, 1);
12129             }
12130           else
12131             {
12132               real1 = TREE_REALPART (arg1);
12133               imag1 = TREE_IMAGPART (arg1);
12134             }
12135
12136           rcond = fold_binary (code, type, real0, real1);
12137           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12138             {
12139               if (integer_zerop (rcond))
12140                 {
12141                   if (code == EQ_EXPR)
12142                     return omit_two_operands (type, boolean_false_node,
12143                                               imag0, imag1);
12144                   return fold_build2 (NE_EXPR, type, imag0, imag1);
12145                 }
12146               else
12147                 {
12148                   if (code == NE_EXPR)
12149                     return omit_two_operands (type, boolean_true_node,
12150                                               imag0, imag1);
12151                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
12152                 }
12153             }
12154
12155           icond = fold_binary (code, type, imag0, imag1);
12156           if (icond && TREE_CODE (icond) == INTEGER_CST)
12157             {
12158               if (integer_zerop (icond))
12159                 {
12160                   if (code == EQ_EXPR)
12161                     return omit_two_operands (type, boolean_false_node,
12162                                               real0, real1);
12163                   return fold_build2 (NE_EXPR, type, real0, real1);
12164                 }
12165               else
12166                 {
12167                   if (code == NE_EXPR)
12168                     return omit_two_operands (type, boolean_true_node,
12169                                               real0, real1);
12170                   return fold_build2 (EQ_EXPR, type, real0, real1);
12171                 }
12172             }
12173         }
12174
12175       return NULL_TREE;
12176
12177     case LT_EXPR:
12178     case GT_EXPR:
12179     case LE_EXPR:
12180     case GE_EXPR:
12181       tem = fold_comparison (code, type, op0, op1);
12182       if (tem != NULL_TREE)
12183         return tem;
12184
12185       /* Transform comparisons of the form X +- C CMP X.  */
12186       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12187           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12188           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12189                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12190               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12191                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12192         {
12193           tree arg01 = TREE_OPERAND (arg0, 1);
12194           enum tree_code code0 = TREE_CODE (arg0);
12195           int is_positive;
12196
12197           if (TREE_CODE (arg01) == REAL_CST)
12198             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12199           else
12200             is_positive = tree_int_cst_sgn (arg01);
12201
12202           /* (X - c) > X becomes false.  */
12203           if (code == GT_EXPR
12204               && ((code0 == MINUS_EXPR && is_positive >= 0)
12205                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12206             {
12207               if (TREE_CODE (arg01) == INTEGER_CST
12208                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12209                 fold_overflow_warning (("assuming signed overflow does not "
12210                                         "occur when assuming that (X - c) > X "
12211                                         "is always false"),
12212                                        WARN_STRICT_OVERFLOW_ALL);
12213               return constant_boolean_node (0, type);
12214             }
12215
12216           /* Likewise (X + c) < X becomes false.  */
12217           if (code == LT_EXPR
12218               && ((code0 == PLUS_EXPR && is_positive >= 0)
12219                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12220             {
12221               if (TREE_CODE (arg01) == INTEGER_CST
12222                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12223                 fold_overflow_warning (("assuming signed overflow does not "
12224                                         "occur when assuming that "
12225                                         "(X + c) < X is always false"),
12226                                        WARN_STRICT_OVERFLOW_ALL);
12227               return constant_boolean_node (0, type);
12228             }
12229
12230           /* Convert (X - c) <= X to true.  */
12231           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12232               && code == LE_EXPR
12233               && ((code0 == MINUS_EXPR && is_positive >= 0)
12234                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12235             {
12236               if (TREE_CODE (arg01) == INTEGER_CST
12237                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12238                 fold_overflow_warning (("assuming signed overflow does not "
12239                                         "occur when assuming that "
12240                                         "(X - c) <= X is always true"),
12241                                        WARN_STRICT_OVERFLOW_ALL);
12242               return constant_boolean_node (1, type);
12243             }
12244
12245           /* Convert (X + c) >= X to true.  */
12246           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12247               && code == GE_EXPR
12248               && ((code0 == PLUS_EXPR && is_positive >= 0)
12249                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12250             {
12251               if (TREE_CODE (arg01) == INTEGER_CST
12252                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12253                 fold_overflow_warning (("assuming signed overflow does not "
12254                                         "occur when assuming that "
12255                                         "(X + c) >= X is always true"),
12256                                        WARN_STRICT_OVERFLOW_ALL);
12257               return constant_boolean_node (1, type);
12258             }
12259
12260           if (TREE_CODE (arg01) == INTEGER_CST)
12261             {
12262               /* Convert X + c > X and X - c < X to true for integers.  */
12263               if (code == GT_EXPR
12264                   && ((code0 == PLUS_EXPR && is_positive > 0)
12265                       || (code0 == MINUS_EXPR && is_positive < 0)))
12266                 {
12267                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12268                     fold_overflow_warning (("assuming signed overflow does "
12269                                             "not occur when assuming that "
12270                                             "(X + c) > X is always true"),
12271                                            WARN_STRICT_OVERFLOW_ALL);
12272                   return constant_boolean_node (1, type);
12273                 }
12274
12275               if (code == LT_EXPR
12276                   && ((code0 == MINUS_EXPR && is_positive > 0)
12277                       || (code0 == PLUS_EXPR && is_positive < 0)))
12278                 {
12279                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12280                     fold_overflow_warning (("assuming signed overflow does "
12281                                             "not occur when assuming that "
12282                                             "(X - c) < X is always true"),
12283                                            WARN_STRICT_OVERFLOW_ALL);
12284                   return constant_boolean_node (1, type);
12285                 }
12286
12287               /* Convert X + c <= X and X - c >= X to false for integers.  */
12288               if (code == LE_EXPR
12289                   && ((code0 == PLUS_EXPR && is_positive > 0)
12290                       || (code0 == MINUS_EXPR && is_positive < 0)))
12291                 {
12292                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12293                     fold_overflow_warning (("assuming signed overflow does "
12294                                             "not occur when assuming that "
12295                                             "(X + c) <= X is always false"),
12296                                            WARN_STRICT_OVERFLOW_ALL);
12297                   return constant_boolean_node (0, type);
12298                 }
12299
12300               if (code == GE_EXPR
12301                   && ((code0 == MINUS_EXPR && is_positive > 0)
12302                       || (code0 == PLUS_EXPR && is_positive < 0)))
12303                 {
12304                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12305                     fold_overflow_warning (("assuming signed overflow does "
12306                                             "not occur when assuming that "
12307                                             "(X - c) >= X is always false"),
12308                                            WARN_STRICT_OVERFLOW_ALL);
12309                   return constant_boolean_node (0, type);
12310                 }
12311             }
12312         }
12313
12314       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
12315          This transformation affects the cases which are handled in later
12316          optimizations involving comparisons with non-negative constants.  */
12317       if (TREE_CODE (arg1) == INTEGER_CST
12318           && TREE_CODE (arg0) != INTEGER_CST
12319           && tree_int_cst_sgn (arg1) > 0)
12320         {
12321           if (code == GE_EXPR)
12322             {
12323               arg1 = const_binop (MINUS_EXPR, arg1,
12324                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12325               return fold_build2 (GT_EXPR, type, arg0,
12326                                   fold_convert (TREE_TYPE (arg0), arg1));
12327             }
12328           if (code == LT_EXPR)
12329             {
12330               arg1 = const_binop (MINUS_EXPR, arg1,
12331                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12332               return fold_build2 (LE_EXPR, type, arg0,
12333                                   fold_convert (TREE_TYPE (arg0), arg1));
12334             }
12335         }
12336
12337       /* Comparisons with the highest or lowest possible integer of
12338          the specified precision will have known values.  */
12339       {
12340         tree arg1_type = TREE_TYPE (arg1);
12341         unsigned int width = TYPE_PRECISION (arg1_type);
12342
12343         if (TREE_CODE (arg1) == INTEGER_CST
12344             && !TREE_OVERFLOW (arg1)
12345             && width <= 2 * HOST_BITS_PER_WIDE_INT
12346             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12347           {
12348             HOST_WIDE_INT signed_max_hi;
12349             unsigned HOST_WIDE_INT signed_max_lo;
12350             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12351
12352             if (width <= HOST_BITS_PER_WIDE_INT)
12353               {
12354                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12355                                 - 1;
12356                 signed_max_hi = 0;
12357                 max_hi = 0;
12358
12359                 if (TYPE_UNSIGNED (arg1_type))
12360                   {
12361                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12362                     min_lo = 0;
12363                     min_hi = 0;
12364                   }
12365                 else
12366                   {
12367                     max_lo = signed_max_lo;
12368                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12369                     min_hi = -1;
12370                   }
12371               }
12372             else
12373               {
12374                 width -= HOST_BITS_PER_WIDE_INT;
12375                 signed_max_lo = -1;
12376                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12377                                 - 1;
12378                 max_lo = -1;
12379                 min_lo = 0;
12380
12381                 if (TYPE_UNSIGNED (arg1_type))
12382                   {
12383                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12384                     min_hi = 0;
12385                   }
12386                 else
12387                   {
12388                     max_hi = signed_max_hi;
12389                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12390                   }
12391               }
12392
12393             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12394                 && TREE_INT_CST_LOW (arg1) == max_lo)
12395               switch (code)
12396                 {
12397                 case GT_EXPR:
12398                   return omit_one_operand (type, integer_zero_node, arg0);
12399
12400                 case GE_EXPR:
12401                   return fold_build2 (EQ_EXPR, type, op0, op1);
12402
12403                 case LE_EXPR:
12404                   return omit_one_operand (type, integer_one_node, arg0);
12405
12406                 case LT_EXPR:
12407                   return fold_build2 (NE_EXPR, type, op0, op1);
12408
12409                 /* The GE_EXPR and LT_EXPR cases above are not normally
12410                    reached because of previous transformations.  */
12411
12412                 default:
12413                   break;
12414                 }
12415             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12416                      == max_hi
12417                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12418               switch (code)
12419                 {
12420                 case GT_EXPR:
12421                   arg1 = const_binop (PLUS_EXPR, arg1,
12422                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12423                   return fold_build2 (EQ_EXPR, type,
12424                                       fold_convert (TREE_TYPE (arg1), arg0),
12425                                       arg1);
12426                 case LE_EXPR:
12427                   arg1 = const_binop (PLUS_EXPR, arg1,
12428                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12429                   return fold_build2 (NE_EXPR, type,
12430                                       fold_convert (TREE_TYPE (arg1), arg0),
12431                                       arg1);
12432                 default:
12433                   break;
12434                 }
12435             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12436                      == min_hi
12437                      && TREE_INT_CST_LOW (arg1) == min_lo)
12438               switch (code)
12439                 {
12440                 case LT_EXPR:
12441                   return omit_one_operand (type, integer_zero_node, arg0);
12442
12443                 case LE_EXPR:
12444                   return fold_build2 (EQ_EXPR, type, op0, op1);
12445
12446                 case GE_EXPR:
12447                   return omit_one_operand (type, integer_one_node, arg0);
12448
12449                 case GT_EXPR:
12450                   return fold_build2 (NE_EXPR, type, op0, op1);
12451
12452                 default:
12453                   break;
12454                 }
12455             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12456                      == min_hi
12457                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12458               switch (code)
12459                 {
12460                 case GE_EXPR:
12461                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12462                   return fold_build2 (NE_EXPR, type,
12463                                       fold_convert (TREE_TYPE (arg1), arg0),
12464                                       arg1);
12465                 case LT_EXPR:
12466                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12467                   return fold_build2 (EQ_EXPR, type,
12468                                       fold_convert (TREE_TYPE (arg1), arg0),
12469                                       arg1);
12470                 default:
12471                   break;
12472                 }
12473
12474             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
12475                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
12476                      && TYPE_UNSIGNED (arg1_type)
12477                      /* We will flip the signedness of the comparison operator
12478                         associated with the mode of arg1, so the sign bit is
12479                         specified by this mode.  Check that arg1 is the signed
12480                         max associated with this sign bit.  */
12481                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12482                      /* signed_type does not work on pointer types.  */
12483                      && INTEGRAL_TYPE_P (arg1_type))
12484               {
12485                 /* The following case also applies to X < signed_max+1
12486                    and X >= signed_max+1 because previous transformations.  */
12487                 if (code == LE_EXPR || code == GT_EXPR)
12488                   {
12489                     tree st;
12490                     st = signed_type_for (TREE_TYPE (arg1));
12491                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12492                                         type, fold_convert (st, arg0),
12493                                         build_int_cst (st, 0));
12494                   }
12495               }
12496           }
12497       }
12498
12499       /* If we are comparing an ABS_EXPR with a constant, we can
12500          convert all the cases into explicit comparisons, but they may
12501          well not be faster than doing the ABS and one comparison.
12502          But ABS (X) <= C is a range comparison, which becomes a subtraction
12503          and a comparison, and is probably faster.  */
12504       if (code == LE_EXPR
12505           && TREE_CODE (arg1) == INTEGER_CST
12506           && TREE_CODE (arg0) == ABS_EXPR
12507           && ! TREE_SIDE_EFFECTS (arg0)
12508           && (0 != (tem = negate_expr (arg1)))
12509           && TREE_CODE (tem) == INTEGER_CST
12510           && !TREE_OVERFLOW (tem))
12511         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12512                             build2 (GE_EXPR, type,
12513                                     TREE_OPERAND (arg0, 0), tem),
12514                             build2 (LE_EXPR, type,
12515                                     TREE_OPERAND (arg0, 0), arg1));
12516
12517       /* Convert ABS_EXPR<x> >= 0 to true.  */
12518       strict_overflow_p = false;
12519       if (code == GE_EXPR
12520           && (integer_zerop (arg1)
12521               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12522                   && real_zerop (arg1)))
12523           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12524         {
12525           if (strict_overflow_p)
12526             fold_overflow_warning (("assuming signed overflow does not occur "
12527                                     "when simplifying comparison of "
12528                                     "absolute value and zero"),
12529                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12530           return omit_one_operand (type, integer_one_node, arg0);
12531         }
12532
12533       /* Convert ABS_EXPR<x> < 0 to false.  */
12534       strict_overflow_p = false;
12535       if (code == LT_EXPR
12536           && (integer_zerop (arg1) || real_zerop (arg1))
12537           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12538         {
12539           if (strict_overflow_p)
12540             fold_overflow_warning (("assuming signed overflow does not occur "
12541                                     "when simplifying comparison of "
12542                                     "absolute value and zero"),
12543                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12544           return omit_one_operand (type, integer_zero_node, arg0);
12545         }
12546
12547       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12548          and similarly for >= into !=.  */
12549       if ((code == LT_EXPR || code == GE_EXPR)
12550           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12551           && TREE_CODE (arg1) == LSHIFT_EXPR
12552           && integer_onep (TREE_OPERAND (arg1, 0)))
12553         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12554                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12555                                TREE_OPERAND (arg1, 1)),
12556                        build_int_cst (TREE_TYPE (arg0), 0));
12557
12558       if ((code == LT_EXPR || code == GE_EXPR)
12559           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12560           && (TREE_CODE (arg1) == NOP_EXPR
12561               || TREE_CODE (arg1) == CONVERT_EXPR)
12562           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12563           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12564         return
12565           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12566                   fold_convert (TREE_TYPE (arg0),
12567                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12568                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12569                                                       1))),
12570                   build_int_cst (TREE_TYPE (arg0), 0));
12571
12572       return NULL_TREE;
12573
12574     case UNORDERED_EXPR:
12575     case ORDERED_EXPR:
12576     case UNLT_EXPR:
12577     case UNLE_EXPR:
12578     case UNGT_EXPR:
12579     case UNGE_EXPR:
12580     case UNEQ_EXPR:
12581     case LTGT_EXPR:
12582       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12583         {
12584           t1 = fold_relational_const (code, type, arg0, arg1);
12585           if (t1 != NULL_TREE)
12586             return t1;
12587         }
12588
12589       /* If the first operand is NaN, the result is constant.  */
12590       if (TREE_CODE (arg0) == REAL_CST
12591           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12592           && (code != LTGT_EXPR || ! flag_trapping_math))
12593         {
12594           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12595                ? integer_zero_node
12596                : integer_one_node;
12597           return omit_one_operand (type, t1, arg1);
12598         }
12599
12600       /* If the second operand is NaN, the result is constant.  */
12601       if (TREE_CODE (arg1) == REAL_CST
12602           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12603           && (code != LTGT_EXPR || ! flag_trapping_math))
12604         {
12605           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12606                ? integer_zero_node
12607                : integer_one_node;
12608           return omit_one_operand (type, t1, arg0);
12609         }
12610
12611       /* Simplify unordered comparison of something with itself.  */
12612       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12613           && operand_equal_p (arg0, arg1, 0))
12614         return constant_boolean_node (1, type);
12615
12616       if (code == LTGT_EXPR
12617           && !flag_trapping_math
12618           && operand_equal_p (arg0, arg1, 0))
12619         return constant_boolean_node (0, type);
12620
12621       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12622       {
12623         tree targ0 = strip_float_extensions (arg0);
12624         tree targ1 = strip_float_extensions (arg1);
12625         tree newtype = TREE_TYPE (targ0);
12626
12627         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12628           newtype = TREE_TYPE (targ1);
12629
12630         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12631           return fold_build2 (code, type, fold_convert (newtype, targ0),
12632                               fold_convert (newtype, targ1));
12633       }
12634
12635       return NULL_TREE;
12636
12637     case COMPOUND_EXPR:
12638       /* When pedantic, a compound expression can be neither an lvalue
12639          nor an integer constant expression.  */
12640       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12641         return NULL_TREE;
12642       /* Don't let (0, 0) be null pointer constant.  */
12643       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12644                                  : fold_convert (type, arg1);
12645       return pedantic_non_lvalue (tem);
12646
12647     case COMPLEX_EXPR:
12648       if ((TREE_CODE (arg0) == REAL_CST
12649            && TREE_CODE (arg1) == REAL_CST)
12650           || (TREE_CODE (arg0) == INTEGER_CST
12651               && TREE_CODE (arg1) == INTEGER_CST))
12652         return build_complex (type, arg0, arg1);
12653       return NULL_TREE;
12654
12655     case ASSERT_EXPR:
12656       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12657       gcc_unreachable ();
12658
12659     default:
12660       return NULL_TREE;
12661     } /* switch (code) */
12662 }
12663
12664 /* Callback for walk_tree, looking for LABEL_EXPR.
12665    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12666    Do not check the sub-tree of GOTO_EXPR.  */
12667
12668 static tree
12669 contains_label_1 (tree *tp,
12670                   int *walk_subtrees,
12671                   void *data ATTRIBUTE_UNUSED)
12672 {
12673   switch (TREE_CODE (*tp))
12674     {
12675     case LABEL_EXPR:
12676       return *tp;
12677     case GOTO_EXPR:
12678       *walk_subtrees = 0;
12679     /* no break */
12680     default:
12681       return NULL_TREE;
12682     }
12683 }
12684
12685 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12686    accessible from outside the sub-tree. Returns NULL_TREE if no
12687    addressable label is found.  */
12688
12689 static bool
12690 contains_label_p (tree st)
12691 {
12692   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12693 }
12694
12695 /* Fold a ternary expression of code CODE and type TYPE with operands
12696    OP0, OP1, and OP2.  Return the folded expression if folding is
12697    successful.  Otherwise, return NULL_TREE.  */
12698
12699 tree
12700 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12701 {
12702   tree tem;
12703   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12704   enum tree_code_class kind = TREE_CODE_CLASS (code);
12705
12706   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12707               && TREE_CODE_LENGTH (code) == 3);
12708
12709   /* Strip any conversions that don't change the mode.  This is safe
12710      for every expression, except for a comparison expression because
12711      its signedness is derived from its operands.  So, in the latter
12712      case, only strip conversions that don't change the signedness.
12713
12714      Note that this is done as an internal manipulation within the
12715      constant folder, in order to find the simplest representation of
12716      the arguments so that their form can be studied.  In any cases,
12717      the appropriate type conversions should be put back in the tree
12718      that will get out of the constant folder.  */
12719   if (op0)
12720     {
12721       arg0 = op0;
12722       STRIP_NOPS (arg0);
12723     }
12724
12725   if (op1)
12726     {
12727       arg1 = op1;
12728       STRIP_NOPS (arg1);
12729     }
12730
12731   switch (code)
12732     {
12733     case COMPONENT_REF:
12734       if (TREE_CODE (arg0) == CONSTRUCTOR
12735           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12736         {
12737           unsigned HOST_WIDE_INT idx;
12738           tree field, value;
12739           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12740             if (field == arg1)
12741               return value;
12742         }
12743       return NULL_TREE;
12744
12745     case COND_EXPR:
12746       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12747          so all simple results must be passed through pedantic_non_lvalue.  */
12748       if (TREE_CODE (arg0) == INTEGER_CST)
12749         {
12750           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12751           tem = integer_zerop (arg0) ? op2 : op1;
12752           /* Only optimize constant conditions when the selected branch
12753              has the same type as the COND_EXPR.  This avoids optimizing
12754              away "c ? x : throw", where the throw has a void type.
12755              Avoid throwing away that operand which contains label.  */
12756           if ((!TREE_SIDE_EFFECTS (unused_op)
12757                || !contains_label_p (unused_op))
12758               && (! VOID_TYPE_P (TREE_TYPE (tem))
12759                   || VOID_TYPE_P (type)))
12760             return pedantic_non_lvalue (tem);
12761           return NULL_TREE;
12762         }
12763       if (operand_equal_p (arg1, op2, 0))
12764         return pedantic_omit_one_operand (type, arg1, arg0);
12765
12766       /* If we have A op B ? A : C, we may be able to convert this to a
12767          simpler expression, depending on the operation and the values
12768          of B and C.  Signed zeros prevent all of these transformations,
12769          for reasons given above each one.
12770
12771          Also try swapping the arguments and inverting the conditional.  */
12772       if (COMPARISON_CLASS_P (arg0)
12773           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12774                                              arg1, TREE_OPERAND (arg0, 1))
12775           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12776         {
12777           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12778           if (tem)
12779             return tem;
12780         }
12781
12782       if (COMPARISON_CLASS_P (arg0)
12783           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12784                                              op2,
12785                                              TREE_OPERAND (arg0, 1))
12786           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12787         {
12788           tem = fold_truth_not_expr (arg0);
12789           if (tem && COMPARISON_CLASS_P (tem))
12790             {
12791               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12792               if (tem)
12793                 return tem;
12794             }
12795         }
12796
12797       /* If the second operand is simpler than the third, swap them
12798          since that produces better jump optimization results.  */
12799       if (truth_value_p (TREE_CODE (arg0))
12800           && tree_swap_operands_p (op1, op2, false))
12801         {
12802           /* See if this can be inverted.  If it can't, possibly because
12803              it was a floating-point inequality comparison, don't do
12804              anything.  */
12805           tem = fold_truth_not_expr (arg0);
12806           if (tem)
12807             return fold_build3 (code, type, tem, op2, op1);
12808         }
12809
12810       /* Convert A ? 1 : 0 to simply A.  */
12811       if (integer_onep (op1)
12812           && integer_zerop (op2)
12813           /* If we try to convert OP0 to our type, the
12814              call to fold will try to move the conversion inside
12815              a COND, which will recurse.  In that case, the COND_EXPR
12816              is probably the best choice, so leave it alone.  */
12817           && type == TREE_TYPE (arg0))
12818         return pedantic_non_lvalue (arg0);
12819
12820       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12821          over COND_EXPR in cases such as floating point comparisons.  */
12822       if (integer_zerop (op1)
12823           && integer_onep (op2)
12824           && truth_value_p (TREE_CODE (arg0)))
12825         return pedantic_non_lvalue (fold_convert (type,
12826                                                   invert_truthvalue (arg0)));
12827
12828       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12829       if (TREE_CODE (arg0) == LT_EXPR
12830           && integer_zerop (TREE_OPERAND (arg0, 1))
12831           && integer_zerop (op2)
12832           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12833         {
12834           /* sign_bit_p only checks ARG1 bits within A's precision.
12835              If <sign bit of A> has wider type than A, bits outside
12836              of A's precision in <sign bit of A> need to be checked.
12837              If they are all 0, this optimization needs to be done
12838              in unsigned A's type, if they are all 1 in signed A's type,
12839              otherwise this can't be done.  */
12840           if (TYPE_PRECISION (TREE_TYPE (tem))
12841               < TYPE_PRECISION (TREE_TYPE (arg1))
12842               && TYPE_PRECISION (TREE_TYPE (tem))
12843                  < TYPE_PRECISION (type))
12844             {
12845               unsigned HOST_WIDE_INT mask_lo;
12846               HOST_WIDE_INT mask_hi;
12847               int inner_width, outer_width;
12848               tree tem_type;
12849
12850               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12851               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12852               if (outer_width > TYPE_PRECISION (type))
12853                 outer_width = TYPE_PRECISION (type);
12854
12855               if (outer_width > HOST_BITS_PER_WIDE_INT)
12856                 {
12857                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12858                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12859                   mask_lo = -1;
12860                 }
12861               else
12862                 {
12863                   mask_hi = 0;
12864                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12865                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12866                 }
12867               if (inner_width > HOST_BITS_PER_WIDE_INT)
12868                 {
12869                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12870                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12871                   mask_lo = 0;
12872                 }
12873               else
12874                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12875                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12876
12877               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12878                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12879                 {
12880                   tem_type = signed_type_for (TREE_TYPE (tem));
12881                   tem = fold_convert (tem_type, tem);
12882                 }
12883               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12884                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12885                 {
12886                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12887                   tem = fold_convert (tem_type, tem);
12888                 }
12889               else
12890                 tem = NULL;
12891             }
12892
12893           if (tem)
12894             return fold_convert (type,
12895                                  fold_build2 (BIT_AND_EXPR,
12896                                               TREE_TYPE (tem), tem,
12897                                               fold_convert (TREE_TYPE (tem),
12898                                                             arg1)));
12899         }
12900
12901       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12902          already handled above.  */
12903       if (TREE_CODE (arg0) == BIT_AND_EXPR
12904           && integer_onep (TREE_OPERAND (arg0, 1))
12905           && integer_zerop (op2)
12906           && integer_pow2p (arg1))
12907         {
12908           tree tem = TREE_OPERAND (arg0, 0);
12909           STRIP_NOPS (tem);
12910           if (TREE_CODE (tem) == RSHIFT_EXPR
12911               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12912               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12913                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12914             return fold_build2 (BIT_AND_EXPR, type,
12915                                 TREE_OPERAND (tem, 0), arg1);
12916         }
12917
12918       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
12919          is probably obsolete because the first operand should be a
12920          truth value (that's why we have the two cases above), but let's
12921          leave it in until we can confirm this for all front-ends.  */
12922       if (integer_zerop (op2)
12923           && TREE_CODE (arg0) == NE_EXPR
12924           && integer_zerop (TREE_OPERAND (arg0, 1))
12925           && integer_pow2p (arg1)
12926           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12927           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12928                               arg1, OEP_ONLY_CONST))
12929         return pedantic_non_lvalue (fold_convert (type,
12930                                                   TREE_OPERAND (arg0, 0)));
12931
12932       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
12933       if (integer_zerop (op2)
12934           && truth_value_p (TREE_CODE (arg0))
12935           && truth_value_p (TREE_CODE (arg1)))
12936         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12937                             fold_convert (type, arg0),
12938                             arg1);
12939
12940       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
12941       if (integer_onep (op2)
12942           && truth_value_p (TREE_CODE (arg0))
12943           && truth_value_p (TREE_CODE (arg1)))
12944         {
12945           /* Only perform transformation if ARG0 is easily inverted.  */
12946           tem = fold_truth_not_expr (arg0);
12947           if (tem)
12948             return fold_build2 (TRUTH_ORIF_EXPR, type,
12949                                 fold_convert (type, tem),
12950                                 arg1);
12951         }
12952
12953       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
12954       if (integer_zerop (arg1)
12955           && truth_value_p (TREE_CODE (arg0))
12956           && truth_value_p (TREE_CODE (op2)))
12957         {
12958           /* Only perform transformation if ARG0 is easily inverted.  */
12959           tem = fold_truth_not_expr (arg0);
12960           if (tem)
12961             return fold_build2 (TRUTH_ANDIF_EXPR, type,
12962                                 fold_convert (type, tem),
12963                                 op2);
12964         }
12965
12966       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
12967       if (integer_onep (arg1)
12968           && truth_value_p (TREE_CODE (arg0))
12969           && truth_value_p (TREE_CODE (op2)))
12970         return fold_build2 (TRUTH_ORIF_EXPR, type,
12971                             fold_convert (type, arg0),
12972                             op2);
12973
12974       return NULL_TREE;
12975
12976     case CALL_EXPR:
12977       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
12978          of fold_ternary on them.  */
12979       gcc_unreachable ();
12980
12981     case BIT_FIELD_REF:
12982       if ((TREE_CODE (arg0) == VECTOR_CST
12983            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12984           && type == TREE_TYPE (TREE_TYPE (arg0)))
12985         {
12986           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12987           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12988
12989           if (width != 0
12990               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12991               && (idx % width) == 0
12992               && (idx = idx / width)
12993                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12994             {
12995               tree elements = NULL_TREE;
12996
12997               if (TREE_CODE (arg0) == VECTOR_CST)
12998                 elements = TREE_VECTOR_CST_ELTS (arg0);
12999               else
13000                 {
13001                   unsigned HOST_WIDE_INT idx;
13002                   tree value;
13003
13004                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
13005                     elements = tree_cons (NULL_TREE, value, elements);
13006                 }
13007               while (idx-- > 0 && elements)
13008                 elements = TREE_CHAIN (elements);
13009               if (elements)
13010                 return TREE_VALUE (elements);
13011               else
13012                 return fold_convert (type, integer_zero_node);
13013             }
13014         }
13015       return NULL_TREE;
13016
13017     default:
13018       return NULL_TREE;
13019     } /* switch (code) */
13020 }
13021
13022 /* Perform constant folding and related simplification of EXPR.
13023    The related simplifications include x*1 => x, x*0 => 0, etc.,
13024    and application of the associative law.
13025    NOP_EXPR conversions may be removed freely (as long as we
13026    are careful not to change the type of the overall expression).
13027    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13028    but we can constant-fold them if they have constant operands.  */
13029
13030 #ifdef ENABLE_FOLD_CHECKING
13031 # define fold(x) fold_1 (x)
13032 static tree fold_1 (tree);
13033 static
13034 #endif
13035 tree
13036 fold (tree expr)
13037 {
13038   const tree t = expr;
13039   enum tree_code code = TREE_CODE (t);
13040   enum tree_code_class kind = TREE_CODE_CLASS (code);
13041   tree tem;
13042
13043   /* Return right away if a constant.  */
13044   if (kind == tcc_constant)
13045     return t;
13046
13047   /* CALL_EXPR-like objects with variable numbers of operands are
13048      treated specially.  */
13049   if (kind == tcc_vl_exp)
13050     {
13051       if (code == CALL_EXPR)
13052         {
13053           tem = fold_call_expr (expr, false);
13054           return tem ? tem : expr;
13055         }
13056       return expr;
13057     }
13058
13059   if (IS_EXPR_CODE_CLASS (kind)
13060       || IS_GIMPLE_STMT_CODE_CLASS (kind))
13061     {
13062       tree type = TREE_TYPE (t);
13063       tree op0, op1, op2;
13064
13065       switch (TREE_CODE_LENGTH (code))
13066         {
13067         case 1:
13068           op0 = TREE_OPERAND (t, 0);
13069           tem = fold_unary (code, type, op0);
13070           return tem ? tem : expr;
13071         case 2:
13072           op0 = TREE_OPERAND (t, 0);
13073           op1 = TREE_OPERAND (t, 1);
13074           tem = fold_binary (code, type, op0, op1);
13075           return tem ? tem : expr;
13076         case 3:
13077           op0 = TREE_OPERAND (t, 0);
13078           op1 = TREE_OPERAND (t, 1);
13079           op2 = TREE_OPERAND (t, 2);
13080           tem = fold_ternary (code, type, op0, op1, op2);
13081           return tem ? tem : expr;
13082         default:
13083           break;
13084         }
13085     }
13086
13087   switch (code)
13088     {
13089     case ARRAY_REF:
13090       {
13091         tree op0 = TREE_OPERAND (t, 0);
13092         tree op1 = TREE_OPERAND (t, 1);
13093
13094         if (TREE_CODE (op1) == INTEGER_CST
13095             && TREE_CODE (op0) == CONSTRUCTOR
13096             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
13097           {
13098             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
13099             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
13100             unsigned HOST_WIDE_INT begin = 0;
13101
13102             /* Find a matching index by means of a binary search.  */
13103             while (begin != end)
13104               {
13105                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
13106                 tree index = VEC_index (constructor_elt, elts, middle)->index;
13107
13108                 if (TREE_CODE (index) == INTEGER_CST
13109                     && tree_int_cst_lt (index, op1))
13110                   begin = middle + 1;
13111                 else if (TREE_CODE (index) == INTEGER_CST
13112                          && tree_int_cst_lt (op1, index))
13113                   end = middle;
13114                 else if (TREE_CODE (index) == RANGE_EXPR
13115                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
13116                   begin = middle + 1;
13117                 else if (TREE_CODE (index) == RANGE_EXPR
13118                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
13119                   end = middle;
13120                 else
13121                   return VEC_index (constructor_elt, elts, middle)->value;
13122               }
13123           }
13124
13125         return t;
13126       }
13127
13128     case CONST_DECL:
13129       return fold (DECL_INITIAL (t));
13130
13131     default:
13132       return t;
13133     } /* switch (code) */
13134 }
13135
13136 #ifdef ENABLE_FOLD_CHECKING
13137 #undef fold
13138
13139 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13140 static void fold_check_failed (const_tree, const_tree);
13141 void print_fold_checksum (const_tree);
13142
13143 /* When --enable-checking=fold, compute a digest of expr before
13144    and after actual fold call to see if fold did not accidentally
13145    change original expr.  */
13146
13147 tree
13148 fold (tree expr)
13149 {
13150   tree ret;
13151   struct md5_ctx ctx;
13152   unsigned char checksum_before[16], checksum_after[16];
13153   htab_t ht;
13154
13155   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13156   md5_init_ctx (&ctx);
13157   fold_checksum_tree (expr, &ctx, ht);
13158   md5_finish_ctx (&ctx, checksum_before);
13159   htab_empty (ht);
13160
13161   ret = fold_1 (expr);
13162
13163   md5_init_ctx (&ctx);
13164   fold_checksum_tree (expr, &ctx, ht);
13165   md5_finish_ctx (&ctx, checksum_after);
13166   htab_delete (ht);
13167
13168   if (memcmp (checksum_before, checksum_after, 16))
13169     fold_check_failed (expr, ret);
13170
13171   return ret;
13172 }
13173
13174 void
13175 print_fold_checksum (const_tree expr)
13176 {
13177   struct md5_ctx ctx;
13178   unsigned char checksum[16], cnt;
13179   htab_t ht;
13180
13181   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13182   md5_init_ctx (&ctx);
13183   fold_checksum_tree (expr, &ctx, ht);
13184   md5_finish_ctx (&ctx, checksum);
13185   htab_delete (ht);
13186   for (cnt = 0; cnt < 16; ++cnt)
13187     fprintf (stderr, "%02x", checksum[cnt]);
13188   putc ('\n', stderr);
13189 }
13190
13191 static void
13192 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13193 {
13194   internal_error ("fold check: original tree changed by fold");
13195 }
13196
13197 static void
13198 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13199 {
13200   const void **slot;
13201   enum tree_code code;
13202   struct tree_function_decl buf;
13203   int i, len;
13204   
13205 recursive_label:
13206
13207   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13208                <= sizeof (struct tree_function_decl))
13209               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13210   if (expr == NULL)
13211     return;
13212   slot = (const void **) htab_find_slot (ht, expr, INSERT);
13213   if (*slot != NULL)
13214     return;
13215   *slot = expr;
13216   code = TREE_CODE (expr);
13217   if (TREE_CODE_CLASS (code) == tcc_declaration
13218       && DECL_ASSEMBLER_NAME_SET_P (expr))
13219     {
13220       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
13221       memcpy ((char *) &buf, expr, tree_size (expr));
13222       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13223       expr = (tree) &buf;
13224     }
13225   else if (TREE_CODE_CLASS (code) == tcc_type
13226            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
13227                || TYPE_CACHED_VALUES_P (expr)
13228                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
13229     {
13230       /* Allow these fields to be modified.  */
13231       tree tmp;
13232       memcpy ((char *) &buf, expr, tree_size (expr));
13233       expr = tmp = (tree) &buf;
13234       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13235       TYPE_POINTER_TO (tmp) = NULL;
13236       TYPE_REFERENCE_TO (tmp) = NULL;
13237       if (TYPE_CACHED_VALUES_P (tmp))
13238         {
13239           TYPE_CACHED_VALUES_P (tmp) = 0;
13240           TYPE_CACHED_VALUES (tmp) = NULL;
13241         }
13242     }
13243   md5_process_bytes (expr, tree_size (expr), ctx);
13244   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13245   if (TREE_CODE_CLASS (code) != tcc_type
13246       && TREE_CODE_CLASS (code) != tcc_declaration
13247       && code != TREE_LIST
13248       && code != SSA_NAME)
13249     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13250   switch (TREE_CODE_CLASS (code))
13251     {
13252     case tcc_constant:
13253       switch (code)
13254         {
13255         case STRING_CST:
13256           md5_process_bytes (TREE_STRING_POINTER (expr),
13257                              TREE_STRING_LENGTH (expr), ctx);
13258           break;
13259         case COMPLEX_CST:
13260           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13261           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13262           break;
13263         case VECTOR_CST:
13264           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13265           break;
13266         default:
13267           break;
13268         }
13269       break;
13270     case tcc_exceptional:
13271       switch (code)
13272         {
13273         case TREE_LIST:
13274           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13275           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13276           expr = TREE_CHAIN (expr);
13277           goto recursive_label;
13278           break;
13279         case TREE_VEC:
13280           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13281             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13282           break;
13283         default:
13284           break;
13285         }
13286       break;
13287     case tcc_expression:
13288     case tcc_reference:
13289     case tcc_comparison:
13290     case tcc_unary:
13291     case tcc_binary:
13292     case tcc_statement:
13293     case tcc_vl_exp:
13294       len = TREE_OPERAND_LENGTH (expr);
13295       for (i = 0; i < len; ++i)
13296         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13297       break;
13298     case tcc_declaration:
13299       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13300       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13301       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13302         {
13303           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13304           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13305           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13306           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13307           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13308         }
13309       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13310         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13311           
13312       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13313         {
13314           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13315           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13316           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13317         }
13318       break;
13319     case tcc_type:
13320       if (TREE_CODE (expr) == ENUMERAL_TYPE)
13321         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13322       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13323       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13324       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13325       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13326       if (INTEGRAL_TYPE_P (expr)
13327           || SCALAR_FLOAT_TYPE_P (expr))
13328         {
13329           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13330           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13331         }
13332       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13333       if (TREE_CODE (expr) == RECORD_TYPE
13334           || TREE_CODE (expr) == UNION_TYPE
13335           || TREE_CODE (expr) == QUAL_UNION_TYPE)
13336         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13337       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13338       break;
13339     default:
13340       break;
13341     }
13342 }
13343
13344 /* Helper function for outputting the checksum of a tree T.  When
13345    debugging with gdb, you can "define mynext" to be "next" followed
13346    by "call debug_fold_checksum (op0)", then just trace down till the
13347    outputs differ.  */
13348
13349 void
13350 debug_fold_checksum (const_tree t)
13351 {
13352   int i;
13353   unsigned char checksum[16];
13354   struct md5_ctx ctx;
13355   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13356   
13357   md5_init_ctx (&ctx);
13358   fold_checksum_tree (t, &ctx, ht);
13359   md5_finish_ctx (&ctx, checksum);
13360   htab_empty (ht);
13361
13362   for (i = 0; i < 16; i++)
13363     fprintf (stderr, "%d ", checksum[i]);
13364
13365   fprintf (stderr, "\n");
13366 }
13367
13368 #endif
13369
13370 /* Fold a unary tree expression with code CODE of type TYPE with an
13371    operand OP0.  Return a folded expression if successful.  Otherwise,
13372    return a tree expression with code CODE of type TYPE with an
13373    operand OP0.  */
13374
13375 tree
13376 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13377 {
13378   tree tem;
13379 #ifdef ENABLE_FOLD_CHECKING
13380   unsigned char checksum_before[16], checksum_after[16];
13381   struct md5_ctx ctx;
13382   htab_t ht;
13383
13384   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13385   md5_init_ctx (&ctx);
13386   fold_checksum_tree (op0, &ctx, ht);
13387   md5_finish_ctx (&ctx, checksum_before);
13388   htab_empty (ht);
13389 #endif
13390   
13391   tem = fold_unary (code, type, op0);
13392   if (!tem)
13393     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13394   
13395 #ifdef ENABLE_FOLD_CHECKING
13396   md5_init_ctx (&ctx);
13397   fold_checksum_tree (op0, &ctx, ht);
13398   md5_finish_ctx (&ctx, checksum_after);
13399   htab_delete (ht);
13400
13401   if (memcmp (checksum_before, checksum_after, 16))
13402     fold_check_failed (op0, tem);
13403 #endif
13404   return tem;
13405 }
13406
13407 /* Fold a binary tree expression with code CODE of type TYPE with
13408    operands OP0 and OP1.  Return a folded expression if successful.
13409    Otherwise, return a tree expression with code CODE of type TYPE
13410    with operands OP0 and OP1.  */
13411
13412 tree
13413 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13414                   MEM_STAT_DECL)
13415 {
13416   tree tem;
13417 #ifdef ENABLE_FOLD_CHECKING
13418   unsigned char checksum_before_op0[16],
13419                 checksum_before_op1[16],
13420                 checksum_after_op0[16],
13421                 checksum_after_op1[16];
13422   struct md5_ctx ctx;
13423   htab_t ht;
13424
13425   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13426   md5_init_ctx (&ctx);
13427   fold_checksum_tree (op0, &ctx, ht);
13428   md5_finish_ctx (&ctx, checksum_before_op0);
13429   htab_empty (ht);
13430
13431   md5_init_ctx (&ctx);
13432   fold_checksum_tree (op1, &ctx, ht);
13433   md5_finish_ctx (&ctx, checksum_before_op1);
13434   htab_empty (ht);
13435 #endif
13436
13437   tem = fold_binary (code, type, op0, op1);
13438   if (!tem)
13439     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13440   
13441 #ifdef ENABLE_FOLD_CHECKING
13442   md5_init_ctx (&ctx);
13443   fold_checksum_tree (op0, &ctx, ht);
13444   md5_finish_ctx (&ctx, checksum_after_op0);
13445   htab_empty (ht);
13446
13447   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13448     fold_check_failed (op0, tem);
13449   
13450   md5_init_ctx (&ctx);
13451   fold_checksum_tree (op1, &ctx, ht);
13452   md5_finish_ctx (&ctx, checksum_after_op1);
13453   htab_delete (ht);
13454
13455   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13456     fold_check_failed (op1, tem);
13457 #endif
13458   return tem;
13459 }
13460
13461 /* Fold a ternary tree expression with code CODE of type TYPE with
13462    operands OP0, OP1, and OP2.  Return a folded expression if
13463    successful.  Otherwise, return a tree expression with code CODE of
13464    type TYPE with operands OP0, OP1, and OP2.  */
13465
13466 tree
13467 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
13468              MEM_STAT_DECL)
13469 {
13470   tree tem;
13471 #ifdef ENABLE_FOLD_CHECKING
13472   unsigned char checksum_before_op0[16],
13473                 checksum_before_op1[16],
13474                 checksum_before_op2[16],
13475                 checksum_after_op0[16],
13476                 checksum_after_op1[16],
13477                 checksum_after_op2[16];
13478   struct md5_ctx ctx;
13479   htab_t ht;
13480
13481   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13482   md5_init_ctx (&ctx);
13483   fold_checksum_tree (op0, &ctx, ht);
13484   md5_finish_ctx (&ctx, checksum_before_op0);
13485   htab_empty (ht);
13486
13487   md5_init_ctx (&ctx);
13488   fold_checksum_tree (op1, &ctx, ht);
13489   md5_finish_ctx (&ctx, checksum_before_op1);
13490   htab_empty (ht);
13491
13492   md5_init_ctx (&ctx);
13493   fold_checksum_tree (op2, &ctx, ht);
13494   md5_finish_ctx (&ctx, checksum_before_op2);
13495   htab_empty (ht);
13496 #endif
13497
13498   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
13499   tem = fold_ternary (code, type, op0, op1, op2);
13500   if (!tem)
13501     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
13502       
13503 #ifdef ENABLE_FOLD_CHECKING
13504   md5_init_ctx (&ctx);
13505   fold_checksum_tree (op0, &ctx, ht);
13506   md5_finish_ctx (&ctx, checksum_after_op0);
13507   htab_empty (ht);
13508
13509   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13510     fold_check_failed (op0, tem);
13511   
13512   md5_init_ctx (&ctx);
13513   fold_checksum_tree (op1, &ctx, ht);
13514   md5_finish_ctx (&ctx, checksum_after_op1);
13515   htab_empty (ht);
13516
13517   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13518     fold_check_failed (op1, tem);
13519   
13520   md5_init_ctx (&ctx);
13521   fold_checksum_tree (op2, &ctx, ht);
13522   md5_finish_ctx (&ctx, checksum_after_op2);
13523   htab_delete (ht);
13524
13525   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
13526     fold_check_failed (op2, tem);
13527 #endif
13528   return tem;
13529 }
13530
13531 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
13532    arguments in ARGARRAY, and a null static chain.
13533    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
13534    of type TYPE from the given operands as constructed by build_call_array.  */
13535
13536 tree
13537 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
13538 {
13539   tree tem;
13540 #ifdef ENABLE_FOLD_CHECKING
13541   unsigned char checksum_before_fn[16],
13542                 checksum_before_arglist[16],
13543                 checksum_after_fn[16],
13544                 checksum_after_arglist[16];
13545   struct md5_ctx ctx;
13546   htab_t ht;
13547   int i;
13548
13549   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13550   md5_init_ctx (&ctx);
13551   fold_checksum_tree (fn, &ctx, ht);
13552   md5_finish_ctx (&ctx, checksum_before_fn);
13553   htab_empty (ht);
13554
13555   md5_init_ctx (&ctx);
13556   for (i = 0; i < nargs; i++)
13557     fold_checksum_tree (argarray[i], &ctx, ht);
13558   md5_finish_ctx (&ctx, checksum_before_arglist);
13559   htab_empty (ht);
13560 #endif
13561
13562   tem = fold_builtin_call_array (type, fn, nargs, argarray);
13563       
13564 #ifdef ENABLE_FOLD_CHECKING
13565   md5_init_ctx (&ctx);
13566   fold_checksum_tree (fn, &ctx, ht);
13567   md5_finish_ctx (&ctx, checksum_after_fn);
13568   htab_empty (ht);
13569
13570   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13571     fold_check_failed (fn, tem);
13572   
13573   md5_init_ctx (&ctx);
13574   for (i = 0; i < nargs; i++)
13575     fold_checksum_tree (argarray[i], &ctx, ht);
13576   md5_finish_ctx (&ctx, checksum_after_arglist);
13577   htab_delete (ht);
13578
13579   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13580     fold_check_failed (NULL_TREE, tem);
13581 #endif
13582   return tem;
13583 }
13584
13585 /* Perform constant folding and related simplification of initializer
13586    expression EXPR.  These behave identically to "fold_buildN" but ignore
13587    potential run-time traps and exceptions that fold must preserve.  */
13588
13589 #define START_FOLD_INIT \
13590   int saved_signaling_nans = flag_signaling_nans;\
13591   int saved_trapping_math = flag_trapping_math;\
13592   int saved_rounding_math = flag_rounding_math;\
13593   int saved_trapv = flag_trapv;\
13594   int saved_folding_initializer = folding_initializer;\
13595   flag_signaling_nans = 0;\
13596   flag_trapping_math = 0;\
13597   flag_rounding_math = 0;\
13598   flag_trapv = 0;\
13599   folding_initializer = 1;
13600
13601 #define END_FOLD_INIT \
13602   flag_signaling_nans = saved_signaling_nans;\
13603   flag_trapping_math = saved_trapping_math;\
13604   flag_rounding_math = saved_rounding_math;\
13605   flag_trapv = saved_trapv;\
13606   folding_initializer = saved_folding_initializer;
13607
13608 tree
13609 fold_build1_initializer (enum tree_code code, tree type, tree op)
13610 {
13611   tree result;
13612   START_FOLD_INIT;
13613
13614   result = fold_build1 (code, type, op);
13615
13616   END_FOLD_INIT;
13617   return result;
13618 }
13619
13620 tree
13621 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13622 {
13623   tree result;
13624   START_FOLD_INIT;
13625
13626   result = fold_build2 (code, type, op0, op1);
13627
13628   END_FOLD_INIT;
13629   return result;
13630 }
13631
13632 tree
13633 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13634                          tree op2)
13635 {
13636   tree result;
13637   START_FOLD_INIT;
13638
13639   result = fold_build3 (code, type, op0, op1, op2);
13640
13641   END_FOLD_INIT;
13642   return result;
13643 }
13644
13645 tree
13646 fold_build_call_array_initializer (tree type, tree fn,
13647                                    int nargs, tree *argarray)
13648 {
13649   tree result;
13650   START_FOLD_INIT;
13651
13652   result = fold_build_call_array (type, fn, nargs, argarray);
13653
13654   END_FOLD_INIT;
13655   return result;
13656 }
13657
13658 #undef START_FOLD_INIT
13659 #undef END_FOLD_INIT
13660
13661 /* Determine if first argument is a multiple of second argument.  Return 0 if
13662    it is not, or we cannot easily determined it to be.
13663
13664    An example of the sort of thing we care about (at this point; this routine
13665    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13666    fold cases do now) is discovering that
13667
13668      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13669
13670    is a multiple of
13671
13672      SAVE_EXPR (J * 8)
13673
13674    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13675
13676    This code also handles discovering that
13677
13678      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13679
13680    is a multiple of 8 so we don't have to worry about dealing with a
13681    possible remainder.
13682
13683    Note that we *look* inside a SAVE_EXPR only to determine how it was
13684    calculated; it is not safe for fold to do much of anything else with the
13685    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13686    at run time.  For example, the latter example above *cannot* be implemented
13687    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13688    evaluation time of the original SAVE_EXPR is not necessarily the same at
13689    the time the new expression is evaluated.  The only optimization of this
13690    sort that would be valid is changing
13691
13692      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13693
13694    divided by 8 to
13695
13696      SAVE_EXPR (I) * SAVE_EXPR (J)
13697
13698    (where the same SAVE_EXPR (J) is used in the original and the
13699    transformed version).  */
13700
13701 int
13702 multiple_of_p (tree type, const_tree top, const_tree bottom)
13703 {
13704   if (operand_equal_p (top, bottom, 0))
13705     return 1;
13706
13707   if (TREE_CODE (type) != INTEGER_TYPE)
13708     return 0;
13709
13710   switch (TREE_CODE (top))
13711     {
13712     case BIT_AND_EXPR:
13713       /* Bitwise and provides a power of two multiple.  If the mask is
13714          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13715       if (!integer_pow2p (bottom))
13716         return 0;
13717       /* FALLTHRU */
13718
13719     case MULT_EXPR:
13720       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13721               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13722
13723     case PLUS_EXPR:
13724     case MINUS_EXPR:
13725       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13726               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13727
13728     case LSHIFT_EXPR:
13729       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13730         {
13731           tree op1, t1;
13732
13733           op1 = TREE_OPERAND (top, 1);
13734           /* const_binop may not detect overflow correctly,
13735              so check for it explicitly here.  */
13736           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13737               > TREE_INT_CST_LOW (op1)
13738               && TREE_INT_CST_HIGH (op1) == 0
13739               && 0 != (t1 = fold_convert (type,
13740                                           const_binop (LSHIFT_EXPR,
13741                                                        size_one_node,
13742                                                        op1, 0)))
13743               && !TREE_OVERFLOW (t1))
13744             return multiple_of_p (type, t1, bottom);
13745         }
13746       return 0;
13747
13748     case NOP_EXPR:
13749       /* Can't handle conversions from non-integral or wider integral type.  */
13750       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13751           || (TYPE_PRECISION (type)
13752               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13753         return 0;
13754
13755       /* .. fall through ...  */
13756
13757     case SAVE_EXPR:
13758       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13759
13760     case INTEGER_CST:
13761       if (TREE_CODE (bottom) != INTEGER_CST
13762           || integer_zerop (bottom)
13763           || (TYPE_UNSIGNED (type)
13764               && (tree_int_cst_sgn (top) < 0
13765                   || tree_int_cst_sgn (bottom) < 0)))
13766         return 0;
13767       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13768                                              top, bottom, 0));
13769
13770     default:
13771       return 0;
13772     }
13773 }
13774
13775 /* Return true if CODE or TYPE is known to be non-negative. */
13776
13777 static bool
13778 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
13779 {
13780   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13781       && truth_value_p (code))
13782     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13783        have a signed:1 type (where the value is -1 and 0).  */
13784     return true;
13785   return false;
13786 }
13787
13788 /* Return true if (CODE OP0) is known to be non-negative.  If the return
13789    value is based on the assumption that signed overflow is undefined,
13790    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13791    *STRICT_OVERFLOW_P.  */
13792
13793 bool
13794 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13795                                 bool *strict_overflow_p)
13796 {
13797   if (TYPE_UNSIGNED (type))
13798     return true;
13799
13800   switch (code)
13801     {
13802     case ABS_EXPR:
13803       /* We can't return 1 if flag_wrapv is set because
13804          ABS_EXPR<INT_MIN> = INT_MIN.  */
13805       if (!INTEGRAL_TYPE_P (type))
13806         return true;
13807       if (TYPE_OVERFLOW_UNDEFINED (type))
13808         {
13809           *strict_overflow_p = true;
13810           return true;
13811         }
13812       break;
13813
13814     case NON_LVALUE_EXPR:
13815     case FLOAT_EXPR:
13816     case FIX_TRUNC_EXPR:
13817       return tree_expr_nonnegative_warnv_p (op0,
13818                                             strict_overflow_p);
13819
13820     case NOP_EXPR:
13821       {
13822         tree inner_type = TREE_TYPE (op0);
13823         tree outer_type = type;
13824
13825         if (TREE_CODE (outer_type) == REAL_TYPE)
13826           {
13827             if (TREE_CODE (inner_type) == REAL_TYPE)
13828               return tree_expr_nonnegative_warnv_p (op0,
13829                                                     strict_overflow_p);
13830             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13831               {
13832                 if (TYPE_UNSIGNED (inner_type))
13833                   return true;
13834                 return tree_expr_nonnegative_warnv_p (op0,
13835                                                       strict_overflow_p);
13836               }
13837           }
13838         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13839           {
13840             if (TREE_CODE (inner_type) == REAL_TYPE)
13841               return tree_expr_nonnegative_warnv_p (op0,
13842                                                     strict_overflow_p);
13843             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13844               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13845                       && TYPE_UNSIGNED (inner_type);
13846           }
13847       }
13848       break;
13849
13850     default:
13851       return tree_simple_nonnegative_warnv_p (code, type);
13852     }
13853
13854   /* We don't know sign of `t', so be conservative and return false.  */
13855   return false;
13856 }
13857
13858 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
13859    value is based on the assumption that signed overflow is undefined,
13860    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13861    *STRICT_OVERFLOW_P.  */
13862
13863 bool
13864 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13865                                       tree op1, bool *strict_overflow_p)
13866 {
13867   if (TYPE_UNSIGNED (type))
13868     return true;
13869
13870   switch (code)
13871     {
13872     case POINTER_PLUS_EXPR:
13873     case PLUS_EXPR:
13874       if (FLOAT_TYPE_P (type))
13875         return (tree_expr_nonnegative_warnv_p (op0,
13876                                                strict_overflow_p)
13877                 && tree_expr_nonnegative_warnv_p (op1,
13878                                                   strict_overflow_p));
13879
13880       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13881          both unsigned and at least 2 bits shorter than the result.  */
13882       if (TREE_CODE (type) == INTEGER_TYPE
13883           && TREE_CODE (op0) == NOP_EXPR
13884           && TREE_CODE (op1) == NOP_EXPR)
13885         {
13886           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13887           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13888           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13889               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13890             {
13891               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13892                                        TYPE_PRECISION (inner2)) + 1;
13893               return prec < TYPE_PRECISION (type);
13894             }
13895         }
13896       break;
13897
13898     case MULT_EXPR:
13899       if (FLOAT_TYPE_P (type))
13900         {
13901           /* x * x for floating point x is always non-negative.  */
13902           if (operand_equal_p (op0, op1, 0))
13903             return true;
13904           return (tree_expr_nonnegative_warnv_p (op0,
13905                                                  strict_overflow_p)
13906                   && tree_expr_nonnegative_warnv_p (op1,
13907                                                     strict_overflow_p));
13908         }
13909
13910       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13911          both unsigned and their total bits is shorter than the result.  */
13912       if (TREE_CODE (type) == INTEGER_TYPE
13913           && TREE_CODE (op0) == NOP_EXPR
13914           && TREE_CODE (op1) == NOP_EXPR)
13915         {
13916           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13917           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13918           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13919               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13920             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13921                    < TYPE_PRECISION (type);
13922         }
13923       return false;
13924
13925     case BIT_AND_EXPR:
13926     case MAX_EXPR:
13927       return (tree_expr_nonnegative_warnv_p (op0,
13928                                              strict_overflow_p)
13929               || tree_expr_nonnegative_warnv_p (op1,
13930                                                 strict_overflow_p));
13931
13932     case BIT_IOR_EXPR:
13933     case BIT_XOR_EXPR:
13934     case MIN_EXPR:
13935     case RDIV_EXPR:
13936     case TRUNC_DIV_EXPR:
13937     case CEIL_DIV_EXPR:
13938     case FLOOR_DIV_EXPR:
13939     case ROUND_DIV_EXPR:
13940       return (tree_expr_nonnegative_warnv_p (op0,
13941                                              strict_overflow_p)
13942               && tree_expr_nonnegative_warnv_p (op1,
13943                                                 strict_overflow_p));
13944
13945     case TRUNC_MOD_EXPR:
13946     case CEIL_MOD_EXPR:
13947     case FLOOR_MOD_EXPR:
13948     case ROUND_MOD_EXPR:
13949       return tree_expr_nonnegative_warnv_p (op0,
13950                                             strict_overflow_p);
13951     default:
13952       return tree_simple_nonnegative_warnv_p (code, type);
13953     }
13954
13955   /* We don't know sign of `t', so be conservative and return false.  */
13956   return false;
13957 }
13958
13959 /* Return true if T is known to be non-negative.  If the return
13960    value is based on the assumption that signed overflow is undefined,
13961    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13962    *STRICT_OVERFLOW_P.  */
13963
13964 bool
13965 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13966 {
13967   if (TYPE_UNSIGNED (TREE_TYPE (t)))
13968     return true;
13969
13970   switch (TREE_CODE (t))
13971     {
13972     case SSA_NAME:
13973       /* Query VRP to see if it has recorded any information about
13974          the range of this object.  */
13975       return ssa_name_nonnegative_p (t);
13976
13977     case INTEGER_CST:
13978       return tree_int_cst_sgn (t) >= 0;
13979
13980     case REAL_CST:
13981       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13982
13983     case FIXED_CST:
13984       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
13985
13986     case COND_EXPR:
13987       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13988                                              strict_overflow_p)
13989               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13990                                                 strict_overflow_p));
13991     default:
13992       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
13993                                                    TREE_TYPE (t));
13994     }
13995   /* We don't know sign of `t', so be conservative and return false.  */
13996   return false;
13997 }
13998
13999 /* Return true if T is known to be non-negative.  If the return
14000    value is based on the assumption that signed overflow is undefined,
14001    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14002    *STRICT_OVERFLOW_P.  */
14003
14004 bool
14005 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14006 {
14007   enum tree_code code = TREE_CODE (t);
14008   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14009     return true;
14010
14011   switch (code)
14012     {
14013     case TARGET_EXPR:
14014       {
14015         tree temp = TARGET_EXPR_SLOT (t);
14016         t = TARGET_EXPR_INITIAL (t);
14017
14018         /* If the initializer is non-void, then it's a normal expression
14019            that will be assigned to the slot.  */
14020         if (!VOID_TYPE_P (t))
14021           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
14022
14023         /* Otherwise, the initializer sets the slot in some way.  One common
14024            way is an assignment statement at the end of the initializer.  */
14025         while (1)
14026           {
14027             if (TREE_CODE (t) == BIND_EXPR)
14028               t = expr_last (BIND_EXPR_BODY (t));
14029             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
14030                      || TREE_CODE (t) == TRY_CATCH_EXPR)
14031               t = expr_last (TREE_OPERAND (t, 0));
14032             else if (TREE_CODE (t) == STATEMENT_LIST)
14033               t = expr_last (t);
14034             else
14035               break;
14036           }
14037         if ((TREE_CODE (t) == MODIFY_EXPR
14038              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
14039             && GENERIC_TREE_OPERAND (t, 0) == temp)
14040           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14041                                                 strict_overflow_p);
14042
14043         return false;
14044       }
14045
14046     case CALL_EXPR:
14047       {
14048         tree fndecl = get_callee_fndecl (t);
14049         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14050           switch (DECL_FUNCTION_CODE (fndecl))
14051             {
14052             CASE_FLT_FN (BUILT_IN_ACOS):
14053             CASE_FLT_FN (BUILT_IN_ACOSH):
14054             CASE_FLT_FN (BUILT_IN_CABS):
14055             CASE_FLT_FN (BUILT_IN_COSH):
14056             CASE_FLT_FN (BUILT_IN_ERFC):
14057             CASE_FLT_FN (BUILT_IN_EXP):
14058             CASE_FLT_FN (BUILT_IN_EXP10):
14059             CASE_FLT_FN (BUILT_IN_EXP2):
14060             CASE_FLT_FN (BUILT_IN_FABS):
14061             CASE_FLT_FN (BUILT_IN_FDIM):
14062             CASE_FLT_FN (BUILT_IN_HYPOT):
14063             CASE_FLT_FN (BUILT_IN_POW10):
14064             CASE_INT_FN (BUILT_IN_FFS):
14065             CASE_INT_FN (BUILT_IN_PARITY):
14066             CASE_INT_FN (BUILT_IN_POPCOUNT):
14067             case BUILT_IN_BSWAP32:
14068             case BUILT_IN_BSWAP64:
14069               /* Always true.  */
14070               return true;
14071
14072             CASE_FLT_FN (BUILT_IN_SQRT):
14073               /* sqrt(-0.0) is -0.0.  */
14074               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
14075                 return true;
14076               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14077                                                     strict_overflow_p);
14078
14079             CASE_FLT_FN (BUILT_IN_ASINH):
14080             CASE_FLT_FN (BUILT_IN_ATAN):
14081             CASE_FLT_FN (BUILT_IN_ATANH):
14082             CASE_FLT_FN (BUILT_IN_CBRT):
14083             CASE_FLT_FN (BUILT_IN_CEIL):
14084             CASE_FLT_FN (BUILT_IN_ERF):
14085             CASE_FLT_FN (BUILT_IN_EXPM1):
14086             CASE_FLT_FN (BUILT_IN_FLOOR):
14087             CASE_FLT_FN (BUILT_IN_FMOD):
14088             CASE_FLT_FN (BUILT_IN_FREXP):
14089             CASE_FLT_FN (BUILT_IN_LCEIL):
14090             CASE_FLT_FN (BUILT_IN_LDEXP):
14091             CASE_FLT_FN (BUILT_IN_LFLOOR):
14092             CASE_FLT_FN (BUILT_IN_LLCEIL):
14093             CASE_FLT_FN (BUILT_IN_LLFLOOR):
14094             CASE_FLT_FN (BUILT_IN_LLRINT):
14095             CASE_FLT_FN (BUILT_IN_LLROUND):
14096             CASE_FLT_FN (BUILT_IN_LRINT):
14097             CASE_FLT_FN (BUILT_IN_LROUND):
14098             CASE_FLT_FN (BUILT_IN_MODF):
14099             CASE_FLT_FN (BUILT_IN_NEARBYINT):
14100             CASE_FLT_FN (BUILT_IN_RINT):
14101             CASE_FLT_FN (BUILT_IN_ROUND):
14102             CASE_FLT_FN (BUILT_IN_SCALB):
14103             CASE_FLT_FN (BUILT_IN_SCALBLN):
14104             CASE_FLT_FN (BUILT_IN_SCALBN):
14105             CASE_FLT_FN (BUILT_IN_SIGNBIT):
14106             CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14107             CASE_FLT_FN (BUILT_IN_SINH):
14108             CASE_FLT_FN (BUILT_IN_TANH):
14109             CASE_FLT_FN (BUILT_IN_TRUNC):
14110               /* True if the 1st argument is nonnegative.  */
14111               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14112                                                     strict_overflow_p);
14113
14114             CASE_FLT_FN (BUILT_IN_FMAX):
14115               /* True if the 1st OR 2nd arguments are nonnegative.  */
14116               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14117                                                      strict_overflow_p)
14118                       || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14119                                                          strict_overflow_p)));
14120
14121             CASE_FLT_FN (BUILT_IN_FMIN):
14122               /* True if the 1st AND 2nd arguments are nonnegative.  */
14123               return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14124                                                      strict_overflow_p)
14125                       && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14126                                                          strict_overflow_p)));
14127
14128             CASE_FLT_FN (BUILT_IN_COPYSIGN):
14129               /* True if the 2nd argument is nonnegative.  */
14130               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14131                                                     strict_overflow_p);
14132
14133             CASE_FLT_FN (BUILT_IN_POWI):
14134               /* True if the 1st argument is nonnegative or the second
14135                  argument is an even integer.  */
14136               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
14137                 {
14138                   tree arg1 = CALL_EXPR_ARG (t, 1);
14139                   if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
14140                     return true;
14141                 }
14142               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14143                                                     strict_overflow_p);
14144
14145             CASE_FLT_FN (BUILT_IN_POW):
14146               /* True if the 1st argument is nonnegative or the second
14147                  argument is an even integer valued real.  */
14148               if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
14149                 {
14150                   REAL_VALUE_TYPE c;
14151                   HOST_WIDE_INT n;
14152
14153                   c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
14154                   n = real_to_integer (&c);
14155                   if ((n & 1) == 0)
14156                     {
14157                       REAL_VALUE_TYPE cint;
14158                       real_from_integer (&cint, VOIDmode, n,
14159                                          n < 0 ? -1 : 0, 0);
14160                       if (real_identical (&c, &cint))
14161                         return true;
14162                     }
14163                 }
14164               return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14165                                                     strict_overflow_p);
14166
14167             default:
14168               break;
14169             }
14170         return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14171                                                      TREE_TYPE (t));
14172       }
14173       break;
14174
14175     case COMPOUND_EXPR:
14176     case MODIFY_EXPR:
14177     case GIMPLE_MODIFY_STMT:
14178       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14179                                             strict_overflow_p);
14180     case BIND_EXPR:
14181       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14182                                             strict_overflow_p);
14183     case SAVE_EXPR:
14184       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14185                                             strict_overflow_p);
14186
14187     default:
14188       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14189                                                    TREE_TYPE (t));
14190     }
14191
14192   /* We don't know sign of `t', so be conservative and return false.  */
14193   return false;
14194 }
14195
14196 /* Return true if T is known to be non-negative.  If the return
14197    value is based on the assumption that signed overflow is undefined,
14198    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14199    *STRICT_OVERFLOW_P.  */
14200
14201 bool
14202 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14203 {
14204   enum tree_code code;
14205   if (t == error_mark_node)
14206     return false;
14207
14208   code = TREE_CODE (t);
14209   switch (TREE_CODE_CLASS (code))
14210     {
14211     case tcc_binary:
14212     case tcc_comparison:
14213       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14214                                               TREE_TYPE (t),
14215                                               TREE_OPERAND (t, 0),
14216                                               TREE_OPERAND (t, 1),
14217                                               strict_overflow_p);
14218
14219     case tcc_unary:
14220       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14221                                              TREE_TYPE (t),
14222                                              TREE_OPERAND (t, 0),
14223                                              strict_overflow_p);
14224
14225     case tcc_constant:
14226     case tcc_declaration:
14227     case tcc_reference:
14228       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14229
14230     default:
14231       break;
14232     }
14233
14234   switch (code)
14235     {
14236     case TRUTH_AND_EXPR:
14237     case TRUTH_OR_EXPR:
14238     case TRUTH_XOR_EXPR:
14239       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14240                                               TREE_TYPE (t),
14241                                               TREE_OPERAND (t, 0),
14242                                               TREE_OPERAND (t, 1),
14243                                               strict_overflow_p);
14244     case TRUTH_NOT_EXPR:
14245       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14246                                              TREE_TYPE (t),
14247                                              TREE_OPERAND (t, 0),
14248                                              strict_overflow_p);
14249
14250     case COND_EXPR:
14251     case CONSTRUCTOR:
14252     case OBJ_TYPE_REF:
14253     case ASSERT_EXPR:
14254     case ADDR_EXPR:
14255     case WITH_SIZE_EXPR:
14256     case EXC_PTR_EXPR:
14257     case SSA_NAME:
14258     case FILTER_EXPR:
14259       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14260
14261     default:
14262       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14263     }
14264 }
14265
14266 /* Return true if `t' is known to be non-negative.  Handle warnings
14267    about undefined signed overflow.  */
14268
14269 bool
14270 tree_expr_nonnegative_p (tree t)
14271 {
14272   bool ret, strict_overflow_p;
14273
14274   strict_overflow_p = false;
14275   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14276   if (strict_overflow_p)
14277     fold_overflow_warning (("assuming signed overflow does not occur when "
14278                             "determining that expression is always "
14279                             "non-negative"),
14280                            WARN_STRICT_OVERFLOW_MISC);
14281   return ret;
14282 }
14283
14284
14285 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14286    For floating point we further ensure that T is not denormal.
14287    Similar logic is present in nonzero_address in rtlanal.h.
14288
14289    If the return value is based on the assumption that signed overflow
14290    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14291    change *STRICT_OVERFLOW_P.  */
14292
14293 bool
14294 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14295                                  bool *strict_overflow_p)
14296 {
14297   switch (code)
14298     {
14299     case ABS_EXPR:
14300       return tree_expr_nonzero_warnv_p (op0,
14301                                         strict_overflow_p);
14302
14303     case NOP_EXPR:
14304       {
14305         tree inner_type = TREE_TYPE (op0);
14306         tree outer_type = type;
14307
14308         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14309                 && tree_expr_nonzero_warnv_p (op0,
14310                                               strict_overflow_p));
14311       }
14312       break;
14313
14314     case NON_LVALUE_EXPR:
14315       return tree_expr_nonzero_warnv_p (op0,
14316                                         strict_overflow_p);
14317
14318     default:
14319       break;
14320   }
14321
14322   return false;
14323 }
14324
14325 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14326    For floating point we further ensure that T is not denormal.
14327    Similar logic is present in nonzero_address in rtlanal.h.
14328
14329    If the return value is based on the assumption that signed overflow
14330    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14331    change *STRICT_OVERFLOW_P.  */
14332
14333 bool
14334 tree_binary_nonzero_warnv_p (enum tree_code code,
14335                              tree type,
14336                              tree op0,
14337                              tree op1, bool *strict_overflow_p)
14338 {
14339   bool sub_strict_overflow_p;
14340   switch (code)
14341     {
14342     case POINTER_PLUS_EXPR:
14343     case PLUS_EXPR:
14344       if (TYPE_OVERFLOW_UNDEFINED (type))
14345         {
14346           /* With the presence of negative values it is hard
14347              to say something.  */
14348           sub_strict_overflow_p = false;
14349           if (!tree_expr_nonnegative_warnv_p (op0,
14350                                               &sub_strict_overflow_p)
14351               || !tree_expr_nonnegative_warnv_p (op1,
14352                                                  &sub_strict_overflow_p))
14353             return false;
14354           /* One of operands must be positive and the other non-negative.  */
14355           /* We don't set *STRICT_OVERFLOW_P here: even if this value
14356              overflows, on a twos-complement machine the sum of two
14357              nonnegative numbers can never be zero.  */
14358           return (tree_expr_nonzero_warnv_p (op0,
14359                                              strict_overflow_p)
14360                   || tree_expr_nonzero_warnv_p (op1,
14361                                                 strict_overflow_p));
14362         }
14363       break;
14364
14365     case MULT_EXPR:
14366       if (TYPE_OVERFLOW_UNDEFINED (type))
14367         {
14368           if (tree_expr_nonzero_warnv_p (op0,
14369                                          strict_overflow_p)
14370               && tree_expr_nonzero_warnv_p (op1,
14371                                             strict_overflow_p))
14372             {
14373               *strict_overflow_p = true;
14374               return true;
14375             }
14376         }
14377       break;
14378
14379     case MIN_EXPR:
14380       sub_strict_overflow_p = false;
14381       if (tree_expr_nonzero_warnv_p (op0,
14382                                      &sub_strict_overflow_p)
14383           && tree_expr_nonzero_warnv_p (op1,
14384                                         &sub_strict_overflow_p))
14385         {
14386           if (sub_strict_overflow_p)
14387             *strict_overflow_p = true;
14388         }
14389       break;
14390
14391     case MAX_EXPR:
14392       sub_strict_overflow_p = false;
14393       if (tree_expr_nonzero_warnv_p (op0,
14394                                      &sub_strict_overflow_p))
14395         {
14396           if (sub_strict_overflow_p)
14397             *strict_overflow_p = true;
14398
14399           /* When both operands are nonzero, then MAX must be too.  */
14400           if (tree_expr_nonzero_warnv_p (op1,
14401                                          strict_overflow_p))
14402             return true;
14403
14404           /* MAX where operand 0 is positive is positive.  */
14405           return tree_expr_nonnegative_warnv_p (op0,
14406                                                strict_overflow_p);
14407         }
14408       /* MAX where operand 1 is positive is positive.  */
14409       else if (tree_expr_nonzero_warnv_p (op1,
14410                                           &sub_strict_overflow_p)
14411                && tree_expr_nonnegative_warnv_p (op1,
14412                                                  &sub_strict_overflow_p))
14413         {
14414           if (sub_strict_overflow_p)
14415             *strict_overflow_p = true;
14416           return true;
14417         }
14418       break;
14419
14420     case BIT_IOR_EXPR:
14421       return (tree_expr_nonzero_warnv_p (op1,
14422                                          strict_overflow_p)
14423               || tree_expr_nonzero_warnv_p (op0,
14424                                             strict_overflow_p));
14425
14426     default:
14427       break;
14428   }
14429
14430   return false;
14431 }
14432
14433 /* Return true when T is an address and is known to be nonzero.
14434    For floating point we further ensure that T is not denormal.
14435    Similar logic is present in nonzero_address in rtlanal.h.
14436
14437    If the return value is based on the assumption that signed overflow
14438    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14439    change *STRICT_OVERFLOW_P.  */
14440
14441 bool
14442 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14443 {
14444   bool sub_strict_overflow_p;
14445   switch (TREE_CODE (t))
14446     {
14447     case SSA_NAME:
14448       /* Query VRP to see if it has recorded any information about
14449          the range of this object.  */
14450       return ssa_name_nonzero_p (t);
14451
14452     case INTEGER_CST:
14453       return !integer_zerop (t);
14454
14455     case ADDR_EXPR:
14456       {
14457         tree base = get_base_address (TREE_OPERAND (t, 0));
14458
14459         if (!base)
14460           return false;
14461
14462         /* Weak declarations may link to NULL.  */
14463         if (VAR_OR_FUNCTION_DECL_P (base))
14464           return !DECL_WEAK (base);
14465
14466         /* Constants are never weak.  */
14467         if (CONSTANT_CLASS_P (base))
14468           return true;
14469
14470         return false;
14471       }
14472
14473     case COND_EXPR:
14474       sub_strict_overflow_p = false;
14475       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
14476                                      &sub_strict_overflow_p)
14477           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
14478                                         &sub_strict_overflow_p))
14479         {
14480           if (sub_strict_overflow_p)
14481             *strict_overflow_p = true;
14482           return true;
14483         }
14484       break;
14485
14486     default:
14487       break;
14488     }
14489   return false;
14490 }
14491
14492 /* Return true when T is an address and is known to be nonzero.
14493    For floating point we further ensure that T is not denormal.
14494    Similar logic is present in nonzero_address in rtlanal.h.
14495
14496    If the return value is based on the assumption that signed overflow
14497    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14498    change *STRICT_OVERFLOW_P.  */
14499
14500 bool
14501 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14502 {
14503   tree type = TREE_TYPE (t);
14504   enum tree_code code;
14505
14506   /* Doing something useful for floating point would need more work.  */
14507   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
14508     return false;
14509
14510   code = TREE_CODE (t);
14511   switch (TREE_CODE_CLASS (code))
14512     {
14513     case tcc_unary:
14514       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14515                                               strict_overflow_p);
14516     case tcc_binary:
14517     case tcc_comparison:
14518       return tree_binary_nonzero_warnv_p (code, type,
14519                                                TREE_OPERAND (t, 0),
14520                                                TREE_OPERAND (t, 1),
14521                                                strict_overflow_p);
14522     case tcc_constant:
14523     case tcc_declaration:
14524     case tcc_reference:
14525       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14526
14527     default:
14528       break;
14529     }
14530
14531   switch (code)
14532     {
14533     case TRUTH_NOT_EXPR:
14534       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14535                                               strict_overflow_p);
14536
14537     case TRUTH_AND_EXPR:
14538     case TRUTH_OR_EXPR:
14539     case TRUTH_XOR_EXPR:
14540       return tree_binary_nonzero_warnv_p (code, type,
14541                                                TREE_OPERAND (t, 0),
14542                                                TREE_OPERAND (t, 1),
14543                                                strict_overflow_p);
14544
14545     case COND_EXPR:
14546     case CONSTRUCTOR:
14547     case OBJ_TYPE_REF:
14548     case ASSERT_EXPR:
14549     case ADDR_EXPR:
14550     case WITH_SIZE_EXPR:
14551     case EXC_PTR_EXPR:
14552     case SSA_NAME:
14553     case FILTER_EXPR:
14554       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14555
14556     case COMPOUND_EXPR:
14557     case MODIFY_EXPR:
14558     case GIMPLE_MODIFY_STMT:
14559     case BIND_EXPR:
14560       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14561                                         strict_overflow_p);
14562
14563     case SAVE_EXPR:
14564       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
14565                                         strict_overflow_p);
14566
14567     case CALL_EXPR:
14568       return alloca_call_p (t);
14569
14570     default:
14571       break;
14572     }
14573   return false;
14574 }
14575
14576 /* Return true when T is an address and is known to be nonzero.
14577    Handle warnings about undefined signed overflow.  */
14578
14579 bool
14580 tree_expr_nonzero_p (tree t)
14581 {
14582   bool ret, strict_overflow_p;
14583
14584   strict_overflow_p = false;
14585   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
14586   if (strict_overflow_p)
14587     fold_overflow_warning (("assuming signed overflow does not occur when "
14588                             "determining that expression is always "
14589                             "non-zero"),
14590                            WARN_STRICT_OVERFLOW_MISC);
14591   return ret;
14592 }
14593
14594 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
14595    attempt to fold the expression to a constant without modifying TYPE,
14596    OP0 or OP1.
14597
14598    If the expression could be simplified to a constant, then return
14599    the constant.  If the expression would not be simplified to a
14600    constant, then return NULL_TREE.  */
14601
14602 tree
14603 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
14604 {
14605   tree tem = fold_binary (code, type, op0, op1);
14606   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14607 }
14608
14609 /* Given the components of a unary expression CODE, TYPE and OP0,
14610    attempt to fold the expression to a constant without modifying
14611    TYPE or OP0.
14612
14613    If the expression could be simplified to a constant, then return
14614    the constant.  If the expression would not be simplified to a
14615    constant, then return NULL_TREE.  */
14616
14617 tree
14618 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
14619 {
14620   tree tem = fold_unary (code, type, op0);
14621   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14622 }
14623
14624 /* If EXP represents referencing an element in a constant string
14625    (either via pointer arithmetic or array indexing), return the
14626    tree representing the value accessed, otherwise return NULL.  */
14627
14628 tree
14629 fold_read_from_constant_string (tree exp)
14630 {
14631   if ((TREE_CODE (exp) == INDIRECT_REF
14632        || TREE_CODE (exp) == ARRAY_REF)
14633       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
14634     {
14635       tree exp1 = TREE_OPERAND (exp, 0);
14636       tree index;
14637       tree string;
14638
14639       if (TREE_CODE (exp) == INDIRECT_REF)
14640         string = string_constant (exp1, &index);
14641       else
14642         {
14643           tree low_bound = array_ref_low_bound (exp);
14644           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
14645
14646           /* Optimize the special-case of a zero lower bound.
14647
14648              We convert the low_bound to sizetype to avoid some problems
14649              with constant folding.  (E.g. suppose the lower bound is 1,
14650              and its mode is QI.  Without the conversion,l (ARRAY
14651              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
14652              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
14653           if (! integer_zerop (low_bound))
14654             index = size_diffop (index, fold_convert (sizetype, low_bound));
14655
14656           string = exp1;
14657         }
14658
14659       if (string
14660           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
14661           && TREE_CODE (string) == STRING_CST
14662           && TREE_CODE (index) == INTEGER_CST
14663           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
14664           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
14665               == MODE_INT)
14666           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
14667         return build_int_cst_type (TREE_TYPE (exp),
14668                                    (TREE_STRING_POINTER (string)
14669                                     [TREE_INT_CST_LOW (index)]));
14670     }
14671   return NULL;
14672 }
14673
14674 /* Return the tree for neg (ARG0) when ARG0 is known to be either
14675    an integer constant, real, or fixed-point constant.
14676
14677    TYPE is the type of the result.  */
14678
14679 static tree
14680 fold_negate_const (tree arg0, tree type)
14681 {
14682   tree t = NULL_TREE;
14683
14684   switch (TREE_CODE (arg0))
14685     {
14686     case INTEGER_CST:
14687       {
14688         unsigned HOST_WIDE_INT low;
14689         HOST_WIDE_INT high;
14690         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14691                                    TREE_INT_CST_HIGH (arg0),
14692                                    &low, &high);
14693         t = force_fit_type_double (type, low, high, 1,
14694                                    (overflow | TREE_OVERFLOW (arg0))
14695                                    && !TYPE_UNSIGNED (type));
14696         break;
14697       }
14698
14699     case REAL_CST:
14700       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14701       break;
14702
14703     case FIXED_CST:
14704       {
14705         FIXED_VALUE_TYPE f;
14706         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
14707                                             &(TREE_FIXED_CST (arg0)), NULL,
14708                                             TYPE_SATURATING (type));
14709         t = build_fixed (type, f);
14710         /* Propagate overflow flags.  */
14711         if (overflow_p | TREE_OVERFLOW (arg0))
14712           {
14713             TREE_OVERFLOW (t) = 1;
14714             TREE_CONSTANT_OVERFLOW (t) = 1;
14715           }
14716         else if (TREE_CONSTANT_OVERFLOW (arg0))
14717           TREE_CONSTANT_OVERFLOW (t) = 1;
14718         break;
14719       }
14720
14721     default:
14722       gcc_unreachable ();
14723     }
14724
14725   return t;
14726 }
14727
14728 /* Return the tree for abs (ARG0) when ARG0 is known to be either
14729    an integer constant or real constant.
14730
14731    TYPE is the type of the result.  */
14732
14733 tree
14734 fold_abs_const (tree arg0, tree type)
14735 {
14736   tree t = NULL_TREE;
14737
14738   switch (TREE_CODE (arg0))
14739     {
14740     case INTEGER_CST:
14741       /* If the value is unsigned, then the absolute value is
14742          the same as the ordinary value.  */
14743       if (TYPE_UNSIGNED (type))
14744         t = arg0;
14745       /* Similarly, if the value is non-negative.  */
14746       else if (INT_CST_LT (integer_minus_one_node, arg0))
14747         t = arg0;
14748       /* If the value is negative, then the absolute value is
14749          its negation.  */
14750       else
14751         {
14752           unsigned HOST_WIDE_INT low;
14753           HOST_WIDE_INT high;
14754           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14755                                      TREE_INT_CST_HIGH (arg0),
14756                                      &low, &high);
14757           t = force_fit_type_double (type, low, high, -1,
14758                                      overflow | TREE_OVERFLOW (arg0));
14759         }
14760       break;
14761
14762     case REAL_CST:
14763       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
14764         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14765       else
14766         t =  arg0;
14767       break;
14768
14769     default:
14770       gcc_unreachable ();
14771     }
14772
14773   return t;
14774 }
14775
14776 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
14777    constant.  TYPE is the type of the result.  */
14778
14779 static tree
14780 fold_not_const (tree arg0, tree type)
14781 {
14782   tree t = NULL_TREE;
14783
14784   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
14785
14786   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
14787                              ~TREE_INT_CST_HIGH (arg0), 0,
14788                              TREE_OVERFLOW (arg0));
14789
14790   return t;
14791 }
14792
14793 /* Given CODE, a relational operator, the target type, TYPE and two
14794    constant operands OP0 and OP1, return the result of the
14795    relational operation.  If the result is not a compile time
14796    constant, then return NULL_TREE.  */
14797
14798 static tree
14799 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
14800 {
14801   int result, invert;
14802
14803   /* From here on, the only cases we handle are when the result is
14804      known to be a constant.  */
14805
14806   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
14807     {
14808       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
14809       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
14810
14811       /* Handle the cases where either operand is a NaN.  */
14812       if (real_isnan (c0) || real_isnan (c1))
14813         {
14814           switch (code)
14815             {
14816             case EQ_EXPR:
14817             case ORDERED_EXPR:
14818               result = 0;
14819               break;
14820
14821             case NE_EXPR:
14822             case UNORDERED_EXPR:
14823             case UNLT_EXPR:
14824             case UNLE_EXPR:
14825             case UNGT_EXPR:
14826             case UNGE_EXPR:
14827             case UNEQ_EXPR:
14828               result = 1;
14829               break;
14830
14831             case LT_EXPR:
14832             case LE_EXPR:
14833             case GT_EXPR:
14834             case GE_EXPR:
14835             case LTGT_EXPR:
14836               if (flag_trapping_math)
14837                 return NULL_TREE;
14838               result = 0;
14839               break;
14840
14841             default:
14842               gcc_unreachable ();
14843             }
14844
14845           return constant_boolean_node (result, type);
14846         }
14847
14848       return constant_boolean_node (real_compare (code, c0, c1), type);
14849     }
14850
14851   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
14852     {
14853       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
14854       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
14855       return constant_boolean_node (fixed_compare (code, c0, c1), type);
14856     }
14857
14858   /* Handle equality/inequality of complex constants.  */
14859   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14860     {
14861       tree rcond = fold_relational_const (code, type,
14862                                           TREE_REALPART (op0),
14863                                           TREE_REALPART (op1));
14864       tree icond = fold_relational_const (code, type,
14865                                           TREE_IMAGPART (op0),
14866                                           TREE_IMAGPART (op1));
14867       if (code == EQ_EXPR)
14868         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14869       else if (code == NE_EXPR)
14870         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14871       else
14872         return NULL_TREE;
14873     }
14874
14875   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14876
14877      To compute GT, swap the arguments and do LT.
14878      To compute GE, do LT and invert the result.
14879      To compute LE, swap the arguments, do LT and invert the result.
14880      To compute NE, do EQ and invert the result.
14881
14882      Therefore, the code below must handle only EQ and LT.  */
14883
14884   if (code == LE_EXPR || code == GT_EXPR)
14885     {
14886       tree tem = op0;
14887       op0 = op1;
14888       op1 = tem;
14889       code = swap_tree_comparison (code);
14890     }
14891
14892   /* Note that it is safe to invert for real values here because we
14893      have already handled the one case that it matters.  */
14894
14895   invert = 0;
14896   if (code == NE_EXPR || code == GE_EXPR)
14897     {
14898       invert = 1;
14899       code = invert_tree_comparison (code, false);
14900     }
14901
14902   /* Compute a result for LT or EQ if args permit;
14903      Otherwise return T.  */
14904   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14905     {
14906       if (code == EQ_EXPR)
14907         result = tree_int_cst_equal (op0, op1);
14908       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14909         result = INT_CST_LT_UNSIGNED (op0, op1);
14910       else
14911         result = INT_CST_LT (op0, op1);
14912     }
14913   else
14914     return NULL_TREE;
14915
14916   if (invert)
14917     result ^= 1;
14918   return constant_boolean_node (result, type);
14919 }
14920
14921 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
14922    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
14923    itself.  */
14924
14925 tree
14926 fold_build_cleanup_point_expr (tree type, tree expr)
14927 {
14928   /* If the expression does not have side effects then we don't have to wrap
14929      it with a cleanup point expression.  */
14930   if (!TREE_SIDE_EFFECTS (expr))
14931     return expr;
14932
14933   /* If the expression is a return, check to see if the expression inside the
14934      return has no side effects or the right hand side of the modify expression
14935      inside the return. If either don't have side effects set we don't need to
14936      wrap the expression in a cleanup point expression.  Note we don't check the
14937      left hand side of the modify because it should always be a return decl.  */
14938   if (TREE_CODE (expr) == RETURN_EXPR)
14939     {
14940       tree op = TREE_OPERAND (expr, 0);
14941       if (!op || !TREE_SIDE_EFFECTS (op))
14942         return expr;
14943       op = TREE_OPERAND (op, 1);
14944       if (!TREE_SIDE_EFFECTS (op))
14945         return expr;
14946     }
14947   
14948   return build1 (CLEANUP_POINT_EXPR, type, expr);
14949 }
14950
14951 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14952    of an indirection through OP0, or NULL_TREE if no simplification is
14953    possible.  */
14954
14955 tree
14956 fold_indirect_ref_1 (tree type, tree op0)
14957 {
14958   tree sub = op0;
14959   tree subtype;
14960
14961   STRIP_NOPS (sub);
14962   subtype = TREE_TYPE (sub);
14963   if (!POINTER_TYPE_P (subtype))
14964     return NULL_TREE;
14965
14966   if (TREE_CODE (sub) == ADDR_EXPR)
14967     {
14968       tree op = TREE_OPERAND (sub, 0);
14969       tree optype = TREE_TYPE (op);
14970       /* *&CONST_DECL -> to the value of the const decl.  */
14971       if (TREE_CODE (op) == CONST_DECL)
14972         return DECL_INITIAL (op);
14973       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
14974       if (type == optype)
14975         {
14976           tree fop = fold_read_from_constant_string (op);
14977           if (fop)
14978             return fop;
14979           else
14980             return op;
14981         }
14982       /* *(foo *)&fooarray => fooarray[0] */
14983       else if (TREE_CODE (optype) == ARRAY_TYPE
14984                && type == TREE_TYPE (optype))
14985         {
14986           tree type_domain = TYPE_DOMAIN (optype);
14987           tree min_val = size_zero_node;
14988           if (type_domain && TYPE_MIN_VALUE (type_domain))
14989             min_val = TYPE_MIN_VALUE (type_domain);
14990           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14991         }
14992       /* *(foo *)&complexfoo => __real__ complexfoo */
14993       else if (TREE_CODE (optype) == COMPLEX_TYPE
14994                && type == TREE_TYPE (optype))
14995         return fold_build1 (REALPART_EXPR, type, op);
14996       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14997       else if (TREE_CODE (optype) == VECTOR_TYPE
14998                && type == TREE_TYPE (optype))
14999         {
15000           tree part_width = TYPE_SIZE (type);
15001           tree index = bitsize_int (0);
15002           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
15003         }
15004     }
15005
15006   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15007   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15008       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15009     { 
15010       tree op00 = TREE_OPERAND (sub, 0);
15011       tree op01 = TREE_OPERAND (sub, 1);
15012       tree op00type;
15013       
15014       STRIP_NOPS (op00);
15015       op00type = TREE_TYPE (op00);
15016       if (TREE_CODE (op00) == ADDR_EXPR
15017           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
15018           && type == TREE_TYPE (TREE_TYPE (op00type)))
15019         { 
15020           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
15021           tree part_width = TYPE_SIZE (type);
15022           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
15023           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15024           tree index = bitsize_int (indexi);
15025
15026           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
15027             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
15028                                 part_width, index);
15029         
15030         }
15031     }
15032
15033
15034   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15035   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15036       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15037     {
15038       tree op00 = TREE_OPERAND (sub, 0);
15039       tree op01 = TREE_OPERAND (sub, 1);
15040       tree op00type;
15041
15042       STRIP_NOPS (op00);
15043       op00type = TREE_TYPE (op00);
15044       if (TREE_CODE (op00) == ADDR_EXPR
15045           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
15046           && type == TREE_TYPE (TREE_TYPE (op00type)))
15047         {
15048           tree size = TYPE_SIZE_UNIT (type);
15049           if (tree_int_cst_equal (size, op01))
15050             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
15051         }
15052     }
15053   
15054   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15055   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15056       && type == TREE_TYPE (TREE_TYPE (subtype)))
15057     {
15058       tree type_domain;
15059       tree min_val = size_zero_node;
15060       sub = build_fold_indirect_ref (sub);
15061       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
15062       if (type_domain && TYPE_MIN_VALUE (type_domain))
15063         min_val = TYPE_MIN_VALUE (type_domain);
15064       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
15065     }
15066
15067   return NULL_TREE;
15068 }
15069
15070 /* Builds an expression for an indirection through T, simplifying some
15071    cases.  */
15072
15073 tree
15074 build_fold_indirect_ref (tree t)
15075 {
15076   tree type = TREE_TYPE (TREE_TYPE (t));
15077   tree sub = fold_indirect_ref_1 (type, t);
15078
15079   if (sub)
15080     return sub;
15081   else
15082     return build1 (INDIRECT_REF, type, t);
15083 }
15084
15085 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
15086
15087 tree
15088 fold_indirect_ref (tree t)
15089 {
15090   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
15091
15092   if (sub)
15093     return sub;
15094   else
15095     return t;
15096 }
15097
15098 /* Strip non-trapping, non-side-effecting tree nodes from an expression
15099    whose result is ignored.  The type of the returned tree need not be
15100    the same as the original expression.  */
15101
15102 tree
15103 fold_ignored_result (tree t)
15104 {
15105   if (!TREE_SIDE_EFFECTS (t))
15106     return integer_zero_node;
15107
15108   for (;;)
15109     switch (TREE_CODE_CLASS (TREE_CODE (t)))
15110       {
15111       case tcc_unary:
15112         t = TREE_OPERAND (t, 0);
15113         break;
15114
15115       case tcc_binary:
15116       case tcc_comparison:
15117         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15118           t = TREE_OPERAND (t, 0);
15119         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15120           t = TREE_OPERAND (t, 1);
15121         else
15122           return t;
15123         break;
15124
15125       case tcc_expression:
15126         switch (TREE_CODE (t))
15127           {
15128           case COMPOUND_EXPR:
15129             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15130               return t;
15131             t = TREE_OPERAND (t, 0);
15132             break;
15133
15134           case COND_EXPR:
15135             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15136                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15137               return t;
15138             t = TREE_OPERAND (t, 0);
15139             break;
15140
15141           default:
15142             return t;
15143           }
15144         break;
15145
15146       default:
15147         return t;
15148       }
15149 }
15150
15151 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15152    This can only be applied to objects of a sizetype.  */
15153
15154 tree
15155 round_up (tree value, int divisor)
15156 {
15157   tree div = NULL_TREE;
15158
15159   gcc_assert (divisor > 0);
15160   if (divisor == 1)
15161     return value;
15162
15163   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15164      have to do anything.  Only do this when we are not given a const,
15165      because in that case, this check is more expensive than just
15166      doing it.  */
15167   if (TREE_CODE (value) != INTEGER_CST)
15168     {
15169       div = build_int_cst (TREE_TYPE (value), divisor);
15170
15171       if (multiple_of_p (TREE_TYPE (value), value, div))
15172         return value;
15173     }
15174
15175   /* If divisor is a power of two, simplify this to bit manipulation.  */
15176   if (divisor == (divisor & -divisor))
15177     {
15178       if (TREE_CODE (value) == INTEGER_CST)
15179         {
15180           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15181           unsigned HOST_WIDE_INT high;
15182           bool overflow_p;
15183
15184           if ((low & (divisor - 1)) == 0)
15185             return value;
15186
15187           overflow_p = TREE_OVERFLOW (value);
15188           high = TREE_INT_CST_HIGH (value);
15189           low &= ~(divisor - 1);
15190           low += divisor;
15191           if (low == 0)
15192             {
15193               high++;
15194               if (high == 0)
15195                 overflow_p = true;
15196             }
15197
15198           return force_fit_type_double (TREE_TYPE (value), low, high,
15199                                         -1, overflow_p);
15200         }
15201       else
15202         {
15203           tree t;
15204
15205           t = build_int_cst (TREE_TYPE (value), divisor - 1);
15206           value = size_binop (PLUS_EXPR, value, t);
15207           t = build_int_cst (TREE_TYPE (value), -divisor);
15208           value = size_binop (BIT_AND_EXPR, value, t);
15209         }
15210     }
15211   else
15212     {
15213       if (!div)
15214         div = build_int_cst (TREE_TYPE (value), divisor);
15215       value = size_binop (CEIL_DIV_EXPR, value, div);
15216       value = size_binop (MULT_EXPR, value, div);
15217     }
15218
15219   return value;
15220 }
15221
15222 /* Likewise, but round down.  */
15223
15224 tree
15225 round_down (tree value, int divisor)
15226 {
15227   tree div = NULL_TREE;
15228
15229   gcc_assert (divisor > 0);
15230   if (divisor == 1)
15231     return value;
15232
15233   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15234      have to do anything.  Only do this when we are not given a const,
15235      because in that case, this check is more expensive than just
15236      doing it.  */
15237   if (TREE_CODE (value) != INTEGER_CST)
15238     {
15239       div = build_int_cst (TREE_TYPE (value), divisor);
15240
15241       if (multiple_of_p (TREE_TYPE (value), value, div))
15242         return value;
15243     }
15244
15245   /* If divisor is a power of two, simplify this to bit manipulation.  */
15246   if (divisor == (divisor & -divisor))
15247     {
15248       tree t;
15249
15250       t = build_int_cst (TREE_TYPE (value), -divisor);
15251       value = size_binop (BIT_AND_EXPR, value, t);
15252     }
15253   else
15254     {
15255       if (!div)
15256         div = build_int_cst (TREE_TYPE (value), divisor);
15257       value = size_binop (FLOOR_DIV_EXPR, value, div);
15258       value = size_binop (MULT_EXPR, value, div);
15259     }
15260
15261   return value;
15262 }
15263
15264 /* Returns the pointer to the base of the object addressed by EXP and
15265    extracts the information about the offset of the access, storing it
15266    to PBITPOS and POFFSET.  */
15267
15268 static tree
15269 split_address_to_core_and_offset (tree exp,
15270                                   HOST_WIDE_INT *pbitpos, tree *poffset)
15271 {
15272   tree core;
15273   enum machine_mode mode;
15274   int unsignedp, volatilep;
15275   HOST_WIDE_INT bitsize;
15276
15277   if (TREE_CODE (exp) == ADDR_EXPR)
15278     {
15279       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15280                                   poffset, &mode, &unsignedp, &volatilep,
15281                                   false);
15282       core = fold_addr_expr (core);
15283     }
15284   else
15285     {
15286       core = exp;
15287       *pbitpos = 0;
15288       *poffset = NULL_TREE;
15289     }
15290
15291   return core;
15292 }
15293
15294 /* Returns true if addresses of E1 and E2 differ by a constant, false
15295    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
15296
15297 bool
15298 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15299 {
15300   tree core1, core2;
15301   HOST_WIDE_INT bitpos1, bitpos2;
15302   tree toffset1, toffset2, tdiff, type;
15303
15304   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15305   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15306
15307   if (bitpos1 % BITS_PER_UNIT != 0
15308       || bitpos2 % BITS_PER_UNIT != 0
15309       || !operand_equal_p (core1, core2, 0))
15310     return false;
15311
15312   if (toffset1 && toffset2)
15313     {
15314       type = TREE_TYPE (toffset1);
15315       if (type != TREE_TYPE (toffset2))
15316         toffset2 = fold_convert (type, toffset2);
15317
15318       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15319       if (!cst_and_fits_in_hwi (tdiff))
15320         return false;
15321
15322       *diff = int_cst_value (tdiff);
15323     }
15324   else if (toffset1 || toffset2)
15325     {
15326       /* If only one of the offsets is non-constant, the difference cannot
15327          be a constant.  */
15328       return false;
15329     }
15330   else
15331     *diff = 0;
15332
15333   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15334   return true;
15335 }
15336
15337 /* Simplify the floating point expression EXP when the sign of the
15338    result is not significant.  Return NULL_TREE if no simplification
15339    is possible.  */
15340
15341 tree
15342 fold_strip_sign_ops (tree exp)
15343 {
15344   tree arg0, arg1;
15345
15346   switch (TREE_CODE (exp))
15347     {
15348     case ABS_EXPR:
15349     case NEGATE_EXPR:
15350       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15351       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15352
15353     case MULT_EXPR:
15354     case RDIV_EXPR:
15355       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15356         return NULL_TREE;
15357       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15358       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15359       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15360         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15361                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
15362                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
15363       break;
15364
15365     case COMPOUND_EXPR:
15366       arg0 = TREE_OPERAND (exp, 0);
15367       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15368       if (arg1)
15369         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15370       break;
15371       
15372     case COND_EXPR:
15373       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15374       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15375       if (arg0 || arg1)
15376         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15377                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
15378                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
15379       break;
15380       
15381     case CALL_EXPR:
15382       {
15383         const enum built_in_function fcode = builtin_mathfn_code (exp);
15384         switch (fcode)
15385         {
15386         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15387           /* Strip copysign function call, return the 1st argument. */
15388           arg0 = CALL_EXPR_ARG (exp, 0);
15389           arg1 = CALL_EXPR_ARG (exp, 1);
15390           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15391
15392         default:
15393           /* Strip sign ops from the argument of "odd" math functions.  */
15394           if (negate_mathfn_p (fcode))
15395             {
15396               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15397               if (arg0)
15398                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
15399             }
15400           break;
15401         }
15402       }
15403       break;
15404
15405     default:
15406       break;
15407     }
15408   return NULL_TREE;
15409 }