OSDN Git Service

./:
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*@@ This file should be rewritten to use an arbitrary precision
23   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25   @@ The routines that translate from the ap rep should
26   @@ warn if precision et. al. is lost.
27   @@ This would also make life easier when this technology is used
28   @@ for cross-compilers.  */
29
30 /* The entry points in this file are fold, size_int_wide, size_binop
31    and force_fit_type_double.
32
33    fold takes a tree as argument and returns a simplified tree.
34
35    size_binop takes a tree code for an arithmetic operation
36    and two operands that are trees, and produces a tree for the
37    result, assuming the type comes from `sizetype'.
38
39    size_int takes an integer value, and creates a tree constant
40    with type from `sizetype'.
41
42    force_fit_type_double takes a constant, an overflowable flag and a
43    prior overflow indicator.  It forces the value to fit the type and
44    sets TREE_OVERFLOW.
45
46    Note: Since the folders get called on non-gimple code as well as
47    gimple code, we need to handle GIMPLE tuples as well as their
48    corresponding tree equivalents.  */
49
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include "flags.h"
55 #include "tree.h"
56 #include "real.h"
57 #include "fixed-value.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "target.h"
62 #include "toplev.h"
63 #include "intl.h"
64 #include "ggc.h"
65 #include "hashtab.h"
66 #include "langhooks.h"
67 #include "md5.h"
68
69 /* Nonzero if we are folding constants inside an initializer; zero
70    otherwise.  */
71 int folding_initializer = 0;
72
73 /* The following constants represent a bit based encoding of GCC's
74    comparison operators.  This encoding simplifies transformations
75    on relational comparison operators, such as AND and OR.  */
76 enum comparison_code {
77   COMPCODE_FALSE = 0,
78   COMPCODE_LT = 1,
79   COMPCODE_EQ = 2,
80   COMPCODE_LE = 3,
81   COMPCODE_GT = 4,
82   COMPCODE_LTGT = 5,
83   COMPCODE_GE = 6,
84   COMPCODE_ORD = 7,
85   COMPCODE_UNORD = 8,
86   COMPCODE_UNLT = 9,
87   COMPCODE_UNEQ = 10,
88   COMPCODE_UNLE = 11,
89   COMPCODE_UNGT = 12,
90   COMPCODE_NE = 13,
91   COMPCODE_UNGE = 14,
92   COMPCODE_TRUE = 15
93 };
94
95 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
96 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
97 static bool negate_mathfn_p (enum built_in_function);
98 static bool negate_expr_p (tree);
99 static tree negate_expr (tree);
100 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
101 static tree associate_trees (tree, tree, enum tree_code, tree);
102 static tree const_binop (enum tree_code, tree, tree, int);
103 static enum comparison_code comparison_to_compcode (enum tree_code);
104 static enum tree_code compcode_to_comparison (enum comparison_code);
105 static tree combine_comparisons (enum tree_code, enum tree_code,
106                                  enum tree_code, tree, tree, tree);
107 static int truth_value_p (enum tree_code);
108 static int operand_equal_for_comparison_p (tree, tree, tree);
109 static int twoval_comparison_p (tree, tree *, tree *, int *);
110 static tree eval_subst (tree, tree, tree, tree, tree);
111 static tree pedantic_omit_one_operand (tree, tree, tree);
112 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
113 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
114                                     enum machine_mode *, int *, int *,
115                                     tree *, tree *);
116 static tree sign_bit_p (tree, const_tree);
117 static int simple_operand_p (const_tree);
118 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
119 static tree range_predecessor (tree);
120 static tree range_successor (tree);
121 static tree make_range (tree, int *, tree *, tree *, bool *);
122 static tree build_range_check (tree, tree, int, tree, tree);
123 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
124                          tree);
125 static tree fold_range_test (enum tree_code, tree, tree, tree);
126 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
127 static tree unextend (tree, int, int, tree);
128 static tree fold_truthop (enum tree_code, tree, tree, tree);
129 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
130 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
131 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
132 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
133                                                  tree, tree,
134                                                  tree, tree, int);
135 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
136                                  tree, tree, tree);
137 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
138 static tree fold_div_compare (enum tree_code, tree, tree, tree);
139 static bool reorder_operands_p (const_tree, const_tree);
140 static tree fold_negate_const (tree, tree);
141 static tree fold_not_const (tree, tree);
142 static tree fold_relational_const (enum tree_code, tree, tree, tree);
143
144
145 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
146    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
147    and SUM1.  Then this yields nonzero if overflow occurred during the
148    addition.
149
150    Overflow occurs if A and B have the same sign, but A and SUM differ in
151    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
152    sign.  */
153 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
154 \f
155 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
156    We do that by representing the two-word integer in 4 words, with only
157    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
158    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
159
160 #define LOWPART(x) \
161   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
162 #define HIGHPART(x) \
163   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
164 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
165
166 /* Unpack a two-word integer into 4 words.
167    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
168    WORDS points to the array of HOST_WIDE_INTs.  */
169
170 static void
171 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
172 {
173   words[0] = LOWPART (low);
174   words[1] = HIGHPART (low);
175   words[2] = LOWPART (hi);
176   words[3] = HIGHPART (hi);
177 }
178
179 /* Pack an array of 4 words into a two-word integer.
180    WORDS points to the array of words.
181    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
182
183 static void
184 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
185         HOST_WIDE_INT *hi)
186 {
187   *low = words[0] + words[1] * BASE;
188   *hi = words[2] + words[3] * BASE;
189 }
190 \f
191 /* Force the double-word integer L1, H1 to be within the range of the
192    integer type TYPE.  Stores the properly truncated and sign-extended
193    double-word integer in *LV, *HV.  Returns true if the operation
194    overflows, that is, argument and result are different.  */
195
196 int
197 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
198                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
199 {
200   unsigned HOST_WIDE_INT low0 = l1;
201   HOST_WIDE_INT high0 = h1;
202   unsigned int prec;
203   int sign_extended_type;
204
205   if (POINTER_TYPE_P (type)
206       || TREE_CODE (type) == OFFSET_TYPE)
207     prec = POINTER_SIZE;
208   else
209     prec = TYPE_PRECISION (type);
210
211   /* Size types *are* sign extended.  */
212   sign_extended_type = (!TYPE_UNSIGNED (type)
213                         || (TREE_CODE (type) == INTEGER_TYPE
214                             && TYPE_IS_SIZETYPE (type)));
215
216   /* First clear all bits that are beyond the type's precision.  */
217   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
218     ;
219   else if (prec > HOST_BITS_PER_WIDE_INT)
220     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
221   else
222     {
223       h1 = 0;
224       if (prec < HOST_BITS_PER_WIDE_INT)
225         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
226     }
227
228   /* Then do sign extension if necessary.  */
229   if (!sign_extended_type)
230     /* No sign extension */;
231   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
232     /* Correct width already.  */;
233   else if (prec > HOST_BITS_PER_WIDE_INT)
234     {
235       /* Sign extend top half? */
236       if (h1 & ((unsigned HOST_WIDE_INT)1
237                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
238         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
239     }
240   else if (prec == HOST_BITS_PER_WIDE_INT)
241     {
242       if ((HOST_WIDE_INT)l1 < 0)
243         h1 = -1;
244     }
245   else
246     {
247       /* Sign extend bottom half? */
248       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
249         {
250           h1 = -1;
251           l1 |= (HOST_WIDE_INT)(-1) << prec;
252         }
253     }
254
255   *lv = l1;
256   *hv = h1;
257
258   /* If the value didn't fit, signal overflow.  */
259   return l1 != low0 || h1 != high0;
260 }
261
262 /* We force the double-int HIGH:LOW to the range of the type TYPE by
263    sign or zero extending it.
264    OVERFLOWABLE indicates if we are interested
265    in overflow of the value, when >0 we are only interested in signed
266    overflow, for <0 we are interested in any overflow.  OVERFLOWED
267    indicates whether overflow has already occurred.  CONST_OVERFLOWED
268    indicates whether constant overflow has already occurred.  We force
269    T's value to be within range of T's type (by setting to 0 or 1 all
270    the bits outside the type's range).  We set TREE_OVERFLOWED if,
271         OVERFLOWED is nonzero,
272         or OVERFLOWABLE is >0 and signed overflow occurs
273         or OVERFLOWABLE is <0 and any overflow occurs
274    We return a new tree node for the extended double-int.  The node
275    is shared if no overflow flags are set.  */
276
277 tree
278 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
279                        HOST_WIDE_INT high, int overflowable,
280                        bool overflowed)
281 {
282   int sign_extended_type;
283   bool overflow;
284
285   /* Size types *are* sign extended.  */
286   sign_extended_type = (!TYPE_UNSIGNED (type)
287                         || (TREE_CODE (type) == INTEGER_TYPE
288                             && TYPE_IS_SIZETYPE (type)));
289
290   overflow = fit_double_type (low, high, &low, &high, type);
291
292   /* If we need to set overflow flags, return a new unshared node.  */
293   if (overflowed || overflow)
294     {
295       if (overflowed
296           || overflowable < 0
297           || (overflowable > 0 && sign_extended_type))
298         {
299           tree t = make_node (INTEGER_CST);
300           TREE_INT_CST_LOW (t) = low;
301           TREE_INT_CST_HIGH (t) = high;
302           TREE_TYPE (t) = type;
303           TREE_OVERFLOW (t) = 1;
304           return t;
305         }
306     }
307
308   /* Else build a shared node.  */
309   return build_int_cst_wide (type, low, high);
310 }
311 \f
312 /* Add two doubleword integers with doubleword result.
313    Return nonzero if the operation overflows according to UNSIGNED_P.
314    Each argument is given as two `HOST_WIDE_INT' pieces.
315    One argument is L1 and H1; the other, L2 and H2.
316    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
317
318 int
319 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
320                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
321                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
322                       bool unsigned_p)
323 {
324   unsigned HOST_WIDE_INT l;
325   HOST_WIDE_INT h;
326
327   l = l1 + l2;
328   h = h1 + h2 + (l < l1);
329
330   *lv = l;
331   *hv = h;
332
333   if (unsigned_p)
334     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
335   else
336     return OVERFLOW_SUM_SIGN (h1, h2, h);
337 }
338
339 /* Negate a doubleword integer with doubleword result.
340    Return nonzero if the operation overflows, assuming it's signed.
341    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
342    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
343
344 int
345 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
346             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
347 {
348   if (l1 == 0)
349     {
350       *lv = 0;
351       *hv = - h1;
352       return (*hv & h1) < 0;
353     }
354   else
355     {
356       *lv = -l1;
357       *hv = ~h1;
358       return 0;
359     }
360 }
361 \f
362 /* Multiply two doubleword integers with doubleword result.
363    Return nonzero if the operation overflows according to UNSIGNED_P.
364    Each argument is given as two `HOST_WIDE_INT' pieces.
365    One argument is L1 and H1; the other, L2 and H2.
366    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
367
368 int
369 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
370                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
371                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
372                       bool unsigned_p)
373 {
374   HOST_WIDE_INT arg1[4];
375   HOST_WIDE_INT arg2[4];
376   HOST_WIDE_INT prod[4 * 2];
377   unsigned HOST_WIDE_INT carry;
378   int i, j, k;
379   unsigned HOST_WIDE_INT toplow, neglow;
380   HOST_WIDE_INT tophigh, neghigh;
381
382   encode (arg1, l1, h1);
383   encode (arg2, l2, h2);
384
385   memset (prod, 0, sizeof prod);
386
387   for (i = 0; i < 4; i++)
388     {
389       carry = 0;
390       for (j = 0; j < 4; j++)
391         {
392           k = i + j;
393           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
394           carry += arg1[i] * arg2[j];
395           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
396           carry += prod[k];
397           prod[k] = LOWPART (carry);
398           carry = HIGHPART (carry);
399         }
400       prod[i + 4] = carry;
401     }
402
403   decode (prod, lv, hv);
404   decode (prod + 4, &toplow, &tophigh);
405
406   /* Unsigned overflow is immediate.  */
407   if (unsigned_p)
408     return (toplow | tophigh) != 0;
409
410   /* Check for signed overflow by calculating the signed representation of the
411      top half of the result; it should agree with the low half's sign bit.  */
412   if (h1 < 0)
413     {
414       neg_double (l2, h2, &neglow, &neghigh);
415       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
416     }
417   if (h2 < 0)
418     {
419       neg_double (l1, h1, &neglow, &neghigh);
420       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
421     }
422   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
423 }
424 \f
425 /* Shift the doubleword integer in L1, H1 left by COUNT places
426    keeping only PREC bits of result.
427    Shift right if COUNT is negative.
428    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
429    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
430
431 void
432 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
433                HOST_WIDE_INT count, unsigned int prec,
434                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
435 {
436   unsigned HOST_WIDE_INT signmask;
437
438   if (count < 0)
439     {
440       rshift_double (l1, h1, -count, prec, lv, hv, arith);
441       return;
442     }
443
444   if (SHIFT_COUNT_TRUNCATED)
445     count %= prec;
446
447   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
448     {
449       /* Shifting by the host word size is undefined according to the
450          ANSI standard, so we must handle this as a special case.  */
451       *hv = 0;
452       *lv = 0;
453     }
454   else if (count >= HOST_BITS_PER_WIDE_INT)
455     {
456       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
457       *lv = 0;
458     }
459   else
460     {
461       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
462              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
463       *lv = l1 << count;
464     }
465
466   /* Sign extend all bits that are beyond the precision.  */
467
468   signmask = -((prec > HOST_BITS_PER_WIDE_INT
469                 ? ((unsigned HOST_WIDE_INT) *hv
470                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
471                 : (*lv >> (prec - 1))) & 1);
472
473   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
474     ;
475   else if (prec >= HOST_BITS_PER_WIDE_INT)
476     {
477       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
478       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
479     }
480   else
481     {
482       *hv = signmask;
483       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
484       *lv |= signmask << prec;
485     }
486 }
487
488 /* Shift the doubleword integer in L1, H1 right by COUNT places
489    keeping only PREC bits of result.  COUNT must be positive.
490    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
491    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
492
493 void
494 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
495                HOST_WIDE_INT count, unsigned int prec,
496                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
497                int arith)
498 {
499   unsigned HOST_WIDE_INT signmask;
500
501   signmask = (arith
502               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
503               : 0);
504
505   if (SHIFT_COUNT_TRUNCATED)
506     count %= prec;
507
508   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
509     {
510       /* Shifting by the host word size is undefined according to the
511          ANSI standard, so we must handle this as a special case.  */
512       *hv = 0;
513       *lv = 0;
514     }
515   else if (count >= HOST_BITS_PER_WIDE_INT)
516     {
517       *hv = 0;
518       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
519     }
520   else
521     {
522       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
523       *lv = ((l1 >> count)
524              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
525     }
526
527   /* Zero / sign extend all bits that are beyond the precision.  */
528
529   if (count >= (HOST_WIDE_INT)prec)
530     {
531       *hv = signmask;
532       *lv = signmask;
533     }
534   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
535     ;
536   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
537     {
538       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
539       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
540     }
541   else
542     {
543       *hv = signmask;
544       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
545       *lv |= signmask << (prec - count);
546     }
547 }
548 \f
549 /* Rotate the doubleword integer in L1, H1 left by COUNT places
550    keeping only PREC bits of result.
551    Rotate right if COUNT is negative.
552    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
553
554 void
555 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
556                 HOST_WIDE_INT count, unsigned int prec,
557                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
558 {
559   unsigned HOST_WIDE_INT s1l, s2l;
560   HOST_WIDE_INT s1h, s2h;
561
562   count %= prec;
563   if (count < 0)
564     count += prec;
565
566   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
567   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
568   *lv = s1l | s2l;
569   *hv = s1h | s2h;
570 }
571
572 /* Rotate the doubleword integer in L1, H1 left by COUNT places
573    keeping only PREC bits of result.  COUNT must be positive.
574    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
575
576 void
577 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
578                 HOST_WIDE_INT count, unsigned int prec,
579                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
580 {
581   unsigned HOST_WIDE_INT s1l, s2l;
582   HOST_WIDE_INT s1h, s2h;
583
584   count %= prec;
585   if (count < 0)
586     count += prec;
587
588   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
589   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
590   *lv = s1l | s2l;
591   *hv = s1h | s2h;
592 }
593 \f
594 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
595    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
596    CODE is a tree code for a kind of division, one of
597    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
598    or EXACT_DIV_EXPR
599    It controls how the quotient is rounded to an integer.
600    Return nonzero if the operation overflows.
601    UNS nonzero says do unsigned division.  */
602
603 int
604 div_and_round_double (enum tree_code code, int uns,
605                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
606                       HOST_WIDE_INT hnum_orig,
607                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
608                       HOST_WIDE_INT hden_orig,
609                       unsigned HOST_WIDE_INT *lquo,
610                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
611                       HOST_WIDE_INT *hrem)
612 {
613   int quo_neg = 0;
614   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
615   HOST_WIDE_INT den[4], quo[4];
616   int i, j;
617   unsigned HOST_WIDE_INT work;
618   unsigned HOST_WIDE_INT carry = 0;
619   unsigned HOST_WIDE_INT lnum = lnum_orig;
620   HOST_WIDE_INT hnum = hnum_orig;
621   unsigned HOST_WIDE_INT lden = lden_orig;
622   HOST_WIDE_INT hden = hden_orig;
623   int overflow = 0;
624
625   if (hden == 0 && lden == 0)
626     overflow = 1, lden = 1;
627
628   /* Calculate quotient sign and convert operands to unsigned.  */
629   if (!uns)
630     {
631       if (hnum < 0)
632         {
633           quo_neg = ~ quo_neg;
634           /* (minimum integer) / (-1) is the only overflow case.  */
635           if (neg_double (lnum, hnum, &lnum, &hnum)
636               && ((HOST_WIDE_INT) lden & hden) == -1)
637             overflow = 1;
638         }
639       if (hden < 0)
640         {
641           quo_neg = ~ quo_neg;
642           neg_double (lden, hden, &lden, &hden);
643         }
644     }
645
646   if (hnum == 0 && hden == 0)
647     {                           /* single precision */
648       *hquo = *hrem = 0;
649       /* This unsigned division rounds toward zero.  */
650       *lquo = lnum / lden;
651       goto finish_up;
652     }
653
654   if (hnum == 0)
655     {                           /* trivial case: dividend < divisor */
656       /* hden != 0 already checked.  */
657       *hquo = *lquo = 0;
658       *hrem = hnum;
659       *lrem = lnum;
660       goto finish_up;
661     }
662
663   memset (quo, 0, sizeof quo);
664
665   memset (num, 0, sizeof num);  /* to zero 9th element */
666   memset (den, 0, sizeof den);
667
668   encode (num, lnum, hnum);
669   encode (den, lden, hden);
670
671   /* Special code for when the divisor < BASE.  */
672   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
673     {
674       /* hnum != 0 already checked.  */
675       for (i = 4 - 1; i >= 0; i--)
676         {
677           work = num[i] + carry * BASE;
678           quo[i] = work / lden;
679           carry = work % lden;
680         }
681     }
682   else
683     {
684       /* Full double precision division,
685          with thanks to Don Knuth's "Seminumerical Algorithms".  */
686       int num_hi_sig, den_hi_sig;
687       unsigned HOST_WIDE_INT quo_est, scale;
688
689       /* Find the highest nonzero divisor digit.  */
690       for (i = 4 - 1;; i--)
691         if (den[i] != 0)
692           {
693             den_hi_sig = i;
694             break;
695           }
696
697       /* Insure that the first digit of the divisor is at least BASE/2.
698          This is required by the quotient digit estimation algorithm.  */
699
700       scale = BASE / (den[den_hi_sig] + 1);
701       if (scale > 1)
702         {               /* scale divisor and dividend */
703           carry = 0;
704           for (i = 0; i <= 4 - 1; i++)
705             {
706               work = (num[i] * scale) + carry;
707               num[i] = LOWPART (work);
708               carry = HIGHPART (work);
709             }
710
711           num[4] = carry;
712           carry = 0;
713           for (i = 0; i <= 4 - 1; i++)
714             {
715               work = (den[i] * scale) + carry;
716               den[i] = LOWPART (work);
717               carry = HIGHPART (work);
718               if (den[i] != 0) den_hi_sig = i;
719             }
720         }
721
722       num_hi_sig = 4;
723
724       /* Main loop */
725       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
726         {
727           /* Guess the next quotient digit, quo_est, by dividing the first
728              two remaining dividend digits by the high order quotient digit.
729              quo_est is never low and is at most 2 high.  */
730           unsigned HOST_WIDE_INT tmp;
731
732           num_hi_sig = i + den_hi_sig + 1;
733           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
734           if (num[num_hi_sig] != den[den_hi_sig])
735             quo_est = work / den[den_hi_sig];
736           else
737             quo_est = BASE - 1;
738
739           /* Refine quo_est so it's usually correct, and at most one high.  */
740           tmp = work - quo_est * den[den_hi_sig];
741           if (tmp < BASE
742               && (den[den_hi_sig - 1] * quo_est
743                   > (tmp * BASE + num[num_hi_sig - 2])))
744             quo_est--;
745
746           /* Try QUO_EST as the quotient digit, by multiplying the
747              divisor by QUO_EST and subtracting from the remaining dividend.
748              Keep in mind that QUO_EST is the I - 1st digit.  */
749
750           carry = 0;
751           for (j = 0; j <= den_hi_sig; j++)
752             {
753               work = quo_est * den[j] + carry;
754               carry = HIGHPART (work);
755               work = num[i + j] - LOWPART (work);
756               num[i + j] = LOWPART (work);
757               carry += HIGHPART (work) != 0;
758             }
759
760           /* If quo_est was high by one, then num[i] went negative and
761              we need to correct things.  */
762           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
763             {
764               quo_est--;
765               carry = 0;                /* add divisor back in */
766               for (j = 0; j <= den_hi_sig; j++)
767                 {
768                   work = num[i + j] + den[j] + carry;
769                   carry = HIGHPART (work);
770                   num[i + j] = LOWPART (work);
771                 }
772
773               num [num_hi_sig] += carry;
774             }
775
776           /* Store the quotient digit.  */
777           quo[i] = quo_est;
778         }
779     }
780
781   decode (quo, lquo, hquo);
782
783  finish_up:
784   /* If result is negative, make it so.  */
785   if (quo_neg)
786     neg_double (*lquo, *hquo, lquo, hquo);
787
788   /* Compute trial remainder:  rem = num - (quo * den)  */
789   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
790   neg_double (*lrem, *hrem, lrem, hrem);
791   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
792
793   switch (code)
794     {
795     case TRUNC_DIV_EXPR:
796     case TRUNC_MOD_EXPR:        /* round toward zero */
797     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
798       return overflow;
799
800     case FLOOR_DIV_EXPR:
801     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
802       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
803         {
804           /* quo = quo - 1;  */
805           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
806                       lquo, hquo);
807         }
808       else
809         return overflow;
810       break;
811
812     case CEIL_DIV_EXPR:
813     case CEIL_MOD_EXPR:         /* round toward positive infinity */
814       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
815         {
816           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
817                       lquo, hquo);
818         }
819       else
820         return overflow;
821       break;
822
823     case ROUND_DIV_EXPR:
824     case ROUND_MOD_EXPR:        /* round to closest integer */
825       {
826         unsigned HOST_WIDE_INT labs_rem = *lrem;
827         HOST_WIDE_INT habs_rem = *hrem;
828         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
829         HOST_WIDE_INT habs_den = hden, htwice;
830
831         /* Get absolute values.  */
832         if (*hrem < 0)
833           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
834         if (hden < 0)
835           neg_double (lden, hden, &labs_den, &habs_den);
836
837         /* If (2 * abs (lrem) >= abs (lden)) */
838         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
839                     labs_rem, habs_rem, &ltwice, &htwice);
840
841         if (((unsigned HOST_WIDE_INT) habs_den
842              < (unsigned HOST_WIDE_INT) htwice)
843             || (((unsigned HOST_WIDE_INT) habs_den
844                  == (unsigned HOST_WIDE_INT) htwice)
845                 && (labs_den < ltwice)))
846           {
847             if (*hquo < 0)
848               /* quo = quo - 1;  */
849               add_double (*lquo, *hquo,
850                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
851             else
852               /* quo = quo + 1; */
853               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
854                           lquo, hquo);
855           }
856         else
857           return overflow;
858       }
859       break;
860
861     default:
862       gcc_unreachable ();
863     }
864
865   /* Compute true remainder:  rem = num - (quo * den)  */
866   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
867   neg_double (*lrem, *hrem, lrem, hrem);
868   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
869   return overflow;
870 }
871
872 /* If ARG2 divides ARG1 with zero remainder, carries out the division
873    of type CODE and returns the quotient.
874    Otherwise returns NULL_TREE.  */
875
876 static tree
877 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
878 {
879   unsigned HOST_WIDE_INT int1l, int2l;
880   HOST_WIDE_INT int1h, int2h;
881   unsigned HOST_WIDE_INT quol, reml;
882   HOST_WIDE_INT quoh, remh;
883   tree type = TREE_TYPE (arg1);
884   int uns = TYPE_UNSIGNED (type);
885
886   int1l = TREE_INT_CST_LOW (arg1);
887   int1h = TREE_INT_CST_HIGH (arg1);
888   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
889      &obj[some_exotic_number].  */
890   if (POINTER_TYPE_P (type))
891     {
892       uns = false;
893       type = signed_type_for (type);
894       fit_double_type (int1l, int1h, &int1l, &int1h,
895                        type);
896     }
897   else
898     fit_double_type (int1l, int1h, &int1l, &int1h, type);
899   int2l = TREE_INT_CST_LOW (arg2);
900   int2h = TREE_INT_CST_HIGH (arg2);
901
902   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
903                         &quol, &quoh, &reml, &remh);
904   if (remh != 0 || reml != 0)
905     return NULL_TREE;
906
907   return build_int_cst_wide (type, quol, quoh);
908 }
909 \f
910 /* This is nonzero if we should defer warnings about undefined
911    overflow.  This facility exists because these warnings are a
912    special case.  The code to estimate loop iterations does not want
913    to issue any warnings, since it works with expressions which do not
914    occur in user code.  Various bits of cleanup code call fold(), but
915    only use the result if it has certain characteristics (e.g., is a
916    constant); that code only wants to issue a warning if the result is
917    used.  */
918
919 static int fold_deferring_overflow_warnings;
920
921 /* If a warning about undefined overflow is deferred, this is the
922    warning.  Note that this may cause us to turn two warnings into
923    one, but that is fine since it is sufficient to only give one
924    warning per expression.  */
925
926 static const char* fold_deferred_overflow_warning;
927
928 /* If a warning about undefined overflow is deferred, this is the
929    level at which the warning should be emitted.  */
930
931 static enum warn_strict_overflow_code fold_deferred_overflow_code;
932
933 /* Start deferring overflow warnings.  We could use a stack here to
934    permit nested calls, but at present it is not necessary.  */
935
936 void
937 fold_defer_overflow_warnings (void)
938 {
939   ++fold_deferring_overflow_warnings;
940 }
941
942 /* Stop deferring overflow warnings.  If there is a pending warning,
943    and ISSUE is true, then issue the warning if appropriate.  STMT is
944    the statement with which the warning should be associated (used for
945    location information); STMT may be NULL.  CODE is the level of the
946    warning--a warn_strict_overflow_code value.  This function will use
947    the smaller of CODE and the deferred code when deciding whether to
948    issue the warning.  CODE may be zero to mean to always use the
949    deferred code.  */
950
951 void
952 fold_undefer_overflow_warnings (bool issue, const_tree stmt, int code)
953 {
954   const char *warnmsg;
955   location_t locus;
956
957   gcc_assert (fold_deferring_overflow_warnings > 0);
958   --fold_deferring_overflow_warnings;
959   if (fold_deferring_overflow_warnings > 0)
960     {
961       if (fold_deferred_overflow_warning != NULL
962           && code != 0
963           && code < (int) fold_deferred_overflow_code)
964         fold_deferred_overflow_code = code;
965       return;
966     }
967
968   warnmsg = fold_deferred_overflow_warning;
969   fold_deferred_overflow_warning = NULL;
970
971   if (!issue || warnmsg == NULL)
972     return;
973
974   if (stmt != NULL_TREE && TREE_NO_WARNING (stmt))
975     return;
976
977   /* Use the smallest code level when deciding to issue the
978      warning.  */
979   if (code == 0 || code > (int) fold_deferred_overflow_code)
980     code = fold_deferred_overflow_code;
981
982   if (!issue_strict_overflow_warning (code))
983     return;
984
985   if (stmt == NULL_TREE || !expr_has_location (stmt))
986     locus = input_location;
987   else
988     locus = expr_location (stmt);
989   warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
990 }
991
992 /* Stop deferring overflow warnings, ignoring any deferred
993    warnings.  */
994
995 void
996 fold_undefer_and_ignore_overflow_warnings (void)
997 {
998   fold_undefer_overflow_warnings (false, NULL_TREE, 0);
999 }
1000
1001 /* Whether we are deferring overflow warnings.  */
1002
1003 bool
1004 fold_deferring_overflow_warnings_p (void)
1005 {
1006   return fold_deferring_overflow_warnings > 0;
1007 }
1008
1009 /* This is called when we fold something based on the fact that signed
1010    overflow is undefined.  */
1011
1012 static void
1013 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1014 {
1015   if (fold_deferring_overflow_warnings > 0)
1016     {
1017       if (fold_deferred_overflow_warning == NULL
1018           || wc < fold_deferred_overflow_code)
1019         {
1020           fold_deferred_overflow_warning = gmsgid;
1021           fold_deferred_overflow_code = wc;
1022         }
1023     }
1024   else if (issue_strict_overflow_warning (wc))
1025     warning (OPT_Wstrict_overflow, gmsgid);
1026 }
1027 \f
1028 /* Return true if the built-in mathematical function specified by CODE
1029    is odd, i.e. -f(x) == f(-x).  */
1030
1031 static bool
1032 negate_mathfn_p (enum built_in_function code)
1033 {
1034   switch (code)
1035     {
1036     CASE_FLT_FN (BUILT_IN_ASIN):
1037     CASE_FLT_FN (BUILT_IN_ASINH):
1038     CASE_FLT_FN (BUILT_IN_ATAN):
1039     CASE_FLT_FN (BUILT_IN_ATANH):
1040     CASE_FLT_FN (BUILT_IN_CASIN):
1041     CASE_FLT_FN (BUILT_IN_CASINH):
1042     CASE_FLT_FN (BUILT_IN_CATAN):
1043     CASE_FLT_FN (BUILT_IN_CATANH):
1044     CASE_FLT_FN (BUILT_IN_CBRT):
1045     CASE_FLT_FN (BUILT_IN_CPROJ):
1046     CASE_FLT_FN (BUILT_IN_CSIN):
1047     CASE_FLT_FN (BUILT_IN_CSINH):
1048     CASE_FLT_FN (BUILT_IN_CTAN):
1049     CASE_FLT_FN (BUILT_IN_CTANH):
1050     CASE_FLT_FN (BUILT_IN_ERF):
1051     CASE_FLT_FN (BUILT_IN_LLROUND):
1052     CASE_FLT_FN (BUILT_IN_LROUND):
1053     CASE_FLT_FN (BUILT_IN_ROUND):
1054     CASE_FLT_FN (BUILT_IN_SIN):
1055     CASE_FLT_FN (BUILT_IN_SINH):
1056     CASE_FLT_FN (BUILT_IN_TAN):
1057     CASE_FLT_FN (BUILT_IN_TANH):
1058     CASE_FLT_FN (BUILT_IN_TRUNC):
1059       return true;
1060
1061     CASE_FLT_FN (BUILT_IN_LLRINT):
1062     CASE_FLT_FN (BUILT_IN_LRINT):
1063     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1064     CASE_FLT_FN (BUILT_IN_RINT):
1065       return !flag_rounding_math;
1066     
1067     default:
1068       break;
1069     }
1070   return false;
1071 }
1072
1073 /* Check whether we may negate an integer constant T without causing
1074    overflow.  */
1075
1076 bool
1077 may_negate_without_overflow_p (const_tree t)
1078 {
1079   unsigned HOST_WIDE_INT val;
1080   unsigned int prec;
1081   tree type;
1082
1083   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1084
1085   type = TREE_TYPE (t);
1086   if (TYPE_UNSIGNED (type))
1087     return false;
1088
1089   prec = TYPE_PRECISION (type);
1090   if (prec > HOST_BITS_PER_WIDE_INT)
1091     {
1092       if (TREE_INT_CST_LOW (t) != 0)
1093         return true;
1094       prec -= HOST_BITS_PER_WIDE_INT;
1095       val = TREE_INT_CST_HIGH (t);
1096     }
1097   else
1098     val = TREE_INT_CST_LOW (t);
1099   if (prec < HOST_BITS_PER_WIDE_INT)
1100     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1101   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1102 }
1103
1104 /* Determine whether an expression T can be cheaply negated using
1105    the function negate_expr without introducing undefined overflow.  */
1106
1107 static bool
1108 negate_expr_p (tree t)
1109 {
1110   tree type;
1111
1112   if (t == 0)
1113     return false;
1114
1115   type = TREE_TYPE (t);
1116
1117   STRIP_SIGN_NOPS (t);
1118   switch (TREE_CODE (t))
1119     {
1120     case INTEGER_CST:
1121       if (TYPE_OVERFLOW_WRAPS (type))
1122         return true;
1123
1124       /* Check that -CST will not overflow type.  */
1125       return may_negate_without_overflow_p (t);
1126     case BIT_NOT_EXPR:
1127       return (INTEGRAL_TYPE_P (type)
1128               && TYPE_OVERFLOW_WRAPS (type));
1129
1130     case FIXED_CST:
1131     case REAL_CST:
1132     case NEGATE_EXPR:
1133       return true;
1134
1135     case COMPLEX_CST:
1136       return negate_expr_p (TREE_REALPART (t))
1137              && negate_expr_p (TREE_IMAGPART (t));
1138
1139     case COMPLEX_EXPR:
1140       return negate_expr_p (TREE_OPERAND (t, 0))
1141              && negate_expr_p (TREE_OPERAND (t, 1));
1142
1143     case CONJ_EXPR:
1144       return negate_expr_p (TREE_OPERAND (t, 0));
1145
1146     case PLUS_EXPR:
1147       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1148           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1149         return false;
1150       /* -(A + B) -> (-B) - A.  */
1151       if (negate_expr_p (TREE_OPERAND (t, 1))
1152           && reorder_operands_p (TREE_OPERAND (t, 0),
1153                                  TREE_OPERAND (t, 1)))
1154         return true;
1155       /* -(A + B) -> (-A) - B.  */
1156       return negate_expr_p (TREE_OPERAND (t, 0));
1157
1158     case MINUS_EXPR:
1159       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1160       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1161              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1162              && reorder_operands_p (TREE_OPERAND (t, 0),
1163                                     TREE_OPERAND (t, 1));
1164
1165     case MULT_EXPR:
1166       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1167         break;
1168
1169       /* Fall through.  */
1170
1171     case RDIV_EXPR:
1172       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1173         return negate_expr_p (TREE_OPERAND (t, 1))
1174                || negate_expr_p (TREE_OPERAND (t, 0));
1175       break;
1176
1177     case TRUNC_DIV_EXPR:
1178     case ROUND_DIV_EXPR:
1179     case FLOOR_DIV_EXPR:
1180     case CEIL_DIV_EXPR:
1181     case EXACT_DIV_EXPR:
1182       /* In general we can't negate A / B, because if A is INT_MIN and
1183          B is 1, we may turn this into INT_MIN / -1 which is undefined
1184          and actually traps on some architectures.  But if overflow is
1185          undefined, we can negate, because - (INT_MIN / 1) is an
1186          overflow.  */
1187       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1188           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1189         break;
1190       return negate_expr_p (TREE_OPERAND (t, 1))
1191              || negate_expr_p (TREE_OPERAND (t, 0));
1192
1193     case NOP_EXPR:
1194       /* Negate -((double)float) as (double)(-float).  */
1195       if (TREE_CODE (type) == REAL_TYPE)
1196         {
1197           tree tem = strip_float_extensions (t);
1198           if (tem != t)
1199             return negate_expr_p (tem);
1200         }
1201       break;
1202
1203     case CALL_EXPR:
1204       /* Negate -f(x) as f(-x).  */
1205       if (negate_mathfn_p (builtin_mathfn_code (t)))
1206         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1207       break;
1208
1209     case RSHIFT_EXPR:
1210       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1211       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1212         {
1213           tree op1 = TREE_OPERAND (t, 1);
1214           if (TREE_INT_CST_HIGH (op1) == 0
1215               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1216                  == TREE_INT_CST_LOW (op1))
1217             return true;
1218         }
1219       break;
1220
1221     default:
1222       break;
1223     }
1224   return false;
1225 }
1226
1227 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1228    simplification is possible.
1229    If negate_expr_p would return true for T, NULL_TREE will never be
1230    returned.  */
1231
1232 static tree
1233 fold_negate_expr (tree t)
1234 {
1235   tree type = TREE_TYPE (t);
1236   tree tem;
1237
1238   switch (TREE_CODE (t))
1239     {
1240     /* Convert - (~A) to A + 1.  */
1241     case BIT_NOT_EXPR:
1242       if (INTEGRAL_TYPE_P (type))
1243         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1244                             build_int_cst (type, 1));
1245       break;
1246       
1247     case INTEGER_CST:
1248       tem = fold_negate_const (t, type);
1249       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1250           || !TYPE_OVERFLOW_TRAPS (type))
1251         return tem;
1252       break;
1253
1254     case REAL_CST:
1255       tem = fold_negate_const (t, type);
1256       /* Two's complement FP formats, such as c4x, may overflow.  */
1257       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1258         return tem;
1259       break;
1260
1261     case FIXED_CST:
1262       tem = fold_negate_const (t, type);
1263       return tem;
1264
1265     case COMPLEX_CST:
1266       {
1267         tree rpart = negate_expr (TREE_REALPART (t));
1268         tree ipart = negate_expr (TREE_IMAGPART (t));
1269
1270         if ((TREE_CODE (rpart) == REAL_CST
1271              && TREE_CODE (ipart) == REAL_CST)
1272             || (TREE_CODE (rpart) == INTEGER_CST
1273                 && TREE_CODE (ipart) == INTEGER_CST))
1274           return build_complex (type, rpart, ipart);
1275       }
1276       break;
1277
1278     case COMPLEX_EXPR:
1279       if (negate_expr_p (t))
1280         return fold_build2 (COMPLEX_EXPR, type,
1281                             fold_negate_expr (TREE_OPERAND (t, 0)),
1282                             fold_negate_expr (TREE_OPERAND (t, 1)));
1283       break;
1284       
1285     case CONJ_EXPR:
1286       if (negate_expr_p (t))
1287         return fold_build1 (CONJ_EXPR, type,
1288                             fold_negate_expr (TREE_OPERAND (t, 0)));
1289       break;
1290
1291     case NEGATE_EXPR:
1292       return TREE_OPERAND (t, 0);
1293
1294     case PLUS_EXPR:
1295       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1296           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1297         {
1298           /* -(A + B) -> (-B) - A.  */
1299           if (negate_expr_p (TREE_OPERAND (t, 1))
1300               && reorder_operands_p (TREE_OPERAND (t, 0),
1301                                      TREE_OPERAND (t, 1)))
1302             {
1303               tem = negate_expr (TREE_OPERAND (t, 1));
1304               return fold_build2 (MINUS_EXPR, type,
1305                                   tem, TREE_OPERAND (t, 0));
1306             }
1307
1308           /* -(A + B) -> (-A) - B.  */
1309           if (negate_expr_p (TREE_OPERAND (t, 0)))
1310             {
1311               tem = negate_expr (TREE_OPERAND (t, 0));
1312               return fold_build2 (MINUS_EXPR, type,
1313                                   tem, TREE_OPERAND (t, 1));
1314             }
1315         }
1316       break;
1317
1318     case MINUS_EXPR:
1319       /* - (A - B) -> B - A  */
1320       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1321           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1322           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1323         return fold_build2 (MINUS_EXPR, type,
1324                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1325       break;
1326
1327     case MULT_EXPR:
1328       if (TYPE_UNSIGNED (type))
1329         break;
1330
1331       /* Fall through.  */
1332
1333     case RDIV_EXPR:
1334       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1335         {
1336           tem = TREE_OPERAND (t, 1);
1337           if (negate_expr_p (tem))
1338             return fold_build2 (TREE_CODE (t), type,
1339                                 TREE_OPERAND (t, 0), negate_expr (tem));
1340           tem = TREE_OPERAND (t, 0);
1341           if (negate_expr_p (tem))
1342             return fold_build2 (TREE_CODE (t), type,
1343                                 negate_expr (tem), TREE_OPERAND (t, 1));
1344         }
1345       break;
1346
1347     case TRUNC_DIV_EXPR:
1348     case ROUND_DIV_EXPR:
1349     case FLOOR_DIV_EXPR:
1350     case CEIL_DIV_EXPR:
1351     case EXACT_DIV_EXPR:
1352       /* In general we can't negate A / B, because if A is INT_MIN and
1353          B is 1, we may turn this into INT_MIN / -1 which is undefined
1354          and actually traps on some architectures.  But if overflow is
1355          undefined, we can negate, because - (INT_MIN / 1) is an
1356          overflow.  */
1357       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1358         {
1359           const char * const warnmsg = G_("assuming signed overflow does not "
1360                                           "occur when negating a division");
1361           tem = TREE_OPERAND (t, 1);
1362           if (negate_expr_p (tem))
1363             {
1364               if (INTEGRAL_TYPE_P (type)
1365                   && (TREE_CODE (tem) != INTEGER_CST
1366                       || integer_onep (tem)))
1367                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1368               return fold_build2 (TREE_CODE (t), type,
1369                                   TREE_OPERAND (t, 0), negate_expr (tem));
1370             }
1371           tem = TREE_OPERAND (t, 0);
1372           if (negate_expr_p (tem))
1373             {
1374               if (INTEGRAL_TYPE_P (type)
1375                   && (TREE_CODE (tem) != INTEGER_CST
1376                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1377                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1378               return fold_build2 (TREE_CODE (t), type,
1379                                   negate_expr (tem), TREE_OPERAND (t, 1));
1380             }
1381         }
1382       break;
1383
1384     case NOP_EXPR:
1385       /* Convert -((double)float) into (double)(-float).  */
1386       if (TREE_CODE (type) == REAL_TYPE)
1387         {
1388           tem = strip_float_extensions (t);
1389           if (tem != t && negate_expr_p (tem))
1390             return fold_convert (type, negate_expr (tem));
1391         }
1392       break;
1393
1394     case CALL_EXPR:
1395       /* Negate -f(x) as f(-x).  */
1396       if (negate_mathfn_p (builtin_mathfn_code (t))
1397           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1398         {
1399           tree fndecl, arg;
1400
1401           fndecl = get_callee_fndecl (t);
1402           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1403           return build_call_expr (fndecl, 1, arg);
1404         }
1405       break;
1406
1407     case RSHIFT_EXPR:
1408       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1409       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1410         {
1411           tree op1 = TREE_OPERAND (t, 1);
1412           if (TREE_INT_CST_HIGH (op1) == 0
1413               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1414                  == TREE_INT_CST_LOW (op1))
1415             {
1416               tree ntype = TYPE_UNSIGNED (type)
1417                            ? signed_type_for (type)
1418                            : unsigned_type_for (type);
1419               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1420               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1421               return fold_convert (type, temp);
1422             }
1423         }
1424       break;
1425
1426     default:
1427       break;
1428     }
1429
1430   return NULL_TREE;
1431 }
1432
1433 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1434    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1435    return NULL_TREE. */
1436
1437 static tree
1438 negate_expr (tree t)
1439 {
1440   tree type, tem;
1441
1442   if (t == NULL_TREE)
1443     return NULL_TREE;
1444
1445   type = TREE_TYPE (t);
1446   STRIP_SIGN_NOPS (t);
1447
1448   tem = fold_negate_expr (t);
1449   if (!tem)
1450     tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1451   return fold_convert (type, tem);
1452 }
1453 \f
1454 /* Split a tree IN into a constant, literal and variable parts that could be
1455    combined with CODE to make IN.  "constant" means an expression with
1456    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1457    commutative arithmetic operation.  Store the constant part into *CONP,
1458    the literal in *LITP and return the variable part.  If a part isn't
1459    present, set it to null.  If the tree does not decompose in this way,
1460    return the entire tree as the variable part and the other parts as null.
1461
1462    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1463    case, we negate an operand that was subtracted.  Except if it is a
1464    literal for which we use *MINUS_LITP instead.
1465
1466    If NEGATE_P is true, we are negating all of IN, again except a literal
1467    for which we use *MINUS_LITP instead.
1468
1469    If IN is itself a literal or constant, return it as appropriate.
1470
1471    Note that we do not guarantee that any of the three values will be the
1472    same type as IN, but they will have the same signedness and mode.  */
1473
1474 static tree
1475 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1476             tree *minus_litp, int negate_p)
1477 {
1478   tree var = 0;
1479
1480   *conp = 0;
1481   *litp = 0;
1482   *minus_litp = 0;
1483
1484   /* Strip any conversions that don't change the machine mode or signedness.  */
1485   STRIP_SIGN_NOPS (in);
1486
1487   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1488       || TREE_CODE (in) == FIXED_CST)
1489     *litp = in;
1490   else if (TREE_CODE (in) == code
1491            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1492                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1493                /* We can associate addition and subtraction together (even
1494                   though the C standard doesn't say so) for integers because
1495                   the value is not affected.  For reals, the value might be
1496                   affected, so we can't.  */
1497                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1498                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1499     {
1500       tree op0 = TREE_OPERAND (in, 0);
1501       tree op1 = TREE_OPERAND (in, 1);
1502       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1503       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1504
1505       /* First see if either of the operands is a literal, then a constant.  */
1506       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1507           || TREE_CODE (op0) == FIXED_CST)
1508         *litp = op0, op0 = 0;
1509       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1510                || TREE_CODE (op1) == FIXED_CST)
1511         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1512
1513       if (op0 != 0 && TREE_CONSTANT (op0))
1514         *conp = op0, op0 = 0;
1515       else if (op1 != 0 && TREE_CONSTANT (op1))
1516         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1517
1518       /* If we haven't dealt with either operand, this is not a case we can
1519          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1520       if (op0 != 0 && op1 != 0)
1521         var = in;
1522       else if (op0 != 0)
1523         var = op0;
1524       else
1525         var = op1, neg_var_p = neg1_p;
1526
1527       /* Now do any needed negations.  */
1528       if (neg_litp_p)
1529         *minus_litp = *litp, *litp = 0;
1530       if (neg_conp_p)
1531         *conp = negate_expr (*conp);
1532       if (neg_var_p)
1533         var = negate_expr (var);
1534     }
1535   else if (TREE_CONSTANT (in))
1536     *conp = in;
1537   else
1538     var = in;
1539
1540   if (negate_p)
1541     {
1542       if (*litp)
1543         *minus_litp = *litp, *litp = 0;
1544       else if (*minus_litp)
1545         *litp = *minus_litp, *minus_litp = 0;
1546       *conp = negate_expr (*conp);
1547       var = negate_expr (var);
1548     }
1549
1550   return var;
1551 }
1552
1553 /* Re-associate trees split by the above function.  T1 and T2 are either
1554    expressions to associate or null.  Return the new expression, if any.  If
1555    we build an operation, do it in TYPE and with CODE.  */
1556
1557 static tree
1558 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1559 {
1560   if (t1 == 0)
1561     return t2;
1562   else if (t2 == 0)
1563     return t1;
1564
1565   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1566      try to fold this since we will have infinite recursion.  But do
1567      deal with any NEGATE_EXPRs.  */
1568   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1569       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1570     {
1571       if (code == PLUS_EXPR)
1572         {
1573           if (TREE_CODE (t1) == NEGATE_EXPR)
1574             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1575                            fold_convert (type, TREE_OPERAND (t1, 0)));
1576           else if (TREE_CODE (t2) == NEGATE_EXPR)
1577             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1578                            fold_convert (type, TREE_OPERAND (t2, 0)));
1579           else if (integer_zerop (t2))
1580             return fold_convert (type, t1);
1581         }
1582       else if (code == MINUS_EXPR)
1583         {
1584           if (integer_zerop (t2))
1585             return fold_convert (type, t1);
1586         }
1587
1588       return build2 (code, type, fold_convert (type, t1),
1589                      fold_convert (type, t2));
1590     }
1591
1592   return fold_build2 (code, type, fold_convert (type, t1),
1593                       fold_convert (type, t2));
1594 }
1595 \f
1596 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1597    for use in int_const_binop, size_binop and size_diffop.  */
1598
1599 static bool
1600 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1601 {
1602   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1603     return false;
1604   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1605     return false;
1606
1607   switch (code)
1608     {
1609     case LSHIFT_EXPR:
1610     case RSHIFT_EXPR:
1611     case LROTATE_EXPR:
1612     case RROTATE_EXPR:
1613       return true;
1614
1615     default:
1616       break;
1617     }
1618
1619   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1620          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1621          && TYPE_MODE (type1) == TYPE_MODE (type2);
1622 }
1623
1624
1625 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1626    to produce a new constant.  Return NULL_TREE if we don't know how
1627    to evaluate CODE at compile-time.
1628
1629    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1630
1631 tree
1632 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1633 {
1634   unsigned HOST_WIDE_INT int1l, int2l;
1635   HOST_WIDE_INT int1h, int2h;
1636   unsigned HOST_WIDE_INT low;
1637   HOST_WIDE_INT hi;
1638   unsigned HOST_WIDE_INT garbagel;
1639   HOST_WIDE_INT garbageh;
1640   tree t;
1641   tree type = TREE_TYPE (arg1);
1642   int uns = TYPE_UNSIGNED (type);
1643   int is_sizetype
1644     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1645   int overflow = 0;
1646
1647   int1l = TREE_INT_CST_LOW (arg1);
1648   int1h = TREE_INT_CST_HIGH (arg1);
1649   int2l = TREE_INT_CST_LOW (arg2);
1650   int2h = TREE_INT_CST_HIGH (arg2);
1651
1652   switch (code)
1653     {
1654     case BIT_IOR_EXPR:
1655       low = int1l | int2l, hi = int1h | int2h;
1656       break;
1657
1658     case BIT_XOR_EXPR:
1659       low = int1l ^ int2l, hi = int1h ^ int2h;
1660       break;
1661
1662     case BIT_AND_EXPR:
1663       low = int1l & int2l, hi = int1h & int2h;
1664       break;
1665
1666     case RSHIFT_EXPR:
1667       int2l = -int2l;
1668     case LSHIFT_EXPR:
1669       /* It's unclear from the C standard whether shifts can overflow.
1670          The following code ignores overflow; perhaps a C standard
1671          interpretation ruling is needed.  */
1672       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1673                      &low, &hi, !uns);
1674       break;
1675
1676     case RROTATE_EXPR:
1677       int2l = - int2l;
1678     case LROTATE_EXPR:
1679       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1680                       &low, &hi);
1681       break;
1682
1683     case PLUS_EXPR:
1684       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1685       break;
1686
1687     case MINUS_EXPR:
1688       neg_double (int2l, int2h, &low, &hi);
1689       add_double (int1l, int1h, low, hi, &low, &hi);
1690       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1691       break;
1692
1693     case MULT_EXPR:
1694       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1695       break;
1696
1697     case TRUNC_DIV_EXPR:
1698     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1699     case EXACT_DIV_EXPR:
1700       /* This is a shortcut for a common special case.  */
1701       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1702           && !TREE_OVERFLOW (arg1)
1703           && !TREE_OVERFLOW (arg2)
1704           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1705         {
1706           if (code == CEIL_DIV_EXPR)
1707             int1l += int2l - 1;
1708
1709           low = int1l / int2l, hi = 0;
1710           break;
1711         }
1712
1713       /* ... fall through ...  */
1714
1715     case ROUND_DIV_EXPR:
1716       if (int2h == 0 && int2l == 0)
1717         return NULL_TREE;
1718       if (int2h == 0 && int2l == 1)
1719         {
1720           low = int1l, hi = int1h;
1721           break;
1722         }
1723       if (int1l == int2l && int1h == int2h
1724           && ! (int1l == 0 && int1h == 0))
1725         {
1726           low = 1, hi = 0;
1727           break;
1728         }
1729       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1730                                        &low, &hi, &garbagel, &garbageh);
1731       break;
1732
1733     case TRUNC_MOD_EXPR:
1734     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1735       /* This is a shortcut for a common special case.  */
1736       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1737           && !TREE_OVERFLOW (arg1)
1738           && !TREE_OVERFLOW (arg2)
1739           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1740         {
1741           if (code == CEIL_MOD_EXPR)
1742             int1l += int2l - 1;
1743           low = int1l % int2l, hi = 0;
1744           break;
1745         }
1746
1747       /* ... fall through ...  */
1748
1749     case ROUND_MOD_EXPR:
1750       if (int2h == 0 && int2l == 0)
1751         return NULL_TREE;
1752       overflow = div_and_round_double (code, uns,
1753                                        int1l, int1h, int2l, int2h,
1754                                        &garbagel, &garbageh, &low, &hi);
1755       break;
1756
1757     case MIN_EXPR:
1758     case MAX_EXPR:
1759       if (uns)
1760         low = (((unsigned HOST_WIDE_INT) int1h
1761                 < (unsigned HOST_WIDE_INT) int2h)
1762                || (((unsigned HOST_WIDE_INT) int1h
1763                     == (unsigned HOST_WIDE_INT) int2h)
1764                    && int1l < int2l));
1765       else
1766         low = (int1h < int2h
1767                || (int1h == int2h && int1l < int2l));
1768
1769       if (low == (code == MIN_EXPR))
1770         low = int1l, hi = int1h;
1771       else
1772         low = int2l, hi = int2h;
1773       break;
1774
1775     default:
1776       return NULL_TREE;
1777     }
1778
1779   if (notrunc)
1780     {
1781       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1782
1783       /* Propagate overflow flags ourselves.  */
1784       if (((!uns || is_sizetype) && overflow)
1785           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1786         {
1787           t = copy_node (t);
1788           TREE_OVERFLOW (t) = 1;
1789         }
1790     }
1791   else
1792     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1793                                ((!uns || is_sizetype) && overflow)
1794                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1795
1796   return t;
1797 }
1798
1799 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1800    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1801    are the same kind of constant and the same machine mode.  Return zero if
1802    combining the constants is not allowed in the current operating mode.
1803
1804    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1805
1806 static tree
1807 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1808 {
1809   /* Sanity check for the recursive cases.  */
1810   if (!arg1 || !arg2)
1811     return NULL_TREE;
1812
1813   STRIP_NOPS (arg1);
1814   STRIP_NOPS (arg2);
1815
1816   if (TREE_CODE (arg1) == INTEGER_CST)
1817     return int_const_binop (code, arg1, arg2, notrunc);
1818
1819   if (TREE_CODE (arg1) == REAL_CST)
1820     {
1821       enum machine_mode mode;
1822       REAL_VALUE_TYPE d1;
1823       REAL_VALUE_TYPE d2;
1824       REAL_VALUE_TYPE value;
1825       REAL_VALUE_TYPE result;
1826       bool inexact;
1827       tree t, type;
1828
1829       /* The following codes are handled by real_arithmetic.  */
1830       switch (code)
1831         {
1832         case PLUS_EXPR:
1833         case MINUS_EXPR:
1834         case MULT_EXPR:
1835         case RDIV_EXPR:
1836         case MIN_EXPR:
1837         case MAX_EXPR:
1838           break;
1839
1840         default:
1841           return NULL_TREE;
1842         }
1843
1844       d1 = TREE_REAL_CST (arg1);
1845       d2 = TREE_REAL_CST (arg2);
1846
1847       type = TREE_TYPE (arg1);
1848       mode = TYPE_MODE (type);
1849
1850       /* Don't perform operation if we honor signaling NaNs and
1851          either operand is a NaN.  */
1852       if (HONOR_SNANS (mode)
1853           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1854         return NULL_TREE;
1855
1856       /* Don't perform operation if it would raise a division
1857          by zero exception.  */
1858       if (code == RDIV_EXPR
1859           && REAL_VALUES_EQUAL (d2, dconst0)
1860           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1861         return NULL_TREE;
1862
1863       /* If either operand is a NaN, just return it.  Otherwise, set up
1864          for floating-point trap; we return an overflow.  */
1865       if (REAL_VALUE_ISNAN (d1))
1866         return arg1;
1867       else if (REAL_VALUE_ISNAN (d2))
1868         return arg2;
1869
1870       inexact = real_arithmetic (&value, code, &d1, &d2);
1871       real_convert (&result, mode, &value);
1872
1873       /* Don't constant fold this floating point operation if
1874          the result has overflowed and flag_trapping_math.  */
1875       if (flag_trapping_math
1876           && MODE_HAS_INFINITIES (mode)
1877           && REAL_VALUE_ISINF (result)
1878           && !REAL_VALUE_ISINF (d1)
1879           && !REAL_VALUE_ISINF (d2))
1880         return NULL_TREE;
1881
1882       /* Don't constant fold this floating point operation if the
1883          result may dependent upon the run-time rounding mode and
1884          flag_rounding_math is set, or if GCC's software emulation
1885          is unable to accurately represent the result.  */
1886       if ((flag_rounding_math
1887            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1888                && !flag_unsafe_math_optimizations))
1889           && (inexact || !real_identical (&result, &value)))
1890         return NULL_TREE;
1891
1892       t = build_real (type, result);
1893
1894       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1895       return t;
1896     }
1897
1898   if (TREE_CODE (arg1) == FIXED_CST)
1899     {
1900       FIXED_VALUE_TYPE f1;
1901       FIXED_VALUE_TYPE f2;
1902       FIXED_VALUE_TYPE result;
1903       tree t, type;
1904       int sat_p;
1905       bool overflow_p;
1906
1907       /* The following codes are handled by fixed_arithmetic.  */
1908       switch (code)
1909         {
1910         case PLUS_EXPR:
1911         case MINUS_EXPR:
1912         case MULT_EXPR:
1913         case TRUNC_DIV_EXPR:
1914           f2 = TREE_FIXED_CST (arg2);
1915           break;
1916
1917         case LSHIFT_EXPR:
1918         case RSHIFT_EXPR:
1919           f2.data.high = TREE_INT_CST_HIGH (arg2);
1920           f2.data.low = TREE_INT_CST_LOW (arg2);
1921           f2.mode = SImode;
1922           break;
1923
1924         default:
1925           return NULL_TREE;
1926         }
1927
1928       f1 = TREE_FIXED_CST (arg1);
1929       type = TREE_TYPE (arg1);
1930       sat_p = TYPE_SATURATING (type);
1931       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1932       t = build_fixed (type, result);
1933       /* Propagate overflow flags.  */
1934       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1935         {
1936           TREE_OVERFLOW (t) = 1;
1937           TREE_CONSTANT_OVERFLOW (t) = 1;
1938         }
1939       else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1940         TREE_CONSTANT_OVERFLOW (t) = 1;
1941       return t;
1942     }
1943
1944   if (TREE_CODE (arg1) == COMPLEX_CST)
1945     {
1946       tree type = TREE_TYPE (arg1);
1947       tree r1 = TREE_REALPART (arg1);
1948       tree i1 = TREE_IMAGPART (arg1);
1949       tree r2 = TREE_REALPART (arg2);
1950       tree i2 = TREE_IMAGPART (arg2);
1951       tree real, imag;
1952
1953       switch (code)
1954         {
1955         case PLUS_EXPR:
1956         case MINUS_EXPR:
1957           real = const_binop (code, r1, r2, notrunc);
1958           imag = const_binop (code, i1, i2, notrunc);
1959           break;
1960
1961         case MULT_EXPR:
1962           real = const_binop (MINUS_EXPR,
1963                               const_binop (MULT_EXPR, r1, r2, notrunc),
1964                               const_binop (MULT_EXPR, i1, i2, notrunc),
1965                               notrunc);
1966           imag = const_binop (PLUS_EXPR,
1967                               const_binop (MULT_EXPR, r1, i2, notrunc),
1968                               const_binop (MULT_EXPR, i1, r2, notrunc),
1969                               notrunc);
1970           break;
1971
1972         case RDIV_EXPR:
1973           {
1974             tree magsquared
1975               = const_binop (PLUS_EXPR,
1976                              const_binop (MULT_EXPR, r2, r2, notrunc),
1977                              const_binop (MULT_EXPR, i2, i2, notrunc),
1978                              notrunc);
1979             tree t1
1980               = const_binop (PLUS_EXPR,
1981                              const_binop (MULT_EXPR, r1, r2, notrunc),
1982                              const_binop (MULT_EXPR, i1, i2, notrunc),
1983                              notrunc);
1984             tree t2
1985               = const_binop (MINUS_EXPR,
1986                              const_binop (MULT_EXPR, i1, r2, notrunc),
1987                              const_binop (MULT_EXPR, r1, i2, notrunc),
1988                              notrunc);
1989
1990             if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1991               code = TRUNC_DIV_EXPR;
1992
1993             real = const_binop (code, t1, magsquared, notrunc);
1994             imag = const_binop (code, t2, magsquared, notrunc);
1995           }
1996           break;
1997
1998         default:
1999           return NULL_TREE;
2000         }
2001
2002       if (real && imag)
2003         return build_complex (type, real, imag);
2004     }
2005
2006   return NULL_TREE;
2007 }
2008
2009 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2010    indicates which particular sizetype to create.  */
2011
2012 tree
2013 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2014 {
2015   return build_int_cst (sizetype_tab[(int) kind], number);
2016 }
2017 \f
2018 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2019    is a tree code.  The type of the result is taken from the operands.
2020    Both must be equivalent integer types, ala int_binop_types_match_p.
2021    If the operands are constant, so is the result.  */
2022
2023 tree
2024 size_binop (enum tree_code code, tree arg0, tree arg1)
2025 {
2026   tree type = TREE_TYPE (arg0);
2027
2028   if (arg0 == error_mark_node || arg1 == error_mark_node)
2029     return error_mark_node;
2030
2031   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2032                                        TREE_TYPE (arg1)));
2033
2034   /* Handle the special case of two integer constants faster.  */
2035   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2036     {
2037       /* And some specific cases even faster than that.  */
2038       if (code == PLUS_EXPR)
2039         {
2040           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2041             return arg1;
2042           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2043             return arg0;
2044         }
2045       else if (code == MINUS_EXPR)
2046         {
2047           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2048             return arg0;
2049         }
2050       else if (code == MULT_EXPR)
2051         {
2052           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2053             return arg1;
2054         }
2055
2056       /* Handle general case of two integer constants.  */
2057       return int_const_binop (code, arg0, arg1, 0);
2058     }
2059
2060   return fold_build2 (code, type, arg0, arg1);
2061 }
2062
2063 /* Given two values, either both of sizetype or both of bitsizetype,
2064    compute the difference between the two values.  Return the value
2065    in signed type corresponding to the type of the operands.  */
2066
2067 tree
2068 size_diffop (tree arg0, tree arg1)
2069 {
2070   tree type = TREE_TYPE (arg0);
2071   tree ctype;
2072
2073   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2074                                        TREE_TYPE (arg1)));
2075
2076   /* If the type is already signed, just do the simple thing.  */
2077   if (!TYPE_UNSIGNED (type))
2078     return size_binop (MINUS_EXPR, arg0, arg1);
2079
2080   if (type == sizetype)
2081     ctype = ssizetype;
2082   else if (type == bitsizetype)
2083     ctype = sbitsizetype;
2084   else
2085     ctype = signed_type_for (type);
2086
2087   /* If either operand is not a constant, do the conversions to the signed
2088      type and subtract.  The hardware will do the right thing with any
2089      overflow in the subtraction.  */
2090   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2091     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2092                        fold_convert (ctype, arg1));
2093
2094   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2095      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2096      overflow) and negate (which can't either).  Special-case a result
2097      of zero while we're here.  */
2098   if (tree_int_cst_equal (arg0, arg1))
2099     return build_int_cst (ctype, 0);
2100   else if (tree_int_cst_lt (arg1, arg0))
2101     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2102   else
2103     return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2104                        fold_convert (ctype, size_binop (MINUS_EXPR,
2105                                                         arg1, arg0)));
2106 }
2107 \f
2108 /* A subroutine of fold_convert_const handling conversions of an
2109    INTEGER_CST to another integer type.  */
2110
2111 static tree
2112 fold_convert_const_int_from_int (tree type, const_tree arg1)
2113 {
2114   tree t;
2115
2116   /* Given an integer constant, make new constant with new type,
2117      appropriately sign-extended or truncated.  */
2118   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2119                              TREE_INT_CST_HIGH (arg1),
2120                              /* Don't set the overflow when
2121                                 converting from a pointer,  */
2122                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2123                              /* or to a sizetype with same signedness
2124                                 and the precision is unchanged.
2125                                 ???  sizetype is always sign-extended,
2126                                 but its signedness depends on the
2127                                 frontend.  Thus we see spurious overflows
2128                                 here if we do not check this.  */
2129                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2130                                    == TYPE_PRECISION (type))
2131                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2132                                       == TYPE_UNSIGNED (type))
2133                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2134                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2135                                       || (TREE_CODE (type) == INTEGER_TYPE
2136                                           && TYPE_IS_SIZETYPE (type)))),
2137                              (TREE_INT_CST_HIGH (arg1) < 0
2138                               && (TYPE_UNSIGNED (type)
2139                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2140                              | TREE_OVERFLOW (arg1));
2141
2142   return t;
2143 }
2144
2145 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2146    to an integer type.  */
2147
2148 static tree
2149 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2150 {
2151   int overflow = 0;
2152   tree t;
2153
2154   /* The following code implements the floating point to integer
2155      conversion rules required by the Java Language Specification,
2156      that IEEE NaNs are mapped to zero and values that overflow
2157      the target precision saturate, i.e. values greater than
2158      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2159      are mapped to INT_MIN.  These semantics are allowed by the
2160      C and C++ standards that simply state that the behavior of
2161      FP-to-integer conversion is unspecified upon overflow.  */
2162
2163   HOST_WIDE_INT high, low;
2164   REAL_VALUE_TYPE r;
2165   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2166
2167   switch (code)
2168     {
2169     case FIX_TRUNC_EXPR:
2170       real_trunc (&r, VOIDmode, &x);
2171       break;
2172
2173     default:
2174       gcc_unreachable ();
2175     }
2176
2177   /* If R is NaN, return zero and show we have an overflow.  */
2178   if (REAL_VALUE_ISNAN (r))
2179     {
2180       overflow = 1;
2181       high = 0;
2182       low = 0;
2183     }
2184
2185   /* See if R is less than the lower bound or greater than the
2186      upper bound.  */
2187
2188   if (! overflow)
2189     {
2190       tree lt = TYPE_MIN_VALUE (type);
2191       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2192       if (REAL_VALUES_LESS (r, l))
2193         {
2194           overflow = 1;
2195           high = TREE_INT_CST_HIGH (lt);
2196           low = TREE_INT_CST_LOW (lt);
2197         }
2198     }
2199
2200   if (! overflow)
2201     {
2202       tree ut = TYPE_MAX_VALUE (type);
2203       if (ut)
2204         {
2205           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2206           if (REAL_VALUES_LESS (u, r))
2207             {
2208               overflow = 1;
2209               high = TREE_INT_CST_HIGH (ut);
2210               low = TREE_INT_CST_LOW (ut);
2211             }
2212         }
2213     }
2214
2215   if (! overflow)
2216     REAL_VALUE_TO_INT (&low, &high, r);
2217
2218   t = force_fit_type_double (type, low, high, -1,
2219                              overflow | TREE_OVERFLOW (arg1));
2220   return t;
2221 }
2222
2223 /* A subroutine of fold_convert_const handling conversions of a
2224    FIXED_CST to an integer type.  */
2225
2226 static tree
2227 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2228 {
2229   tree t;
2230   double_int temp, temp_trunc;
2231   unsigned int mode;
2232
2233   /* Right shift FIXED_CST to temp by fbit.  */
2234   temp = TREE_FIXED_CST (arg1).data;
2235   mode = TREE_FIXED_CST (arg1).mode;
2236   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2237     {
2238       lshift_double (temp.low, temp.high,
2239                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2240                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2241
2242       /* Left shift temp to temp_trunc by fbit.  */
2243       lshift_double (temp.low, temp.high,
2244                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2245                      &temp_trunc.low, &temp_trunc.high,
2246                      SIGNED_FIXED_POINT_MODE_P (mode));
2247     }
2248   else
2249     {
2250       temp.low = 0;
2251       temp.high = 0;
2252       temp_trunc.low = 0;
2253       temp_trunc.high = 0;
2254     }
2255
2256   /* If FIXED_CST is negative, we need to round the value toward 0.
2257      By checking if the fractional bits are not zero to add 1 to temp.  */
2258   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2259       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2260     {
2261       double_int one;
2262       one.low = 1;
2263       one.high = 0;
2264       temp = double_int_add (temp, one);
2265     }
2266
2267   /* Given a fixed-point constant, make new constant with new type,
2268      appropriately sign-extended or truncated.  */
2269   t = force_fit_type_double (type, temp.low, temp.high, -1,
2270                              (temp.high < 0
2271                               && (TYPE_UNSIGNED (type)
2272                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2273                              | TREE_OVERFLOW (arg1));
2274
2275   return t;
2276 }
2277
2278 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2279    to another floating point type.  */
2280
2281 static tree
2282 fold_convert_const_real_from_real (tree type, const_tree arg1)
2283 {
2284   REAL_VALUE_TYPE value;
2285   tree t;
2286
2287   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2288   t = build_real (type, value);
2289
2290   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2291   return t;
2292 }
2293
2294 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2295    to a floating point type.  */
2296
2297 static tree
2298 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2299 {
2300   REAL_VALUE_TYPE value;
2301   tree t;
2302
2303   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2304   t = build_real (type, value);
2305
2306   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2307   TREE_CONSTANT_OVERFLOW (t)
2308     = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
2309   return t;
2310 }
2311
2312 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2313    to another fixed-point type.  */
2314
2315 static tree
2316 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2317 {
2318   FIXED_VALUE_TYPE value;
2319   tree t;
2320   bool overflow_p;
2321
2322   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2323                               TYPE_SATURATING (type));
2324   t = build_fixed (type, value);
2325
2326   /* Propagate overflow flags.  */
2327   if (overflow_p | TREE_OVERFLOW (arg1))
2328     {
2329       TREE_OVERFLOW (t) = 1;
2330       TREE_CONSTANT_OVERFLOW (t) = 1;
2331     }
2332   else if (TREE_CONSTANT_OVERFLOW (arg1))
2333     TREE_CONSTANT_OVERFLOW (t) = 1;
2334   return t;
2335 }
2336
2337 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2338    to a fixed-point type.  */
2339
2340 static tree
2341 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2342 {
2343   FIXED_VALUE_TYPE value;
2344   tree t;
2345   bool overflow_p;
2346
2347   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2348                                        TREE_INT_CST (arg1),
2349                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2350                                        TYPE_SATURATING (type));
2351   t = build_fixed (type, value);
2352
2353   /* Propagate overflow flags.  */
2354   if (overflow_p | TREE_OVERFLOW (arg1))
2355     {
2356       TREE_OVERFLOW (t) = 1;
2357       TREE_CONSTANT_OVERFLOW (t) = 1;
2358     }
2359   else if (TREE_CONSTANT_OVERFLOW (arg1))
2360     TREE_CONSTANT_OVERFLOW (t) = 1;
2361   return t;
2362 }
2363
2364 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2365    to a fixed-point type.  */
2366
2367 static tree
2368 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2369 {
2370   FIXED_VALUE_TYPE value;
2371   tree t;
2372   bool overflow_p;
2373
2374   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2375                                         &TREE_REAL_CST (arg1),
2376                                         TYPE_SATURATING (type));
2377   t = build_fixed (type, value);
2378
2379   /* Propagate overflow flags.  */
2380   if (overflow_p | TREE_OVERFLOW (arg1))
2381     {
2382       TREE_OVERFLOW (t) = 1;
2383       TREE_CONSTANT_OVERFLOW (t) = 1;
2384     }
2385   else if (TREE_CONSTANT_OVERFLOW (arg1))
2386     TREE_CONSTANT_OVERFLOW (t) = 1;
2387   return t;
2388 }
2389
2390 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2391    type TYPE.  If no simplification can be done return NULL_TREE.  */
2392
2393 static tree
2394 fold_convert_const (enum tree_code code, tree type, tree arg1)
2395 {
2396   if (TREE_TYPE (arg1) == type)
2397     return arg1;
2398
2399   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2400     {
2401       if (TREE_CODE (arg1) == INTEGER_CST)
2402         return fold_convert_const_int_from_int (type, arg1);
2403       else if (TREE_CODE (arg1) == REAL_CST)
2404         return fold_convert_const_int_from_real (code, type, arg1);
2405       else if (TREE_CODE (arg1) == FIXED_CST)
2406         return fold_convert_const_int_from_fixed (type, arg1);
2407     }
2408   else if (TREE_CODE (type) == REAL_TYPE)
2409     {
2410       if (TREE_CODE (arg1) == INTEGER_CST)
2411         return build_real_from_int_cst (type, arg1);
2412       else if (TREE_CODE (arg1) == REAL_CST)
2413         return fold_convert_const_real_from_real (type, arg1);
2414       else if (TREE_CODE (arg1) == FIXED_CST)
2415         return fold_convert_const_real_from_fixed (type, arg1);
2416     }
2417   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2418     {
2419       if (TREE_CODE (arg1) == FIXED_CST)
2420         return fold_convert_const_fixed_from_fixed (type, arg1);
2421       else if (TREE_CODE (arg1) == INTEGER_CST)
2422         return fold_convert_const_fixed_from_int (type, arg1);
2423       else if (TREE_CODE (arg1) == REAL_CST)
2424         return fold_convert_const_fixed_from_real (type, arg1);
2425     }
2426   return NULL_TREE;
2427 }
2428
2429 /* Construct a vector of zero elements of vector type TYPE.  */
2430
2431 static tree
2432 build_zero_vector (tree type)
2433 {
2434   tree elem, list;
2435   int i, units;
2436
2437   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2438   units = TYPE_VECTOR_SUBPARTS (type);
2439   
2440   list = NULL_TREE;
2441   for (i = 0; i < units; i++)
2442     list = tree_cons (NULL_TREE, elem, list);
2443   return build_vector (type, list);
2444 }
2445
2446 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2447
2448 bool
2449 fold_convertible_p (const_tree type, const_tree arg)
2450 {
2451   tree orig = TREE_TYPE (arg);
2452
2453   if (type == orig)
2454     return true;
2455
2456   if (TREE_CODE (arg) == ERROR_MARK
2457       || TREE_CODE (type) == ERROR_MARK
2458       || TREE_CODE (orig) == ERROR_MARK)
2459     return false;
2460
2461   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2462     return true;
2463
2464   switch (TREE_CODE (type))
2465     {
2466     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2467     case POINTER_TYPE: case REFERENCE_TYPE:
2468     case OFFSET_TYPE:
2469       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2470           || TREE_CODE (orig) == OFFSET_TYPE)
2471         return true;
2472       return (TREE_CODE (orig) == VECTOR_TYPE
2473               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2474
2475     case REAL_TYPE:
2476     case FIXED_POINT_TYPE:
2477     case COMPLEX_TYPE:
2478     case VECTOR_TYPE:
2479     case VOID_TYPE:
2480       return TREE_CODE (type) == TREE_CODE (orig);
2481
2482     default:
2483       return false;
2484     }
2485 }
2486
2487 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2488    simple conversions in preference to calling the front-end's convert.  */
2489
2490 tree
2491 fold_convert (tree type, tree arg)
2492 {
2493   tree orig = TREE_TYPE (arg);
2494   tree tem;
2495
2496   if (type == orig)
2497     return arg;
2498
2499   if (TREE_CODE (arg) == ERROR_MARK
2500       || TREE_CODE (type) == ERROR_MARK
2501       || TREE_CODE (orig) == ERROR_MARK)
2502     return error_mark_node;
2503
2504   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2505     return fold_build1 (NOP_EXPR, type, arg);
2506
2507   switch (TREE_CODE (type))
2508     {
2509     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2510     case POINTER_TYPE: case REFERENCE_TYPE:
2511     case OFFSET_TYPE:
2512       if (TREE_CODE (arg) == INTEGER_CST)
2513         {
2514           tem = fold_convert_const (NOP_EXPR, type, arg);
2515           if (tem != NULL_TREE)
2516             return tem;
2517         }
2518       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2519           || TREE_CODE (orig) == OFFSET_TYPE)
2520         return fold_build1 (NOP_EXPR, type, arg);
2521       if (TREE_CODE (orig) == COMPLEX_TYPE)
2522         {
2523           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2524           return fold_convert (type, tem);
2525         }
2526       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2527                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2528       return fold_build1 (NOP_EXPR, type, arg);
2529
2530     case REAL_TYPE:
2531       if (TREE_CODE (arg) == INTEGER_CST)
2532         {
2533           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2534           if (tem != NULL_TREE)
2535             return tem;
2536         }
2537       else if (TREE_CODE (arg) == REAL_CST)
2538         {
2539           tem = fold_convert_const (NOP_EXPR, type, arg);
2540           if (tem != NULL_TREE)
2541             return tem;
2542         }
2543       else if (TREE_CODE (arg) == FIXED_CST)
2544         {
2545           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2546           if (tem != NULL_TREE)
2547             return tem;
2548         }
2549
2550       switch (TREE_CODE (orig))
2551         {
2552         case INTEGER_TYPE:
2553         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2554         case POINTER_TYPE: case REFERENCE_TYPE:
2555           return fold_build1 (FLOAT_EXPR, type, arg);
2556
2557         case REAL_TYPE:
2558           return fold_build1 (NOP_EXPR, type, arg);
2559
2560         case FIXED_POINT_TYPE:
2561           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2562
2563         case COMPLEX_TYPE:
2564           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2565           return fold_convert (type, tem);
2566
2567         default:
2568           gcc_unreachable ();
2569         }
2570
2571     case FIXED_POINT_TYPE:
2572       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2573           || TREE_CODE (arg) == REAL_CST)
2574         {
2575           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2576           if (tem != NULL_TREE)
2577             return tem;
2578         }
2579
2580       switch (TREE_CODE (orig))
2581         {
2582         case FIXED_POINT_TYPE:
2583         case INTEGER_TYPE:
2584         case ENUMERAL_TYPE:
2585         case BOOLEAN_TYPE:
2586         case REAL_TYPE:
2587           return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2588
2589         case COMPLEX_TYPE:
2590           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2591           return fold_convert (type, tem);
2592
2593         default:
2594           gcc_unreachable ();
2595         }
2596
2597     case COMPLEX_TYPE:
2598       switch (TREE_CODE (orig))
2599         {
2600         case INTEGER_TYPE:
2601         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2602         case POINTER_TYPE: case REFERENCE_TYPE:
2603         case REAL_TYPE:
2604         case FIXED_POINT_TYPE:
2605           return build2 (COMPLEX_EXPR, type,
2606                          fold_convert (TREE_TYPE (type), arg),
2607                          fold_convert (TREE_TYPE (type), integer_zero_node));
2608         case COMPLEX_TYPE:
2609           {
2610             tree rpart, ipart;
2611
2612             if (TREE_CODE (arg) == COMPLEX_EXPR)
2613               {
2614                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2615                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2616                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2617               }
2618
2619             arg = save_expr (arg);
2620             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2621             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2622             rpart = fold_convert (TREE_TYPE (type), rpart);
2623             ipart = fold_convert (TREE_TYPE (type), ipart);
2624             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2625           }
2626
2627         default:
2628           gcc_unreachable ();
2629         }
2630
2631     case VECTOR_TYPE:
2632       if (integer_zerop (arg))
2633         return build_zero_vector (type);
2634       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2635       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2636                   || TREE_CODE (orig) == VECTOR_TYPE);
2637       return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2638
2639     case VOID_TYPE:
2640       tem = fold_ignored_result (arg);
2641       if (TREE_CODE (tem) == GIMPLE_MODIFY_STMT)
2642         return tem;
2643       return fold_build1 (NOP_EXPR, type, tem);
2644
2645     default:
2646       gcc_unreachable ();
2647     }
2648 }
2649 \f
2650 /* Return false if expr can be assumed not to be an lvalue, true
2651    otherwise.  */
2652
2653 static bool
2654 maybe_lvalue_p (const_tree x)
2655 {
2656   /* We only need to wrap lvalue tree codes.  */
2657   switch (TREE_CODE (x))
2658   {
2659   case VAR_DECL:
2660   case PARM_DECL:
2661   case RESULT_DECL:
2662   case LABEL_DECL:
2663   case FUNCTION_DECL:
2664   case SSA_NAME:
2665
2666   case COMPONENT_REF:
2667   case INDIRECT_REF:
2668   case ALIGN_INDIRECT_REF:
2669   case MISALIGNED_INDIRECT_REF:
2670   case ARRAY_REF:
2671   case ARRAY_RANGE_REF:
2672   case BIT_FIELD_REF:
2673   case OBJ_TYPE_REF:
2674
2675   case REALPART_EXPR:
2676   case IMAGPART_EXPR:
2677   case PREINCREMENT_EXPR:
2678   case PREDECREMENT_EXPR:
2679   case SAVE_EXPR:
2680   case TRY_CATCH_EXPR:
2681   case WITH_CLEANUP_EXPR:
2682   case COMPOUND_EXPR:
2683   case MODIFY_EXPR:
2684   case GIMPLE_MODIFY_STMT:
2685   case TARGET_EXPR:
2686   case COND_EXPR:
2687   case BIND_EXPR:
2688   case MIN_EXPR:
2689   case MAX_EXPR:
2690     break;
2691
2692   default:
2693     /* Assume the worst for front-end tree codes.  */
2694     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2695       break;
2696     return false;
2697   }
2698
2699   return true;
2700 }
2701
2702 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2703
2704 tree
2705 non_lvalue (tree x)
2706 {
2707   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2708      us.  */
2709   if (in_gimple_form)
2710     return x;
2711
2712   if (! maybe_lvalue_p (x))
2713     return x;
2714   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2715 }
2716
2717 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2718    Zero means allow extended lvalues.  */
2719
2720 int pedantic_lvalues;
2721
2722 /* When pedantic, return an expr equal to X but certainly not valid as a
2723    pedantic lvalue.  Otherwise, return X.  */
2724
2725 static tree
2726 pedantic_non_lvalue (tree x)
2727 {
2728   if (pedantic_lvalues)
2729     return non_lvalue (x);
2730   else
2731     return x;
2732 }
2733 \f
2734 /* Given a tree comparison code, return the code that is the logical inverse
2735    of the given code.  It is not safe to do this for floating-point
2736    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2737    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2738
2739 enum tree_code
2740 invert_tree_comparison (enum tree_code code, bool honor_nans)
2741 {
2742   if (honor_nans && flag_trapping_math)
2743     return ERROR_MARK;
2744
2745   switch (code)
2746     {
2747     case EQ_EXPR:
2748       return NE_EXPR;
2749     case NE_EXPR:
2750       return EQ_EXPR;
2751     case GT_EXPR:
2752       return honor_nans ? UNLE_EXPR : LE_EXPR;
2753     case GE_EXPR:
2754       return honor_nans ? UNLT_EXPR : LT_EXPR;
2755     case LT_EXPR:
2756       return honor_nans ? UNGE_EXPR : GE_EXPR;
2757     case LE_EXPR:
2758       return honor_nans ? UNGT_EXPR : GT_EXPR;
2759     case LTGT_EXPR:
2760       return UNEQ_EXPR;
2761     case UNEQ_EXPR:
2762       return LTGT_EXPR;
2763     case UNGT_EXPR:
2764       return LE_EXPR;
2765     case UNGE_EXPR:
2766       return LT_EXPR;
2767     case UNLT_EXPR:
2768       return GE_EXPR;
2769     case UNLE_EXPR:
2770       return GT_EXPR;
2771     case ORDERED_EXPR:
2772       return UNORDERED_EXPR;
2773     case UNORDERED_EXPR:
2774       return ORDERED_EXPR;
2775     default:
2776       gcc_unreachable ();
2777     }
2778 }
2779
2780 /* Similar, but return the comparison that results if the operands are
2781    swapped.  This is safe for floating-point.  */
2782
2783 enum tree_code
2784 swap_tree_comparison (enum tree_code code)
2785 {
2786   switch (code)
2787     {
2788     case EQ_EXPR:
2789     case NE_EXPR:
2790     case ORDERED_EXPR:
2791     case UNORDERED_EXPR:
2792     case LTGT_EXPR:
2793     case UNEQ_EXPR:
2794       return code;
2795     case GT_EXPR:
2796       return LT_EXPR;
2797     case GE_EXPR:
2798       return LE_EXPR;
2799     case LT_EXPR:
2800       return GT_EXPR;
2801     case LE_EXPR:
2802       return GE_EXPR;
2803     case UNGT_EXPR:
2804       return UNLT_EXPR;
2805     case UNGE_EXPR:
2806       return UNLE_EXPR;
2807     case UNLT_EXPR:
2808       return UNGT_EXPR;
2809     case UNLE_EXPR:
2810       return UNGE_EXPR;
2811     default:
2812       gcc_unreachable ();
2813     }
2814 }
2815
2816
2817 /* Convert a comparison tree code from an enum tree_code representation
2818    into a compcode bit-based encoding.  This function is the inverse of
2819    compcode_to_comparison.  */
2820
2821 static enum comparison_code
2822 comparison_to_compcode (enum tree_code code)
2823 {
2824   switch (code)
2825     {
2826     case LT_EXPR:
2827       return COMPCODE_LT;
2828     case EQ_EXPR:
2829       return COMPCODE_EQ;
2830     case LE_EXPR:
2831       return COMPCODE_LE;
2832     case GT_EXPR:
2833       return COMPCODE_GT;
2834     case NE_EXPR:
2835       return COMPCODE_NE;
2836     case GE_EXPR:
2837       return COMPCODE_GE;
2838     case ORDERED_EXPR:
2839       return COMPCODE_ORD;
2840     case UNORDERED_EXPR:
2841       return COMPCODE_UNORD;
2842     case UNLT_EXPR:
2843       return COMPCODE_UNLT;
2844     case UNEQ_EXPR:
2845       return COMPCODE_UNEQ;
2846     case UNLE_EXPR:
2847       return COMPCODE_UNLE;
2848     case UNGT_EXPR:
2849       return COMPCODE_UNGT;
2850     case LTGT_EXPR:
2851       return COMPCODE_LTGT;
2852     case UNGE_EXPR:
2853       return COMPCODE_UNGE;
2854     default:
2855       gcc_unreachable ();
2856     }
2857 }
2858
2859 /* Convert a compcode bit-based encoding of a comparison operator back
2860    to GCC's enum tree_code representation.  This function is the
2861    inverse of comparison_to_compcode.  */
2862
2863 static enum tree_code
2864 compcode_to_comparison (enum comparison_code code)
2865 {
2866   switch (code)
2867     {
2868     case COMPCODE_LT:
2869       return LT_EXPR;
2870     case COMPCODE_EQ:
2871       return EQ_EXPR;
2872     case COMPCODE_LE:
2873       return LE_EXPR;
2874     case COMPCODE_GT:
2875       return GT_EXPR;
2876     case COMPCODE_NE:
2877       return NE_EXPR;
2878     case COMPCODE_GE:
2879       return GE_EXPR;
2880     case COMPCODE_ORD:
2881       return ORDERED_EXPR;
2882     case COMPCODE_UNORD:
2883       return UNORDERED_EXPR;
2884     case COMPCODE_UNLT:
2885       return UNLT_EXPR;
2886     case COMPCODE_UNEQ:
2887       return UNEQ_EXPR;
2888     case COMPCODE_UNLE:
2889       return UNLE_EXPR;
2890     case COMPCODE_UNGT:
2891       return UNGT_EXPR;
2892     case COMPCODE_LTGT:
2893       return LTGT_EXPR;
2894     case COMPCODE_UNGE:
2895       return UNGE_EXPR;
2896     default:
2897       gcc_unreachable ();
2898     }
2899 }
2900
2901 /* Return a tree for the comparison which is the combination of
2902    doing the AND or OR (depending on CODE) of the two operations LCODE
2903    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2904    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2905    if this makes the transformation invalid.  */
2906
2907 tree
2908 combine_comparisons (enum tree_code code, enum tree_code lcode,
2909                      enum tree_code rcode, tree truth_type,
2910                      tree ll_arg, tree lr_arg)
2911 {
2912   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2913   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2914   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2915   enum comparison_code compcode;
2916
2917   switch (code)
2918     {
2919     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2920       compcode = lcompcode & rcompcode;
2921       break;
2922
2923     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2924       compcode = lcompcode | rcompcode;
2925       break;
2926
2927     default:
2928       return NULL_TREE;
2929     }
2930
2931   if (!honor_nans)
2932     {
2933       /* Eliminate unordered comparisons, as well as LTGT and ORD
2934          which are not used unless the mode has NaNs.  */
2935       compcode &= ~COMPCODE_UNORD;
2936       if (compcode == COMPCODE_LTGT)
2937         compcode = COMPCODE_NE;
2938       else if (compcode == COMPCODE_ORD)
2939         compcode = COMPCODE_TRUE;
2940     }
2941    else if (flag_trapping_math)
2942      {
2943         /* Check that the original operation and the optimized ones will trap
2944            under the same condition.  */
2945         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2946                      && (lcompcode != COMPCODE_EQ)
2947                      && (lcompcode != COMPCODE_ORD);
2948         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2949                      && (rcompcode != COMPCODE_EQ)
2950                      && (rcompcode != COMPCODE_ORD);
2951         bool trap = (compcode & COMPCODE_UNORD) == 0
2952                     && (compcode != COMPCODE_EQ)
2953                     && (compcode != COMPCODE_ORD);
2954
2955         /* In a short-circuited boolean expression the LHS might be
2956            such that the RHS, if evaluated, will never trap.  For
2957            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2958            if neither x nor y is NaN.  (This is a mixed blessing: for
2959            example, the expression above will never trap, hence
2960            optimizing it to x < y would be invalid).  */
2961         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2962             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2963           rtrap = false;
2964
2965         /* If the comparison was short-circuited, and only the RHS
2966            trapped, we may now generate a spurious trap.  */
2967         if (rtrap && !ltrap
2968             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2969           return NULL_TREE;
2970
2971         /* If we changed the conditions that cause a trap, we lose.  */
2972         if ((ltrap || rtrap) != trap)
2973           return NULL_TREE;
2974       }
2975
2976   if (compcode == COMPCODE_TRUE)
2977     return constant_boolean_node (true, truth_type);
2978   else if (compcode == COMPCODE_FALSE)
2979     return constant_boolean_node (false, truth_type);
2980   else
2981     return fold_build2 (compcode_to_comparison (compcode),
2982                         truth_type, ll_arg, lr_arg);
2983 }
2984
2985 /* Return nonzero if CODE is a tree code that represents a truth value.  */
2986
2987 static int
2988 truth_value_p (enum tree_code code)
2989 {
2990   return (TREE_CODE_CLASS (code) == tcc_comparison
2991           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2992           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2993           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2994 }
2995 \f
2996 /* Return nonzero if two operands (typically of the same tree node)
2997    are necessarily equal.  If either argument has side-effects this
2998    function returns zero.  FLAGS modifies behavior as follows:
2999
3000    If OEP_ONLY_CONST is set, only return nonzero for constants.
3001    This function tests whether the operands are indistinguishable;
3002    it does not test whether they are equal using C's == operation.
3003    The distinction is important for IEEE floating point, because
3004    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3005    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3006
3007    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3008    even though it may hold multiple values during a function.
3009    This is because a GCC tree node guarantees that nothing else is
3010    executed between the evaluation of its "operands" (which may often
3011    be evaluated in arbitrary order).  Hence if the operands themselves
3012    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3013    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3014    unset means assuming isochronic (or instantaneous) tree equivalence.
3015    Unless comparing arbitrary expression trees, such as from different
3016    statements, this flag can usually be left unset.
3017
3018    If OEP_PURE_SAME is set, then pure functions with identical arguments
3019    are considered the same.  It is used when the caller has other ways
3020    to ensure that global memory is unchanged in between.  */
3021
3022 int
3023 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3024 {
3025   /* If either is ERROR_MARK, they aren't equal.  */
3026   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3027     return 0;
3028
3029   /* Check equality of integer constants before bailing out due to
3030      precision differences.  */
3031   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
3032     return tree_int_cst_equal (arg0, arg1);
3033
3034   /* If both types don't have the same signedness, then we can't consider
3035      them equal.  We must check this before the STRIP_NOPS calls
3036      because they may change the signedness of the arguments.  */
3037   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3038     return 0;
3039
3040   /* If both types don't have the same precision, then it is not safe
3041      to strip NOPs.  */
3042   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3043     return 0;
3044
3045   STRIP_NOPS (arg0);
3046   STRIP_NOPS (arg1);
3047
3048   /* In case both args are comparisons but with different comparison
3049      code, try to swap the comparison operands of one arg to produce
3050      a match and compare that variant.  */
3051   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3052       && COMPARISON_CLASS_P (arg0)
3053       && COMPARISON_CLASS_P (arg1))
3054     {
3055       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3056
3057       if (TREE_CODE (arg0) == swap_code)
3058         return operand_equal_p (TREE_OPERAND (arg0, 0),
3059                                 TREE_OPERAND (arg1, 1), flags)
3060                && operand_equal_p (TREE_OPERAND (arg0, 1),
3061                                    TREE_OPERAND (arg1, 0), flags);
3062     }
3063
3064   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3065       /* This is needed for conversions and for COMPONENT_REF.
3066          Might as well play it safe and always test this.  */
3067       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3068       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3069       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3070     return 0;
3071
3072   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3073      We don't care about side effects in that case because the SAVE_EXPR
3074      takes care of that for us. In all other cases, two expressions are
3075      equal if they have no side effects.  If we have two identical
3076      expressions with side effects that should be treated the same due
3077      to the only side effects being identical SAVE_EXPR's, that will
3078      be detected in the recursive calls below.  */
3079   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3080       && (TREE_CODE (arg0) == SAVE_EXPR
3081           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3082     return 1;
3083
3084   /* Next handle constant cases, those for which we can return 1 even
3085      if ONLY_CONST is set.  */
3086   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3087     switch (TREE_CODE (arg0))
3088       {
3089       case INTEGER_CST:
3090         return tree_int_cst_equal (arg0, arg1);
3091
3092       case FIXED_CST:
3093         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3094                                        TREE_FIXED_CST (arg1));
3095
3096       case REAL_CST:
3097         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3098                                    TREE_REAL_CST (arg1)))
3099           return 1;
3100
3101         
3102         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3103           {
3104             /* If we do not distinguish between signed and unsigned zero,
3105                consider them equal.  */
3106             if (real_zerop (arg0) && real_zerop (arg1))
3107               return 1;
3108           }
3109         return 0;
3110
3111       case VECTOR_CST:
3112         {
3113           tree v1, v2;
3114
3115           v1 = TREE_VECTOR_CST_ELTS (arg0);
3116           v2 = TREE_VECTOR_CST_ELTS (arg1);
3117           while (v1 && v2)
3118             {
3119               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3120                                     flags))
3121                 return 0;
3122               v1 = TREE_CHAIN (v1);
3123               v2 = TREE_CHAIN (v2);
3124             }
3125
3126           return v1 == v2;
3127         }
3128
3129       case COMPLEX_CST:
3130         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3131                                  flags)
3132                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3133                                     flags));
3134
3135       case STRING_CST:
3136         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3137                 && ! memcmp (TREE_STRING_POINTER (arg0),
3138                               TREE_STRING_POINTER (arg1),
3139                               TREE_STRING_LENGTH (arg0)));
3140
3141       case ADDR_EXPR:
3142         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3143                                 0);
3144       default:
3145         break;
3146       }
3147
3148   if (flags & OEP_ONLY_CONST)
3149     return 0;
3150
3151 /* Define macros to test an operand from arg0 and arg1 for equality and a
3152    variant that allows null and views null as being different from any
3153    non-null value.  In the latter case, if either is null, the both
3154    must be; otherwise, do the normal comparison.  */
3155 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3156                                     TREE_OPERAND (arg1, N), flags)
3157
3158 #define OP_SAME_WITH_NULL(N)                            \
3159   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3160    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3161
3162   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3163     {
3164     case tcc_unary:
3165       /* Two conversions are equal only if signedness and modes match.  */
3166       switch (TREE_CODE (arg0))
3167         {
3168         case NOP_EXPR:
3169         case CONVERT_EXPR:
3170         case FIX_TRUNC_EXPR:
3171           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3172               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3173             return 0;
3174           break;
3175         default:
3176           break;
3177         }
3178
3179       return OP_SAME (0);
3180
3181
3182     case tcc_comparison:
3183     case tcc_binary:
3184       if (OP_SAME (0) && OP_SAME (1))
3185         return 1;
3186
3187       /* For commutative ops, allow the other order.  */
3188       return (commutative_tree_code (TREE_CODE (arg0))
3189               && operand_equal_p (TREE_OPERAND (arg0, 0),
3190                                   TREE_OPERAND (arg1, 1), flags)
3191               && operand_equal_p (TREE_OPERAND (arg0, 1),
3192                                   TREE_OPERAND (arg1, 0), flags));
3193
3194     case tcc_reference:
3195       /* If either of the pointer (or reference) expressions we are
3196          dereferencing contain a side effect, these cannot be equal.  */
3197       if (TREE_SIDE_EFFECTS (arg0)
3198           || TREE_SIDE_EFFECTS (arg1))
3199         return 0;
3200
3201       switch (TREE_CODE (arg0))
3202         {
3203         case INDIRECT_REF:
3204         case ALIGN_INDIRECT_REF:
3205         case MISALIGNED_INDIRECT_REF:
3206         case REALPART_EXPR:
3207         case IMAGPART_EXPR:
3208           return OP_SAME (0);
3209
3210         case ARRAY_REF:
3211         case ARRAY_RANGE_REF:
3212           /* Operands 2 and 3 may be null.
3213              Compare the array index by value if it is constant first as we
3214              may have different types but same value here.  */
3215           return (OP_SAME (0)
3216                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3217                                           TREE_OPERAND (arg1, 1))
3218                       || OP_SAME (1))
3219                   && OP_SAME_WITH_NULL (2)
3220                   && OP_SAME_WITH_NULL (3));
3221
3222         case COMPONENT_REF:
3223           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3224              may be NULL when we're called to compare MEM_EXPRs.  */
3225           return OP_SAME_WITH_NULL (0)
3226                  && OP_SAME (1)
3227                  && OP_SAME_WITH_NULL (2);
3228
3229         case BIT_FIELD_REF:
3230           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3231
3232         default:
3233           return 0;
3234         }
3235
3236     case tcc_expression:
3237       switch (TREE_CODE (arg0))
3238         {
3239         case ADDR_EXPR:
3240         case TRUTH_NOT_EXPR:
3241           return OP_SAME (0);
3242
3243         case TRUTH_ANDIF_EXPR:
3244         case TRUTH_ORIF_EXPR:
3245           return OP_SAME (0) && OP_SAME (1);
3246
3247         case TRUTH_AND_EXPR:
3248         case TRUTH_OR_EXPR:
3249         case TRUTH_XOR_EXPR:
3250           if (OP_SAME (0) && OP_SAME (1))
3251             return 1;
3252
3253           /* Otherwise take into account this is a commutative operation.  */
3254           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3255                                    TREE_OPERAND (arg1, 1), flags)
3256                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3257                                       TREE_OPERAND (arg1, 0), flags));
3258
3259         default:
3260           return 0;
3261         }
3262
3263     case tcc_vl_exp:
3264       switch (TREE_CODE (arg0))
3265         {
3266         case CALL_EXPR:
3267           /* If the CALL_EXPRs call different functions, then they
3268              clearly can not be equal.  */
3269           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3270                                  flags))
3271             return 0;
3272
3273           {
3274             unsigned int cef = call_expr_flags (arg0);
3275             if (flags & OEP_PURE_SAME)
3276               cef &= ECF_CONST | ECF_PURE;
3277             else
3278               cef &= ECF_CONST;
3279             if (!cef)
3280               return 0;
3281           }
3282
3283           /* Now see if all the arguments are the same.  */
3284           {
3285             const_call_expr_arg_iterator iter0, iter1;
3286             const_tree a0, a1;
3287             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3288                    a1 = first_const_call_expr_arg (arg1, &iter1);
3289                  a0 && a1;
3290                  a0 = next_const_call_expr_arg (&iter0),
3291                    a1 = next_const_call_expr_arg (&iter1))
3292               if (! operand_equal_p (a0, a1, flags))
3293                 return 0;
3294
3295             /* If we get here and both argument lists are exhausted
3296                then the CALL_EXPRs are equal.  */
3297             return ! (a0 || a1);
3298           }
3299         default:
3300           return 0;
3301         }
3302
3303     case tcc_declaration:
3304       /* Consider __builtin_sqrt equal to sqrt.  */
3305       return (TREE_CODE (arg0) == FUNCTION_DECL
3306               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3307               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3308               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3309
3310     default:
3311       return 0;
3312     }
3313
3314 #undef OP_SAME
3315 #undef OP_SAME_WITH_NULL
3316 }
3317 \f
3318 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3319    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3320
3321    When in doubt, return 0.  */
3322
3323 static int
3324 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3325 {
3326   int unsignedp1, unsignedpo;
3327   tree primarg0, primarg1, primother;
3328   unsigned int correct_width;
3329
3330   if (operand_equal_p (arg0, arg1, 0))
3331     return 1;
3332
3333   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3334       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3335     return 0;
3336
3337   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3338      and see if the inner values are the same.  This removes any
3339      signedness comparison, which doesn't matter here.  */
3340   primarg0 = arg0, primarg1 = arg1;
3341   STRIP_NOPS (primarg0);
3342   STRIP_NOPS (primarg1);
3343   if (operand_equal_p (primarg0, primarg1, 0))
3344     return 1;
3345
3346   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3347      actual comparison operand, ARG0.
3348
3349      First throw away any conversions to wider types
3350      already present in the operands.  */
3351
3352   primarg1 = get_narrower (arg1, &unsignedp1);
3353   primother = get_narrower (other, &unsignedpo);
3354
3355   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3356   if (unsignedp1 == unsignedpo
3357       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3358       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3359     {
3360       tree type = TREE_TYPE (arg0);
3361
3362       /* Make sure shorter operand is extended the right way
3363          to match the longer operand.  */
3364       primarg1 = fold_convert (signed_or_unsigned_type_for
3365                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3366
3367       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3368         return 1;
3369     }
3370
3371   return 0;
3372 }
3373 \f
3374 /* See if ARG is an expression that is either a comparison or is performing
3375    arithmetic on comparisons.  The comparisons must only be comparing
3376    two different values, which will be stored in *CVAL1 and *CVAL2; if
3377    they are nonzero it means that some operands have already been found.
3378    No variables may be used anywhere else in the expression except in the
3379    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3380    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3381
3382    If this is true, return 1.  Otherwise, return zero.  */
3383
3384 static int
3385 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3386 {
3387   enum tree_code code = TREE_CODE (arg);
3388   enum tree_code_class class = TREE_CODE_CLASS (code);
3389
3390   /* We can handle some of the tcc_expression cases here.  */
3391   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3392     class = tcc_unary;
3393   else if (class == tcc_expression
3394            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3395                || code == COMPOUND_EXPR))
3396     class = tcc_binary;
3397
3398   else if (class == tcc_expression && code == SAVE_EXPR
3399            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3400     {
3401       /* If we've already found a CVAL1 or CVAL2, this expression is
3402          two complex to handle.  */
3403       if (*cval1 || *cval2)
3404         return 0;
3405
3406       class = tcc_unary;
3407       *save_p = 1;
3408     }
3409
3410   switch (class)
3411     {
3412     case tcc_unary:
3413       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3414
3415     case tcc_binary:
3416       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3417               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3418                                       cval1, cval2, save_p));
3419
3420     case tcc_constant:
3421       return 1;
3422
3423     case tcc_expression:
3424       if (code == COND_EXPR)
3425         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3426                                      cval1, cval2, save_p)
3427                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3428                                         cval1, cval2, save_p)
3429                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3430                                         cval1, cval2, save_p));
3431       return 0;
3432
3433     case tcc_comparison:
3434       /* First see if we can handle the first operand, then the second.  For
3435          the second operand, we know *CVAL1 can't be zero.  It must be that
3436          one side of the comparison is each of the values; test for the
3437          case where this isn't true by failing if the two operands
3438          are the same.  */
3439
3440       if (operand_equal_p (TREE_OPERAND (arg, 0),
3441                            TREE_OPERAND (arg, 1), 0))
3442         return 0;
3443
3444       if (*cval1 == 0)
3445         *cval1 = TREE_OPERAND (arg, 0);
3446       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3447         ;
3448       else if (*cval2 == 0)
3449         *cval2 = TREE_OPERAND (arg, 0);
3450       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3451         ;
3452       else
3453         return 0;
3454
3455       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3456         ;
3457       else if (*cval2 == 0)
3458         *cval2 = TREE_OPERAND (arg, 1);
3459       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3460         ;
3461       else
3462         return 0;
3463
3464       return 1;
3465
3466     default:
3467       return 0;
3468     }
3469 }
3470 \f
3471 /* ARG is a tree that is known to contain just arithmetic operations and
3472    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3473    any occurrence of OLD0 as an operand of a comparison and likewise for
3474    NEW1 and OLD1.  */
3475
3476 static tree
3477 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3478 {
3479   tree type = TREE_TYPE (arg);
3480   enum tree_code code = TREE_CODE (arg);
3481   enum tree_code_class class = TREE_CODE_CLASS (code);
3482
3483   /* We can handle some of the tcc_expression cases here.  */
3484   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3485     class = tcc_unary;
3486   else if (class == tcc_expression
3487            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3488     class = tcc_binary;
3489
3490   switch (class)
3491     {
3492     case tcc_unary:
3493       return fold_build1 (code, type,
3494                           eval_subst (TREE_OPERAND (arg, 0),
3495                                       old0, new0, old1, new1));
3496
3497     case tcc_binary:
3498       return fold_build2 (code, type,
3499                           eval_subst (TREE_OPERAND (arg, 0),
3500                                       old0, new0, old1, new1),
3501                           eval_subst (TREE_OPERAND (arg, 1),
3502                                       old0, new0, old1, new1));
3503
3504     case tcc_expression:
3505       switch (code)
3506         {
3507         case SAVE_EXPR:
3508           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3509
3510         case COMPOUND_EXPR:
3511           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3512
3513         case COND_EXPR:
3514           return fold_build3 (code, type,
3515                               eval_subst (TREE_OPERAND (arg, 0),
3516                                           old0, new0, old1, new1),
3517                               eval_subst (TREE_OPERAND (arg, 1),
3518                                           old0, new0, old1, new1),
3519                               eval_subst (TREE_OPERAND (arg, 2),
3520                                           old0, new0, old1, new1));
3521         default:
3522           break;
3523         }
3524       /* Fall through - ???  */
3525
3526     case tcc_comparison:
3527       {
3528         tree arg0 = TREE_OPERAND (arg, 0);
3529         tree arg1 = TREE_OPERAND (arg, 1);
3530
3531         /* We need to check both for exact equality and tree equality.  The
3532            former will be true if the operand has a side-effect.  In that
3533            case, we know the operand occurred exactly once.  */
3534
3535         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3536           arg0 = new0;
3537         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3538           arg0 = new1;
3539
3540         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3541           arg1 = new0;
3542         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3543           arg1 = new1;
3544
3545         return fold_build2 (code, type, arg0, arg1);
3546       }
3547
3548     default:
3549       return arg;
3550     }
3551 }
3552 \f
3553 /* Return a tree for the case when the result of an expression is RESULT
3554    converted to TYPE and OMITTED was previously an operand of the expression
3555    but is now not needed (e.g., we folded OMITTED * 0).
3556
3557    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3558    the conversion of RESULT to TYPE.  */
3559
3560 tree
3561 omit_one_operand (tree type, tree result, tree omitted)
3562 {
3563   tree t = fold_convert (type, result);
3564
3565   /* If the resulting operand is an empty statement, just return the omitted
3566      statement casted to void. */
3567   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3568     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3569
3570   if (TREE_SIDE_EFFECTS (omitted))
3571     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3572
3573   return non_lvalue (t);
3574 }
3575
3576 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3577
3578 static tree
3579 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3580 {
3581   tree t = fold_convert (type, result);
3582
3583   /* If the resulting operand is an empty statement, just return the omitted
3584      statement casted to void. */
3585   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3586     return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3587
3588   if (TREE_SIDE_EFFECTS (omitted))
3589     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3590
3591   return pedantic_non_lvalue (t);
3592 }
3593
3594 /* Return a tree for the case when the result of an expression is RESULT
3595    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3596    of the expression but are now not needed.
3597
3598    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3599    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3600    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3601    just do the conversion of RESULT to TYPE.  */
3602
3603 tree
3604 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3605 {
3606   tree t = fold_convert (type, result);
3607
3608   if (TREE_SIDE_EFFECTS (omitted2))
3609     t = build2 (COMPOUND_EXPR, type, omitted2, t);
3610   if (TREE_SIDE_EFFECTS (omitted1))
3611     t = build2 (COMPOUND_EXPR, type, omitted1, t);
3612
3613   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3614 }
3615
3616 \f
3617 /* Return a simplified tree node for the truth-negation of ARG.  This
3618    never alters ARG itself.  We assume that ARG is an operation that
3619    returns a truth value (0 or 1).
3620
3621    FIXME: one would think we would fold the result, but it causes
3622    problems with the dominator optimizer.  */
3623
3624 tree
3625 fold_truth_not_expr (tree arg)
3626 {
3627   tree type = TREE_TYPE (arg);
3628   enum tree_code code = TREE_CODE (arg);
3629
3630   /* If this is a comparison, we can simply invert it, except for
3631      floating-point non-equality comparisons, in which case we just
3632      enclose a TRUTH_NOT_EXPR around what we have.  */
3633
3634   if (TREE_CODE_CLASS (code) == tcc_comparison)
3635     {
3636       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3637       if (FLOAT_TYPE_P (op_type)
3638           && flag_trapping_math
3639           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3640           && code != NE_EXPR && code != EQ_EXPR)
3641         return NULL_TREE;
3642       else
3643         {
3644           code = invert_tree_comparison (code,
3645                                          HONOR_NANS (TYPE_MODE (op_type)));
3646           if (code == ERROR_MARK)
3647             return NULL_TREE;
3648           else
3649             return build2 (code, type,
3650                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3651         }
3652     }
3653
3654   switch (code)
3655     {
3656     case INTEGER_CST:
3657       return constant_boolean_node (integer_zerop (arg), type);
3658
3659     case TRUTH_AND_EXPR:
3660       return build2 (TRUTH_OR_EXPR, type,
3661                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3662                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3663
3664     case TRUTH_OR_EXPR:
3665       return build2 (TRUTH_AND_EXPR, type,
3666                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3667                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3668
3669     case TRUTH_XOR_EXPR:
3670       /* Here we can invert either operand.  We invert the first operand
3671          unless the second operand is a TRUTH_NOT_EXPR in which case our
3672          result is the XOR of the first operand with the inside of the
3673          negation of the second operand.  */
3674
3675       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3676         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3677                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3678       else
3679         return build2 (TRUTH_XOR_EXPR, type,
3680                        invert_truthvalue (TREE_OPERAND (arg, 0)),
3681                        TREE_OPERAND (arg, 1));
3682
3683     case TRUTH_ANDIF_EXPR:
3684       return build2 (TRUTH_ORIF_EXPR, type,
3685                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3686                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3687
3688     case TRUTH_ORIF_EXPR:
3689       return build2 (TRUTH_ANDIF_EXPR, type,
3690                      invert_truthvalue (TREE_OPERAND (arg, 0)),
3691                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3692
3693     case TRUTH_NOT_EXPR:
3694       return TREE_OPERAND (arg, 0);
3695
3696     case COND_EXPR:
3697       {
3698         tree arg1 = TREE_OPERAND (arg, 1);
3699         tree arg2 = TREE_OPERAND (arg, 2);
3700         /* A COND_EXPR may have a throw as one operand, which
3701            then has void type.  Just leave void operands
3702            as they are.  */
3703         return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3704                        VOID_TYPE_P (TREE_TYPE (arg1))
3705                        ? arg1 : invert_truthvalue (arg1),
3706                        VOID_TYPE_P (TREE_TYPE (arg2))
3707                        ? arg2 : invert_truthvalue (arg2));
3708       }
3709
3710     case COMPOUND_EXPR:
3711       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3712                      invert_truthvalue (TREE_OPERAND (arg, 1)));
3713
3714     case NON_LVALUE_EXPR:
3715       return invert_truthvalue (TREE_OPERAND (arg, 0));
3716
3717     case NOP_EXPR:
3718       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3719         return build1 (TRUTH_NOT_EXPR, type, arg);
3720
3721     case CONVERT_EXPR:
3722     case FLOAT_EXPR:
3723       return build1 (TREE_CODE (arg), type,
3724                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3725
3726     case BIT_AND_EXPR:
3727       if (!integer_onep (TREE_OPERAND (arg, 1)))
3728         break;
3729       return build2 (EQ_EXPR, type, arg,
3730                      build_int_cst (type, 0));
3731
3732     case SAVE_EXPR:
3733       return build1 (TRUTH_NOT_EXPR, type, arg);
3734
3735     case CLEANUP_POINT_EXPR:
3736       return build1 (CLEANUP_POINT_EXPR, type,
3737                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3738
3739     default:
3740       break;
3741     }
3742
3743   return NULL_TREE;
3744 }
3745
3746 /* Return a simplified tree node for the truth-negation of ARG.  This
3747    never alters ARG itself.  We assume that ARG is an operation that
3748    returns a truth value (0 or 1).
3749
3750    FIXME: one would think we would fold the result, but it causes
3751    problems with the dominator optimizer.  */
3752
3753 tree
3754 invert_truthvalue (tree arg)
3755 {
3756   tree tem;
3757
3758   if (TREE_CODE (arg) == ERROR_MARK)
3759     return arg;
3760
3761   tem = fold_truth_not_expr (arg);
3762   if (!tem)
3763     tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3764
3765   return tem;
3766 }
3767
3768 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3769    operands are another bit-wise operation with a common input.  If so,
3770    distribute the bit operations to save an operation and possibly two if
3771    constants are involved.  For example, convert
3772         (A | B) & (A | C) into A | (B & C)
3773    Further simplification will occur if B and C are constants.
3774
3775    If this optimization cannot be done, 0 will be returned.  */
3776
3777 static tree
3778 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3779 {
3780   tree common;
3781   tree left, right;
3782
3783   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3784       || TREE_CODE (arg0) == code
3785       || (TREE_CODE (arg0) != BIT_AND_EXPR
3786           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3787     return 0;
3788
3789   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3790     {
3791       common = TREE_OPERAND (arg0, 0);
3792       left = TREE_OPERAND (arg0, 1);
3793       right = TREE_OPERAND (arg1, 1);
3794     }
3795   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3796     {
3797       common = TREE_OPERAND (arg0, 0);
3798       left = TREE_OPERAND (arg0, 1);
3799       right = TREE_OPERAND (arg1, 0);
3800     }
3801   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3802     {
3803       common = TREE_OPERAND (arg0, 1);
3804       left = TREE_OPERAND (arg0, 0);
3805       right = TREE_OPERAND (arg1, 1);
3806     }
3807   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3808     {
3809       common = TREE_OPERAND (arg0, 1);
3810       left = TREE_OPERAND (arg0, 0);
3811       right = TREE_OPERAND (arg1, 0);
3812     }
3813   else
3814     return 0;
3815
3816   return fold_build2 (TREE_CODE (arg0), type, common,
3817                       fold_build2 (code, type, left, right));
3818 }
3819
3820 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3821    with code CODE.  This optimization is unsafe.  */
3822 static tree
3823 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3824 {
3825   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3826   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3827
3828   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3829   if (mul0 == mul1
3830       && operand_equal_p (TREE_OPERAND (arg0, 1),
3831                        TREE_OPERAND (arg1, 1), 0))
3832     return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3833                         fold_build2 (code, type,
3834                                      TREE_OPERAND (arg0, 0),
3835                                      TREE_OPERAND (arg1, 0)),
3836                         TREE_OPERAND (arg0, 1));
3837
3838   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3839   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3840                        TREE_OPERAND (arg1, 0), 0)
3841       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3842       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3843     {
3844       REAL_VALUE_TYPE r0, r1;
3845       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3846       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3847       if (!mul0)
3848         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3849       if (!mul1)
3850         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3851       real_arithmetic (&r0, code, &r0, &r1);
3852       return fold_build2 (MULT_EXPR, type,
3853                           TREE_OPERAND (arg0, 0),
3854                           build_real (type, r0));
3855     }
3856
3857   return NULL_TREE;
3858 }
3859 \f
3860 /* Subroutine for fold_truthop: decode a field reference.
3861
3862    If EXP is a comparison reference, we return the innermost reference.
3863
3864    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3865    set to the starting bit number.
3866
3867    If the innermost field can be completely contained in a mode-sized
3868    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3869
3870    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3871    otherwise it is not changed.
3872
3873    *PUNSIGNEDP is set to the signedness of the field.
3874
3875    *PMASK is set to the mask used.  This is either contained in a
3876    BIT_AND_EXPR or derived from the width of the field.
3877
3878    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3879
3880    Return 0 if this is not a component reference or is one that we can't
3881    do anything with.  */
3882
3883 static tree
3884 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3885                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3886                         int *punsignedp, int *pvolatilep,
3887                         tree *pmask, tree *pand_mask)
3888 {
3889   tree outer_type = 0;
3890   tree and_mask = 0;
3891   tree mask, inner, offset;
3892   tree unsigned_type;
3893   unsigned int precision;
3894
3895   /* All the optimizations using this function assume integer fields.
3896      There are problems with FP fields since the type_for_size call
3897      below can fail for, e.g., XFmode.  */
3898   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3899     return 0;
3900
3901   /* We are interested in the bare arrangement of bits, so strip everything
3902      that doesn't affect the machine mode.  However, record the type of the
3903      outermost expression if it may matter below.  */
3904   if (TREE_CODE (exp) == NOP_EXPR
3905       || TREE_CODE (exp) == CONVERT_EXPR
3906       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3907     outer_type = TREE_TYPE (exp);
3908   STRIP_NOPS (exp);
3909
3910   if (TREE_CODE (exp) == BIT_AND_EXPR)
3911     {
3912       and_mask = TREE_OPERAND (exp, 1);
3913       exp = TREE_OPERAND (exp, 0);
3914       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3915       if (TREE_CODE (and_mask) != INTEGER_CST)
3916         return 0;
3917     }
3918
3919   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3920                                punsignedp, pvolatilep, false);
3921   if ((inner == exp && and_mask == 0)
3922       || *pbitsize < 0 || offset != 0
3923       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3924     return 0;
3925
3926   /* If the number of bits in the reference is the same as the bitsize of
3927      the outer type, then the outer type gives the signedness. Otherwise
3928      (in case of a small bitfield) the signedness is unchanged.  */
3929   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3930     *punsignedp = TYPE_UNSIGNED (outer_type);
3931
3932   /* Compute the mask to access the bitfield.  */
3933   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3934   precision = TYPE_PRECISION (unsigned_type);
3935
3936   mask = build_int_cst_type (unsigned_type, -1);
3937
3938   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3939   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3940
3941   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3942   if (and_mask != 0)
3943     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3944                         fold_convert (unsigned_type, and_mask), mask);
3945
3946   *pmask = mask;
3947   *pand_mask = and_mask;
3948   return inner;
3949 }
3950
3951 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3952    represents the sign bit of EXP's type.  If EXP represents a sign
3953    or zero extension, also test VAL against the unextended type.
3954    The return value is the (sub)expression whose sign bit is VAL,
3955    or NULL_TREE otherwise.  */
3956
3957 static tree
3958 sign_bit_p (tree exp, const_tree val)
3959 {
3960   unsigned HOST_WIDE_INT mask_lo, lo;
3961   HOST_WIDE_INT mask_hi, hi;
3962   int width;
3963   tree t;
3964
3965   /* Tree EXP must have an integral type.  */
3966   t = TREE_TYPE (exp);
3967   if (! INTEGRAL_TYPE_P (t))
3968     return NULL_TREE;
3969
3970   /* Tree VAL must be an integer constant.  */
3971   if (TREE_CODE (val) != INTEGER_CST
3972       || TREE_OVERFLOW (val))
3973     return NULL_TREE;
3974
3975   width = TYPE_PRECISION (t);
3976   if (width > HOST_BITS_PER_WIDE_INT)
3977     {
3978       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3979       lo = 0;
3980
3981       mask_hi = ((unsigned HOST_WIDE_INT) -1
3982                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3983       mask_lo = -1;
3984     }
3985   else
3986     {
3987       hi = 0;
3988       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3989
3990       mask_hi = 0;
3991       mask_lo = ((unsigned HOST_WIDE_INT) -1
3992                  >> (HOST_BITS_PER_WIDE_INT - width));
3993     }
3994
3995   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3996      treat VAL as if it were unsigned.  */
3997   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3998       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3999     return exp;
4000
4001   /* Handle extension from a narrower type.  */
4002   if (TREE_CODE (exp) == NOP_EXPR
4003       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4004     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4005
4006   return NULL_TREE;
4007 }
4008
4009 /* Subroutine for fold_truthop: determine if an operand is simple enough
4010    to be evaluated unconditionally.  */
4011
4012 static int
4013 simple_operand_p (const_tree exp)
4014 {
4015   /* Strip any conversions that don't change the machine mode.  */
4016   STRIP_NOPS (exp);
4017
4018   return (CONSTANT_CLASS_P (exp)
4019           || TREE_CODE (exp) == SSA_NAME
4020           || (DECL_P (exp)
4021               && ! TREE_ADDRESSABLE (exp)
4022               && ! TREE_THIS_VOLATILE (exp)
4023               && ! DECL_NONLOCAL (exp)
4024               /* Don't regard global variables as simple.  They may be
4025                  allocated in ways unknown to the compiler (shared memory,
4026                  #pragma weak, etc).  */
4027               && ! TREE_PUBLIC (exp)
4028               && ! DECL_EXTERNAL (exp)
4029               /* Loading a static variable is unduly expensive, but global
4030                  registers aren't expensive.  */
4031               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4032 }
4033 \f
4034 /* The following functions are subroutines to fold_range_test and allow it to
4035    try to change a logical combination of comparisons into a range test.
4036
4037    For example, both
4038         X == 2 || X == 3 || X == 4 || X == 5
4039    and
4040         X >= 2 && X <= 5
4041    are converted to
4042         (unsigned) (X - 2) <= 3
4043
4044    We describe each set of comparisons as being either inside or outside
4045    a range, using a variable named like IN_P, and then describe the
4046    range with a lower and upper bound.  If one of the bounds is omitted,
4047    it represents either the highest or lowest value of the type.
4048
4049    In the comments below, we represent a range by two numbers in brackets
4050    preceded by a "+" to designate being inside that range, or a "-" to
4051    designate being outside that range, so the condition can be inverted by
4052    flipping the prefix.  An omitted bound is represented by a "-".  For
4053    example, "- [-, 10]" means being outside the range starting at the lowest
4054    possible value and ending at 10, in other words, being greater than 10.
4055    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4056    always false.
4057
4058    We set up things so that the missing bounds are handled in a consistent
4059    manner so neither a missing bound nor "true" and "false" need to be
4060    handled using a special case.  */
4061
4062 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4063    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4064    and UPPER1_P are nonzero if the respective argument is an upper bound
4065    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4066    must be specified for a comparison.  ARG1 will be converted to ARG0's
4067    type if both are specified.  */
4068
4069 static tree
4070 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4071              tree arg1, int upper1_p)
4072 {
4073   tree tem;
4074   int result;
4075   int sgn0, sgn1;
4076
4077   /* If neither arg represents infinity, do the normal operation.
4078      Else, if not a comparison, return infinity.  Else handle the special
4079      comparison rules. Note that most of the cases below won't occur, but
4080      are handled for consistency.  */
4081
4082   if (arg0 != 0 && arg1 != 0)
4083     {
4084       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4085                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4086       STRIP_NOPS (tem);
4087       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4088     }
4089
4090   if (TREE_CODE_CLASS (code) != tcc_comparison)
4091     return 0;
4092
4093   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4094      for neither.  In real maths, we cannot assume open ended ranges are
4095      the same. But, this is computer arithmetic, where numbers are finite.
4096      We can therefore make the transformation of any unbounded range with
4097      the value Z, Z being greater than any representable number. This permits
4098      us to treat unbounded ranges as equal.  */
4099   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4100   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4101   switch (code)
4102     {
4103     case EQ_EXPR:
4104       result = sgn0 == sgn1;
4105       break;
4106     case NE_EXPR:
4107       result = sgn0 != sgn1;
4108       break;
4109     case LT_EXPR:
4110       result = sgn0 < sgn1;
4111       break;
4112     case LE_EXPR:
4113       result = sgn0 <= sgn1;
4114       break;
4115     case GT_EXPR:
4116       result = sgn0 > sgn1;
4117       break;
4118     case GE_EXPR:
4119       result = sgn0 >= sgn1;
4120       break;
4121     default:
4122       gcc_unreachable ();
4123     }
4124
4125   return constant_boolean_node (result, type);
4126 }
4127 \f
4128 /* Given EXP, a logical expression, set the range it is testing into
4129    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4130    actually being tested.  *PLOW and *PHIGH will be made of the same
4131    type as the returned expression.  If EXP is not a comparison, we
4132    will most likely not be returning a useful value and range.  Set
4133    *STRICT_OVERFLOW_P to true if the return value is only valid
4134    because signed overflow is undefined; otherwise, do not change
4135    *STRICT_OVERFLOW_P.  */
4136
4137 static tree
4138 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4139             bool *strict_overflow_p)
4140 {
4141   enum tree_code code;
4142   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4143   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4144   int in_p, n_in_p;
4145   tree low, high, n_low, n_high;
4146
4147   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4148      and see if we can refine the range.  Some of the cases below may not
4149      happen, but it doesn't seem worth worrying about this.  We "continue"
4150      the outer loop when we've changed something; otherwise we "break"
4151      the switch, which will "break" the while.  */
4152
4153   in_p = 0;
4154   low = high = build_int_cst (TREE_TYPE (exp), 0);
4155
4156   while (1)
4157     {
4158       code = TREE_CODE (exp);
4159       exp_type = TREE_TYPE (exp);
4160
4161       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4162         {
4163           if (TREE_OPERAND_LENGTH (exp) > 0)
4164             arg0 = TREE_OPERAND (exp, 0);
4165           if (TREE_CODE_CLASS (code) == tcc_comparison
4166               || TREE_CODE_CLASS (code) == tcc_unary
4167               || TREE_CODE_CLASS (code) == tcc_binary)
4168             arg0_type = TREE_TYPE (arg0);
4169           if (TREE_CODE_CLASS (code) == tcc_binary
4170               || TREE_CODE_CLASS (code) == tcc_comparison
4171               || (TREE_CODE_CLASS (code) == tcc_expression
4172                   && TREE_OPERAND_LENGTH (exp) > 1))
4173             arg1 = TREE_OPERAND (exp, 1);
4174         }
4175
4176       switch (code)
4177         {
4178         case TRUTH_NOT_EXPR:
4179           in_p = ! in_p, exp = arg0;
4180           continue;
4181
4182         case EQ_EXPR: case NE_EXPR:
4183         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4184           /* We can only do something if the range is testing for zero
4185              and if the second operand is an integer constant.  Note that
4186              saying something is "in" the range we make is done by
4187              complementing IN_P since it will set in the initial case of
4188              being not equal to zero; "out" is leaving it alone.  */
4189           if (low == 0 || high == 0
4190               || ! integer_zerop (low) || ! integer_zerop (high)
4191               || TREE_CODE (arg1) != INTEGER_CST)
4192             break;
4193
4194           switch (code)
4195             {
4196             case NE_EXPR:  /* - [c, c]  */
4197               low = high = arg1;
4198               break;
4199             case EQ_EXPR:  /* + [c, c]  */
4200               in_p = ! in_p, low = high = arg1;
4201               break;
4202             case GT_EXPR:  /* - [-, c] */
4203               low = 0, high = arg1;
4204               break;
4205             case GE_EXPR:  /* + [c, -] */
4206               in_p = ! in_p, low = arg1, high = 0;
4207               break;
4208             case LT_EXPR:  /* - [c, -] */
4209               low = arg1, high = 0;
4210               break;
4211             case LE_EXPR:  /* + [-, c] */
4212               in_p = ! in_p, low = 0, high = arg1;
4213               break;
4214             default:
4215               gcc_unreachable ();
4216             }
4217
4218           /* If this is an unsigned comparison, we also know that EXP is
4219              greater than or equal to zero.  We base the range tests we make
4220              on that fact, so we record it here so we can parse existing
4221              range tests.  We test arg0_type since often the return type
4222              of, e.g. EQ_EXPR, is boolean.  */
4223           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4224             {
4225               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4226                                   in_p, low, high, 1,
4227                                   build_int_cst (arg0_type, 0),
4228                                   NULL_TREE))
4229                 break;
4230
4231               in_p = n_in_p, low = n_low, high = n_high;
4232
4233               /* If the high bound is missing, but we have a nonzero low
4234                  bound, reverse the range so it goes from zero to the low bound
4235                  minus 1.  */
4236               if (high == 0 && low && ! integer_zerop (low))
4237                 {
4238                   in_p = ! in_p;
4239                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4240                                       integer_one_node, 0);
4241                   low = build_int_cst (arg0_type, 0);
4242                 }
4243             }
4244
4245           exp = arg0;
4246           continue;
4247
4248         case NEGATE_EXPR:
4249           /* (-x) IN [a,b] -> x in [-b, -a]  */
4250           n_low = range_binop (MINUS_EXPR, exp_type,
4251                                build_int_cst (exp_type, 0),
4252                                0, high, 1);
4253           n_high = range_binop (MINUS_EXPR, exp_type,
4254                                 build_int_cst (exp_type, 0),
4255                                 0, low, 0);
4256           low = n_low, high = n_high;
4257           exp = arg0;
4258           continue;
4259
4260         case BIT_NOT_EXPR:
4261           /* ~ X -> -X - 1  */
4262           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4263                         build_int_cst (exp_type, 1));
4264           continue;
4265
4266         case PLUS_EXPR:  case MINUS_EXPR:
4267           if (TREE_CODE (arg1) != INTEGER_CST)
4268             break;
4269
4270           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4271              move a constant to the other side.  */
4272           if (!TYPE_UNSIGNED (arg0_type)
4273               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4274             break;
4275
4276           /* If EXP is signed, any overflow in the computation is undefined,
4277              so we don't worry about it so long as our computations on
4278              the bounds don't overflow.  For unsigned, overflow is defined
4279              and this is exactly the right thing.  */
4280           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4281                                arg0_type, low, 0, arg1, 0);
4282           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4283                                 arg0_type, high, 1, arg1, 0);
4284           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4285               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4286             break;
4287
4288           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4289             *strict_overflow_p = true;
4290
4291           /* Check for an unsigned range which has wrapped around the maximum
4292              value thus making n_high < n_low, and normalize it.  */
4293           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4294             {
4295               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4296                                  integer_one_node, 0);
4297               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4298                                   integer_one_node, 0);
4299
4300               /* If the range is of the form +/- [ x+1, x ], we won't
4301                  be able to normalize it.  But then, it represents the
4302                  whole range or the empty set, so make it
4303                  +/- [ -, - ].  */
4304               if (tree_int_cst_equal (n_low, low)
4305                   && tree_int_cst_equal (n_high, high))
4306                 low = high = 0;
4307               else
4308                 in_p = ! in_p;
4309             }
4310           else
4311             low = n_low, high = n_high;
4312
4313           exp = arg0;
4314           continue;
4315
4316         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
4317           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4318             break;
4319
4320           if (! INTEGRAL_TYPE_P (arg0_type)
4321               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4322               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4323             break;
4324
4325           n_low = low, n_high = high;
4326
4327           if (n_low != 0)
4328             n_low = fold_convert (arg0_type, n_low);
4329
4330           if (n_high != 0)
4331             n_high = fold_convert (arg0_type, n_high);
4332
4333
4334           /* If we're converting arg0 from an unsigned type, to exp,
4335              a signed type,  we will be doing the comparison as unsigned.
4336              The tests above have already verified that LOW and HIGH
4337              are both positive.
4338
4339              So we have to ensure that we will handle large unsigned
4340              values the same way that the current signed bounds treat
4341              negative values.  */
4342
4343           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4344             {
4345               tree high_positive;
4346               tree equiv_type;
4347               /* For fixed-point modes, we need to pass the saturating flag
4348                  as the 2nd parameter.  */
4349               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4350                 equiv_type = lang_hooks.types.type_for_mode
4351                              (TYPE_MODE (arg0_type),
4352                               TYPE_SATURATING (arg0_type));
4353               else
4354                 equiv_type = lang_hooks.types.type_for_mode
4355                              (TYPE_MODE (arg0_type), 1);
4356
4357               /* A range without an upper bound is, naturally, unbounded.
4358                  Since convert would have cropped a very large value, use
4359                  the max value for the destination type.  */
4360               high_positive
4361                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4362                 : TYPE_MAX_VALUE (arg0_type);
4363
4364               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4365                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4366                                              fold_convert (arg0_type,
4367                                                            high_positive),
4368                                              build_int_cst (arg0_type, 1));
4369
4370               /* If the low bound is specified, "and" the range with the
4371                  range for which the original unsigned value will be
4372                  positive.  */
4373               if (low != 0)
4374                 {
4375                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4376                                       1, n_low, n_high, 1,
4377                                       fold_convert (arg0_type,
4378                                                     integer_zero_node),
4379                                       high_positive))
4380                     break;
4381
4382                   in_p = (n_in_p == in_p);
4383                 }
4384               else
4385                 {
4386                   /* Otherwise, "or" the range with the range of the input
4387                      that will be interpreted as negative.  */
4388                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4389                                       0, n_low, n_high, 1,
4390                                       fold_convert (arg0_type,
4391                                                     integer_zero_node),
4392                                       high_positive))
4393                     break;
4394
4395                   in_p = (in_p != n_in_p);
4396                 }
4397             }
4398
4399           exp = arg0;
4400           low = n_low, high = n_high;
4401           continue;
4402
4403         default:
4404           break;
4405         }
4406
4407       break;
4408     }
4409
4410   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4411   if (TREE_CODE (exp) == INTEGER_CST)
4412     {
4413       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4414                                                  exp, 0, low, 0))
4415                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4416                                                     exp, 1, high, 1)));
4417       low = high = 0;
4418       exp = 0;
4419     }
4420
4421   *pin_p = in_p, *plow = low, *phigh = high;
4422   return exp;
4423 }
4424 \f
4425 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4426    type, TYPE, return an expression to test if EXP is in (or out of, depending
4427    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4428
4429 static tree
4430 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4431 {
4432   tree etype = TREE_TYPE (exp);
4433   tree value;
4434
4435 #ifdef HAVE_canonicalize_funcptr_for_compare
4436   /* Disable this optimization for function pointer expressions
4437      on targets that require function pointer canonicalization.  */
4438   if (HAVE_canonicalize_funcptr_for_compare
4439       && TREE_CODE (etype) == POINTER_TYPE
4440       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4441     return NULL_TREE;
4442 #endif
4443
4444   if (! in_p)
4445     {
4446       value = build_range_check (type, exp, 1, low, high);
4447       if (value != 0)
4448         return invert_truthvalue (value);
4449
4450       return 0;
4451     }
4452
4453   if (low == 0 && high == 0)
4454     return build_int_cst (type, 1);
4455
4456   if (low == 0)
4457     return fold_build2 (LE_EXPR, type, exp,
4458                         fold_convert (etype, high));
4459
4460   if (high == 0)
4461     return fold_build2 (GE_EXPR, type, exp,
4462                         fold_convert (etype, low));
4463
4464   if (operand_equal_p (low, high, 0))
4465     return fold_build2 (EQ_EXPR, type, exp,
4466                         fold_convert (etype, low));
4467
4468   if (integer_zerop (low))
4469     {
4470       if (! TYPE_UNSIGNED (etype))
4471         {
4472           etype = unsigned_type_for (etype);
4473           high = fold_convert (etype, high);
4474           exp = fold_convert (etype, exp);
4475         }
4476       return build_range_check (type, exp, 1, 0, high);
4477     }
4478
4479   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4480   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4481     {
4482       unsigned HOST_WIDE_INT lo;
4483       HOST_WIDE_INT hi;
4484       int prec;
4485
4486       prec = TYPE_PRECISION (etype);
4487       if (prec <= HOST_BITS_PER_WIDE_INT)
4488         {
4489           hi = 0;
4490           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4491         }
4492       else
4493         {
4494           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4495           lo = (unsigned HOST_WIDE_INT) -1;
4496         }
4497
4498       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4499         {
4500           if (TYPE_UNSIGNED (etype))
4501             {
4502               etype = signed_type_for (etype);
4503               exp = fold_convert (etype, exp);
4504             }
4505           return fold_build2 (GT_EXPR, type, exp,
4506                               build_int_cst (etype, 0));
4507         }
4508     }
4509
4510   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4511      This requires wrap-around arithmetics for the type of the expression.  */
4512   switch (TREE_CODE (etype))
4513     {
4514     case INTEGER_TYPE:
4515       /* There is no requirement that LOW be within the range of ETYPE
4516          if the latter is a subtype.  It must, however, be within the base
4517          type of ETYPE.  So be sure we do the subtraction in that type.  */
4518       if (TREE_TYPE (etype))
4519         etype = TREE_TYPE (etype);
4520       break;
4521
4522     case ENUMERAL_TYPE:
4523     case BOOLEAN_TYPE:
4524       etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4525                                               TYPE_UNSIGNED (etype));
4526       break;
4527
4528     default:
4529       break;
4530     }
4531
4532   /* If we don't have wrap-around arithmetics upfront, try to force it.  */
4533   if (TREE_CODE (etype) == INTEGER_TYPE
4534       && !TYPE_OVERFLOW_WRAPS (etype))
4535     {
4536       tree utype, minv, maxv;
4537
4538       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4539          for the type in question, as we rely on this here.  */
4540       utype = unsigned_type_for (etype);
4541       maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4542       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4543                           integer_one_node, 1);
4544       minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4545
4546       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4547                                       minv, 1, maxv, 1)))
4548         etype = utype;
4549       else
4550         return 0;
4551     }
4552
4553   high = fold_convert (etype, high);
4554   low = fold_convert (etype, low);
4555   exp = fold_convert (etype, exp);
4556
4557   value = const_binop (MINUS_EXPR, high, low, 0);
4558
4559
4560   if (POINTER_TYPE_P (etype))
4561     {
4562       if (value != 0 && !TREE_OVERFLOW (value))
4563         {
4564           low = fold_convert (sizetype, low);
4565           low = fold_build1 (NEGATE_EXPR, sizetype, low);
4566           return build_range_check (type,
4567                                     fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4568                                     1, build_int_cst (etype, 0), value);
4569         }
4570       return 0;
4571     }
4572
4573   if (value != 0 && !TREE_OVERFLOW (value))
4574     return build_range_check (type,
4575                               fold_build2 (MINUS_EXPR, etype, exp, low),
4576                               1, build_int_cst (etype, 0), value);
4577
4578   return 0;
4579 }
4580 \f
4581 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4582
4583 static tree
4584 range_predecessor (tree val)
4585 {
4586   tree type = TREE_TYPE (val);
4587
4588   if (INTEGRAL_TYPE_P (type)
4589       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4590     return 0;
4591   else
4592     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4593 }
4594
4595 /* Return the successor of VAL in its type, handling the infinite case.  */
4596
4597 static tree
4598 range_successor (tree val)
4599 {
4600   tree type = TREE_TYPE (val);
4601
4602   if (INTEGRAL_TYPE_P (type)
4603       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4604     return 0;
4605   else
4606     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4607 }
4608
4609 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4610    can, 0 if we can't.  Set the output range into the specified parameters.  */
4611
4612 static int
4613 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4614               tree high0, int in1_p, tree low1, tree high1)
4615 {
4616   int no_overlap;
4617   int subset;
4618   int temp;
4619   tree tem;
4620   int in_p;
4621   tree low, high;
4622   int lowequal = ((low0 == 0 && low1 == 0)
4623                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4624                                                 low0, 0, low1, 0)));
4625   int highequal = ((high0 == 0 && high1 == 0)
4626                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4627                                                  high0, 1, high1, 1)));
4628
4629   /* Make range 0 be the range that starts first, or ends last if they
4630      start at the same value.  Swap them if it isn't.  */
4631   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4632                                  low0, 0, low1, 0))
4633       || (lowequal
4634           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4635                                         high1, 1, high0, 1))))
4636     {
4637       temp = in0_p, in0_p = in1_p, in1_p = temp;
4638       tem = low0, low0 = low1, low1 = tem;
4639       tem = high0, high0 = high1, high1 = tem;
4640     }
4641
4642   /* Now flag two cases, whether the ranges are disjoint or whether the
4643      second range is totally subsumed in the first.  Note that the tests
4644      below are simplified by the ones above.  */
4645   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4646                                           high0, 1, low1, 0));
4647   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4648                                       high1, 1, high0, 1));
4649
4650   /* We now have four cases, depending on whether we are including or
4651      excluding the two ranges.  */
4652   if (in0_p && in1_p)
4653     {
4654       /* If they don't overlap, the result is false.  If the second range
4655          is a subset it is the result.  Otherwise, the range is from the start
4656          of the second to the end of the first.  */
4657       if (no_overlap)
4658         in_p = 0, low = high = 0;
4659       else if (subset)
4660         in_p = 1, low = low1, high = high1;
4661       else
4662         in_p = 1, low = low1, high = high0;
4663     }
4664
4665   else if (in0_p && ! in1_p)
4666     {
4667       /* If they don't overlap, the result is the first range.  If they are
4668          equal, the result is false.  If the second range is a subset of the
4669          first, and the ranges begin at the same place, we go from just after
4670          the end of the second range to the end of the first.  If the second
4671          range is not a subset of the first, or if it is a subset and both
4672          ranges end at the same place, the range starts at the start of the
4673          first range and ends just before the second range.
4674          Otherwise, we can't describe this as a single range.  */
4675       if (no_overlap)
4676         in_p = 1, low = low0, high = high0;
4677       else if (lowequal && highequal)
4678         in_p = 0, low = high = 0;
4679       else if (subset && lowequal)
4680         {
4681           low = range_successor (high1);
4682           high = high0;
4683           in_p = 1;
4684           if (low == 0)
4685             {
4686               /* We are in the weird situation where high0 > high1 but
4687                  high1 has no successor.  Punt.  */
4688               return 0;
4689             }
4690         }
4691       else if (! subset || highequal)
4692         {
4693           low = low0;
4694           high = range_predecessor (low1);
4695           in_p = 1;
4696           if (high == 0)
4697             {
4698               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4699               return 0;
4700             }
4701         }
4702       else
4703         return 0;
4704     }
4705
4706   else if (! in0_p && in1_p)
4707     {
4708       /* If they don't overlap, the result is the second range.  If the second
4709          is a subset of the first, the result is false.  Otherwise,
4710          the range starts just after the first range and ends at the
4711          end of the second.  */
4712       if (no_overlap)
4713         in_p = 1, low = low1, high = high1;
4714       else if (subset || highequal)
4715         in_p = 0, low = high = 0;
4716       else
4717         {
4718           low = range_successor (high0);
4719           high = high1;
4720           in_p = 1;
4721           if (low == 0)
4722             {
4723               /* high1 > high0 but high0 has no successor.  Punt.  */
4724               return 0;
4725             }
4726         }
4727     }
4728
4729   else
4730     {
4731       /* The case where we are excluding both ranges.  Here the complex case
4732          is if they don't overlap.  In that case, the only time we have a
4733          range is if they are adjacent.  If the second is a subset of the
4734          first, the result is the first.  Otherwise, the range to exclude
4735          starts at the beginning of the first range and ends at the end of the
4736          second.  */
4737       if (no_overlap)
4738         {
4739           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4740                                          range_successor (high0),
4741                                          1, low1, 0)))
4742             in_p = 0, low = low0, high = high1;
4743           else
4744             {
4745               /* Canonicalize - [min, x] into - [-, x].  */
4746               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4747                 switch (TREE_CODE (TREE_TYPE (low0)))
4748                   {
4749                   case ENUMERAL_TYPE:
4750                     if (TYPE_PRECISION (TREE_TYPE (low0))
4751                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4752                       break;
4753                     /* FALLTHROUGH */
4754                   case INTEGER_TYPE:
4755                     if (tree_int_cst_equal (low0,
4756                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4757                       low0 = 0;
4758                     break;
4759                   case POINTER_TYPE:
4760                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4761                         && integer_zerop (low0))
4762                       low0 = 0;
4763                     break;
4764                   default:
4765                     break;
4766                   }
4767
4768               /* Canonicalize - [x, max] into - [x, -].  */
4769               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4770                 switch (TREE_CODE (TREE_TYPE (high1)))
4771                   {
4772                   case ENUMERAL_TYPE:
4773                     if (TYPE_PRECISION (TREE_TYPE (high1))
4774                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4775                       break;
4776                     /* FALLTHROUGH */
4777                   case INTEGER_TYPE:
4778                     if (tree_int_cst_equal (high1,
4779                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4780                       high1 = 0;
4781                     break;
4782                   case POINTER_TYPE:
4783                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4784                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4785                                                        high1, 1,
4786                                                        integer_one_node, 1)))
4787                       high1 = 0;
4788                     break;
4789                   default:
4790                     break;
4791                   }
4792
4793               /* The ranges might be also adjacent between the maximum and
4794                  minimum values of the given type.  For
4795                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4796                  return + [x + 1, y - 1].  */
4797               if (low0 == 0 && high1 == 0)
4798                 {
4799                   low = range_successor (high0);
4800                   high = range_predecessor (low1);
4801                   if (low == 0 || high == 0)
4802                     return 0;
4803
4804                   in_p = 1;
4805                 }
4806               else
4807                 return 0;
4808             }
4809         }
4810       else if (subset)
4811         in_p = 0, low = low0, high = high0;
4812       else
4813         in_p = 0, low = low0, high = high1;
4814     }
4815
4816   *pin_p = in_p, *plow = low, *phigh = high;
4817   return 1;
4818 }
4819 \f
4820
4821 /* Subroutine of fold, looking inside expressions of the form
4822    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4823    of the COND_EXPR.  This function is being used also to optimize
4824    A op B ? C : A, by reversing the comparison first.
4825
4826    Return a folded expression whose code is not a COND_EXPR
4827    anymore, or NULL_TREE if no folding opportunity is found.  */
4828
4829 static tree
4830 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4831 {
4832   enum tree_code comp_code = TREE_CODE (arg0);
4833   tree arg00 = TREE_OPERAND (arg0, 0);
4834   tree arg01 = TREE_OPERAND (arg0, 1);
4835   tree arg1_type = TREE_TYPE (arg1);
4836   tree tem;
4837
4838   STRIP_NOPS (arg1);
4839   STRIP_NOPS (arg2);
4840
4841   /* If we have A op 0 ? A : -A, consider applying the following
4842      transformations:
4843
4844      A == 0? A : -A    same as -A
4845      A != 0? A : -A    same as A
4846      A >= 0? A : -A    same as abs (A)
4847      A > 0?  A : -A    same as abs (A)
4848      A <= 0? A : -A    same as -abs (A)
4849      A < 0?  A : -A    same as -abs (A)
4850
4851      None of these transformations work for modes with signed
4852      zeros.  If A is +/-0, the first two transformations will
4853      change the sign of the result (from +0 to -0, or vice
4854      versa).  The last four will fix the sign of the result,
4855      even though the original expressions could be positive or
4856      negative, depending on the sign of A.
4857
4858      Note that all these transformations are correct if A is
4859      NaN, since the two alternatives (A and -A) are also NaNs.  */
4860   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4861       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4862           ? real_zerop (arg01)
4863           : integer_zerop (arg01))
4864       && ((TREE_CODE (arg2) == NEGATE_EXPR
4865            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4866              /* In the case that A is of the form X-Y, '-A' (arg2) may
4867                 have already been folded to Y-X, check for that. */
4868           || (TREE_CODE (arg1) == MINUS_EXPR
4869               && TREE_CODE (arg2) == MINUS_EXPR
4870               && operand_equal_p (TREE_OPERAND (arg1, 0),
4871                                   TREE_OPERAND (arg2, 1), 0)
4872               && operand_equal_p (TREE_OPERAND (arg1, 1),
4873                                   TREE_OPERAND (arg2, 0), 0))))
4874     switch (comp_code)
4875       {
4876       case EQ_EXPR:
4877       case UNEQ_EXPR:
4878         tem = fold_convert (arg1_type, arg1);
4879         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4880       case NE_EXPR:
4881       case LTGT_EXPR:
4882         return pedantic_non_lvalue (fold_convert (type, arg1));
4883       case UNGE_EXPR:
4884       case UNGT_EXPR:
4885         if (flag_trapping_math)
4886           break;
4887         /* Fall through.  */
4888       case GE_EXPR:
4889       case GT_EXPR:
4890         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4891           arg1 = fold_convert (signed_type_for
4892                                (TREE_TYPE (arg1)), arg1);
4893         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4894         return pedantic_non_lvalue (fold_convert (type, tem));
4895       case UNLE_EXPR:
4896       case UNLT_EXPR:
4897         if (flag_trapping_math)
4898           break;
4899       case LE_EXPR:
4900       case LT_EXPR:
4901         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4902           arg1 = fold_convert (signed_type_for
4903                                (TREE_TYPE (arg1)), arg1);
4904         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4905         return negate_expr (fold_convert (type, tem));
4906       default:
4907         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4908         break;
4909       }
4910
4911   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4912      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4913      both transformations are correct when A is NaN: A != 0
4914      is then true, and A == 0 is false.  */
4915
4916   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4917       && integer_zerop (arg01) && integer_zerop (arg2))
4918     {
4919       if (comp_code == NE_EXPR)
4920         return pedantic_non_lvalue (fold_convert (type, arg1));
4921       else if (comp_code == EQ_EXPR)
4922         return build_int_cst (type, 0);
4923     }
4924
4925   /* Try some transformations of A op B ? A : B.
4926
4927      A == B? A : B    same as B
4928      A != B? A : B    same as A
4929      A >= B? A : B    same as max (A, B)
4930      A > B?  A : B    same as max (B, A)
4931      A <= B? A : B    same as min (A, B)
4932      A < B?  A : B    same as min (B, A)
4933
4934      As above, these transformations don't work in the presence
4935      of signed zeros.  For example, if A and B are zeros of
4936      opposite sign, the first two transformations will change
4937      the sign of the result.  In the last four, the original
4938      expressions give different results for (A=+0, B=-0) and
4939      (A=-0, B=+0), but the transformed expressions do not.
4940
4941      The first two transformations are correct if either A or B
4942      is a NaN.  In the first transformation, the condition will
4943      be false, and B will indeed be chosen.  In the case of the
4944      second transformation, the condition A != B will be true,
4945      and A will be chosen.
4946
4947      The conversions to max() and min() are not correct if B is
4948      a number and A is not.  The conditions in the original
4949      expressions will be false, so all four give B.  The min()
4950      and max() versions would give a NaN instead.  */
4951   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4952       && operand_equal_for_comparison_p (arg01, arg2, arg00)
4953       /* Avoid these transformations if the COND_EXPR may be used
4954          as an lvalue in the C++ front-end.  PR c++/19199.  */
4955       && (in_gimple_form
4956           || (strcmp (lang_hooks.name, "GNU C++") != 0
4957               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4958           || ! maybe_lvalue_p (arg1)
4959           || ! maybe_lvalue_p (arg2)))
4960     {
4961       tree comp_op0 = arg00;
4962       tree comp_op1 = arg01;
4963       tree comp_type = TREE_TYPE (comp_op0);
4964
4965       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4966       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4967         {
4968           comp_type = type;
4969           comp_op0 = arg1;
4970           comp_op1 = arg2;
4971         }
4972
4973       switch (comp_code)
4974         {
4975         case EQ_EXPR:
4976           return pedantic_non_lvalue (fold_convert (type, arg2));
4977         case NE_EXPR:
4978           return pedantic_non_lvalue (fold_convert (type, arg1));
4979         case LE_EXPR:
4980         case LT_EXPR:
4981         case UNLE_EXPR:
4982         case UNLT_EXPR:
4983           /* In C++ a ?: expression can be an lvalue, so put the
4984              operand which will be used if they are equal first
4985              so that we can convert this back to the
4986              corresponding COND_EXPR.  */
4987           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4988             {
4989               comp_op0 = fold_convert (comp_type, comp_op0);
4990               comp_op1 = fold_convert (comp_type, comp_op1);
4991               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4992                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4993                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4994               return pedantic_non_lvalue (fold_convert (type, tem));
4995             }
4996           break;
4997         case GE_EXPR:
4998         case GT_EXPR:
4999         case UNGE_EXPR:
5000         case UNGT_EXPR:
5001           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5002             {
5003               comp_op0 = fold_convert (comp_type, comp_op0);
5004               comp_op1 = fold_convert (comp_type, comp_op1);
5005               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5006                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5007                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5008               return pedantic_non_lvalue (fold_convert (type, tem));
5009             }
5010           break;
5011         case UNEQ_EXPR:
5012           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5013             return pedantic_non_lvalue (fold_convert (type, arg2));
5014           break;
5015         case LTGT_EXPR:
5016           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5017             return pedantic_non_lvalue (fold_convert (type, arg1));
5018           break;
5019         default:
5020           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5021           break;
5022         }
5023     }
5024
5025   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5026      we might still be able to simplify this.  For example,
5027      if C1 is one less or one more than C2, this might have started
5028      out as a MIN or MAX and been transformed by this function.
5029      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5030
5031   if (INTEGRAL_TYPE_P (type)
5032       && TREE_CODE (arg01) == INTEGER_CST
5033       && TREE_CODE (arg2) == INTEGER_CST)
5034     switch (comp_code)
5035       {
5036       case EQ_EXPR:
5037         /* We can replace A with C1 in this case.  */
5038         arg1 = fold_convert (type, arg01);
5039         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5040
5041       case LT_EXPR:
5042         /* If C1 is C2 + 1, this is min(A, C2).  */
5043         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5044                                OEP_ONLY_CONST)
5045             && operand_equal_p (arg01,
5046                                 const_binop (PLUS_EXPR, arg2,
5047                                              build_int_cst (type, 1), 0),
5048                                 OEP_ONLY_CONST))
5049           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5050                                                    type,
5051                                                    fold_convert (type, arg1),
5052                                                    arg2));
5053         break;
5054
5055       case LE_EXPR:
5056         /* If C1 is C2 - 1, this is min(A, C2).  */
5057         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5058                                OEP_ONLY_CONST)
5059             && operand_equal_p (arg01,
5060                                 const_binop (MINUS_EXPR, arg2,
5061                                              build_int_cst (type, 1), 0),
5062                                 OEP_ONLY_CONST))
5063           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5064                                                    type,
5065                                                    fold_convert (type, arg1),
5066                                                    arg2));
5067         break;
5068
5069       case GT_EXPR:
5070         /* If C1 is C2 - 1, this is max(A, C2).  */
5071         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5072                                OEP_ONLY_CONST)
5073             && operand_equal_p (arg01,
5074                                 const_binop (MINUS_EXPR, arg2,
5075                                              build_int_cst (type, 1), 0),
5076                                 OEP_ONLY_CONST))
5077           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5078                                                    type,
5079                                                    fold_convert (type, arg1),
5080                                                    arg2));
5081         break;
5082
5083       case GE_EXPR:
5084         /* If C1 is C2 + 1, this is max(A, C2).  */
5085         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5086                                OEP_ONLY_CONST)
5087             && operand_equal_p (arg01,
5088                                 const_binop (PLUS_EXPR, arg2,
5089                                              build_int_cst (type, 1), 0),
5090                                 OEP_ONLY_CONST))
5091           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5092                                                    type,
5093                                                    fold_convert (type, arg1),
5094                                                    arg2));
5095         break;
5096       case NE_EXPR:
5097         break;
5098       default:
5099         gcc_unreachable ();
5100       }
5101
5102   return NULL_TREE;
5103 }
5104
5105
5106 \f
5107 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5108 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
5109 #endif
5110
5111 /* EXP is some logical combination of boolean tests.  See if we can
5112    merge it into some range test.  Return the new tree if so.  */
5113
5114 static tree
5115 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5116 {
5117   int or_op = (code == TRUTH_ORIF_EXPR
5118                || code == TRUTH_OR_EXPR);
5119   int in0_p, in1_p, in_p;
5120   tree low0, low1, low, high0, high1, high;
5121   bool strict_overflow_p = false;
5122   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5123   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5124   tree tem;
5125   const char * const warnmsg = G_("assuming signed overflow does not occur "
5126                                   "when simplifying range test");
5127
5128   /* If this is an OR operation, invert both sides; we will invert
5129      again at the end.  */
5130   if (or_op)
5131     in0_p = ! in0_p, in1_p = ! in1_p;
5132
5133   /* If both expressions are the same, if we can merge the ranges, and we
5134      can build the range test, return it or it inverted.  If one of the
5135      ranges is always true or always false, consider it to be the same
5136      expression as the other.  */
5137   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5138       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5139                        in1_p, low1, high1)
5140       && 0 != (tem = (build_range_check (type,
5141                                          lhs != 0 ? lhs
5142                                          : rhs != 0 ? rhs : integer_zero_node,
5143                                          in_p, low, high))))
5144     {
5145       if (strict_overflow_p)
5146         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5147       return or_op ? invert_truthvalue (tem) : tem;
5148     }
5149
5150   /* On machines where the branch cost is expensive, if this is a
5151      short-circuited branch and the underlying object on both sides
5152      is the same, make a non-short-circuit operation.  */
5153   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5154            && lhs != 0 && rhs != 0
5155            && (code == TRUTH_ANDIF_EXPR
5156                || code == TRUTH_ORIF_EXPR)
5157            && operand_equal_p (lhs, rhs, 0))
5158     {
5159       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5160          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5161          which cases we can't do this.  */
5162       if (simple_operand_p (lhs))
5163         return build2 (code == TRUTH_ANDIF_EXPR
5164                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5165                        type, op0, op1);
5166
5167       else if (lang_hooks.decls.global_bindings_p () == 0
5168                && ! CONTAINS_PLACEHOLDER_P (lhs))
5169         {
5170           tree common = save_expr (lhs);
5171
5172           if (0 != (lhs = build_range_check (type, common,
5173                                              or_op ? ! in0_p : in0_p,
5174                                              low0, high0))
5175               && (0 != (rhs = build_range_check (type, common,
5176                                                  or_op ? ! in1_p : in1_p,
5177                                                  low1, high1))))
5178             {
5179               if (strict_overflow_p)
5180                 fold_overflow_warning (warnmsg,
5181                                        WARN_STRICT_OVERFLOW_COMPARISON);
5182               return build2 (code == TRUTH_ANDIF_EXPR
5183                              ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5184                              type, lhs, rhs);
5185             }
5186         }
5187     }
5188
5189   return 0;
5190 }
5191 \f
5192 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5193    bit value.  Arrange things so the extra bits will be set to zero if and
5194    only if C is signed-extended to its full width.  If MASK is nonzero,
5195    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5196
5197 static tree
5198 unextend (tree c, int p, int unsignedp, tree mask)
5199 {
5200   tree type = TREE_TYPE (c);
5201   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5202   tree temp;
5203
5204   if (p == modesize || unsignedp)
5205     return c;
5206
5207   /* We work by getting just the sign bit into the low-order bit, then
5208      into the high-order bit, then sign-extend.  We then XOR that value
5209      with C.  */
5210   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5211   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5212
5213   /* We must use a signed type in order to get an arithmetic right shift.
5214      However, we must also avoid introducing accidental overflows, so that
5215      a subsequent call to integer_zerop will work.  Hence we must
5216      do the type conversion here.  At this point, the constant is either
5217      zero or one, and the conversion to a signed type can never overflow.
5218      We could get an overflow if this conversion is done anywhere else.  */
5219   if (TYPE_UNSIGNED (type))
5220     temp = fold_convert (signed_type_for (type), temp);
5221
5222   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5223   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5224   if (mask != 0)
5225     temp = const_binop (BIT_AND_EXPR, temp,
5226                         fold_convert (TREE_TYPE (c), mask), 0);
5227   /* If necessary, convert the type back to match the type of C.  */
5228   if (TYPE_UNSIGNED (type))
5229     temp = fold_convert (type, temp);
5230
5231   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5232 }
5233 \f
5234 /* Find ways of folding logical expressions of LHS and RHS:
5235    Try to merge two comparisons to the same innermost item.
5236    Look for range tests like "ch >= '0' && ch <= '9'".
5237    Look for combinations of simple terms on machines with expensive branches
5238    and evaluate the RHS unconditionally.
5239
5240    For example, if we have p->a == 2 && p->b == 4 and we can make an
5241    object large enough to span both A and B, we can do this with a comparison
5242    against the object ANDed with the a mask.
5243
5244    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5245    operations to do this with one comparison.
5246
5247    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5248    function and the one above.
5249
5250    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5251    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5252
5253    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5254    two operands.
5255
5256    We return the simplified tree or 0 if no optimization is possible.  */
5257
5258 static tree
5259 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5260 {
5261   /* If this is the "or" of two comparisons, we can do something if
5262      the comparisons are NE_EXPR.  If this is the "and", we can do something
5263      if the comparisons are EQ_EXPR.  I.e.,
5264         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5265
5266      WANTED_CODE is this operation code.  For single bit fields, we can
5267      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5268      comparison for one-bit fields.  */
5269
5270   enum tree_code wanted_code;
5271   enum tree_code lcode, rcode;
5272   tree ll_arg, lr_arg, rl_arg, rr_arg;
5273   tree ll_inner, lr_inner, rl_inner, rr_inner;
5274   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5275   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5276   HOST_WIDE_INT xll_bitpos, xrl_bitpos;
5277   HOST_WIDE_INT lnbitsize, lnbitpos;
5278   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5279   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5280   enum machine_mode lnmode;
5281   tree ll_mask, lr_mask, rl_mask, rr_mask;
5282   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5283   tree l_const, r_const;
5284   tree lntype, result;
5285   int first_bit, end_bit;
5286   int volatilep;
5287   tree orig_lhs = lhs, orig_rhs = rhs;
5288   enum tree_code orig_code = code;
5289
5290   /* Start by getting the comparison codes.  Fail if anything is volatile.
5291      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5292      it were surrounded with a NE_EXPR.  */
5293
5294   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5295     return 0;
5296
5297   lcode = TREE_CODE (lhs);
5298   rcode = TREE_CODE (rhs);
5299
5300   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5301     {
5302       lhs = build2 (NE_EXPR, truth_type, lhs,
5303                     build_int_cst (TREE_TYPE (lhs), 0));
5304       lcode = NE_EXPR;
5305     }
5306
5307   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5308     {
5309       rhs = build2 (NE_EXPR, truth_type, rhs,
5310                     build_int_cst (TREE_TYPE (rhs), 0));
5311       rcode = NE_EXPR;
5312     }
5313
5314   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5315       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5316     return 0;
5317
5318   ll_arg = TREE_OPERAND (lhs, 0);
5319   lr_arg = TREE_OPERAND (lhs, 1);
5320   rl_arg = TREE_OPERAND (rhs, 0);
5321   rr_arg = TREE_OPERAND (rhs, 1);
5322
5323   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5324   if (simple_operand_p (ll_arg)
5325       && simple_operand_p (lr_arg))
5326     {
5327       tree result;
5328       if (operand_equal_p (ll_arg, rl_arg, 0)
5329           && operand_equal_p (lr_arg, rr_arg, 0))
5330         {
5331           result = combine_comparisons (code, lcode, rcode,
5332                                         truth_type, ll_arg, lr_arg);
5333           if (result)
5334             return result;
5335         }
5336       else if (operand_equal_p (ll_arg, rr_arg, 0)
5337                && operand_equal_p (lr_arg, rl_arg, 0))
5338         {
5339           result = combine_comparisons (code, lcode,
5340                                         swap_tree_comparison (rcode),
5341                                         truth_type, ll_arg, lr_arg);
5342           if (result)
5343             return result;
5344         }
5345     }
5346
5347   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5348           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5349
5350   /* If the RHS can be evaluated unconditionally and its operands are
5351      simple, it wins to evaluate the RHS unconditionally on machines
5352      with expensive branches.  In this case, this isn't a comparison
5353      that can be merged.  Avoid doing this if the RHS is a floating-point
5354      comparison since those can trap.  */
5355
5356   if (BRANCH_COST >= 2
5357       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5358       && simple_operand_p (rl_arg)
5359       && simple_operand_p (rr_arg))
5360     {
5361       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5362       if (code == TRUTH_OR_EXPR
5363           && lcode == NE_EXPR && integer_zerop (lr_arg)
5364           && rcode == NE_EXPR && integer_zerop (rr_arg)
5365           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5366           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5367         return build2 (NE_EXPR, truth_type,
5368                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5369                                ll_arg, rl_arg),
5370                        build_int_cst (TREE_TYPE (ll_arg), 0));
5371
5372       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5373       if (code == TRUTH_AND_EXPR
5374           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5375           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5376           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5377           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5378         return build2 (EQ_EXPR, truth_type,
5379                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5380                                ll_arg, rl_arg),
5381                        build_int_cst (TREE_TYPE (ll_arg), 0));
5382
5383       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5384         {
5385           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5386             return build2 (code, truth_type, lhs, rhs);
5387           return NULL_TREE;
5388         }
5389     }
5390
5391   /* See if the comparisons can be merged.  Then get all the parameters for
5392      each side.  */
5393
5394   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5395       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5396     return 0;
5397
5398   volatilep = 0;
5399   ll_inner = decode_field_reference (ll_arg,
5400                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5401                                      &ll_unsignedp, &volatilep, &ll_mask,
5402                                      &ll_and_mask);
5403   lr_inner = decode_field_reference (lr_arg,
5404                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5405                                      &lr_unsignedp, &volatilep, &lr_mask,
5406                                      &lr_and_mask);
5407   rl_inner = decode_field_reference (rl_arg,
5408                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5409                                      &rl_unsignedp, &volatilep, &rl_mask,
5410                                      &rl_and_mask);
5411   rr_inner = decode_field_reference (rr_arg,
5412                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5413                                      &rr_unsignedp, &volatilep, &rr_mask,
5414                                      &rr_and_mask);
5415
5416   /* It must be true that the inner operation on the lhs of each
5417      comparison must be the same if we are to be able to do anything.
5418      Then see if we have constants.  If not, the same must be true for
5419      the rhs's.  */
5420   if (volatilep || ll_inner == 0 || rl_inner == 0
5421       || ! operand_equal_p (ll_inner, rl_inner, 0))
5422     return 0;
5423
5424   if (TREE_CODE (lr_arg) == INTEGER_CST
5425       && TREE_CODE (rr_arg) == INTEGER_CST)
5426     l_const = lr_arg, r_const = rr_arg;
5427   else if (lr_inner == 0 || rr_inner == 0
5428            || ! operand_equal_p (lr_inner, rr_inner, 0))
5429     return 0;
5430   else
5431     l_const = r_const = 0;
5432
5433   /* If either comparison code is not correct for our logical operation,
5434      fail.  However, we can convert a one-bit comparison against zero into
5435      the opposite comparison against that bit being set in the field.  */
5436
5437   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5438   if (lcode != wanted_code)
5439     {
5440       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5441         {
5442           /* Make the left operand unsigned, since we are only interested
5443              in the value of one bit.  Otherwise we are doing the wrong
5444              thing below.  */
5445           ll_unsignedp = 1;
5446           l_const = ll_mask;
5447         }
5448       else
5449         return 0;
5450     }
5451
5452   /* This is analogous to the code for l_const above.  */
5453   if (rcode != wanted_code)
5454     {
5455       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5456         {
5457           rl_unsignedp = 1;
5458           r_const = rl_mask;
5459         }
5460       else
5461         return 0;
5462     }
5463
5464   /* See if we can find a mode that contains both fields being compared on
5465      the left.  If we can't, fail.  Otherwise, update all constants and masks
5466      to be relative to a field of that size.  */
5467   first_bit = MIN (ll_bitpos, rl_bitpos);
5468   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5469   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5470                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5471                           volatilep);
5472   if (lnmode == VOIDmode)
5473     return 0;
5474
5475   lnbitsize = GET_MODE_BITSIZE (lnmode);
5476   lnbitpos = first_bit & ~ (lnbitsize - 1);
5477   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5478   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5479
5480   if (BYTES_BIG_ENDIAN)
5481     {
5482       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5483       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5484     }
5485
5486   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5487                          size_int (xll_bitpos), 0);
5488   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5489                          size_int (xrl_bitpos), 0);
5490
5491   if (l_const)
5492     {
5493       l_const = fold_convert (lntype, l_const);
5494       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5495       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5496       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5497                                         fold_build1 (BIT_NOT_EXPR,
5498                                                      lntype, ll_mask),
5499                                         0)))
5500         {
5501           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5502
5503           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5504         }
5505     }
5506   if (r_const)
5507     {
5508       r_const = fold_convert (lntype, r_const);
5509       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5510       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5511       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5512                                         fold_build1 (BIT_NOT_EXPR,
5513                                                      lntype, rl_mask),
5514                                         0)))
5515         {
5516           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5517
5518           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5519         }
5520     }
5521
5522   /* Handle the case of comparisons with constants.  If there is something in
5523      common between the masks, those bits of the constants must be the same.
5524      If not, the condition is always false.  Test for this to avoid generating
5525      incorrect code below.  */
5526   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5527   if (! integer_zerop (result)
5528       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5529                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5530     {
5531       if (wanted_code == NE_EXPR)
5532         {
5533           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5534           return constant_boolean_node (true, truth_type);
5535         }
5536       else
5537         {
5538           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5539           return constant_boolean_node (false, truth_type);
5540         }
5541     }
5542
5543   return NULL_TREE;
5544 }
5545 \f
5546 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5547    constant.  */
5548
5549 static tree
5550 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5551 {
5552   tree arg0 = op0;
5553   enum tree_code op_code;
5554   tree comp_const;
5555   tree minmax_const;
5556   int consts_equal, consts_lt;
5557   tree inner;
5558
5559   STRIP_SIGN_NOPS (arg0);
5560
5561   op_code = TREE_CODE (arg0);
5562   minmax_const = TREE_OPERAND (arg0, 1);
5563   comp_const = fold_convert (TREE_TYPE (arg0), op1);
5564   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5565   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5566   inner = TREE_OPERAND (arg0, 0);
5567
5568   /* If something does not permit us to optimize, return the original tree.  */
5569   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5570       || TREE_CODE (comp_const) != INTEGER_CST
5571       || TREE_OVERFLOW (comp_const)
5572       || TREE_CODE (minmax_const) != INTEGER_CST
5573       || TREE_OVERFLOW (minmax_const))
5574     return NULL_TREE;
5575
5576   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5577      and GT_EXPR, doing the rest with recursive calls using logical
5578      simplifications.  */
5579   switch (code)
5580     {
5581     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5582       {
5583         tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5584                                           type, op0, op1);
5585         if (tem)
5586           return invert_truthvalue (tem);
5587         return NULL_TREE;
5588       }
5589
5590     case GE_EXPR:
5591       return
5592         fold_build2 (TRUTH_ORIF_EXPR, type,
5593                      optimize_minmax_comparison
5594                      (EQ_EXPR, type, arg0, comp_const),
5595                      optimize_minmax_comparison
5596                      (GT_EXPR, type, arg0, comp_const));
5597
5598     case EQ_EXPR:
5599       if (op_code == MAX_EXPR && consts_equal)
5600         /* MAX (X, 0) == 0  ->  X <= 0  */
5601         return fold_build2 (LE_EXPR, type, inner, comp_const);
5602
5603       else if (op_code == MAX_EXPR && consts_lt)
5604         /* MAX (X, 0) == 5  ->  X == 5   */
5605         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5606
5607       else if (op_code == MAX_EXPR)
5608         /* MAX (X, 0) == -1  ->  false  */
5609         return omit_one_operand (type, integer_zero_node, inner);
5610
5611       else if (consts_equal)
5612         /* MIN (X, 0) == 0  ->  X >= 0  */
5613         return fold_build2 (GE_EXPR, type, inner, comp_const);
5614
5615       else if (consts_lt)
5616         /* MIN (X, 0) == 5  ->  false  */
5617         return omit_one_operand (type, integer_zero_node, inner);
5618
5619       else
5620         /* MIN (X, 0) == -1  ->  X == -1  */
5621         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5622
5623     case GT_EXPR:
5624       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5625         /* MAX (X, 0) > 0  ->  X > 0
5626            MAX (X, 0) > 5  ->  X > 5  */
5627         return fold_build2 (GT_EXPR, type, inner, comp_const);
5628
5629       else if (op_code == MAX_EXPR)
5630         /* MAX (X, 0) > -1  ->  true  */
5631         return omit_one_operand (type, integer_one_node, inner);
5632
5633       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5634         /* MIN (X, 0) > 0  ->  false
5635            MIN (X, 0) > 5  ->  false  */
5636         return omit_one_operand (type, integer_zero_node, inner);
5637
5638       else
5639         /* MIN (X, 0) > -1  ->  X > -1  */
5640         return fold_build2 (GT_EXPR, type, inner, comp_const);
5641
5642     default:
5643       return NULL_TREE;
5644     }
5645 }
5646 \f
5647 /* T is an integer expression that is being multiplied, divided, or taken a
5648    modulus (CODE says which and what kind of divide or modulus) by a
5649    constant C.  See if we can eliminate that operation by folding it with
5650    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5651    should be used for the computation if wider than our type.
5652
5653    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5654    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5655    expression would not overflow or that overflow is undefined for the type
5656    in the language in question.
5657
5658    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5659    the machine has a multiply-accumulate insn or that this is part of an
5660    addressing calculation.
5661
5662    If we return a non-null expression, it is an equivalent form of the
5663    original computation, but need not be in the original type.
5664
5665    We set *STRICT_OVERFLOW_P to true if the return values depends on
5666    signed overflow being undefined.  Otherwise we do not change
5667    *STRICT_OVERFLOW_P.  */
5668
5669 static tree
5670 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5671                 bool *strict_overflow_p)
5672 {
5673   /* To avoid exponential search depth, refuse to allow recursion past
5674      three levels.  Beyond that (1) it's highly unlikely that we'll find
5675      something interesting and (2) we've probably processed it before
5676      when we built the inner expression.  */
5677
5678   static int depth;
5679   tree ret;
5680
5681   if (depth > 3)
5682     return NULL;
5683
5684   depth++;
5685   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5686   depth--;
5687
5688   return ret;
5689 }
5690
5691 static tree
5692 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5693                   bool *strict_overflow_p)
5694 {
5695   tree type = TREE_TYPE (t);
5696   enum tree_code tcode = TREE_CODE (t);
5697   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5698                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5699                 ? wide_type : type);
5700   tree t1, t2;
5701   int same_p = tcode == code;
5702   tree op0 = NULL_TREE, op1 = NULL_TREE;
5703   bool sub_strict_overflow_p;
5704
5705   /* Don't deal with constants of zero here; they confuse the code below.  */
5706   if (integer_zerop (c))
5707     return NULL_TREE;
5708
5709   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5710     op0 = TREE_OPERAND (t, 0);
5711
5712   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5713     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5714
5715   /* Note that we need not handle conditional operations here since fold
5716      already handles those cases.  So just do arithmetic here.  */
5717   switch (tcode)
5718     {
5719     case INTEGER_CST:
5720       /* For a constant, we can always simplify if we are a multiply
5721          or (for divide and modulus) if it is a multiple of our constant.  */
5722       if (code == MULT_EXPR
5723           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5724         return const_binop (code, fold_convert (ctype, t),
5725                             fold_convert (ctype, c), 0);
5726       break;
5727
5728     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5729       /* If op0 is an expression ...  */
5730       if ((COMPARISON_CLASS_P (op0)
5731            || UNARY_CLASS_P (op0)
5732            || BINARY_CLASS_P (op0)
5733            || VL_EXP_CLASS_P (op0)
5734            || EXPRESSION_CLASS_P (op0))
5735           /* ... and is unsigned, and its type is smaller than ctype,
5736              then we cannot pass through as widening.  */
5737           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5738                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5739                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5740                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5741                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5742               /* ... or this is a truncation (t is narrower than op0),
5743                  then we cannot pass through this narrowing.  */
5744               || (GET_MODE_SIZE (TYPE_MODE (type))
5745                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5746               /* ... or signedness changes for division or modulus,
5747                  then we cannot pass through this conversion.  */
5748               || (code != MULT_EXPR
5749                   && (TYPE_UNSIGNED (ctype)
5750                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
5751               /* ... or has undefined overflow while the converted to
5752                  type has not, we cannot do the operation in the inner type
5753                  as that would introduce undefined overflow.  */
5754               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5755                   && !TYPE_OVERFLOW_UNDEFINED (type))))
5756         break;
5757
5758       /* Pass the constant down and see if we can make a simplification.  If
5759          we can, replace this expression with the inner simplification for
5760          possible later conversion to our or some other type.  */
5761       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5762           && TREE_CODE (t2) == INTEGER_CST
5763           && !TREE_OVERFLOW (t2)
5764           && (0 != (t1 = extract_muldiv (op0, t2, code,
5765                                          code == MULT_EXPR
5766                                          ? ctype : NULL_TREE,
5767                                          strict_overflow_p))))
5768         return t1;
5769       break;
5770
5771     case ABS_EXPR:
5772       /* If widening the type changes it from signed to unsigned, then we
5773          must avoid building ABS_EXPR itself as unsigned.  */
5774       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5775         {
5776           tree cstype = (*signed_type_for) (ctype);
5777           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5778               != 0)
5779             {
5780               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5781               return fold_convert (ctype, t1);
5782             }
5783           break;
5784         }
5785       /* If the constant is negative, we cannot simplify this.  */
5786       if (tree_int_cst_sgn (c) == -1)
5787         break;
5788       /* FALLTHROUGH */
5789     case NEGATE_EXPR:
5790       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5791           != 0)
5792         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5793       break;
5794
5795     case MIN_EXPR:  case MAX_EXPR:
5796       /* If widening the type changes the signedness, then we can't perform
5797          this optimization as that changes the result.  */
5798       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5799         break;
5800
5801       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5802       sub_strict_overflow_p = false;
5803       if ((t1 = extract_muldiv (op0, c, code, wide_type,
5804                                 &sub_strict_overflow_p)) != 0
5805           && (t2 = extract_muldiv (op1, c, code, wide_type,
5806                                    &sub_strict_overflow_p)) != 0)
5807         {
5808           if (tree_int_cst_sgn (c) < 0)
5809             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5810           if (sub_strict_overflow_p)
5811             *strict_overflow_p = true;
5812           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5813                               fold_convert (ctype, t2));
5814         }
5815       break;
5816
5817     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5818       /* If the second operand is constant, this is a multiplication
5819          or floor division, by a power of two, so we can treat it that
5820          way unless the multiplier or divisor overflows.  Signed
5821          left-shift overflow is implementation-defined rather than
5822          undefined in C90, so do not convert signed left shift into
5823          multiplication.  */
5824       if (TREE_CODE (op1) == INTEGER_CST
5825           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5826           /* const_binop may not detect overflow correctly,
5827              so check for it explicitly here.  */
5828           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5829           && TREE_INT_CST_HIGH (op1) == 0
5830           && 0 != (t1 = fold_convert (ctype,
5831                                       const_binop (LSHIFT_EXPR,
5832                                                    size_one_node,
5833                                                    op1, 0)))
5834           && !TREE_OVERFLOW (t1))
5835         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5836                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5837                                        ctype, fold_convert (ctype, op0), t1),
5838                                c, code, wide_type, strict_overflow_p);
5839       break;
5840
5841     case PLUS_EXPR:  case MINUS_EXPR:
5842       /* See if we can eliminate the operation on both sides.  If we can, we
5843          can return a new PLUS or MINUS.  If we can't, the only remaining
5844          cases where we can do anything are if the second operand is a
5845          constant.  */
5846       sub_strict_overflow_p = false;
5847       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5848       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5849       if (t1 != 0 && t2 != 0
5850           && (code == MULT_EXPR
5851               /* If not multiplication, we can only do this if both operands
5852                  are divisible by c.  */
5853               || (multiple_of_p (ctype, op0, c)
5854                   && multiple_of_p (ctype, op1, c))))
5855         {
5856           if (sub_strict_overflow_p)
5857             *strict_overflow_p = true;
5858           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5859                               fold_convert (ctype, t2));
5860         }
5861
5862       /* If this was a subtraction, negate OP1 and set it to be an addition.
5863          This simplifies the logic below.  */
5864       if (tcode == MINUS_EXPR)
5865         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5866
5867       if (TREE_CODE (op1) != INTEGER_CST)
5868         break;
5869
5870       /* If either OP1 or C are negative, this optimization is not safe for
5871          some of the division and remainder types while for others we need
5872          to change the code.  */
5873       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5874         {
5875           if (code == CEIL_DIV_EXPR)
5876             code = FLOOR_DIV_EXPR;
5877           else if (code == FLOOR_DIV_EXPR)
5878             code = CEIL_DIV_EXPR;
5879           else if (code != MULT_EXPR
5880                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5881             break;
5882         }
5883
5884       /* If it's a multiply or a division/modulus operation of a multiple
5885          of our constant, do the operation and verify it doesn't overflow.  */
5886       if (code == MULT_EXPR
5887           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5888         {
5889           op1 = const_binop (code, fold_convert (ctype, op1),
5890                              fold_convert (ctype, c), 0);
5891           /* We allow the constant to overflow with wrapping semantics.  */
5892           if (op1 == 0
5893               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5894             break;
5895         }
5896       else
5897         break;
5898
5899       /* If we have an unsigned type is not a sizetype, we cannot widen
5900          the operation since it will change the result if the original
5901          computation overflowed.  */
5902       if (TYPE_UNSIGNED (ctype)
5903           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5904           && ctype != type)
5905         break;
5906
5907       /* If we were able to eliminate our operation from the first side,
5908          apply our operation to the second side and reform the PLUS.  */
5909       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5910         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5911
5912       /* The last case is if we are a multiply.  In that case, we can
5913          apply the distributive law to commute the multiply and addition
5914          if the multiplication of the constants doesn't overflow.  */
5915       if (code == MULT_EXPR)
5916         return fold_build2 (tcode, ctype,
5917                             fold_build2 (code, ctype,
5918                                          fold_convert (ctype, op0),
5919                                          fold_convert (ctype, c)),
5920                             op1);
5921
5922       break;
5923
5924     case MULT_EXPR:
5925       /* We have a special case here if we are doing something like
5926          (C * 8) % 4 since we know that's zero.  */
5927       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5928            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5929           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5930           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5931         return omit_one_operand (type, integer_zero_node, op0);
5932
5933       /* ... fall through ...  */
5934
5935     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5936     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5937       /* If we can extract our operation from the LHS, do so and return a
5938          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5939          do something only if the second operand is a constant.  */
5940       if (same_p
5941           && (t1 = extract_muldiv (op0, c, code, wide_type,
5942                                    strict_overflow_p)) != 0)
5943         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5944                             fold_convert (ctype, op1));
5945       else if (tcode == MULT_EXPR && code == MULT_EXPR
5946                && (t1 = extract_muldiv (op1, c, code, wide_type,
5947                                         strict_overflow_p)) != 0)
5948         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5949                             fold_convert (ctype, t1));
5950       else if (TREE_CODE (op1) != INTEGER_CST)
5951         return 0;
5952
5953       /* If these are the same operation types, we can associate them
5954          assuming no overflow.  */
5955       if (tcode == code
5956           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5957                                      fold_convert (ctype, c), 0))
5958           && !TREE_OVERFLOW (t1))
5959         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5960
5961       /* If these operations "cancel" each other, we have the main
5962          optimizations of this pass, which occur when either constant is a
5963          multiple of the other, in which case we replace this with either an
5964          operation or CODE or TCODE.
5965
5966          If we have an unsigned type that is not a sizetype, we cannot do
5967          this since it will change the result if the original computation
5968          overflowed.  */
5969       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5970            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5971           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5972               || (tcode == MULT_EXPR
5973                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5974                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5975                   && code != MULT_EXPR)))
5976         {
5977           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5978             {
5979               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5980                 *strict_overflow_p = true;
5981               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5982                                   fold_convert (ctype,
5983                                                 const_binop (TRUNC_DIV_EXPR,
5984                                                              op1, c, 0)));
5985             }
5986           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5987             {
5988               if (TYPE_OVERFLOW_UNDEFINED (ctype))
5989                 *strict_overflow_p = true;
5990               return fold_build2 (code, ctype, fold_convert (ctype, op0),
5991                                   fold_convert (ctype,
5992                                                 const_binop (TRUNC_DIV_EXPR,
5993                                                              c, op1, 0)));
5994             }
5995         }
5996       break;
5997
5998     default:
5999       break;
6000     }
6001
6002   return 0;
6003 }
6004 \f
6005 /* Return a node which has the indicated constant VALUE (either 0 or
6006    1), and is of the indicated TYPE.  */
6007
6008 tree
6009 constant_boolean_node (int value, tree type)
6010 {
6011   if (type == integer_type_node)
6012     return value ? integer_one_node : integer_zero_node;
6013   else if (type == boolean_type_node)
6014     return value ? boolean_true_node : boolean_false_node;
6015   else
6016     return build_int_cst (type, value);
6017 }
6018
6019
6020 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6021    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6022    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6023    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6024    COND is the first argument to CODE; otherwise (as in the example
6025    given here), it is the second argument.  TYPE is the type of the
6026    original expression.  Return NULL_TREE if no simplification is
6027    possible.  */
6028
6029 static tree
6030 fold_binary_op_with_conditional_arg (enum tree_code code,
6031                                      tree type, tree op0, tree op1,
6032                                      tree cond, tree arg, int cond_first_p)
6033 {
6034   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6035   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6036   tree test, true_value, false_value;
6037   tree lhs = NULL_TREE;
6038   tree rhs = NULL_TREE;
6039
6040   /* This transformation is only worthwhile if we don't have to wrap
6041      arg in a SAVE_EXPR, and the operation can be simplified on at least
6042      one of the branches once its pushed inside the COND_EXPR.  */
6043   if (!TREE_CONSTANT (arg))
6044     return NULL_TREE;
6045
6046   if (TREE_CODE (cond) == COND_EXPR)
6047     {
6048       test = TREE_OPERAND (cond, 0);
6049       true_value = TREE_OPERAND (cond, 1);
6050       false_value = TREE_OPERAND (cond, 2);
6051       /* If this operand throws an expression, then it does not make
6052          sense to try to perform a logical or arithmetic operation
6053          involving it.  */
6054       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6055         lhs = true_value;
6056       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6057         rhs = false_value;
6058     }
6059   else
6060     {
6061       tree testtype = TREE_TYPE (cond);
6062       test = cond;
6063       true_value = constant_boolean_node (true, testtype);
6064       false_value = constant_boolean_node (false, testtype);
6065     }
6066
6067   arg = fold_convert (arg_type, arg);
6068   if (lhs == 0)
6069     {
6070       true_value = fold_convert (cond_type, true_value);
6071       if (cond_first_p)
6072         lhs = fold_build2 (code, type, true_value, arg);
6073       else
6074         lhs = fold_build2 (code, type, arg, true_value);
6075     }
6076   if (rhs == 0)
6077     {
6078       false_value = fold_convert (cond_type, false_value);
6079       if (cond_first_p)
6080         rhs = fold_build2 (code, type, false_value, arg);
6081       else
6082         rhs = fold_build2 (code, type, arg, false_value);
6083     }
6084
6085   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6086   return fold_convert (type, test);
6087 }
6088
6089 \f
6090 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6091
6092    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6093    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6094    ADDEND is the same as X.
6095
6096    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6097    and finite.  The problematic cases are when X is zero, and its mode
6098    has signed zeros.  In the case of rounding towards -infinity,
6099    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6100    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6101
6102 bool
6103 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6104 {
6105   if (!real_zerop (addend))
6106     return false;
6107
6108   /* Don't allow the fold with -fsignaling-nans.  */
6109   if (HONOR_SNANS (TYPE_MODE (type)))
6110     return false;
6111
6112   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6113   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6114     return true;
6115
6116   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6117   if (TREE_CODE (addend) == REAL_CST
6118       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6119     negate = !negate;
6120
6121   /* The mode has signed zeros, and we have to honor their sign.
6122      In this situation, there is only one case we can return true for.
6123      X - 0 is the same as X unless rounding towards -infinity is
6124      supported.  */
6125   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6126 }
6127
6128 /* Subroutine of fold() that checks comparisons of built-in math
6129    functions against real constants.
6130
6131    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6132    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6133    is the type of the result and ARG0 and ARG1 are the operands of the
6134    comparison.  ARG1 must be a TREE_REAL_CST.
6135
6136    The function returns the constant folded tree if a simplification
6137    can be made, and NULL_TREE otherwise.  */
6138
6139 static tree
6140 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6141                      tree type, tree arg0, tree arg1)
6142 {
6143   REAL_VALUE_TYPE c;
6144
6145   if (BUILTIN_SQRT_P (fcode))
6146     {
6147       tree arg = CALL_EXPR_ARG (arg0, 0);
6148       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6149
6150       c = TREE_REAL_CST (arg1);
6151       if (REAL_VALUE_NEGATIVE (c))
6152         {
6153           /* sqrt(x) < y is always false, if y is negative.  */
6154           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6155             return omit_one_operand (type, integer_zero_node, arg);
6156
6157           /* sqrt(x) > y is always true, if y is negative and we
6158              don't care about NaNs, i.e. negative values of x.  */
6159           if (code == NE_EXPR || !HONOR_NANS (mode))
6160             return omit_one_operand (type, integer_one_node, arg);
6161
6162           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6163           return fold_build2 (GE_EXPR, type, arg,
6164                               build_real (TREE_TYPE (arg), dconst0));
6165         }
6166       else if (code == GT_EXPR || code == GE_EXPR)
6167         {
6168           REAL_VALUE_TYPE c2;
6169
6170           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6171           real_convert (&c2, mode, &c2);
6172
6173           if (REAL_VALUE_ISINF (c2))
6174             {
6175               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6176               if (HONOR_INFINITIES (mode))
6177                 return fold_build2 (EQ_EXPR, type, arg,
6178                                     build_real (TREE_TYPE (arg), c2));
6179
6180               /* sqrt(x) > y is always false, when y is very large
6181                  and we don't care about infinities.  */
6182               return omit_one_operand (type, integer_zero_node, arg);
6183             }
6184
6185           /* sqrt(x) > c is the same as x > c*c.  */
6186           return fold_build2 (code, type, arg,
6187                               build_real (TREE_TYPE (arg), c2));
6188         }
6189       else if (code == LT_EXPR || code == LE_EXPR)
6190         {
6191           REAL_VALUE_TYPE c2;
6192
6193           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6194           real_convert (&c2, mode, &c2);
6195
6196           if (REAL_VALUE_ISINF (c2))
6197             {
6198               /* sqrt(x) < y is always true, when y is a very large
6199                  value and we don't care about NaNs or Infinities.  */
6200               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6201                 return omit_one_operand (type, integer_one_node, arg);
6202
6203               /* sqrt(x) < y is x != +Inf when y is very large and we
6204                  don't care about NaNs.  */
6205               if (! HONOR_NANS (mode))
6206                 return fold_build2 (NE_EXPR, type, arg,
6207                                     build_real (TREE_TYPE (arg), c2));
6208
6209               /* sqrt(x) < y is x >= 0 when y is very large and we
6210                  don't care about Infinities.  */
6211               if (! HONOR_INFINITIES (mode))
6212                 return fold_build2 (GE_EXPR, type, arg,
6213                                     build_real (TREE_TYPE (arg), dconst0));
6214
6215               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6216               if (lang_hooks.decls.global_bindings_p () != 0
6217                   || CONTAINS_PLACEHOLDER_P (arg))
6218                 return NULL_TREE;
6219
6220               arg = save_expr (arg);
6221               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6222                                   fold_build2 (GE_EXPR, type, arg,
6223                                                build_real (TREE_TYPE (arg),
6224                                                            dconst0)),
6225                                   fold_build2 (NE_EXPR, type, arg,
6226                                                build_real (TREE_TYPE (arg),
6227                                                            c2)));
6228             }
6229
6230           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6231           if (! HONOR_NANS (mode))
6232             return fold_build2 (code, type, arg,
6233                                 build_real (TREE_TYPE (arg), c2));
6234
6235           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6236           if (lang_hooks.decls.global_bindings_p () == 0
6237               && ! CONTAINS_PLACEHOLDER_P (arg))
6238             {
6239               arg = save_expr (arg);
6240               return fold_build2 (TRUTH_ANDIF_EXPR, type,
6241                                   fold_build2 (GE_EXPR, type, arg,
6242                                                build_real (TREE_TYPE (arg),
6243                                                            dconst0)),
6244                                   fold_build2 (code, type, arg,
6245                                                build_real (TREE_TYPE (arg),
6246                                                            c2)));
6247             }
6248         }
6249     }
6250
6251   return NULL_TREE;
6252 }
6253
6254 /* Subroutine of fold() that optimizes comparisons against Infinities,
6255    either +Inf or -Inf.
6256
6257    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6258    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6259    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6260
6261    The function returns the constant folded tree if a simplification
6262    can be made, and NULL_TREE otherwise.  */
6263
6264 static tree
6265 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6266 {
6267   enum machine_mode mode;
6268   REAL_VALUE_TYPE max;
6269   tree temp;
6270   bool neg;
6271
6272   mode = TYPE_MODE (TREE_TYPE (arg0));
6273
6274   /* For negative infinity swap the sense of the comparison.  */
6275   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6276   if (neg)
6277     code = swap_tree_comparison (code);
6278
6279   switch (code)
6280     {
6281     case GT_EXPR:
6282       /* x > +Inf is always false, if with ignore sNANs.  */
6283       if (HONOR_SNANS (mode))
6284         return NULL_TREE;
6285       return omit_one_operand (type, integer_zero_node, arg0);
6286
6287     case LE_EXPR:
6288       /* x <= +Inf is always true, if we don't case about NaNs.  */
6289       if (! HONOR_NANS (mode))
6290         return omit_one_operand (type, integer_one_node, arg0);
6291
6292       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6293       if (lang_hooks.decls.global_bindings_p () == 0
6294           && ! CONTAINS_PLACEHOLDER_P (arg0))
6295         {
6296           arg0 = save_expr (arg0);
6297           return fold_build2 (EQ_EXPR, type, arg0, arg0);
6298         }
6299       break;
6300
6301     case EQ_EXPR:
6302     case GE_EXPR:
6303       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6304       real_maxval (&max, neg, mode);
6305       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6306                           arg0, build_real (TREE_TYPE (arg0), max));
6307
6308     case LT_EXPR:
6309       /* x < +Inf is always equal to x <= DBL_MAX.  */
6310       real_maxval (&max, neg, mode);
6311       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6312                           arg0, build_real (TREE_TYPE (arg0), max));
6313
6314     case NE_EXPR:
6315       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6316       real_maxval (&max, neg, mode);
6317       if (! HONOR_NANS (mode))
6318         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6319                             arg0, build_real (TREE_TYPE (arg0), max));
6320
6321       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6322                           arg0, build_real (TREE_TYPE (arg0), max));
6323       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6324
6325     default:
6326       break;
6327     }
6328
6329   return NULL_TREE;
6330 }
6331
6332 /* Subroutine of fold() that optimizes comparisons of a division by
6333    a nonzero integer constant against an integer constant, i.e.
6334    X/C1 op C2.
6335
6336    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6337    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6338    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6339
6340    The function returns the constant folded tree if a simplification
6341    can be made, and NULL_TREE otherwise.  */
6342
6343 static tree
6344 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6345 {
6346   tree prod, tmp, hi, lo;
6347   tree arg00 = TREE_OPERAND (arg0, 0);
6348   tree arg01 = TREE_OPERAND (arg0, 1);
6349   unsigned HOST_WIDE_INT lpart;
6350   HOST_WIDE_INT hpart;
6351   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6352   bool neg_overflow;
6353   int overflow;
6354
6355   /* We have to do this the hard way to detect unsigned overflow.
6356      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
6357   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6358                                    TREE_INT_CST_HIGH (arg01),
6359                                    TREE_INT_CST_LOW (arg1),
6360                                    TREE_INT_CST_HIGH (arg1),
6361                                    &lpart, &hpart, unsigned_p);
6362   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6363                                 -1, overflow);
6364   neg_overflow = false;
6365
6366   if (unsigned_p)
6367     {
6368       tmp = int_const_binop (MINUS_EXPR, arg01,
6369                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6370       lo = prod;
6371
6372       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
6373       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6374                                        TREE_INT_CST_HIGH (prod),
6375                                        TREE_INT_CST_LOW (tmp),
6376                                        TREE_INT_CST_HIGH (tmp),
6377                                        &lpart, &hpart, unsigned_p);
6378       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6379                                   -1, overflow | TREE_OVERFLOW (prod));
6380     }
6381   else if (tree_int_cst_sgn (arg01) >= 0)
6382     {
6383       tmp = int_const_binop (MINUS_EXPR, arg01,
6384                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6385       switch (tree_int_cst_sgn (arg1))
6386         {
6387         case -1:
6388           neg_overflow = true;
6389           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6390           hi = prod;
6391           break;
6392
6393         case  0:
6394           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6395           hi = tmp;
6396           break;
6397
6398         case  1:
6399           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6400           lo = prod;
6401           break;
6402
6403         default:
6404           gcc_unreachable ();
6405         }
6406     }
6407   else
6408     {
6409       /* A negative divisor reverses the relational operators.  */
6410       code = swap_tree_comparison (code);
6411
6412       tmp = int_const_binop (PLUS_EXPR, arg01,
6413                              build_int_cst (TREE_TYPE (arg01), 1), 0);
6414       switch (tree_int_cst_sgn (arg1))
6415         {
6416         case -1:
6417           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6418           lo = prod;
6419           break;
6420
6421         case  0:
6422           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6423           lo = tmp;
6424           break;
6425
6426         case  1:
6427           neg_overflow = true;
6428           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6429           hi = prod;
6430           break;
6431
6432         default:
6433           gcc_unreachable ();
6434         }
6435     }
6436
6437   switch (code)
6438     {
6439     case EQ_EXPR:
6440       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6441         return omit_one_operand (type, integer_zero_node, arg00);
6442       if (TREE_OVERFLOW (hi))
6443         return fold_build2 (GE_EXPR, type, arg00, lo);
6444       if (TREE_OVERFLOW (lo))
6445         return fold_build2 (LE_EXPR, type, arg00, hi);
6446       return build_range_check (type, arg00, 1, lo, hi);
6447
6448     case NE_EXPR:
6449       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6450         return omit_one_operand (type, integer_one_node, arg00);
6451       if (TREE_OVERFLOW (hi))
6452         return fold_build2 (LT_EXPR, type, arg00, lo);
6453       if (TREE_OVERFLOW (lo))
6454         return fold_build2 (GT_EXPR, type, arg00, hi);
6455       return build_range_check (type, arg00, 0, lo, hi);
6456
6457     case LT_EXPR:
6458       if (TREE_OVERFLOW (lo))
6459         {
6460           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6461           return omit_one_operand (type, tmp, arg00);
6462         }
6463       return fold_build2 (LT_EXPR, type, arg00, lo);
6464
6465     case LE_EXPR:
6466       if (TREE_OVERFLOW (hi))
6467         {
6468           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6469           return omit_one_operand (type, tmp, arg00);
6470         }
6471       return fold_build2 (LE_EXPR, type, arg00, hi);
6472
6473     case GT_EXPR:
6474       if (TREE_OVERFLOW (hi))
6475         {
6476           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6477           return omit_one_operand (type, tmp, arg00);
6478         }
6479       return fold_build2 (GT_EXPR, type, arg00, hi);
6480
6481     case GE_EXPR:
6482       if (TREE_OVERFLOW (lo))
6483         {
6484           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6485           return omit_one_operand (type, tmp, arg00);
6486         }
6487       return fold_build2 (GE_EXPR, type, arg00, lo);
6488
6489     default:
6490       break;
6491     }
6492
6493   return NULL_TREE;
6494 }
6495
6496
6497 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6498    equality/inequality test, then return a simplified form of the test
6499    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6500    result type.  */
6501
6502 static tree
6503 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6504                                      tree result_type)
6505 {
6506   /* If this is testing a single bit, we can optimize the test.  */
6507   if ((code == NE_EXPR || code == EQ_EXPR)
6508       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6509       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6510     {
6511       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6512          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6513       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6514
6515       if (arg00 != NULL_TREE
6516           /* This is only a win if casting to a signed type is cheap,
6517              i.e. when arg00's type is not a partial mode.  */
6518           && TYPE_PRECISION (TREE_TYPE (arg00))
6519              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6520         {
6521           tree stype = signed_type_for (TREE_TYPE (arg00));
6522           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6523                               result_type, fold_convert (stype, arg00),
6524                               build_int_cst (stype, 0));
6525         }
6526     }
6527
6528   return NULL_TREE;
6529 }
6530
6531 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6532    equality/inequality test, then return a simplified form of
6533    the test using shifts and logical operations.  Otherwise return
6534    NULL.  TYPE is the desired result type.  */
6535
6536 tree
6537 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6538                       tree result_type)
6539 {
6540   /* If this is testing a single bit, we can optimize the test.  */
6541   if ((code == NE_EXPR || code == EQ_EXPR)
6542       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6543       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6544     {
6545       tree inner = TREE_OPERAND (arg0, 0);
6546       tree type = TREE_TYPE (arg0);
6547       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6548       enum machine_mode operand_mode = TYPE_MODE (type);
6549       int ops_unsigned;
6550       tree signed_type, unsigned_type, intermediate_type;
6551       tree tem, one;
6552
6553       /* First, see if we can fold the single bit test into a sign-bit
6554          test.  */
6555       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6556                                                  result_type);
6557       if (tem)
6558         return tem;
6559
6560       /* Otherwise we have (A & C) != 0 where C is a single bit,
6561          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6562          Similarly for (A & C) == 0.  */
6563
6564       /* If INNER is a right shift of a constant and it plus BITNUM does
6565          not overflow, adjust BITNUM and INNER.  */
6566       if (TREE_CODE (inner) == RSHIFT_EXPR
6567           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6568           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6569           && bitnum < TYPE_PRECISION (type)
6570           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6571                                    bitnum - TYPE_PRECISION (type)))
6572         {
6573           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6574           inner = TREE_OPERAND (inner, 0);
6575         }
6576
6577       /* If we are going to be able to omit the AND below, we must do our
6578          operations as unsigned.  If we must use the AND, we have a choice.
6579          Normally unsigned is faster, but for some machines signed is.  */
6580 #ifdef LOAD_EXTEND_OP
6581       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6582                       && !flag_syntax_only) ? 0 : 1;
6583 #else
6584       ops_unsigned = 1;
6585 #endif
6586
6587       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6588       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6589       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6590       inner = fold_convert (intermediate_type, inner);
6591
6592       if (bitnum != 0)
6593         inner = build2 (RSHIFT_EXPR, intermediate_type,
6594                         inner, size_int (bitnum));
6595
6596       one = build_int_cst (intermediate_type, 1);
6597
6598       if (code == EQ_EXPR)
6599         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6600
6601       /* Put the AND last so it can combine with more things.  */
6602       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6603
6604       /* Make sure to return the proper type.  */
6605       inner = fold_convert (result_type, inner);
6606
6607       return inner;
6608     }
6609   return NULL_TREE;
6610 }
6611
6612 /* Check whether we are allowed to reorder operands arg0 and arg1,
6613    such that the evaluation of arg1 occurs before arg0.  */
6614
6615 static bool
6616 reorder_operands_p (const_tree arg0, const_tree arg1)
6617 {
6618   if (! flag_evaluation_order)
6619       return true;
6620   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6621     return true;
6622   return ! TREE_SIDE_EFFECTS (arg0)
6623          && ! TREE_SIDE_EFFECTS (arg1);
6624 }
6625
6626 /* Test whether it is preferable two swap two operands, ARG0 and
6627    ARG1, for example because ARG0 is an integer constant and ARG1
6628    isn't.  If REORDER is true, only recommend swapping if we can
6629    evaluate the operands in reverse order.  */
6630
6631 bool
6632 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6633 {
6634   STRIP_SIGN_NOPS (arg0);
6635   STRIP_SIGN_NOPS (arg1);
6636
6637   if (TREE_CODE (arg1) == INTEGER_CST)
6638     return 0;
6639   if (TREE_CODE (arg0) == INTEGER_CST)
6640     return 1;
6641
6642   if (TREE_CODE (arg1) == REAL_CST)
6643     return 0;
6644   if (TREE_CODE (arg0) == REAL_CST)
6645     return 1;
6646
6647   if (TREE_CODE (arg1) == FIXED_CST)
6648     return 0;
6649   if (TREE_CODE (arg0) == FIXED_CST)
6650     return 1;
6651
6652   if (TREE_CODE (arg1) == COMPLEX_CST)
6653     return 0;
6654   if (TREE_CODE (arg0) == COMPLEX_CST)
6655     return 1;
6656
6657   if (TREE_CONSTANT (arg1))
6658     return 0;
6659   if (TREE_CONSTANT (arg0))
6660     return 1;
6661
6662   if (optimize_size)
6663     return 0;
6664
6665   if (reorder && flag_evaluation_order
6666       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6667     return 0;
6668
6669   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6670      for commutative and comparison operators.  Ensuring a canonical
6671      form allows the optimizers to find additional redundancies without
6672      having to explicitly check for both orderings.  */
6673   if (TREE_CODE (arg0) == SSA_NAME
6674       && TREE_CODE (arg1) == SSA_NAME
6675       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6676     return 1;
6677
6678   /* Put SSA_NAMEs last.  */
6679   if (TREE_CODE (arg1) == SSA_NAME)
6680     return 0;
6681   if (TREE_CODE (arg0) == SSA_NAME)
6682     return 1;
6683
6684   /* Put variables last.  */
6685   if (DECL_P (arg1))
6686     return 0;
6687   if (DECL_P (arg0))
6688     return 1;
6689
6690   return 0;
6691 }
6692
6693 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6694    ARG0 is extended to a wider type.  */
6695
6696 static tree
6697 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6698 {
6699   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6700   tree arg1_unw;
6701   tree shorter_type, outer_type;
6702   tree min, max;
6703   bool above, below;
6704
6705   if (arg0_unw == arg0)
6706     return NULL_TREE;
6707   shorter_type = TREE_TYPE (arg0_unw);
6708
6709 #ifdef HAVE_canonicalize_funcptr_for_compare
6710   /* Disable this optimization if we're casting a function pointer
6711      type on targets that require function pointer canonicalization.  */
6712   if (HAVE_canonicalize_funcptr_for_compare
6713       && TREE_CODE (shorter_type) == POINTER_TYPE
6714       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6715     return NULL_TREE;
6716 #endif
6717
6718   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6719     return NULL_TREE;
6720
6721   arg1_unw = get_unwidened (arg1, NULL_TREE);
6722
6723   /* If possible, express the comparison in the shorter mode.  */
6724   if ((code == EQ_EXPR || code == NE_EXPR
6725        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6726       && (TREE_TYPE (arg1_unw) == shorter_type
6727           || (TYPE_PRECISION (shorter_type)
6728               > TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6729           || ((TYPE_PRECISION (shorter_type)
6730                == TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6731               && (TYPE_UNSIGNED (shorter_type)
6732                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
6733           || (TREE_CODE (arg1_unw) == INTEGER_CST
6734               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6735                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6736               && int_fits_type_p (arg1_unw, shorter_type))))
6737     return fold_build2 (code, type, arg0_unw,
6738                        fold_convert (shorter_type, arg1_unw));
6739
6740   if (TREE_CODE (arg1_unw) != INTEGER_CST
6741       || TREE_CODE (shorter_type) != INTEGER_TYPE
6742       || !int_fits_type_p (arg1_unw, shorter_type))
6743     return NULL_TREE;
6744
6745   /* If we are comparing with the integer that does not fit into the range
6746      of the shorter type, the result is known.  */
6747   outer_type = TREE_TYPE (arg1_unw);
6748   min = lower_bound_in_type (outer_type, shorter_type);
6749   max = upper_bound_in_type (outer_type, shorter_type);
6750
6751   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6752                                                    max, arg1_unw));
6753   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6754                                                    arg1_unw, min));
6755
6756   switch (code)
6757     {
6758     case EQ_EXPR:
6759       if (above || below)
6760         return omit_one_operand (type, integer_zero_node, arg0);
6761       break;
6762
6763     case NE_EXPR:
6764       if (above || below)
6765         return omit_one_operand (type, integer_one_node, arg0);
6766       break;
6767
6768     case LT_EXPR:
6769     case LE_EXPR:
6770       if (above)
6771         return omit_one_operand (type, integer_one_node, arg0);
6772       else if (below)
6773         return omit_one_operand (type, integer_zero_node, arg0);
6774
6775     case GT_EXPR:
6776     case GE_EXPR:
6777       if (above)
6778         return omit_one_operand (type, integer_zero_node, arg0);
6779       else if (below)
6780         return omit_one_operand (type, integer_one_node, arg0);
6781
6782     default:
6783       break;
6784     }
6785
6786   return NULL_TREE;
6787 }
6788
6789 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6790    ARG0 just the signedness is changed.  */
6791
6792 static tree
6793 fold_sign_changed_comparison (enum tree_code code, tree type,
6794                               tree arg0, tree arg1)
6795 {
6796   tree arg0_inner;
6797   tree inner_type, outer_type;
6798
6799   if (TREE_CODE (arg0) != NOP_EXPR
6800       && TREE_CODE (arg0) != CONVERT_EXPR)
6801     return NULL_TREE;
6802
6803   outer_type = TREE_TYPE (arg0);
6804   arg0_inner = TREE_OPERAND (arg0, 0);
6805   inner_type = TREE_TYPE (arg0_inner);
6806
6807 #ifdef HAVE_canonicalize_funcptr_for_compare
6808   /* Disable this optimization if we're casting a function pointer
6809      type on targets that require function pointer canonicalization.  */
6810   if (HAVE_canonicalize_funcptr_for_compare
6811       && TREE_CODE (inner_type) == POINTER_TYPE
6812       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6813     return NULL_TREE;
6814 #endif
6815
6816   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6817     return NULL_TREE;
6818
6819   /* If the conversion is from an integral subtype to its basetype
6820      leave it alone.  */
6821   if (TREE_TYPE (inner_type) == outer_type)
6822     return NULL_TREE;
6823
6824   if (TREE_CODE (arg1) != INTEGER_CST
6825       && !((TREE_CODE (arg1) == NOP_EXPR
6826             || TREE_CODE (arg1) == CONVERT_EXPR)
6827            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6828     return NULL_TREE;
6829
6830   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6831       && code != NE_EXPR
6832       && code != EQ_EXPR)
6833     return NULL_TREE;
6834
6835   if (TREE_CODE (arg1) == INTEGER_CST)
6836     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6837                                   TREE_INT_CST_HIGH (arg1), 0,
6838                                   TREE_OVERFLOW (arg1));
6839   else
6840     arg1 = fold_convert (inner_type, arg1);
6841
6842   return fold_build2 (code, type, arg0_inner, arg1);
6843 }
6844
6845 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6846    step of the array.  Reconstructs s and delta in the case of s * delta
6847    being an integer constant (and thus already folded).
6848    ADDR is the address. MULT is the multiplicative expression.
6849    If the function succeeds, the new address expression is returned.  Otherwise
6850    NULL_TREE is returned.  */
6851
6852 static tree
6853 try_move_mult_to_index (tree addr, tree op1)
6854 {
6855   tree s, delta, step;
6856   tree ref = TREE_OPERAND (addr, 0), pref;
6857   tree ret, pos;
6858   tree itype;
6859   bool mdim = false;
6860
6861   /*  Strip the nops that might be added when converting op1 to sizetype. */
6862   STRIP_NOPS (op1);
6863
6864   /* Canonicalize op1 into a possibly non-constant delta
6865      and an INTEGER_CST s.  */
6866   if (TREE_CODE (op1) == MULT_EXPR)
6867     {
6868       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6869
6870       STRIP_NOPS (arg0);
6871       STRIP_NOPS (arg1);
6872   
6873       if (TREE_CODE (arg0) == INTEGER_CST)
6874         {
6875           s = arg0;
6876           delta = arg1;
6877         }
6878       else if (TREE_CODE (arg1) == INTEGER_CST)
6879         {
6880           s = arg1;
6881           delta = arg0;
6882         }
6883       else
6884         return NULL_TREE;
6885     }
6886   else if (TREE_CODE (op1) == INTEGER_CST)
6887     {
6888       delta = op1;
6889       s = NULL_TREE;
6890     }
6891   else
6892     {
6893       /* Simulate we are delta * 1.  */
6894       delta = op1;
6895       s = integer_one_node;
6896     }
6897
6898   for (;; ref = TREE_OPERAND (ref, 0))
6899     {
6900       if (TREE_CODE (ref) == ARRAY_REF)
6901         {
6902           /* Remember if this was a multi-dimensional array.  */
6903           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6904             mdim = true;
6905
6906           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6907           if (! itype)
6908             continue;
6909
6910           step = array_ref_element_size (ref);
6911           if (TREE_CODE (step) != INTEGER_CST)
6912             continue;
6913
6914           if (s)
6915             {
6916               if (! tree_int_cst_equal (step, s))
6917                 continue;
6918             }
6919           else
6920             {
6921               /* Try if delta is a multiple of step.  */
6922               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6923               if (! tmp)
6924                 continue;
6925               delta = tmp;
6926             }
6927
6928           /* Only fold here if we can verify we do not overflow one
6929              dimension of a multi-dimensional array.  */
6930           if (mdim)
6931             {
6932               tree tmp;
6933
6934               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6935                   || !INTEGRAL_TYPE_P (itype)
6936                   || !TYPE_MAX_VALUE (itype)
6937                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6938                 continue;
6939
6940               tmp = fold_binary (PLUS_EXPR, itype,
6941                                  fold_convert (itype,
6942                                                TREE_OPERAND (ref, 1)),
6943                                  fold_convert (itype, delta));
6944               if (!tmp
6945                   || TREE_CODE (tmp) != INTEGER_CST
6946                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6947                 continue;
6948             }
6949
6950           break;
6951         }
6952       else
6953         mdim = false;
6954
6955       if (!handled_component_p (ref))
6956         return NULL_TREE;
6957     }
6958
6959   /* We found the suitable array reference.  So copy everything up to it,
6960      and replace the index.  */
6961
6962   pref = TREE_OPERAND (addr, 0);
6963   ret = copy_node (pref);
6964   pos = ret;
6965
6966   while (pref != ref)
6967     {
6968       pref = TREE_OPERAND (pref, 0);
6969       TREE_OPERAND (pos, 0) = copy_node (pref);
6970       pos = TREE_OPERAND (pos, 0);
6971     }
6972
6973   TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
6974                                        fold_convert (itype,
6975                                                      TREE_OPERAND (pos, 1)),
6976                                        fold_convert (itype, delta));
6977
6978   return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6979 }
6980
6981
6982 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6983    means A >= Y && A != MAX, but in this case we know that
6984    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6985
6986 static tree
6987 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6988 {
6989   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6990
6991   if (TREE_CODE (bound) == LT_EXPR)
6992     a = TREE_OPERAND (bound, 0);
6993   else if (TREE_CODE (bound) == GT_EXPR)
6994     a = TREE_OPERAND (bound, 1);
6995   else
6996     return NULL_TREE;
6997
6998   typea = TREE_TYPE (a);
6999   if (!INTEGRAL_TYPE_P (typea)
7000       && !POINTER_TYPE_P (typea))
7001     return NULL_TREE;
7002
7003   if (TREE_CODE (ineq) == LT_EXPR)
7004     {
7005       a1 = TREE_OPERAND (ineq, 1);
7006       y = TREE_OPERAND (ineq, 0);
7007     }
7008   else if (TREE_CODE (ineq) == GT_EXPR)
7009     {
7010       a1 = TREE_OPERAND (ineq, 0);
7011       y = TREE_OPERAND (ineq, 1);
7012     }
7013   else
7014     return NULL_TREE;
7015
7016   if (TREE_TYPE (a1) != typea)
7017     return NULL_TREE;
7018
7019   if (POINTER_TYPE_P (typea))
7020     {
7021       /* Convert the pointer types into integer before taking the difference.  */
7022       tree ta = fold_convert (ssizetype, a);
7023       tree ta1 = fold_convert (ssizetype, a1);
7024       diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7025     }
7026   else
7027    diff = fold_binary (MINUS_EXPR, typea, a1, a);
7028
7029   if (!diff || !integer_onep (diff))
7030    return NULL_TREE;
7031
7032   return fold_build2 (GE_EXPR, type, a, y);
7033 }
7034
7035 /* Fold a sum or difference of at least one multiplication.
7036    Returns the folded tree or NULL if no simplification could be made.  */
7037
7038 static tree
7039 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7040 {
7041   tree arg00, arg01, arg10, arg11;
7042   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7043
7044   /* (A * C) +- (B * C) -> (A+-B) * C.
7045      (A * C) +- A -> A * (C+-1).
7046      We are most concerned about the case where C is a constant,
7047      but other combinations show up during loop reduction.  Since
7048      it is not difficult, try all four possibilities.  */
7049
7050   if (TREE_CODE (arg0) == MULT_EXPR)
7051     {
7052       arg00 = TREE_OPERAND (arg0, 0);
7053       arg01 = TREE_OPERAND (arg0, 1);
7054     }
7055   else if (TREE_CODE (arg0) == INTEGER_CST)
7056     {
7057       arg00 = build_one_cst (type);
7058       arg01 = arg0;
7059     }
7060   else
7061     {
7062       /* We cannot generate constant 1 for fract.  */
7063       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7064         return NULL_TREE;
7065       arg00 = arg0;
7066       arg01 = build_one_cst (type);
7067     }
7068   if (TREE_CODE (arg1) == MULT_EXPR)
7069     {
7070       arg10 = TREE_OPERAND (arg1, 0);
7071       arg11 = TREE_OPERAND (arg1, 1);
7072     }
7073   else if (TREE_CODE (arg1) == INTEGER_CST)
7074     {
7075       arg10 = build_one_cst (type);
7076       arg11 = arg1;
7077     }
7078   else
7079     {
7080       /* We cannot generate constant 1 for fract.  */
7081       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7082         return NULL_TREE;
7083       arg10 = arg1;
7084       arg11 = build_one_cst (type);
7085     }
7086   same = NULL_TREE;
7087
7088   if (operand_equal_p (arg01, arg11, 0))
7089     same = arg01, alt0 = arg00, alt1 = arg10;
7090   else if (operand_equal_p (arg00, arg10, 0))
7091     same = arg00, alt0 = arg01, alt1 = arg11;
7092   else if (operand_equal_p (arg00, arg11, 0))
7093     same = arg00, alt0 = arg01, alt1 = arg10;
7094   else if (operand_equal_p (arg01, arg10, 0))
7095     same = arg01, alt0 = arg00, alt1 = arg11;
7096
7097   /* No identical multiplicands; see if we can find a common
7098      power-of-two factor in non-power-of-two multiplies.  This
7099      can help in multi-dimensional array access.  */
7100   else if (host_integerp (arg01, 0)
7101            && host_integerp (arg11, 0))
7102     {
7103       HOST_WIDE_INT int01, int11, tmp;
7104       bool swap = false;
7105       tree maybe_same;
7106       int01 = TREE_INT_CST_LOW (arg01);
7107       int11 = TREE_INT_CST_LOW (arg11);
7108
7109       /* Move min of absolute values to int11.  */
7110       if ((int01 >= 0 ? int01 : -int01)
7111           < (int11 >= 0 ? int11 : -int11))
7112         {
7113           tmp = int01, int01 = int11, int11 = tmp;
7114           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7115           maybe_same = arg01;
7116           swap = true;
7117         }
7118       else
7119         maybe_same = arg11;
7120
7121       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7122         {
7123           alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7124                               build_int_cst (TREE_TYPE (arg00),
7125                                              int01 / int11));
7126           alt1 = arg10;
7127           same = maybe_same;
7128           if (swap)
7129             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7130         }
7131     }
7132
7133   if (same)
7134     return fold_build2 (MULT_EXPR, type,
7135                         fold_build2 (code, type,
7136                                      fold_convert (type, alt0),
7137                                      fold_convert (type, alt1)),
7138                         fold_convert (type, same));
7139
7140   return NULL_TREE;
7141 }
7142
7143 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7144    specified by EXPR into the buffer PTR of length LEN bytes.
7145    Return the number of bytes placed in the buffer, or zero
7146    upon failure.  */
7147
7148 static int
7149 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7150 {
7151   tree type = TREE_TYPE (expr);
7152   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7153   int byte, offset, word, words;
7154   unsigned char value;
7155
7156   if (total_bytes > len)
7157     return 0;
7158   words = total_bytes / UNITS_PER_WORD;
7159
7160   for (byte = 0; byte < total_bytes; byte++)
7161     {
7162       int bitpos = byte * BITS_PER_UNIT;
7163       if (bitpos < HOST_BITS_PER_WIDE_INT)
7164         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7165       else
7166         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7167                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7168
7169       if (total_bytes > UNITS_PER_WORD)
7170         {
7171           word = byte / UNITS_PER_WORD;
7172           if (WORDS_BIG_ENDIAN)
7173             word = (words - 1) - word;
7174           offset = word * UNITS_PER_WORD;
7175           if (BYTES_BIG_ENDIAN)
7176             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7177           else
7178             offset += byte % UNITS_PER_WORD;
7179         }
7180       else
7181         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7182       ptr[offset] = value;
7183     }
7184   return total_bytes;
7185 }
7186
7187
7188 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7189    specified by EXPR into the buffer PTR of length LEN bytes.
7190    Return the number of bytes placed in the buffer, or zero
7191    upon failure.  */
7192
7193 static int
7194 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7195 {
7196   tree type = TREE_TYPE (expr);
7197   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7198   int byte, offset, word, words, bitpos;
7199   unsigned char value;
7200
7201   /* There are always 32 bits in each long, no matter the size of
7202      the hosts long.  We handle floating point representations with
7203      up to 192 bits.  */
7204   long tmp[6];
7205
7206   if (total_bytes > len)
7207     return 0;
7208   words = 32 / UNITS_PER_WORD;
7209
7210   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7211
7212   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7213        bitpos += BITS_PER_UNIT)
7214     {
7215       byte = (bitpos / BITS_PER_UNIT) & 3;
7216       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7217
7218       if (UNITS_PER_WORD < 4)
7219         {
7220           word = byte / UNITS_PER_WORD;
7221           if (WORDS_BIG_ENDIAN)
7222             word = (words - 1) - word;
7223           offset = word * UNITS_PER_WORD;
7224           if (BYTES_BIG_ENDIAN)
7225             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7226           else
7227             offset += byte % UNITS_PER_WORD;
7228         }
7229       else
7230         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7231       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7232     }
7233   return total_bytes;
7234 }
7235
7236 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7237    specified by EXPR into the buffer PTR of length LEN bytes.
7238    Return the number of bytes placed in the buffer, or zero
7239    upon failure.  */
7240
7241 static int
7242 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7243 {
7244   int rsize, isize;
7245   tree part;
7246
7247   part = TREE_REALPART (expr);
7248   rsize = native_encode_expr (part, ptr, len);
7249   if (rsize == 0)
7250     return 0;
7251   part = TREE_IMAGPART (expr);
7252   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7253   if (isize != rsize)
7254     return 0;
7255   return rsize + isize;
7256 }
7257
7258
7259 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7260    specified by EXPR into the buffer PTR of length LEN bytes.
7261    Return the number of bytes placed in the buffer, or zero
7262    upon failure.  */
7263
7264 static int
7265 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7266 {
7267   int i, size, offset, count;
7268   tree itype, elem, elements;
7269
7270   offset = 0;
7271   elements = TREE_VECTOR_CST_ELTS (expr);
7272   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7273   itype = TREE_TYPE (TREE_TYPE (expr));
7274   size = GET_MODE_SIZE (TYPE_MODE (itype));
7275   for (i = 0; i < count; i++)
7276     {
7277       if (elements)
7278         {
7279           elem = TREE_VALUE (elements);
7280           elements = TREE_CHAIN (elements);
7281         }
7282       else
7283         elem = NULL_TREE;
7284
7285       if (elem)
7286         {
7287           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7288             return 0;
7289         }
7290       else
7291         {
7292           if (offset + size > len)
7293             return 0;
7294           memset (ptr+offset, 0, size);
7295         }
7296       offset += size;
7297     }
7298   return offset;
7299 }
7300
7301
7302 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7303    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7304    buffer PTR of length LEN bytes.  Return the number of bytes
7305    placed in the buffer, or zero upon failure.  */
7306
7307 int
7308 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7309 {
7310   switch (TREE_CODE (expr))
7311     {
7312     case INTEGER_CST:
7313       return native_encode_int (expr, ptr, len);
7314
7315     case REAL_CST:
7316       return native_encode_real (expr, ptr, len);
7317
7318     case COMPLEX_CST:
7319       return native_encode_complex (expr, ptr, len);
7320
7321     case VECTOR_CST:
7322       return native_encode_vector (expr, ptr, len);
7323
7324     default:
7325       return 0;
7326     }
7327 }
7328
7329
7330 /* Subroutine of native_interpret_expr.  Interpret the contents of
7331    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7332    If the buffer cannot be interpreted, return NULL_TREE.  */
7333
7334 static tree
7335 native_interpret_int (tree type, const unsigned char *ptr, int len)
7336 {
7337   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7338   int byte, offset, word, words;
7339   unsigned char value;
7340   unsigned int HOST_WIDE_INT lo = 0;
7341   HOST_WIDE_INT hi = 0;
7342
7343   if (total_bytes > len)
7344     return NULL_TREE;
7345   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7346     return NULL_TREE;
7347   words = total_bytes / UNITS_PER_WORD;
7348
7349   for (byte = 0; byte < total_bytes; byte++)
7350     {
7351       int bitpos = byte * BITS_PER_UNIT;
7352       if (total_bytes > UNITS_PER_WORD)
7353         {
7354           word = byte / UNITS_PER_WORD;
7355           if (WORDS_BIG_ENDIAN)
7356             word = (words - 1) - word;
7357           offset = word * UNITS_PER_WORD;
7358           if (BYTES_BIG_ENDIAN)
7359             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7360           else
7361             offset += byte % UNITS_PER_WORD;
7362         }
7363       else
7364         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7365       value = ptr[offset];
7366
7367       if (bitpos < HOST_BITS_PER_WIDE_INT)
7368         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7369       else
7370         hi |= (unsigned HOST_WIDE_INT) value
7371               << (bitpos - HOST_BITS_PER_WIDE_INT);
7372     }
7373
7374   return build_int_cst_wide_type (type, lo, hi);
7375 }
7376
7377
7378 /* Subroutine of native_interpret_expr.  Interpret the contents of
7379    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7380    If the buffer cannot be interpreted, return NULL_TREE.  */
7381
7382 static tree
7383 native_interpret_real (tree type, const unsigned char *ptr, int len)
7384 {
7385   enum machine_mode mode = TYPE_MODE (type);
7386   int total_bytes = GET_MODE_SIZE (mode);
7387   int byte, offset, word, words, bitpos;
7388   unsigned char value;
7389   /* There are always 32 bits in each long, no matter the size of
7390      the hosts long.  We handle floating point representations with
7391      up to 192 bits.  */
7392   REAL_VALUE_TYPE r;
7393   long tmp[6];
7394
7395   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7396   if (total_bytes > len || total_bytes > 24)
7397     return NULL_TREE;
7398   words = 32 / UNITS_PER_WORD;
7399
7400   memset (tmp, 0, sizeof (tmp));
7401   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7402        bitpos += BITS_PER_UNIT)
7403     {
7404       byte = (bitpos / BITS_PER_UNIT) & 3;
7405       if (UNITS_PER_WORD < 4)
7406         {
7407           word = byte / UNITS_PER_WORD;
7408           if (WORDS_BIG_ENDIAN)
7409             word = (words - 1) - word;
7410           offset = word * UNITS_PER_WORD;
7411           if (BYTES_BIG_ENDIAN)
7412             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7413           else
7414             offset += byte % UNITS_PER_WORD;
7415         }
7416       else
7417         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7418       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7419
7420       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7421     }
7422
7423   real_from_target (&r, tmp, mode);
7424   return build_real (type, r);
7425 }
7426
7427
7428 /* Subroutine of native_interpret_expr.  Interpret the contents of
7429    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7430    If the buffer cannot be interpreted, return NULL_TREE.  */
7431
7432 static tree
7433 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7434 {
7435   tree etype, rpart, ipart;
7436   int size;
7437
7438   etype = TREE_TYPE (type);
7439   size = GET_MODE_SIZE (TYPE_MODE (etype));
7440   if (size * 2 > len)
7441     return NULL_TREE;
7442   rpart = native_interpret_expr (etype, ptr, size);
7443   if (!rpart)
7444     return NULL_TREE;
7445   ipart = native_interpret_expr (etype, ptr+size, size);
7446   if (!ipart)
7447     return NULL_TREE;
7448   return build_complex (type, rpart, ipart);
7449 }
7450
7451
7452 /* Subroutine of native_interpret_expr.  Interpret the contents of
7453    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7454    If the buffer cannot be interpreted, return NULL_TREE.  */
7455
7456 static tree
7457 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7458 {
7459   tree etype, elem, elements;
7460   int i, size, count;
7461
7462   etype = TREE_TYPE (type);
7463   size = GET_MODE_SIZE (TYPE_MODE (etype));
7464   count = TYPE_VECTOR_SUBPARTS (type);
7465   if (size * count > len)
7466     return NULL_TREE;
7467
7468   elements = NULL_TREE;
7469   for (i = count - 1; i >= 0; i--)
7470     {
7471       elem = native_interpret_expr (etype, ptr+(i*size), size);
7472       if (!elem)
7473         return NULL_TREE;
7474       elements = tree_cons (NULL_TREE, elem, elements);
7475     }
7476   return build_vector (type, elements);
7477 }
7478
7479
7480 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7481    the buffer PTR of length LEN as a constant of type TYPE.  For
7482    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7483    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7484    return NULL_TREE.  */
7485
7486 tree
7487 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7488 {
7489   switch (TREE_CODE (type))
7490     {
7491     case INTEGER_TYPE:
7492     case ENUMERAL_TYPE:
7493     case BOOLEAN_TYPE:
7494       return native_interpret_int (type, ptr, len);
7495
7496     case REAL_TYPE:
7497       return native_interpret_real (type, ptr, len);
7498
7499     case COMPLEX_TYPE:
7500       return native_interpret_complex (type, ptr, len);
7501
7502     case VECTOR_TYPE:
7503       return native_interpret_vector (type, ptr, len);
7504
7505     default:
7506       return NULL_TREE;
7507     }
7508 }
7509
7510
7511 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7512    TYPE at compile-time.  If we're unable to perform the conversion
7513    return NULL_TREE.  */
7514
7515 static tree
7516 fold_view_convert_expr (tree type, tree expr)
7517 {
7518   /* We support up to 512-bit values (for V8DFmode).  */
7519   unsigned char buffer[64];
7520   int len;
7521
7522   /* Check that the host and target are sane.  */
7523   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7524     return NULL_TREE;
7525
7526   len = native_encode_expr (expr, buffer, sizeof (buffer));
7527   if (len == 0)
7528     return NULL_TREE;
7529
7530   return native_interpret_expr (type, buffer, len);
7531 }
7532
7533 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7534    to avoid confusing the gimplify process.  When IN_FOLD is true
7535    avoid modifications of T.  */
7536
7537 static tree
7538 build_fold_addr_expr_with_type_1 (tree t, tree ptrtype, bool in_fold)
7539 {
7540   /* The size of the object is not relevant when talking about its address.  */
7541   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7542     t = TREE_OPERAND (t, 0);
7543
7544   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7545   if (TREE_CODE (t) == INDIRECT_REF
7546       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7547     {
7548       t = TREE_OPERAND (t, 0);
7549
7550       if (TREE_TYPE (t) != ptrtype)
7551         t = build1 (NOP_EXPR, ptrtype, t);
7552     }
7553   else if (!in_fold)
7554     {
7555       tree base = t;
7556
7557       while (handled_component_p (base))
7558         base = TREE_OPERAND (base, 0);
7559
7560       if (DECL_P (base))
7561         TREE_ADDRESSABLE (base) = 1;
7562
7563       t = build1 (ADDR_EXPR, ptrtype, t);
7564     }
7565   else
7566     t = build1 (ADDR_EXPR, ptrtype, t);
7567
7568   return t;
7569 }
7570
7571 /* Build an expression for the address of T with type PTRTYPE.  This
7572    function modifies the input parameter 'T' by sometimes setting the
7573    TREE_ADDRESSABLE flag.  */
7574
7575 tree
7576 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7577 {
7578   return build_fold_addr_expr_with_type_1 (t, ptrtype, false);
7579 }
7580
7581 /* Build an expression for the address of T.  This function modifies
7582    the input parameter 'T' by sometimes setting the TREE_ADDRESSABLE
7583    flag.  When called from fold functions, use fold_addr_expr instead.  */
7584
7585 tree
7586 build_fold_addr_expr (tree t)
7587 {
7588   return build_fold_addr_expr_with_type_1 (t, 
7589                                            build_pointer_type (TREE_TYPE (t)),
7590                                            false);
7591 }
7592
7593 /* Same as build_fold_addr_expr, builds an expression for the address
7594    of T, but avoids touching the input node 't'.  Fold functions
7595    should use this version.  */
7596
7597 static tree
7598 fold_addr_expr (tree t)
7599 {
7600   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7601
7602   return build_fold_addr_expr_with_type_1 (t, ptrtype, true);
7603 }
7604
7605 /* Fold a unary expression of code CODE and type TYPE with operand
7606    OP0.  Return the folded expression if folding is successful.
7607    Otherwise, return NULL_TREE.  */
7608
7609 tree
7610 fold_unary (enum tree_code code, tree type, tree op0)
7611 {
7612   tree tem;
7613   tree arg0;
7614   enum tree_code_class kind = TREE_CODE_CLASS (code);
7615
7616   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7617               && TREE_CODE_LENGTH (code) == 1);
7618
7619   arg0 = op0;
7620   if (arg0)
7621     {
7622       if (code == NOP_EXPR || code == CONVERT_EXPR
7623           || code == FLOAT_EXPR || code == ABS_EXPR)
7624         {
7625           /* Don't use STRIP_NOPS, because signedness of argument type
7626              matters.  */
7627           STRIP_SIGN_NOPS (arg0);
7628         }
7629       else
7630         {
7631           /* Strip any conversions that don't change the mode.  This
7632              is safe for every expression, except for a comparison
7633              expression because its signedness is derived from its
7634              operands.
7635
7636              Note that this is done as an internal manipulation within
7637              the constant folder, in order to find the simplest
7638              representation of the arguments so that their form can be
7639              studied.  In any cases, the appropriate type conversions
7640              should be put back in the tree that will get out of the
7641              constant folder.  */
7642           STRIP_NOPS (arg0);
7643         }
7644     }
7645
7646   if (TREE_CODE_CLASS (code) == tcc_unary)
7647     {
7648       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7649         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7650                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7651       else if (TREE_CODE (arg0) == COND_EXPR)
7652         {
7653           tree arg01 = TREE_OPERAND (arg0, 1);
7654           tree arg02 = TREE_OPERAND (arg0, 2);
7655           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7656             arg01 = fold_build1 (code, type, arg01);
7657           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7658             arg02 = fold_build1 (code, type, arg02);
7659           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7660                              arg01, arg02);
7661
7662           /* If this was a conversion, and all we did was to move into
7663              inside the COND_EXPR, bring it back out.  But leave it if
7664              it is a conversion from integer to integer and the
7665              result precision is no wider than a word since such a
7666              conversion is cheap and may be optimized away by combine,
7667              while it couldn't if it were outside the COND_EXPR.  Then return
7668              so we don't get into an infinite recursion loop taking the
7669              conversion out and then back in.  */
7670
7671           if ((code == NOP_EXPR || code == CONVERT_EXPR
7672                || code == NON_LVALUE_EXPR)
7673               && TREE_CODE (tem) == COND_EXPR
7674               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7675               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7676               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7677               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7678               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7679                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7680               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7681                      && (INTEGRAL_TYPE_P
7682                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7683                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7684                   || flag_syntax_only))
7685             tem = build1 (code, type,
7686                           build3 (COND_EXPR,
7687                                   TREE_TYPE (TREE_OPERAND
7688                                              (TREE_OPERAND (tem, 1), 0)),
7689                                   TREE_OPERAND (tem, 0),
7690                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7691                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7692           return tem;
7693         }
7694       else if (COMPARISON_CLASS_P (arg0))
7695         {
7696           if (TREE_CODE (type) == BOOLEAN_TYPE)
7697             {
7698               arg0 = copy_node (arg0);
7699               TREE_TYPE (arg0) = type;
7700               return arg0;
7701             }
7702           else if (TREE_CODE (type) != INTEGER_TYPE)
7703             return fold_build3 (COND_EXPR, type, arg0,
7704                                 fold_build1 (code, type,
7705                                              integer_one_node),
7706                                 fold_build1 (code, type,
7707                                              integer_zero_node));
7708         }
7709    }
7710
7711   switch (code)
7712     {
7713     case PAREN_EXPR:
7714       /* Re-association barriers around constants and other re-association
7715          barriers can be removed.  */
7716       if (CONSTANT_CLASS_P (op0)
7717           || TREE_CODE (op0) == PAREN_EXPR)
7718         return fold_convert (type, op0);
7719       return NULL_TREE;
7720
7721     case NOP_EXPR:
7722     case FLOAT_EXPR:
7723     case CONVERT_EXPR:
7724     case FIX_TRUNC_EXPR:
7725       if (TREE_TYPE (op0) == type)
7726         return op0;
7727       
7728       /* If we have (type) (a CMP b) and type is an integral type, return
7729          new expression involving the new type.  */
7730       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7731         return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7732                             TREE_OPERAND (op0, 1));
7733
7734       /* Handle cases of two conversions in a row.  */
7735       if (TREE_CODE (op0) == NOP_EXPR
7736           || TREE_CODE (op0) == CONVERT_EXPR)
7737         {
7738           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7739           tree inter_type = TREE_TYPE (op0);
7740           int inside_int = INTEGRAL_TYPE_P (inside_type);
7741           int inside_ptr = POINTER_TYPE_P (inside_type);
7742           int inside_float = FLOAT_TYPE_P (inside_type);
7743           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7744           unsigned int inside_prec = TYPE_PRECISION (inside_type);
7745           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7746           int inter_int = INTEGRAL_TYPE_P (inter_type);
7747           int inter_ptr = POINTER_TYPE_P (inter_type);
7748           int inter_float = FLOAT_TYPE_P (inter_type);
7749           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7750           unsigned int inter_prec = TYPE_PRECISION (inter_type);
7751           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7752           int final_int = INTEGRAL_TYPE_P (type);
7753           int final_ptr = POINTER_TYPE_P (type);
7754           int final_float = FLOAT_TYPE_P (type);
7755           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7756           unsigned int final_prec = TYPE_PRECISION (type);
7757           int final_unsignedp = TYPE_UNSIGNED (type);
7758
7759           /* In addition to the cases of two conversions in a row
7760              handled below, if we are converting something to its own
7761              type via an object of identical or wider precision, neither
7762              conversion is needed.  */
7763           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7764               && (((inter_int || inter_ptr) && final_int)
7765                   || (inter_float && final_float))
7766               && inter_prec >= final_prec)
7767             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7768
7769           /* Likewise, if the intermediate and final types are either both
7770              float or both integer, we don't need the middle conversion if
7771              it is wider than the final type and doesn't change the signedness
7772              (for integers).  Avoid this if the final type is a pointer
7773              since then we sometimes need the inner conversion.  Likewise if
7774              the outer has a precision not equal to the size of its mode.  */
7775           if (((inter_int && inside_int)
7776                || (inter_float && inside_float)
7777                || (inter_vec && inside_vec))
7778               && inter_prec >= inside_prec
7779               && (inter_float || inter_vec
7780                   || inter_unsignedp == inside_unsignedp)
7781               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7782                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
7783               && ! final_ptr
7784               && (! final_vec || inter_prec == inside_prec))
7785             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7786
7787           /* If we have a sign-extension of a zero-extended value, we can
7788              replace that by a single zero-extension.  */
7789           if (inside_int && inter_int && final_int
7790               && inside_prec < inter_prec && inter_prec < final_prec
7791               && inside_unsignedp && !inter_unsignedp)
7792             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7793
7794           /* Two conversions in a row are not needed unless:
7795              - some conversion is floating-point (overstrict for now), or
7796              - some conversion is a vector (overstrict for now), or
7797              - the intermediate type is narrower than both initial and
7798                final, or
7799              - the intermediate type and innermost type differ in signedness,
7800                and the outermost type is wider than the intermediate, or
7801              - the initial type is a pointer type and the precisions of the
7802                intermediate and final types differ, or
7803              - the final type is a pointer type and the precisions of the
7804                initial and intermediate types differ.  */
7805           if (! inside_float && ! inter_float && ! final_float
7806               && ! inside_vec && ! inter_vec && ! final_vec
7807               && (inter_prec >= inside_prec || inter_prec >= final_prec)
7808               && ! (inside_int && inter_int
7809                     && inter_unsignedp != inside_unsignedp
7810                     && inter_prec < final_prec)
7811               && ((inter_unsignedp && inter_prec > inside_prec)
7812                   == (final_unsignedp && final_prec > inter_prec))
7813               && ! (inside_ptr && inter_prec != final_prec)
7814               && ! (final_ptr && inside_prec != inter_prec)
7815               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7816                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
7817             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7818         }
7819
7820       /* Handle (T *)&A.B.C for A being of type T and B and C
7821          living at offset zero.  This occurs frequently in
7822          C++ upcasting and then accessing the base.  */
7823       if (TREE_CODE (op0) == ADDR_EXPR
7824           && POINTER_TYPE_P (type)
7825           && handled_component_p (TREE_OPERAND (op0, 0)))
7826         {
7827           HOST_WIDE_INT bitsize, bitpos;
7828           tree offset;
7829           enum machine_mode mode;
7830           int unsignedp, volatilep;
7831           tree base = TREE_OPERAND (op0, 0);
7832           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7833                                       &mode, &unsignedp, &volatilep, false);
7834           /* If the reference was to a (constant) zero offset, we can use
7835              the address of the base if it has the same base type
7836              as the result type.  */
7837           if (! offset && bitpos == 0
7838               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7839                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7840             return fold_convert (type, fold_addr_expr (base));
7841         }
7842
7843       if ((TREE_CODE (op0) == MODIFY_EXPR
7844            || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7845           && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7846           /* Detect assigning a bitfield.  */
7847           && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7848                && DECL_BIT_FIELD
7849                (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7850         {
7851           /* Don't leave an assignment inside a conversion
7852              unless assigning a bitfield.  */
7853           tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7854           /* First do the assignment, then return converted constant.  */
7855           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7856           TREE_NO_WARNING (tem) = 1;
7857           TREE_USED (tem) = 1;
7858           return tem;
7859         }
7860
7861       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7862          constants (if x has signed type, the sign bit cannot be set
7863          in c).  This folds extension into the BIT_AND_EXPR.  */
7864       if (INTEGRAL_TYPE_P (type)
7865           && TREE_CODE (type) != BOOLEAN_TYPE
7866           && TREE_CODE (op0) == BIT_AND_EXPR
7867           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7868         {
7869           tree and = op0;
7870           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7871           int change = 0;
7872
7873           if (TYPE_UNSIGNED (TREE_TYPE (and))
7874               || (TYPE_PRECISION (type)
7875                   <= TYPE_PRECISION (TREE_TYPE (and))))
7876             change = 1;
7877           else if (TYPE_PRECISION (TREE_TYPE (and1))
7878                    <= HOST_BITS_PER_WIDE_INT
7879                    && host_integerp (and1, 1))
7880             {
7881               unsigned HOST_WIDE_INT cst;
7882
7883               cst = tree_low_cst (and1, 1);
7884               cst &= (HOST_WIDE_INT) -1
7885                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7886               change = (cst == 0);
7887 #ifdef LOAD_EXTEND_OP
7888               if (change
7889                   && !flag_syntax_only
7890                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7891                       == ZERO_EXTEND))
7892                 {
7893                   tree uns = unsigned_type_for (TREE_TYPE (and0));
7894                   and0 = fold_convert (uns, and0);
7895                   and1 = fold_convert (uns, and1);
7896                 }
7897 #endif
7898             }
7899           if (change)
7900             {
7901               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7902                                            TREE_INT_CST_HIGH (and1), 0,
7903                                            TREE_OVERFLOW (and1));
7904               return fold_build2 (BIT_AND_EXPR, type,
7905                                   fold_convert (type, and0), tem);
7906             }
7907         }
7908
7909       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
7910          when one of the new casts will fold away. Conservatively we assume
7911          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
7912       if (POINTER_TYPE_P (type)
7913           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
7914           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7915               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7916               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7917         {
7918           tree arg00 = TREE_OPERAND (arg0, 0);
7919           tree arg01 = TREE_OPERAND (arg0, 1);
7920
7921           return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7922                               fold_convert (sizetype, arg01));
7923         }
7924
7925       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7926          of the same precision, and X is an integer type not narrower than
7927          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
7928       if (INTEGRAL_TYPE_P (type)
7929           && TREE_CODE (op0) == BIT_NOT_EXPR
7930           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7931           && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7932               || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7933           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7934         {
7935           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7936           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7937               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7938             return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7939         }
7940
7941       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
7942          type of X and Y (integer types only).  */
7943       if (INTEGRAL_TYPE_P (type)
7944           && TREE_CODE (op0) == MULT_EXPR
7945           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7946           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
7947         {
7948           /* Be careful not to introduce new overflows.  */
7949           tree mult_type;
7950           if (TYPE_OVERFLOW_WRAPS (type))
7951             mult_type = type;
7952           else
7953             mult_type = unsigned_type_for (type);
7954           
7955           tem = fold_build2 (MULT_EXPR, mult_type,
7956                              fold_convert (mult_type, TREE_OPERAND (op0, 0)),
7957                              fold_convert (mult_type, TREE_OPERAND (op0, 1)));
7958           return fold_convert (type, tem);
7959         }
7960
7961       tem = fold_convert_const (code, type, op0);
7962       return tem ? tem : NULL_TREE;
7963
7964     case FIXED_CONVERT_EXPR:
7965       tem = fold_convert_const (code, type, arg0);
7966       return tem ? tem : NULL_TREE;
7967
7968     case VIEW_CONVERT_EXPR:
7969       if (TREE_TYPE (op0) == type)
7970         return op0;
7971       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7972         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7973
7974       /* For integral conversions with the same precision or pointer
7975          conversions use a NOP_EXPR instead.  */
7976       if ((INTEGRAL_TYPE_P (type)
7977            || POINTER_TYPE_P (type))
7978           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7979               || POINTER_TYPE_P (TREE_TYPE (op0)))
7980           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
7981           /* Do not muck with VIEW_CONVERT_EXPRs that convert from
7982              a sub-type to its base type as generated by the Ada FE.  */
7983           && !(INTEGRAL_TYPE_P (TREE_TYPE (op0))
7984                && TREE_TYPE (TREE_TYPE (op0))))
7985         return fold_convert (type, op0);
7986
7987       /* Strip inner integral conversions that do not change the precision.  */
7988       if ((TREE_CODE (op0) == NOP_EXPR
7989            || TREE_CODE (op0) == CONVERT_EXPR)
7990           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
7991               || POINTER_TYPE_P (TREE_TYPE (op0)))
7992           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
7993               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
7994           && (TYPE_PRECISION (TREE_TYPE (op0))
7995               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
7996         return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7997
7998       return fold_view_convert_expr (type, op0);
7999
8000     case NEGATE_EXPR:
8001       tem = fold_negate_expr (arg0);
8002       if (tem)
8003         return fold_convert (type, tem);
8004       return NULL_TREE;
8005
8006     case ABS_EXPR:
8007       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8008         return fold_abs_const (arg0, type);
8009       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8010         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8011       /* Convert fabs((double)float) into (double)fabsf(float).  */
8012       else if (TREE_CODE (arg0) == NOP_EXPR
8013                && TREE_CODE (type) == REAL_TYPE)
8014         {
8015           tree targ0 = strip_float_extensions (arg0);
8016           if (targ0 != arg0)
8017             return fold_convert (type, fold_build1 (ABS_EXPR,
8018                                                     TREE_TYPE (targ0),
8019                                                     targ0));
8020         }
8021       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8022       else if (TREE_CODE (arg0) == ABS_EXPR)
8023         return arg0;
8024       else if (tree_expr_nonnegative_p (arg0))
8025         return arg0;
8026
8027       /* Strip sign ops from argument.  */
8028       if (TREE_CODE (type) == REAL_TYPE)
8029         {
8030           tem = fold_strip_sign_ops (arg0);
8031           if (tem)
8032             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
8033         }
8034       return NULL_TREE;
8035
8036     case CONJ_EXPR:
8037       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8038         return fold_convert (type, arg0);
8039       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8040         {
8041           tree itype = TREE_TYPE (type);
8042           tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8043           tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8044           return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8045         }
8046       if (TREE_CODE (arg0) == COMPLEX_CST)
8047         {
8048           tree itype = TREE_TYPE (type);
8049           tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8050           tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8051           return build_complex (type, rpart, negate_expr (ipart));
8052         }
8053       if (TREE_CODE (arg0) == CONJ_EXPR)
8054         return fold_convert (type, TREE_OPERAND (arg0, 0));
8055       return NULL_TREE;
8056
8057     case BIT_NOT_EXPR:
8058       if (TREE_CODE (arg0) == INTEGER_CST)
8059         return fold_not_const (arg0, type);
8060       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8061         return fold_convert (type, TREE_OPERAND (arg0, 0));
8062       /* Convert ~ (-A) to A - 1.  */
8063       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8064         return fold_build2 (MINUS_EXPR, type,
8065                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8066                             build_int_cst (type, 1));
8067       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8068       else if (INTEGRAL_TYPE_P (type)
8069                && ((TREE_CODE (arg0) == MINUS_EXPR
8070                     && integer_onep (TREE_OPERAND (arg0, 1)))
8071                    || (TREE_CODE (arg0) == PLUS_EXPR
8072                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8073         return fold_build1 (NEGATE_EXPR, type,
8074                             fold_convert (type, TREE_OPERAND (arg0, 0)));
8075       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8076       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8077                && (tem = fold_unary (BIT_NOT_EXPR, type,
8078                                      fold_convert (type,
8079                                                    TREE_OPERAND (arg0, 0)))))
8080         return fold_build2 (BIT_XOR_EXPR, type, tem,
8081                             fold_convert (type, TREE_OPERAND (arg0, 1)));
8082       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8083                && (tem = fold_unary (BIT_NOT_EXPR, type,
8084                                      fold_convert (type,
8085                                                    TREE_OPERAND (arg0, 1)))))
8086         return fold_build2 (BIT_XOR_EXPR, type,
8087                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8088       /* Perform BIT_NOT_EXPR on each element individually.  */
8089       else if (TREE_CODE (arg0) == VECTOR_CST)
8090         {
8091           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8092           int count = TYPE_VECTOR_SUBPARTS (type), i;
8093
8094           for (i = 0; i < count; i++)
8095             {
8096               if (elements)
8097                 {
8098                   elem = TREE_VALUE (elements);
8099                   elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8100                   if (elem == NULL_TREE)
8101                     break;
8102                   elements = TREE_CHAIN (elements);
8103                 }
8104               else
8105                 elem = build_int_cst (TREE_TYPE (type), -1);
8106               list = tree_cons (NULL_TREE, elem, list);
8107             }
8108           if (i == count)
8109             return build_vector (type, nreverse (list));
8110         }
8111
8112       return NULL_TREE;
8113
8114     case TRUTH_NOT_EXPR:
8115       /* The argument to invert_truthvalue must have Boolean type.  */
8116       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8117           arg0 = fold_convert (boolean_type_node, arg0);
8118
8119       /* Note that the operand of this must be an int
8120          and its values must be 0 or 1.
8121          ("true" is a fixed value perhaps depending on the language,
8122          but we don't handle values other than 1 correctly yet.)  */
8123       tem = fold_truth_not_expr (arg0);
8124       if (!tem)
8125         return NULL_TREE;
8126       return fold_convert (type, tem);
8127
8128     case REALPART_EXPR:
8129       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8130         return fold_convert (type, arg0);
8131       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8132         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8133                                  TREE_OPERAND (arg0, 1));
8134       if (TREE_CODE (arg0) == COMPLEX_CST)
8135         return fold_convert (type, TREE_REALPART (arg0));
8136       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8137         {
8138           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8139           tem = fold_build2 (TREE_CODE (arg0), itype,
8140                              fold_build1 (REALPART_EXPR, itype,
8141                                           TREE_OPERAND (arg0, 0)),
8142                              fold_build1 (REALPART_EXPR, itype,
8143                                           TREE_OPERAND (arg0, 1)));
8144           return fold_convert (type, tem);
8145         }
8146       if (TREE_CODE (arg0) == CONJ_EXPR)
8147         {
8148           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8149           tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8150           return fold_convert (type, tem);
8151         }
8152       if (TREE_CODE (arg0) == CALL_EXPR)
8153         {
8154           tree fn = get_callee_fndecl (arg0);
8155           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8156             switch (DECL_FUNCTION_CODE (fn))
8157               {
8158               CASE_FLT_FN (BUILT_IN_CEXPI):
8159                 fn = mathfn_built_in (type, BUILT_IN_COS);
8160                 if (fn)
8161                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8162                 break;
8163
8164               default:
8165                 break;
8166               }
8167         }
8168       return NULL_TREE;
8169
8170     case IMAGPART_EXPR:
8171       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8172         return fold_convert (type, integer_zero_node);
8173       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8174         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8175                                  TREE_OPERAND (arg0, 0));
8176       if (TREE_CODE (arg0) == COMPLEX_CST)
8177         return fold_convert (type, TREE_IMAGPART (arg0));
8178       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8179         {
8180           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8181           tem = fold_build2 (TREE_CODE (arg0), itype,
8182                              fold_build1 (IMAGPART_EXPR, itype,
8183                                           TREE_OPERAND (arg0, 0)),
8184                              fold_build1 (IMAGPART_EXPR, itype,
8185                                           TREE_OPERAND (arg0, 1)));
8186           return fold_convert (type, tem);
8187         }
8188       if (TREE_CODE (arg0) == CONJ_EXPR)
8189         {
8190           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8191           tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8192           return fold_convert (type, negate_expr (tem));
8193         }
8194       if (TREE_CODE (arg0) == CALL_EXPR)
8195         {
8196           tree fn = get_callee_fndecl (arg0);
8197           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8198             switch (DECL_FUNCTION_CODE (fn))
8199               {
8200               CASE_FLT_FN (BUILT_IN_CEXPI):
8201                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8202                 if (fn)
8203                   return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8204                 break;
8205
8206               default:
8207                 break;
8208               }
8209         }
8210       return NULL_TREE;
8211
8212     default:
8213       return NULL_TREE;
8214     } /* switch (code) */
8215 }
8216
8217 /* Fold a binary expression of code CODE and type TYPE with operands
8218    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8219    Return the folded expression if folding is successful.  Otherwise,
8220    return NULL_TREE.  */
8221
8222 static tree
8223 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8224 {
8225   enum tree_code compl_code;
8226
8227   if (code == MIN_EXPR)
8228     compl_code = MAX_EXPR;
8229   else if (code == MAX_EXPR)
8230     compl_code = MIN_EXPR;
8231   else
8232     gcc_unreachable ();
8233
8234   /* MIN (MAX (a, b), b) == b.  */
8235   if (TREE_CODE (op0) == compl_code
8236       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8237     return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8238
8239   /* MIN (MAX (b, a), b) == b.  */
8240   if (TREE_CODE (op0) == compl_code
8241       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8242       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8243     return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8244
8245   /* MIN (a, MAX (a, b)) == a.  */
8246   if (TREE_CODE (op1) == compl_code
8247       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8248       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8249     return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8250
8251   /* MIN (a, MAX (b, a)) == a.  */
8252   if (TREE_CODE (op1) == compl_code
8253       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8254       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8255     return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8256
8257   return NULL_TREE;
8258 }
8259
8260 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8261    by changing CODE to reduce the magnitude of constants involved in
8262    ARG0 of the comparison.
8263    Returns a canonicalized comparison tree if a simplification was
8264    possible, otherwise returns NULL_TREE.
8265    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8266    valid if signed overflow is undefined.  */
8267
8268 static tree
8269 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8270                                  tree arg0, tree arg1,
8271                                  bool *strict_overflow_p)
8272 {
8273   enum tree_code code0 = TREE_CODE (arg0);
8274   tree t, cst0 = NULL_TREE;
8275   int sgn0;
8276   bool swap = false;
8277
8278   /* Match A +- CST code arg1 and CST code arg1.  */
8279   if (!(((code0 == MINUS_EXPR
8280           || code0 == PLUS_EXPR)
8281          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8282         || code0 == INTEGER_CST))
8283     return NULL_TREE;
8284
8285   /* Identify the constant in arg0 and its sign.  */
8286   if (code0 == INTEGER_CST)
8287     cst0 = arg0;
8288   else
8289     cst0 = TREE_OPERAND (arg0, 1);
8290   sgn0 = tree_int_cst_sgn (cst0);
8291
8292   /* Overflowed constants and zero will cause problems.  */
8293   if (integer_zerop (cst0)
8294       || TREE_OVERFLOW (cst0))
8295     return NULL_TREE;
8296
8297   /* See if we can reduce the magnitude of the constant in
8298      arg0 by changing the comparison code.  */
8299   if (code0 == INTEGER_CST)
8300     {
8301       /* CST <= arg1  ->  CST-1 < arg1.  */
8302       if (code == LE_EXPR && sgn0 == 1)
8303         code = LT_EXPR;
8304       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8305       else if (code == LT_EXPR && sgn0 == -1)
8306         code = LE_EXPR;
8307       /* CST > arg1  ->  CST-1 >= arg1.  */
8308       else if (code == GT_EXPR && sgn0 == 1)
8309         code = GE_EXPR;
8310       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8311       else if (code == GE_EXPR && sgn0 == -1)
8312         code = GT_EXPR;
8313       else
8314         return NULL_TREE;
8315       /* arg1 code' CST' might be more canonical.  */
8316       swap = true;
8317     }
8318   else
8319     {
8320       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8321       if (code == LT_EXPR
8322           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8323         code = LE_EXPR;
8324       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8325       else if (code == GT_EXPR
8326                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8327         code = GE_EXPR;
8328       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8329       else if (code == LE_EXPR
8330                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8331         code = LT_EXPR;
8332       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8333       else if (code == GE_EXPR
8334                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8335         code = GT_EXPR;
8336       else
8337         return NULL_TREE;
8338       *strict_overflow_p = true;
8339     }
8340
8341   /* Now build the constant reduced in magnitude.  */
8342   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8343                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8344   if (code0 != INTEGER_CST)
8345     t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8346
8347   /* If swapping might yield to a more canonical form, do so.  */
8348   if (swap)
8349     return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8350   else
8351     return fold_build2 (code, type, t, arg1);
8352 }
8353
8354 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8355    overflow further.  Try to decrease the magnitude of constants involved
8356    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8357    and put sole constants at the second argument position.
8358    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8359
8360 static tree
8361 maybe_canonicalize_comparison (enum tree_code code, tree type,
8362                                tree arg0, tree arg1)
8363 {
8364   tree t;
8365   bool strict_overflow_p;
8366   const char * const warnmsg = G_("assuming signed overflow does not occur "
8367                                   "when reducing constant in comparison");
8368
8369   /* In principle pointers also have undefined overflow behavior,
8370      but that causes problems elsewhere.  */
8371   if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8372       || POINTER_TYPE_P (TREE_TYPE (arg0)))
8373     return NULL_TREE;
8374
8375   /* Try canonicalization by simplifying arg0.  */
8376   strict_overflow_p = false;
8377   t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8378                                        &strict_overflow_p);
8379   if (t)
8380     {
8381       if (strict_overflow_p)
8382         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8383       return t;
8384     }
8385
8386   /* Try canonicalization by simplifying arg1 using the swapped
8387      comparison.  */
8388   code = swap_tree_comparison (code);
8389   strict_overflow_p = false;
8390   t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8391                                        &strict_overflow_p);
8392   if (t && strict_overflow_p)
8393     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8394   return t;
8395 }
8396
8397 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
8398    space.  This is used to avoid issuing overflow warnings for
8399    expressions like &p->x which can not wrap.  */
8400
8401 static bool
8402 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8403 {
8404   unsigned HOST_WIDE_INT offset_low, total_low;
8405   HOST_WIDE_INT size, offset_high, total_high;
8406
8407   if (!POINTER_TYPE_P (TREE_TYPE (base)))
8408     return true;
8409
8410   if (bitpos < 0)
8411     return true;
8412
8413   if (offset == NULL_TREE)
8414     {
8415       offset_low = 0;
8416       offset_high = 0;
8417     }
8418   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8419     return true;
8420   else
8421     {
8422       offset_low = TREE_INT_CST_LOW (offset);
8423       offset_high = TREE_INT_CST_HIGH (offset);
8424     }
8425
8426   if (add_double_with_sign (offset_low, offset_high,
8427                             bitpos / BITS_PER_UNIT, 0,
8428                             &total_low, &total_high,
8429                             true))
8430     return true;
8431
8432   if (total_high != 0)
8433     return true;
8434
8435   size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8436   if (size <= 0)
8437     return true;
8438
8439   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8440      array.  */
8441   if (TREE_CODE (base) == ADDR_EXPR)
8442     {
8443       HOST_WIDE_INT base_size;
8444
8445       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8446       if (base_size > 0 && size < base_size)
8447         size = base_size;
8448     }
8449
8450   return total_low > (unsigned HOST_WIDE_INT) size;
8451 }
8452
8453 /* Subroutine of fold_binary.  This routine performs all of the
8454    transformations that are common to the equality/inequality
8455    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8456    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8457    fold_binary should call fold_binary.  Fold a comparison with
8458    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8459    the folded comparison or NULL_TREE.  */
8460
8461 static tree
8462 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8463 {
8464   tree arg0, arg1, tem;
8465
8466   arg0 = op0;
8467   arg1 = op1;
8468
8469   STRIP_SIGN_NOPS (arg0);
8470   STRIP_SIGN_NOPS (arg1);
8471
8472   tem = fold_relational_const (code, type, arg0, arg1);
8473   if (tem != NULL_TREE)
8474     return tem;
8475
8476   /* If one arg is a real or integer constant, put it last.  */
8477   if (tree_swap_operands_p (arg0, arg1, true))
8478     return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8479
8480   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
8481   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8482       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8483           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8484           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8485       && (TREE_CODE (arg1) == INTEGER_CST
8486           && !TREE_OVERFLOW (arg1)))
8487     {
8488       tree const1 = TREE_OPERAND (arg0, 1);
8489       tree const2 = arg1;
8490       tree variable = TREE_OPERAND (arg0, 0);
8491       tree lhs;
8492       int lhs_add;
8493       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8494
8495       lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8496                          TREE_TYPE (arg1), const2, const1);
8497
8498       /* If the constant operation overflowed this can be
8499          simplified as a comparison against INT_MAX/INT_MIN.  */
8500       if (TREE_CODE (lhs) == INTEGER_CST
8501           && TREE_OVERFLOW (lhs))
8502         {
8503           int const1_sgn = tree_int_cst_sgn (const1);
8504           enum tree_code code2 = code;
8505
8506           /* Get the sign of the constant on the lhs if the
8507              operation were VARIABLE + CONST1.  */
8508           if (TREE_CODE (arg0) == MINUS_EXPR)
8509             const1_sgn = -const1_sgn;
8510
8511           /* The sign of the constant determines if we overflowed
8512              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8513              Canonicalize to the INT_MIN overflow by swapping the comparison
8514              if necessary.  */
8515           if (const1_sgn == -1)
8516             code2 = swap_tree_comparison (code);
8517
8518           /* We now can look at the canonicalized case
8519                VARIABLE + 1  CODE2  INT_MIN
8520              and decide on the result.  */
8521           if (code2 == LT_EXPR
8522               || code2 == LE_EXPR
8523               || code2 == EQ_EXPR)
8524             return omit_one_operand (type, boolean_false_node, variable);
8525           else if (code2 == NE_EXPR
8526                    || code2 == GE_EXPR
8527                    || code2 == GT_EXPR)
8528             return omit_one_operand (type, boolean_true_node, variable);
8529         }
8530
8531       if (TREE_CODE (lhs) == TREE_CODE (arg1)
8532           && (TREE_CODE (lhs) != INTEGER_CST
8533               || !TREE_OVERFLOW (lhs)))
8534         {
8535           fold_overflow_warning (("assuming signed overflow does not occur "
8536                                   "when changing X +- C1 cmp C2 to "
8537                                   "X cmp C1 +- C2"),
8538                                  WARN_STRICT_OVERFLOW_COMPARISON);
8539           return fold_build2 (code, type, variable, lhs);
8540         }
8541     }
8542
8543   /* For comparisons of pointers we can decompose it to a compile time
8544      comparison of the base objects and the offsets into the object.
8545      This requires at least one operand being an ADDR_EXPR or a
8546      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8547   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8548       && (TREE_CODE (arg0) == ADDR_EXPR
8549           || TREE_CODE (arg1) == ADDR_EXPR
8550           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8551           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8552     {
8553       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8554       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8555       enum machine_mode mode;
8556       int volatilep, unsignedp;
8557       bool indirect_base0 = false, indirect_base1 = false;
8558
8559       /* Get base and offset for the access.  Strip ADDR_EXPR for
8560          get_inner_reference, but put it back by stripping INDIRECT_REF
8561          off the base object if possible.  indirect_baseN will be true
8562          if baseN is not an address but refers to the object itself.  */
8563       base0 = arg0;
8564       if (TREE_CODE (arg0) == ADDR_EXPR)
8565         {
8566           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8567                                        &bitsize, &bitpos0, &offset0, &mode,
8568                                        &unsignedp, &volatilep, false);
8569           if (TREE_CODE (base0) == INDIRECT_REF)
8570             base0 = TREE_OPERAND (base0, 0);
8571           else
8572             indirect_base0 = true;
8573         }
8574       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8575         {
8576           base0 = TREE_OPERAND (arg0, 0);
8577           offset0 = TREE_OPERAND (arg0, 1);
8578         }
8579
8580       base1 = arg1;
8581       if (TREE_CODE (arg1) == ADDR_EXPR)
8582         {
8583           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8584                                        &bitsize, &bitpos1, &offset1, &mode,
8585                                        &unsignedp, &volatilep, false);
8586           if (TREE_CODE (base1) == INDIRECT_REF)
8587             base1 = TREE_OPERAND (base1, 0);
8588           else
8589             indirect_base1 = true;
8590         }
8591       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8592         {
8593           base1 = TREE_OPERAND (arg1, 0);
8594           offset1 = TREE_OPERAND (arg1, 1);
8595         }
8596
8597       /* If we have equivalent bases we might be able to simplify.  */
8598       if (indirect_base0 == indirect_base1
8599           && operand_equal_p (base0, base1, 0))
8600         {
8601           /* We can fold this expression to a constant if the non-constant
8602              offset parts are equal.  */
8603           if ((offset0 == offset1
8604                || (offset0 && offset1
8605                    && operand_equal_p (offset0, offset1, 0)))
8606               && (code == EQ_EXPR
8607                   || code == NE_EXPR
8608                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
8609                 
8610             {
8611               if (code != EQ_EXPR
8612                   && code != NE_EXPR
8613                   && bitpos0 != bitpos1
8614                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
8615                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
8616                 fold_overflow_warning (("assuming pointer wraparound does not "
8617                                         "occur when comparing P +- C1 with "
8618                                         "P +- C2"),
8619                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
8620
8621               switch (code)
8622                 {
8623                 case EQ_EXPR:
8624                   return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8625                 case NE_EXPR:
8626                   return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8627                 case LT_EXPR:
8628                   return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8629                 case LE_EXPR:
8630                   return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8631                 case GE_EXPR:
8632                   return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8633                 case GT_EXPR:
8634                   return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8635                 default:;
8636                 }
8637             }
8638           /* We can simplify the comparison to a comparison of the variable
8639              offset parts if the constant offset parts are equal.
8640              Be careful to use signed size type here because otherwise we
8641              mess with array offsets in the wrong way.  This is possible
8642              because pointer arithmetic is restricted to retain within an
8643              object and overflow on pointer differences is undefined as of
8644              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
8645           else if (bitpos0 == bitpos1
8646                    && ((code == EQ_EXPR || code == NE_EXPR)
8647                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
8648             {
8649               tree signed_size_type_node;
8650               signed_size_type_node = signed_type_for (size_type_node);
8651
8652               /* By converting to signed size type we cover middle-end pointer
8653                  arithmetic which operates on unsigned pointer types of size
8654                  type size and ARRAY_REF offsets which are properly sign or
8655                  zero extended from their type in case it is narrower than
8656                  size type.  */
8657               if (offset0 == NULL_TREE)
8658                 offset0 = build_int_cst (signed_size_type_node, 0);
8659               else
8660                 offset0 = fold_convert (signed_size_type_node, offset0);
8661               if (offset1 == NULL_TREE)
8662                 offset1 = build_int_cst (signed_size_type_node, 0);
8663               else
8664                 offset1 = fold_convert (signed_size_type_node, offset1);
8665
8666               if (code != EQ_EXPR
8667                   && code != NE_EXPR
8668                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
8669                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
8670                 fold_overflow_warning (("assuming pointer wraparound does not "
8671                                         "occur when comparing P +- C1 with "
8672                                         "P +- C2"),
8673                                        WARN_STRICT_OVERFLOW_COMPARISON);
8674
8675               return fold_build2 (code, type, offset0, offset1);
8676             }
8677         }
8678       /* For non-equal bases we can simplify if they are addresses
8679          of local binding decls or constants.  */
8680       else if (indirect_base0 && indirect_base1
8681                /* We know that !operand_equal_p (base0, base1, 0)
8682                   because the if condition was false.  But make
8683                   sure two decls are not the same.  */
8684                && base0 != base1
8685                && TREE_CODE (arg0) == ADDR_EXPR
8686                && TREE_CODE (arg1) == ADDR_EXPR
8687                && (((TREE_CODE (base0) == VAR_DECL
8688                      || TREE_CODE (base0) == PARM_DECL)
8689                     && (targetm.binds_local_p (base0)
8690                         || CONSTANT_CLASS_P (base1)))
8691                    || CONSTANT_CLASS_P (base0))
8692                && (((TREE_CODE (base1) == VAR_DECL
8693                      || TREE_CODE (base1) == PARM_DECL)
8694                     && (targetm.binds_local_p (base1)
8695                         || CONSTANT_CLASS_P (base0)))
8696                    || CONSTANT_CLASS_P (base1)))
8697         {
8698           if (code == EQ_EXPR)
8699             return omit_two_operands (type, boolean_false_node, arg0, arg1);
8700           else if (code == NE_EXPR)
8701             return omit_two_operands (type, boolean_true_node, arg0, arg1);
8702         }
8703       /* For equal offsets we can simplify to a comparison of the
8704          base addresses.  */
8705       else if (bitpos0 == bitpos1
8706                && (indirect_base0
8707                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
8708                && (indirect_base1
8709                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
8710                && ((offset0 == offset1)
8711                    || (offset0 && offset1
8712                        && operand_equal_p (offset0, offset1, 0))))
8713         {
8714           if (indirect_base0)
8715             base0 = fold_addr_expr (base0);
8716           if (indirect_base1)
8717             base1 = fold_addr_expr (base1);
8718           return fold_build2 (code, type, base0, base1);
8719         }
8720     }
8721
8722   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8723      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
8724      the resulting offset is smaller in absolute value than the
8725      original one.  */
8726   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8727       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8728       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8729           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8730       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8731       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8732           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8733     {
8734       tree const1 = TREE_OPERAND (arg0, 1);
8735       tree const2 = TREE_OPERAND (arg1, 1);
8736       tree variable1 = TREE_OPERAND (arg0, 0);
8737       tree variable2 = TREE_OPERAND (arg1, 0);
8738       tree cst;
8739       const char * const warnmsg = G_("assuming signed overflow does not "
8740                                       "occur when combining constants around "
8741                                       "a comparison");
8742
8743       /* Put the constant on the side where it doesn't overflow and is
8744          of lower absolute value than before.  */
8745       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8746                              ? MINUS_EXPR : PLUS_EXPR,
8747                              const2, const1, 0);
8748       if (!TREE_OVERFLOW (cst)
8749           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8750         {
8751           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8752           return fold_build2 (code, type,
8753                               variable1,
8754                               fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8755                                            variable2, cst));
8756         }
8757
8758       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8759                              ? MINUS_EXPR : PLUS_EXPR,
8760                              const1, const2, 0);
8761       if (!TREE_OVERFLOW (cst)
8762           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8763         {
8764           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8765           return fold_build2 (code, type,
8766                               fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8767                                            variable1, cst),
8768                               variable2);
8769         }
8770     }
8771
8772   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8773      signed arithmetic case.  That form is created by the compiler
8774      often enough for folding it to be of value.  One example is in
8775      computing loop trip counts after Operator Strength Reduction.  */
8776   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8777       && TREE_CODE (arg0) == MULT_EXPR
8778       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8779           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8780       && integer_zerop (arg1))
8781     {
8782       tree const1 = TREE_OPERAND (arg0, 1);
8783       tree const2 = arg1;                       /* zero */
8784       tree variable1 = TREE_OPERAND (arg0, 0);
8785       enum tree_code cmp_code = code;
8786
8787       gcc_assert (!integer_zerop (const1));
8788
8789       fold_overflow_warning (("assuming signed overflow does not occur when "
8790                               "eliminating multiplication in comparison "
8791                               "with zero"),
8792                              WARN_STRICT_OVERFLOW_COMPARISON);
8793
8794       /* If const1 is negative we swap the sense of the comparison.  */
8795       if (tree_int_cst_sgn (const1) < 0)
8796         cmp_code = swap_tree_comparison (cmp_code);
8797
8798       return fold_build2 (cmp_code, type, variable1, const2);
8799     }
8800
8801   tem = maybe_canonicalize_comparison (code, type, op0, op1);
8802   if (tem)
8803     return tem;
8804
8805   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8806     {
8807       tree targ0 = strip_float_extensions (arg0);
8808       tree targ1 = strip_float_extensions (arg1);
8809       tree newtype = TREE_TYPE (targ0);
8810
8811       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8812         newtype = TREE_TYPE (targ1);
8813
8814       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8815       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8816         return fold_build2 (code, type, fold_convert (newtype, targ0),
8817                             fold_convert (newtype, targ1));
8818
8819       /* (-a) CMP (-b) -> b CMP a  */
8820       if (TREE_CODE (arg0) == NEGATE_EXPR
8821           && TREE_CODE (arg1) == NEGATE_EXPR)
8822         return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8823                             TREE_OPERAND (arg0, 0));
8824
8825       if (TREE_CODE (arg1) == REAL_CST)
8826         {
8827           REAL_VALUE_TYPE cst;
8828           cst = TREE_REAL_CST (arg1);
8829
8830           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8831           if (TREE_CODE (arg0) == NEGATE_EXPR)
8832             return fold_build2 (swap_tree_comparison (code), type,
8833                                 TREE_OPERAND (arg0, 0),
8834                                 build_real (TREE_TYPE (arg1),
8835                                             REAL_VALUE_NEGATE (cst)));
8836
8837           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8838           /* a CMP (-0) -> a CMP 0  */
8839           if (REAL_VALUE_MINUS_ZERO (cst))
8840             return fold_build2 (code, type, arg0,
8841                                 build_real (TREE_TYPE (arg1), dconst0));
8842
8843           /* x != NaN is always true, other ops are always false.  */
8844           if (REAL_VALUE_ISNAN (cst)
8845               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8846             {
8847               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8848               return omit_one_operand (type, tem, arg0);
8849             }
8850
8851           /* Fold comparisons against infinity.  */
8852           if (REAL_VALUE_ISINF (cst))
8853             {
8854               tem = fold_inf_compare (code, type, arg0, arg1);
8855               if (tem != NULL_TREE)
8856                 return tem;
8857             }
8858         }
8859
8860       /* If this is a comparison of a real constant with a PLUS_EXPR
8861          or a MINUS_EXPR of a real constant, we can convert it into a
8862          comparison with a revised real constant as long as no overflow
8863          occurs when unsafe_math_optimizations are enabled.  */
8864       if (flag_unsafe_math_optimizations
8865           && TREE_CODE (arg1) == REAL_CST
8866           && (TREE_CODE (arg0) == PLUS_EXPR
8867               || TREE_CODE (arg0) == MINUS_EXPR)
8868           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8869           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8870                                       ? MINUS_EXPR : PLUS_EXPR,
8871                                       arg1, TREE_OPERAND (arg0, 1), 0))
8872           && !TREE_OVERFLOW (tem))
8873         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8874
8875       /* Likewise, we can simplify a comparison of a real constant with
8876          a MINUS_EXPR whose first operand is also a real constant, i.e.
8877          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
8878          floating-point types only if -fassociative-math is set.  */
8879       if (flag_associative_math
8880           && TREE_CODE (arg1) == REAL_CST
8881           && TREE_CODE (arg0) == MINUS_EXPR
8882           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8883           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8884                                       arg1, 0))
8885           && !TREE_OVERFLOW (tem))
8886         return fold_build2 (swap_tree_comparison (code), type,
8887                             TREE_OPERAND (arg0, 1), tem);
8888
8889       /* Fold comparisons against built-in math functions.  */
8890       if (TREE_CODE (arg1) == REAL_CST
8891           && flag_unsafe_math_optimizations
8892           && ! flag_errno_math)
8893         {
8894           enum built_in_function fcode = builtin_mathfn_code (arg0);
8895
8896           if (fcode != END_BUILTINS)
8897             {
8898               tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8899               if (tem != NULL_TREE)
8900                 return tem;
8901             }
8902         }
8903     }
8904
8905   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8906       && (TREE_CODE (arg0) == NOP_EXPR
8907           || TREE_CODE (arg0) == CONVERT_EXPR))
8908     {
8909       /* If we are widening one operand of an integer comparison,
8910          see if the other operand is similarly being widened.  Perhaps we
8911          can do the comparison in the narrower type.  */
8912       tem = fold_widened_comparison (code, type, arg0, arg1);
8913       if (tem)
8914         return tem;
8915
8916       /* Or if we are changing signedness.  */
8917       tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8918       if (tem)
8919         return tem;
8920     }
8921
8922   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8923      constant, we can simplify it.  */
8924   if (TREE_CODE (arg1) == INTEGER_CST
8925       && (TREE_CODE (arg0) == MIN_EXPR
8926           || TREE_CODE (arg0) == MAX_EXPR)
8927       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8928     {
8929       tem = optimize_minmax_comparison (code, type, op0, op1);
8930       if (tem)
8931         return tem;
8932     }
8933
8934   /* Simplify comparison of something with itself.  (For IEEE
8935      floating-point, we can only do some of these simplifications.)  */
8936   if (operand_equal_p (arg0, arg1, 0))
8937     {
8938       switch (code)
8939         {
8940         case EQ_EXPR:
8941           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8942               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8943             return constant_boolean_node (1, type);
8944           break;
8945
8946         case GE_EXPR:
8947         case LE_EXPR:
8948           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8949               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8950             return constant_boolean_node (1, type);
8951           return fold_build2 (EQ_EXPR, type, arg0, arg1);
8952
8953         case NE_EXPR:
8954           /* For NE, we can only do this simplification if integer
8955              or we don't honor IEEE floating point NaNs.  */
8956           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8957               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8958             break;
8959           /* ... fall through ...  */
8960         case GT_EXPR:
8961         case LT_EXPR:
8962           return constant_boolean_node (0, type);
8963         default:
8964           gcc_unreachable ();
8965         }
8966     }
8967
8968   /* If we are comparing an expression that just has comparisons
8969      of two integer values, arithmetic expressions of those comparisons,
8970      and constants, we can simplify it.  There are only three cases
8971      to check: the two values can either be equal, the first can be
8972      greater, or the second can be greater.  Fold the expression for
8973      those three values.  Since each value must be 0 or 1, we have
8974      eight possibilities, each of which corresponds to the constant 0
8975      or 1 or one of the six possible comparisons.
8976
8977      This handles common cases like (a > b) == 0 but also handles
8978      expressions like  ((x > y) - (y > x)) > 0, which supposedly
8979      occur in macroized code.  */
8980
8981   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8982     {
8983       tree cval1 = 0, cval2 = 0;
8984       int save_p = 0;
8985
8986       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8987           /* Don't handle degenerate cases here; they should already
8988              have been handled anyway.  */
8989           && cval1 != 0 && cval2 != 0
8990           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8991           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8992           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8993           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8994           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8995           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8996                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8997         {
8998           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8999           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9000
9001           /* We can't just pass T to eval_subst in case cval1 or cval2
9002              was the same as ARG1.  */
9003
9004           tree high_result
9005                 = fold_build2 (code, type,
9006                                eval_subst (arg0, cval1, maxval,
9007                                            cval2, minval),
9008                                arg1);
9009           tree equal_result
9010                 = fold_build2 (code, type,
9011                                eval_subst (arg0, cval1, maxval,
9012                                            cval2, maxval),
9013                                arg1);
9014           tree low_result
9015                 = fold_build2 (code, type,
9016                                eval_subst (arg0, cval1, minval,
9017                                            cval2, maxval),
9018                                arg1);
9019
9020           /* All three of these results should be 0 or 1.  Confirm they are.
9021              Then use those values to select the proper code to use.  */
9022
9023           if (TREE_CODE (high_result) == INTEGER_CST
9024               && TREE_CODE (equal_result) == INTEGER_CST
9025               && TREE_CODE (low_result) == INTEGER_CST)
9026             {
9027               /* Make a 3-bit mask with the high-order bit being the
9028                  value for `>', the next for '=', and the low for '<'.  */
9029               switch ((integer_onep (high_result) * 4)
9030                       + (integer_onep (equal_result) * 2)
9031                       + integer_onep (low_result))
9032                 {
9033                 case 0:
9034                   /* Always false.  */
9035                   return omit_one_operand (type, integer_zero_node, arg0);
9036                 case 1:
9037                   code = LT_EXPR;
9038                   break;
9039                 case 2:
9040                   code = EQ_EXPR;
9041                   break;
9042                 case 3:
9043                   code = LE_EXPR;
9044                   break;
9045                 case 4:
9046                   code = GT_EXPR;
9047                   break;
9048                 case 5:
9049                   code = NE_EXPR;
9050                   break;
9051                 case 6:
9052                   code = GE_EXPR;
9053                   break;
9054                 case 7:
9055                   /* Always true.  */
9056                   return omit_one_operand (type, integer_one_node, arg0);
9057                 }
9058
9059               if (save_p)
9060                 return save_expr (build2 (code, type, cval1, cval2));
9061               return fold_build2 (code, type, cval1, cval2);
9062             }
9063         }
9064     }
9065
9066   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9067      into a single range test.  */
9068   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9069        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9070       && TREE_CODE (arg1) == INTEGER_CST
9071       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9072       && !integer_zerop (TREE_OPERAND (arg0, 1))
9073       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9074       && !TREE_OVERFLOW (arg1))
9075     {
9076       tem = fold_div_compare (code, type, arg0, arg1);
9077       if (tem != NULL_TREE)
9078         return tem;
9079     }
9080
9081   /* Fold ~X op ~Y as Y op X.  */
9082   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9083       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9084     {
9085       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9086       return fold_build2 (code, type,
9087                           fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
9088                           TREE_OPERAND (arg0, 0));
9089     }
9090
9091   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9092   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9093       && TREE_CODE (arg1) == INTEGER_CST)
9094     {
9095       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9096       return fold_build2 (swap_tree_comparison (code), type,
9097                           TREE_OPERAND (arg0, 0),
9098                           fold_build1 (BIT_NOT_EXPR, cmp_type,
9099                                        fold_convert (cmp_type, arg1)));
9100     }
9101
9102   return NULL_TREE;
9103 }
9104
9105
9106 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9107    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9108    argument EXPR represents the expression "z" of type TYPE.  */
9109
9110 static tree
9111 fold_mult_zconjz (tree type, tree expr)
9112 {
9113   tree itype = TREE_TYPE (type);
9114   tree rpart, ipart, tem;
9115
9116   if (TREE_CODE (expr) == COMPLEX_EXPR)
9117     {
9118       rpart = TREE_OPERAND (expr, 0);
9119       ipart = TREE_OPERAND (expr, 1);
9120     }
9121   else if (TREE_CODE (expr) == COMPLEX_CST)
9122     {
9123       rpart = TREE_REALPART (expr);
9124       ipart = TREE_IMAGPART (expr);
9125     }
9126   else
9127     {
9128       expr = save_expr (expr);
9129       rpart = fold_build1 (REALPART_EXPR, itype, expr);
9130       ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
9131     }
9132
9133   rpart = save_expr (rpart);
9134   ipart = save_expr (ipart);
9135   tem = fold_build2 (PLUS_EXPR, itype,
9136                      fold_build2 (MULT_EXPR, itype, rpart, rpart),
9137                      fold_build2 (MULT_EXPR, itype, ipart, ipart));
9138   return fold_build2 (COMPLEX_EXPR, type, tem,
9139                       fold_convert (itype, integer_zero_node));
9140 }
9141
9142
9143 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9144    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9145    guarantees that P and N have the same least significant log2(M) bits.
9146    N is not otherwise constrained.  In particular, N is not normalized to
9147    0 <= N < M as is common.  In general, the precise value of P is unknown.
9148    M is chosen as large as possible such that constant N can be determined.
9149
9150    Returns M and sets *RESIDUE to N.  */
9151
9152 static unsigned HOST_WIDE_INT
9153 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue)
9154 {
9155   enum tree_code code;
9156
9157   *residue = 0;
9158
9159   code = TREE_CODE (expr);
9160   if (code == ADDR_EXPR)
9161     {
9162       expr = TREE_OPERAND (expr, 0);
9163       if (handled_component_p (expr))
9164         {
9165           HOST_WIDE_INT bitsize, bitpos;
9166           tree offset;
9167           enum machine_mode mode;
9168           int unsignedp, volatilep;
9169
9170           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9171                                       &mode, &unsignedp, &volatilep, false);
9172           *residue = bitpos / BITS_PER_UNIT;
9173           if (offset)
9174             {
9175               if (TREE_CODE (offset) == INTEGER_CST)
9176                 *residue += TREE_INT_CST_LOW (offset);
9177               else
9178                 /* We don't handle more complicated offset expressions.  */
9179                 return 1;
9180             }
9181         }
9182
9183       if (DECL_P (expr) && TREE_CODE (expr) != FUNCTION_DECL)
9184         return DECL_ALIGN_UNIT (expr);
9185     }
9186   else if (code == POINTER_PLUS_EXPR)
9187     {
9188       tree op0, op1;
9189       unsigned HOST_WIDE_INT modulus;
9190       enum tree_code inner_code;
9191       
9192       op0 = TREE_OPERAND (expr, 0);
9193       STRIP_NOPS (op0);
9194       modulus = get_pointer_modulus_and_residue (op0, residue);
9195
9196       op1 = TREE_OPERAND (expr, 1);
9197       STRIP_NOPS (op1);
9198       inner_code = TREE_CODE (op1);
9199       if (inner_code == INTEGER_CST)
9200         {
9201           *residue += TREE_INT_CST_LOW (op1);
9202           return modulus;
9203         }
9204       else if (inner_code == MULT_EXPR)
9205         {
9206           op1 = TREE_OPERAND (op1, 1);
9207           if (TREE_CODE (op1) == INTEGER_CST)
9208             {
9209               unsigned HOST_WIDE_INT align;
9210               
9211               /* Compute the greatest power-of-2 divisor of op1.  */
9212               align = TREE_INT_CST_LOW (op1);
9213               align &= -align;
9214
9215               /* If align is non-zero and less than *modulus, replace
9216                  *modulus with align., If align is 0, then either op1 is 0
9217                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9218                  unsigned HOST_WIDE_INT.  In either case, no additional
9219                  constraint is imposed.  */
9220               if (align)
9221                 modulus = MIN (modulus, align);
9222
9223               return modulus;
9224             }
9225         }
9226     }
9227
9228     /* If we get here, we were unable to determine anything useful about the
9229        expression.  */
9230     return 1;
9231 }
9232
9233
9234 /* Fold a binary expression of code CODE and type TYPE with operands
9235    OP0 and OP1.  Return the folded expression if folding is
9236    successful.  Otherwise, return NULL_TREE.  */
9237
9238 tree
9239 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9240 {
9241   enum tree_code_class kind = TREE_CODE_CLASS (code);
9242   tree arg0, arg1, tem;
9243   tree t1 = NULL_TREE;
9244   bool strict_overflow_p;
9245
9246   gcc_assert ((IS_EXPR_CODE_CLASS (kind)
9247                || IS_GIMPLE_STMT_CODE_CLASS (kind))
9248               && TREE_CODE_LENGTH (code) == 2
9249               && op0 != NULL_TREE
9250               && op1 != NULL_TREE);
9251
9252   arg0 = op0;
9253   arg1 = op1;
9254
9255   /* Strip any conversions that don't change the mode.  This is
9256      safe for every expression, except for a comparison expression
9257      because its signedness is derived from its operands.  So, in
9258      the latter case, only strip conversions that don't change the
9259      signedness.
9260
9261      Note that this is done as an internal manipulation within the
9262      constant folder, in order to find the simplest representation
9263      of the arguments so that their form can be studied.  In any
9264      cases, the appropriate type conversions should be put back in
9265      the tree that will get out of the constant folder.  */
9266
9267   if (kind == tcc_comparison)
9268     {
9269       STRIP_SIGN_NOPS (arg0);
9270       STRIP_SIGN_NOPS (arg1);
9271     }
9272   else
9273     {
9274       STRIP_NOPS (arg0);
9275       STRIP_NOPS (arg1);
9276     }
9277
9278   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9279      constant but we can't do arithmetic on them.  */
9280   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9281       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9282       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9283       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9284       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9285       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9286     {
9287       if (kind == tcc_binary)
9288         {
9289           /* Make sure type and arg0 have the same saturating flag.  */
9290           gcc_assert (TYPE_SATURATING (type)
9291                       == TYPE_SATURATING (TREE_TYPE (arg0)));
9292           tem = const_binop (code, arg0, arg1, 0);
9293         }
9294       else if (kind == tcc_comparison)
9295         tem = fold_relational_const (code, type, arg0, arg1);
9296       else
9297         tem = NULL_TREE;
9298
9299       if (tem != NULL_TREE)
9300         {
9301           if (TREE_TYPE (tem) != type)
9302             tem = fold_convert (type, tem);
9303           return tem;
9304         }
9305     }
9306
9307   /* If this is a commutative operation, and ARG0 is a constant, move it
9308      to ARG1 to reduce the number of tests below.  */
9309   if (commutative_tree_code (code)
9310       && tree_swap_operands_p (arg0, arg1, true))
9311     return fold_build2 (code, type, op1, op0);
9312
9313   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9314
9315      First check for cases where an arithmetic operation is applied to a
9316      compound, conditional, or comparison operation.  Push the arithmetic
9317      operation inside the compound or conditional to see if any folding
9318      can then be done.  Convert comparison to conditional for this purpose.
9319      The also optimizes non-constant cases that used to be done in
9320      expand_expr.
9321
9322      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9323      one of the operands is a comparison and the other is a comparison, a
9324      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9325      code below would make the expression more complex.  Change it to a
9326      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9327      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9328
9329   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9330        || code == EQ_EXPR || code == NE_EXPR)
9331       && ((truth_value_p (TREE_CODE (arg0))
9332            && (truth_value_p (TREE_CODE (arg1))
9333                || (TREE_CODE (arg1) == BIT_AND_EXPR
9334                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9335           || (truth_value_p (TREE_CODE (arg1))
9336               && (truth_value_p (TREE_CODE (arg0))
9337                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9338                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9339     {
9340       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9341                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9342                          : TRUTH_XOR_EXPR,
9343                          boolean_type_node,
9344                          fold_convert (boolean_type_node, arg0),
9345                          fold_convert (boolean_type_node, arg1));
9346
9347       if (code == EQ_EXPR)
9348         tem = invert_truthvalue (tem);
9349
9350       return fold_convert (type, tem);
9351     }
9352
9353   if (TREE_CODE_CLASS (code) == tcc_binary
9354       || TREE_CODE_CLASS (code) == tcc_comparison)
9355     {
9356       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9357         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9358                        fold_build2 (code, type,
9359                                     fold_convert (TREE_TYPE (op0),
9360                                                   TREE_OPERAND (arg0, 1)),
9361                                     op1));
9362       if (TREE_CODE (arg1) == COMPOUND_EXPR
9363           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9364         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9365                        fold_build2 (code, type, op0,
9366                                     fold_convert (TREE_TYPE (op1),
9367                                                   TREE_OPERAND (arg1, 1))));
9368
9369       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9370         {
9371           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9372                                                      arg0, arg1, 
9373                                                      /*cond_first_p=*/1);
9374           if (tem != NULL_TREE)
9375             return tem;
9376         }
9377
9378       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9379         {
9380           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9381                                                      arg1, arg0, 
9382                                                      /*cond_first_p=*/0);
9383           if (tem != NULL_TREE)
9384             return tem;
9385         }
9386     }
9387
9388   switch (code)
9389     {
9390     case POINTER_PLUS_EXPR:
9391       /* 0 +p index -> (type)index */
9392       if (integer_zerop (arg0))
9393         return non_lvalue (fold_convert (type, arg1));
9394
9395       /* PTR +p 0 -> PTR */
9396       if (integer_zerop (arg1))
9397         return non_lvalue (fold_convert (type, arg0));
9398
9399       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
9400       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9401            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9402         return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9403                                                 fold_convert (sizetype, arg1),
9404                                                 fold_convert (sizetype, arg0)));
9405
9406       /* index +p PTR -> PTR +p index */
9407       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9408           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9409         return fold_build2 (POINTER_PLUS_EXPR, type,
9410                             fold_convert (type, arg1),
9411                             fold_convert (sizetype, arg0));
9412
9413       /* (PTR +p B) +p A -> PTR +p (B + A) */
9414       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9415         {
9416           tree inner;
9417           tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9418           tree arg00 = TREE_OPERAND (arg0, 0);
9419           inner = fold_build2 (PLUS_EXPR, sizetype,
9420                                arg01, fold_convert (sizetype, arg1));
9421           return fold_convert (type,
9422                                fold_build2 (POINTER_PLUS_EXPR,
9423                                             TREE_TYPE (arg00), arg00, inner));
9424         }
9425
9426       /* PTR_CST +p CST -> CST1 */
9427       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9428         return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9429
9430      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9431         of the array.  Loop optimizer sometimes produce this type of
9432         expressions.  */
9433       if (TREE_CODE (arg0) == ADDR_EXPR)
9434         {
9435           tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9436           if (tem)
9437             return fold_convert (type, tem);
9438         }
9439
9440       return NULL_TREE;
9441
9442     case PLUS_EXPR:
9443       /* PTR + INT -> (INT)(PTR p+ INT) */
9444       if (POINTER_TYPE_P (TREE_TYPE (arg0))
9445           && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9446         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9447                                                 TREE_TYPE (arg0),
9448                                                 arg0,
9449                                                 fold_convert (sizetype, arg1)));
9450       /* INT + PTR -> (INT)(PTR p+ INT) */
9451       if (POINTER_TYPE_P (TREE_TYPE (arg1))
9452           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9453         return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9454                                                 TREE_TYPE (arg1),
9455                                                 arg1,
9456                                                 fold_convert (sizetype, arg0)));
9457       /* A + (-B) -> A - B */
9458       if (TREE_CODE (arg1) == NEGATE_EXPR)
9459         return fold_build2 (MINUS_EXPR, type,
9460                             fold_convert (type, arg0),
9461                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9462       /* (-A) + B -> B - A */
9463       if (TREE_CODE (arg0) == NEGATE_EXPR
9464           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9465         return fold_build2 (MINUS_EXPR, type,
9466                             fold_convert (type, arg1),
9467                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9468
9469       if (INTEGRAL_TYPE_P (type))
9470         {
9471           /* Convert ~A + 1 to -A.  */
9472           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9473               && integer_onep (arg1))
9474             return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9475
9476           /* ~X + X is -1.  */
9477           if (TREE_CODE (arg0) == BIT_NOT_EXPR
9478               && !TYPE_OVERFLOW_TRAPS (type))
9479             {
9480               tree tem = TREE_OPERAND (arg0, 0);
9481
9482               STRIP_NOPS (tem);
9483               if (operand_equal_p (tem, arg1, 0))
9484                 {
9485                   t1 = build_int_cst_type (type, -1);
9486                   return omit_one_operand (type, t1, arg1);
9487                 }
9488             }
9489
9490           /* X + ~X is -1.  */
9491           if (TREE_CODE (arg1) == BIT_NOT_EXPR
9492               && !TYPE_OVERFLOW_TRAPS (type))
9493             {
9494               tree tem = TREE_OPERAND (arg1, 0);
9495
9496               STRIP_NOPS (tem);
9497               if (operand_equal_p (arg0, tem, 0))
9498                 {
9499                   t1 = build_int_cst_type (type, -1);
9500                   return omit_one_operand (type, t1, arg0);
9501                 }
9502             }
9503
9504           /* X + (X / CST) * -CST is X % CST.  */
9505           if (TREE_CODE (arg1) == MULT_EXPR
9506               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9507               && operand_equal_p (arg0,
9508                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9509             {
9510               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9511               tree cst1 = TREE_OPERAND (arg1, 1);
9512               tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9513               if (sum && integer_zerop (sum))
9514                 return fold_convert (type,
9515                                      fold_build2 (TRUNC_MOD_EXPR,
9516                                                   TREE_TYPE (arg0), arg0, cst0));
9517             }
9518         }
9519
9520       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9521          same or one.  Make sure type is not saturating.
9522          fold_plusminus_mult_expr will re-associate.  */
9523       if ((TREE_CODE (arg0) == MULT_EXPR
9524            || TREE_CODE (arg1) == MULT_EXPR)
9525           && !TYPE_SATURATING (type)
9526           && (!FLOAT_TYPE_P (type) || flag_associative_math))
9527         {
9528           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9529           if (tem)
9530             return tem;
9531         }
9532
9533       if (! FLOAT_TYPE_P (type))
9534         {
9535           if (integer_zerop (arg1))
9536             return non_lvalue (fold_convert (type, arg0));
9537
9538           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9539              with a constant, and the two constants have no bits in common,
9540              we should treat this as a BIT_IOR_EXPR since this may produce more
9541              simplifications.  */
9542           if (TREE_CODE (arg0) == BIT_AND_EXPR
9543               && TREE_CODE (arg1) == BIT_AND_EXPR
9544               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9545               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9546               && integer_zerop (const_binop (BIT_AND_EXPR,
9547                                              TREE_OPERAND (arg0, 1),
9548                                              TREE_OPERAND (arg1, 1), 0)))
9549             {
9550               code = BIT_IOR_EXPR;
9551               goto bit_ior;
9552             }
9553
9554           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9555              (plus (plus (mult) (mult)) (foo)) so that we can
9556              take advantage of the factoring cases below.  */
9557           if (((TREE_CODE (arg0) == PLUS_EXPR
9558                 || TREE_CODE (arg0) == MINUS_EXPR)
9559                && TREE_CODE (arg1) == MULT_EXPR)
9560               || ((TREE_CODE (arg1) == PLUS_EXPR
9561                    || TREE_CODE (arg1) == MINUS_EXPR)
9562                   && TREE_CODE (arg0) == MULT_EXPR))
9563             {
9564               tree parg0, parg1, parg, marg;
9565               enum tree_code pcode;
9566
9567               if (TREE_CODE (arg1) == MULT_EXPR)
9568                 parg = arg0, marg = arg1;
9569               else
9570                 parg = arg1, marg = arg0;
9571               pcode = TREE_CODE (parg);
9572               parg0 = TREE_OPERAND (parg, 0);
9573               parg1 = TREE_OPERAND (parg, 1);
9574               STRIP_NOPS (parg0);
9575               STRIP_NOPS (parg1);
9576
9577               if (TREE_CODE (parg0) == MULT_EXPR
9578                   && TREE_CODE (parg1) != MULT_EXPR)
9579                 return fold_build2 (pcode, type,
9580                                     fold_build2 (PLUS_EXPR, type,
9581                                                  fold_convert (type, parg0),
9582                                                  fold_convert (type, marg)),
9583                                     fold_convert (type, parg1));
9584               if (TREE_CODE (parg0) != MULT_EXPR
9585                   && TREE_CODE (parg1) == MULT_EXPR)
9586                 return fold_build2 (PLUS_EXPR, type,
9587                                     fold_convert (type, parg0),
9588                                     fold_build2 (pcode, type,
9589                                                  fold_convert (type, marg),
9590                                                  fold_convert (type,
9591                                                                parg1)));
9592             }
9593         }
9594       else
9595         {
9596           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
9597           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9598             return non_lvalue (fold_convert (type, arg0));
9599
9600           /* Likewise if the operands are reversed.  */
9601           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9602             return non_lvalue (fold_convert (type, arg1));
9603
9604           /* Convert X + -C into X - C.  */
9605           if (TREE_CODE (arg1) == REAL_CST
9606               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9607             {
9608               tem = fold_negate_const (arg1, type);
9609               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9610                 return fold_build2 (MINUS_EXPR, type,
9611                                     fold_convert (type, arg0),
9612                                     fold_convert (type, tem));
9613             }
9614
9615           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9616              to __complex__ ( x, y ).  This is not the same for SNaNs or
9617              if signed zeros are involved.  */
9618           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9619               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9620               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9621             {
9622               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9623               tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9624               tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9625               bool arg0rz = false, arg0iz = false;
9626               if ((arg0r && (arg0rz = real_zerop (arg0r)))
9627                   || (arg0i && (arg0iz = real_zerop (arg0i))))
9628                 {
9629                   tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9630                   tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9631                   if (arg0rz && arg1i && real_zerop (arg1i))
9632                     {
9633                       tree rp = arg1r ? arg1r
9634                                   : build1 (REALPART_EXPR, rtype, arg1);
9635                       tree ip = arg0i ? arg0i
9636                                   : build1 (IMAGPART_EXPR, rtype, arg0);
9637                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9638                     }
9639                   else if (arg0iz && arg1r && real_zerop (arg1r))
9640                     {
9641                       tree rp = arg0r ? arg0r
9642                                   : build1 (REALPART_EXPR, rtype, arg0);
9643                       tree ip = arg1i ? arg1i
9644                                   : build1 (IMAGPART_EXPR, rtype, arg1);
9645                       return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9646                     }
9647                 }
9648             }
9649
9650           if (flag_unsafe_math_optimizations
9651               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9652               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9653               && (tem = distribute_real_division (code, type, arg0, arg1)))
9654             return tem;
9655
9656           /* Convert x+x into x*2.0.  */
9657           if (operand_equal_p (arg0, arg1, 0)
9658               && SCALAR_FLOAT_TYPE_P (type))
9659             return fold_build2 (MULT_EXPR, type, arg0,
9660                                 build_real (type, dconst2));
9661
9662           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
9663              We associate floats only if the user has specified
9664              -fassociative-math.  */
9665           if (flag_associative_math
9666               && TREE_CODE (arg1) == PLUS_EXPR
9667               && TREE_CODE (arg0) != MULT_EXPR)
9668             {
9669               tree tree10 = TREE_OPERAND (arg1, 0);
9670               tree tree11 = TREE_OPERAND (arg1, 1);
9671               if (TREE_CODE (tree11) == MULT_EXPR
9672                   && TREE_CODE (tree10) == MULT_EXPR)
9673                 {
9674                   tree tree0;
9675                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9676                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9677                 }
9678             }
9679           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
9680              We associate floats only if the user has specified
9681              -fassociative-math.  */
9682           if (flag_associative_math
9683               && TREE_CODE (arg0) == PLUS_EXPR
9684               && TREE_CODE (arg1) != MULT_EXPR)
9685             {
9686               tree tree00 = TREE_OPERAND (arg0, 0);
9687               tree tree01 = TREE_OPERAND (arg0, 1);
9688               if (TREE_CODE (tree01) == MULT_EXPR
9689                   && TREE_CODE (tree00) == MULT_EXPR)
9690                 {
9691                   tree tree0;
9692                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9693                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9694                 }
9695             }
9696         }
9697
9698      bit_rotate:
9699       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9700          is a rotate of A by C1 bits.  */
9701       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9702          is a rotate of A by B bits.  */
9703       {
9704         enum tree_code code0, code1;
9705         tree rtype;
9706         code0 = TREE_CODE (arg0);
9707         code1 = TREE_CODE (arg1);
9708         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9709              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9710             && operand_equal_p (TREE_OPERAND (arg0, 0),
9711                                 TREE_OPERAND (arg1, 0), 0)
9712             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
9713                 TYPE_UNSIGNED (rtype))
9714             /* Only create rotates in complete modes.  Other cases are not
9715                expanded properly.  */
9716             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
9717           {
9718             tree tree01, tree11;
9719             enum tree_code code01, code11;
9720
9721             tree01 = TREE_OPERAND (arg0, 1);
9722             tree11 = TREE_OPERAND (arg1, 1);
9723             STRIP_NOPS (tree01);
9724             STRIP_NOPS (tree11);
9725             code01 = TREE_CODE (tree01);
9726             code11 = TREE_CODE (tree11);
9727             if (code01 == INTEGER_CST
9728                 && code11 == INTEGER_CST
9729                 && TREE_INT_CST_HIGH (tree01) == 0
9730                 && TREE_INT_CST_HIGH (tree11) == 0
9731                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9732                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9733               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9734                              code0 == LSHIFT_EXPR ? tree01 : tree11);
9735             else if (code11 == MINUS_EXPR)
9736               {
9737                 tree tree110, tree111;
9738                 tree110 = TREE_OPERAND (tree11, 0);
9739                 tree111 = TREE_OPERAND (tree11, 1);
9740                 STRIP_NOPS (tree110);
9741                 STRIP_NOPS (tree111);
9742                 if (TREE_CODE (tree110) == INTEGER_CST
9743                     && 0 == compare_tree_int (tree110,
9744                                               TYPE_PRECISION
9745                                               (TREE_TYPE (TREE_OPERAND
9746                                                           (arg0, 0))))
9747                     && operand_equal_p (tree01, tree111, 0))
9748                   return build2 ((code0 == LSHIFT_EXPR
9749                                   ? LROTATE_EXPR
9750                                   : RROTATE_EXPR),
9751                                  type, TREE_OPERAND (arg0, 0), tree01);
9752               }
9753             else if (code01 == MINUS_EXPR)
9754               {
9755                 tree tree010, tree011;
9756                 tree010 = TREE_OPERAND (tree01, 0);
9757                 tree011 = TREE_OPERAND (tree01, 1);
9758                 STRIP_NOPS (tree010);
9759                 STRIP_NOPS (tree011);
9760                 if (TREE_CODE (tree010) == INTEGER_CST
9761                     && 0 == compare_tree_int (tree010,
9762                                               TYPE_PRECISION
9763                                               (TREE_TYPE (TREE_OPERAND
9764                                                           (arg0, 0))))
9765                     && operand_equal_p (tree11, tree011, 0))
9766                   return build2 ((code0 != LSHIFT_EXPR
9767                                   ? LROTATE_EXPR
9768                                   : RROTATE_EXPR),
9769                                  type, TREE_OPERAND (arg0, 0), tree11);
9770               }
9771           }
9772       }
9773
9774     associate:
9775       /* In most languages, can't associate operations on floats through
9776          parentheses.  Rather than remember where the parentheses were, we
9777          don't associate floats at all, unless the user has specified
9778          -fassociative-math.
9779          And, we need to make sure type is not saturating.  */
9780
9781       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
9782           && !TYPE_SATURATING (type))
9783         {
9784           tree var0, con0, lit0, minus_lit0;
9785           tree var1, con1, lit1, minus_lit1;
9786           bool ok = true;
9787
9788           /* Split both trees into variables, constants, and literals.  Then
9789              associate each group together, the constants with literals,
9790              then the result with variables.  This increases the chances of
9791              literals being recombined later and of generating relocatable
9792              expressions for the sum of a constant and literal.  */
9793           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9794           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9795                              code == MINUS_EXPR);
9796
9797           /* With undefined overflow we can only associate constants
9798              with one variable.  */
9799           if (((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
9800                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9801               && var0 && var1)
9802             {
9803               tree tmp0 = var0;
9804               tree tmp1 = var1;
9805
9806               if (TREE_CODE (tmp0) == NEGATE_EXPR)
9807                 tmp0 = TREE_OPERAND (tmp0, 0);
9808               if (TREE_CODE (tmp1) == NEGATE_EXPR)
9809                 tmp1 = TREE_OPERAND (tmp1, 0);
9810               /* The only case we can still associate with two variables
9811                  is if they are the same, modulo negation.  */
9812               if (!operand_equal_p (tmp0, tmp1, 0))
9813                 ok = false;
9814             }
9815
9816           /* Only do something if we found more than two objects.  Otherwise,
9817              nothing has changed and we risk infinite recursion.  */
9818           if (ok
9819               && (2 < ((var0 != 0) + (var1 != 0)
9820                        + (con0 != 0) + (con1 != 0)
9821                        + (lit0 != 0) + (lit1 != 0)
9822                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
9823             {
9824               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
9825               if (code == MINUS_EXPR)
9826                 code = PLUS_EXPR;
9827
9828               var0 = associate_trees (var0, var1, code, type);
9829               con0 = associate_trees (con0, con1, code, type);
9830               lit0 = associate_trees (lit0, lit1, code, type);
9831               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9832
9833               /* Preserve the MINUS_EXPR if the negative part of the literal is
9834                  greater than the positive part.  Otherwise, the multiplicative
9835                  folding code (i.e extract_muldiv) may be fooled in case
9836                  unsigned constants are subtracted, like in the following
9837                  example: ((X*2 + 4) - 8U)/2.  */
9838               if (minus_lit0 && lit0)
9839                 {
9840                   if (TREE_CODE (lit0) == INTEGER_CST
9841                       && TREE_CODE (minus_lit0) == INTEGER_CST
9842                       && tree_int_cst_lt (lit0, minus_lit0))
9843                     {
9844                       minus_lit0 = associate_trees (minus_lit0, lit0,
9845                                                     MINUS_EXPR, type);
9846                       lit0 = 0;
9847                     }
9848                   else
9849                     {
9850                       lit0 = associate_trees (lit0, minus_lit0,
9851                                               MINUS_EXPR, type);
9852                       minus_lit0 = 0;
9853                     }
9854                 }
9855               if (minus_lit0)
9856                 {
9857                   if (con0 == 0)
9858                     return fold_convert (type,
9859                                          associate_trees (var0, minus_lit0,
9860                                                           MINUS_EXPR, type));
9861                   else
9862                     {
9863                       con0 = associate_trees (con0, minus_lit0,
9864                                               MINUS_EXPR, type);
9865                       return fold_convert (type,
9866                                            associate_trees (var0, con0,
9867                                                             PLUS_EXPR, type));
9868                     }
9869                 }
9870
9871               con0 = associate_trees (con0, lit0, code, type);
9872               return fold_convert (type, associate_trees (var0, con0,
9873                                                           code, type));
9874             }
9875         }
9876
9877       return NULL_TREE;
9878
9879     case MINUS_EXPR:
9880       /* Pointer simplifications for subtraction, simple reassociations. */
9881       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
9882         {
9883           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
9884           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
9885               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9886             {
9887               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9888               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9889               tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9890               tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9891               return fold_build2 (PLUS_EXPR, type,
9892                                   fold_build2 (MINUS_EXPR, type, arg00, arg10),
9893                                   fold_build2 (MINUS_EXPR, type, arg01, arg11));
9894             }
9895           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
9896           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9897             {
9898               tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9899               tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9900               tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
9901               if (tmp)
9902                 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
9903             }
9904         }
9905       /* A - (-B) -> A + B */
9906       if (TREE_CODE (arg1) == NEGATE_EXPR)
9907         return fold_build2 (PLUS_EXPR, type, op0,
9908                             fold_convert (type, TREE_OPERAND (arg1, 0)));
9909       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
9910       if (TREE_CODE (arg0) == NEGATE_EXPR
9911           && (FLOAT_TYPE_P (type)
9912               || INTEGRAL_TYPE_P (type))
9913           && negate_expr_p (arg1)
9914           && reorder_operands_p (arg0, arg1))
9915         return fold_build2 (MINUS_EXPR, type,
9916                             fold_convert (type, negate_expr (arg1)),
9917                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9918       /* Convert -A - 1 to ~A.  */
9919       if (INTEGRAL_TYPE_P (type)
9920           && TREE_CODE (arg0) == NEGATE_EXPR
9921           && integer_onep (arg1)
9922           && !TYPE_OVERFLOW_TRAPS (type))
9923         return fold_build1 (BIT_NOT_EXPR, type,
9924                             fold_convert (type, TREE_OPERAND (arg0, 0)));
9925
9926       /* Convert -1 - A to ~A.  */
9927       if (INTEGRAL_TYPE_P (type)
9928           && integer_all_onesp (arg0))
9929         return fold_build1 (BIT_NOT_EXPR, type, op1);
9930
9931
9932       /* X - (X / CST) * CST is X % CST.  */
9933       if (INTEGRAL_TYPE_P (type)
9934           && TREE_CODE (arg1) == MULT_EXPR
9935           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9936           && operand_equal_p (arg0,
9937                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
9938           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
9939                               TREE_OPERAND (arg1, 1), 0))
9940         return fold_convert (type,
9941                              fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
9942                                           arg0, TREE_OPERAND (arg1, 1)));
9943
9944       if (! FLOAT_TYPE_P (type))
9945         {
9946           if (integer_zerop (arg0))
9947             return negate_expr (fold_convert (type, arg1));
9948           if (integer_zerop (arg1))
9949             return non_lvalue (fold_convert (type, arg0));
9950
9951           /* Fold A - (A & B) into ~B & A.  */
9952           if (!TREE_SIDE_EFFECTS (arg0)
9953               && TREE_CODE (arg1) == BIT_AND_EXPR)
9954             {
9955               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9956                 {
9957                   tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9958                   return fold_build2 (BIT_AND_EXPR, type,
9959                                       fold_build1 (BIT_NOT_EXPR, type, arg10),
9960                                       fold_convert (type, arg0));
9961                 }
9962               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9963                 {
9964                   tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9965                   return fold_build2 (BIT_AND_EXPR, type,
9966                                       fold_build1 (BIT_NOT_EXPR, type, arg11),
9967                                       fold_convert (type, arg0));
9968                 }
9969             }
9970
9971           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9972              any power of 2 minus 1.  */
9973           if (TREE_CODE (arg0) == BIT_AND_EXPR
9974               && TREE_CODE (arg1) == BIT_AND_EXPR
9975               && operand_equal_p (TREE_OPERAND (arg0, 0),
9976                                   TREE_OPERAND (arg1, 0), 0))
9977             {
9978               tree mask0 = TREE_OPERAND (arg0, 1);
9979               tree mask1 = TREE_OPERAND (arg1, 1);
9980               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9981
9982               if (operand_equal_p (tem, mask1, 0))
9983                 {
9984                   tem = fold_build2 (BIT_XOR_EXPR, type,
9985                                      TREE_OPERAND (arg0, 0), mask1);
9986                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
9987                 }
9988             }
9989         }
9990
9991       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
9992       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9993         return non_lvalue (fold_convert (type, arg0));
9994
9995       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
9996          ARG0 is zero and X + ARG0 reduces to X, since that would mean
9997          (-ARG1 + ARG0) reduces to -ARG1.  */
9998       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9999         return negate_expr (fold_convert (type, arg1));
10000
10001       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10002          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10003          signed zeros are involved.  */
10004       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10005           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10006           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10007         {
10008           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10009           tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
10010           tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
10011           bool arg0rz = false, arg0iz = false;
10012           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10013               || (arg0i && (arg0iz = real_zerop (arg0i))))
10014             {
10015               tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
10016               tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
10017               if (arg0rz && arg1i && real_zerop (arg1i))
10018                 {
10019                   tree rp = fold_build1 (NEGATE_EXPR, rtype,
10020                                          arg1r ? arg1r
10021                                          : build1 (REALPART_EXPR, rtype, arg1));
10022                   tree ip = arg0i ? arg0i
10023                     : build1 (IMAGPART_EXPR, rtype, arg0);
10024                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10025                 }
10026               else if (arg0iz && arg1r && real_zerop (arg1r))
10027                 {
10028                   tree rp = arg0r ? arg0r
10029                     : build1 (REALPART_EXPR, rtype, arg0);
10030                   tree ip = fold_build1 (NEGATE_EXPR, rtype,
10031                                          arg1i ? arg1i
10032                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10033                   return fold_build2 (COMPLEX_EXPR, type, rp, ip);
10034                 }
10035             }
10036         }
10037
10038       /* Fold &x - &x.  This can happen from &x.foo - &x.
10039          This is unsafe for certain floats even in non-IEEE formats.
10040          In IEEE, it is unsafe because it does wrong for NaNs.
10041          Also note that operand_equal_p is always false if an operand
10042          is volatile.  */
10043
10044       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10045           && operand_equal_p (arg0, arg1, 0))
10046         return fold_convert (type, integer_zero_node);
10047
10048       /* A - B -> A + (-B) if B is easily negatable.  */
10049       if (negate_expr_p (arg1)
10050           && ((FLOAT_TYPE_P (type)
10051                /* Avoid this transformation if B is a positive REAL_CST.  */
10052                && (TREE_CODE (arg1) != REAL_CST
10053                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10054               || INTEGRAL_TYPE_P (type)))
10055         return fold_build2 (PLUS_EXPR, type,
10056                             fold_convert (type, arg0),
10057                             fold_convert (type, negate_expr (arg1)));
10058
10059       /* Try folding difference of addresses.  */
10060       {
10061         HOST_WIDE_INT diff;
10062
10063         if ((TREE_CODE (arg0) == ADDR_EXPR
10064              || TREE_CODE (arg1) == ADDR_EXPR)
10065             && ptr_difference_const (arg0, arg1, &diff))
10066           return build_int_cst_type (type, diff);
10067       }
10068
10069       /* Fold &a[i] - &a[j] to i-j.  */
10070       if (TREE_CODE (arg0) == ADDR_EXPR
10071           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10072           && TREE_CODE (arg1) == ADDR_EXPR
10073           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10074         {
10075           tree aref0 = TREE_OPERAND (arg0, 0);
10076           tree aref1 = TREE_OPERAND (arg1, 0);
10077           if (operand_equal_p (TREE_OPERAND (aref0, 0),
10078                                TREE_OPERAND (aref1, 0), 0))
10079             {
10080               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
10081               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
10082               tree esz = array_ref_element_size (aref0);
10083               tree diff = build2 (MINUS_EXPR, type, op0, op1);
10084               return fold_build2 (MULT_EXPR, type, diff,
10085                                   fold_convert (type, esz));
10086                                   
10087             }
10088         }
10089
10090       if (flag_unsafe_math_optimizations
10091           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10092           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10093           && (tem = distribute_real_division (code, type, arg0, arg1)))
10094         return tem;
10095
10096       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10097          same or one.  Make sure type is not saturating.
10098          fold_plusminus_mult_expr will re-associate.  */
10099       if ((TREE_CODE (arg0) == MULT_EXPR
10100            || TREE_CODE (arg1) == MULT_EXPR)
10101           && !TYPE_SATURATING (type)
10102           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10103         {
10104           tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
10105           if (tem)
10106             return tem;
10107         }
10108
10109       goto associate;
10110
10111     case MULT_EXPR:
10112       /* (-A) * (-B) -> A * B  */
10113       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10114         return fold_build2 (MULT_EXPR, type,
10115                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10116                             fold_convert (type, negate_expr (arg1)));
10117       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10118         return fold_build2 (MULT_EXPR, type,
10119                             fold_convert (type, negate_expr (arg0)),
10120                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10121
10122       if (! FLOAT_TYPE_P (type))
10123         {
10124           if (integer_zerop (arg1))
10125             return omit_one_operand (type, arg1, arg0);
10126           if (integer_onep (arg1))
10127             return non_lvalue (fold_convert (type, arg0));
10128           /* Transform x * -1 into -x.  Make sure to do the negation
10129              on the original operand with conversions not stripped
10130              because we can only strip non-sign-changing conversions.  */
10131           if (integer_all_onesp (arg1))
10132             return fold_convert (type, negate_expr (op0));
10133           /* Transform x * -C into -x * C if x is easily negatable.  */
10134           if (TREE_CODE (arg1) == INTEGER_CST
10135               && tree_int_cst_sgn (arg1) == -1
10136               && negate_expr_p (arg0)
10137               && (tem = negate_expr (arg1)) != arg1
10138               && !TREE_OVERFLOW (tem))
10139             return fold_build2 (MULT_EXPR, type,
10140                                 fold_convert (type, negate_expr (arg0)), tem);
10141
10142           /* (a * (1 << b)) is (a << b)  */
10143           if (TREE_CODE (arg1) == LSHIFT_EXPR
10144               && integer_onep (TREE_OPERAND (arg1, 0)))
10145             return fold_build2 (LSHIFT_EXPR, type, op0,
10146                                 TREE_OPERAND (arg1, 1));
10147           if (TREE_CODE (arg0) == LSHIFT_EXPR
10148               && integer_onep (TREE_OPERAND (arg0, 0)))
10149             return fold_build2 (LSHIFT_EXPR, type, op1,
10150                                 TREE_OPERAND (arg0, 1));
10151
10152           strict_overflow_p = false;
10153           if (TREE_CODE (arg1) == INTEGER_CST
10154               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10155                                              &strict_overflow_p)))
10156             {
10157               if (strict_overflow_p)
10158                 fold_overflow_warning (("assuming signed overflow does not "
10159                                         "occur when simplifying "
10160                                         "multiplication"),
10161                                        WARN_STRICT_OVERFLOW_MISC);
10162               return fold_convert (type, tem);
10163             }
10164
10165           /* Optimize z * conj(z) for integer complex numbers.  */
10166           if (TREE_CODE (arg0) == CONJ_EXPR
10167               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10168             return fold_mult_zconjz (type, arg1);
10169           if (TREE_CODE (arg1) == CONJ_EXPR
10170               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10171             return fold_mult_zconjz (type, arg0);
10172         }
10173       else
10174         {
10175           /* Maybe fold x * 0 to 0.  The expressions aren't the same
10176              when x is NaN, since x * 0 is also NaN.  Nor are they the
10177              same in modes with signed zeros, since multiplying a
10178              negative value by 0 gives -0, not +0.  */
10179           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10180               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10181               && real_zerop (arg1))
10182             return omit_one_operand (type, arg1, arg0);
10183           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
10184           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10185               && real_onep (arg1))
10186             return non_lvalue (fold_convert (type, arg0));
10187
10188           /* Transform x * -1.0 into -x.  */
10189           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10190               && real_minus_onep (arg1))
10191             return fold_convert (type, negate_expr (arg0));
10192
10193           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10194              the result for floating point types due to rounding so it is applied
10195              only if -fassociative-math was specify.  */
10196           if (flag_associative_math
10197               && TREE_CODE (arg0) == RDIV_EXPR
10198               && TREE_CODE (arg1) == REAL_CST
10199               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10200             {
10201               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10202                                       arg1, 0);
10203               if (tem)
10204                 return fold_build2 (RDIV_EXPR, type, tem,
10205                                     TREE_OPERAND (arg0, 1));
10206             }
10207
10208           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10209           if (operand_equal_p (arg0, arg1, 0))
10210             {
10211               tree tem = fold_strip_sign_ops (arg0);
10212               if (tem != NULL_TREE)
10213                 {
10214                   tem = fold_convert (type, tem);
10215                   return fold_build2 (MULT_EXPR, type, tem, tem);
10216                 }
10217             }
10218
10219           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10220              This is not the same for NaNs or if signed zeros are
10221              involved.  */
10222           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10223               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10224               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10225               && TREE_CODE (arg1) == COMPLEX_CST
10226               && real_zerop (TREE_REALPART (arg1)))
10227             {
10228               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10229               if (real_onep (TREE_IMAGPART (arg1)))
10230                 return fold_build2 (COMPLEX_EXPR, type,
10231                                     negate_expr (fold_build1 (IMAGPART_EXPR,
10232                                                               rtype, arg0)),
10233                                     fold_build1 (REALPART_EXPR, rtype, arg0));
10234               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10235                 return fold_build2 (COMPLEX_EXPR, type,
10236                                     fold_build1 (IMAGPART_EXPR, rtype, arg0),
10237                                     negate_expr (fold_build1 (REALPART_EXPR,
10238                                                               rtype, arg0)));
10239             }
10240
10241           /* Optimize z * conj(z) for floating point complex numbers.
10242              Guarded by flag_unsafe_math_optimizations as non-finite
10243              imaginary components don't produce scalar results.  */
10244           if (flag_unsafe_math_optimizations
10245               && TREE_CODE (arg0) == CONJ_EXPR
10246               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10247             return fold_mult_zconjz (type, arg1);
10248           if (flag_unsafe_math_optimizations
10249               && TREE_CODE (arg1) == CONJ_EXPR
10250               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10251             return fold_mult_zconjz (type, arg0);
10252
10253           if (flag_unsafe_math_optimizations)
10254             {
10255               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10256               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10257
10258               /* Optimizations of root(...)*root(...).  */
10259               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10260                 {
10261                   tree rootfn, arg;
10262                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10263                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10264
10265                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10266                   if (BUILTIN_SQRT_P (fcode0)
10267                       && operand_equal_p (arg00, arg10, 0)
10268                       && ! HONOR_SNANS (TYPE_MODE (type)))
10269                     return arg00;
10270
10271                   /* Optimize root(x)*root(y) as root(x*y).  */
10272                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10273                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10274                   return build_call_expr (rootfn, 1, arg);
10275                 }
10276
10277               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10278               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10279                 {
10280                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10281                   tree arg = fold_build2 (PLUS_EXPR, type,
10282                                           CALL_EXPR_ARG (arg0, 0),
10283                                           CALL_EXPR_ARG (arg1, 0));
10284                   return build_call_expr (expfn, 1, arg);
10285                 }
10286
10287               /* Optimizations of pow(...)*pow(...).  */
10288               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10289                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10290                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10291                 {
10292                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10293                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10294                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10295                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10296
10297                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10298                   if (operand_equal_p (arg01, arg11, 0))
10299                     {
10300                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10301                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10302                       return build_call_expr (powfn, 2, arg, arg01);
10303                     }
10304
10305                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10306                   if (operand_equal_p (arg00, arg10, 0))
10307                     {
10308                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10309                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10310                       return build_call_expr (powfn, 2, arg00, arg);
10311                     }
10312                 }
10313
10314               /* Optimize tan(x)*cos(x) as sin(x).  */
10315               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10316                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10317                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10318                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10319                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10320                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10321                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10322                                       CALL_EXPR_ARG (arg1, 0), 0))
10323                 {
10324                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10325
10326                   if (sinfn != NULL_TREE)
10327                     return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10328                 }
10329
10330               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10331               if (fcode1 == BUILT_IN_POW
10332                   || fcode1 == BUILT_IN_POWF
10333                   || fcode1 == BUILT_IN_POWL)
10334                 {
10335                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10336                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10337                   if (TREE_CODE (arg11) == REAL_CST
10338                       && !TREE_OVERFLOW (arg11)
10339                       && operand_equal_p (arg0, arg10, 0))
10340                     {
10341                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10342                       REAL_VALUE_TYPE c;
10343                       tree arg;
10344
10345                       c = TREE_REAL_CST (arg11);
10346                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10347                       arg = build_real (type, c);
10348                       return build_call_expr (powfn, 2, arg0, arg);
10349                     }
10350                 }
10351
10352               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10353               if (fcode0 == BUILT_IN_POW
10354                   || fcode0 == BUILT_IN_POWF
10355                   || fcode0 == BUILT_IN_POWL)
10356                 {
10357                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10358                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10359                   if (TREE_CODE (arg01) == REAL_CST
10360                       && !TREE_OVERFLOW (arg01)
10361                       && operand_equal_p (arg1, arg00, 0))
10362                     {
10363                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10364                       REAL_VALUE_TYPE c;
10365                       tree arg;
10366
10367                       c = TREE_REAL_CST (arg01);
10368                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10369                       arg = build_real (type, c);
10370                       return build_call_expr (powfn, 2, arg1, arg);
10371                     }
10372                 }
10373
10374               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
10375               if (! optimize_size
10376                   && operand_equal_p (arg0, arg1, 0))
10377                 {
10378                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10379
10380                   if (powfn)
10381                     {
10382                       tree arg = build_real (type, dconst2);
10383                       return build_call_expr (powfn, 2, arg0, arg);
10384                     }
10385                 }
10386             }
10387         }
10388       goto associate;
10389
10390     case BIT_IOR_EXPR:
10391     bit_ior:
10392       if (integer_all_onesp (arg1))
10393         return omit_one_operand (type, arg1, arg0);
10394       if (integer_zerop (arg1))
10395         return non_lvalue (fold_convert (type, arg0));
10396       if (operand_equal_p (arg0, arg1, 0))
10397         return non_lvalue (fold_convert (type, arg0));
10398
10399       /* ~X | X is -1.  */
10400       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10401           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10402         {
10403           t1 = fold_convert (type, integer_zero_node);
10404           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10405           return omit_one_operand (type, t1, arg1);
10406         }
10407
10408       /* X | ~X is -1.  */
10409       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10410           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10411         {
10412           t1 = fold_convert (type, integer_zero_node);
10413           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10414           return omit_one_operand (type, t1, arg0);
10415         }
10416
10417       /* Canonicalize (X & C1) | C2.  */
10418       if (TREE_CODE (arg0) == BIT_AND_EXPR
10419           && TREE_CODE (arg1) == INTEGER_CST
10420           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10421         {
10422           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10423           int width = TYPE_PRECISION (type), w;
10424           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10425           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10426           hi2 = TREE_INT_CST_HIGH (arg1);
10427           lo2 = TREE_INT_CST_LOW (arg1);
10428
10429           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10430           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10431             return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10432
10433           if (width > HOST_BITS_PER_WIDE_INT)
10434             {
10435               mhi = (unsigned HOST_WIDE_INT) -1 
10436                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
10437               mlo = -1;
10438             }
10439           else
10440             {
10441               mhi = 0;
10442               mlo = (unsigned HOST_WIDE_INT) -1
10443                     >> (HOST_BITS_PER_WIDE_INT - width);
10444             }
10445
10446           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
10447           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10448             return fold_build2 (BIT_IOR_EXPR, type,
10449                                 TREE_OPERAND (arg0, 0), arg1);
10450
10451           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10452              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10453              mode which allows further optimizations.  */
10454           hi1 &= mhi;
10455           lo1 &= mlo;
10456           hi2 &= mhi;
10457           lo2 &= mlo;
10458           hi3 = hi1 & ~hi2;
10459           lo3 = lo1 & ~lo2;
10460           for (w = BITS_PER_UNIT;
10461                w <= width && w <= HOST_BITS_PER_WIDE_INT;
10462                w <<= 1)
10463             {
10464               unsigned HOST_WIDE_INT mask
10465                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10466               if (((lo1 | lo2) & mask) == mask
10467                   && (lo1 & ~mask) == 0 && hi1 == 0)
10468                 {
10469                   hi3 = 0;
10470                   lo3 = mask;
10471                   break;
10472                 }
10473             }
10474           if (hi3 != hi1 || lo3 != lo1)
10475             return fold_build2 (BIT_IOR_EXPR, type,
10476                                 fold_build2 (BIT_AND_EXPR, type,
10477                                              TREE_OPERAND (arg0, 0),
10478                                              build_int_cst_wide (type,
10479                                                                  lo3, hi3)),
10480                                 arg1);
10481         }
10482
10483       /* (X & Y) | Y is (X, Y).  */
10484       if (TREE_CODE (arg0) == BIT_AND_EXPR
10485           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10486         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10487       /* (X & Y) | X is (Y, X).  */
10488       if (TREE_CODE (arg0) == BIT_AND_EXPR
10489           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10490           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10491         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10492       /* X | (X & Y) is (Y, X).  */
10493       if (TREE_CODE (arg1) == BIT_AND_EXPR
10494           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10495           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10496         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10497       /* X | (Y & X) is (Y, X).  */
10498       if (TREE_CODE (arg1) == BIT_AND_EXPR
10499           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10500           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10501         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10502
10503       t1 = distribute_bit_expr (code, type, arg0, arg1);
10504       if (t1 != NULL_TREE)
10505         return t1;
10506
10507       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10508
10509          This results in more efficient code for machines without a NAND
10510          instruction.  Combine will canonicalize to the first form
10511          which will allow use of NAND instructions provided by the
10512          backend if they exist.  */
10513       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10514           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10515         {
10516           return fold_build1 (BIT_NOT_EXPR, type,
10517                               build2 (BIT_AND_EXPR, type,
10518                                       fold_convert (type,
10519                                                     TREE_OPERAND (arg0, 0)),
10520                                       fold_convert (type,
10521                                                     TREE_OPERAND (arg1, 0))));
10522         }
10523
10524       /* See if this can be simplified into a rotate first.  If that
10525          is unsuccessful continue in the association code.  */
10526       goto bit_rotate;
10527
10528     case BIT_XOR_EXPR:
10529       if (integer_zerop (arg1))
10530         return non_lvalue (fold_convert (type, arg0));
10531       if (integer_all_onesp (arg1))
10532         return fold_build1 (BIT_NOT_EXPR, type, op0);
10533       if (operand_equal_p (arg0, arg1, 0))
10534         return omit_one_operand (type, integer_zero_node, arg0);
10535
10536       /* ~X ^ X is -1.  */
10537       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10538           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10539         {
10540           t1 = fold_convert (type, integer_zero_node);
10541           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10542           return omit_one_operand (type, t1, arg1);
10543         }
10544
10545       /* X ^ ~X is -1.  */
10546       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10547           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10548         {
10549           t1 = fold_convert (type, integer_zero_node);
10550           t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10551           return omit_one_operand (type, t1, arg0);
10552         }
10553
10554       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10555          with a constant, and the two constants have no bits in common,
10556          we should treat this as a BIT_IOR_EXPR since this may produce more
10557          simplifications.  */
10558       if (TREE_CODE (arg0) == BIT_AND_EXPR
10559           && TREE_CODE (arg1) == BIT_AND_EXPR
10560           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10561           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10562           && integer_zerop (const_binop (BIT_AND_EXPR,
10563                                          TREE_OPERAND (arg0, 1),
10564                                          TREE_OPERAND (arg1, 1), 0)))
10565         {
10566           code = BIT_IOR_EXPR;
10567           goto bit_ior;
10568         }
10569
10570       /* (X | Y) ^ X -> Y & ~ X*/
10571       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10572           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10573         {
10574           tree t2 = TREE_OPERAND (arg0, 1);
10575           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10576                             arg1);
10577           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10578                             fold_convert (type, t1));
10579           return t1;
10580         }
10581
10582       /* (Y | X) ^ X -> Y & ~ X*/
10583       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10584           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10585         {
10586           tree t2 = TREE_OPERAND (arg0, 0);
10587           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10588                             arg1);
10589           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10590                             fold_convert (type, t1));
10591           return t1;
10592         }
10593
10594       /* X ^ (X | Y) -> Y & ~ X*/
10595       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10596           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10597         {
10598           tree t2 = TREE_OPERAND (arg1, 1);
10599           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10600                             arg0);
10601           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10602                             fold_convert (type, t1));
10603           return t1;
10604         }
10605
10606       /* X ^ (Y | X) -> Y & ~ X*/
10607       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10608           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10609         {
10610           tree t2 = TREE_OPERAND (arg1, 0);
10611           t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10612                             arg0);
10613           t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10614                             fold_convert (type, t1));
10615           return t1;
10616         }
10617         
10618       /* Convert ~X ^ ~Y to X ^ Y.  */
10619       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10620           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10621         return fold_build2 (code, type,
10622                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10623                             fold_convert (type, TREE_OPERAND (arg1, 0)));
10624
10625       /* Convert ~X ^ C to X ^ ~C.  */
10626       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10627           && TREE_CODE (arg1) == INTEGER_CST)
10628         return fold_build2 (code, type,
10629                             fold_convert (type, TREE_OPERAND (arg0, 0)),
10630                             fold_build1 (BIT_NOT_EXPR, type, arg1));
10631
10632       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
10633       if (TREE_CODE (arg0) == BIT_AND_EXPR
10634           && integer_onep (TREE_OPERAND (arg0, 1))
10635           && integer_onep (arg1))
10636         return fold_build2 (EQ_EXPR, type, arg0,
10637                             build_int_cst (TREE_TYPE (arg0), 0));
10638
10639       /* Fold (X & Y) ^ Y as ~X & Y.  */
10640       if (TREE_CODE (arg0) == BIT_AND_EXPR
10641           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10642         {
10643           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10644           return fold_build2 (BIT_AND_EXPR, type, 
10645                               fold_build1 (BIT_NOT_EXPR, type, tem),
10646                               fold_convert (type, arg1));
10647         }
10648       /* Fold (X & Y) ^ X as ~Y & X.  */
10649       if (TREE_CODE (arg0) == BIT_AND_EXPR
10650           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10651           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10652         {
10653           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10654           return fold_build2 (BIT_AND_EXPR, type,
10655                               fold_build1 (BIT_NOT_EXPR, type, tem),
10656                               fold_convert (type, arg1));
10657         }
10658       /* Fold X ^ (X & Y) as X & ~Y.  */
10659       if (TREE_CODE (arg1) == BIT_AND_EXPR
10660           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10661         {
10662           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10663           return fold_build2 (BIT_AND_EXPR, type,
10664                               fold_convert (type, arg0),
10665                               fold_build1 (BIT_NOT_EXPR, type, tem));
10666         }
10667       /* Fold X ^ (Y & X) as ~Y & X.  */
10668       if (TREE_CODE (arg1) == BIT_AND_EXPR
10669           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10670           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10671         {
10672           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10673           return fold_build2 (BIT_AND_EXPR, type,
10674                               fold_build1 (BIT_NOT_EXPR, type, tem),
10675                               fold_convert (type, arg0));
10676         }
10677
10678       /* See if this can be simplified into a rotate first.  If that
10679          is unsuccessful continue in the association code.  */
10680       goto bit_rotate;
10681
10682     case BIT_AND_EXPR:
10683       if (integer_all_onesp (arg1))
10684         return non_lvalue (fold_convert (type, arg0));
10685       if (integer_zerop (arg1))
10686         return omit_one_operand (type, arg1, arg0);
10687       if (operand_equal_p (arg0, arg1, 0))
10688         return non_lvalue (fold_convert (type, arg0));
10689
10690       /* ~X & X is always zero.  */
10691       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10692           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10693         return omit_one_operand (type, integer_zero_node, arg1);
10694
10695       /* X & ~X is always zero.  */
10696       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10697           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10698         return omit_one_operand (type, integer_zero_node, arg0);
10699
10700       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
10701       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10702           && TREE_CODE (arg1) == INTEGER_CST
10703           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10704         {
10705           tree tmp1 = fold_convert (TREE_TYPE (arg0), arg1);
10706           tree tmp2 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10707                                    TREE_OPERAND (arg0, 0), tmp1);
10708           tree tmp3 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10709                                    TREE_OPERAND (arg0, 1), tmp1);
10710           return fold_convert (type,
10711                                fold_build2 (BIT_IOR_EXPR, TREE_TYPE (arg0),
10712                                             tmp2, tmp3));
10713         }
10714
10715       /* (X | Y) & Y is (X, Y).  */
10716       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10717           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10718         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10719       /* (X | Y) & X is (Y, X).  */
10720       if (TREE_CODE (arg0) == BIT_IOR_EXPR
10721           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10722           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10723         return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10724       /* X & (X | Y) is (Y, X).  */
10725       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10726           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10727           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10728         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10729       /* X & (Y | X) is (Y, X).  */
10730       if (TREE_CODE (arg1) == BIT_IOR_EXPR
10731           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10732           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10733         return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10734
10735       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
10736       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10737           && integer_onep (TREE_OPERAND (arg0, 1))
10738           && integer_onep (arg1))
10739         {
10740           tem = TREE_OPERAND (arg0, 0);
10741           return fold_build2 (EQ_EXPR, type,
10742                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10743                                            build_int_cst (TREE_TYPE (tem), 1)),
10744                               build_int_cst (TREE_TYPE (tem), 0));
10745         }
10746       /* Fold ~X & 1 as (X & 1) == 0.  */
10747       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10748           && integer_onep (arg1))
10749         {
10750           tem = TREE_OPERAND (arg0, 0);
10751           return fold_build2 (EQ_EXPR, type,
10752                               fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10753                                            build_int_cst (TREE_TYPE (tem), 1)),
10754                               build_int_cst (TREE_TYPE (tem), 0));
10755         }
10756
10757       /* Fold (X ^ Y) & Y as ~X & Y.  */
10758       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10759           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10760         {
10761           tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10762           return fold_build2 (BIT_AND_EXPR, type, 
10763                               fold_build1 (BIT_NOT_EXPR, type, tem),
10764                               fold_convert (type, arg1));
10765         }
10766       /* Fold (X ^ Y) & X as ~Y & X.  */
10767       if (TREE_CODE (arg0) == BIT_XOR_EXPR
10768           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10769           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10770         {
10771           tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10772           return fold_build2 (BIT_AND_EXPR, type,
10773                               fold_build1 (BIT_NOT_EXPR, type, tem),
10774                               fold_convert (type, arg1));
10775         }
10776       /* Fold X & (X ^ Y) as X & ~Y.  */
10777       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10778           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10779         {
10780           tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10781           return fold_build2 (BIT_AND_EXPR, type,
10782                               fold_convert (type, arg0),
10783                               fold_build1 (BIT_NOT_EXPR, type, tem));
10784         }
10785       /* Fold X & (Y ^ X) as ~Y & X.  */
10786       if (TREE_CODE (arg1) == BIT_XOR_EXPR
10787           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10788           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10789         {
10790           tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10791           return fold_build2 (BIT_AND_EXPR, type,
10792                               fold_build1 (BIT_NOT_EXPR, type, tem),
10793                               fold_convert (type, arg0));
10794         }
10795
10796       t1 = distribute_bit_expr (code, type, arg0, arg1);
10797       if (t1 != NULL_TREE)
10798         return t1;
10799       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
10800       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10801           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10802         {
10803           unsigned int prec
10804             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10805
10806           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10807               && (~TREE_INT_CST_LOW (arg1)
10808                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10809             return fold_convert (type, TREE_OPERAND (arg0, 0));
10810         }
10811
10812       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10813
10814          This results in more efficient code for machines without a NOR
10815          instruction.  Combine will canonicalize to the first form
10816          which will allow use of NOR instructions provided by the
10817          backend if they exist.  */
10818       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10819           && TREE_CODE (arg1) == BIT_NOT_EXPR)
10820         {
10821           return fold_build1 (BIT_NOT_EXPR, type,
10822                               build2 (BIT_IOR_EXPR, type,
10823                                       fold_convert (type,
10824                                                     TREE_OPERAND (arg0, 0)),
10825                                       fold_convert (type,
10826                                                     TREE_OPERAND (arg1, 0))));
10827         }
10828
10829       /* If arg0 is derived from the address of an object or function, we may
10830          be able to fold this expression using the object or function's
10831          alignment.  */
10832       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
10833         {
10834           unsigned HOST_WIDE_INT modulus, residue;
10835           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
10836
10837           modulus = get_pointer_modulus_and_residue (arg0, &residue);
10838
10839           /* This works because modulus is a power of 2.  If this weren't the
10840              case, we'd have to replace it by its greatest power-of-2
10841              divisor: modulus & -modulus.  */
10842           if (low < modulus)
10843             return build_int_cst (type, residue & low);
10844         }
10845
10846       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
10847               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
10848          if the new mask might be further optimized.  */
10849       if ((TREE_CODE (arg0) == LSHIFT_EXPR
10850            || TREE_CODE (arg0) == RSHIFT_EXPR)
10851           && host_integerp (TREE_OPERAND (arg0, 1), 1)
10852           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
10853           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
10854              < TYPE_PRECISION (TREE_TYPE (arg0))
10855           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
10856           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
10857         {
10858           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
10859           unsigned HOST_WIDE_INT mask
10860             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
10861           unsigned HOST_WIDE_INT newmask, zerobits = 0;
10862           tree shift_type = TREE_TYPE (arg0);
10863
10864           if (TREE_CODE (arg0) == LSHIFT_EXPR)
10865             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
10866           else if (TREE_CODE (arg0) == RSHIFT_EXPR
10867                    && TYPE_PRECISION (TREE_TYPE (arg0))
10868                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
10869             {
10870               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
10871               tree arg00 = TREE_OPERAND (arg0, 0);
10872               /* See if more bits can be proven as zero because of
10873                  zero extension.  */
10874               if (TREE_CODE (arg00) == NOP_EXPR
10875                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
10876                 {
10877                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
10878                   if (TYPE_PRECISION (inner_type)
10879                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
10880                       && TYPE_PRECISION (inner_type) < prec)
10881                     {
10882                       prec = TYPE_PRECISION (inner_type);
10883                       /* See if we can shorten the right shift.  */
10884                       if (shiftc < prec)
10885                         shift_type = inner_type;
10886                     }
10887                 }
10888               zerobits = ~(unsigned HOST_WIDE_INT) 0;
10889               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
10890               zerobits <<= prec - shiftc;
10891               /* For arithmetic shift if sign bit could be set, zerobits
10892                  can contain actually sign bits, so no transformation is
10893                  possible, unless MASK masks them all away.  In that
10894                  case the shift needs to be converted into logical shift.  */
10895               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
10896                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
10897                 {
10898                   if ((mask & zerobits) == 0)
10899                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
10900                   else
10901                     zerobits = 0;
10902                 }
10903             }
10904
10905           /* ((X << 16) & 0xff00) is (X, 0).  */
10906           if ((mask & zerobits) == mask)
10907             return omit_one_operand (type, build_int_cst (type, 0), arg0);
10908
10909           newmask = mask | zerobits;
10910           if (newmask != mask && (newmask & (newmask + 1)) == 0)
10911             {
10912               unsigned int prec;
10913
10914               /* Only do the transformation if NEWMASK is some integer
10915                  mode's mask.  */
10916               for (prec = BITS_PER_UNIT;
10917                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
10918                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
10919                   break;
10920               if (prec < HOST_BITS_PER_WIDE_INT
10921                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
10922                 {
10923                   if (shift_type != TREE_TYPE (arg0))
10924                     {
10925                       tem = fold_build2 (TREE_CODE (arg0), shift_type,
10926                                          fold_convert (shift_type,
10927                                                        TREE_OPERAND (arg0, 0)),
10928                                          TREE_OPERAND (arg0, 1));
10929                       tem = fold_convert (type, tem);
10930                     }
10931                   else
10932                     tem = op0;
10933                   return fold_build2 (BIT_AND_EXPR, type, tem,
10934                                       build_int_cst_type (TREE_TYPE (op1),
10935                                                           newmask));
10936                 }
10937             }
10938         }
10939
10940       goto associate;
10941
10942     case RDIV_EXPR:
10943       /* Don't touch a floating-point divide by zero unless the mode
10944          of the constant can represent infinity.  */
10945       if (TREE_CODE (arg1) == REAL_CST
10946           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10947           && real_zerop (arg1))
10948         return NULL_TREE;
10949
10950       /* Optimize A / A to 1.0 if we don't care about
10951          NaNs or Infinities.  Skip the transformation
10952          for non-real operands.  */
10953       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10954           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10955           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10956           && operand_equal_p (arg0, arg1, 0))
10957         {
10958           tree r = build_real (TREE_TYPE (arg0), dconst1);
10959
10960           return omit_two_operands (type, r, arg0, arg1);
10961         }
10962
10963       /* The complex version of the above A / A optimization.  */
10964       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10965           && operand_equal_p (arg0, arg1, 0))
10966         {
10967           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10968           if (! HONOR_NANS (TYPE_MODE (elem_type))
10969               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10970             {
10971               tree r = build_real (elem_type, dconst1);
10972               /* omit_two_operands will call fold_convert for us.  */
10973               return omit_two_operands (type, r, arg0, arg1);
10974             }
10975         }
10976
10977       /* (-A) / (-B) -> A / B  */
10978       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10979         return fold_build2 (RDIV_EXPR, type,
10980                             TREE_OPERAND (arg0, 0),
10981                             negate_expr (arg1));
10982       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10983         return fold_build2 (RDIV_EXPR, type,
10984                             negate_expr (arg0),
10985                             TREE_OPERAND (arg1, 0));
10986
10987       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
10988       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10989           && real_onep (arg1))
10990         return non_lvalue (fold_convert (type, arg0));
10991
10992       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
10993       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10994           && real_minus_onep (arg1))
10995         return non_lvalue (fold_convert (type, negate_expr (arg0)));
10996
10997       /* If ARG1 is a constant, we can convert this to a multiply by the
10998          reciprocal.  This does not have the same rounding properties,
10999          so only do this if -freciprocal-math.  We can actually
11000          always safely do it if ARG1 is a power of two, but it's hard to
11001          tell if it is or not in a portable manner.  */
11002       if (TREE_CODE (arg1) == REAL_CST)
11003         {
11004           if (flag_reciprocal_math
11005               && 0 != (tem = const_binop (code, build_real (type, dconst1),
11006                                           arg1, 0)))
11007             return fold_build2 (MULT_EXPR, type, arg0, tem);
11008           /* Find the reciprocal if optimizing and the result is exact.  */
11009           if (optimize)
11010             {
11011               REAL_VALUE_TYPE r;
11012               r = TREE_REAL_CST (arg1);
11013               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11014                 {
11015                   tem = build_real (type, r);
11016                   return fold_build2 (MULT_EXPR, type,
11017                                       fold_convert (type, arg0), tem);
11018                 }
11019             }
11020         }
11021       /* Convert A/B/C to A/(B*C).  */ 
11022       if (flag_reciprocal_math
11023           && TREE_CODE (arg0) == RDIV_EXPR)
11024         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11025                             fold_build2 (MULT_EXPR, type,
11026                                          TREE_OPERAND (arg0, 1), arg1));
11027
11028       /* Convert A/(B/C) to (A/B)*C.  */
11029       if (flag_reciprocal_math
11030           && TREE_CODE (arg1) == RDIV_EXPR)
11031         return fold_build2 (MULT_EXPR, type,
11032                             fold_build2 (RDIV_EXPR, type, arg0,
11033                                          TREE_OPERAND (arg1, 0)),
11034                             TREE_OPERAND (arg1, 1));
11035
11036       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11037       if (flag_reciprocal_math
11038           && TREE_CODE (arg1) == MULT_EXPR
11039           && TREE_CODE (arg0) == REAL_CST
11040           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11041         {
11042           tree tem = const_binop (RDIV_EXPR, arg0,
11043                                   TREE_OPERAND (arg1, 1), 0);
11044           if (tem)
11045             return fold_build2 (RDIV_EXPR, type, tem,
11046                                 TREE_OPERAND (arg1, 0));
11047         }
11048
11049       if (flag_unsafe_math_optimizations)
11050         {
11051           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11052           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11053
11054           /* Optimize sin(x)/cos(x) as tan(x).  */
11055           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11056                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11057                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11058               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11059                                   CALL_EXPR_ARG (arg1, 0), 0))
11060             {
11061               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11062
11063               if (tanfn != NULL_TREE)
11064                 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11065             }
11066
11067           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11068           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11069                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11070                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11071               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11072                                   CALL_EXPR_ARG (arg1, 0), 0))
11073             {
11074               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11075
11076               if (tanfn != NULL_TREE)
11077                 {
11078                   tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11079                   return fold_build2 (RDIV_EXPR, type,
11080                                       build_real (type, dconst1), tmp);
11081                 }
11082             }
11083
11084           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11085              NaNs or Infinities.  */
11086           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11087                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11088                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11089             {
11090               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11091               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11092
11093               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11094                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11095                   && operand_equal_p (arg00, arg01, 0))
11096                 {
11097                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11098
11099                   if (cosfn != NULL_TREE)
11100                     return build_call_expr (cosfn, 1, arg00);
11101                 }
11102             }
11103
11104           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11105              NaNs or Infinities.  */
11106           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11107                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11108                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11109             {
11110               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11111               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11112
11113               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11114                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11115                   && operand_equal_p (arg00, arg01, 0))
11116                 {
11117                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11118
11119                   if (cosfn != NULL_TREE)
11120                     {
11121                       tree tmp = build_call_expr (cosfn, 1, arg00);
11122                       return fold_build2 (RDIV_EXPR, type,
11123                                           build_real (type, dconst1),
11124                                           tmp);
11125                     }
11126                 }
11127             }
11128
11129           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11130           if (fcode0 == BUILT_IN_POW
11131               || fcode0 == BUILT_IN_POWF
11132               || fcode0 == BUILT_IN_POWL)
11133             {
11134               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11135               tree arg01 = CALL_EXPR_ARG (arg0, 1);
11136               if (TREE_CODE (arg01) == REAL_CST
11137                   && !TREE_OVERFLOW (arg01)
11138                   && operand_equal_p (arg1, arg00, 0))
11139                 {
11140                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11141                   REAL_VALUE_TYPE c;
11142                   tree arg;
11143
11144                   c = TREE_REAL_CST (arg01);
11145                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11146                   arg = build_real (type, c);
11147                   return build_call_expr (powfn, 2, arg1, arg);
11148                 }
11149             }
11150
11151           /* Optimize a/root(b/c) into a*root(c/b).  */
11152           if (BUILTIN_ROOT_P (fcode1))
11153             {
11154               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11155
11156               if (TREE_CODE (rootarg) == RDIV_EXPR)
11157                 {
11158                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11159                   tree b = TREE_OPERAND (rootarg, 0);
11160                   tree c = TREE_OPERAND (rootarg, 1);
11161
11162                   tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11163
11164                   tmp = build_call_expr (rootfn, 1, tmp);
11165                   return fold_build2 (MULT_EXPR, type, arg0, tmp);
11166                 }
11167             }
11168
11169           /* Optimize x/expN(y) into x*expN(-y).  */
11170           if (BUILTIN_EXPONENT_P (fcode1))
11171             {
11172               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11173               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11174               arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11175               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11176             }
11177
11178           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11179           if (fcode1 == BUILT_IN_POW
11180               || fcode1 == BUILT_IN_POWF
11181               || fcode1 == BUILT_IN_POWL)
11182             {
11183               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11184               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11185               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11186               tree neg11 = fold_convert (type, negate_expr (arg11));
11187               arg1 = build_call_expr (powfn, 2, arg10, neg11);
11188               return fold_build2 (MULT_EXPR, type, arg0, arg1);
11189             }
11190         }
11191       return NULL_TREE;
11192
11193     case TRUNC_DIV_EXPR:
11194     case FLOOR_DIV_EXPR:
11195       /* Simplify A / (B << N) where A and B are positive and B is
11196          a power of 2, to A >> (N + log2(B)).  */
11197       strict_overflow_p = false;
11198       if (TREE_CODE (arg1) == LSHIFT_EXPR
11199           && (TYPE_UNSIGNED (type)
11200               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11201         {
11202           tree sval = TREE_OPERAND (arg1, 0);
11203           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11204             {
11205               tree sh_cnt = TREE_OPERAND (arg1, 1);
11206               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11207
11208               if (strict_overflow_p)
11209                 fold_overflow_warning (("assuming signed overflow does not "
11210                                         "occur when simplifying A / (B << N)"),
11211                                        WARN_STRICT_OVERFLOW_MISC);
11212
11213               sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11214                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
11215               return fold_build2 (RSHIFT_EXPR, type,
11216                                   fold_convert (type, arg0), sh_cnt);
11217             }
11218         }
11219
11220       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11221          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
11222       if (INTEGRAL_TYPE_P (type)
11223           && TYPE_UNSIGNED (type)
11224           && code == FLOOR_DIV_EXPR)
11225         return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11226
11227       /* Fall thru */
11228
11229     case ROUND_DIV_EXPR:
11230     case CEIL_DIV_EXPR:
11231     case EXACT_DIV_EXPR:
11232       if (integer_onep (arg1))
11233         return non_lvalue (fold_convert (type, arg0));
11234       if (integer_zerop (arg1))
11235         return NULL_TREE;
11236       /* X / -1 is -X.  */
11237       if (!TYPE_UNSIGNED (type)
11238           && TREE_CODE (arg1) == INTEGER_CST
11239           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11240           && TREE_INT_CST_HIGH (arg1) == -1)
11241         return fold_convert (type, negate_expr (arg0));
11242
11243       /* Convert -A / -B to A / B when the type is signed and overflow is
11244          undefined.  */
11245       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11246           && TREE_CODE (arg0) == NEGATE_EXPR
11247           && negate_expr_p (arg1))
11248         {
11249           if (INTEGRAL_TYPE_P (type))
11250             fold_overflow_warning (("assuming signed overflow does not occur "
11251                                     "when distributing negation across "
11252                                     "division"),
11253                                    WARN_STRICT_OVERFLOW_MISC);
11254           return fold_build2 (code, type,
11255                               fold_convert (type, TREE_OPERAND (arg0, 0)),
11256                               negate_expr (arg1));
11257         }
11258       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11259           && TREE_CODE (arg1) == NEGATE_EXPR
11260           && negate_expr_p (arg0))
11261         {
11262           if (INTEGRAL_TYPE_P (type))
11263             fold_overflow_warning (("assuming signed overflow does not occur "
11264                                     "when distributing negation across "
11265                                     "division"),
11266                                    WARN_STRICT_OVERFLOW_MISC);
11267           return fold_build2 (code, type, negate_expr (arg0),
11268                               TREE_OPERAND (arg1, 0));
11269         }
11270
11271       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11272          operation, EXACT_DIV_EXPR.
11273
11274          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11275          At one time others generated faster code, it's not clear if they do
11276          after the last round to changes to the DIV code in expmed.c.  */
11277       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11278           && multiple_of_p (type, arg0, arg1))
11279         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11280
11281       strict_overflow_p = false;
11282       if (TREE_CODE (arg1) == INTEGER_CST
11283           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11284                                          &strict_overflow_p)))
11285         {
11286           if (strict_overflow_p)
11287             fold_overflow_warning (("assuming signed overflow does not occur "
11288                                     "when simplifying division"),
11289                                    WARN_STRICT_OVERFLOW_MISC);
11290           return fold_convert (type, tem);
11291         }
11292
11293       return NULL_TREE;
11294
11295     case CEIL_MOD_EXPR:
11296     case FLOOR_MOD_EXPR:
11297     case ROUND_MOD_EXPR:
11298     case TRUNC_MOD_EXPR:
11299       /* X % 1 is always zero, but be sure to preserve any side
11300          effects in X.  */
11301       if (integer_onep (arg1))
11302         return omit_one_operand (type, integer_zero_node, arg0);
11303
11304       /* X % 0, return X % 0 unchanged so that we can get the
11305          proper warnings and errors.  */
11306       if (integer_zerop (arg1))
11307         return NULL_TREE;
11308
11309       /* 0 % X is always zero, but be sure to preserve any side
11310          effects in X.  Place this after checking for X == 0.  */
11311       if (integer_zerop (arg0))
11312         return omit_one_operand (type, integer_zero_node, arg1);
11313
11314       /* X % -1 is zero.  */
11315       if (!TYPE_UNSIGNED (type)
11316           && TREE_CODE (arg1) == INTEGER_CST
11317           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11318           && TREE_INT_CST_HIGH (arg1) == -1)
11319         return omit_one_operand (type, integer_zero_node, arg0);
11320
11321       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11322          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11323       strict_overflow_p = false;
11324       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11325           && (TYPE_UNSIGNED (type)
11326               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11327         {
11328           tree c = arg1;
11329           /* Also optimize A % (C << N)  where C is a power of 2,
11330              to A & ((C << N) - 1).  */
11331           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11332             c = TREE_OPERAND (arg1, 0);
11333
11334           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11335             {
11336               tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11337                                        build_int_cst (TREE_TYPE (arg1), 1));
11338               if (strict_overflow_p)
11339                 fold_overflow_warning (("assuming signed overflow does not "
11340                                         "occur when simplifying "
11341                                         "X % (power of two)"),
11342                                        WARN_STRICT_OVERFLOW_MISC);
11343               return fold_build2 (BIT_AND_EXPR, type,
11344                                   fold_convert (type, arg0),
11345                                   fold_convert (type, mask));
11346             }
11347         }
11348
11349       /* X % -C is the same as X % C.  */
11350       if (code == TRUNC_MOD_EXPR
11351           && !TYPE_UNSIGNED (type)
11352           && TREE_CODE (arg1) == INTEGER_CST
11353           && !TREE_OVERFLOW (arg1)
11354           && TREE_INT_CST_HIGH (arg1) < 0
11355           && !TYPE_OVERFLOW_TRAPS (type)
11356           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
11357           && !sign_bit_p (arg1, arg1))
11358         return fold_build2 (code, type, fold_convert (type, arg0),
11359                             fold_convert (type, negate_expr (arg1)));
11360
11361       /* X % -Y is the same as X % Y.  */
11362       if (code == TRUNC_MOD_EXPR
11363           && !TYPE_UNSIGNED (type)
11364           && TREE_CODE (arg1) == NEGATE_EXPR
11365           && !TYPE_OVERFLOW_TRAPS (type))
11366         return fold_build2 (code, type, fold_convert (type, arg0),
11367                             fold_convert (type, TREE_OPERAND (arg1, 0)));
11368
11369       if (TREE_CODE (arg1) == INTEGER_CST
11370           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11371                                          &strict_overflow_p)))
11372         {
11373           if (strict_overflow_p)
11374             fold_overflow_warning (("assuming signed overflow does not occur "
11375                                     "when simplifying modulos"),
11376                                    WARN_STRICT_OVERFLOW_MISC);
11377           return fold_convert (type, tem);
11378         }
11379
11380       return NULL_TREE;
11381
11382     case LROTATE_EXPR:
11383     case RROTATE_EXPR:
11384       if (integer_all_onesp (arg0))
11385         return omit_one_operand (type, arg0, arg1);
11386       goto shift;
11387
11388     case RSHIFT_EXPR:
11389       /* Optimize -1 >> x for arithmetic right shifts.  */
11390       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
11391         return omit_one_operand (type, arg0, arg1);
11392       /* ... fall through ...  */
11393
11394     case LSHIFT_EXPR:
11395     shift:
11396       if (integer_zerop (arg1))
11397         return non_lvalue (fold_convert (type, arg0));
11398       if (integer_zerop (arg0))
11399         return omit_one_operand (type, arg0, arg1);
11400
11401       /* Since negative shift count is not well-defined,
11402          don't try to compute it in the compiler.  */
11403       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11404         return NULL_TREE;
11405
11406       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
11407       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11408           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11409           && host_integerp (TREE_OPERAND (arg0, 1), false)
11410           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11411         {
11412           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11413                                + TREE_INT_CST_LOW (arg1));
11414
11415           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11416              being well defined.  */
11417           if (low >= TYPE_PRECISION (type))
11418             {
11419               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11420                 low = low % TYPE_PRECISION (type);
11421               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11422                 return build_int_cst (type, 0);
11423               else
11424                 low = TYPE_PRECISION (type) - 1;
11425             }
11426
11427           return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11428                               build_int_cst (type, low));
11429         }
11430
11431       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11432          into x & ((unsigned)-1 >> c) for unsigned types.  */
11433       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11434            || (TYPE_UNSIGNED (type)
11435                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11436           && host_integerp (arg1, false)
11437           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11438           && host_integerp (TREE_OPERAND (arg0, 1), false)
11439           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11440         {
11441           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11442           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11443           tree lshift;
11444           tree arg00;
11445
11446           if (low0 == low1)
11447             {
11448               arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11449
11450               lshift = build_int_cst (type, -1);
11451               lshift = int_const_binop (code, lshift, arg1, 0);
11452
11453               return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11454             }
11455         }
11456
11457       /* Rewrite an LROTATE_EXPR by a constant into an
11458          RROTATE_EXPR by a new constant.  */
11459       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11460         {
11461           tree tem = build_int_cst (TREE_TYPE (arg1),
11462                                     TYPE_PRECISION (type));
11463           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11464           return fold_build2 (RROTATE_EXPR, type, op0, tem);
11465         }
11466
11467       /* If we have a rotate of a bit operation with the rotate count and
11468          the second operand of the bit operation both constant,
11469          permute the two operations.  */
11470       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11471           && (TREE_CODE (arg0) == BIT_AND_EXPR
11472               || TREE_CODE (arg0) == BIT_IOR_EXPR
11473               || TREE_CODE (arg0) == BIT_XOR_EXPR)
11474           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11475         return fold_build2 (TREE_CODE (arg0), type,
11476                             fold_build2 (code, type,
11477                                          TREE_OPERAND (arg0, 0), arg1),
11478                             fold_build2 (code, type,
11479                                          TREE_OPERAND (arg0, 1), arg1));
11480
11481       /* Two consecutive rotates adding up to the precision of the
11482          type can be ignored.  */
11483       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11484           && TREE_CODE (arg0) == RROTATE_EXPR
11485           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11486           && TREE_INT_CST_HIGH (arg1) == 0
11487           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11488           && ((TREE_INT_CST_LOW (arg1)
11489                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11490               == (unsigned int) TYPE_PRECISION (type)))
11491         return TREE_OPERAND (arg0, 0);
11492
11493       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11494               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11495          if the latter can be further optimized.  */
11496       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11497           && TREE_CODE (arg0) == BIT_AND_EXPR
11498           && TREE_CODE (arg1) == INTEGER_CST
11499           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11500         {
11501           tree mask = fold_build2 (code, type,
11502                                    fold_convert (type, TREE_OPERAND (arg0, 1)),
11503                                    arg1);
11504           tree shift = fold_build2 (code, type,
11505                                     fold_convert (type, TREE_OPERAND (arg0, 0)),
11506                                     arg1);
11507           tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11508           if (tem)
11509             return tem;
11510         }
11511
11512       return NULL_TREE;
11513
11514     case MIN_EXPR:
11515       if (operand_equal_p (arg0, arg1, 0))
11516         return omit_one_operand (type, arg0, arg1);
11517       if (INTEGRAL_TYPE_P (type)
11518           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11519         return omit_one_operand (type, arg1, arg0);
11520       tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11521       if (tem)
11522         return tem;
11523       goto associate;
11524
11525     case MAX_EXPR:
11526       if (operand_equal_p (arg0, arg1, 0))
11527         return omit_one_operand (type, arg0, arg1);
11528       if (INTEGRAL_TYPE_P (type)
11529           && TYPE_MAX_VALUE (type)
11530           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11531         return omit_one_operand (type, arg1, arg0);
11532       tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11533       if (tem)
11534         return tem;
11535       goto associate;
11536
11537     case TRUTH_ANDIF_EXPR:
11538       /* Note that the operands of this must be ints
11539          and their values must be 0 or 1.
11540          ("true" is a fixed value perhaps depending on the language.)  */
11541       /* If first arg is constant zero, return it.  */
11542       if (integer_zerop (arg0))
11543         return fold_convert (type, arg0);
11544     case TRUTH_AND_EXPR:
11545       /* If either arg is constant true, drop it.  */
11546       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11547         return non_lvalue (fold_convert (type, arg1));
11548       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11549           /* Preserve sequence points.  */
11550           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11551         return non_lvalue (fold_convert (type, arg0));
11552       /* If second arg is constant zero, result is zero, but first arg
11553          must be evaluated.  */
11554       if (integer_zerop (arg1))
11555         return omit_one_operand (type, arg1, arg0);
11556       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11557          case will be handled here.  */
11558       if (integer_zerop (arg0))
11559         return omit_one_operand (type, arg0, arg1);
11560
11561       /* !X && X is always false.  */
11562       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11563           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11564         return omit_one_operand (type, integer_zero_node, arg1);
11565       /* X && !X is always false.  */
11566       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11567           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11568         return omit_one_operand (type, integer_zero_node, arg0);
11569
11570       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
11571          means A >= Y && A != MAX, but in this case we know that
11572          A < X <= MAX.  */
11573
11574       if (!TREE_SIDE_EFFECTS (arg0)
11575           && !TREE_SIDE_EFFECTS (arg1))
11576         {
11577           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
11578           if (tem && !operand_equal_p (tem, arg0, 0))
11579             return fold_build2 (code, type, tem, arg1);
11580
11581           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11582           if (tem && !operand_equal_p (tem, arg1, 0))
11583             return fold_build2 (code, type, arg0, tem);
11584         }
11585
11586     truth_andor:
11587       /* We only do these simplifications if we are optimizing.  */
11588       if (!optimize)
11589         return NULL_TREE;
11590
11591       /* Check for things like (A || B) && (A || C).  We can convert this
11592          to A || (B && C).  Note that either operator can be any of the four
11593          truth and/or operations and the transformation will still be
11594          valid.   Also note that we only care about order for the
11595          ANDIF and ORIF operators.  If B contains side effects, this
11596          might change the truth-value of A.  */
11597       if (TREE_CODE (arg0) == TREE_CODE (arg1)
11598           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11599               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11600               || TREE_CODE (arg0) == TRUTH_AND_EXPR
11601               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11602           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11603         {
11604           tree a00 = TREE_OPERAND (arg0, 0);
11605           tree a01 = TREE_OPERAND (arg0, 1);
11606           tree a10 = TREE_OPERAND (arg1, 0);
11607           tree a11 = TREE_OPERAND (arg1, 1);
11608           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11609                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11610                              && (code == TRUTH_AND_EXPR
11611                                  || code == TRUTH_OR_EXPR));
11612
11613           if (operand_equal_p (a00, a10, 0))
11614             return fold_build2 (TREE_CODE (arg0), type, a00,
11615                                 fold_build2 (code, type, a01, a11));
11616           else if (commutative && operand_equal_p (a00, a11, 0))
11617             return fold_build2 (TREE_CODE (arg0), type, a00,
11618                                 fold_build2 (code, type, a01, a10));
11619           else if (commutative && operand_equal_p (a01, a10, 0))
11620             return fold_build2 (TREE_CODE (arg0), type, a01,
11621                                 fold_build2 (code, type, a00, a11));
11622
11623           /* This case if tricky because we must either have commutative
11624              operators or else A10 must not have side-effects.  */
11625
11626           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11627                    && operand_equal_p (a01, a11, 0))
11628             return fold_build2 (TREE_CODE (arg0), type,
11629                                 fold_build2 (code, type, a00, a10),
11630                                 a01);
11631         }
11632
11633       /* See if we can build a range comparison.  */
11634       if (0 != (tem = fold_range_test (code, type, op0, op1)))
11635         return tem;
11636
11637       /* Check for the possibility of merging component references.  If our
11638          lhs is another similar operation, try to merge its rhs with our
11639          rhs.  Then try to merge our lhs and rhs.  */
11640       if (TREE_CODE (arg0) == code
11641           && 0 != (tem = fold_truthop (code, type,
11642                                        TREE_OPERAND (arg0, 1), arg1)))
11643         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11644
11645       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11646         return tem;
11647
11648       return NULL_TREE;
11649
11650     case TRUTH_ORIF_EXPR:
11651       /* Note that the operands of this must be ints
11652          and their values must be 0 or true.
11653          ("true" is a fixed value perhaps depending on the language.)  */
11654       /* If first arg is constant true, return it.  */
11655       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11656         return fold_convert (type, arg0);
11657     case TRUTH_OR_EXPR:
11658       /* If either arg is constant zero, drop it.  */
11659       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11660         return non_lvalue (fold_convert (type, arg1));
11661       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11662           /* Preserve sequence points.  */
11663           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11664         return non_lvalue (fold_convert (type, arg0));
11665       /* If second arg is constant true, result is true, but we must
11666          evaluate first arg.  */
11667       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11668         return omit_one_operand (type, arg1, arg0);
11669       /* Likewise for first arg, but note this only occurs here for
11670          TRUTH_OR_EXPR.  */
11671       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11672         return omit_one_operand (type, arg0, arg1);
11673
11674       /* !X || X is always true.  */
11675       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11676           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11677         return omit_one_operand (type, integer_one_node, arg1);
11678       /* X || !X is always true.  */
11679       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11680           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11681         return omit_one_operand (type, integer_one_node, arg0);
11682
11683       goto truth_andor;
11684
11685     case TRUTH_XOR_EXPR:
11686       /* If the second arg is constant zero, drop it.  */
11687       if (integer_zerop (arg1))
11688         return non_lvalue (fold_convert (type, arg0));
11689       /* If the second arg is constant true, this is a logical inversion.  */
11690       if (integer_onep (arg1))
11691         {
11692           /* Only call invert_truthvalue if operand is a truth value.  */
11693           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11694             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11695           else
11696             tem = invert_truthvalue (arg0);
11697           return non_lvalue (fold_convert (type, tem));
11698         }
11699       /* Identical arguments cancel to zero.  */
11700       if (operand_equal_p (arg0, arg1, 0))
11701         return omit_one_operand (type, integer_zero_node, arg0);
11702
11703       /* !X ^ X is always true.  */
11704       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11705           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11706         return omit_one_operand (type, integer_one_node, arg1);
11707
11708       /* X ^ !X is always true.  */
11709       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11710           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11711         return omit_one_operand (type, integer_one_node, arg0);
11712
11713       return NULL_TREE;
11714
11715     case EQ_EXPR:
11716     case NE_EXPR:
11717       tem = fold_comparison (code, type, op0, op1);
11718       if (tem != NULL_TREE)
11719         return tem;
11720
11721       /* bool_var != 0 becomes bool_var. */
11722       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11723           && code == NE_EXPR)
11724         return non_lvalue (fold_convert (type, arg0));
11725
11726       /* bool_var == 1 becomes bool_var. */
11727       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11728           && code == EQ_EXPR)
11729         return non_lvalue (fold_convert (type, arg0));
11730
11731       /* bool_var != 1 becomes !bool_var. */
11732       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11733           && code == NE_EXPR)
11734         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11735
11736       /* bool_var == 0 becomes !bool_var. */
11737       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11738           && code == EQ_EXPR)
11739         return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11740
11741       /* If this is an equality comparison of the address of two non-weak,
11742          unaliased symbols neither of which are extern (since we do not
11743          have access to attributes for externs), then we know the result.  */
11744       if (TREE_CODE (arg0) == ADDR_EXPR
11745           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11746           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11747           && ! lookup_attribute ("alias",
11748                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11749           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11750           && TREE_CODE (arg1) == ADDR_EXPR
11751           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11752           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11753           && ! lookup_attribute ("alias",
11754                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11755           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11756         {
11757           /* We know that we're looking at the address of two
11758              non-weak, unaliased, static _DECL nodes.
11759
11760              It is both wasteful and incorrect to call operand_equal_p
11761              to compare the two ADDR_EXPR nodes.  It is wasteful in that
11762              all we need to do is test pointer equality for the arguments
11763              to the two ADDR_EXPR nodes.  It is incorrect to use
11764              operand_equal_p as that function is NOT equivalent to a
11765              C equality test.  It can in fact return false for two
11766              objects which would test as equal using the C equality
11767              operator.  */
11768           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11769           return constant_boolean_node (equal
11770                                         ? code == EQ_EXPR : code != EQ_EXPR,
11771                                         type);
11772         }
11773
11774       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11775          a MINUS_EXPR of a constant, we can convert it into a comparison with
11776          a revised constant as long as no overflow occurs.  */
11777       if (TREE_CODE (arg1) == INTEGER_CST
11778           && (TREE_CODE (arg0) == PLUS_EXPR
11779               || TREE_CODE (arg0) == MINUS_EXPR)
11780           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11781           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11782                                       ? MINUS_EXPR : PLUS_EXPR,
11783                                       fold_convert (TREE_TYPE (arg0), arg1),
11784                                       TREE_OPERAND (arg0, 1), 0))
11785           && !TREE_OVERFLOW (tem))
11786         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11787
11788       /* Similarly for a NEGATE_EXPR.  */
11789       if (TREE_CODE (arg0) == NEGATE_EXPR
11790           && TREE_CODE (arg1) == INTEGER_CST
11791           && 0 != (tem = negate_expr (arg1))
11792           && TREE_CODE (tem) == INTEGER_CST
11793           && !TREE_OVERFLOW (tem))
11794         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11795
11796       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
11797       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11798           && TREE_CODE (arg1) == INTEGER_CST
11799           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11800         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11801                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11802                                          fold_convert (TREE_TYPE (arg0), arg1),
11803                                          TREE_OPERAND (arg0, 1)));
11804
11805       /* Transform comparisons of the form X +- C CMP X.  */
11806       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11807           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11808           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11809           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11810               || POINTER_TYPE_P (TREE_TYPE (arg0))))
11811         {
11812           tree cst = TREE_OPERAND (arg0, 1);
11813
11814           if (code == EQ_EXPR
11815               && !integer_zerop (cst))
11816             return omit_two_operands (type, boolean_false_node,
11817                                       TREE_OPERAND (arg0, 0), arg1);
11818           else
11819             return omit_two_operands (type, boolean_true_node,
11820                                       TREE_OPERAND (arg0, 0), arg1);
11821         }
11822
11823       /* If we have X - Y == 0, we can convert that to X == Y and similarly
11824          for !=.  Don't do this for ordered comparisons due to overflow.  */
11825       if (TREE_CODE (arg0) == MINUS_EXPR
11826           && integer_zerop (arg1))
11827         return fold_build2 (code, type,
11828                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11829
11830       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
11831       if (TREE_CODE (arg0) == ABS_EXPR
11832           && (integer_zerop (arg1) || real_zerop (arg1)))
11833         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11834
11835       /* If this is an EQ or NE comparison with zero and ARG0 is
11836          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
11837          two operations, but the latter can be done in one less insn
11838          on machines that have only two-operand insns or on which a
11839          constant cannot be the first operand.  */
11840       if (TREE_CODE (arg0) == BIT_AND_EXPR
11841           && integer_zerop (arg1))
11842         {
11843           tree arg00 = TREE_OPERAND (arg0, 0);
11844           tree arg01 = TREE_OPERAND (arg0, 1);
11845           if (TREE_CODE (arg00) == LSHIFT_EXPR
11846               && integer_onep (TREE_OPERAND (arg00, 0)))
11847             {
11848               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11849                                       arg01, TREE_OPERAND (arg00, 1));
11850               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11851                                  build_int_cst (TREE_TYPE (arg0), 1));
11852               return fold_build2 (code, type,
11853                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11854             }
11855           else if (TREE_CODE (arg01) == LSHIFT_EXPR
11856                    && integer_onep (TREE_OPERAND (arg01, 0)))
11857             {
11858               tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11859                                       arg00, TREE_OPERAND (arg01, 1));
11860               tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11861                                  build_int_cst (TREE_TYPE (arg0), 1));
11862               return fold_build2 (code, type,
11863                                   fold_convert (TREE_TYPE (arg1), tem), arg1);
11864             }
11865         }
11866
11867       /* If this is an NE or EQ comparison of zero against the result of a
11868          signed MOD operation whose second operand is a power of 2, make
11869          the MOD operation unsigned since it is simpler and equivalent.  */
11870       if (integer_zerop (arg1)
11871           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11872           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11873               || TREE_CODE (arg0) == CEIL_MOD_EXPR
11874               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11875               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11876           && integer_pow2p (TREE_OPERAND (arg0, 1)))
11877         {
11878           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11879           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11880                                      fold_convert (newtype,
11881                                                    TREE_OPERAND (arg0, 0)),
11882                                      fold_convert (newtype,
11883                                                    TREE_OPERAND (arg0, 1)));
11884
11885           return fold_build2 (code, type, newmod,
11886                               fold_convert (newtype, arg1));
11887         }
11888
11889       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11890          C1 is a valid shift constant, and C2 is a power of two, i.e.
11891          a single bit.  */
11892       if (TREE_CODE (arg0) == BIT_AND_EXPR
11893           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11894           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11895              == INTEGER_CST
11896           && integer_pow2p (TREE_OPERAND (arg0, 1))
11897           && integer_zerop (arg1))
11898         {
11899           tree itype = TREE_TYPE (arg0);
11900           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11901           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11902
11903           /* Check for a valid shift count.  */
11904           if (TREE_INT_CST_HIGH (arg001) == 0
11905               && TREE_INT_CST_LOW (arg001) < prec)
11906             {
11907               tree arg01 = TREE_OPERAND (arg0, 1);
11908               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11909               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11910               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11911                  can be rewritten as (X & (C2 << C1)) != 0.  */
11912               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11913                 {
11914                   tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11915                   tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11916                   return fold_build2 (code, type, tem, arg1);
11917                 }
11918               /* Otherwise, for signed (arithmetic) shifts,
11919                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11920                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
11921               else if (!TYPE_UNSIGNED (itype))
11922                 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11923                                     arg000, build_int_cst (itype, 0));
11924               /* Otherwise, of unsigned (logical) shifts,
11925                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11926                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
11927               else
11928                 return omit_one_operand (type,
11929                                          code == EQ_EXPR ? integer_one_node
11930                                                          : integer_zero_node,
11931                                          arg000);
11932             }
11933         }
11934
11935       /* If this is an NE comparison of zero with an AND of one, remove the
11936          comparison since the AND will give the correct value.  */
11937       if (code == NE_EXPR
11938           && integer_zerop (arg1)
11939           && TREE_CODE (arg0) == BIT_AND_EXPR
11940           && integer_onep (TREE_OPERAND (arg0, 1)))
11941         return fold_convert (type, arg0);
11942
11943       /* If we have (A & C) == C where C is a power of 2, convert this into
11944          (A & C) != 0.  Similarly for NE_EXPR.  */
11945       if (TREE_CODE (arg0) == BIT_AND_EXPR
11946           && integer_pow2p (TREE_OPERAND (arg0, 1))
11947           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11948         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11949                             arg0, fold_convert (TREE_TYPE (arg0),
11950                                                 integer_zero_node));
11951
11952       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11953          bit, then fold the expression into A < 0 or A >= 0.  */
11954       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11955       if (tem)
11956         return tem;
11957
11958       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11959          Similarly for NE_EXPR.  */
11960       if (TREE_CODE (arg0) == BIT_AND_EXPR
11961           && TREE_CODE (arg1) == INTEGER_CST
11962           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11963         {
11964           tree notc = fold_build1 (BIT_NOT_EXPR,
11965                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
11966                                    TREE_OPERAND (arg0, 1));
11967           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11968                                        arg1, notc);
11969           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11970           if (integer_nonzerop (dandnotc))
11971             return omit_one_operand (type, rslt, arg0);
11972         }
11973
11974       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11975          Similarly for NE_EXPR.  */
11976       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11977           && TREE_CODE (arg1) == INTEGER_CST
11978           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11979         {
11980           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11981           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11982                                        TREE_OPERAND (arg0, 1), notd);
11983           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11984           if (integer_nonzerop (candnotd))
11985             return omit_one_operand (type, rslt, arg0);
11986         }
11987
11988       /* Optimize comparisons of strlen vs zero to a compare of the
11989          first character of the string vs zero.  To wit,
11990                 strlen(ptr) == 0   =>  *ptr == 0
11991                 strlen(ptr) != 0   =>  *ptr != 0
11992          Other cases should reduce to one of these two (or a constant)
11993          due to the return value of strlen being unsigned.  */
11994       if (TREE_CODE (arg0) == CALL_EXPR
11995           && integer_zerop (arg1))
11996         {
11997           tree fndecl = get_callee_fndecl (arg0);
11998
11999           if (fndecl
12000               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12001               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12002               && call_expr_nargs (arg0) == 1
12003               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12004             {
12005               tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
12006               return fold_build2 (code, type, iref,
12007                                   build_int_cst (TREE_TYPE (iref), 0));
12008             }
12009         }
12010
12011       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12012          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12013       if (TREE_CODE (arg0) == RSHIFT_EXPR
12014           && integer_zerop (arg1)
12015           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12016         {
12017           tree arg00 = TREE_OPERAND (arg0, 0);
12018           tree arg01 = TREE_OPERAND (arg0, 1);
12019           tree itype = TREE_TYPE (arg00);
12020           if (TREE_INT_CST_HIGH (arg01) == 0
12021               && TREE_INT_CST_LOW (arg01)
12022                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12023             {
12024               if (TYPE_UNSIGNED (itype))
12025                 {
12026                   itype = signed_type_for (itype);
12027                   arg00 = fold_convert (itype, arg00);
12028                 }
12029               return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12030                                   type, arg00, build_int_cst (itype, 0));
12031             }
12032         }
12033
12034       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12035       if (integer_zerop (arg1)
12036           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12037         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12038                             TREE_OPERAND (arg0, 1));
12039
12040       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12041       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12042           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12043         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12044                             build_int_cst (TREE_TYPE (arg1), 0));
12045       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12046       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12047           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12048           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12049         return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
12050                             build_int_cst (TREE_TYPE (arg1), 0));
12051
12052       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12053       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12054           && TREE_CODE (arg1) == INTEGER_CST
12055           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12056         return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
12057                             fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
12058                                          TREE_OPERAND (arg0, 1), arg1));
12059
12060       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12061          (X & C) == 0 when C is a single bit.  */
12062       if (TREE_CODE (arg0) == BIT_AND_EXPR
12063           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12064           && integer_zerop (arg1)
12065           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12066         {
12067           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
12068                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12069                              TREE_OPERAND (arg0, 1));
12070           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12071                               type, tem, arg1);
12072         }
12073
12074       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12075          constant C is a power of two, i.e. a single bit.  */
12076       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12077           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12078           && integer_zerop (arg1)
12079           && integer_pow2p (TREE_OPERAND (arg0, 1))
12080           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12081                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12082         {
12083           tree arg00 = TREE_OPERAND (arg0, 0);
12084           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12085                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
12086         }
12087
12088       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12089          when is C is a power of two, i.e. a single bit.  */
12090       if (TREE_CODE (arg0) == BIT_AND_EXPR
12091           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12092           && integer_zerop (arg1)
12093           && integer_pow2p (TREE_OPERAND (arg0, 1))
12094           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12095                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12096         {
12097           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12098           tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
12099                              arg000, TREE_OPERAND (arg0, 1));
12100           return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12101                               tem, build_int_cst (TREE_TYPE (tem), 0));
12102         }
12103
12104       if (integer_zerop (arg1)
12105           && tree_expr_nonzero_p (arg0))
12106         {
12107           tree res = constant_boolean_node (code==NE_EXPR, type);
12108           return omit_one_operand (type, res, arg0);
12109         }
12110
12111       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12112       if (TREE_CODE (arg0) == NEGATE_EXPR
12113           && TREE_CODE (arg1) == NEGATE_EXPR)
12114         return fold_build2 (code, type,
12115                             TREE_OPERAND (arg0, 0),
12116                             TREE_OPERAND (arg1, 0));
12117
12118       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12119       if (TREE_CODE (arg0) == BIT_AND_EXPR
12120           && TREE_CODE (arg1) == BIT_AND_EXPR)
12121         {
12122           tree arg00 = TREE_OPERAND (arg0, 0);
12123           tree arg01 = TREE_OPERAND (arg0, 1);
12124           tree arg10 = TREE_OPERAND (arg1, 0);
12125           tree arg11 = TREE_OPERAND (arg1, 1);
12126           tree itype = TREE_TYPE (arg0);
12127
12128           if (operand_equal_p (arg01, arg11, 0))
12129             return fold_build2 (code, type,
12130                                 fold_build2 (BIT_AND_EXPR, itype,
12131                                              fold_build2 (BIT_XOR_EXPR, itype,
12132                                                           arg00, arg10),
12133                                              arg01),
12134                                 build_int_cst (itype, 0));
12135
12136           if (operand_equal_p (arg01, arg10, 0))
12137             return fold_build2 (code, type,
12138                                 fold_build2 (BIT_AND_EXPR, itype,
12139                                              fold_build2 (BIT_XOR_EXPR, itype,
12140                                                           arg00, arg11),
12141                                              arg01),
12142                                 build_int_cst (itype, 0));
12143
12144           if (operand_equal_p (arg00, arg11, 0))
12145             return fold_build2 (code, type,
12146                                 fold_build2 (BIT_AND_EXPR, itype,
12147                                              fold_build2 (BIT_XOR_EXPR, itype,
12148                                                           arg01, arg10),
12149                                              arg00),
12150                                 build_int_cst (itype, 0));
12151
12152           if (operand_equal_p (arg00, arg10, 0))
12153             return fold_build2 (code, type,
12154                                 fold_build2 (BIT_AND_EXPR, itype,
12155                                              fold_build2 (BIT_XOR_EXPR, itype,
12156                                                           arg01, arg11),
12157                                              arg00),
12158                                 build_int_cst (itype, 0));
12159         }
12160
12161       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12162           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12163         {
12164           tree arg00 = TREE_OPERAND (arg0, 0);
12165           tree arg01 = TREE_OPERAND (arg0, 1);
12166           tree arg10 = TREE_OPERAND (arg1, 0);
12167           tree arg11 = TREE_OPERAND (arg1, 1);
12168           tree itype = TREE_TYPE (arg0);
12169
12170           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12171              operand_equal_p guarantees no side-effects so we don't need
12172              to use omit_one_operand on Z.  */
12173           if (operand_equal_p (arg01, arg11, 0))
12174             return fold_build2 (code, type, arg00, arg10);
12175           if (operand_equal_p (arg01, arg10, 0))
12176             return fold_build2 (code, type, arg00, arg11);
12177           if (operand_equal_p (arg00, arg11, 0))
12178             return fold_build2 (code, type, arg01, arg10);
12179           if (operand_equal_p (arg00, arg10, 0))
12180             return fold_build2 (code, type, arg01, arg11);
12181
12182           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12183           if (TREE_CODE (arg01) == INTEGER_CST
12184               && TREE_CODE (arg11) == INTEGER_CST)
12185             return fold_build2 (code, type,
12186                                 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12187                                              fold_build2 (BIT_XOR_EXPR, itype,
12188                                                           arg01, arg11)),
12189                                 arg10);
12190         }
12191
12192       /* Attempt to simplify equality/inequality comparisons of complex
12193          values.  Only lower the comparison if the result is known or
12194          can be simplified to a single scalar comparison.  */
12195       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12196            || TREE_CODE (arg0) == COMPLEX_CST)
12197           && (TREE_CODE (arg1) == COMPLEX_EXPR
12198               || TREE_CODE (arg1) == COMPLEX_CST))
12199         {
12200           tree real0, imag0, real1, imag1;
12201           tree rcond, icond;
12202
12203           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12204             {
12205               real0 = TREE_OPERAND (arg0, 0);
12206               imag0 = TREE_OPERAND (arg0, 1);
12207             }
12208           else
12209             {
12210               real0 = TREE_REALPART (arg0);
12211               imag0 = TREE_IMAGPART (arg0);
12212             }
12213
12214           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12215             {
12216               real1 = TREE_OPERAND (arg1, 0);
12217               imag1 = TREE_OPERAND (arg1, 1);
12218             }
12219           else
12220             {
12221               real1 = TREE_REALPART (arg1);
12222               imag1 = TREE_IMAGPART (arg1);
12223             }
12224
12225           rcond = fold_binary (code, type, real0, real1);
12226           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12227             {
12228               if (integer_zerop (rcond))
12229                 {
12230                   if (code == EQ_EXPR)
12231                     return omit_two_operands (type, boolean_false_node,
12232                                               imag0, imag1);
12233                   return fold_build2 (NE_EXPR, type, imag0, imag1);
12234                 }
12235               else
12236                 {
12237                   if (code == NE_EXPR)
12238                     return omit_two_operands (type, boolean_true_node,
12239                                               imag0, imag1);
12240                   return fold_build2 (EQ_EXPR, type, imag0, imag1);
12241                 }
12242             }
12243
12244           icond = fold_binary (code, type, imag0, imag1);
12245           if (icond && TREE_CODE (icond) == INTEGER_CST)
12246             {
12247               if (integer_zerop (icond))
12248                 {
12249                   if (code == EQ_EXPR)
12250                     return omit_two_operands (type, boolean_false_node,
12251                                               real0, real1);
12252                   return fold_build2 (NE_EXPR, type, real0, real1);
12253                 }
12254               else
12255                 {
12256                   if (code == NE_EXPR)
12257                     return omit_two_operands (type, boolean_true_node,
12258                                               real0, real1);
12259                   return fold_build2 (EQ_EXPR, type, real0, real1);
12260                 }
12261             }
12262         }
12263
12264       return NULL_TREE;
12265
12266     case LT_EXPR:
12267     case GT_EXPR:
12268     case LE_EXPR:
12269     case GE_EXPR:
12270       tem = fold_comparison (code, type, op0, op1);
12271       if (tem != NULL_TREE)
12272         return tem;
12273
12274       /* Transform comparisons of the form X +- C CMP X.  */
12275       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12276           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12277           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12278                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12279               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12280                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12281         {
12282           tree arg01 = TREE_OPERAND (arg0, 1);
12283           enum tree_code code0 = TREE_CODE (arg0);
12284           int is_positive;
12285
12286           if (TREE_CODE (arg01) == REAL_CST)
12287             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12288           else
12289             is_positive = tree_int_cst_sgn (arg01);
12290
12291           /* (X - c) > X becomes false.  */
12292           if (code == GT_EXPR
12293               && ((code0 == MINUS_EXPR && is_positive >= 0)
12294                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12295             {
12296               if (TREE_CODE (arg01) == INTEGER_CST
12297                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12298                 fold_overflow_warning (("assuming signed overflow does not "
12299                                         "occur when assuming that (X - c) > X "
12300                                         "is always false"),
12301                                        WARN_STRICT_OVERFLOW_ALL);
12302               return constant_boolean_node (0, type);
12303             }
12304
12305           /* Likewise (X + c) < X becomes false.  */
12306           if (code == LT_EXPR
12307               && ((code0 == PLUS_EXPR && is_positive >= 0)
12308                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12309             {
12310               if (TREE_CODE (arg01) == INTEGER_CST
12311                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12312                 fold_overflow_warning (("assuming signed overflow does not "
12313                                         "occur when assuming that "
12314                                         "(X + c) < X is always false"),
12315                                        WARN_STRICT_OVERFLOW_ALL);
12316               return constant_boolean_node (0, type);
12317             }
12318
12319           /* Convert (X - c) <= X to true.  */
12320           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12321               && code == LE_EXPR
12322               && ((code0 == MINUS_EXPR && is_positive >= 0)
12323                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12324             {
12325               if (TREE_CODE (arg01) == INTEGER_CST
12326                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12327                 fold_overflow_warning (("assuming signed overflow does not "
12328                                         "occur when assuming that "
12329                                         "(X - c) <= X is always true"),
12330                                        WARN_STRICT_OVERFLOW_ALL);
12331               return constant_boolean_node (1, type);
12332             }
12333
12334           /* Convert (X + c) >= X to true.  */
12335           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12336               && code == GE_EXPR
12337               && ((code0 == PLUS_EXPR && is_positive >= 0)
12338                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12339             {
12340               if (TREE_CODE (arg01) == INTEGER_CST
12341                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12342                 fold_overflow_warning (("assuming signed overflow does not "
12343                                         "occur when assuming that "
12344                                         "(X + c) >= X is always true"),
12345                                        WARN_STRICT_OVERFLOW_ALL);
12346               return constant_boolean_node (1, type);
12347             }
12348
12349           if (TREE_CODE (arg01) == INTEGER_CST)
12350             {
12351               /* Convert X + c > X and X - c < X to true for integers.  */
12352               if (code == GT_EXPR
12353                   && ((code0 == PLUS_EXPR && is_positive > 0)
12354                       || (code0 == MINUS_EXPR && is_positive < 0)))
12355                 {
12356                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12357                     fold_overflow_warning (("assuming signed overflow does "
12358                                             "not occur when assuming that "
12359                                             "(X + c) > X is always true"),
12360                                            WARN_STRICT_OVERFLOW_ALL);
12361                   return constant_boolean_node (1, type);
12362                 }
12363
12364               if (code == LT_EXPR
12365                   && ((code0 == MINUS_EXPR && is_positive > 0)
12366                       || (code0 == PLUS_EXPR && is_positive < 0)))
12367                 {
12368                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12369                     fold_overflow_warning (("assuming signed overflow does "
12370                                             "not occur when assuming that "
12371                                             "(X - c) < X is always true"),
12372                                            WARN_STRICT_OVERFLOW_ALL);
12373                   return constant_boolean_node (1, type);
12374                 }
12375
12376               /* Convert X + c <= X and X - c >= X to false for integers.  */
12377               if (code == LE_EXPR
12378                   && ((code0 == PLUS_EXPR && is_positive > 0)
12379                       || (code0 == MINUS_EXPR && is_positive < 0)))
12380                 {
12381                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12382                     fold_overflow_warning (("assuming signed overflow does "
12383                                             "not occur when assuming that "
12384                                             "(X + c) <= X is always false"),
12385                                            WARN_STRICT_OVERFLOW_ALL);
12386                   return constant_boolean_node (0, type);
12387                 }
12388
12389               if (code == GE_EXPR
12390                   && ((code0 == MINUS_EXPR && is_positive > 0)
12391                       || (code0 == PLUS_EXPR && is_positive < 0)))
12392                 {
12393                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12394                     fold_overflow_warning (("assuming signed overflow does "
12395                                             "not occur when assuming that "
12396                                             "(X - c) >= X is always false"),
12397                                            WARN_STRICT_OVERFLOW_ALL);
12398                   return constant_boolean_node (0, type);
12399                 }
12400             }
12401         }
12402
12403       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
12404          This transformation affects the cases which are handled in later
12405          optimizations involving comparisons with non-negative constants.  */
12406       if (TREE_CODE (arg1) == INTEGER_CST
12407           && TREE_CODE (arg0) != INTEGER_CST
12408           && tree_int_cst_sgn (arg1) > 0)
12409         {
12410           if (code == GE_EXPR)
12411             {
12412               arg1 = const_binop (MINUS_EXPR, arg1,
12413                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12414               return fold_build2 (GT_EXPR, type, arg0,
12415                                   fold_convert (TREE_TYPE (arg0), arg1));
12416             }
12417           if (code == LT_EXPR)
12418             {
12419               arg1 = const_binop (MINUS_EXPR, arg1,
12420                                   build_int_cst (TREE_TYPE (arg1), 1), 0);
12421               return fold_build2 (LE_EXPR, type, arg0,
12422                                   fold_convert (TREE_TYPE (arg0), arg1));
12423             }
12424         }
12425
12426       /* Comparisons with the highest or lowest possible integer of
12427          the specified precision will have known values.  */
12428       {
12429         tree arg1_type = TREE_TYPE (arg1);
12430         unsigned int width = TYPE_PRECISION (arg1_type);
12431
12432         if (TREE_CODE (arg1) == INTEGER_CST
12433             && !TREE_OVERFLOW (arg1)
12434             && width <= 2 * HOST_BITS_PER_WIDE_INT
12435             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12436           {
12437             HOST_WIDE_INT signed_max_hi;
12438             unsigned HOST_WIDE_INT signed_max_lo;
12439             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12440
12441             if (width <= HOST_BITS_PER_WIDE_INT)
12442               {
12443                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12444                                 - 1;
12445                 signed_max_hi = 0;
12446                 max_hi = 0;
12447
12448                 if (TYPE_UNSIGNED (arg1_type))
12449                   {
12450                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12451                     min_lo = 0;
12452                     min_hi = 0;
12453                   }
12454                 else
12455                   {
12456                     max_lo = signed_max_lo;
12457                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12458                     min_hi = -1;
12459                   }
12460               }
12461             else
12462               {
12463                 width -= HOST_BITS_PER_WIDE_INT;
12464                 signed_max_lo = -1;
12465                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12466                                 - 1;
12467                 max_lo = -1;
12468                 min_lo = 0;
12469
12470                 if (TYPE_UNSIGNED (arg1_type))
12471                   {
12472                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12473                     min_hi = 0;
12474                   }
12475                 else
12476                   {
12477                     max_hi = signed_max_hi;
12478                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12479                   }
12480               }
12481
12482             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12483                 && TREE_INT_CST_LOW (arg1) == max_lo)
12484               switch (code)
12485                 {
12486                 case GT_EXPR:
12487                   return omit_one_operand (type, integer_zero_node, arg0);
12488
12489                 case GE_EXPR:
12490                   return fold_build2 (EQ_EXPR, type, op0, op1);
12491
12492                 case LE_EXPR:
12493                   return omit_one_operand (type, integer_one_node, arg0);
12494
12495                 case LT_EXPR:
12496                   return fold_build2 (NE_EXPR, type, op0, op1);
12497
12498                 /* The GE_EXPR and LT_EXPR cases above are not normally
12499                    reached because of previous transformations.  */
12500
12501                 default:
12502                   break;
12503                 }
12504             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12505                      == max_hi
12506                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12507               switch (code)
12508                 {
12509                 case GT_EXPR:
12510                   arg1 = const_binop (PLUS_EXPR, arg1,
12511                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12512                   return fold_build2 (EQ_EXPR, type,
12513                                       fold_convert (TREE_TYPE (arg1), arg0),
12514                                       arg1);
12515                 case LE_EXPR:
12516                   arg1 = const_binop (PLUS_EXPR, arg1,
12517                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
12518                   return fold_build2 (NE_EXPR, type,
12519                                       fold_convert (TREE_TYPE (arg1), arg0),
12520                                       arg1);
12521                 default:
12522                   break;
12523                 }
12524             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12525                      == min_hi
12526                      && TREE_INT_CST_LOW (arg1) == min_lo)
12527               switch (code)
12528                 {
12529                 case LT_EXPR:
12530                   return omit_one_operand (type, integer_zero_node, arg0);
12531
12532                 case LE_EXPR:
12533                   return fold_build2 (EQ_EXPR, type, op0, op1);
12534
12535                 case GE_EXPR:
12536                   return omit_one_operand (type, integer_one_node, arg0);
12537
12538                 case GT_EXPR:
12539                   return fold_build2 (NE_EXPR, type, op0, op1);
12540
12541                 default:
12542                   break;
12543                 }
12544             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12545                      == min_hi
12546                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12547               switch (code)
12548                 {
12549                 case GE_EXPR:
12550                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12551                   return fold_build2 (NE_EXPR, type,
12552                                       fold_convert (TREE_TYPE (arg1), arg0),
12553                                       arg1);
12554                 case LT_EXPR:
12555                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12556                   return fold_build2 (EQ_EXPR, type,
12557                                       fold_convert (TREE_TYPE (arg1), arg0),
12558                                       arg1);
12559                 default:
12560                   break;
12561                 }
12562
12563             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
12564                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
12565                      && TYPE_UNSIGNED (arg1_type)
12566                      /* We will flip the signedness of the comparison operator
12567                         associated with the mode of arg1, so the sign bit is
12568                         specified by this mode.  Check that arg1 is the signed
12569                         max associated with this sign bit.  */
12570                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12571                      /* signed_type does not work on pointer types.  */
12572                      && INTEGRAL_TYPE_P (arg1_type))
12573               {
12574                 /* The following case also applies to X < signed_max+1
12575                    and X >= signed_max+1 because previous transformations.  */
12576                 if (code == LE_EXPR || code == GT_EXPR)
12577                   {
12578                     tree st;
12579                     st = signed_type_for (TREE_TYPE (arg1));
12580                     return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12581                                         type, fold_convert (st, arg0),
12582                                         build_int_cst (st, 0));
12583                   }
12584               }
12585           }
12586       }
12587
12588       /* If we are comparing an ABS_EXPR with a constant, we can
12589          convert all the cases into explicit comparisons, but they may
12590          well not be faster than doing the ABS and one comparison.
12591          But ABS (X) <= C is a range comparison, which becomes a subtraction
12592          and a comparison, and is probably faster.  */
12593       if (code == LE_EXPR
12594           && TREE_CODE (arg1) == INTEGER_CST
12595           && TREE_CODE (arg0) == ABS_EXPR
12596           && ! TREE_SIDE_EFFECTS (arg0)
12597           && (0 != (tem = negate_expr (arg1)))
12598           && TREE_CODE (tem) == INTEGER_CST
12599           && !TREE_OVERFLOW (tem))
12600         return fold_build2 (TRUTH_ANDIF_EXPR, type,
12601                             build2 (GE_EXPR, type,
12602                                     TREE_OPERAND (arg0, 0), tem),
12603                             build2 (LE_EXPR, type,
12604                                     TREE_OPERAND (arg0, 0), arg1));
12605
12606       /* Convert ABS_EXPR<x> >= 0 to true.  */
12607       strict_overflow_p = false;
12608       if (code == GE_EXPR
12609           && (integer_zerop (arg1)
12610               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12611                   && real_zerop (arg1)))
12612           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12613         {
12614           if (strict_overflow_p)
12615             fold_overflow_warning (("assuming signed overflow does not occur "
12616                                     "when simplifying comparison of "
12617                                     "absolute value and zero"),
12618                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12619           return omit_one_operand (type, integer_one_node, arg0);
12620         }
12621
12622       /* Convert ABS_EXPR<x> < 0 to false.  */
12623       strict_overflow_p = false;
12624       if (code == LT_EXPR
12625           && (integer_zerop (arg1) || real_zerop (arg1))
12626           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12627         {
12628           if (strict_overflow_p)
12629             fold_overflow_warning (("assuming signed overflow does not occur "
12630                                     "when simplifying comparison of "
12631                                     "absolute value and zero"),
12632                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
12633           return omit_one_operand (type, integer_zero_node, arg0);
12634         }
12635
12636       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12637          and similarly for >= into !=.  */
12638       if ((code == LT_EXPR || code == GE_EXPR)
12639           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12640           && TREE_CODE (arg1) == LSHIFT_EXPR
12641           && integer_onep (TREE_OPERAND (arg1, 0)))
12642         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12643                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12644                                TREE_OPERAND (arg1, 1)),
12645                        build_int_cst (TREE_TYPE (arg0), 0));
12646
12647       if ((code == LT_EXPR || code == GE_EXPR)
12648           && TYPE_UNSIGNED (TREE_TYPE (arg0))
12649           && (TREE_CODE (arg1) == NOP_EXPR
12650               || TREE_CODE (arg1) == CONVERT_EXPR)
12651           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12652           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12653         return
12654           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12655                   fold_convert (TREE_TYPE (arg0),
12656                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12657                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
12658                                                       1))),
12659                   build_int_cst (TREE_TYPE (arg0), 0));
12660
12661       return NULL_TREE;
12662
12663     case UNORDERED_EXPR:
12664     case ORDERED_EXPR:
12665     case UNLT_EXPR:
12666     case UNLE_EXPR:
12667     case UNGT_EXPR:
12668     case UNGE_EXPR:
12669     case UNEQ_EXPR:
12670     case LTGT_EXPR:
12671       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12672         {
12673           t1 = fold_relational_const (code, type, arg0, arg1);
12674           if (t1 != NULL_TREE)
12675             return t1;
12676         }
12677
12678       /* If the first operand is NaN, the result is constant.  */
12679       if (TREE_CODE (arg0) == REAL_CST
12680           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12681           && (code != LTGT_EXPR || ! flag_trapping_math))
12682         {
12683           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12684                ? integer_zero_node
12685                : integer_one_node;
12686           return omit_one_operand (type, t1, arg1);
12687         }
12688
12689       /* If the second operand is NaN, the result is constant.  */
12690       if (TREE_CODE (arg1) == REAL_CST
12691           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12692           && (code != LTGT_EXPR || ! flag_trapping_math))
12693         {
12694           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12695                ? integer_zero_node
12696                : integer_one_node;
12697           return omit_one_operand (type, t1, arg0);
12698         }
12699
12700       /* Simplify unordered comparison of something with itself.  */
12701       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12702           && operand_equal_p (arg0, arg1, 0))
12703         return constant_boolean_node (1, type);
12704
12705       if (code == LTGT_EXPR
12706           && !flag_trapping_math
12707           && operand_equal_p (arg0, arg1, 0))
12708         return constant_boolean_node (0, type);
12709
12710       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
12711       {
12712         tree targ0 = strip_float_extensions (arg0);
12713         tree targ1 = strip_float_extensions (arg1);
12714         tree newtype = TREE_TYPE (targ0);
12715
12716         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12717           newtype = TREE_TYPE (targ1);
12718
12719         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12720           return fold_build2 (code, type, fold_convert (newtype, targ0),
12721                               fold_convert (newtype, targ1));
12722       }
12723
12724       return NULL_TREE;
12725
12726     case COMPOUND_EXPR:
12727       /* When pedantic, a compound expression can be neither an lvalue
12728          nor an integer constant expression.  */
12729       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12730         return NULL_TREE;
12731       /* Don't let (0, 0) be null pointer constant.  */
12732       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12733                                  : fold_convert (type, arg1);
12734       return pedantic_non_lvalue (tem);
12735
12736     case COMPLEX_EXPR:
12737       if ((TREE_CODE (arg0) == REAL_CST
12738            && TREE_CODE (arg1) == REAL_CST)
12739           || (TREE_CODE (arg0) == INTEGER_CST
12740               && TREE_CODE (arg1) == INTEGER_CST))
12741         return build_complex (type, arg0, arg1);
12742       return NULL_TREE;
12743
12744     case ASSERT_EXPR:
12745       /* An ASSERT_EXPR should never be passed to fold_binary.  */
12746       gcc_unreachable ();
12747
12748     default:
12749       return NULL_TREE;
12750     } /* switch (code) */
12751 }
12752
12753 /* Callback for walk_tree, looking for LABEL_EXPR.
12754    Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12755    Do not check the sub-tree of GOTO_EXPR.  */
12756
12757 static tree
12758 contains_label_1 (tree *tp,
12759                   int *walk_subtrees,
12760                   void *data ATTRIBUTE_UNUSED)
12761 {
12762   switch (TREE_CODE (*tp))
12763     {
12764     case LABEL_EXPR:
12765       return *tp;
12766     case GOTO_EXPR:
12767       *walk_subtrees = 0;
12768     /* no break */
12769     default:
12770       return NULL_TREE;
12771     }
12772 }
12773
12774 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12775    accessible from outside the sub-tree. Returns NULL_TREE if no
12776    addressable label is found.  */
12777
12778 static bool
12779 contains_label_p (tree st)
12780 {
12781   return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12782 }
12783
12784 /* Fold a ternary expression of code CODE and type TYPE with operands
12785    OP0, OP1, and OP2.  Return the folded expression if folding is
12786    successful.  Otherwise, return NULL_TREE.  */
12787
12788 tree
12789 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12790 {
12791   tree tem;
12792   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12793   enum tree_code_class kind = TREE_CODE_CLASS (code);
12794
12795   gcc_assert (IS_EXPR_CODE_CLASS (kind)
12796               && TREE_CODE_LENGTH (code) == 3);
12797
12798   /* Strip any conversions that don't change the mode.  This is safe
12799      for every expression, except for a comparison expression because
12800      its signedness is derived from its operands.  So, in the latter
12801      case, only strip conversions that don't change the signedness.
12802
12803      Note that this is done as an internal manipulation within the
12804      constant folder, in order to find the simplest representation of
12805      the arguments so that their form can be studied.  In any cases,
12806      the appropriate type conversions should be put back in the tree
12807      that will get out of the constant folder.  */
12808   if (op0)
12809     {
12810       arg0 = op0;
12811       STRIP_NOPS (arg0);
12812     }
12813
12814   if (op1)
12815     {
12816       arg1 = op1;
12817       STRIP_NOPS (arg1);
12818     }
12819
12820   switch (code)
12821     {
12822     case COMPONENT_REF:
12823       if (TREE_CODE (arg0) == CONSTRUCTOR
12824           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12825         {
12826           unsigned HOST_WIDE_INT idx;
12827           tree field, value;
12828           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12829             if (field == arg1)
12830               return value;
12831         }
12832       return NULL_TREE;
12833
12834     case COND_EXPR:
12835       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12836          so all simple results must be passed through pedantic_non_lvalue.  */
12837       if (TREE_CODE (arg0) == INTEGER_CST)
12838         {
12839           tree unused_op = integer_zerop (arg0) ? op1 : op2;
12840           tem = integer_zerop (arg0) ? op2 : op1;
12841           /* Only optimize constant conditions when the selected branch
12842              has the same type as the COND_EXPR.  This avoids optimizing
12843              away "c ? x : throw", where the throw has a void type.
12844              Avoid throwing away that operand which contains label.  */
12845           if ((!TREE_SIDE_EFFECTS (unused_op)
12846                || !contains_label_p (unused_op))
12847               && (! VOID_TYPE_P (TREE_TYPE (tem))
12848                   || VOID_TYPE_P (type)))
12849             return pedantic_non_lvalue (tem);
12850           return NULL_TREE;
12851         }
12852       if (operand_equal_p (arg1, op2, 0))
12853         return pedantic_omit_one_operand (type, arg1, arg0);
12854
12855       /* If we have A op B ? A : C, we may be able to convert this to a
12856          simpler expression, depending on the operation and the values
12857          of B and C.  Signed zeros prevent all of these transformations,
12858          for reasons given above each one.
12859
12860          Also try swapping the arguments and inverting the conditional.  */
12861       if (COMPARISON_CLASS_P (arg0)
12862           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12863                                              arg1, TREE_OPERAND (arg0, 1))
12864           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12865         {
12866           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12867           if (tem)
12868             return tem;
12869         }
12870
12871       if (COMPARISON_CLASS_P (arg0)
12872           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12873                                              op2,
12874                                              TREE_OPERAND (arg0, 1))
12875           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12876         {
12877           tem = fold_truth_not_expr (arg0);
12878           if (tem && COMPARISON_CLASS_P (tem))
12879             {
12880               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12881               if (tem)
12882                 return tem;
12883             }
12884         }
12885
12886       /* If the second operand is simpler than the third, swap them
12887          since that produces better jump optimization results.  */
12888       if (truth_value_p (TREE_CODE (arg0))
12889           && tree_swap_operands_p (op1, op2, false))
12890         {
12891           /* See if this can be inverted.  If it can't, possibly because
12892              it was a floating-point inequality comparison, don't do
12893              anything.  */
12894           tem = fold_truth_not_expr (arg0);
12895           if (tem)
12896             return fold_build3 (code, type, tem, op2, op1);
12897         }
12898
12899       /* Convert A ? 1 : 0 to simply A.  */
12900       if (integer_onep (op1)
12901           && integer_zerop (op2)
12902           /* If we try to convert OP0 to our type, the
12903              call to fold will try to move the conversion inside
12904              a COND, which will recurse.  In that case, the COND_EXPR
12905              is probably the best choice, so leave it alone.  */
12906           && type == TREE_TYPE (arg0))
12907         return pedantic_non_lvalue (arg0);
12908
12909       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
12910          over COND_EXPR in cases such as floating point comparisons.  */
12911       if (integer_zerop (op1)
12912           && integer_onep (op2)
12913           && truth_value_p (TREE_CODE (arg0)))
12914         return pedantic_non_lvalue (fold_convert (type,
12915                                                   invert_truthvalue (arg0)));
12916
12917       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
12918       if (TREE_CODE (arg0) == LT_EXPR
12919           && integer_zerop (TREE_OPERAND (arg0, 1))
12920           && integer_zerop (op2)
12921           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12922         {
12923           /* sign_bit_p only checks ARG1 bits within A's precision.
12924              If <sign bit of A> has wider type than A, bits outside
12925              of A's precision in <sign bit of A> need to be checked.
12926              If they are all 0, this optimization needs to be done
12927              in unsigned A's type, if they are all 1 in signed A's type,
12928              otherwise this can't be done.  */
12929           if (TYPE_PRECISION (TREE_TYPE (tem))
12930               < TYPE_PRECISION (TREE_TYPE (arg1))
12931               && TYPE_PRECISION (TREE_TYPE (tem))
12932                  < TYPE_PRECISION (type))
12933             {
12934               unsigned HOST_WIDE_INT mask_lo;
12935               HOST_WIDE_INT mask_hi;
12936               int inner_width, outer_width;
12937               tree tem_type;
12938
12939               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12940               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12941               if (outer_width > TYPE_PRECISION (type))
12942                 outer_width = TYPE_PRECISION (type);
12943
12944               if (outer_width > HOST_BITS_PER_WIDE_INT)
12945                 {
12946                   mask_hi = ((unsigned HOST_WIDE_INT) -1
12947                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12948                   mask_lo = -1;
12949                 }
12950               else
12951                 {
12952                   mask_hi = 0;
12953                   mask_lo = ((unsigned HOST_WIDE_INT) -1
12954                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
12955                 }
12956               if (inner_width > HOST_BITS_PER_WIDE_INT)
12957                 {
12958                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12959                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
12960                   mask_lo = 0;
12961                 }
12962               else
12963                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12964                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
12965
12966               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12967                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12968                 {
12969                   tem_type = signed_type_for (TREE_TYPE (tem));
12970                   tem = fold_convert (tem_type, tem);
12971                 }
12972               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12973                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12974                 {
12975                   tem_type = unsigned_type_for (TREE_TYPE (tem));
12976                   tem = fold_convert (tem_type, tem);
12977                 }
12978               else
12979                 tem = NULL;
12980             }
12981
12982           if (tem)
12983             return fold_convert (type,
12984                                  fold_build2 (BIT_AND_EXPR,
12985                                               TREE_TYPE (tem), tem,
12986                                               fold_convert (TREE_TYPE (tem),
12987                                                             arg1)));
12988         }
12989
12990       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
12991          already handled above.  */
12992       if (TREE_CODE (arg0) == BIT_AND_EXPR
12993           && integer_onep (TREE_OPERAND (arg0, 1))
12994           && integer_zerop (op2)
12995           && integer_pow2p (arg1))
12996         {
12997           tree tem = TREE_OPERAND (arg0, 0);
12998           STRIP_NOPS (tem);
12999           if (TREE_CODE (tem) == RSHIFT_EXPR
13000               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13001               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13002                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13003             return fold_build2 (BIT_AND_EXPR, type,
13004                                 TREE_OPERAND (tem, 0), arg1);
13005         }
13006
13007       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13008          is probably obsolete because the first operand should be a
13009          truth value (that's why we have the two cases above), but let's
13010          leave it in until we can confirm this for all front-ends.  */
13011       if (integer_zerop (op2)
13012           && TREE_CODE (arg0) == NE_EXPR
13013           && integer_zerop (TREE_OPERAND (arg0, 1))
13014           && integer_pow2p (arg1)
13015           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13016           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13017                               arg1, OEP_ONLY_CONST))
13018         return pedantic_non_lvalue (fold_convert (type,
13019                                                   TREE_OPERAND (arg0, 0)));
13020
13021       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13022       if (integer_zerop (op2)
13023           && truth_value_p (TREE_CODE (arg0))
13024           && truth_value_p (TREE_CODE (arg1)))
13025         return fold_build2 (TRUTH_ANDIF_EXPR, type,
13026                             fold_convert (type, arg0),
13027                             arg1);
13028
13029       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13030       if (integer_onep (op2)
13031           && truth_value_p (TREE_CODE (arg0))
13032           && truth_value_p (TREE_CODE (arg1)))
13033         {
13034           /* Only perform transformation if ARG0 is easily inverted.  */
13035           tem = fold_truth_not_expr (arg0);
13036           if (tem)
13037             return fold_build2 (TRUTH_ORIF_EXPR, type,
13038                                 fold_convert (type, tem),
13039                                 arg1);
13040         }
13041
13042       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13043       if (integer_zerop (arg1)
13044           && truth_value_p (TREE_CODE (arg0))
13045           && truth_value_p (TREE_CODE (op2)))
13046         {
13047           /* Only perform transformation if ARG0 is easily inverted.  */
13048           tem = fold_truth_not_expr (arg0);
13049           if (tem)
13050             return fold_build2 (TRUTH_ANDIF_EXPR, type,
13051                                 fold_convert (type, tem),
13052                                 op2);
13053         }
13054
13055       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13056       if (integer_onep (arg1)
13057           && truth_value_p (TREE_CODE (arg0))
13058           && truth_value_p (TREE_CODE (op2)))
13059         return fold_build2 (TRUTH_ORIF_EXPR, type,
13060                             fold_convert (type, arg0),
13061                             op2);
13062
13063       return NULL_TREE;
13064
13065     case CALL_EXPR:
13066       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13067          of fold_ternary on them.  */
13068       gcc_unreachable ();
13069
13070     case BIT_FIELD_REF:
13071       if ((TREE_CODE (arg0) == VECTOR_CST
13072            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
13073           && type == TREE_TYPE (TREE_TYPE (arg0)))
13074         {
13075           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
13076           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
13077
13078           if (width != 0
13079               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
13080               && (idx % width) == 0
13081               && (idx = idx / width)
13082                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
13083             {
13084               tree elements = NULL_TREE;
13085
13086               if (TREE_CODE (arg0) == VECTOR_CST)
13087                 elements = TREE_VECTOR_CST_ELTS (arg0);
13088               else
13089                 {
13090                   unsigned HOST_WIDE_INT idx;
13091                   tree value;
13092
13093                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
13094                     elements = tree_cons (NULL_TREE, value, elements);
13095                 }
13096               while (idx-- > 0 && elements)
13097                 elements = TREE_CHAIN (elements);
13098               if (elements)
13099                 return TREE_VALUE (elements);
13100               else
13101                 return fold_convert (type, integer_zero_node);
13102             }
13103         }
13104       return NULL_TREE;
13105
13106     default:
13107       return NULL_TREE;
13108     } /* switch (code) */
13109 }
13110
13111 /* Perform constant folding and related simplification of EXPR.
13112    The related simplifications include x*1 => x, x*0 => 0, etc.,
13113    and application of the associative law.
13114    NOP_EXPR conversions may be removed freely (as long as we
13115    are careful not to change the type of the overall expression).
13116    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13117    but we can constant-fold them if they have constant operands.  */
13118
13119 #ifdef ENABLE_FOLD_CHECKING
13120 # define fold(x) fold_1 (x)
13121 static tree fold_1 (tree);
13122 static
13123 #endif
13124 tree
13125 fold (tree expr)
13126 {
13127   const tree t = expr;
13128   enum tree_code code = TREE_CODE (t);
13129   enum tree_code_class kind = TREE_CODE_CLASS (code);
13130   tree tem;
13131
13132   /* Return right away if a constant.  */
13133   if (kind == tcc_constant)
13134     return t;
13135
13136   /* CALL_EXPR-like objects with variable numbers of operands are
13137      treated specially.  */
13138   if (kind == tcc_vl_exp)
13139     {
13140       if (code == CALL_EXPR)
13141         {
13142           tem = fold_call_expr (expr, false);
13143           return tem ? tem : expr;
13144         }
13145       return expr;
13146     }
13147
13148   if (IS_EXPR_CODE_CLASS (kind)
13149       || IS_GIMPLE_STMT_CODE_CLASS (kind))
13150     {
13151       tree type = TREE_TYPE (t);
13152       tree op0, op1, op2;
13153
13154       switch (TREE_CODE_LENGTH (code))
13155         {
13156         case 1:
13157           op0 = TREE_OPERAND (t, 0);
13158           tem = fold_unary (code, type, op0);
13159           return tem ? tem : expr;
13160         case 2:
13161           op0 = TREE_OPERAND (t, 0);
13162           op1 = TREE_OPERAND (t, 1);
13163           tem = fold_binary (code, type, op0, op1);
13164           return tem ? tem : expr;
13165         case 3:
13166           op0 = TREE_OPERAND (t, 0);
13167           op1 = TREE_OPERAND (t, 1);
13168           op2 = TREE_OPERAND (t, 2);
13169           tem = fold_ternary (code, type, op0, op1, op2);
13170           return tem ? tem : expr;
13171         default:
13172           break;
13173         }
13174     }
13175
13176   switch (code)
13177     {
13178     case ARRAY_REF:
13179       {
13180         tree op0 = TREE_OPERAND (t, 0);
13181         tree op1 = TREE_OPERAND (t, 1);
13182
13183         if (TREE_CODE (op1) == INTEGER_CST
13184             && TREE_CODE (op0) == CONSTRUCTOR
13185             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
13186           {
13187             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
13188             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
13189             unsigned HOST_WIDE_INT begin = 0;
13190
13191             /* Find a matching index by means of a binary search.  */
13192             while (begin != end)
13193               {
13194                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
13195                 tree index = VEC_index (constructor_elt, elts, middle)->index;
13196
13197                 if (TREE_CODE (index) == INTEGER_CST
13198                     && tree_int_cst_lt (index, op1))
13199                   begin = middle + 1;
13200                 else if (TREE_CODE (index) == INTEGER_CST
13201                          && tree_int_cst_lt (op1, index))
13202                   end = middle;
13203                 else if (TREE_CODE (index) == RANGE_EXPR
13204                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
13205                   begin = middle + 1;
13206                 else if (TREE_CODE (index) == RANGE_EXPR
13207                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
13208                   end = middle;
13209                 else
13210                   return VEC_index (constructor_elt, elts, middle)->value;
13211               }
13212           }
13213
13214         return t;
13215       }
13216
13217     case CONST_DECL:
13218       return fold (DECL_INITIAL (t));
13219
13220     default:
13221       return t;
13222     } /* switch (code) */
13223 }
13224
13225 #ifdef ENABLE_FOLD_CHECKING
13226 #undef fold
13227
13228 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13229 static void fold_check_failed (const_tree, const_tree);
13230 void print_fold_checksum (const_tree);
13231
13232 /* When --enable-checking=fold, compute a digest of expr before
13233    and after actual fold call to see if fold did not accidentally
13234    change original expr.  */
13235
13236 tree
13237 fold (tree expr)
13238 {
13239   tree ret;
13240   struct md5_ctx ctx;
13241   unsigned char checksum_before[16], checksum_after[16];
13242   htab_t ht;
13243
13244   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13245   md5_init_ctx (&ctx);
13246   fold_checksum_tree (expr, &ctx, ht);
13247   md5_finish_ctx (&ctx, checksum_before);
13248   htab_empty (ht);
13249
13250   ret = fold_1 (expr);
13251
13252   md5_init_ctx (&ctx);
13253   fold_checksum_tree (expr, &ctx, ht);
13254   md5_finish_ctx (&ctx, checksum_after);
13255   htab_delete (ht);
13256
13257   if (memcmp (checksum_before, checksum_after, 16))
13258     fold_check_failed (expr, ret);
13259
13260   return ret;
13261 }
13262
13263 void
13264 print_fold_checksum (const_tree expr)
13265 {
13266   struct md5_ctx ctx;
13267   unsigned char checksum[16], cnt;
13268   htab_t ht;
13269
13270   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13271   md5_init_ctx (&ctx);
13272   fold_checksum_tree (expr, &ctx, ht);
13273   md5_finish_ctx (&ctx, checksum);
13274   htab_delete (ht);
13275   for (cnt = 0; cnt < 16; ++cnt)
13276     fprintf (stderr, "%02x", checksum[cnt]);
13277   putc ('\n', stderr);
13278 }
13279
13280 static void
13281 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13282 {
13283   internal_error ("fold check: original tree changed by fold");
13284 }
13285
13286 static void
13287 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13288 {
13289   const void **slot;
13290   enum tree_code code;
13291   struct tree_function_decl buf;
13292   int i, len;
13293   
13294 recursive_label:
13295
13296   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13297                <= sizeof (struct tree_function_decl))
13298               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13299   if (expr == NULL)
13300     return;
13301   slot = (const void **) htab_find_slot (ht, expr, INSERT);
13302   if (*slot != NULL)
13303     return;
13304   *slot = expr;
13305   code = TREE_CODE (expr);
13306   if (TREE_CODE_CLASS (code) == tcc_declaration
13307       && DECL_ASSEMBLER_NAME_SET_P (expr))
13308     {
13309       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
13310       memcpy ((char *) &buf, expr, tree_size (expr));
13311       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13312       expr = (tree) &buf;
13313     }
13314   else if (TREE_CODE_CLASS (code) == tcc_type
13315            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
13316                || TYPE_CACHED_VALUES_P (expr)
13317                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
13318     {
13319       /* Allow these fields to be modified.  */
13320       tree tmp;
13321       memcpy ((char *) &buf, expr, tree_size (expr));
13322       expr = tmp = (tree) &buf;
13323       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13324       TYPE_POINTER_TO (tmp) = NULL;
13325       TYPE_REFERENCE_TO (tmp) = NULL;
13326       if (TYPE_CACHED_VALUES_P (tmp))
13327         {
13328           TYPE_CACHED_VALUES_P (tmp) = 0;
13329           TYPE_CACHED_VALUES (tmp) = NULL;
13330         }
13331     }
13332   md5_process_bytes (expr, tree_size (expr), ctx);
13333   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13334   if (TREE_CODE_CLASS (code) != tcc_type
13335       && TREE_CODE_CLASS (code) != tcc_declaration
13336       && code != TREE_LIST
13337       && code != SSA_NAME)
13338     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13339   switch (TREE_CODE_CLASS (code))
13340     {
13341     case tcc_constant:
13342       switch (code)
13343         {
13344         case STRING_CST:
13345           md5_process_bytes (TREE_STRING_POINTER (expr),
13346                              TREE_STRING_LENGTH (expr), ctx);
13347           break;
13348         case COMPLEX_CST:
13349           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13350           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13351           break;
13352         case VECTOR_CST:
13353           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13354           break;
13355         default:
13356           break;
13357         }
13358       break;
13359     case tcc_exceptional:
13360       switch (code)
13361         {
13362         case TREE_LIST:
13363           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13364           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13365           expr = TREE_CHAIN (expr);
13366           goto recursive_label;
13367           break;
13368         case TREE_VEC:
13369           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13370             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13371           break;
13372         default:
13373           break;
13374         }
13375       break;
13376     case tcc_expression:
13377     case tcc_reference:
13378     case tcc_comparison:
13379     case tcc_unary:
13380     case tcc_binary:
13381     case tcc_statement:
13382     case tcc_vl_exp:
13383       len = TREE_OPERAND_LENGTH (expr);
13384       for (i = 0; i < len; ++i)
13385         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13386       break;
13387     case tcc_declaration:
13388       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13389       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13390       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13391         {
13392           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13393           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13394           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13395           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13396           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13397         }
13398       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13399         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13400           
13401       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13402         {
13403           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13404           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13405           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13406         }
13407       break;
13408     case tcc_type:
13409       if (TREE_CODE (expr) == ENUMERAL_TYPE)
13410         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13411       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13412       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13413       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13414       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13415       if (INTEGRAL_TYPE_P (expr)
13416           || SCALAR_FLOAT_TYPE_P (expr))
13417         {
13418           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13419           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13420         }
13421       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13422       if (TREE_CODE (expr) == RECORD_TYPE
13423           || TREE_CODE (expr) == UNION_TYPE
13424           || TREE_CODE (expr) == QUAL_UNION_TYPE)
13425         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13426       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13427       break;
13428     default:
13429       break;
13430     }
13431 }
13432
13433 /* Helper function for outputting the checksum of a tree T.  When
13434    debugging with gdb, you can "define mynext" to be "next" followed
13435    by "call debug_fold_checksum (op0)", then just trace down till the
13436    outputs differ.  */
13437
13438 void
13439 debug_fold_checksum (const_tree t)
13440 {
13441   int i;
13442   unsigned char checksum[16];
13443   struct md5_ctx ctx;
13444   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13445   
13446   md5_init_ctx (&ctx);
13447   fold_checksum_tree (t, &ctx, ht);
13448   md5_finish_ctx (&ctx, checksum);
13449   htab_empty (ht);
13450
13451   for (i = 0; i < 16; i++)
13452     fprintf (stderr, "%d ", checksum[i]);
13453
13454   fprintf (stderr, "\n");
13455 }
13456
13457 #endif
13458
13459 /* Fold a unary tree expression with code CODE of type TYPE with an
13460    operand OP0.  Return a folded expression if successful.  Otherwise,
13461    return a tree expression with code CODE of type TYPE with an
13462    operand OP0.  */
13463
13464 tree
13465 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13466 {
13467   tree tem;
13468 #ifdef ENABLE_FOLD_CHECKING
13469   unsigned char checksum_before[16], checksum_after[16];
13470   struct md5_ctx ctx;
13471   htab_t ht;
13472
13473   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13474   md5_init_ctx (&ctx);
13475   fold_checksum_tree (op0, &ctx, ht);
13476   md5_finish_ctx (&ctx, checksum_before);
13477   htab_empty (ht);
13478 #endif
13479   
13480   tem = fold_unary (code, type, op0);
13481   if (!tem)
13482     tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13483   
13484 #ifdef ENABLE_FOLD_CHECKING
13485   md5_init_ctx (&ctx);
13486   fold_checksum_tree (op0, &ctx, ht);
13487   md5_finish_ctx (&ctx, checksum_after);
13488   htab_delete (ht);
13489
13490   if (memcmp (checksum_before, checksum_after, 16))
13491     fold_check_failed (op0, tem);
13492 #endif
13493   return tem;
13494 }
13495
13496 /* Fold a binary tree expression with code CODE of type TYPE with
13497    operands OP0 and OP1.  Return a folded expression if successful.
13498    Otherwise, return a tree expression with code CODE of type TYPE
13499    with operands OP0 and OP1.  */
13500
13501 tree
13502 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13503                   MEM_STAT_DECL)
13504 {
13505   tree tem;
13506 #ifdef ENABLE_FOLD_CHECKING
13507   unsigned char checksum_before_op0[16],
13508                 checksum_before_op1[16],
13509                 checksum_after_op0[16],
13510                 checksum_after_op1[16];
13511   struct md5_ctx ctx;
13512   htab_t ht;
13513
13514   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13515   md5_init_ctx (&ctx);
13516   fold_checksum_tree (op0, &ctx, ht);
13517   md5_finish_ctx (&ctx, checksum_before_op0);
13518   htab_empty (ht);
13519
13520   md5_init_ctx (&ctx);
13521   fold_checksum_tree (op1, &ctx, ht);
13522   md5_finish_ctx (&ctx, checksum_before_op1);
13523   htab_empty (ht);
13524 #endif
13525
13526   tem = fold_binary (code, type, op0, op1);
13527   if (!tem)
13528     tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13529   
13530 #ifdef ENABLE_FOLD_CHECKING
13531   md5_init_ctx (&ctx);
13532   fold_checksum_tree (op0, &ctx, ht);
13533   md5_finish_ctx (&ctx, checksum_after_op0);
13534   htab_empty (ht);
13535
13536   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13537     fold_check_failed (op0, tem);
13538   
13539   md5_init_ctx (&ctx);
13540   fold_checksum_tree (op1, &ctx, ht);
13541   md5_finish_ctx (&ctx, checksum_after_op1);
13542   htab_delete (ht);
13543
13544   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13545     fold_check_failed (op1, tem);
13546 #endif
13547   return tem;
13548 }
13549
13550 /* Fold a ternary tree expression with code CODE of type TYPE with
13551    operands OP0, OP1, and OP2.  Return a folded expression if
13552    successful.  Otherwise, return a tree expression with code CODE of
13553    type TYPE with operands OP0, OP1, and OP2.  */
13554
13555 tree
13556 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
13557              MEM_STAT_DECL)
13558 {
13559   tree tem;
13560 #ifdef ENABLE_FOLD_CHECKING
13561   unsigned char checksum_before_op0[16],
13562                 checksum_before_op1[16],
13563                 checksum_before_op2[16],
13564                 checksum_after_op0[16],
13565                 checksum_after_op1[16],
13566                 checksum_after_op2[16];
13567   struct md5_ctx ctx;
13568   htab_t ht;
13569
13570   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13571   md5_init_ctx (&ctx);
13572   fold_checksum_tree (op0, &ctx, ht);
13573   md5_finish_ctx (&ctx, checksum_before_op0);
13574   htab_empty (ht);
13575
13576   md5_init_ctx (&ctx);
13577   fold_checksum_tree (op1, &ctx, ht);
13578   md5_finish_ctx (&ctx, checksum_before_op1);
13579   htab_empty (ht);
13580
13581   md5_init_ctx (&ctx);
13582   fold_checksum_tree (op2, &ctx, ht);
13583   md5_finish_ctx (&ctx, checksum_before_op2);
13584   htab_empty (ht);
13585 #endif
13586
13587   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
13588   tem = fold_ternary (code, type, op0, op1, op2);
13589   if (!tem)
13590     tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
13591       
13592 #ifdef ENABLE_FOLD_CHECKING
13593   md5_init_ctx (&ctx);
13594   fold_checksum_tree (op0, &ctx, ht);
13595   md5_finish_ctx (&ctx, checksum_after_op0);
13596   htab_empty (ht);
13597
13598   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13599     fold_check_failed (op0, tem);
13600   
13601   md5_init_ctx (&ctx);
13602   fold_checksum_tree (op1, &ctx, ht);
13603   md5_finish_ctx (&ctx, checksum_after_op1);
13604   htab_empty (ht);
13605
13606   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13607     fold_check_failed (op1, tem);
13608   
13609   md5_init_ctx (&ctx);
13610   fold_checksum_tree (op2, &ctx, ht);
13611   md5_finish_ctx (&ctx, checksum_after_op2);
13612   htab_delete (ht);
13613
13614   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
13615     fold_check_failed (op2, tem);
13616 #endif
13617   return tem;
13618 }
13619
13620 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
13621    arguments in ARGARRAY, and a null static chain.
13622    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
13623    of type TYPE from the given operands as constructed by build_call_array.  */
13624
13625 tree
13626 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
13627 {
13628   tree tem;
13629 #ifdef ENABLE_FOLD_CHECKING
13630   unsigned char checksum_before_fn[16],
13631                 checksum_before_arglist[16],
13632                 checksum_after_fn[16],
13633                 checksum_after_arglist[16];
13634   struct md5_ctx ctx;
13635   htab_t ht;
13636   int i;
13637
13638   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13639   md5_init_ctx (&ctx);
13640   fold_checksum_tree (fn, &ctx, ht);
13641   md5_finish_ctx (&ctx, checksum_before_fn);
13642   htab_empty (ht);
13643
13644   md5_init_ctx (&ctx);
13645   for (i = 0; i < nargs; i++)
13646     fold_checksum_tree (argarray[i], &ctx, ht);
13647   md5_finish_ctx (&ctx, checksum_before_arglist);
13648   htab_empty (ht);
13649 #endif
13650
13651   tem = fold_builtin_call_array (type, fn, nargs, argarray);
13652       
13653 #ifdef ENABLE_FOLD_CHECKING
13654   md5_init_ctx (&ctx);
13655   fold_checksum_tree (fn, &ctx, ht);
13656   md5_finish_ctx (&ctx, checksum_after_fn);
13657   htab_empty (ht);
13658
13659   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13660     fold_check_failed (fn, tem);
13661   
13662   md5_init_ctx (&ctx);
13663   for (i = 0; i < nargs; i++)
13664     fold_checksum_tree (argarray[i], &ctx, ht);
13665   md5_finish_ctx (&ctx, checksum_after_arglist);
13666   htab_delete (ht);
13667
13668   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13669     fold_check_failed (NULL_TREE, tem);
13670 #endif
13671   return tem;
13672 }
13673
13674 /* Perform constant folding and related simplification of initializer
13675    expression EXPR.  These behave identically to "fold_buildN" but ignore
13676    potential run-time traps and exceptions that fold must preserve.  */
13677
13678 #define START_FOLD_INIT \
13679   int saved_signaling_nans = flag_signaling_nans;\
13680   int saved_trapping_math = flag_trapping_math;\
13681   int saved_rounding_math = flag_rounding_math;\
13682   int saved_trapv = flag_trapv;\
13683   int saved_folding_initializer = folding_initializer;\
13684   flag_signaling_nans = 0;\
13685   flag_trapping_math = 0;\
13686   flag_rounding_math = 0;\
13687   flag_trapv = 0;\
13688   folding_initializer = 1;
13689
13690 #define END_FOLD_INIT \
13691   flag_signaling_nans = saved_signaling_nans;\
13692   flag_trapping_math = saved_trapping_math;\
13693   flag_rounding_math = saved_rounding_math;\
13694   flag_trapv = saved_trapv;\
13695   folding_initializer = saved_folding_initializer;
13696
13697 tree
13698 fold_build1_initializer (enum tree_code code, tree type, tree op)
13699 {
13700   tree result;
13701   START_FOLD_INIT;
13702
13703   result = fold_build1 (code, type, op);
13704
13705   END_FOLD_INIT;
13706   return result;
13707 }
13708
13709 tree
13710 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13711 {
13712   tree result;
13713   START_FOLD_INIT;
13714
13715   result = fold_build2 (code, type, op0, op1);
13716
13717   END_FOLD_INIT;
13718   return result;
13719 }
13720
13721 tree
13722 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13723                          tree op2)
13724 {
13725   tree result;
13726   START_FOLD_INIT;
13727
13728   result = fold_build3 (code, type, op0, op1, op2);
13729
13730   END_FOLD_INIT;
13731   return result;
13732 }
13733
13734 tree
13735 fold_build_call_array_initializer (tree type, tree fn,
13736                                    int nargs, tree *argarray)
13737 {
13738   tree result;
13739   START_FOLD_INIT;
13740
13741   result = fold_build_call_array (type, fn, nargs, argarray);
13742
13743   END_FOLD_INIT;
13744   return result;
13745 }
13746
13747 #undef START_FOLD_INIT
13748 #undef END_FOLD_INIT
13749
13750 /* Determine if first argument is a multiple of second argument.  Return 0 if
13751    it is not, or we cannot easily determined it to be.
13752
13753    An example of the sort of thing we care about (at this point; this routine
13754    could surely be made more general, and expanded to do what the *_DIV_EXPR's
13755    fold cases do now) is discovering that
13756
13757      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13758
13759    is a multiple of
13760
13761      SAVE_EXPR (J * 8)
13762
13763    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13764
13765    This code also handles discovering that
13766
13767      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13768
13769    is a multiple of 8 so we don't have to worry about dealing with a
13770    possible remainder.
13771
13772    Note that we *look* inside a SAVE_EXPR only to determine how it was
13773    calculated; it is not safe for fold to do much of anything else with the
13774    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13775    at run time.  For example, the latter example above *cannot* be implemented
13776    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13777    evaluation time of the original SAVE_EXPR is not necessarily the same at
13778    the time the new expression is evaluated.  The only optimization of this
13779    sort that would be valid is changing
13780
13781      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13782
13783    divided by 8 to
13784
13785      SAVE_EXPR (I) * SAVE_EXPR (J)
13786
13787    (where the same SAVE_EXPR (J) is used in the original and the
13788    transformed version).  */
13789
13790 int
13791 multiple_of_p (tree type, const_tree top, const_tree bottom)
13792 {
13793   if (operand_equal_p (top, bottom, 0))
13794     return 1;
13795
13796   if (TREE_CODE (type) != INTEGER_TYPE)
13797     return 0;
13798
13799   switch (TREE_CODE (top))
13800     {
13801     case BIT_AND_EXPR:
13802       /* Bitwise and provides a power of two multiple.  If the mask is
13803          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
13804       if (!integer_pow2p (bottom))
13805         return 0;
13806       /* FALLTHRU */
13807
13808     case MULT_EXPR:
13809       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13810               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13811
13812     case PLUS_EXPR:
13813     case MINUS_EXPR:
13814       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13815               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13816
13817     case LSHIFT_EXPR:
13818       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13819         {
13820           tree op1, t1;
13821
13822           op1 = TREE_OPERAND (top, 1);
13823           /* const_binop may not detect overflow correctly,
13824              so check for it explicitly here.  */
13825           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13826               > TREE_INT_CST_LOW (op1)
13827               && TREE_INT_CST_HIGH (op1) == 0
13828               && 0 != (t1 = fold_convert (type,
13829                                           const_binop (LSHIFT_EXPR,
13830                                                        size_one_node,
13831                                                        op1, 0)))
13832               && !TREE_OVERFLOW (t1))
13833             return multiple_of_p (type, t1, bottom);
13834         }
13835       return 0;
13836
13837     case NOP_EXPR:
13838       /* Can't handle conversions from non-integral or wider integral type.  */
13839       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13840           || (TYPE_PRECISION (type)
13841               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13842         return 0;
13843
13844       /* .. fall through ...  */
13845
13846     case SAVE_EXPR:
13847       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13848
13849     case INTEGER_CST:
13850       if (TREE_CODE (bottom) != INTEGER_CST
13851           || integer_zerop (bottom)
13852           || (TYPE_UNSIGNED (type)
13853               && (tree_int_cst_sgn (top) < 0
13854                   || tree_int_cst_sgn (bottom) < 0)))
13855         return 0;
13856       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13857                                              top, bottom, 0));
13858
13859     default:
13860       return 0;
13861     }
13862 }
13863
13864 /* Return true if CODE or TYPE is known to be non-negative. */
13865
13866 static bool
13867 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
13868 {
13869   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13870       && truth_value_p (code))
13871     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13872        have a signed:1 type (where the value is -1 and 0).  */
13873     return true;
13874   return false;
13875 }
13876
13877 /* Return true if (CODE OP0) is known to be non-negative.  If the return
13878    value is based on the assumption that signed overflow is undefined,
13879    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13880    *STRICT_OVERFLOW_P.  */
13881
13882 bool
13883 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13884                                 bool *strict_overflow_p)
13885 {
13886   if (TYPE_UNSIGNED (type))
13887     return true;
13888
13889   switch (code)
13890     {
13891     case ABS_EXPR:
13892       /* We can't return 1 if flag_wrapv is set because
13893          ABS_EXPR<INT_MIN> = INT_MIN.  */
13894       if (!INTEGRAL_TYPE_P (type))
13895         return true;
13896       if (TYPE_OVERFLOW_UNDEFINED (type))
13897         {
13898           *strict_overflow_p = true;
13899           return true;
13900         }
13901       break;
13902
13903     case NON_LVALUE_EXPR:
13904     case FLOAT_EXPR:
13905     case FIX_TRUNC_EXPR:
13906       return tree_expr_nonnegative_warnv_p (op0,
13907                                             strict_overflow_p);
13908
13909     case NOP_EXPR:
13910       {
13911         tree inner_type = TREE_TYPE (op0);
13912         tree outer_type = type;
13913
13914         if (TREE_CODE (outer_type) == REAL_TYPE)
13915           {
13916             if (TREE_CODE (inner_type) == REAL_TYPE)
13917               return tree_expr_nonnegative_warnv_p (op0,
13918                                                     strict_overflow_p);
13919             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13920               {
13921                 if (TYPE_UNSIGNED (inner_type))
13922                   return true;
13923                 return tree_expr_nonnegative_warnv_p (op0,
13924                                                       strict_overflow_p);
13925               }
13926           }
13927         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13928           {
13929             if (TREE_CODE (inner_type) == REAL_TYPE)
13930               return tree_expr_nonnegative_warnv_p (op0,
13931                                                     strict_overflow_p);
13932             if (TREE_CODE (inner_type) == INTEGER_TYPE)
13933               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13934                       && TYPE_UNSIGNED (inner_type);
13935           }
13936       }
13937       break;
13938
13939     default:
13940       return tree_simple_nonnegative_warnv_p (code, type);
13941     }
13942
13943   /* We don't know sign of `t', so be conservative and return false.  */
13944   return false;
13945 }
13946
13947 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
13948    value is based on the assumption that signed overflow is undefined,
13949    set *STRICT_OVERFLOW_P to true; otherwise, don't change
13950    *STRICT_OVERFLOW_P.  */
13951
13952 bool
13953 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13954                                       tree op1, bool *strict_overflow_p)
13955 {
13956   if (TYPE_UNSIGNED (type))
13957     return true;
13958
13959   switch (code)
13960     {
13961     case POINTER_PLUS_EXPR:
13962     case PLUS_EXPR:
13963       if (FLOAT_TYPE_P (type))
13964         return (tree_expr_nonnegative_warnv_p (op0,
13965                                                strict_overflow_p)
13966                 && tree_expr_nonnegative_warnv_p (op1,
13967                                                   strict_overflow_p));
13968
13969       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13970          both unsigned and at least 2 bits shorter than the result.  */
13971       if (TREE_CODE (type) == INTEGER_TYPE
13972           && TREE_CODE (op0) == NOP_EXPR
13973           && TREE_CODE (op1) == NOP_EXPR)
13974         {
13975           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13976           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13977           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13978               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13979             {
13980               unsigned int prec = MAX (TYPE_PRECISION (inner1),
13981                                        TYPE_PRECISION (inner2)) + 1;
13982               return prec < TYPE_PRECISION (type);
13983             }
13984         }
13985       break;
13986
13987     case MULT_EXPR:
13988       if (FLOAT_TYPE_P (type))
13989         {
13990           /* x * x for floating point x is always non-negative.  */
13991           if (operand_equal_p (op0, op1, 0))
13992             return true;
13993           return (tree_expr_nonnegative_warnv_p (op0,
13994                                                  strict_overflow_p)
13995                   && tree_expr_nonnegative_warnv_p (op1,
13996                                                     strict_overflow_p));
13997         }
13998
13999       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14000          both unsigned and their total bits is shorter than the result.  */
14001       if (TREE_CODE (type) == INTEGER_TYPE
14002           && TREE_CODE (op0) == NOP_EXPR
14003           && TREE_CODE (op1) == NOP_EXPR)
14004         {
14005           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14006           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14007           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14008               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14009             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
14010                    < TYPE_PRECISION (type);
14011         }
14012       return false;
14013
14014     case BIT_AND_EXPR:
14015     case MAX_EXPR:
14016       return (tree_expr_nonnegative_warnv_p (op0,
14017                                              strict_overflow_p)
14018               || tree_expr_nonnegative_warnv_p (op1,
14019                                                 strict_overflow_p));
14020
14021     case BIT_IOR_EXPR:
14022     case BIT_XOR_EXPR:
14023     case MIN_EXPR:
14024     case RDIV_EXPR:
14025     case TRUNC_DIV_EXPR:
14026     case CEIL_DIV_EXPR:
14027     case FLOOR_DIV_EXPR:
14028     case ROUND_DIV_EXPR:
14029       return (tree_expr_nonnegative_warnv_p (op0,
14030                                              strict_overflow_p)
14031               && tree_expr_nonnegative_warnv_p (op1,
14032                                                 strict_overflow_p));
14033
14034     case TRUNC_MOD_EXPR:
14035     case CEIL_MOD_EXPR:
14036     case FLOOR_MOD_EXPR:
14037     case ROUND_MOD_EXPR:
14038       return tree_expr_nonnegative_warnv_p (op0,
14039                                             strict_overflow_p);
14040     default:
14041       return tree_simple_nonnegative_warnv_p (code, type);
14042     }
14043
14044   /* We don't know sign of `t', so be conservative and return false.  */
14045   return false;
14046 }
14047
14048 /* Return true if T is known to be non-negative.  If the return
14049    value is based on the assumption that signed overflow is undefined,
14050    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14051    *STRICT_OVERFLOW_P.  */
14052
14053 bool
14054 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14055 {
14056   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14057     return true;
14058
14059   switch (TREE_CODE (t))
14060     {
14061     case SSA_NAME:
14062       /* Query VRP to see if it has recorded any information about
14063          the range of this object.  */
14064       return ssa_name_nonnegative_p (t);
14065
14066     case INTEGER_CST:
14067       return tree_int_cst_sgn (t) >= 0;
14068
14069     case REAL_CST:
14070       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
14071
14072     case FIXED_CST:
14073       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
14074
14075     case COND_EXPR:
14076       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14077                                              strict_overflow_p)
14078               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
14079                                                 strict_overflow_p));
14080     default:
14081       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14082                                                    TREE_TYPE (t));
14083     }
14084   /* We don't know sign of `t', so be conservative and return false.  */
14085   return false;
14086 }
14087
14088 /* Return true if T is known to be non-negative.  If the return
14089    value is based on the assumption that signed overflow is undefined,
14090    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14091    *STRICT_OVERFLOW_P.  */
14092
14093 bool
14094 tree_call_nonnegative_warnv_p (enum tree_code code,  tree type, tree fndecl,
14095                                tree arg0, tree arg1, bool *strict_overflow_p)
14096 {
14097   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14098     switch (DECL_FUNCTION_CODE (fndecl))
14099       {
14100         CASE_FLT_FN (BUILT_IN_ACOS):
14101         CASE_FLT_FN (BUILT_IN_ACOSH):
14102         CASE_FLT_FN (BUILT_IN_CABS):
14103         CASE_FLT_FN (BUILT_IN_COSH):
14104         CASE_FLT_FN (BUILT_IN_ERFC):
14105         CASE_FLT_FN (BUILT_IN_EXP):
14106         CASE_FLT_FN (BUILT_IN_EXP10):
14107         CASE_FLT_FN (BUILT_IN_EXP2):
14108         CASE_FLT_FN (BUILT_IN_FABS):
14109         CASE_FLT_FN (BUILT_IN_FDIM):
14110         CASE_FLT_FN (BUILT_IN_HYPOT):
14111         CASE_FLT_FN (BUILT_IN_POW10):
14112         CASE_INT_FN (BUILT_IN_FFS):
14113         CASE_INT_FN (BUILT_IN_PARITY):
14114         CASE_INT_FN (BUILT_IN_POPCOUNT):
14115       case BUILT_IN_BSWAP32:
14116       case BUILT_IN_BSWAP64:
14117         /* Always true.  */
14118         return true;
14119
14120         CASE_FLT_FN (BUILT_IN_SQRT):
14121         /* sqrt(-0.0) is -0.0.  */
14122         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
14123           return true;
14124         return tree_expr_nonnegative_warnv_p (arg0,
14125                                               strict_overflow_p);
14126
14127         CASE_FLT_FN (BUILT_IN_ASINH):
14128         CASE_FLT_FN (BUILT_IN_ATAN):
14129         CASE_FLT_FN (BUILT_IN_ATANH):
14130         CASE_FLT_FN (BUILT_IN_CBRT):
14131         CASE_FLT_FN (BUILT_IN_CEIL):
14132         CASE_FLT_FN (BUILT_IN_ERF):
14133         CASE_FLT_FN (BUILT_IN_EXPM1):
14134         CASE_FLT_FN (BUILT_IN_FLOOR):
14135         CASE_FLT_FN (BUILT_IN_FMOD):
14136         CASE_FLT_FN (BUILT_IN_FREXP):
14137         CASE_FLT_FN (BUILT_IN_LCEIL):
14138         CASE_FLT_FN (BUILT_IN_LDEXP):
14139         CASE_FLT_FN (BUILT_IN_LFLOOR):
14140         CASE_FLT_FN (BUILT_IN_LLCEIL):
14141         CASE_FLT_FN (BUILT_IN_LLFLOOR):
14142         CASE_FLT_FN (BUILT_IN_LLRINT):
14143         CASE_FLT_FN (BUILT_IN_LLROUND):
14144         CASE_FLT_FN (BUILT_IN_LRINT):
14145         CASE_FLT_FN (BUILT_IN_LROUND):
14146         CASE_FLT_FN (BUILT_IN_MODF):
14147         CASE_FLT_FN (BUILT_IN_NEARBYINT):
14148         CASE_FLT_FN (BUILT_IN_RINT):
14149         CASE_FLT_FN (BUILT_IN_ROUND):
14150         CASE_FLT_FN (BUILT_IN_SCALB):
14151         CASE_FLT_FN (BUILT_IN_SCALBLN):
14152         CASE_FLT_FN (BUILT_IN_SCALBN):
14153         CASE_FLT_FN (BUILT_IN_SIGNBIT):
14154         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14155         CASE_FLT_FN (BUILT_IN_SINH):
14156         CASE_FLT_FN (BUILT_IN_TANH):
14157         CASE_FLT_FN (BUILT_IN_TRUNC):
14158         /* True if the 1st argument is nonnegative.  */
14159         return tree_expr_nonnegative_warnv_p (arg0,
14160                                               strict_overflow_p);
14161
14162         CASE_FLT_FN (BUILT_IN_FMAX):
14163         /* True if the 1st OR 2nd arguments are nonnegative.  */
14164         return (tree_expr_nonnegative_warnv_p (arg0,
14165                                                strict_overflow_p)
14166                 || (tree_expr_nonnegative_warnv_p (arg1,
14167                                                    strict_overflow_p)));
14168
14169         CASE_FLT_FN (BUILT_IN_FMIN):
14170         /* True if the 1st AND 2nd arguments are nonnegative.  */
14171         return (tree_expr_nonnegative_warnv_p (arg0,
14172                                                strict_overflow_p)
14173                 && (tree_expr_nonnegative_warnv_p (arg1,
14174                                                    strict_overflow_p)));
14175
14176         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14177         /* True if the 2nd argument is nonnegative.  */
14178         return tree_expr_nonnegative_warnv_p (arg1,
14179                                               strict_overflow_p);
14180
14181         CASE_FLT_FN (BUILT_IN_POWI):
14182         /* True if the 1st argument is nonnegative or the second
14183            argument is an even integer.  */
14184         if (TREE_CODE (arg1) == INTEGER_CST
14185             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
14186           return true;
14187         return tree_expr_nonnegative_warnv_p (arg0,
14188                                               strict_overflow_p);
14189
14190         CASE_FLT_FN (BUILT_IN_POW):
14191         /* True if the 1st argument is nonnegative or the second
14192            argument is an even integer valued real.  */
14193         if (TREE_CODE (arg1) == REAL_CST)
14194           {
14195             REAL_VALUE_TYPE c;
14196             HOST_WIDE_INT n;
14197
14198             c = TREE_REAL_CST (arg1);
14199             n = real_to_integer (&c);
14200             if ((n & 1) == 0)
14201               {
14202                 REAL_VALUE_TYPE cint;
14203                 real_from_integer (&cint, VOIDmode, n,
14204                                    n < 0 ? -1 : 0, 0);
14205                 if (real_identical (&c, &cint))
14206                   return true;
14207               }
14208           }
14209         return tree_expr_nonnegative_warnv_p (arg0,
14210                                               strict_overflow_p);
14211
14212       default:
14213         break;
14214       }
14215   return tree_simple_nonnegative_warnv_p (code,
14216                                           type);
14217 }
14218
14219 /* Return true if T is known to be non-negative.  If the return
14220    value is based on the assumption that signed overflow is undefined,
14221    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14222    *STRICT_OVERFLOW_P.  */
14223
14224 bool
14225 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14226 {
14227   enum tree_code code = TREE_CODE (t);
14228   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14229     return true;
14230
14231   switch (code)
14232     {
14233     case TARGET_EXPR:
14234       {
14235         tree temp = TARGET_EXPR_SLOT (t);
14236         t = TARGET_EXPR_INITIAL (t);
14237
14238         /* If the initializer is non-void, then it's a normal expression
14239            that will be assigned to the slot.  */
14240         if (!VOID_TYPE_P (t))
14241           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
14242
14243         /* Otherwise, the initializer sets the slot in some way.  One common
14244            way is an assignment statement at the end of the initializer.  */
14245         while (1)
14246           {
14247             if (TREE_CODE (t) == BIND_EXPR)
14248               t = expr_last (BIND_EXPR_BODY (t));
14249             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
14250                      || TREE_CODE (t) == TRY_CATCH_EXPR)
14251               t = expr_last (TREE_OPERAND (t, 0));
14252             else if (TREE_CODE (t) == STATEMENT_LIST)
14253               t = expr_last (t);
14254             else
14255               break;
14256           }
14257         if ((TREE_CODE (t) == MODIFY_EXPR
14258              || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
14259             && GENERIC_TREE_OPERAND (t, 0) == temp)
14260           return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14261                                                 strict_overflow_p);
14262
14263         return false;
14264       }
14265
14266     case CALL_EXPR:
14267       {
14268         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
14269         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
14270
14271         return tree_call_nonnegative_warnv_p (TREE_CODE (t),
14272                                               TREE_TYPE (t),
14273                                               get_callee_fndecl (t),
14274                                               arg0,
14275                                               arg1,
14276                                               strict_overflow_p);
14277       }
14278     case COMPOUND_EXPR:
14279     case MODIFY_EXPR:
14280     case GIMPLE_MODIFY_STMT:
14281       return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14282                                             strict_overflow_p);
14283     case BIND_EXPR:
14284       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14285                                             strict_overflow_p);
14286     case SAVE_EXPR:
14287       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14288                                             strict_overflow_p);
14289
14290     default:
14291       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14292                                                    TREE_TYPE (t));
14293     }
14294
14295   /* We don't know sign of `t', so be conservative and return false.  */
14296   return false;
14297 }
14298
14299 /* Return true if T is known to be non-negative.  If the return
14300    value is based on the assumption that signed overflow is undefined,
14301    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14302    *STRICT_OVERFLOW_P.  */
14303
14304 bool
14305 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14306 {
14307   enum tree_code code;
14308   if (t == error_mark_node)
14309     return false;
14310
14311   code = TREE_CODE (t);
14312   switch (TREE_CODE_CLASS (code))
14313     {
14314     case tcc_binary:
14315     case tcc_comparison:
14316       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14317                                               TREE_TYPE (t),
14318                                               TREE_OPERAND (t, 0),
14319                                               TREE_OPERAND (t, 1),
14320                                               strict_overflow_p);
14321
14322     case tcc_unary:
14323       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14324                                              TREE_TYPE (t),
14325                                              TREE_OPERAND (t, 0),
14326                                              strict_overflow_p);
14327
14328     case tcc_constant:
14329     case tcc_declaration:
14330     case tcc_reference:
14331       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14332
14333     default:
14334       break;
14335     }
14336
14337   switch (code)
14338     {
14339     case TRUTH_AND_EXPR:
14340     case TRUTH_OR_EXPR:
14341     case TRUTH_XOR_EXPR:
14342       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14343                                               TREE_TYPE (t),
14344                                               TREE_OPERAND (t, 0),
14345                                               TREE_OPERAND (t, 1),
14346                                               strict_overflow_p);
14347     case TRUTH_NOT_EXPR:
14348       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14349                                              TREE_TYPE (t),
14350                                              TREE_OPERAND (t, 0),
14351                                              strict_overflow_p);
14352
14353     case COND_EXPR:
14354     case CONSTRUCTOR:
14355     case OBJ_TYPE_REF:
14356     case ASSERT_EXPR:
14357     case ADDR_EXPR:
14358     case WITH_SIZE_EXPR:
14359     case EXC_PTR_EXPR:
14360     case SSA_NAME:
14361     case FILTER_EXPR:
14362       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14363
14364     default:
14365       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14366     }
14367 }
14368
14369 /* Return true if `t' is known to be non-negative.  Handle warnings
14370    about undefined signed overflow.  */
14371
14372 bool
14373 tree_expr_nonnegative_p (tree t)
14374 {
14375   bool ret, strict_overflow_p;
14376
14377   strict_overflow_p = false;
14378   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14379   if (strict_overflow_p)
14380     fold_overflow_warning (("assuming signed overflow does not occur when "
14381                             "determining that expression is always "
14382                             "non-negative"),
14383                            WARN_STRICT_OVERFLOW_MISC);
14384   return ret;
14385 }
14386
14387
14388 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14389    For floating point we further ensure that T is not denormal.
14390    Similar logic is present in nonzero_address in rtlanal.h.
14391
14392    If the return value is based on the assumption that signed overflow
14393    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14394    change *STRICT_OVERFLOW_P.  */
14395
14396 bool
14397 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14398                                  bool *strict_overflow_p)
14399 {
14400   switch (code)
14401     {
14402     case ABS_EXPR:
14403       return tree_expr_nonzero_warnv_p (op0,
14404                                         strict_overflow_p);
14405
14406     case NOP_EXPR:
14407       {
14408         tree inner_type = TREE_TYPE (op0);
14409         tree outer_type = type;
14410
14411         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14412                 && tree_expr_nonzero_warnv_p (op0,
14413                                               strict_overflow_p));
14414       }
14415       break;
14416
14417     case NON_LVALUE_EXPR:
14418       return tree_expr_nonzero_warnv_p (op0,
14419                                         strict_overflow_p);
14420
14421     default:
14422       break;
14423   }
14424
14425   return false;
14426 }
14427
14428 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14429    For floating point we further ensure that T is not denormal.
14430    Similar logic is present in nonzero_address in rtlanal.h.
14431
14432    If the return value is based on the assumption that signed overflow
14433    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14434    change *STRICT_OVERFLOW_P.  */
14435
14436 bool
14437 tree_binary_nonzero_warnv_p (enum tree_code code,
14438                              tree type,
14439                              tree op0,
14440                              tree op1, bool *strict_overflow_p)
14441 {
14442   bool sub_strict_overflow_p;
14443   switch (code)
14444     {
14445     case POINTER_PLUS_EXPR:
14446     case PLUS_EXPR:
14447       if (TYPE_OVERFLOW_UNDEFINED (type))
14448         {
14449           /* With the presence of negative values it is hard
14450              to say something.  */
14451           sub_strict_overflow_p = false;
14452           if (!tree_expr_nonnegative_warnv_p (op0,
14453                                               &sub_strict_overflow_p)
14454               || !tree_expr_nonnegative_warnv_p (op1,
14455                                                  &sub_strict_overflow_p))
14456             return false;
14457           /* One of operands must be positive and the other non-negative.  */
14458           /* We don't set *STRICT_OVERFLOW_P here: even if this value
14459              overflows, on a twos-complement machine the sum of two
14460              nonnegative numbers can never be zero.  */
14461           return (tree_expr_nonzero_warnv_p (op0,
14462                                              strict_overflow_p)
14463                   || tree_expr_nonzero_warnv_p (op1,
14464                                                 strict_overflow_p));
14465         }
14466       break;
14467
14468     case MULT_EXPR:
14469       if (TYPE_OVERFLOW_UNDEFINED (type))
14470         {
14471           if (tree_expr_nonzero_warnv_p (op0,
14472                                          strict_overflow_p)
14473               && tree_expr_nonzero_warnv_p (op1,
14474                                             strict_overflow_p))
14475             {
14476               *strict_overflow_p = true;
14477               return true;
14478             }
14479         }
14480       break;
14481
14482     case MIN_EXPR:
14483       sub_strict_overflow_p = false;
14484       if (tree_expr_nonzero_warnv_p (op0,
14485                                      &sub_strict_overflow_p)
14486           && tree_expr_nonzero_warnv_p (op1,
14487                                         &sub_strict_overflow_p))
14488         {
14489           if (sub_strict_overflow_p)
14490             *strict_overflow_p = true;
14491         }
14492       break;
14493
14494     case MAX_EXPR:
14495       sub_strict_overflow_p = false;
14496       if (tree_expr_nonzero_warnv_p (op0,
14497                                      &sub_strict_overflow_p))
14498         {
14499           if (sub_strict_overflow_p)
14500             *strict_overflow_p = true;
14501
14502           /* When both operands are nonzero, then MAX must be too.  */
14503           if (tree_expr_nonzero_warnv_p (op1,
14504                                          strict_overflow_p))
14505             return true;
14506
14507           /* MAX where operand 0 is positive is positive.  */
14508           return tree_expr_nonnegative_warnv_p (op0,
14509                                                strict_overflow_p);
14510         }
14511       /* MAX where operand 1 is positive is positive.  */
14512       else if (tree_expr_nonzero_warnv_p (op1,
14513                                           &sub_strict_overflow_p)
14514                && tree_expr_nonnegative_warnv_p (op1,
14515                                                  &sub_strict_overflow_p))
14516         {
14517           if (sub_strict_overflow_p)
14518             *strict_overflow_p = true;
14519           return true;
14520         }
14521       break;
14522
14523     case BIT_IOR_EXPR:
14524       return (tree_expr_nonzero_warnv_p (op1,
14525                                          strict_overflow_p)
14526               || tree_expr_nonzero_warnv_p (op0,
14527                                             strict_overflow_p));
14528
14529     default:
14530       break;
14531   }
14532
14533   return false;
14534 }
14535
14536 /* Return true when T is an address and is known to be nonzero.
14537    For floating point we further ensure that T is not denormal.
14538    Similar logic is present in nonzero_address in rtlanal.h.
14539
14540    If the return value is based on the assumption that signed overflow
14541    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14542    change *STRICT_OVERFLOW_P.  */
14543
14544 bool
14545 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14546 {
14547   bool sub_strict_overflow_p;
14548   switch (TREE_CODE (t))
14549     {
14550     case SSA_NAME:
14551       /* Query VRP to see if it has recorded any information about
14552          the range of this object.  */
14553       return ssa_name_nonzero_p (t);
14554
14555     case INTEGER_CST:
14556       return !integer_zerop (t);
14557
14558     case ADDR_EXPR:
14559       {
14560         tree base = get_base_address (TREE_OPERAND (t, 0));
14561
14562         if (!base)
14563           return false;
14564
14565         /* Weak declarations may link to NULL.  */
14566         if (VAR_OR_FUNCTION_DECL_P (base))
14567           return !DECL_WEAK (base);
14568
14569         /* Constants are never weak.  */
14570         if (CONSTANT_CLASS_P (base))
14571           return true;
14572
14573         return false;
14574       }
14575
14576     case COND_EXPR:
14577       sub_strict_overflow_p = false;
14578       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
14579                                      &sub_strict_overflow_p)
14580           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
14581                                         &sub_strict_overflow_p))
14582         {
14583           if (sub_strict_overflow_p)
14584             *strict_overflow_p = true;
14585           return true;
14586         }
14587       break;
14588
14589     default:
14590       break;
14591     }
14592   return false;
14593 }
14594
14595 /* Return true when T is an address and is known to be nonzero.
14596    For floating point we further ensure that T is not denormal.
14597    Similar logic is present in nonzero_address in rtlanal.h.
14598
14599    If the return value is based on the assumption that signed overflow
14600    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14601    change *STRICT_OVERFLOW_P.  */
14602
14603 bool
14604 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14605 {
14606   tree type = TREE_TYPE (t);
14607   enum tree_code code;
14608
14609   /* Doing something useful for floating point would need more work.  */
14610   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
14611     return false;
14612
14613   code = TREE_CODE (t);
14614   switch (TREE_CODE_CLASS (code))
14615     {
14616     case tcc_unary:
14617       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14618                                               strict_overflow_p);
14619     case tcc_binary:
14620     case tcc_comparison:
14621       return tree_binary_nonzero_warnv_p (code, type,
14622                                                TREE_OPERAND (t, 0),
14623                                                TREE_OPERAND (t, 1),
14624                                                strict_overflow_p);
14625     case tcc_constant:
14626     case tcc_declaration:
14627     case tcc_reference:
14628       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14629
14630     default:
14631       break;
14632     }
14633
14634   switch (code)
14635     {
14636     case TRUTH_NOT_EXPR:
14637       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14638                                               strict_overflow_p);
14639
14640     case TRUTH_AND_EXPR:
14641     case TRUTH_OR_EXPR:
14642     case TRUTH_XOR_EXPR:
14643       return tree_binary_nonzero_warnv_p (code, type,
14644                                                TREE_OPERAND (t, 0),
14645                                                TREE_OPERAND (t, 1),
14646                                                strict_overflow_p);
14647
14648     case COND_EXPR:
14649     case CONSTRUCTOR:
14650     case OBJ_TYPE_REF:
14651     case ASSERT_EXPR:
14652     case ADDR_EXPR:
14653     case WITH_SIZE_EXPR:
14654     case EXC_PTR_EXPR:
14655     case SSA_NAME:
14656     case FILTER_EXPR:
14657       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14658
14659     case COMPOUND_EXPR:
14660     case MODIFY_EXPR:
14661     case GIMPLE_MODIFY_STMT:
14662     case BIND_EXPR:
14663       return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14664                                         strict_overflow_p);
14665
14666     case SAVE_EXPR:
14667       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
14668                                         strict_overflow_p);
14669
14670     case CALL_EXPR:
14671       return alloca_call_p (t);
14672
14673     default:
14674       break;
14675     }
14676   return false;
14677 }
14678
14679 /* Return true when T is an address and is known to be nonzero.
14680    Handle warnings about undefined signed overflow.  */
14681
14682 bool
14683 tree_expr_nonzero_p (tree t)
14684 {
14685   bool ret, strict_overflow_p;
14686
14687   strict_overflow_p = false;
14688   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
14689   if (strict_overflow_p)
14690     fold_overflow_warning (("assuming signed overflow does not occur when "
14691                             "determining that expression is always "
14692                             "non-zero"),
14693                            WARN_STRICT_OVERFLOW_MISC);
14694   return ret;
14695 }
14696
14697 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
14698    attempt to fold the expression to a constant without modifying TYPE,
14699    OP0 or OP1.
14700
14701    If the expression could be simplified to a constant, then return
14702    the constant.  If the expression would not be simplified to a
14703    constant, then return NULL_TREE.  */
14704
14705 tree
14706 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
14707 {
14708   tree tem = fold_binary (code, type, op0, op1);
14709   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14710 }
14711
14712 /* Given the components of a unary expression CODE, TYPE and OP0,
14713    attempt to fold the expression to a constant without modifying
14714    TYPE or OP0.
14715
14716    If the expression could be simplified to a constant, then return
14717    the constant.  If the expression would not be simplified to a
14718    constant, then return NULL_TREE.  */
14719
14720 tree
14721 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
14722 {
14723   tree tem = fold_unary (code, type, op0);
14724   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14725 }
14726
14727 /* If EXP represents referencing an element in a constant string
14728    (either via pointer arithmetic or array indexing), return the
14729    tree representing the value accessed, otherwise return NULL.  */
14730
14731 tree
14732 fold_read_from_constant_string (tree exp)
14733 {
14734   if ((TREE_CODE (exp) == INDIRECT_REF
14735        || TREE_CODE (exp) == ARRAY_REF)
14736       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
14737     {
14738       tree exp1 = TREE_OPERAND (exp, 0);
14739       tree index;
14740       tree string;
14741
14742       if (TREE_CODE (exp) == INDIRECT_REF)
14743         string = string_constant (exp1, &index);
14744       else
14745         {
14746           tree low_bound = array_ref_low_bound (exp);
14747           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
14748
14749           /* Optimize the special-case of a zero lower bound.
14750
14751              We convert the low_bound to sizetype to avoid some problems
14752              with constant folding.  (E.g. suppose the lower bound is 1,
14753              and its mode is QI.  Without the conversion,l (ARRAY
14754              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
14755              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
14756           if (! integer_zerop (low_bound))
14757             index = size_diffop (index, fold_convert (sizetype, low_bound));
14758
14759           string = exp1;
14760         }
14761
14762       if (string
14763           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
14764           && TREE_CODE (string) == STRING_CST
14765           && TREE_CODE (index) == INTEGER_CST
14766           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
14767           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
14768               == MODE_INT)
14769           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
14770         return build_int_cst_type (TREE_TYPE (exp),
14771                                    (TREE_STRING_POINTER (string)
14772                                     [TREE_INT_CST_LOW (index)]));
14773     }
14774   return NULL;
14775 }
14776
14777 /* Return the tree for neg (ARG0) when ARG0 is known to be either
14778    an integer constant, real, or fixed-point constant.
14779
14780    TYPE is the type of the result.  */
14781
14782 static tree
14783 fold_negate_const (tree arg0, tree type)
14784 {
14785   tree t = NULL_TREE;
14786
14787   switch (TREE_CODE (arg0))
14788     {
14789     case INTEGER_CST:
14790       {
14791         unsigned HOST_WIDE_INT low;
14792         HOST_WIDE_INT high;
14793         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14794                                    TREE_INT_CST_HIGH (arg0),
14795                                    &low, &high);
14796         t = force_fit_type_double (type, low, high, 1,
14797                                    (overflow | TREE_OVERFLOW (arg0))
14798                                    && !TYPE_UNSIGNED (type));
14799         break;
14800       }
14801
14802     case REAL_CST:
14803       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14804       break;
14805
14806     case FIXED_CST:
14807       {
14808         FIXED_VALUE_TYPE f;
14809         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
14810                                             &(TREE_FIXED_CST (arg0)), NULL,
14811                                             TYPE_SATURATING (type));
14812         t = build_fixed (type, f);
14813         /* Propagate overflow flags.  */
14814         if (overflow_p | TREE_OVERFLOW (arg0))
14815           {
14816             TREE_OVERFLOW (t) = 1;
14817             TREE_CONSTANT_OVERFLOW (t) = 1;
14818           }
14819         else if (TREE_CONSTANT_OVERFLOW (arg0))
14820           TREE_CONSTANT_OVERFLOW (t) = 1;
14821         break;
14822       }
14823
14824     default:
14825       gcc_unreachable ();
14826     }
14827
14828   return t;
14829 }
14830
14831 /* Return the tree for abs (ARG0) when ARG0 is known to be either
14832    an integer constant or real constant.
14833
14834    TYPE is the type of the result.  */
14835
14836 tree
14837 fold_abs_const (tree arg0, tree type)
14838 {
14839   tree t = NULL_TREE;
14840
14841   switch (TREE_CODE (arg0))
14842     {
14843     case INTEGER_CST:
14844       /* If the value is unsigned, then the absolute value is
14845          the same as the ordinary value.  */
14846       if (TYPE_UNSIGNED (type))
14847         t = arg0;
14848       /* Similarly, if the value is non-negative.  */
14849       else if (INT_CST_LT (integer_minus_one_node, arg0))
14850         t = arg0;
14851       /* If the value is negative, then the absolute value is
14852          its negation.  */
14853       else
14854         {
14855           unsigned HOST_WIDE_INT low;
14856           HOST_WIDE_INT high;
14857           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14858                                      TREE_INT_CST_HIGH (arg0),
14859                                      &low, &high);
14860           t = force_fit_type_double (type, low, high, -1,
14861                                      overflow | TREE_OVERFLOW (arg0));
14862         }
14863       break;
14864
14865     case REAL_CST:
14866       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
14867         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14868       else
14869         t =  arg0;
14870       break;
14871
14872     default:
14873       gcc_unreachable ();
14874     }
14875
14876   return t;
14877 }
14878
14879 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
14880    constant.  TYPE is the type of the result.  */
14881
14882 static tree
14883 fold_not_const (tree arg0, tree type)
14884 {
14885   tree t = NULL_TREE;
14886
14887   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
14888
14889   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
14890                              ~TREE_INT_CST_HIGH (arg0), 0,
14891                              TREE_OVERFLOW (arg0));
14892
14893   return t;
14894 }
14895
14896 /* Given CODE, a relational operator, the target type, TYPE and two
14897    constant operands OP0 and OP1, return the result of the
14898    relational operation.  If the result is not a compile time
14899    constant, then return NULL_TREE.  */
14900
14901 static tree
14902 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
14903 {
14904   int result, invert;
14905
14906   /* From here on, the only cases we handle are when the result is
14907      known to be a constant.  */
14908
14909   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
14910     {
14911       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
14912       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
14913
14914       /* Handle the cases where either operand is a NaN.  */
14915       if (real_isnan (c0) || real_isnan (c1))
14916         {
14917           switch (code)
14918             {
14919             case EQ_EXPR:
14920             case ORDERED_EXPR:
14921               result = 0;
14922               break;
14923
14924             case NE_EXPR:
14925             case UNORDERED_EXPR:
14926             case UNLT_EXPR:
14927             case UNLE_EXPR:
14928             case UNGT_EXPR:
14929             case UNGE_EXPR:
14930             case UNEQ_EXPR:
14931               result = 1;
14932               break;
14933
14934             case LT_EXPR:
14935             case LE_EXPR:
14936             case GT_EXPR:
14937             case GE_EXPR:
14938             case LTGT_EXPR:
14939               if (flag_trapping_math)
14940                 return NULL_TREE;
14941               result = 0;
14942               break;
14943
14944             default:
14945               gcc_unreachable ();
14946             }
14947
14948           return constant_boolean_node (result, type);
14949         }
14950
14951       return constant_boolean_node (real_compare (code, c0, c1), type);
14952     }
14953
14954   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
14955     {
14956       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
14957       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
14958       return constant_boolean_node (fixed_compare (code, c0, c1), type);
14959     }
14960
14961   /* Handle equality/inequality of complex constants.  */
14962   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14963     {
14964       tree rcond = fold_relational_const (code, type,
14965                                           TREE_REALPART (op0),
14966                                           TREE_REALPART (op1));
14967       tree icond = fold_relational_const (code, type,
14968                                           TREE_IMAGPART (op0),
14969                                           TREE_IMAGPART (op1));
14970       if (code == EQ_EXPR)
14971         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14972       else if (code == NE_EXPR)
14973         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14974       else
14975         return NULL_TREE;
14976     }
14977
14978   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14979
14980      To compute GT, swap the arguments and do LT.
14981      To compute GE, do LT and invert the result.
14982      To compute LE, swap the arguments, do LT and invert the result.
14983      To compute NE, do EQ and invert the result.
14984
14985      Therefore, the code below must handle only EQ and LT.  */
14986
14987   if (code == LE_EXPR || code == GT_EXPR)
14988     {
14989       tree tem = op0;
14990       op0 = op1;
14991       op1 = tem;
14992       code = swap_tree_comparison (code);
14993     }
14994
14995   /* Note that it is safe to invert for real values here because we
14996      have already handled the one case that it matters.  */
14997
14998   invert = 0;
14999   if (code == NE_EXPR || code == GE_EXPR)
15000     {
15001       invert = 1;
15002       code = invert_tree_comparison (code, false);
15003     }
15004
15005   /* Compute a result for LT or EQ if args permit;
15006      Otherwise return T.  */
15007   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15008     {
15009       if (code == EQ_EXPR)
15010         result = tree_int_cst_equal (op0, op1);
15011       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
15012         result = INT_CST_LT_UNSIGNED (op0, op1);
15013       else
15014         result = INT_CST_LT (op0, op1);
15015     }
15016   else
15017     return NULL_TREE;
15018
15019   if (invert)
15020     result ^= 1;
15021   return constant_boolean_node (result, type);
15022 }
15023
15024 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15025    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15026    itself.  */
15027
15028 tree
15029 fold_build_cleanup_point_expr (tree type, tree expr)
15030 {
15031   /* If the expression does not have side effects then we don't have to wrap
15032      it with a cleanup point expression.  */
15033   if (!TREE_SIDE_EFFECTS (expr))
15034     return expr;
15035
15036   /* If the expression is a return, check to see if the expression inside the
15037      return has no side effects or the right hand side of the modify expression
15038      inside the return. If either don't have side effects set we don't need to
15039      wrap the expression in a cleanup point expression.  Note we don't check the
15040      left hand side of the modify because it should always be a return decl.  */
15041   if (TREE_CODE (expr) == RETURN_EXPR)
15042     {
15043       tree op = TREE_OPERAND (expr, 0);
15044       if (!op || !TREE_SIDE_EFFECTS (op))
15045         return expr;
15046       op = TREE_OPERAND (op, 1);
15047       if (!TREE_SIDE_EFFECTS (op))
15048         return expr;
15049     }
15050   
15051   return build1 (CLEANUP_POINT_EXPR, type, expr);
15052 }
15053
15054 /* Given a pointer value OP0 and a type TYPE, return a simplified version
15055    of an indirection through OP0, or NULL_TREE if no simplification is
15056    possible.  */
15057
15058 tree
15059 fold_indirect_ref_1 (tree type, tree op0)
15060 {
15061   tree sub = op0;
15062   tree subtype;
15063
15064   STRIP_NOPS (sub);
15065   subtype = TREE_TYPE (sub);
15066   if (!POINTER_TYPE_P (subtype))
15067     return NULL_TREE;
15068
15069   if (TREE_CODE (sub) == ADDR_EXPR)
15070     {
15071       tree op = TREE_OPERAND (sub, 0);
15072       tree optype = TREE_TYPE (op);
15073       /* *&CONST_DECL -> to the value of the const decl.  */
15074       if (TREE_CODE (op) == CONST_DECL)
15075         return DECL_INITIAL (op);
15076       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
15077       if (type == optype)
15078         {
15079           tree fop = fold_read_from_constant_string (op);
15080           if (fop)
15081             return fop;
15082           else
15083             return op;
15084         }
15085       /* *(foo *)&fooarray => fooarray[0] */
15086       else if (TREE_CODE (optype) == ARRAY_TYPE
15087                && type == TREE_TYPE (optype))
15088         {
15089           tree type_domain = TYPE_DOMAIN (optype);
15090           tree min_val = size_zero_node;
15091           if (type_domain && TYPE_MIN_VALUE (type_domain))
15092             min_val = TYPE_MIN_VALUE (type_domain);
15093           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
15094         }
15095       /* *(foo *)&complexfoo => __real__ complexfoo */
15096       else if (TREE_CODE (optype) == COMPLEX_TYPE
15097                && type == TREE_TYPE (optype))
15098         return fold_build1 (REALPART_EXPR, type, op);
15099       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
15100       else if (TREE_CODE (optype) == VECTOR_TYPE
15101                && type == TREE_TYPE (optype))
15102         {
15103           tree part_width = TYPE_SIZE (type);
15104           tree index = bitsize_int (0);
15105           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
15106         }
15107     }
15108
15109   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15110   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15111       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15112     { 
15113       tree op00 = TREE_OPERAND (sub, 0);
15114       tree op01 = TREE_OPERAND (sub, 1);
15115       tree op00type;
15116       
15117       STRIP_NOPS (op00);
15118       op00type = TREE_TYPE (op00);
15119       if (TREE_CODE (op00) == ADDR_EXPR
15120           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
15121           && type == TREE_TYPE (TREE_TYPE (op00type)))
15122         { 
15123           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
15124           tree part_width = TYPE_SIZE (type);
15125           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
15126           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15127           tree index = bitsize_int (indexi);
15128
15129           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
15130             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
15131                                 part_width, index);
15132         
15133         }
15134     }
15135
15136
15137   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15138   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15139       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15140     {
15141       tree op00 = TREE_OPERAND (sub, 0);
15142       tree op01 = TREE_OPERAND (sub, 1);
15143       tree op00type;
15144
15145       STRIP_NOPS (op00);
15146       op00type = TREE_TYPE (op00);
15147       if (TREE_CODE (op00) == ADDR_EXPR
15148           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
15149           && type == TREE_TYPE (TREE_TYPE (op00type)))
15150         {
15151           tree size = TYPE_SIZE_UNIT (type);
15152           if (tree_int_cst_equal (size, op01))
15153             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
15154         }
15155     }
15156   
15157   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15158   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15159       && type == TREE_TYPE (TREE_TYPE (subtype)))
15160     {
15161       tree type_domain;
15162       tree min_val = size_zero_node;
15163       sub = build_fold_indirect_ref (sub);
15164       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
15165       if (type_domain && TYPE_MIN_VALUE (type_domain))
15166         min_val = TYPE_MIN_VALUE (type_domain);
15167       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
15168     }
15169
15170   return NULL_TREE;
15171 }
15172
15173 /* Builds an expression for an indirection through T, simplifying some
15174    cases.  */
15175
15176 tree
15177 build_fold_indirect_ref (tree t)
15178 {
15179   tree type = TREE_TYPE (TREE_TYPE (t));
15180   tree sub = fold_indirect_ref_1 (type, t);
15181
15182   if (sub)
15183     return sub;
15184   else
15185     return build1 (INDIRECT_REF, type, t);
15186 }
15187
15188 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
15189
15190 tree
15191 fold_indirect_ref (tree t)
15192 {
15193   tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
15194
15195   if (sub)
15196     return sub;
15197   else
15198     return t;
15199 }
15200
15201 /* Strip non-trapping, non-side-effecting tree nodes from an expression
15202    whose result is ignored.  The type of the returned tree need not be
15203    the same as the original expression.  */
15204
15205 tree
15206 fold_ignored_result (tree t)
15207 {
15208   if (!TREE_SIDE_EFFECTS (t))
15209     return integer_zero_node;
15210
15211   for (;;)
15212     switch (TREE_CODE_CLASS (TREE_CODE (t)))
15213       {
15214       case tcc_unary:
15215         t = TREE_OPERAND (t, 0);
15216         break;
15217
15218       case tcc_binary:
15219       case tcc_comparison:
15220         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15221           t = TREE_OPERAND (t, 0);
15222         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15223           t = TREE_OPERAND (t, 1);
15224         else
15225           return t;
15226         break;
15227
15228       case tcc_expression:
15229         switch (TREE_CODE (t))
15230           {
15231           case COMPOUND_EXPR:
15232             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15233               return t;
15234             t = TREE_OPERAND (t, 0);
15235             break;
15236
15237           case COND_EXPR:
15238             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15239                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15240               return t;
15241             t = TREE_OPERAND (t, 0);
15242             break;
15243
15244           default:
15245             return t;
15246           }
15247         break;
15248
15249       default:
15250         return t;
15251       }
15252 }
15253
15254 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15255    This can only be applied to objects of a sizetype.  */
15256
15257 tree
15258 round_up (tree value, int divisor)
15259 {
15260   tree div = NULL_TREE;
15261
15262   gcc_assert (divisor > 0);
15263   if (divisor == 1)
15264     return value;
15265
15266   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15267      have to do anything.  Only do this when we are not given a const,
15268      because in that case, this check is more expensive than just
15269      doing it.  */
15270   if (TREE_CODE (value) != INTEGER_CST)
15271     {
15272       div = build_int_cst (TREE_TYPE (value), divisor);
15273
15274       if (multiple_of_p (TREE_TYPE (value), value, div))
15275         return value;
15276     }
15277
15278   /* If divisor is a power of two, simplify this to bit manipulation.  */
15279   if (divisor == (divisor & -divisor))
15280     {
15281       if (TREE_CODE (value) == INTEGER_CST)
15282         {
15283           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15284           unsigned HOST_WIDE_INT high;
15285           bool overflow_p;
15286
15287           if ((low & (divisor - 1)) == 0)
15288             return value;
15289
15290           overflow_p = TREE_OVERFLOW (value);
15291           high = TREE_INT_CST_HIGH (value);
15292           low &= ~(divisor - 1);
15293           low += divisor;
15294           if (low == 0)
15295             {
15296               high++;
15297               if (high == 0)
15298                 overflow_p = true;
15299             }
15300
15301           return force_fit_type_double (TREE_TYPE (value), low, high,
15302                                         -1, overflow_p);
15303         }
15304       else
15305         {
15306           tree t;
15307
15308           t = build_int_cst (TREE_TYPE (value), divisor - 1);
15309           value = size_binop (PLUS_EXPR, value, t);
15310           t = build_int_cst (TREE_TYPE (value), -divisor);
15311           value = size_binop (BIT_AND_EXPR, value, t);
15312         }
15313     }
15314   else
15315     {
15316       if (!div)
15317         div = build_int_cst (TREE_TYPE (value), divisor);
15318       value = size_binop (CEIL_DIV_EXPR, value, div);
15319       value = size_binop (MULT_EXPR, value, div);
15320     }
15321
15322   return value;
15323 }
15324
15325 /* Likewise, but round down.  */
15326
15327 tree
15328 round_down (tree value, int divisor)
15329 {
15330   tree div = NULL_TREE;
15331
15332   gcc_assert (divisor > 0);
15333   if (divisor == 1)
15334     return value;
15335
15336   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
15337      have to do anything.  Only do this when we are not given a const,
15338      because in that case, this check is more expensive than just
15339      doing it.  */
15340   if (TREE_CODE (value) != INTEGER_CST)
15341     {
15342       div = build_int_cst (TREE_TYPE (value), divisor);
15343
15344       if (multiple_of_p (TREE_TYPE (value), value, div))
15345         return value;
15346     }
15347
15348   /* If divisor is a power of two, simplify this to bit manipulation.  */
15349   if (divisor == (divisor & -divisor))
15350     {
15351       tree t;
15352
15353       t = build_int_cst (TREE_TYPE (value), -divisor);
15354       value = size_binop (BIT_AND_EXPR, value, t);
15355     }
15356   else
15357     {
15358       if (!div)
15359         div = build_int_cst (TREE_TYPE (value), divisor);
15360       value = size_binop (FLOOR_DIV_EXPR, value, div);
15361       value = size_binop (MULT_EXPR, value, div);
15362     }
15363
15364   return value;
15365 }
15366
15367 /* Returns the pointer to the base of the object addressed by EXP and
15368    extracts the information about the offset of the access, storing it
15369    to PBITPOS and POFFSET.  */
15370
15371 static tree
15372 split_address_to_core_and_offset (tree exp,
15373                                   HOST_WIDE_INT *pbitpos, tree *poffset)
15374 {
15375   tree core;
15376   enum machine_mode mode;
15377   int unsignedp, volatilep;
15378   HOST_WIDE_INT bitsize;
15379
15380   if (TREE_CODE (exp) == ADDR_EXPR)
15381     {
15382       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15383                                   poffset, &mode, &unsignedp, &volatilep,
15384                                   false);
15385       core = fold_addr_expr (core);
15386     }
15387   else
15388     {
15389       core = exp;
15390       *pbitpos = 0;
15391       *poffset = NULL_TREE;
15392     }
15393
15394   return core;
15395 }
15396
15397 /* Returns true if addresses of E1 and E2 differ by a constant, false
15398    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
15399
15400 bool
15401 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15402 {
15403   tree core1, core2;
15404   HOST_WIDE_INT bitpos1, bitpos2;
15405   tree toffset1, toffset2, tdiff, type;
15406
15407   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15408   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15409
15410   if (bitpos1 % BITS_PER_UNIT != 0
15411       || bitpos2 % BITS_PER_UNIT != 0
15412       || !operand_equal_p (core1, core2, 0))
15413     return false;
15414
15415   if (toffset1 && toffset2)
15416     {
15417       type = TREE_TYPE (toffset1);
15418       if (type != TREE_TYPE (toffset2))
15419         toffset2 = fold_convert (type, toffset2);
15420
15421       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15422       if (!cst_and_fits_in_hwi (tdiff))
15423         return false;
15424
15425       *diff = int_cst_value (tdiff);
15426     }
15427   else if (toffset1 || toffset2)
15428     {
15429       /* If only one of the offsets is non-constant, the difference cannot
15430          be a constant.  */
15431       return false;
15432     }
15433   else
15434     *diff = 0;
15435
15436   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15437   return true;
15438 }
15439
15440 /* Simplify the floating point expression EXP when the sign of the
15441    result is not significant.  Return NULL_TREE if no simplification
15442    is possible.  */
15443
15444 tree
15445 fold_strip_sign_ops (tree exp)
15446 {
15447   tree arg0, arg1;
15448
15449   switch (TREE_CODE (exp))
15450     {
15451     case ABS_EXPR:
15452     case NEGATE_EXPR:
15453       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15454       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15455
15456     case MULT_EXPR:
15457     case RDIV_EXPR:
15458       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15459         return NULL_TREE;
15460       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15461       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15462       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15463         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15464                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
15465                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
15466       break;
15467
15468     case COMPOUND_EXPR:
15469       arg0 = TREE_OPERAND (exp, 0);
15470       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15471       if (arg1)
15472         return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15473       break;
15474       
15475     case COND_EXPR:
15476       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15477       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15478       if (arg0 || arg1)
15479         return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15480                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
15481                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
15482       break;
15483       
15484     case CALL_EXPR:
15485       {
15486         const enum built_in_function fcode = builtin_mathfn_code (exp);
15487         switch (fcode)
15488         {
15489         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15490           /* Strip copysign function call, return the 1st argument. */
15491           arg0 = CALL_EXPR_ARG (exp, 0);
15492           arg1 = CALL_EXPR_ARG (exp, 1);
15493           return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15494
15495         default:
15496           /* Strip sign ops from the argument of "odd" math functions.  */
15497           if (negate_mathfn_p (fcode))
15498             {
15499               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15500               if (arg0)
15501                 return build_call_expr (get_callee_fndecl (exp), 1, arg0);
15502             }
15503           break;
15504         }
15505       }
15506       break;
15507
15508     default:
15509       break;
15510     }
15511   return NULL_TREE;
15512 }