OSDN Git Service

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