OSDN Git Service

9333c5907477766856e1b33eaafd600e3734c25c
[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 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
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.
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 takes a constant and prior overflow indicator, and
43    forces the value to fit the type.  It returns an overflow indicator.  */
44
45 #include "config.h"
46 #include "system.h"
47 #include "coretypes.h"
48 #include "tm.h"
49 #include "flags.h"
50 #include "tree.h"
51 #include "real.h"
52 #include "rtl.h"
53 #include "expr.h"
54 #include "tm_p.h"
55 #include "toplev.h"
56 #include "ggc.h"
57 #include "hashtab.h"
58 #include "langhooks.h"
59 #include "md5.h"
60
61 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
62 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
63 static bool negate_expr_p (tree);
64 static tree negate_expr (tree);
65 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
66 static tree associate_trees (tree, tree, enum tree_code, tree);
67 static tree int_const_binop (enum tree_code, tree, tree, int);
68 static tree const_binop (enum tree_code, tree, tree, int);
69 static hashval_t size_htab_hash (const void *);
70 static int size_htab_eq (const void *, const void *);
71 static tree fold_convert (tree, tree);
72 static enum tree_code invert_tree_comparison (enum tree_code);
73 static enum tree_code swap_tree_comparison (enum tree_code);
74 static int comparison_to_compcode (enum tree_code);
75 static enum tree_code compcode_to_comparison (int);
76 static int truth_value_p (enum tree_code);
77 static int operand_equal_for_comparison_p (tree, tree, tree);
78 static int twoval_comparison_p (tree, tree *, tree *, int *);
79 static tree eval_subst (tree, tree, tree, tree, tree);
80 static tree pedantic_omit_one_operand (tree, tree, tree);
81 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
82 static tree make_bit_field_ref (tree, tree, int, int, int);
83 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
84 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
85                                     enum machine_mode *, int *, int *,
86                                     tree *, tree *);
87 static int all_ones_mask_p (tree, int);
88 static tree sign_bit_p (tree, tree);
89 static int simple_operand_p (tree);
90 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
91 static tree make_range (tree, int *, tree *, tree *);
92 static tree build_range_check (tree, tree, int, tree, tree);
93 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
94                          tree);
95 static tree fold_range_test (tree);
96 static tree unextend (tree, int, int, tree);
97 static tree fold_truthop (enum tree_code, tree, tree, tree);
98 static tree optimize_minmax_comparison (tree);
99 static tree extract_muldiv (tree, tree, enum tree_code, tree);
100 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree);
101 static tree strip_compound_expr (tree, tree);
102 static int multiple_of_p (tree, tree, tree);
103 static tree constant_boolean_node (int, tree);
104 static int count_cond (tree, int);
105 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree, tree,
106                                                  tree, int);
107 static bool fold_real_zero_addition_p (tree, tree, int);
108 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
109                                  tree, tree, tree);
110 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
111
112 /* The following constants represent a bit based encoding of GCC's
113    comparison operators.  This encoding simplifies transformations
114    on relational comparison operators, such as AND and OR.  */
115 #define COMPCODE_FALSE   0
116 #define COMPCODE_LT      1
117 #define COMPCODE_EQ      2
118 #define COMPCODE_LE      3
119 #define COMPCODE_GT      4
120 #define COMPCODE_NE      5
121 #define COMPCODE_GE      6
122 #define COMPCODE_TRUE    7
123
124 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
125    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
126    and SUM1.  Then this yields nonzero if overflow occurred during the
127    addition.
128
129    Overflow occurs if A and B have the same sign, but A and SUM differ in
130    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
131    sign.  */
132 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
133 \f
134 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
135    We do that by representing the two-word integer in 4 words, with only
136    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
137    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
138
139 #define LOWPART(x) \
140   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
141 #define HIGHPART(x) \
142   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
143 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
144
145 /* Unpack a two-word integer into 4 words.
146    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
147    WORDS points to the array of HOST_WIDE_INTs.  */
148
149 static void
150 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
151 {
152   words[0] = LOWPART (low);
153   words[1] = HIGHPART (low);
154   words[2] = LOWPART (hi);
155   words[3] = HIGHPART (hi);
156 }
157
158 /* Pack an array of 4 words into a two-word integer.
159    WORDS points to the array of words.
160    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
161
162 static void
163 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
164         HOST_WIDE_INT *hi)
165 {
166   *low = words[0] + words[1] * BASE;
167   *hi = words[2] + words[3] * BASE;
168 }
169 \f
170 /* Make the integer constant T valid for its type by setting to 0 or 1 all
171    the bits in the constant that don't belong in the type.
172
173    Return 1 if a signed overflow occurs, 0 otherwise.  If OVERFLOW is
174    nonzero, a signed overflow has already occurred in calculating T, so
175    propagate it.  */
176
177 int
178 force_fit_type (tree t, int overflow)
179 {
180   unsigned HOST_WIDE_INT low;
181   HOST_WIDE_INT high;
182   unsigned int prec;
183
184   if (TREE_CODE (t) == REAL_CST)
185     {
186       /* ??? Used to check for overflow here via CHECK_FLOAT_TYPE.
187          Consider doing it via real_convert now.  */
188       return overflow;
189     }
190
191   else if (TREE_CODE (t) != INTEGER_CST)
192     return overflow;
193
194   low = TREE_INT_CST_LOW (t);
195   high = TREE_INT_CST_HIGH (t);
196
197   if (POINTER_TYPE_P (TREE_TYPE (t))
198       || TREE_CODE (TREE_TYPE (t)) == OFFSET_TYPE)
199     prec = POINTER_SIZE;
200   else
201     prec = TYPE_PRECISION (TREE_TYPE (t));
202
203   /* First clear all bits that are beyond the type's precision.  */
204
205   if (prec == 2 * HOST_BITS_PER_WIDE_INT)
206     ;
207   else if (prec > HOST_BITS_PER_WIDE_INT)
208     TREE_INT_CST_HIGH (t)
209       &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
210   else
211     {
212       TREE_INT_CST_HIGH (t) = 0;
213       if (prec < HOST_BITS_PER_WIDE_INT)
214         TREE_INT_CST_LOW (t) &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
215     }
216
217   /* Unsigned types do not suffer sign extension or overflow unless they
218      are a sizetype.  */
219   if (TREE_UNSIGNED (TREE_TYPE (t))
220       && ! (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
221             && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
222     return overflow;
223
224   /* If the value's sign bit is set, extend the sign.  */
225   if (prec != 2 * HOST_BITS_PER_WIDE_INT
226       && (prec > HOST_BITS_PER_WIDE_INT
227           ? 0 != (TREE_INT_CST_HIGH (t)
228                   & ((HOST_WIDE_INT) 1
229                      << (prec - HOST_BITS_PER_WIDE_INT - 1)))
230           : 0 != (TREE_INT_CST_LOW (t)
231                   & ((unsigned HOST_WIDE_INT) 1 << (prec - 1)))))
232     {
233       /* Value is negative:
234          set to 1 all the bits that are outside this type's precision.  */
235       if (prec > HOST_BITS_PER_WIDE_INT)
236         TREE_INT_CST_HIGH (t)
237           |= ((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
238       else
239         {
240           TREE_INT_CST_HIGH (t) = -1;
241           if (prec < HOST_BITS_PER_WIDE_INT)
242             TREE_INT_CST_LOW (t) |= ((unsigned HOST_WIDE_INT) (-1) << prec);
243         }
244     }
245
246   /* Return nonzero if signed overflow occurred.  */
247   return
248     ((overflow | (low ^ TREE_INT_CST_LOW (t)) | (high ^ TREE_INT_CST_HIGH (t)))
249      != 0);
250 }
251 \f
252 /* Add two doubleword integers with doubleword result.
253    Each argument is given as two `HOST_WIDE_INT' pieces.
254    One argument is L1 and H1; the other, L2 and H2.
255    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
256
257 int
258 add_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
259             unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
260             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
261 {
262   unsigned HOST_WIDE_INT l;
263   HOST_WIDE_INT h;
264
265   l = l1 + l2;
266   h = h1 + h2 + (l < l1);
267
268   *lv = l;
269   *hv = h;
270   return OVERFLOW_SUM_SIGN (h1, h2, h);
271 }
272
273 /* Negate a doubleword integer with doubleword result.
274    Return nonzero if the operation overflows, assuming it's signed.
275    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
276    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
277
278 int
279 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
280             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
281 {
282   if (l1 == 0)
283     {
284       *lv = 0;
285       *hv = - h1;
286       return (*hv & h1) < 0;
287     }
288   else
289     {
290       *lv = -l1;
291       *hv = ~h1;
292       return 0;
293     }
294 }
295 \f
296 /* Multiply two doubleword integers with doubleword result.
297    Return nonzero if the operation overflows, assuming it's signed.
298    Each argument is given as two `HOST_WIDE_INT' pieces.
299    One argument is L1 and H1; the other, L2 and H2.
300    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
301
302 int
303 mul_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
304             unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
305             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
306 {
307   HOST_WIDE_INT arg1[4];
308   HOST_WIDE_INT arg2[4];
309   HOST_WIDE_INT prod[4 * 2];
310   unsigned HOST_WIDE_INT carry;
311   int i, j, k;
312   unsigned HOST_WIDE_INT toplow, neglow;
313   HOST_WIDE_INT tophigh, neghigh;
314
315   encode (arg1, l1, h1);
316   encode (arg2, l2, h2);
317
318   memset (prod, 0, sizeof prod);
319
320   for (i = 0; i < 4; i++)
321     {
322       carry = 0;
323       for (j = 0; j < 4; j++)
324         {
325           k = i + j;
326           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
327           carry += arg1[i] * arg2[j];
328           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
329           carry += prod[k];
330           prod[k] = LOWPART (carry);
331           carry = HIGHPART (carry);
332         }
333       prod[i + 4] = carry;
334     }
335
336   decode (prod, lv, hv);        /* This ignores prod[4] through prod[4*2-1] */
337
338   /* Check for overflow by calculating the top half of the answer in full;
339      it should agree with the low half's sign bit.  */
340   decode (prod + 4, &toplow, &tophigh);
341   if (h1 < 0)
342     {
343       neg_double (l2, h2, &neglow, &neghigh);
344       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
345     }
346   if (h2 < 0)
347     {
348       neg_double (l1, h1, &neglow, &neghigh);
349       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
350     }
351   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
352 }
353 \f
354 /* Shift the doubleword integer in L1, H1 left by COUNT places
355    keeping only PREC bits of result.
356    Shift right if COUNT is negative.
357    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
358    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
359
360 void
361 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
362                HOST_WIDE_INT count, unsigned int prec,
363                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
364 {
365   unsigned HOST_WIDE_INT signmask;
366
367   if (count < 0)
368     {
369       rshift_double (l1, h1, -count, prec, lv, hv, arith);
370       return;
371     }
372
373 #ifdef SHIFT_COUNT_TRUNCATED
374   if (SHIFT_COUNT_TRUNCATED)
375     count %= prec;
376 #endif
377
378   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
379     {
380       /* Shifting by the host word size is undefined according to the
381          ANSI standard, so we must handle this as a special case.  */
382       *hv = 0;
383       *lv = 0;
384     }
385   else if (count >= HOST_BITS_PER_WIDE_INT)
386     {
387       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
388       *lv = 0;
389     }
390   else
391     {
392       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
393              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
394       *lv = l1 << count;
395     }
396
397   /* Sign extend all bits that are beyond the precision.  */
398
399   signmask = -((prec > HOST_BITS_PER_WIDE_INT
400                 ? ((unsigned HOST_WIDE_INT) *hv
401                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
402                 : (*lv >> (prec - 1))) & 1);
403
404   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
405     ;
406   else if (prec >= HOST_BITS_PER_WIDE_INT)
407     {
408       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
409       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
410     }
411   else
412     {
413       *hv = signmask;
414       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
415       *lv |= signmask << prec;
416     }
417 }
418
419 /* Shift the doubleword integer in L1, H1 right by COUNT places
420    keeping only PREC bits of result.  COUNT must be positive.
421    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
422    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
423
424 void
425 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
426                HOST_WIDE_INT count, unsigned int prec,
427                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
428                int arith)
429 {
430   unsigned HOST_WIDE_INT signmask;
431
432   signmask = (arith
433               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
434               : 0);
435
436 #ifdef SHIFT_COUNT_TRUNCATED
437   if (SHIFT_COUNT_TRUNCATED)
438     count %= prec;
439 #endif
440
441   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
442     {
443       /* Shifting by the host word size is undefined according to the
444          ANSI standard, so we must handle this as a special case.  */
445       *hv = 0;
446       *lv = 0;
447     }
448   else if (count >= HOST_BITS_PER_WIDE_INT)
449     {
450       *hv = 0;
451       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
452     }
453   else
454     {
455       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
456       *lv = ((l1 >> count)
457              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
458     }
459
460   /* Zero / sign extend all bits that are beyond the precision.  */
461
462   if (count >= (HOST_WIDE_INT)prec)
463     {
464       *hv = signmask;
465       *lv = signmask;
466     }
467   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
468     ;
469   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
470     {
471       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
472       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
473     }
474   else
475     {
476       *hv = signmask;
477       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
478       *lv |= signmask << (prec - count);
479     }
480 }
481 \f
482 /* Rotate the doubleword integer in L1, H1 left by COUNT places
483    keeping only PREC bits of result.
484    Rotate right if COUNT is negative.
485    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
486
487 void
488 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
489                 HOST_WIDE_INT count, unsigned int prec,
490                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
491 {
492   unsigned HOST_WIDE_INT s1l, s2l;
493   HOST_WIDE_INT s1h, s2h;
494
495   count %= prec;
496   if (count < 0)
497     count += prec;
498
499   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
500   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
501   *lv = s1l | s2l;
502   *hv = s1h | s2h;
503 }
504
505 /* Rotate the doubleword integer in L1, H1 left by COUNT places
506    keeping only PREC bits of result.  COUNT must be positive.
507    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
508
509 void
510 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
511                 HOST_WIDE_INT count, unsigned int prec,
512                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
513 {
514   unsigned HOST_WIDE_INT s1l, s2l;
515   HOST_WIDE_INT s1h, s2h;
516
517   count %= prec;
518   if (count < 0)
519     count += prec;
520
521   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
522   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
523   *lv = s1l | s2l;
524   *hv = s1h | s2h;
525 }
526 \f
527 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
528    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
529    CODE is a tree code for a kind of division, one of
530    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
531    or EXACT_DIV_EXPR
532    It controls how the quotient is rounded to an integer.
533    Return nonzero if the operation overflows.
534    UNS nonzero says do unsigned division.  */
535
536 int
537 div_and_round_double (enum tree_code code, int uns,
538                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
539                       HOST_WIDE_INT hnum_orig,
540                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
541                       HOST_WIDE_INT hden_orig,
542                       unsigned HOST_WIDE_INT *lquo,
543                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
544                       HOST_WIDE_INT *hrem)
545 {
546   int quo_neg = 0;
547   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
548   HOST_WIDE_INT den[4], quo[4];
549   int i, j;
550   unsigned HOST_WIDE_INT work;
551   unsigned HOST_WIDE_INT carry = 0;
552   unsigned HOST_WIDE_INT lnum = lnum_orig;
553   HOST_WIDE_INT hnum = hnum_orig;
554   unsigned HOST_WIDE_INT lden = lden_orig;
555   HOST_WIDE_INT hden = hden_orig;
556   int overflow = 0;
557
558   if (hden == 0 && lden == 0)
559     overflow = 1, lden = 1;
560
561   /* calculate quotient sign and convert operands to unsigned.  */
562   if (!uns)
563     {
564       if (hnum < 0)
565         {
566           quo_neg = ~ quo_neg;
567           /* (minimum integer) / (-1) is the only overflow case.  */
568           if (neg_double (lnum, hnum, &lnum, &hnum)
569               && ((HOST_WIDE_INT) lden & hden) == -1)
570             overflow = 1;
571         }
572       if (hden < 0)
573         {
574           quo_neg = ~ quo_neg;
575           neg_double (lden, hden, &lden, &hden);
576         }
577     }
578
579   if (hnum == 0 && hden == 0)
580     {                           /* single precision */
581       *hquo = *hrem = 0;
582       /* This unsigned division rounds toward zero.  */
583       *lquo = lnum / lden;
584       goto finish_up;
585     }
586
587   if (hnum == 0)
588     {                           /* trivial case: dividend < divisor */
589       /* hden != 0 already checked.  */
590       *hquo = *lquo = 0;
591       *hrem = hnum;
592       *lrem = lnum;
593       goto finish_up;
594     }
595
596   memset (quo, 0, sizeof quo);
597
598   memset (num, 0, sizeof num);  /* to zero 9th element */
599   memset (den, 0, sizeof den);
600
601   encode (num, lnum, hnum);
602   encode (den, lden, hden);
603
604   /* Special code for when the divisor < BASE.  */
605   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
606     {
607       /* hnum != 0 already checked.  */
608       for (i = 4 - 1; i >= 0; i--)
609         {
610           work = num[i] + carry * BASE;
611           quo[i] = work / lden;
612           carry = work % lden;
613         }
614     }
615   else
616     {
617       /* Full double precision division,
618          with thanks to Don Knuth's "Seminumerical Algorithms".  */
619       int num_hi_sig, den_hi_sig;
620       unsigned HOST_WIDE_INT quo_est, scale;
621
622       /* Find the highest nonzero divisor digit.  */
623       for (i = 4 - 1;; i--)
624         if (den[i] != 0)
625           {
626             den_hi_sig = i;
627             break;
628           }
629
630       /* Insure that the first digit of the divisor is at least BASE/2.
631          This is required by the quotient digit estimation algorithm.  */
632
633       scale = BASE / (den[den_hi_sig] + 1);
634       if (scale > 1)
635         {               /* scale divisor and dividend */
636           carry = 0;
637           for (i = 0; i <= 4 - 1; i++)
638             {
639               work = (num[i] * scale) + carry;
640               num[i] = LOWPART (work);
641               carry = HIGHPART (work);
642             }
643
644           num[4] = carry;
645           carry = 0;
646           for (i = 0; i <= 4 - 1; i++)
647             {
648               work = (den[i] * scale) + carry;
649               den[i] = LOWPART (work);
650               carry = HIGHPART (work);
651               if (den[i] != 0) den_hi_sig = i;
652             }
653         }
654
655       num_hi_sig = 4;
656
657       /* Main loop */
658       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
659         {
660           /* Guess the next quotient digit, quo_est, by dividing the first
661              two remaining dividend digits by the high order quotient digit.
662              quo_est is never low and is at most 2 high.  */
663           unsigned HOST_WIDE_INT tmp;
664
665           num_hi_sig = i + den_hi_sig + 1;
666           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
667           if (num[num_hi_sig] != den[den_hi_sig])
668             quo_est = work / den[den_hi_sig];
669           else
670             quo_est = BASE - 1;
671
672           /* Refine quo_est so it's usually correct, and at most one high.  */
673           tmp = work - quo_est * den[den_hi_sig];
674           if (tmp < BASE
675               && (den[den_hi_sig - 1] * quo_est
676                   > (tmp * BASE + num[num_hi_sig - 2])))
677             quo_est--;
678
679           /* Try QUO_EST as the quotient digit, by multiplying the
680              divisor by QUO_EST and subtracting from the remaining dividend.
681              Keep in mind that QUO_EST is the I - 1st digit.  */
682
683           carry = 0;
684           for (j = 0; j <= den_hi_sig; j++)
685             {
686               work = quo_est * den[j] + carry;
687               carry = HIGHPART (work);
688               work = num[i + j] - LOWPART (work);
689               num[i + j] = LOWPART (work);
690               carry += HIGHPART (work) != 0;
691             }
692
693           /* If quo_est was high by one, then num[i] went negative and
694              we need to correct things.  */
695           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
696             {
697               quo_est--;
698               carry = 0;                /* add divisor back in */
699               for (j = 0; j <= den_hi_sig; j++)
700                 {
701                   work = num[i + j] + den[j] + carry;
702                   carry = HIGHPART (work);
703                   num[i + j] = LOWPART (work);
704                 }
705
706               num [num_hi_sig] += carry;
707             }
708
709           /* Store the quotient digit.  */
710           quo[i] = quo_est;
711         }
712     }
713
714   decode (quo, lquo, hquo);
715
716  finish_up:
717   /* If result is negative, make it so.  */
718   if (quo_neg)
719     neg_double (*lquo, *hquo, lquo, hquo);
720
721   /* compute trial remainder:  rem = num - (quo * den)  */
722   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
723   neg_double (*lrem, *hrem, lrem, hrem);
724   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
725
726   switch (code)
727     {
728     case TRUNC_DIV_EXPR:
729     case TRUNC_MOD_EXPR:        /* round toward zero */
730     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
731       return overflow;
732
733     case FLOOR_DIV_EXPR:
734     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
735       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
736         {
737           /* quo = quo - 1;  */
738           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
739                       lquo, hquo);
740         }
741       else
742         return overflow;
743       break;
744
745     case CEIL_DIV_EXPR:
746     case CEIL_MOD_EXPR:         /* round toward positive infinity */
747       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
748         {
749           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
750                       lquo, hquo);
751         }
752       else
753         return overflow;
754       break;
755
756     case ROUND_DIV_EXPR:
757     case ROUND_MOD_EXPR:        /* round to closest integer */
758       {
759         unsigned HOST_WIDE_INT labs_rem = *lrem;
760         HOST_WIDE_INT habs_rem = *hrem;
761         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
762         HOST_WIDE_INT habs_den = hden, htwice;
763
764         /* Get absolute values.  */
765         if (*hrem < 0)
766           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
767         if (hden < 0)
768           neg_double (lden, hden, &labs_den, &habs_den);
769
770         /* If (2 * abs (lrem) >= abs (lden)) */
771         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
772                     labs_rem, habs_rem, &ltwice, &htwice);
773
774         if (((unsigned HOST_WIDE_INT) habs_den
775              < (unsigned HOST_WIDE_INT) htwice)
776             || (((unsigned HOST_WIDE_INT) habs_den
777                  == (unsigned HOST_WIDE_INT) htwice)
778                 && (labs_den < ltwice)))
779           {
780             if (*hquo < 0)
781               /* quo = quo - 1;  */
782               add_double (*lquo, *hquo,
783                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
784             else
785               /* quo = quo + 1; */
786               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
787                           lquo, hquo);
788           }
789         else
790           return overflow;
791       }
792       break;
793
794     default:
795       abort ();
796     }
797
798   /* compute true remainder:  rem = num - (quo * den)  */
799   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
800   neg_double (*lrem, *hrem, lrem, hrem);
801   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
802   return overflow;
803 }
804 \f
805 /* Determine whether an expression T can be cheaply negated using
806    the function negate_expr.  */
807
808 static bool
809 negate_expr_p (tree t)
810 {
811   unsigned HOST_WIDE_INT val;
812   unsigned int prec;
813   tree type;
814
815   if (t == 0)
816     return false;
817
818   type = TREE_TYPE (t);
819
820   STRIP_SIGN_NOPS (t);
821   switch (TREE_CODE (t))
822     {
823     case INTEGER_CST:
824       if (TREE_UNSIGNED (type))
825         return false;
826
827       /* Check that -CST will not overflow type.  */
828       prec = TYPE_PRECISION (type);
829       if (prec > HOST_BITS_PER_WIDE_INT)
830         {
831           if (TREE_INT_CST_LOW (t) != 0)
832             return true;
833           prec -= HOST_BITS_PER_WIDE_INT;
834           val = TREE_INT_CST_HIGH (t);
835         }
836       else
837         val = TREE_INT_CST_LOW (t);
838       if (prec < HOST_BITS_PER_WIDE_INT)
839         val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
840       return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
841
842     case REAL_CST:
843     case NEGATE_EXPR:
844       return true;
845
846     case MINUS_EXPR:
847       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
848       return ! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations;
849
850     default:
851       break;
852     }
853   return false;
854 }
855
856 /* Given T, an expression, return the negation of T.  Allow for T to be
857    null, in which case return null.  */
858
859 static tree
860 negate_expr (tree t)
861 {
862   tree type;
863   tree tem;
864
865   if (t == 0)
866     return 0;
867
868   type = TREE_TYPE (t);
869   STRIP_SIGN_NOPS (t);
870
871   switch (TREE_CODE (t))
872     {
873     case INTEGER_CST:
874     case REAL_CST:
875       if (! TREE_UNSIGNED (type)
876           && 0 != (tem = fold (build1 (NEGATE_EXPR, type, t)))
877           && ! TREE_OVERFLOW (tem))
878         return tem;
879       break;
880
881     case NEGATE_EXPR:
882       return convert (type, TREE_OPERAND (t, 0));
883
884     case MINUS_EXPR:
885       /* - (A - B) -> B - A  */
886       if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
887         return convert (type,
888                         fold (build (MINUS_EXPR, TREE_TYPE (t),
889                                      TREE_OPERAND (t, 1),
890                                      TREE_OPERAND (t, 0))));
891       break;
892
893     default:
894       break;
895     }
896
897   return convert (type, fold (build1 (NEGATE_EXPR, TREE_TYPE (t), t)));
898 }
899 \f
900 /* Split a tree IN into a constant, literal and variable parts that could be
901    combined with CODE to make IN.  "constant" means an expression with
902    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
903    commutative arithmetic operation.  Store the constant part into *CONP,
904    the literal in *LITP and return the variable part.  If a part isn't
905    present, set it to null.  If the tree does not decompose in this way,
906    return the entire tree as the variable part and the other parts as null.
907
908    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
909    case, we negate an operand that was subtracted.  Except if it is a
910    literal for which we use *MINUS_LITP instead.
911
912    If NEGATE_P is true, we are negating all of IN, again except a literal
913    for which we use *MINUS_LITP instead.
914
915    If IN is itself a literal or constant, return it as appropriate.
916
917    Note that we do not guarantee that any of the three values will be the
918    same type as IN, but they will have the same signedness and mode.  */
919
920 static tree
921 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
922             tree *minus_litp, int negate_p)
923 {
924   tree var = 0;
925
926   *conp = 0;
927   *litp = 0;
928   *minus_litp = 0;
929
930   /* Strip any conversions that don't change the machine mode or signedness.  */
931   STRIP_SIGN_NOPS (in);
932
933   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
934     *litp = in;
935   else if (TREE_CODE (in) == code
936            || (! FLOAT_TYPE_P (TREE_TYPE (in))
937                /* We can associate addition and subtraction together (even
938                   though the C standard doesn't say so) for integers because
939                   the value is not affected.  For reals, the value might be
940                   affected, so we can't.  */
941                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
942                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
943     {
944       tree op0 = TREE_OPERAND (in, 0);
945       tree op1 = TREE_OPERAND (in, 1);
946       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
947       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
948
949       /* First see if either of the operands is a literal, then a constant.  */
950       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
951         *litp = op0, op0 = 0;
952       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
953         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
954
955       if (op0 != 0 && TREE_CONSTANT (op0))
956         *conp = op0, op0 = 0;
957       else if (op1 != 0 && TREE_CONSTANT (op1))
958         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
959
960       /* If we haven't dealt with either operand, this is not a case we can
961          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
962       if (op0 != 0 && op1 != 0)
963         var = in;
964       else if (op0 != 0)
965         var = op0;
966       else
967         var = op1, neg_var_p = neg1_p;
968
969       /* Now do any needed negations.  */
970       if (neg_litp_p)
971         *minus_litp = *litp, *litp = 0;
972       if (neg_conp_p)
973         *conp = negate_expr (*conp);
974       if (neg_var_p)
975         var = negate_expr (var);
976     }
977   else if (TREE_CONSTANT (in))
978     *conp = in;
979   else
980     var = in;
981
982   if (negate_p)
983     {
984       if (*litp)
985         *minus_litp = *litp, *litp = 0;
986       else if (*minus_litp)
987         *litp = *minus_litp, *minus_litp = 0;
988       *conp = negate_expr (*conp);
989       var = negate_expr (var);
990     }
991
992   return var;
993 }
994
995 /* Re-associate trees split by the above function.  T1 and T2 are either
996    expressions to associate or null.  Return the new expression, if any.  If
997    we build an operation, do it in TYPE and with CODE.  */
998
999 static tree
1000 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1001 {
1002   if (t1 == 0)
1003     return t2;
1004   else if (t2 == 0)
1005     return t1;
1006
1007   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1008      try to fold this since we will have infinite recursion.  But do
1009      deal with any NEGATE_EXPRs.  */
1010   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1011       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1012     {
1013       if (code == PLUS_EXPR)
1014         {
1015           if (TREE_CODE (t1) == NEGATE_EXPR)
1016             return build (MINUS_EXPR, type, convert (type, t2),
1017                           convert (type, TREE_OPERAND (t1, 0)));
1018           else if (TREE_CODE (t2) == NEGATE_EXPR)
1019             return build (MINUS_EXPR, type, convert (type, t1),
1020                           convert (type, TREE_OPERAND (t2, 0)));
1021         }
1022       return build (code, type, convert (type, t1), convert (type, t2));
1023     }
1024
1025   return fold (build (code, type, convert (type, t1), convert (type, t2)));
1026 }
1027 \f
1028 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1029    to produce a new constant.
1030
1031    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1032
1033 static tree
1034 int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1035 {
1036   unsigned HOST_WIDE_INT int1l, int2l;
1037   HOST_WIDE_INT int1h, int2h;
1038   unsigned HOST_WIDE_INT low;
1039   HOST_WIDE_INT hi;
1040   unsigned HOST_WIDE_INT garbagel;
1041   HOST_WIDE_INT garbageh;
1042   tree t;
1043   tree type = TREE_TYPE (arg1);
1044   int uns = TREE_UNSIGNED (type);
1045   int is_sizetype
1046     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1047   int overflow = 0;
1048   int no_overflow = 0;
1049
1050   int1l = TREE_INT_CST_LOW (arg1);
1051   int1h = TREE_INT_CST_HIGH (arg1);
1052   int2l = TREE_INT_CST_LOW (arg2);
1053   int2h = TREE_INT_CST_HIGH (arg2);
1054
1055   switch (code)
1056     {
1057     case BIT_IOR_EXPR:
1058       low = int1l | int2l, hi = int1h | int2h;
1059       break;
1060
1061     case BIT_XOR_EXPR:
1062       low = int1l ^ int2l, hi = int1h ^ int2h;
1063       break;
1064
1065     case BIT_AND_EXPR:
1066       low = int1l & int2l, hi = int1h & int2h;
1067       break;
1068
1069     case BIT_ANDTC_EXPR:
1070       low = int1l & ~int2l, hi = int1h & ~int2h;
1071       break;
1072
1073     case RSHIFT_EXPR:
1074       int2l = -int2l;
1075     case LSHIFT_EXPR:
1076       /* It's unclear from the C standard whether shifts can overflow.
1077          The following code ignores overflow; perhaps a C standard
1078          interpretation ruling is needed.  */
1079       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1080                      &low, &hi, !uns);
1081       no_overflow = 1;
1082       break;
1083
1084     case RROTATE_EXPR:
1085       int2l = - int2l;
1086     case LROTATE_EXPR:
1087       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1088                       &low, &hi);
1089       break;
1090
1091     case PLUS_EXPR:
1092       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1093       break;
1094
1095     case MINUS_EXPR:
1096       neg_double (int2l, int2h, &low, &hi);
1097       add_double (int1l, int1h, low, hi, &low, &hi);
1098       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1099       break;
1100
1101     case MULT_EXPR:
1102       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1103       break;
1104
1105     case TRUNC_DIV_EXPR:
1106     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1107     case EXACT_DIV_EXPR:
1108       /* This is a shortcut for a common special case.  */
1109       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1110           && ! TREE_CONSTANT_OVERFLOW (arg1)
1111           && ! TREE_CONSTANT_OVERFLOW (arg2)
1112           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1113         {
1114           if (code == CEIL_DIV_EXPR)
1115             int1l += int2l - 1;
1116
1117           low = int1l / int2l, hi = 0;
1118           break;
1119         }
1120
1121       /* ... fall through ...  */
1122
1123     case ROUND_DIV_EXPR:
1124       if (int2h == 0 && int2l == 1)
1125         {
1126           low = int1l, hi = int1h;
1127           break;
1128         }
1129       if (int1l == int2l && int1h == int2h
1130           && ! (int1l == 0 && int1h == 0))
1131         {
1132           low = 1, hi = 0;
1133           break;
1134         }
1135       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1136                                        &low, &hi, &garbagel, &garbageh);
1137       break;
1138
1139     case TRUNC_MOD_EXPR:
1140     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1141       /* This is a shortcut for a common special case.  */
1142       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1143           && ! TREE_CONSTANT_OVERFLOW (arg1)
1144           && ! TREE_CONSTANT_OVERFLOW (arg2)
1145           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1146         {
1147           if (code == CEIL_MOD_EXPR)
1148             int1l += int2l - 1;
1149           low = int1l % int2l, hi = 0;
1150           break;
1151         }
1152
1153       /* ... fall through ...  */
1154
1155     case ROUND_MOD_EXPR:
1156       overflow = div_and_round_double (code, uns,
1157                                        int1l, int1h, int2l, int2h,
1158                                        &garbagel, &garbageh, &low, &hi);
1159       break;
1160
1161     case MIN_EXPR:
1162     case MAX_EXPR:
1163       if (uns)
1164         low = (((unsigned HOST_WIDE_INT) int1h
1165                 < (unsigned HOST_WIDE_INT) int2h)
1166                || (((unsigned HOST_WIDE_INT) int1h
1167                     == (unsigned HOST_WIDE_INT) int2h)
1168                    && int1l < int2l));
1169       else
1170         low = (int1h < int2h
1171                || (int1h == int2h && int1l < int2l));
1172
1173       if (low == (code == MIN_EXPR))
1174         low = int1l, hi = int1h;
1175       else
1176         low = int2l, hi = int2h;
1177       break;
1178
1179     default:
1180       abort ();
1181     }
1182
1183   /* If this is for a sizetype, can be represented as one (signed)
1184      HOST_WIDE_INT word, and doesn't overflow, use size_int since it caches
1185      constants.  */
1186   if (is_sizetype
1187       && ((hi == 0 && (HOST_WIDE_INT) low >= 0)
1188           || (hi == -1 && (HOST_WIDE_INT) low < 0))
1189       && overflow == 0 && ! TREE_OVERFLOW (arg1) && ! TREE_OVERFLOW (arg2))
1190     return size_int_type_wide (low, type);
1191   else
1192     {
1193       t = build_int_2 (low, hi);
1194       TREE_TYPE (t) = TREE_TYPE (arg1);
1195     }
1196
1197   TREE_OVERFLOW (t)
1198     = ((notrunc
1199         ? (!uns || is_sizetype) && overflow
1200         : (force_fit_type (t, (!uns || is_sizetype) && overflow)
1201            && ! no_overflow))
1202        | TREE_OVERFLOW (arg1)
1203        | TREE_OVERFLOW (arg2));
1204
1205   /* If we're doing a size calculation, unsigned arithmetic does overflow.
1206      So check if force_fit_type truncated the value.  */
1207   if (is_sizetype
1208       && ! TREE_OVERFLOW (t)
1209       && (TREE_INT_CST_HIGH (t) != hi
1210           || TREE_INT_CST_LOW (t) != low))
1211     TREE_OVERFLOW (t) = 1;
1212
1213   TREE_CONSTANT_OVERFLOW (t) = (TREE_OVERFLOW (t)
1214                                 | TREE_CONSTANT_OVERFLOW (arg1)
1215                                 | TREE_CONSTANT_OVERFLOW (arg2));
1216   return t;
1217 }
1218
1219 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1220    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1221    are the same kind of constant and the same machine mode.
1222
1223    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1224
1225 static tree
1226 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1227 {
1228   STRIP_NOPS (arg1);
1229   STRIP_NOPS (arg2);
1230
1231   if (TREE_CODE (arg1) == INTEGER_CST)
1232     return int_const_binop (code, arg1, arg2, notrunc);
1233
1234   if (TREE_CODE (arg1) == REAL_CST)
1235     {
1236       enum machine_mode mode;
1237       REAL_VALUE_TYPE d1;
1238       REAL_VALUE_TYPE d2;
1239       REAL_VALUE_TYPE value;
1240       tree t, type;
1241
1242       d1 = TREE_REAL_CST (arg1);
1243       d2 = TREE_REAL_CST (arg2);
1244
1245       type = TREE_TYPE (arg1);
1246       mode = TYPE_MODE (type);
1247
1248       /* Don't perform operation if we honor signaling NaNs and
1249          either operand is a NaN.  */
1250       if (HONOR_SNANS (mode)
1251           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1252         return NULL_TREE;
1253
1254       /* Don't perform operation if it would raise a division
1255          by zero exception.  */
1256       if (code == RDIV_EXPR
1257           && REAL_VALUES_EQUAL (d2, dconst0)
1258           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1259         return NULL_TREE;
1260
1261       /* If either operand is a NaN, just return it.  Otherwise, set up
1262          for floating-point trap; we return an overflow.  */
1263       if (REAL_VALUE_ISNAN (d1))
1264         return arg1;
1265       else if (REAL_VALUE_ISNAN (d2))
1266         return arg2;
1267
1268       REAL_ARITHMETIC (value, code, d1, d2);
1269
1270       t = build_real (type, real_value_truncate (mode, value));
1271
1272       TREE_OVERFLOW (t)
1273         = (force_fit_type (t, 0)
1274            | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1275       TREE_CONSTANT_OVERFLOW (t)
1276         = TREE_OVERFLOW (t)
1277           | TREE_CONSTANT_OVERFLOW (arg1)
1278           | TREE_CONSTANT_OVERFLOW (arg2);
1279       return t;
1280     }
1281   if (TREE_CODE (arg1) == COMPLEX_CST)
1282     {
1283       tree type = TREE_TYPE (arg1);
1284       tree r1 = TREE_REALPART (arg1);
1285       tree i1 = TREE_IMAGPART (arg1);
1286       tree r2 = TREE_REALPART (arg2);
1287       tree i2 = TREE_IMAGPART (arg2);
1288       tree t;
1289
1290       switch (code)
1291         {
1292         case PLUS_EXPR:
1293           t = build_complex (type,
1294                              const_binop (PLUS_EXPR, r1, r2, notrunc),
1295                              const_binop (PLUS_EXPR, i1, i2, notrunc));
1296           break;
1297
1298         case MINUS_EXPR:
1299           t = build_complex (type,
1300                              const_binop (MINUS_EXPR, r1, r2, notrunc),
1301                              const_binop (MINUS_EXPR, i1, i2, notrunc));
1302           break;
1303
1304         case MULT_EXPR:
1305           t = build_complex (type,
1306                              const_binop (MINUS_EXPR,
1307                                           const_binop (MULT_EXPR,
1308                                                        r1, r2, notrunc),
1309                                           const_binop (MULT_EXPR,
1310                                                        i1, i2, notrunc),
1311                                           notrunc),
1312                              const_binop (PLUS_EXPR,
1313                                           const_binop (MULT_EXPR,
1314                                                        r1, i2, notrunc),
1315                                           const_binop (MULT_EXPR,
1316                                                        i1, r2, notrunc),
1317                                           notrunc));
1318           break;
1319
1320         case RDIV_EXPR:
1321           {
1322             tree magsquared
1323               = const_binop (PLUS_EXPR,
1324                              const_binop (MULT_EXPR, r2, r2, notrunc),
1325                              const_binop (MULT_EXPR, i2, i2, notrunc),
1326                              notrunc);
1327
1328             t = build_complex (type,
1329                                const_binop
1330                                (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1331                                 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1332                                 const_binop (PLUS_EXPR,
1333                                              const_binop (MULT_EXPR, r1, r2,
1334                                                           notrunc),
1335                                              const_binop (MULT_EXPR, i1, i2,
1336                                                           notrunc),
1337                                              notrunc),
1338                                 magsquared, notrunc),
1339                                const_binop
1340                                (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1341                                 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1342                                 const_binop (MINUS_EXPR,
1343                                              const_binop (MULT_EXPR, i1, r2,
1344                                                           notrunc),
1345                                              const_binop (MULT_EXPR, r1, i2,
1346                                                           notrunc),
1347                                              notrunc),
1348                                 magsquared, notrunc));
1349           }
1350           break;
1351
1352         default:
1353           abort ();
1354         }
1355       return t;
1356     }
1357   return 0;
1358 }
1359
1360 /* These are the hash table functions for the hash table of INTEGER_CST
1361    nodes of a sizetype.  */
1362
1363 /* Return the hash code code X, an INTEGER_CST.  */
1364
1365 static hashval_t
1366 size_htab_hash (const void *x)
1367 {
1368   tree t = (tree) x;
1369
1370   return (TREE_INT_CST_HIGH (t) ^ TREE_INT_CST_LOW (t)
1371           ^ htab_hash_pointer (TREE_TYPE (t))
1372           ^ (TREE_OVERFLOW (t) << 20));
1373 }
1374
1375 /* Return nonzero if the value represented by *X (an INTEGER_CST tree node)
1376    is the same as that given by *Y, which is the same.  */
1377
1378 static int
1379 size_htab_eq (const void *x, const void *y)
1380 {
1381   tree xt = (tree) x;
1382   tree yt = (tree) y;
1383
1384   return (TREE_INT_CST_HIGH (xt) == TREE_INT_CST_HIGH (yt)
1385           && TREE_INT_CST_LOW (xt) == TREE_INT_CST_LOW (yt)
1386           && TREE_TYPE (xt) == TREE_TYPE (yt)
1387           && TREE_OVERFLOW (xt) == TREE_OVERFLOW (yt));
1388 }
1389 \f
1390 /* Return an INTEGER_CST with value whose low-order HOST_BITS_PER_WIDE_INT
1391    bits are given by NUMBER and of the sizetype represented by KIND.  */
1392
1393 tree
1394 size_int_wide (HOST_WIDE_INT number, enum size_type_kind kind)
1395 {
1396   return size_int_type_wide (number, sizetype_tab[(int) kind]);
1397 }
1398
1399 /* Likewise, but the desired type is specified explicitly.  */
1400
1401 static GTY (()) tree new_const;
1402 static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node)))
1403      htab_t size_htab;
1404
1405 tree
1406 size_int_type_wide (HOST_WIDE_INT number, tree type)
1407 {
1408   void **slot;
1409
1410   if (size_htab == 0)
1411     {
1412       size_htab = htab_create_ggc (1024, size_htab_hash, size_htab_eq, NULL);
1413       new_const = make_node (INTEGER_CST);
1414     }
1415
1416   /* Adjust NEW_CONST to be the constant we want.  If it's already in the
1417      hash table, we return the value from the hash table.  Otherwise, we
1418      place that in the hash table and make a new node for the next time.  */
1419   TREE_INT_CST_LOW (new_const) = number;
1420   TREE_INT_CST_HIGH (new_const) = number < 0 ? -1 : 0;
1421   TREE_TYPE (new_const) = type;
1422   TREE_OVERFLOW (new_const) = TREE_CONSTANT_OVERFLOW (new_const)
1423     = force_fit_type (new_const, 0);
1424
1425   slot = htab_find_slot (size_htab, new_const, INSERT);
1426   if (*slot == 0)
1427     {
1428       tree t = new_const;
1429
1430       *slot = new_const;
1431       new_const = make_node (INTEGER_CST);
1432       return t;
1433     }
1434   else
1435     return (tree) *slot;
1436 }
1437
1438 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1439    is a tree code.  The type of the result is taken from the operands.
1440    Both must be the same type integer type and it must be a size type.
1441    If the operands are constant, so is the result.  */
1442
1443 tree
1444 size_binop (enum tree_code code, tree arg0, tree arg1)
1445 {
1446   tree type = TREE_TYPE (arg0);
1447
1448   if (TREE_CODE (type) != INTEGER_TYPE || ! TYPE_IS_SIZETYPE (type)
1449       || type != TREE_TYPE (arg1))
1450     abort ();
1451
1452   /* Handle the special case of two integer constants faster.  */
1453   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1454     {
1455       /* And some specific cases even faster than that.  */
1456       if (code == PLUS_EXPR && integer_zerop (arg0))
1457         return arg1;
1458       else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1459                && integer_zerop (arg1))
1460         return arg0;
1461       else if (code == MULT_EXPR && integer_onep (arg0))
1462         return arg1;
1463
1464       /* Handle general case of two integer constants.  */
1465       return int_const_binop (code, arg0, arg1, 0);
1466     }
1467
1468   if (arg0 == error_mark_node || arg1 == error_mark_node)
1469     return error_mark_node;
1470
1471   return fold (build (code, type, arg0, arg1));
1472 }
1473
1474 /* Given two values, either both of sizetype or both of bitsizetype,
1475    compute the difference between the two values.  Return the value
1476    in signed type corresponding to the type of the operands.  */
1477
1478 tree
1479 size_diffop (tree arg0, tree arg1)
1480 {
1481   tree type = TREE_TYPE (arg0);
1482   tree ctype;
1483
1484   if (TREE_CODE (type) != INTEGER_TYPE || ! TYPE_IS_SIZETYPE (type)
1485       || type != TREE_TYPE (arg1))
1486     abort ();
1487
1488   /* If the type is already signed, just do the simple thing.  */
1489   if (! TREE_UNSIGNED (type))
1490     return size_binop (MINUS_EXPR, arg0, arg1);
1491
1492   ctype = (type == bitsizetype || type == ubitsizetype
1493            ? sbitsizetype : ssizetype);
1494
1495   /* If either operand is not a constant, do the conversions to the signed
1496      type and subtract.  The hardware will do the right thing with any
1497      overflow in the subtraction.  */
1498   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1499     return size_binop (MINUS_EXPR, convert (ctype, arg0),
1500                        convert (ctype, arg1));
1501
1502   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1503      Otherwise, subtract the other way, convert to CTYPE (we know that can't
1504      overflow) and negate (which can't either).  Special-case a result
1505      of zero while we're here.  */
1506   if (tree_int_cst_equal (arg0, arg1))
1507     return convert (ctype, integer_zero_node);
1508   else if (tree_int_cst_lt (arg1, arg0))
1509     return convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
1510   else
1511     return size_binop (MINUS_EXPR, convert (ctype, integer_zero_node),
1512                        convert (ctype, size_binop (MINUS_EXPR, arg1, arg0)));
1513 }
1514 \f
1515
1516 /* Given T, a tree representing type conversion of ARG1, a constant,
1517    return a constant tree representing the result of conversion.  */
1518
1519 static tree
1520 fold_convert (tree t, tree arg1)
1521 {
1522   tree type = TREE_TYPE (t);
1523   int overflow = 0;
1524
1525   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
1526     {
1527       if (TREE_CODE (arg1) == INTEGER_CST)
1528         {
1529           /* If we would build a constant wider than GCC supports,
1530              leave the conversion unfolded.  */
1531           if (TYPE_PRECISION (type) > 2 * HOST_BITS_PER_WIDE_INT)
1532             return t;
1533
1534           /* If we are trying to make a sizetype for a small integer, use
1535              size_int to pick up cached types to reduce duplicate nodes.  */
1536           if (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1537               && !TREE_CONSTANT_OVERFLOW (arg1)
1538               && compare_tree_int (arg1, 10000) < 0)
1539             return size_int_type_wide (TREE_INT_CST_LOW (arg1), type);
1540
1541           /* Given an integer constant, make new constant with new type,
1542              appropriately sign-extended or truncated.  */
1543           t = build_int_2 (TREE_INT_CST_LOW (arg1),
1544                            TREE_INT_CST_HIGH (arg1));
1545           TREE_TYPE (t) = type;
1546           /* Indicate an overflow if (1) ARG1 already overflowed,
1547              or (2) force_fit_type indicates an overflow.
1548              Tell force_fit_type that an overflow has already occurred
1549              if ARG1 is a too-large unsigned value and T is signed.
1550              But don't indicate an overflow if converting a pointer.  */
1551           TREE_OVERFLOW (t)
1552             = ((force_fit_type (t,
1553                                 (TREE_INT_CST_HIGH (arg1) < 0
1554                                  && (TREE_UNSIGNED (type)
1555                                     < TREE_UNSIGNED (TREE_TYPE (arg1)))))
1556                 && ! POINTER_TYPE_P (TREE_TYPE (arg1)))
1557                || TREE_OVERFLOW (arg1));
1558           TREE_CONSTANT_OVERFLOW (t)
1559             = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1560         }
1561       else if (TREE_CODE (arg1) == REAL_CST)
1562         {
1563           /* Don't initialize these, use assignments.
1564              Initialized local aggregates don't work on old compilers.  */
1565           REAL_VALUE_TYPE x;
1566           REAL_VALUE_TYPE l;
1567           REAL_VALUE_TYPE u;
1568           tree type1 = TREE_TYPE (arg1);
1569           int no_upper_bound;
1570
1571           x = TREE_REAL_CST (arg1);
1572           l = real_value_from_int_cst (type1, TYPE_MIN_VALUE (type));
1573
1574           no_upper_bound = (TYPE_MAX_VALUE (type) == NULL);
1575           if (!no_upper_bound)
1576             u = real_value_from_int_cst (type1, TYPE_MAX_VALUE (type));
1577
1578           /* See if X will be in range after truncation towards 0.
1579              To compensate for truncation, move the bounds away from 0,
1580              but reject if X exactly equals the adjusted bounds.  */
1581           REAL_ARITHMETIC (l, MINUS_EXPR, l, dconst1);
1582           if (!no_upper_bound)
1583             REAL_ARITHMETIC (u, PLUS_EXPR, u, dconst1);
1584           /* If X is a NaN, use zero instead and show we have an overflow.
1585              Otherwise, range check.  */
1586           if (REAL_VALUE_ISNAN (x))
1587             overflow = 1, x = dconst0;
1588           else if (! (REAL_VALUES_LESS (l, x)
1589                       && !no_upper_bound
1590                       && REAL_VALUES_LESS (x, u)))
1591             overflow = 1;
1592
1593           {
1594             HOST_WIDE_INT low, high;
1595             REAL_VALUE_TO_INT (&low, &high, x);
1596             t = build_int_2 (low, high);
1597           }
1598           TREE_TYPE (t) = type;
1599           TREE_OVERFLOW (t)
1600             = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow);
1601           TREE_CONSTANT_OVERFLOW (t)
1602             = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1603         }
1604       TREE_TYPE (t) = type;
1605     }
1606   else if (TREE_CODE (type) == REAL_TYPE)
1607     {
1608       if (TREE_CODE (arg1) == INTEGER_CST)
1609         return build_real_from_int_cst (type, arg1);
1610       if (TREE_CODE (arg1) == REAL_CST)
1611         {
1612           if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
1613             {
1614               /* We make a copy of ARG1 so that we don't modify an
1615                  existing constant tree.  */
1616               t = copy_node (arg1);
1617               TREE_TYPE (t) = type;
1618               return t;
1619             }
1620
1621           t = build_real (type,
1622                           real_value_truncate (TYPE_MODE (type),
1623                                                TREE_REAL_CST (arg1)));
1624
1625           TREE_OVERFLOW (t)
1626             = TREE_OVERFLOW (arg1) | force_fit_type (t, 0);
1627           TREE_CONSTANT_OVERFLOW (t)
1628             = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1629           return t;
1630         }
1631     }
1632   TREE_CONSTANT (t) = 1;
1633   return t;
1634 }
1635 \f
1636 /* Return an expr equal to X but certainly not valid as an lvalue.  */
1637
1638 tree
1639 non_lvalue (tree x)
1640 {
1641   tree result;
1642
1643   /* These things are certainly not lvalues.  */
1644   if (TREE_CODE (x) == NON_LVALUE_EXPR
1645       || TREE_CODE (x) == INTEGER_CST
1646       || TREE_CODE (x) == REAL_CST
1647       || TREE_CODE (x) == STRING_CST
1648       || TREE_CODE (x) == ADDR_EXPR)
1649     return x;
1650
1651   result = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
1652   TREE_CONSTANT (result) = TREE_CONSTANT (x);
1653   return result;
1654 }
1655
1656 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
1657    Zero means allow extended lvalues.  */
1658
1659 int pedantic_lvalues;
1660
1661 /* When pedantic, return an expr equal to X but certainly not valid as a
1662    pedantic lvalue.  Otherwise, return X.  */
1663
1664 tree
1665 pedantic_non_lvalue (tree x)
1666 {
1667   if (pedantic_lvalues)
1668     return non_lvalue (x);
1669   else
1670     return x;
1671 }
1672 \f
1673 /* Given a tree comparison code, return the code that is the logical inverse
1674    of the given code.  It is not safe to do this for floating-point
1675    comparisons, except for NE_EXPR and EQ_EXPR.  */
1676
1677 static enum tree_code
1678 invert_tree_comparison (enum tree_code code)
1679 {
1680   switch (code)
1681     {
1682     case EQ_EXPR:
1683       return NE_EXPR;
1684     case NE_EXPR:
1685       return EQ_EXPR;
1686     case GT_EXPR:
1687       return LE_EXPR;
1688     case GE_EXPR:
1689       return LT_EXPR;
1690     case LT_EXPR:
1691       return GE_EXPR;
1692     case LE_EXPR:
1693       return GT_EXPR;
1694     default:
1695       abort ();
1696     }
1697 }
1698
1699 /* Similar, but return the comparison that results if the operands are
1700    swapped.  This is safe for floating-point.  */
1701
1702 static enum tree_code
1703 swap_tree_comparison (enum tree_code code)
1704 {
1705   switch (code)
1706     {
1707     case EQ_EXPR:
1708     case NE_EXPR:
1709       return code;
1710     case GT_EXPR:
1711       return LT_EXPR;
1712     case GE_EXPR:
1713       return LE_EXPR;
1714     case LT_EXPR:
1715       return GT_EXPR;
1716     case LE_EXPR:
1717       return GE_EXPR;
1718     default:
1719       abort ();
1720     }
1721 }
1722
1723
1724 /* Convert a comparison tree code from an enum tree_code representation
1725    into a compcode bit-based encoding.  This function is the inverse of
1726    compcode_to_comparison.  */
1727
1728 static int
1729 comparison_to_compcode (enum tree_code code)
1730 {
1731   switch (code)
1732     {
1733     case LT_EXPR:
1734       return COMPCODE_LT;
1735     case EQ_EXPR:
1736       return COMPCODE_EQ;
1737     case LE_EXPR:
1738       return COMPCODE_LE;
1739     case GT_EXPR:
1740       return COMPCODE_GT;
1741     case NE_EXPR:
1742       return COMPCODE_NE;
1743     case GE_EXPR:
1744       return COMPCODE_GE;
1745     default:
1746       abort ();
1747     }
1748 }
1749
1750 /* Convert a compcode bit-based encoding of a comparison operator back
1751    to GCC's enum tree_code representation.  This function is the
1752    inverse of comparison_to_compcode.  */
1753
1754 static enum tree_code
1755 compcode_to_comparison (int code)
1756 {
1757   switch (code)
1758     {
1759     case COMPCODE_LT:
1760       return LT_EXPR;
1761     case COMPCODE_EQ:
1762       return EQ_EXPR;
1763     case COMPCODE_LE:
1764       return LE_EXPR;
1765     case COMPCODE_GT:
1766       return GT_EXPR;
1767     case COMPCODE_NE:
1768       return NE_EXPR;
1769     case COMPCODE_GE:
1770       return GE_EXPR;
1771     default:
1772       abort ();
1773     }
1774 }
1775
1776 /* Return nonzero if CODE is a tree code that represents a truth value.  */
1777
1778 static int
1779 truth_value_p (enum tree_code code)
1780 {
1781   return (TREE_CODE_CLASS (code) == '<'
1782           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
1783           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
1784           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
1785 }
1786 \f
1787 /* Return nonzero if two operands are necessarily equal.
1788    If ONLY_CONST is nonzero, only return nonzero for constants.
1789    This function tests whether the operands are indistinguishable;
1790    it does not test whether they are equal using C's == operation.
1791    The distinction is important for IEEE floating point, because
1792    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
1793    (2) two NaNs may be indistinguishable, but NaN!=NaN.  */
1794
1795 int
1796 operand_equal_p (tree arg0, tree arg1, int only_const)
1797 {
1798   /* If both types don't have the same signedness, then we can't consider
1799      them equal.  We must check this before the STRIP_NOPS calls
1800      because they may change the signedness of the arguments.  */
1801   if (TREE_UNSIGNED (TREE_TYPE (arg0)) != TREE_UNSIGNED (TREE_TYPE (arg1)))
1802     return 0;
1803
1804   STRIP_NOPS (arg0);
1805   STRIP_NOPS (arg1);
1806
1807   if (TREE_CODE (arg0) != TREE_CODE (arg1)
1808       /* This is needed for conversions and for COMPONENT_REF.
1809          Might as well play it safe and always test this.  */
1810       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
1811       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
1812       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
1813     return 0;
1814
1815   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
1816      We don't care about side effects in that case because the SAVE_EXPR
1817      takes care of that for us. In all other cases, two expressions are
1818      equal if they have no side effects.  If we have two identical
1819      expressions with side effects that should be treated the same due
1820      to the only side effects being identical SAVE_EXPR's, that will
1821      be detected in the recursive calls below.  */
1822   if (arg0 == arg1 && ! only_const
1823       && (TREE_CODE (arg0) == SAVE_EXPR
1824           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
1825     return 1;
1826
1827   /* Next handle constant cases, those for which we can return 1 even
1828      if ONLY_CONST is set.  */
1829   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
1830     switch (TREE_CODE (arg0))
1831       {
1832       case INTEGER_CST:
1833         return (! TREE_CONSTANT_OVERFLOW (arg0)
1834                 && ! TREE_CONSTANT_OVERFLOW (arg1)
1835                 && tree_int_cst_equal (arg0, arg1));
1836
1837       case REAL_CST:
1838         return (! TREE_CONSTANT_OVERFLOW (arg0)
1839                 && ! TREE_CONSTANT_OVERFLOW (arg1)
1840                 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
1841                                           TREE_REAL_CST (arg1)));
1842
1843       case VECTOR_CST:
1844         {
1845           tree v1, v2;
1846
1847           if (TREE_CONSTANT_OVERFLOW (arg0)
1848               || TREE_CONSTANT_OVERFLOW (arg1))
1849             return 0;
1850
1851           v1 = TREE_VECTOR_CST_ELTS (arg0);
1852           v2 = TREE_VECTOR_CST_ELTS (arg1);
1853           while (v1 && v2)
1854             {
1855               if (!operand_equal_p (v1, v2, only_const))
1856                 return 0;
1857               v1 = TREE_CHAIN (v1);
1858               v2 = TREE_CHAIN (v2);
1859             }
1860
1861           return 1;
1862         }
1863
1864       case COMPLEX_CST:
1865         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
1866                                  only_const)
1867                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
1868                                     only_const));
1869
1870       case STRING_CST:
1871         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
1872                 && ! memcmp (TREE_STRING_POINTER (arg0),
1873                               TREE_STRING_POINTER (arg1),
1874                               TREE_STRING_LENGTH (arg0)));
1875
1876       case ADDR_EXPR:
1877         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
1878                                 0);
1879       default:
1880         break;
1881       }
1882
1883   if (only_const)
1884     return 0;
1885
1886   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
1887     {
1888     case '1':
1889       /* Two conversions are equal only if signedness and modes match.  */
1890       if ((TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == CONVERT_EXPR)
1891           && (TREE_UNSIGNED (TREE_TYPE (arg0))
1892               != TREE_UNSIGNED (TREE_TYPE (arg1))))
1893         return 0;
1894
1895       return operand_equal_p (TREE_OPERAND (arg0, 0),
1896                               TREE_OPERAND (arg1, 0), 0);
1897
1898     case '<':
1899     case '2':
1900       if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)
1901           && operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1),
1902                               0))
1903         return 1;
1904
1905       /* For commutative ops, allow the other order.  */
1906       return ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MULT_EXPR
1907                || TREE_CODE (arg0) == MIN_EXPR || TREE_CODE (arg0) == MAX_EXPR
1908                || TREE_CODE (arg0) == BIT_IOR_EXPR
1909                || TREE_CODE (arg0) == BIT_XOR_EXPR
1910                || TREE_CODE (arg0) == BIT_AND_EXPR
1911                || TREE_CODE (arg0) == NE_EXPR || TREE_CODE (arg0) == EQ_EXPR)
1912               && operand_equal_p (TREE_OPERAND (arg0, 0),
1913                                   TREE_OPERAND (arg1, 1), 0)
1914               && operand_equal_p (TREE_OPERAND (arg0, 1),
1915                                   TREE_OPERAND (arg1, 0), 0));
1916
1917     case 'r':
1918       /* If either of the pointer (or reference) expressions we are
1919          dereferencing contain a side effect, these cannot be equal.  */
1920       if (TREE_SIDE_EFFECTS (arg0)
1921           || TREE_SIDE_EFFECTS (arg1))
1922         return 0;
1923
1924       switch (TREE_CODE (arg0))
1925         {
1926         case INDIRECT_REF:
1927           return operand_equal_p (TREE_OPERAND (arg0, 0),
1928                                   TREE_OPERAND (arg1, 0), 0);
1929
1930         case COMPONENT_REF:
1931         case ARRAY_REF:
1932         case ARRAY_RANGE_REF:
1933           return (operand_equal_p (TREE_OPERAND (arg0, 0),
1934                                    TREE_OPERAND (arg1, 0), 0)
1935                   && operand_equal_p (TREE_OPERAND (arg0, 1),
1936                                       TREE_OPERAND (arg1, 1), 0));
1937
1938         case BIT_FIELD_REF:
1939           return (operand_equal_p (TREE_OPERAND (arg0, 0),
1940                                    TREE_OPERAND (arg1, 0), 0)
1941                   && operand_equal_p (TREE_OPERAND (arg0, 1),
1942                                       TREE_OPERAND (arg1, 1), 0)
1943                   && operand_equal_p (TREE_OPERAND (arg0, 2),
1944                                       TREE_OPERAND (arg1, 2), 0));
1945         default:
1946           return 0;
1947         }
1948
1949     case 'e':
1950       switch (TREE_CODE (arg0))
1951         {
1952         case ADDR_EXPR:
1953         case TRUTH_NOT_EXPR:
1954           return operand_equal_p (TREE_OPERAND (arg0, 0),
1955                                   TREE_OPERAND (arg1, 0), 0);
1956
1957         case RTL_EXPR:
1958           return rtx_equal_p (RTL_EXPR_RTL (arg0), RTL_EXPR_RTL (arg1));
1959
1960         case CALL_EXPR:
1961           /* If the CALL_EXPRs call different functions, then they
1962              clearly can not be equal.  */
1963           if (! operand_equal_p (TREE_OPERAND (arg0, 0),
1964                                  TREE_OPERAND (arg1, 0), 0))
1965             return 0;
1966
1967           /* Only consider const functions equivalent.  */
1968           if (TREE_CODE (TREE_OPERAND (arg0, 0)) == ADDR_EXPR)
1969             {
1970               tree fndecl = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
1971               if (! (flags_from_decl_or_type (fndecl) & ECF_CONST))
1972                 return 0;
1973             }
1974           else
1975             return 0;
1976
1977           /* Now see if all the arguments are the same.  operand_equal_p
1978              does not handle TREE_LIST, so we walk the operands here
1979              feeding them to operand_equal_p.  */
1980           arg0 = TREE_OPERAND (arg0, 1);
1981           arg1 = TREE_OPERAND (arg1, 1);
1982           while (arg0 && arg1)
1983             {
1984               if (! operand_equal_p (TREE_VALUE (arg0), TREE_VALUE (arg1), 0))
1985                 return 0;
1986
1987               arg0 = TREE_CHAIN (arg0);
1988               arg1 = TREE_CHAIN (arg1);
1989             }
1990
1991           /* If we get here and both argument lists are exhausted
1992              then the CALL_EXPRs are equal.  */
1993           return ! (arg0 || arg1);
1994
1995         default:
1996           return 0;
1997         }
1998
1999     case 'd':
2000         /* Consider __builtin_sqrt equal to sqrt.  */
2001         return TREE_CODE (arg0) == FUNCTION_DECL
2002                && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2003                && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2004                && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1);
2005
2006     default:
2007       return 0;
2008     }
2009 }
2010 \f
2011 /* Similar to operand_equal_p, but see if ARG0 might have been made by
2012    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
2013
2014    When in doubt, return 0.  */
2015
2016 static int
2017 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
2018 {
2019   int unsignedp1, unsignedpo;
2020   tree primarg0, primarg1, primother;
2021   unsigned int correct_width;
2022
2023   if (operand_equal_p (arg0, arg1, 0))
2024     return 1;
2025
2026   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
2027       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
2028     return 0;
2029
2030   /* Discard any conversions that don't change the modes of ARG0 and ARG1
2031      and see if the inner values are the same.  This removes any
2032      signedness comparison, which doesn't matter here.  */
2033   primarg0 = arg0, primarg1 = arg1;
2034   STRIP_NOPS (primarg0);
2035   STRIP_NOPS (primarg1);
2036   if (operand_equal_p (primarg0, primarg1, 0))
2037     return 1;
2038
2039   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
2040      actual comparison operand, ARG0.
2041
2042      First throw away any conversions to wider types
2043      already present in the operands.  */
2044
2045   primarg1 = get_narrower (arg1, &unsignedp1);
2046   primother = get_narrower (other, &unsignedpo);
2047
2048   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
2049   if (unsignedp1 == unsignedpo
2050       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
2051       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
2052     {
2053       tree type = TREE_TYPE (arg0);
2054
2055       /* Make sure shorter operand is extended the right way
2056          to match the longer operand.  */
2057       primarg1 = convert ((*lang_hooks.types.signed_or_unsigned_type)
2058                           (unsignedp1, TREE_TYPE (primarg1)), primarg1);
2059
2060       if (operand_equal_p (arg0, convert (type, primarg1), 0))
2061         return 1;
2062     }
2063
2064   return 0;
2065 }
2066 \f
2067 /* See if ARG is an expression that is either a comparison or is performing
2068    arithmetic on comparisons.  The comparisons must only be comparing
2069    two different values, which will be stored in *CVAL1 and *CVAL2; if
2070    they are nonzero it means that some operands have already been found.
2071    No variables may be used anywhere else in the expression except in the
2072    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
2073    the expression and save_expr needs to be called with CVAL1 and CVAL2.
2074
2075    If this is true, return 1.  Otherwise, return zero.  */
2076
2077 static int
2078 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
2079 {
2080   enum tree_code code = TREE_CODE (arg);
2081   char class = TREE_CODE_CLASS (code);
2082
2083   /* We can handle some of the 'e' cases here.  */
2084   if (class == 'e' && code == TRUTH_NOT_EXPR)
2085     class = '1';
2086   else if (class == 'e'
2087            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2088                || code == COMPOUND_EXPR))
2089     class = '2';
2090
2091   else if (class == 'e' && code == SAVE_EXPR && SAVE_EXPR_RTL (arg) == 0
2092            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
2093     {
2094       /* If we've already found a CVAL1 or CVAL2, this expression is
2095          two complex to handle.  */
2096       if (*cval1 || *cval2)
2097         return 0;
2098
2099       class = '1';
2100       *save_p = 1;
2101     }
2102
2103   switch (class)
2104     {
2105     case '1':
2106       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
2107
2108     case '2':
2109       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2110               && twoval_comparison_p (TREE_OPERAND (arg, 1),
2111                                       cval1, cval2, save_p));
2112
2113     case 'c':
2114       return 1;
2115
2116     case 'e':
2117       if (code == COND_EXPR)
2118         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2119                                      cval1, cval2, save_p)
2120                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2121                                         cval1, cval2, save_p)
2122                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
2123                                         cval1, cval2, save_p));
2124       return 0;
2125
2126     case '<':
2127       /* First see if we can handle the first operand, then the second.  For
2128          the second operand, we know *CVAL1 can't be zero.  It must be that
2129          one side of the comparison is each of the values; test for the
2130          case where this isn't true by failing if the two operands
2131          are the same.  */
2132
2133       if (operand_equal_p (TREE_OPERAND (arg, 0),
2134                            TREE_OPERAND (arg, 1), 0))
2135         return 0;
2136
2137       if (*cval1 == 0)
2138         *cval1 = TREE_OPERAND (arg, 0);
2139       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2140         ;
2141       else if (*cval2 == 0)
2142         *cval2 = TREE_OPERAND (arg, 0);
2143       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2144         ;
2145       else
2146         return 0;
2147
2148       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2149         ;
2150       else if (*cval2 == 0)
2151         *cval2 = TREE_OPERAND (arg, 1);
2152       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2153         ;
2154       else
2155         return 0;
2156
2157       return 1;
2158
2159     default:
2160       return 0;
2161     }
2162 }
2163 \f
2164 /* ARG is a tree that is known to contain just arithmetic operations and
2165    comparisons.  Evaluate the operations in the tree substituting NEW0 for
2166    any occurrence of OLD0 as an operand of a comparison and likewise for
2167    NEW1 and OLD1.  */
2168
2169 static tree
2170 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
2171 {
2172   tree type = TREE_TYPE (arg);
2173   enum tree_code code = TREE_CODE (arg);
2174   char class = TREE_CODE_CLASS (code);
2175
2176   /* We can handle some of the 'e' cases here.  */
2177   if (class == 'e' && code == TRUTH_NOT_EXPR)
2178     class = '1';
2179   else if (class == 'e'
2180            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2181     class = '2';
2182
2183   switch (class)
2184     {
2185     case '1':
2186       return fold (build1 (code, type,
2187                            eval_subst (TREE_OPERAND (arg, 0),
2188                                        old0, new0, old1, new1)));
2189
2190     case '2':
2191       return fold (build (code, type,
2192                           eval_subst (TREE_OPERAND (arg, 0),
2193                                       old0, new0, old1, new1),
2194                           eval_subst (TREE_OPERAND (arg, 1),
2195                                       old0, new0, old1, new1)));
2196
2197     case 'e':
2198       switch (code)
2199         {
2200         case SAVE_EXPR:
2201           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2202
2203         case COMPOUND_EXPR:
2204           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2205
2206         case COND_EXPR:
2207           return fold (build (code, type,
2208                               eval_subst (TREE_OPERAND (arg, 0),
2209                                           old0, new0, old1, new1),
2210                               eval_subst (TREE_OPERAND (arg, 1),
2211                                           old0, new0, old1, new1),
2212                               eval_subst (TREE_OPERAND (arg, 2),
2213                                           old0, new0, old1, new1)));
2214         default:
2215           break;
2216         }
2217       /* Fall through - ???  */
2218
2219     case '<':
2220       {
2221         tree arg0 = TREE_OPERAND (arg, 0);
2222         tree arg1 = TREE_OPERAND (arg, 1);
2223
2224         /* We need to check both for exact equality and tree equality.  The
2225            former will be true if the operand has a side-effect.  In that
2226            case, we know the operand occurred exactly once.  */
2227
2228         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2229           arg0 = new0;
2230         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2231           arg0 = new1;
2232
2233         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2234           arg1 = new0;
2235         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2236           arg1 = new1;
2237
2238         return fold (build (code, type, arg0, arg1));
2239       }
2240
2241     default:
2242       return arg;
2243     }
2244 }
2245 \f
2246 /* Return a tree for the case when the result of an expression is RESULT
2247    converted to TYPE and OMITTED was previously an operand of the expression
2248    but is now not needed (e.g., we folded OMITTED * 0).
2249
2250    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
2251    the conversion of RESULT to TYPE.  */
2252
2253 tree
2254 omit_one_operand (tree type, tree result, tree omitted)
2255 {
2256   tree t = convert (type, result);
2257
2258   if (TREE_SIDE_EFFECTS (omitted))
2259     return build (COMPOUND_EXPR, type, omitted, t);
2260
2261   return non_lvalue (t);
2262 }
2263
2264 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
2265
2266 static tree
2267 pedantic_omit_one_operand (tree type, tree result, tree omitted)
2268 {
2269   tree t = convert (type, result);
2270
2271   if (TREE_SIDE_EFFECTS (omitted))
2272     return build (COMPOUND_EXPR, type, omitted, t);
2273
2274   return pedantic_non_lvalue (t);
2275 }
2276 \f
2277 /* Return a simplified tree node for the truth-negation of ARG.  This
2278    never alters ARG itself.  We assume that ARG is an operation that
2279    returns a truth value (0 or 1).  */
2280
2281 tree
2282 invert_truthvalue (tree arg)
2283 {
2284   tree type = TREE_TYPE (arg);
2285   enum tree_code code = TREE_CODE (arg);
2286
2287   if (code == ERROR_MARK)
2288     return arg;
2289
2290   /* If this is a comparison, we can simply invert it, except for
2291      floating-point non-equality comparisons, in which case we just
2292      enclose a TRUTH_NOT_EXPR around what we have.  */
2293
2294   if (TREE_CODE_CLASS (code) == '<')
2295     {
2296       if (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg, 0)))
2297           && !flag_unsafe_math_optimizations
2298           && code != NE_EXPR
2299           && code != EQ_EXPR)
2300         return build1 (TRUTH_NOT_EXPR, type, arg);
2301       else
2302         return build (invert_tree_comparison (code), type,
2303                       TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
2304     }
2305
2306   switch (code)
2307     {
2308     case INTEGER_CST:
2309       return convert (type, build_int_2 (integer_zerop (arg), 0));
2310
2311     case TRUTH_AND_EXPR:
2312       return build (TRUTH_OR_EXPR, type,
2313                     invert_truthvalue (TREE_OPERAND (arg, 0)),
2314                     invert_truthvalue (TREE_OPERAND (arg, 1)));
2315
2316     case TRUTH_OR_EXPR:
2317       return build (TRUTH_AND_EXPR, type,
2318                     invert_truthvalue (TREE_OPERAND (arg, 0)),
2319                     invert_truthvalue (TREE_OPERAND (arg, 1)));
2320
2321     case TRUTH_XOR_EXPR:
2322       /* Here we can invert either operand.  We invert the first operand
2323          unless the second operand is a TRUTH_NOT_EXPR in which case our
2324          result is the XOR of the first operand with the inside of the
2325          negation of the second operand.  */
2326
2327       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
2328         return build (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2329                       TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
2330       else
2331         return build (TRUTH_XOR_EXPR, type,
2332                       invert_truthvalue (TREE_OPERAND (arg, 0)),
2333                       TREE_OPERAND (arg, 1));
2334
2335     case TRUTH_ANDIF_EXPR:
2336       return build (TRUTH_ORIF_EXPR, type,
2337                     invert_truthvalue (TREE_OPERAND (arg, 0)),
2338                     invert_truthvalue (TREE_OPERAND (arg, 1)));
2339
2340     case TRUTH_ORIF_EXPR:
2341       return build (TRUTH_ANDIF_EXPR, type,
2342                     invert_truthvalue (TREE_OPERAND (arg, 0)),
2343                     invert_truthvalue (TREE_OPERAND (arg, 1)));
2344
2345     case TRUTH_NOT_EXPR:
2346       return TREE_OPERAND (arg, 0);
2347
2348     case COND_EXPR:
2349       return build (COND_EXPR, type, TREE_OPERAND (arg, 0),
2350                     invert_truthvalue (TREE_OPERAND (arg, 1)),
2351                     invert_truthvalue (TREE_OPERAND (arg, 2)));
2352
2353     case COMPOUND_EXPR:
2354       return build (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2355                     invert_truthvalue (TREE_OPERAND (arg, 1)));
2356
2357     case WITH_RECORD_EXPR:
2358       return build (WITH_RECORD_EXPR, type,
2359                     invert_truthvalue (TREE_OPERAND (arg, 0)),
2360                     TREE_OPERAND (arg, 1));
2361
2362     case NON_LVALUE_EXPR:
2363       return invert_truthvalue (TREE_OPERAND (arg, 0));
2364
2365     case NOP_EXPR:
2366     case CONVERT_EXPR:
2367     case FLOAT_EXPR:
2368       return build1 (TREE_CODE (arg), type,
2369                      invert_truthvalue (TREE_OPERAND (arg, 0)));
2370
2371     case BIT_AND_EXPR:
2372       if (!integer_onep (TREE_OPERAND (arg, 1)))
2373         break;
2374       return build (EQ_EXPR, type, arg, convert (type, integer_zero_node));
2375
2376     case SAVE_EXPR:
2377       return build1 (TRUTH_NOT_EXPR, type, arg);
2378
2379     case CLEANUP_POINT_EXPR:
2380       return build1 (CLEANUP_POINT_EXPR, type,
2381                      invert_truthvalue (TREE_OPERAND (arg, 0)));
2382
2383     default:
2384       break;
2385     }
2386   if (TREE_CODE (TREE_TYPE (arg)) != BOOLEAN_TYPE)
2387     abort ();
2388   return build1 (TRUTH_NOT_EXPR, type, arg);
2389 }
2390
2391 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
2392    operands are another bit-wise operation with a common input.  If so,
2393    distribute the bit operations to save an operation and possibly two if
2394    constants are involved.  For example, convert
2395         (A | B) & (A | C) into A | (B & C)
2396    Further simplification will occur if B and C are constants.
2397
2398    If this optimization cannot be done, 0 will be returned.  */
2399
2400 static tree
2401 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
2402 {
2403   tree common;
2404   tree left, right;
2405
2406   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2407       || TREE_CODE (arg0) == code
2408       || (TREE_CODE (arg0) != BIT_AND_EXPR
2409           && TREE_CODE (arg0) != BIT_IOR_EXPR))
2410     return 0;
2411
2412   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
2413     {
2414       common = TREE_OPERAND (arg0, 0);
2415       left = TREE_OPERAND (arg0, 1);
2416       right = TREE_OPERAND (arg1, 1);
2417     }
2418   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
2419     {
2420       common = TREE_OPERAND (arg0, 0);
2421       left = TREE_OPERAND (arg0, 1);
2422       right = TREE_OPERAND (arg1, 0);
2423     }
2424   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
2425     {
2426       common = TREE_OPERAND (arg0, 1);
2427       left = TREE_OPERAND (arg0, 0);
2428       right = TREE_OPERAND (arg1, 1);
2429     }
2430   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
2431     {
2432       common = TREE_OPERAND (arg0, 1);
2433       left = TREE_OPERAND (arg0, 0);
2434       right = TREE_OPERAND (arg1, 0);
2435     }
2436   else
2437     return 0;
2438
2439   return fold (build (TREE_CODE (arg0), type, common,
2440                       fold (build (code, type, left, right))));
2441 }
2442 \f
2443 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
2444    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
2445
2446 static tree
2447 make_bit_field_ref (tree inner, tree type, int bitsize, int bitpos,
2448                     int unsignedp)
2449 {
2450   tree result = build (BIT_FIELD_REF, type, inner,
2451                        size_int (bitsize), bitsize_int (bitpos));
2452
2453   TREE_UNSIGNED (result) = unsignedp;
2454
2455   return result;
2456 }
2457
2458 /* Optimize a bit-field compare.
2459
2460    There are two cases:  First is a compare against a constant and the
2461    second is a comparison of two items where the fields are at the same
2462    bit position relative to the start of a chunk (byte, halfword, word)
2463    large enough to contain it.  In these cases we can avoid the shift
2464    implicit in bitfield extractions.
2465
2466    For constants, we emit a compare of the shifted constant with the
2467    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
2468    compared.  For two fields at the same position, we do the ANDs with the
2469    similar mask and compare the result of the ANDs.
2470
2471    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
2472    COMPARE_TYPE is the type of the comparison, and LHS and RHS
2473    are the left and right operands of the comparison, respectively.
2474
2475    If the optimization described above can be done, we return the resulting
2476    tree.  Otherwise we return zero.  */
2477
2478 static tree
2479 optimize_bit_field_compare (enum tree_code code, tree compare_type,
2480                             tree lhs, tree rhs)
2481 {
2482   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
2483   tree type = TREE_TYPE (lhs);
2484   tree signed_type, unsigned_type;
2485   int const_p = TREE_CODE (rhs) == INTEGER_CST;
2486   enum machine_mode lmode, rmode, nmode;
2487   int lunsignedp, runsignedp;
2488   int lvolatilep = 0, rvolatilep = 0;
2489   tree linner, rinner = NULL_TREE;
2490   tree mask;
2491   tree offset;
2492
2493   /* Get all the information about the extractions being done.  If the bit size
2494      if the same as the size of the underlying object, we aren't doing an
2495      extraction at all and so can do nothing.  We also don't want to
2496      do anything if the inner expression is a PLACEHOLDER_EXPR since we
2497      then will no longer be able to replace it.  */
2498   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
2499                                 &lunsignedp, &lvolatilep);
2500   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
2501       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
2502     return 0;
2503
2504  if (!const_p)
2505    {
2506      /* If this is not a constant, we can only do something if bit positions,
2507         sizes, and signedness are the same.  */
2508      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
2509                                    &runsignedp, &rvolatilep);
2510
2511      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
2512          || lunsignedp != runsignedp || offset != 0
2513          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
2514        return 0;
2515    }
2516
2517   /* See if we can find a mode to refer to this field.  We should be able to,
2518      but fail if we can't.  */
2519   nmode = get_best_mode (lbitsize, lbitpos,
2520                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
2521                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
2522                                 TYPE_ALIGN (TREE_TYPE (rinner))),
2523                          word_mode, lvolatilep || rvolatilep);
2524   if (nmode == VOIDmode)
2525     return 0;
2526
2527   /* Set signed and unsigned types of the precision of this mode for the
2528      shifts below.  */
2529   signed_type = (*lang_hooks.types.type_for_mode) (nmode, 0);
2530   unsigned_type = (*lang_hooks.types.type_for_mode) (nmode, 1);
2531
2532   /* Compute the bit position and size for the new reference and our offset
2533      within it. If the new reference is the same size as the original, we
2534      won't optimize anything, so return zero.  */
2535   nbitsize = GET_MODE_BITSIZE (nmode);
2536   nbitpos = lbitpos & ~ (nbitsize - 1);
2537   lbitpos -= nbitpos;
2538   if (nbitsize == lbitsize)
2539     return 0;
2540
2541   if (BYTES_BIG_ENDIAN)
2542     lbitpos = nbitsize - lbitsize - lbitpos;
2543
2544   /* Make the mask to be used against the extracted field.  */
2545   mask = build_int_2 (~0, ~0);
2546   TREE_TYPE (mask) = unsigned_type;
2547   force_fit_type (mask, 0);
2548   mask = convert (unsigned_type, mask);
2549   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
2550   mask = const_binop (RSHIFT_EXPR, mask,
2551                       size_int (nbitsize - lbitsize - lbitpos), 0);
2552
2553   if (! const_p)
2554     /* If not comparing with constant, just rework the comparison
2555        and return.  */
2556     return build (code, compare_type,
2557                   build (BIT_AND_EXPR, unsigned_type,
2558                          make_bit_field_ref (linner, unsigned_type,
2559                                              nbitsize, nbitpos, 1),
2560                          mask),
2561                   build (BIT_AND_EXPR, unsigned_type,
2562                          make_bit_field_ref (rinner, unsigned_type,
2563                                              nbitsize, nbitpos, 1),
2564                          mask));
2565
2566   /* Otherwise, we are handling the constant case. See if the constant is too
2567      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
2568      this not only for its own sake, but to avoid having to test for this
2569      error case below.  If we didn't, we might generate wrong code.
2570
2571      For unsigned fields, the constant shifted right by the field length should
2572      be all zero.  For signed fields, the high-order bits should agree with
2573      the sign bit.  */
2574
2575   if (lunsignedp)
2576     {
2577       if (! integer_zerop (const_binop (RSHIFT_EXPR,
2578                                         convert (unsigned_type, rhs),
2579                                         size_int (lbitsize), 0)))
2580         {
2581           warning ("comparison is always %d due to width of bit-field",
2582                    code == NE_EXPR);
2583           return convert (compare_type,
2584                           (code == NE_EXPR
2585                            ? integer_one_node : integer_zero_node));
2586         }
2587     }
2588   else
2589     {
2590       tree tem = const_binop (RSHIFT_EXPR, convert (signed_type, rhs),
2591                               size_int (lbitsize - 1), 0);
2592       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
2593         {
2594           warning ("comparison is always %d due to width of bit-field",
2595                    code == NE_EXPR);
2596           return convert (compare_type,
2597                           (code == NE_EXPR
2598                            ? integer_one_node : integer_zero_node));
2599         }
2600     }
2601
2602   /* Single-bit compares should always be against zero.  */
2603   if (lbitsize == 1 && ! integer_zerop (rhs))
2604     {
2605       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
2606       rhs = convert (type, integer_zero_node);
2607     }
2608
2609   /* Make a new bitfield reference, shift the constant over the
2610      appropriate number of bits and mask it with the computed mask
2611      (in case this was a signed field).  If we changed it, make a new one.  */
2612   lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
2613   if (lvolatilep)
2614     {
2615       TREE_SIDE_EFFECTS (lhs) = 1;
2616       TREE_THIS_VOLATILE (lhs) = 1;
2617     }
2618
2619   rhs = fold (const_binop (BIT_AND_EXPR,
2620                            const_binop (LSHIFT_EXPR,
2621                                         convert (unsigned_type, rhs),
2622                                         size_int (lbitpos), 0),
2623                            mask, 0));
2624
2625   return build (code, compare_type,
2626                 build (BIT_AND_EXPR, unsigned_type, lhs, mask),
2627                 rhs);
2628 }
2629 \f
2630 /* Subroutine for fold_truthop: decode a field reference.
2631
2632    If EXP is a comparison reference, we return the innermost reference.
2633
2634    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
2635    set to the starting bit number.
2636
2637    If the innermost field can be completely contained in a mode-sized
2638    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
2639
2640    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
2641    otherwise it is not changed.
2642
2643    *PUNSIGNEDP is set to the signedness of the field.
2644
2645    *PMASK is set to the mask used.  This is either contained in a
2646    BIT_AND_EXPR or derived from the width of the field.
2647
2648    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
2649
2650    Return 0 if this is not a component reference or is one that we can't
2651    do anything with.  */
2652
2653 static tree
2654 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
2655                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
2656                         int *punsignedp, int *pvolatilep,
2657                         tree *pmask, tree *pand_mask)
2658 {
2659   tree outer_type = 0;
2660   tree and_mask = 0;
2661   tree mask, inner, offset;
2662   tree unsigned_type;
2663   unsigned int precision;
2664
2665   /* All the optimizations using this function assume integer fields.
2666      There are problems with FP fields since the type_for_size call
2667      below can fail for, e.g., XFmode.  */
2668   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
2669     return 0;
2670
2671   /* We are interested in the bare arrangement of bits, so strip everything
2672      that doesn't affect the machine mode.  However, record the type of the
2673      outermost expression if it may matter below.  */
2674   if (TREE_CODE (exp) == NOP_EXPR
2675       || TREE_CODE (exp) == CONVERT_EXPR
2676       || TREE_CODE (exp) == NON_LVALUE_EXPR)
2677     outer_type = TREE_TYPE (exp);
2678   STRIP_NOPS (exp);
2679
2680   if (TREE_CODE (exp) == BIT_AND_EXPR)
2681     {
2682       and_mask = TREE_OPERAND (exp, 1);
2683       exp = TREE_OPERAND (exp, 0);
2684       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
2685       if (TREE_CODE (and_mask) != INTEGER_CST)
2686         return 0;
2687     }
2688
2689   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
2690                                punsignedp, pvolatilep);
2691   if ((inner == exp && and_mask == 0)
2692       || *pbitsize < 0 || offset != 0
2693       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
2694     return 0;
2695
2696   /* If the number of bits in the reference is the same as the bitsize of
2697      the outer type, then the outer type gives the signedness. Otherwise
2698      (in case of a small bitfield) the signedness is unchanged.  */
2699   if (outer_type && *pbitsize == tree_low_cst (TYPE_SIZE (outer_type), 1))
2700     *punsignedp = TREE_UNSIGNED (outer_type);
2701
2702   /* Compute the mask to access the bitfield.  */
2703   unsigned_type = (*lang_hooks.types.type_for_size) (*pbitsize, 1);
2704   precision = TYPE_PRECISION (unsigned_type);
2705
2706   mask = build_int_2 (~0, ~0);
2707   TREE_TYPE (mask) = unsigned_type;
2708   force_fit_type (mask, 0);
2709   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2710   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2711
2712   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
2713   if (and_mask != 0)
2714     mask = fold (build (BIT_AND_EXPR, unsigned_type,
2715                         convert (unsigned_type, and_mask), mask));
2716
2717   *pmask = mask;
2718   *pand_mask = and_mask;
2719   return inner;
2720 }
2721
2722 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
2723    bit positions.  */
2724
2725 static int
2726 all_ones_mask_p (tree mask, int size)
2727 {
2728   tree type = TREE_TYPE (mask);
2729   unsigned int precision = TYPE_PRECISION (type);
2730   tree tmask;
2731
2732   tmask = build_int_2 (~0, ~0);
2733   TREE_TYPE (tmask) = (*lang_hooks.types.signed_type) (type);
2734   force_fit_type (tmask, 0);
2735   return
2736     tree_int_cst_equal (mask,
2737                         const_binop (RSHIFT_EXPR,
2738                                      const_binop (LSHIFT_EXPR, tmask,
2739                                                   size_int (precision - size),
2740                                                   0),
2741                                      size_int (precision - size), 0));
2742 }
2743
2744 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
2745    represents the sign bit of EXP's type.  If EXP represents a sign
2746    or zero extension, also test VAL against the unextended type.
2747    The return value is the (sub)expression whose sign bit is VAL,
2748    or NULL_TREE otherwise.  */
2749
2750 static tree
2751 sign_bit_p (tree exp, tree val)
2752 {
2753   unsigned HOST_WIDE_INT mask_lo, lo;
2754   HOST_WIDE_INT mask_hi, hi;
2755   int width;
2756   tree t;
2757
2758   /* Tree EXP must have an integral type.  */
2759   t = TREE_TYPE (exp);
2760   if (! INTEGRAL_TYPE_P (t))
2761     return NULL_TREE;
2762
2763   /* Tree VAL must be an integer constant.  */
2764   if (TREE_CODE (val) != INTEGER_CST
2765       || TREE_CONSTANT_OVERFLOW (val))
2766     return NULL_TREE;
2767
2768   width = TYPE_PRECISION (t);
2769   if (width > HOST_BITS_PER_WIDE_INT)
2770     {
2771       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
2772       lo = 0;
2773
2774       mask_hi = ((unsigned HOST_WIDE_INT) -1
2775                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
2776       mask_lo = -1;
2777     }
2778   else
2779     {
2780       hi = 0;
2781       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
2782
2783       mask_hi = 0;
2784       mask_lo = ((unsigned HOST_WIDE_INT) -1
2785                  >> (HOST_BITS_PER_WIDE_INT - width));
2786     }
2787
2788   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
2789      treat VAL as if it were unsigned.  */
2790   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
2791       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
2792     return exp;
2793
2794   /* Handle extension from a narrower type.  */
2795   if (TREE_CODE (exp) == NOP_EXPR
2796       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
2797     return sign_bit_p (TREE_OPERAND (exp, 0), val);
2798
2799   return NULL_TREE;
2800 }
2801
2802 /* Subroutine for fold_truthop: determine if an operand is simple enough
2803    to be evaluated unconditionally.  */
2804
2805 static int
2806 simple_operand_p (tree exp)
2807 {
2808   /* Strip any conversions that don't change the machine mode.  */
2809   while ((TREE_CODE (exp) == NOP_EXPR
2810           || TREE_CODE (exp) == CONVERT_EXPR)
2811          && (TYPE_MODE (TREE_TYPE (exp))
2812              == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
2813     exp = TREE_OPERAND (exp, 0);
2814
2815   return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
2816           || (DECL_P (exp)
2817               && ! TREE_ADDRESSABLE (exp)
2818               && ! TREE_THIS_VOLATILE (exp)
2819               && ! DECL_NONLOCAL (exp)
2820               /* Don't regard global variables as simple.  They may be
2821                  allocated in ways unknown to the compiler (shared memory,
2822                  #pragma weak, etc).  */
2823               && ! TREE_PUBLIC (exp)
2824               && ! DECL_EXTERNAL (exp)
2825               /* Loading a static variable is unduly expensive, but global
2826                  registers aren't expensive.  */
2827               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
2828 }
2829 \f
2830 /* The following functions are subroutines to fold_range_test and allow it to
2831    try to change a logical combination of comparisons into a range test.
2832
2833    For example, both
2834         X == 2 || X == 3 || X == 4 || X == 5
2835    and
2836         X >= 2 && X <= 5
2837    are converted to
2838         (unsigned) (X - 2) <= 3
2839
2840    We describe each set of comparisons as being either inside or outside
2841    a range, using a variable named like IN_P, and then describe the
2842    range with a lower and upper bound.  If one of the bounds is omitted,
2843    it represents either the highest or lowest value of the type.
2844
2845    In the comments below, we represent a range by two numbers in brackets
2846    preceded by a "+" to designate being inside that range, or a "-" to
2847    designate being outside that range, so the condition can be inverted by
2848    flipping the prefix.  An omitted bound is represented by a "-".  For
2849    example, "- [-, 10]" means being outside the range starting at the lowest
2850    possible value and ending at 10, in other words, being greater than 10.
2851    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
2852    always false.
2853
2854    We set up things so that the missing bounds are handled in a consistent
2855    manner so neither a missing bound nor "true" and "false" need to be
2856    handled using a special case.  */
2857
2858 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
2859    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
2860    and UPPER1_P are nonzero if the respective argument is an upper bound
2861    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
2862    must be specified for a comparison.  ARG1 will be converted to ARG0's
2863    type if both are specified.  */
2864
2865 static tree
2866 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
2867              tree arg1, int upper1_p)
2868 {
2869   tree tem;
2870   int result;
2871   int sgn0, sgn1;
2872
2873   /* If neither arg represents infinity, do the normal operation.
2874      Else, if not a comparison, return infinity.  Else handle the special
2875      comparison rules. Note that most of the cases below won't occur, but
2876      are handled for consistency.  */
2877
2878   if (arg0 != 0 && arg1 != 0)
2879     {
2880       tem = fold (build (code, type != 0 ? type : TREE_TYPE (arg0),
2881                          arg0, convert (TREE_TYPE (arg0), arg1)));
2882       STRIP_NOPS (tem);
2883       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
2884     }
2885
2886   if (TREE_CODE_CLASS (code) != '<')
2887     return 0;
2888
2889   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
2890      for neither.  In real maths, we cannot assume open ended ranges are
2891      the same. But, this is computer arithmetic, where numbers are finite.
2892      We can therefore make the transformation of any unbounded range with
2893      the value Z, Z being greater than any representable number. This permits
2894      us to treat unbounded ranges as equal.  */
2895   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
2896   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
2897   switch (code)
2898     {
2899     case EQ_EXPR:
2900       result = sgn0 == sgn1;
2901       break;
2902     case NE_EXPR:
2903       result = sgn0 != sgn1;
2904       break;
2905     case LT_EXPR:
2906       result = sgn0 < sgn1;
2907       break;
2908     case LE_EXPR:
2909       result = sgn0 <= sgn1;
2910       break;
2911     case GT_EXPR:
2912       result = sgn0 > sgn1;
2913       break;
2914     case GE_EXPR:
2915       result = sgn0 >= sgn1;
2916       break;
2917     default:
2918       abort ();
2919     }
2920
2921   return convert (type, result ? integer_one_node : integer_zero_node);
2922 }
2923 \f
2924 /* Given EXP, a logical expression, set the range it is testing into
2925    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
2926    actually being tested.  *PLOW and *PHIGH will be made of the same type
2927    as the returned expression.  If EXP is not a comparison, we will most
2928    likely not be returning a useful value and range.  */
2929
2930 static tree
2931 make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
2932 {
2933   enum tree_code code;
2934   tree arg0 = NULL_TREE, arg1 = NULL_TREE, type = NULL_TREE;
2935   tree orig_type = NULL_TREE;
2936   int in_p, n_in_p;
2937   tree low, high, n_low, n_high;
2938
2939   /* Start with simply saying "EXP != 0" and then look at the code of EXP
2940      and see if we can refine the range.  Some of the cases below may not
2941      happen, but it doesn't seem worth worrying about this.  We "continue"
2942      the outer loop when we've changed something; otherwise we "break"
2943      the switch, which will "break" the while.  */
2944
2945   in_p = 0, low = high = convert (TREE_TYPE (exp), integer_zero_node);
2946
2947   while (1)
2948     {
2949       code = TREE_CODE (exp);
2950
2951       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
2952         {
2953           if (first_rtl_op (code) > 0)
2954             arg0 = TREE_OPERAND (exp, 0);
2955           if (TREE_CODE_CLASS (code) == '<'
2956               || TREE_CODE_CLASS (code) == '1'
2957               || TREE_CODE_CLASS (code) == '2')
2958             type = TREE_TYPE (arg0);
2959           if (TREE_CODE_CLASS (code) == '2'
2960               || TREE_CODE_CLASS (code) == '<'
2961               || (TREE_CODE_CLASS (code) == 'e'
2962                   && TREE_CODE_LENGTH (code) > 1))
2963             arg1 = TREE_OPERAND (exp, 1);
2964         }
2965
2966       /* Set ORIG_TYPE as soon as TYPE is non-null so that we do not
2967          lose a cast by accident.  */
2968       if (type != NULL_TREE && orig_type == NULL_TREE)
2969         orig_type = type;
2970
2971       switch (code)
2972         {
2973         case TRUTH_NOT_EXPR:
2974           in_p = ! in_p, exp = arg0;
2975           continue;
2976
2977         case EQ_EXPR: case NE_EXPR:
2978         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
2979           /* We can only do something if the range is testing for zero
2980              and if the second operand is an integer constant.  Note that
2981              saying something is "in" the range we make is done by
2982              complementing IN_P since it will set in the initial case of
2983              being not equal to zero; "out" is leaving it alone.  */
2984           if (low == 0 || high == 0
2985               || ! integer_zerop (low) || ! integer_zerop (high)
2986               || TREE_CODE (arg1) != INTEGER_CST)
2987             break;
2988
2989           switch (code)
2990             {
2991             case NE_EXPR:  /* - [c, c]  */
2992               low = high = arg1;
2993               break;
2994             case EQ_EXPR:  /* + [c, c]  */
2995               in_p = ! in_p, low = high = arg1;
2996               break;
2997             case GT_EXPR:  /* - [-, c] */
2998               low = 0, high = arg1;
2999               break;
3000             case GE_EXPR:  /* + [c, -] */
3001               in_p = ! in_p, low = arg1, high = 0;
3002               break;
3003             case LT_EXPR:  /* - [c, -] */
3004               low = arg1, high = 0;
3005               break;
3006             case LE_EXPR:  /* + [-, c] */
3007               in_p = ! in_p, low = 0, high = arg1;
3008               break;
3009             default:
3010               abort ();
3011             }
3012
3013           exp = arg0;
3014
3015           /* If this is an unsigned comparison, we also know that EXP is
3016              greater than or equal to zero.  We base the range tests we make
3017              on that fact, so we record it here so we can parse existing
3018              range tests.  */
3019           if (TREE_UNSIGNED (type) && (low == 0 || high == 0))
3020             {
3021               if (! merge_ranges (&n_in_p, &n_low, &n_high, in_p, low, high,
3022                                   1, convert (type, integer_zero_node),
3023                                   NULL_TREE))
3024                 break;
3025
3026               in_p = n_in_p, low = n_low, high = n_high;
3027
3028               /* If the high bound is missing, but we
3029                  have a low bound, reverse the range so
3030                  it goes from zero to the low bound minus 1.  */
3031               if (high == 0 && low)
3032                 {
3033                   in_p = ! in_p;
3034                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
3035                                       integer_one_node, 0);
3036                   low = convert (type, integer_zero_node);
3037                 }
3038             }
3039           continue;
3040
3041         case NEGATE_EXPR:
3042           /* (-x) IN [a,b] -> x in [-b, -a]  */
3043           n_low = range_binop (MINUS_EXPR, type,
3044                                convert (type, integer_zero_node), 0, high, 1);
3045           n_high = range_binop (MINUS_EXPR, type,
3046                                 convert (type, integer_zero_node), 0, low, 0);
3047           low = n_low, high = n_high;
3048           exp = arg0;
3049           continue;
3050
3051         case BIT_NOT_EXPR:
3052           /* ~ X -> -X - 1  */
3053           exp = build (MINUS_EXPR, type, negate_expr (arg0),
3054                        convert (type, integer_one_node));
3055           continue;
3056
3057         case PLUS_EXPR:  case MINUS_EXPR:
3058           if (TREE_CODE (arg1) != INTEGER_CST)
3059             break;
3060
3061           /* If EXP is signed, any overflow in the computation is undefined,
3062              so we don't worry about it so long as our computations on
3063              the bounds don't overflow.  For unsigned, overflow is defined
3064              and this is exactly the right thing.  */
3065           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3066                                type, low, 0, arg1, 0);
3067           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3068                                 type, high, 1, arg1, 0);
3069           if ((n_low != 0 && TREE_OVERFLOW (n_low))
3070               || (n_high != 0 && TREE_OVERFLOW (n_high)))
3071             break;
3072
3073           /* Check for an unsigned range which has wrapped around the maximum
3074              value thus making n_high < n_low, and normalize it.  */
3075           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
3076             {
3077               low = range_binop (PLUS_EXPR, type, n_high, 0,
3078                                  integer_one_node, 0);
3079               high = range_binop (MINUS_EXPR, type, n_low, 0,
3080                                   integer_one_node, 0);
3081
3082               /* If the range is of the form +/- [ x+1, x ], we won't
3083                  be able to normalize it.  But then, it represents the
3084                  whole range or the empty set, so make it
3085                  +/- [ -, - ].  */
3086               if (tree_int_cst_equal (n_low, low)
3087                   && tree_int_cst_equal (n_high, high))
3088                 low = high = 0;
3089               else
3090                 in_p = ! in_p;
3091             }
3092           else
3093             low = n_low, high = n_high;
3094
3095           exp = arg0;
3096           continue;
3097
3098         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
3099           if (TYPE_PRECISION (type) > TYPE_PRECISION (orig_type))
3100             break;
3101
3102           if (! INTEGRAL_TYPE_P (type)
3103               || (low != 0 && ! int_fits_type_p (low, type))
3104               || (high != 0 && ! int_fits_type_p (high, type)))
3105             break;
3106
3107           n_low = low, n_high = high;
3108
3109           if (n_low != 0)
3110             n_low = convert (type, n_low);
3111
3112           if (n_high != 0)
3113             n_high = convert (type, n_high);
3114
3115           /* If we're converting from an unsigned to a signed type,
3116              we will be doing the comparison as unsigned.  The tests above
3117              have already verified that LOW and HIGH are both positive.
3118
3119              So we have to make sure that the original unsigned value will
3120              be interpreted as positive.  */
3121           if (TREE_UNSIGNED (type) && ! TREE_UNSIGNED (TREE_TYPE (exp)))
3122             {
3123               tree equiv_type = (*lang_hooks.types.type_for_mode)
3124                 (TYPE_MODE (type), 1);
3125               tree high_positive;
3126
3127               /* A range without an upper bound is, naturally, unbounded.
3128                  Since convert would have cropped a very large value, use
3129                  the max value for the destination type.  */
3130               high_positive
3131                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
3132                   : TYPE_MAX_VALUE (type);
3133
3134               if (TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (exp)))
3135                 high_positive = fold (build (RSHIFT_EXPR, type,
3136                                              convert (type, high_positive),
3137                                              convert (type, integer_one_node)));
3138
3139               /* If the low bound is specified, "and" the range with the
3140                  range for which the original unsigned value will be
3141                  positive.  */
3142               if (low != 0)
3143                 {
3144                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
3145                                       1, n_low, n_high,
3146                                       1, convert (type, integer_zero_node),
3147                                       high_positive))
3148                     break;
3149
3150                   in_p = (n_in_p == in_p);
3151                 }
3152               else
3153                 {
3154                   /* Otherwise, "or" the range with the range of the input
3155                      that will be interpreted as negative.  */
3156                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
3157                                       0, n_low, n_high,
3158                                       1, convert (type, integer_zero_node),
3159                                       high_positive))
3160                     break;
3161
3162                   in_p = (in_p != n_in_p);
3163                 }
3164             }
3165
3166           exp = arg0;
3167           low = n_low, high = n_high;
3168           continue;
3169
3170         default:
3171           break;
3172         }
3173
3174       break;
3175     }
3176
3177   /* If EXP is a constant, we can evaluate whether this is true or false.  */
3178   if (TREE_CODE (exp) == INTEGER_CST)
3179     {
3180       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
3181                                                  exp, 0, low, 0))
3182                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
3183                                                     exp, 1, high, 1)));
3184       low = high = 0;
3185       exp = 0;
3186     }
3187
3188   *pin_p = in_p, *plow = low, *phigh = high;
3189   return exp;
3190 }
3191 \f
3192 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
3193    type, TYPE, return an expression to test if EXP is in (or out of, depending
3194    on IN_P) the range.  */
3195
3196 static tree
3197 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
3198 {
3199   tree etype = TREE_TYPE (exp);
3200   tree value;
3201
3202   if (! in_p
3203       && (0 != (value = build_range_check (type, exp, 1, low, high))))
3204     return invert_truthvalue (value);
3205
3206   if (low == 0 && high == 0)
3207     return convert (type, integer_one_node);
3208
3209   if (low == 0)
3210     return fold (build (LE_EXPR, type, exp, high));
3211
3212   if (high == 0)
3213     return fold (build (GE_EXPR, type, exp, low));
3214
3215   if (operand_equal_p (low, high, 0))
3216     return fold (build (EQ_EXPR, type, exp, low));
3217
3218   if (integer_zerop (low))
3219     {
3220       if (! TREE_UNSIGNED (etype))
3221         {
3222           etype = (*lang_hooks.types.unsigned_type) (etype);
3223           high = convert (etype, high);
3224           exp = convert (etype, exp);
3225         }
3226       return build_range_check (type, exp, 1, 0, high);
3227     }
3228
3229   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
3230   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
3231     {
3232       unsigned HOST_WIDE_INT lo;
3233       HOST_WIDE_INT hi;
3234       int prec;
3235
3236       prec = TYPE_PRECISION (etype);
3237       if (prec <= HOST_BITS_PER_WIDE_INT)
3238         {
3239           hi = 0;
3240           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
3241         }
3242       else
3243         {
3244           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
3245           lo = (unsigned HOST_WIDE_INT) -1;
3246         }
3247
3248       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
3249         {
3250           if (TREE_UNSIGNED (etype))
3251             {
3252               etype = (*lang_hooks.types.signed_type) (etype);
3253               exp = convert (etype, exp);
3254             }
3255           return fold (build (GT_EXPR, type, exp,
3256                               convert (etype, integer_zero_node)));
3257         }
3258     }
3259
3260   if (0 != (value = const_binop (MINUS_EXPR, high, low, 0))
3261       && ! TREE_OVERFLOW (value))
3262     return build_range_check (type,
3263                               fold (build (MINUS_EXPR, etype, exp, low)),
3264                               1, convert (etype, integer_zero_node), value);
3265
3266   return 0;
3267 }
3268 \f
3269 /* Given two ranges, see if we can merge them into one.  Return 1 if we
3270    can, 0 if we can't.  Set the output range into the specified parameters.  */
3271
3272 static int
3273 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
3274               tree high0, int in1_p, tree low1, tree high1)
3275 {
3276   int no_overlap;
3277   int subset;
3278   int temp;
3279   tree tem;
3280   int in_p;
3281   tree low, high;
3282   int lowequal = ((low0 == 0 && low1 == 0)
3283                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3284                                                 low0, 0, low1, 0)));
3285   int highequal = ((high0 == 0 && high1 == 0)
3286                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3287                                                  high0, 1, high1, 1)));
3288
3289   /* Make range 0 be the range that starts first, or ends last if they
3290      start at the same value.  Swap them if it isn't.  */
3291   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
3292                                  low0, 0, low1, 0))
3293       || (lowequal
3294           && integer_onep (range_binop (GT_EXPR, integer_type_node,
3295                                         high1, 1, high0, 1))))
3296     {
3297       temp = in0_p, in0_p = in1_p, in1_p = temp;
3298       tem = low0, low0 = low1, low1 = tem;
3299       tem = high0, high0 = high1, high1 = tem;
3300     }
3301
3302   /* Now flag two cases, whether the ranges are disjoint or whether the
3303      second range is totally subsumed in the first.  Note that the tests
3304      below are simplified by the ones above.  */
3305   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
3306                                           high0, 1, low1, 0));
3307   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
3308                                       high1, 1, high0, 1));
3309
3310   /* We now have four cases, depending on whether we are including or
3311      excluding the two ranges.  */
3312   if (in0_p && in1_p)
3313     {
3314       /* If they don't overlap, the result is false.  If the second range
3315          is a subset it is the result.  Otherwise, the range is from the start
3316          of the second to the end of the first.  */
3317       if (no_overlap)
3318         in_p = 0, low = high = 0;
3319       else if (subset)
3320         in_p = 1, low = low1, high = high1;
3321       else
3322         in_p = 1, low = low1, high = high0;
3323     }
3324
3325   else if (in0_p && ! in1_p)
3326     {
3327       /* If they don't overlap, the result is the first range.  If they are
3328          equal, the result is false.  If the second range is a subset of the
3329          first, and the ranges begin at the same place, we go from just after
3330          the end of the first range to the end of the second.  If the second
3331          range is not a subset of the first, or if it is a subset and both
3332          ranges end at the same place, the range starts at the start of the
3333          first range and ends just before the second range.
3334          Otherwise, we can't describe this as a single range.  */
3335       if (no_overlap)
3336         in_p = 1, low = low0, high = high0;
3337       else if (lowequal && highequal)
3338         in_p = 0, low = high = 0;
3339       else if (subset && lowequal)
3340         {
3341           in_p = 1, high = high0;
3342           low = range_binop (PLUS_EXPR, NULL_TREE, high1, 0,
3343                              integer_one_node, 0);
3344         }
3345       else if (! subset || highequal)
3346         {
3347           in_p = 1, low = low0;
3348           high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
3349                               integer_one_node, 0);
3350         }
3351       else
3352         return 0;
3353     }
3354
3355   else if (! in0_p && in1_p)
3356     {
3357       /* If they don't overlap, the result is the second range.  If the second
3358          is a subset of the first, the result is false.  Otherwise,
3359          the range starts just after the first range and ends at the
3360          end of the second.  */
3361       if (no_overlap)
3362         in_p = 1, low = low1, high = high1;
3363       else if (subset || highequal)
3364         in_p = 0, low = high = 0;
3365       else
3366         {
3367           in_p = 1, high = high1;
3368           low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
3369                              integer_one_node, 0);
3370         }
3371     }
3372
3373   else
3374     {
3375       /* The case where we are excluding both ranges.  Here the complex case
3376          is if they don't overlap.  In that case, the only time we have a
3377          range is if they are adjacent.  If the second is a subset of the
3378          first, the result is the first.  Otherwise, the range to exclude
3379          starts at the beginning of the first range and ends at the end of the
3380          second.  */
3381       if (no_overlap)
3382         {
3383           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
3384                                          range_binop (PLUS_EXPR, NULL_TREE,
3385                                                       high0, 1,
3386                                                       integer_one_node, 1),
3387                                          1, low1, 0)))
3388             in_p = 0, low = low0, high = high1;
3389           else
3390             return 0;
3391         }
3392       else if (subset)
3393         in_p = 0, low = low0, high = high0;
3394       else
3395         in_p = 0, low = low0, high = high1;
3396     }
3397
3398   *pin_p = in_p, *plow = low, *phigh = high;
3399   return 1;
3400 }
3401 \f
3402 #ifndef RANGE_TEST_NON_SHORT_CIRCUIT
3403 #define RANGE_TEST_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
3404 #endif
3405
3406 /* EXP is some logical combination of boolean tests.  See if we can
3407    merge it into some range test.  Return the new tree if so.  */
3408
3409 static tree
3410 fold_range_test (tree exp)
3411 {
3412   int or_op = (TREE_CODE (exp) == TRUTH_ORIF_EXPR
3413                || TREE_CODE (exp) == TRUTH_OR_EXPR);
3414   int in0_p, in1_p, in_p;
3415   tree low0, low1, low, high0, high1, high;
3416   tree lhs = make_range (TREE_OPERAND (exp, 0), &in0_p, &low0, &high0);
3417   tree rhs = make_range (TREE_OPERAND (exp, 1), &in1_p, &low1, &high1);
3418   tree tem;
3419
3420   /* If this is an OR operation, invert both sides; we will invert
3421      again at the end.  */
3422   if (or_op)
3423     in0_p = ! in0_p, in1_p = ! in1_p;
3424
3425   /* If both expressions are the same, if we can merge the ranges, and we
3426      can build the range test, return it or it inverted.  If one of the
3427      ranges is always true or always false, consider it to be the same
3428      expression as the other.  */
3429   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
3430       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
3431                        in1_p, low1, high1)
3432       && 0 != (tem = (build_range_check (TREE_TYPE (exp),
3433                                          lhs != 0 ? lhs
3434                                          : rhs != 0 ? rhs : integer_zero_node,
3435                                          in_p, low, high))))
3436     return or_op ? invert_truthvalue (tem) : tem;
3437
3438   /* On machines where the branch cost is expensive, if this is a
3439      short-circuited branch and the underlying object on both sides
3440      is the same, make a non-short-circuit operation.  */
3441   else if (RANGE_TEST_NON_SHORT_CIRCUIT
3442            && lhs != 0 && rhs != 0
3443            && (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3444                || TREE_CODE (exp) == TRUTH_ORIF_EXPR)
3445            && operand_equal_p (lhs, rhs, 0))
3446     {
3447       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
3448          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
3449          which cases we can't do this.  */
3450       if (simple_operand_p (lhs))
3451         return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3452                       ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3453                       TREE_TYPE (exp), TREE_OPERAND (exp, 0),
3454                       TREE_OPERAND (exp, 1));
3455
3456       else if ((*lang_hooks.decls.global_bindings_p) () == 0
3457                && ! CONTAINS_PLACEHOLDER_P (lhs))
3458         {
3459           tree common = save_expr (lhs);
3460
3461           if (0 != (lhs = build_range_check (TREE_TYPE (exp), common,
3462                                              or_op ? ! in0_p : in0_p,
3463                                              low0, high0))
3464               && (0 != (rhs = build_range_check (TREE_TYPE (exp), common,
3465                                                  or_op ? ! in1_p : in1_p,
3466                                                  low1, high1))))
3467             return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3468                           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3469                           TREE_TYPE (exp), lhs, rhs);
3470         }
3471     }
3472
3473   return 0;
3474 }
3475 \f
3476 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
3477    bit value.  Arrange things so the extra bits will be set to zero if and
3478    only if C is signed-extended to its full width.  If MASK is nonzero,
3479    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
3480
3481 static tree
3482 unextend (tree c, int p, int unsignedp, tree mask)
3483 {
3484   tree type = TREE_TYPE (c);
3485   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
3486   tree temp;
3487
3488   if (p == modesize || unsignedp)
3489     return c;
3490
3491   /* We work by getting just the sign bit into the low-order bit, then
3492      into the high-order bit, then sign-extend.  We then XOR that value
3493      with C.  */
3494   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
3495   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
3496
3497   /* We must use a signed type in order to get an arithmetic right shift.
3498      However, we must also avoid introducing accidental overflows, so that
3499      a subsequent call to integer_zerop will work.  Hence we must
3500      do the type conversion here.  At this point, the constant is either
3501      zero or one, and the conversion to a signed type can never overflow.
3502      We could get an overflow if this conversion is done anywhere else.  */
3503   if (TREE_UNSIGNED (type))
3504     temp = convert ((*lang_hooks.types.signed_type) (type), temp);
3505
3506   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
3507   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
3508   if (mask != 0)
3509     temp = const_binop (BIT_AND_EXPR, temp, convert (TREE_TYPE (c), mask), 0);
3510   /* If necessary, convert the type back to match the type of C.  */
3511   if (TREE_UNSIGNED (type))
3512     temp = convert (type, temp);
3513
3514   return convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
3515 }
3516 \f
3517 /* Find ways of folding logical expressions of LHS and RHS:
3518    Try to merge two comparisons to the same innermost item.
3519    Look for range tests like "ch >= '0' && ch <= '9'".
3520    Look for combinations of simple terms on machines with expensive branches
3521    and evaluate the RHS unconditionally.
3522
3523    For example, if we have p->a == 2 && p->b == 4 and we can make an
3524    object large enough to span both A and B, we can do this with a comparison
3525    against the object ANDed with the a mask.
3526
3527    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
3528    operations to do this with one comparison.
3529
3530    We check for both normal comparisons and the BIT_AND_EXPRs made this by
3531    function and the one above.
3532
3533    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
3534    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
3535
3536    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
3537    two operands.
3538
3539    We return the simplified tree or 0 if no optimization is possible.  */
3540
3541 static tree
3542 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
3543 {
3544   /* If this is the "or" of two comparisons, we can do something if
3545      the comparisons are NE_EXPR.  If this is the "and", we can do something
3546      if the comparisons are EQ_EXPR.  I.e.,
3547         (a->b == 2 && a->c == 4) can become (a->new == NEW).
3548
3549      WANTED_CODE is this operation code.  For single bit fields, we can
3550      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
3551      comparison for one-bit fields.  */
3552
3553   enum tree_code wanted_code;
3554   enum tree_code lcode, rcode;
3555   tree ll_arg, lr_arg, rl_arg, rr_arg;
3556   tree ll_inner, lr_inner, rl_inner, rr_inner;
3557   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
3558   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
3559   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
3560   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
3561   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
3562   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
3563   enum machine_mode lnmode, rnmode;
3564   tree ll_mask, lr_mask, rl_mask, rr_mask;
3565   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
3566   tree l_const, r_const;
3567   tree lntype, rntype, result;
3568   int first_bit, end_bit;
3569   int volatilep;
3570
3571   /* Start by getting the comparison codes.  Fail if anything is volatile.
3572      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
3573      it were surrounded with a NE_EXPR.  */
3574
3575   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
3576     return 0;
3577
3578   lcode = TREE_CODE (lhs);
3579   rcode = TREE_CODE (rhs);
3580
3581   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
3582     lcode = NE_EXPR, lhs = build (NE_EXPR, truth_type, lhs, integer_zero_node);
3583
3584   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
3585     rcode = NE_EXPR, rhs = build (NE_EXPR, truth_type, rhs, integer_zero_node);
3586
3587   if (TREE_CODE_CLASS (lcode) != '<' || TREE_CODE_CLASS (rcode) != '<')
3588     return 0;
3589
3590   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
3591           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
3592
3593   ll_arg = TREE_OPERAND (lhs, 0);
3594   lr_arg = TREE_OPERAND (lhs, 1);
3595   rl_arg = TREE_OPERAND (rhs, 0);
3596   rr_arg = TREE_OPERAND (rhs, 1);
3597
3598   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
3599   if (simple_operand_p (ll_arg)
3600       && simple_operand_p (lr_arg)
3601       && !FLOAT_TYPE_P (TREE_TYPE (ll_arg)))
3602     {
3603       int compcode;
3604
3605       if (operand_equal_p (ll_arg, rl_arg, 0)
3606           && operand_equal_p (lr_arg, rr_arg, 0))
3607         {
3608           int lcompcode, rcompcode;
3609
3610           lcompcode = comparison_to_compcode (lcode);
3611           rcompcode = comparison_to_compcode (rcode);
3612           compcode = (code == TRUTH_AND_EXPR)
3613                      ? lcompcode & rcompcode
3614                      : lcompcode | rcompcode;
3615         }
3616       else if (operand_equal_p (ll_arg, rr_arg, 0)
3617                && operand_equal_p (lr_arg, rl_arg, 0))
3618         {
3619           int lcompcode, rcompcode;
3620
3621           rcode = swap_tree_comparison (rcode);
3622           lcompcode = comparison_to_compcode (lcode);
3623           rcompcode = comparison_to_compcode (rcode);
3624           compcode = (code == TRUTH_AND_EXPR)
3625                      ? lcompcode & rcompcode
3626                      : lcompcode | rcompcode;
3627         }
3628       else
3629         compcode = -1;
3630
3631       if (compcode == COMPCODE_TRUE)
3632         return convert (truth_type, integer_one_node);
3633       else if (compcode == COMPCODE_FALSE)
3634         return convert (truth_type, integer_zero_node);
3635       else if (compcode != -1)
3636         return build (compcode_to_comparison (compcode),
3637                       truth_type, ll_arg, lr_arg);
3638     }
3639
3640   /* If the RHS can be evaluated unconditionally and its operands are
3641      simple, it wins to evaluate the RHS unconditionally on machines
3642      with expensive branches.  In this case, this isn't a comparison
3643      that can be merged.  Avoid doing this if the RHS is a floating-point
3644      comparison since those can trap.  */
3645
3646   if (BRANCH_COST >= 2
3647       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
3648       && simple_operand_p (rl_arg)
3649       && simple_operand_p (rr_arg))
3650     {
3651       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
3652       if (code == TRUTH_OR_EXPR
3653           && lcode == NE_EXPR && integer_zerop (lr_arg)
3654           && rcode == NE_EXPR && integer_zerop (rr_arg)
3655           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
3656         return build (NE_EXPR, truth_type,
3657                       build (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
3658                              ll_arg, rl_arg),
3659                       integer_zero_node);
3660
3661       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
3662       if (code == TRUTH_AND_EXPR
3663           && lcode == EQ_EXPR && integer_zerop (lr_arg)
3664           && rcode == EQ_EXPR && integer_zerop (rr_arg)
3665           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
3666         return build (EQ_EXPR, truth_type,
3667                       build (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
3668                              ll_arg, rl_arg),
3669                       integer_zero_node);
3670
3671       return build (code, truth_type, lhs, rhs);
3672     }
3673
3674   /* See if the comparisons can be merged.  Then get all the parameters for
3675      each side.  */
3676
3677   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
3678       || (rcode != EQ_EXPR && rcode != NE_EXPR))
3679     return 0;
3680
3681   volatilep = 0;
3682   ll_inner = decode_field_reference (ll_arg,
3683                                      &ll_bitsize, &ll_bitpos, &ll_mode,
3684                                      &ll_unsignedp, &volatilep, &ll_mask,
3685                                      &ll_and_mask);
3686   lr_inner = decode_field_reference (lr_arg,
3687                                      &lr_bitsize, &lr_bitpos, &lr_mode,
3688                                      &lr_unsignedp, &volatilep, &lr_mask,
3689                                      &lr_and_mask);
3690   rl_inner = decode_field_reference (rl_arg,
3691                                      &rl_bitsize, &rl_bitpos, &rl_mode,
3692                                      &rl_unsignedp, &volatilep, &rl_mask,
3693                                      &rl_and_mask);
3694   rr_inner = decode_field_reference (rr_arg,
3695                                      &rr_bitsize, &rr_bitpos, &rr_mode,
3696                                      &rr_unsignedp, &volatilep, &rr_mask,
3697                                      &rr_and_mask);
3698
3699   /* It must be true that the inner operation on the lhs of each
3700      comparison must be the same if we are to be able to do anything.
3701      Then see if we have constants.  If not, the same must be true for
3702      the rhs's.  */
3703   if (volatilep || ll_inner == 0 || rl_inner == 0
3704       || ! operand_equal_p (ll_inner, rl_inner, 0))
3705     return 0;
3706
3707   if (TREE_CODE (lr_arg) == INTEGER_CST
3708       && TREE_CODE (rr_arg) == INTEGER_CST)
3709     l_const = lr_arg, r_const = rr_arg;
3710   else if (lr_inner == 0 || rr_inner == 0
3711            || ! operand_equal_p (lr_inner, rr_inner, 0))
3712     return 0;
3713   else
3714     l_const = r_const = 0;
3715
3716   /* If either comparison code is not correct for our logical operation,
3717      fail.  However, we can convert a one-bit comparison against zero into
3718      the opposite comparison against that bit being set in the field.  */
3719
3720   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
3721   if (lcode != wanted_code)
3722     {
3723       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
3724         {
3725           /* Make the left operand unsigned, since we are only interested
3726              in the value of one bit.  Otherwise we are doing the wrong
3727              thing below.  */
3728           ll_unsignedp = 1;
3729           l_const = ll_mask;
3730         }
3731       else
3732         return 0;
3733     }
3734
3735   /* This is analogous to the code for l_const above.  */
3736   if (rcode != wanted_code)
3737     {
3738       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
3739         {
3740           rl_unsignedp = 1;
3741           r_const = rl_mask;
3742         }
3743       else
3744         return 0;
3745     }
3746
3747   /* After this point all optimizations will generate bit-field
3748      references, which we might not want.  */
3749   if (! (*lang_hooks.can_use_bit_fields_p) ())
3750     return 0;
3751
3752   /* See if we can find a mode that contains both fields being compared on
3753      the left.  If we can't, fail.  Otherwise, update all constants and masks
3754      to be relative to a field of that size.  */
3755   first_bit = MIN (ll_bitpos, rl_bitpos);
3756   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
3757   lnmode = get_best_mode (end_bit - first_bit, first_bit,
3758                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
3759                           volatilep);
3760   if (lnmode == VOIDmode)
3761     return 0;
3762
3763   lnbitsize = GET_MODE_BITSIZE (lnmode);
3764   lnbitpos = first_bit & ~ (lnbitsize - 1);
3765   lntype = (*lang_hooks.types.type_for_size) (lnbitsize, 1);
3766   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
3767
3768   if (BYTES_BIG_ENDIAN)
3769     {
3770       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
3771       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
3772     }
3773
3774   ll_mask = const_binop (LSHIFT_EXPR, convert (lntype, ll_mask),
3775                          size_int (xll_bitpos), 0);
3776   rl_mask = const_binop (LSHIFT_EXPR, convert (lntype, rl_mask),
3777                          size_int (xrl_bitpos), 0);
3778
3779   if (l_const)
3780     {
3781       l_const = convert (lntype, l_const);
3782       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
3783       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
3784       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
3785                                         fold (build1 (BIT_NOT_EXPR,
3786                                                       lntype, ll_mask)),
3787                                         0)))
3788         {
3789           warning ("comparison is always %d", wanted_code == NE_EXPR);
3790
3791           return convert (truth_type,
3792                           wanted_code == NE_EXPR
3793                           ? integer_one_node : integer_zero_node);
3794         }
3795     }
3796   if (r_const)
3797     {
3798       r_const = convert (lntype, r_const);
3799       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
3800       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
3801       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
3802                                         fold (build1 (BIT_NOT_EXPR,
3803                                                       lntype, rl_mask)),
3804                                         0)))
3805         {
3806           warning ("comparison is always %d", wanted_code == NE_EXPR);
3807
3808           return convert (truth_type,
3809                           wanted_code == NE_EXPR
3810                           ? integer_one_node : integer_zero_node);
3811         }
3812     }
3813
3814   /* If the right sides are not constant, do the same for it.  Also,
3815      disallow this optimization if a size or signedness mismatch occurs
3816      between the left and right sides.  */
3817   if (l_const == 0)
3818     {
3819       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
3820           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
3821           /* Make sure the two fields on the right
3822              correspond to the left without being swapped.  */
3823           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
3824         return 0;
3825
3826       first_bit = MIN (lr_bitpos, rr_bitpos);
3827       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
3828       rnmode = get_best_mode (end_bit - first_bit, first_bit,
3829                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
3830                               volatilep);
3831       if (rnmode == VOIDmode)
3832         return 0;
3833
3834       rnbitsize = GET_MODE_BITSIZE (rnmode);
3835       rnbitpos = first_bit & ~ (rnbitsize - 1);
3836       rntype = (*lang_hooks.types.type_for_size) (rnbitsize, 1);
3837       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
3838
3839       if (BYTES_BIG_ENDIAN)
3840         {
3841           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
3842           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
3843         }
3844
3845       lr_mask = const_binop (LSHIFT_EXPR, convert (rntype, lr_mask),
3846                              size_int (xlr_bitpos), 0);
3847       rr_mask = const_binop (LSHIFT_EXPR, convert (rntype, rr_mask),
3848                              size_int (xrr_bitpos), 0);
3849
3850       /* Make a mask that corresponds to both fields being compared.
3851          Do this for both items being compared.  If the operands are the
3852          same size and the bits being compared are in the same position
3853          then we can do this by masking both and comparing the masked
3854          results.  */
3855       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3856       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
3857       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
3858         {
3859           lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
3860                                     ll_unsignedp || rl_unsignedp);
3861           if (! all_ones_mask_p (ll_mask, lnbitsize))
3862             lhs = build (BIT_AND_EXPR, lntype, lhs, ll_mask);
3863
3864           rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
3865                                     lr_unsignedp || rr_unsignedp);
3866           if (! all_ones_mask_p (lr_mask, rnbitsize))
3867             rhs = build (BIT_AND_EXPR, rntype, rhs, lr_mask);
3868
3869           return build (wanted_code, truth_type, lhs, rhs);
3870         }
3871
3872       /* There is still another way we can do something:  If both pairs of
3873          fields being compared are adjacent, we may be able to make a wider
3874          field containing them both.
3875
3876          Note that we still must mask the lhs/rhs expressions.  Furthermore,
3877          the mask must be shifted to account for the shift done by
3878          make_bit_field_ref.  */
3879       if ((ll_bitsize + ll_bitpos == rl_bitpos
3880            && lr_bitsize + lr_bitpos == rr_bitpos)
3881           || (ll_bitpos == rl_bitpos + rl_bitsize
3882               && lr_bitpos == rr_bitpos + rr_bitsize))
3883         {
3884           tree type;
3885
3886           lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
3887                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
3888           rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
3889                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
3890
3891           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
3892                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
3893           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
3894                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
3895
3896           /* Convert to the smaller type before masking out unwanted bits.  */
3897           type = lntype;
3898           if (lntype != rntype)
3899             {
3900               if (lnbitsize > rnbitsize)
3901                 {
3902                   lhs = convert (rntype, lhs);
3903                   ll_mask = convert (rntype, ll_mask);
3904                   type = rntype;
3905                 }
3906               else if (lnbitsize < rnbitsize)
3907                 {
3908                   rhs = convert (lntype, rhs);
3909                   lr_mask = convert (lntype, lr_mask);
3910                   type = lntype;
3911                 }
3912             }
3913
3914           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
3915             lhs = build (BIT_AND_EXPR, type, lhs, ll_mask);
3916
3917           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
3918             rhs = build (BIT_AND_EXPR, type, rhs, lr_mask);
3919
3920           return build (wanted_code, truth_type, lhs, rhs);
3921         }
3922
3923       return 0;
3924     }
3925
3926   /* Handle the case of comparisons with constants.  If there is something in
3927      common between the masks, those bits of the constants must be the same.
3928      If not, the condition is always false.  Test for this to avoid generating
3929      incorrect code below.  */
3930   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
3931   if (! integer_zerop (result)
3932       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
3933                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
3934     {
3935       if (wanted_code == NE_EXPR)
3936         {
3937           warning ("`or' of unmatched not-equal tests is always 1");
3938           return convert (truth_type, integer_one_node);
3939         }
3940       else
3941         {
3942           warning ("`and' of mutually exclusive equal-tests is always 0");
3943           return convert (truth_type, integer_zero_node);
3944         }
3945     }
3946
3947   /* Construct the expression we will return.  First get the component
3948      reference we will make.  Unless the mask is all ones the width of
3949      that field, perform the mask operation.  Then compare with the
3950      merged constant.  */
3951   result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
3952                                ll_unsignedp || rl_unsignedp);
3953
3954   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3955   if (! all_ones_mask_p (ll_mask, lnbitsize))
3956     result = build (BIT_AND_EXPR, lntype, result, ll_mask);
3957
3958   return build (wanted_code, truth_type, result,
3959                 const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
3960 }
3961 \f
3962 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
3963    constant.  */
3964
3965 static tree
3966 optimize_minmax_comparison (tree t)
3967 {
3968   tree type = TREE_TYPE (t);
3969   tree arg0 = TREE_OPERAND (t, 0);
3970   enum tree_code op_code;
3971   tree comp_const = TREE_OPERAND (t, 1);
3972   tree minmax_const;
3973   int consts_equal, consts_lt;
3974   tree inner;
3975
3976   STRIP_SIGN_NOPS (arg0);
3977
3978   op_code = TREE_CODE (arg0);
3979   minmax_const = TREE_OPERAND (arg0, 1);
3980   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
3981   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
3982   inner = TREE_OPERAND (arg0, 0);
3983
3984   /* If something does not permit us to optimize, return the original tree.  */
3985   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
3986       || TREE_CODE (comp_const) != INTEGER_CST
3987       || TREE_CONSTANT_OVERFLOW (comp_const)
3988       || TREE_CODE (minmax_const) != INTEGER_CST
3989       || TREE_CONSTANT_OVERFLOW (minmax_const))
3990     return t;
3991
3992   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
3993      and GT_EXPR, doing the rest with recursive calls using logical
3994      simplifications.  */
3995   switch (TREE_CODE (t))
3996     {
3997     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
3998       return
3999         invert_truthvalue (optimize_minmax_comparison (invert_truthvalue (t)));
4000
4001     case GE_EXPR:
4002       return
4003         fold (build (TRUTH_ORIF_EXPR, type,
4004                      optimize_minmax_comparison
4005                      (build (EQ_EXPR, type, arg0, comp_const)),
4006                      optimize_minmax_comparison
4007                      (build (GT_EXPR, type, arg0, comp_const))));
4008
4009     case EQ_EXPR:
4010       if (op_code == MAX_EXPR && consts_equal)
4011         /* MAX (X, 0) == 0  ->  X <= 0  */
4012         return fold (build (LE_EXPR, type, inner, comp_const));
4013
4014       else if (op_code == MAX_EXPR && consts_lt)
4015         /* MAX (X, 0) == 5  ->  X == 5   */
4016         return fold (build (EQ_EXPR, type, inner, comp_const));
4017
4018       else if (op_code == MAX_EXPR)
4019         /* MAX (X, 0) == -1  ->  false  */
4020         return omit_one_operand (type, integer_zero_node, inner);
4021
4022       else if (consts_equal)
4023         /* MIN (X, 0) == 0  ->  X >= 0  */
4024         return fold (build (GE_EXPR, type, inner, comp_const));
4025
4026       else if (consts_lt)
4027         /* MIN (X, 0) == 5  ->  false  */
4028         return omit_one_operand (type, integer_zero_node, inner);
4029
4030       else
4031         /* MIN (X, 0) == -1  ->  X == -1  */
4032         return fold (build (EQ_EXPR, type, inner, comp_const));
4033
4034     case GT_EXPR:
4035       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
4036         /* MAX (X, 0) > 0  ->  X > 0
4037            MAX (X, 0) > 5  ->  X > 5  */
4038         return fold (build (GT_EXPR, type, inner, comp_const));
4039
4040       else if (op_code == MAX_EXPR)
4041         /* MAX (X, 0) > -1  ->  true  */
4042         return omit_one_operand (type, integer_one_node, inner);
4043
4044       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
4045         /* MIN (X, 0) > 0  ->  false
4046            MIN (X, 0) > 5  ->  false  */
4047         return omit_one_operand (type, integer_zero_node, inner);
4048
4049       else
4050         /* MIN (X, 0) > -1  ->  X > -1  */
4051         return fold (build (GT_EXPR, type, inner, comp_const));
4052
4053     default:
4054       return t;
4055     }
4056 }
4057 \f
4058 /* T is an integer expression that is being multiplied, divided, or taken a
4059    modulus (CODE says which and what kind of divide or modulus) by a
4060    constant C.  See if we can eliminate that operation by folding it with
4061    other operations already in T.  WIDE_TYPE, if non-null, is a type that
4062    should be used for the computation if wider than our type.
4063
4064    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
4065    (X * 2) + (Y * 4).  We must, however, be assured that either the original
4066    expression would not overflow or that overflow is undefined for the type
4067    in the language in question.
4068
4069    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
4070    the machine has a multiply-accumulate insn or that this is part of an
4071    addressing calculation.
4072
4073    If we return a non-null expression, it is an equivalent form of the
4074    original computation, but need not be in the original type.  */
4075
4076 static tree
4077 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type)
4078 {
4079   /* To avoid exponential search depth, refuse to allow recursion past
4080      three levels.  Beyond that (1) it's highly unlikely that we'll find
4081      something interesting and (2) we've probably processed it before
4082      when we built the inner expression.  */
4083
4084   static int depth;
4085   tree ret;
4086
4087   if (depth > 3)
4088     return NULL;
4089
4090   depth++;
4091   ret = extract_muldiv_1 (t, c, code, wide_type);
4092   depth--;
4093
4094   return ret;
4095 }
4096
4097 static tree
4098 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
4099 {
4100   tree type = TREE_TYPE (t);
4101   enum tree_code tcode = TREE_CODE (t);
4102   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
4103                                    > GET_MODE_SIZE (TYPE_MODE (type)))
4104                 ? wide_type : type);
4105   tree t1, t2;
4106   int same_p = tcode == code;
4107   tree op0 = NULL_TREE, op1 = NULL_TREE;
4108
4109   /* Don't deal with constants of zero here; they confuse the code below.  */
4110   if (integer_zerop (c))
4111     return NULL_TREE;
4112
4113   if (TREE_CODE_CLASS (tcode) == '1')
4114     op0 = TREE_OPERAND (t, 0);
4115
4116   if (TREE_CODE_CLASS (tcode) == '2')
4117     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
4118
4119   /* Note that we need not handle conditional operations here since fold
4120      already handles those cases.  So just do arithmetic here.  */
4121   switch (tcode)
4122     {
4123     case INTEGER_CST:
4124       /* For a constant, we can always simplify if we are a multiply
4125          or (for divide and modulus) if it is a multiple of our constant.  */
4126       if (code == MULT_EXPR
4127           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
4128         return const_binop (code, convert (ctype, t), convert (ctype, c), 0);
4129       break;
4130
4131     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
4132       /* If op0 is an expression ...  */
4133       if ((TREE_CODE_CLASS (TREE_CODE (op0)) == '<'
4134            || TREE_CODE_CLASS (TREE_CODE (op0)) == '1'
4135            || TREE_CODE_CLASS (TREE_CODE (op0)) == '2'
4136            || TREE_CODE_CLASS (TREE_CODE (op0)) == 'e')
4137           /* ... and is unsigned, and its type is smaller than ctype,
4138              then we cannot pass through as widening.  */
4139           && ((TREE_UNSIGNED (TREE_TYPE (op0))
4140                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
4141                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
4142                && (GET_MODE_SIZE (TYPE_MODE (ctype))
4143                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
4144               /* ... or its type is larger than ctype,
4145                  then we cannot pass through this truncation.  */
4146               || (GET_MODE_SIZE (TYPE_MODE (ctype))
4147                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
4148               /* ... or signedness changes for division or modulus,
4149                  then we cannot pass through this conversion.  */
4150               || (code != MULT_EXPR
4151                   && (TREE_UNSIGNED (ctype)
4152                       != TREE_UNSIGNED (TREE_TYPE (op0))))))
4153         break;
4154
4155       /* Pass the constant down and see if we can make a simplification.  If
4156          we can, replace this expression with the inner simplification for
4157          possible later conversion to our or some other type.  */
4158       if ((t2 = convert (TREE_TYPE (op0), c)) != 0
4159           && TREE_CODE (t2) == INTEGER_CST
4160           && ! TREE_CONSTANT_OVERFLOW (t2)
4161           && (0 != (t1 = extract_muldiv (op0, t2, code,
4162                                          code == MULT_EXPR
4163                                          ? ctype : NULL_TREE))))
4164         return t1;
4165       break;
4166
4167     case NEGATE_EXPR:  case ABS_EXPR:
4168       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
4169         return fold (build1 (tcode, ctype, convert (ctype, t1)));
4170       break;
4171
4172     case MIN_EXPR:  case MAX_EXPR:
4173       /* If widening the type changes the signedness, then we can't perform
4174          this optimization as that changes the result.  */
4175       if (TREE_UNSIGNED (ctype) != TREE_UNSIGNED (type))
4176         break;
4177
4178       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
4179       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0
4180           && (t2 = extract_muldiv (op1, c, code, wide_type)) != 0)
4181         {
4182           if (tree_int_cst_sgn (c) < 0)
4183             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
4184
4185           return fold (build (tcode, ctype, convert (ctype, t1),
4186                               convert (ctype, t2)));
4187         }
4188       break;
4189
4190     case WITH_RECORD_EXPR:
4191       if ((t1 = extract_muldiv (TREE_OPERAND (t, 0), c, code, wide_type)) != 0)
4192         return build (WITH_RECORD_EXPR, TREE_TYPE (t1), t1,
4193                       TREE_OPERAND (t, 1));
4194       break;
4195
4196     case LSHIFT_EXPR:  case RSHIFT_EXPR:
4197       /* If the second operand is constant, this is a multiplication
4198          or floor division, by a power of two, so we can treat it that
4199          way unless the multiplier or divisor overflows.  */
4200       if (TREE_CODE (op1) == INTEGER_CST
4201           /* const_binop may not detect overflow correctly,
4202              so check for it explicitly here.  */
4203           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
4204           && TREE_INT_CST_HIGH (op1) == 0
4205           && 0 != (t1 = convert (ctype,
4206                                  const_binop (LSHIFT_EXPR, size_one_node,
4207                                               op1, 0)))
4208           && ! TREE_OVERFLOW (t1))
4209         return extract_muldiv (build (tcode == LSHIFT_EXPR
4210                                       ? MULT_EXPR : FLOOR_DIV_EXPR,
4211                                       ctype, convert (ctype, op0), t1),
4212                                c, code, wide_type);
4213       break;
4214
4215     case PLUS_EXPR:  case MINUS_EXPR:
4216       /* See if we can eliminate the operation on both sides.  If we can, we
4217          can return a new PLUS or MINUS.  If we can't, the only remaining
4218          cases where we can do anything are if the second operand is a
4219          constant.  */
4220       t1 = extract_muldiv (op0, c, code, wide_type);
4221       t2 = extract_muldiv (op1, c, code, wide_type);
4222       if (t1 != 0 && t2 != 0
4223           && (code == MULT_EXPR
4224               /* If not multiplication, we can only do this if both operands
4225                  are divisible by c.  */
4226               || (multiple_of_p (ctype, op0, c)
4227                   && multiple_of_p (ctype, op1, c))))
4228         return fold (build (tcode, ctype, convert (ctype, t1),
4229                             convert (ctype, t2)));
4230
4231       /* If this was a subtraction, negate OP1 and set it to be an addition.
4232          This simplifies the logic below.  */
4233       if (tcode == MINUS_EXPR)
4234         tcode = PLUS_EXPR, op1 = negate_expr (op1);
4235
4236       if (TREE_CODE (op1) != INTEGER_CST)
4237         break;
4238
4239       /* If either OP1 or C are negative, this optimization is not safe for
4240          some of the division and remainder types while for others we need
4241          to change the code.  */
4242       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
4243         {
4244           if (code == CEIL_DIV_EXPR)
4245             code = FLOOR_DIV_EXPR;
4246           else if (code == FLOOR_DIV_EXPR)
4247             code = CEIL_DIV_EXPR;
4248           else if (code != MULT_EXPR
4249                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
4250             break;
4251         }
4252
4253       /* If it's a multiply or a division/modulus operation of a multiple
4254          of our constant, do the operation and verify it doesn't overflow.  */
4255       if (code == MULT_EXPR
4256           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
4257         {
4258           op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0);
4259           if (op1 == 0 || TREE_OVERFLOW (op1))
4260             break;
4261         }
4262       else
4263         break;
4264
4265       /* If we have an unsigned type is not a sizetype, we cannot widen
4266          the operation since it will change the result if the original
4267          computation overflowed.  */
4268       if (TREE_UNSIGNED (ctype)
4269           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
4270           && ctype != type)
4271         break;
4272
4273       /* If we were able to eliminate our operation from the first side,
4274          apply our operation to the second side and reform the PLUS.  */
4275       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
4276         return fold (build (tcode, ctype, convert (ctype, t1), op1));
4277
4278       /* The last case is if we are a multiply.  In that case, we can
4279          apply the distributive law to commute the multiply and addition
4280          if the multiplication of the constants doesn't overflow.  */
4281       if (code == MULT_EXPR)
4282         return fold (build (tcode, ctype, fold (build (code, ctype,
4283                                                        convert (ctype, op0),
4284                                                        convert (ctype, c))),
4285                             op1));
4286
4287       break;
4288
4289     case MULT_EXPR:
4290       /* We have a special case here if we are doing something like
4291          (C * 8) % 4 since we know that's zero.  */
4292       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
4293            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
4294           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
4295           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
4296         return omit_one_operand (type, integer_zero_node, op0);
4297
4298       /* ... fall through ...  */
4299
4300     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
4301     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
4302       /* If we can extract our operation from the LHS, do so and return a
4303          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
4304          do something only if the second operand is a constant.  */
4305       if (same_p
4306           && (t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
4307         return fold (build (tcode, ctype, convert (ctype, t1),
4308                             convert (ctype, op1)));
4309       else if (tcode == MULT_EXPR && code == MULT_EXPR
4310                && (t1 = extract_muldiv (op1, c, code, wide_type)) != 0)
4311         return fold (build (tcode, ctype, convert (ctype, op0),
4312                             convert (ctype, t1)));
4313       else if (TREE_CODE (op1) != INTEGER_CST)
4314         return 0;
4315
4316       /* If these are the same operation types, we can associate them
4317          assuming no overflow.  */
4318       if (tcode == code
4319           && 0 != (t1 = const_binop (MULT_EXPR, convert (ctype, op1),
4320                                      convert (ctype, c), 0))
4321           && ! TREE_OVERFLOW (t1))
4322         return fold (build (tcode, ctype, convert (ctype, op0), t1));
4323
4324       /* If these operations "cancel" each other, we have the main
4325          optimizations of this pass, which occur when either constant is a
4326          multiple of the other, in which case we replace this with either an
4327          operation or CODE or TCODE.
4328
4329          If we have an unsigned type that is not a sizetype, we cannot do
4330          this since it will change the result if the original computation
4331          overflowed.  */
4332       if ((! TREE_UNSIGNED (ctype)
4333            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
4334           && ! flag_wrapv
4335           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
4336               || (tcode == MULT_EXPR
4337                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
4338                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
4339         {
4340           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
4341             return fold (build (tcode, ctype, convert (ctype, op0),
4342                                 convert (ctype,
4343                                          const_binop (TRUNC_DIV_EXPR,
4344                                                       op1, c, 0))));
4345           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
4346             return fold (build (code, ctype, convert (ctype, op0),
4347                                 convert (ctype,
4348                                          const_binop (TRUNC_DIV_EXPR,
4349                                                       c, op1, 0))));
4350         }
4351       break;
4352
4353     default:
4354       break;
4355     }
4356
4357   return 0;
4358 }
4359 \f
4360 /* If T contains a COMPOUND_EXPR which was inserted merely to evaluate
4361    S, a SAVE_EXPR, return the expression actually being evaluated.   Note
4362    that we may sometimes modify the tree.  */
4363
4364 static tree
4365 strip_compound_expr (tree t, tree s)
4366 {
4367   enum tree_code code = TREE_CODE (t);
4368
4369   /* See if this is the COMPOUND_EXPR we want to eliminate.  */
4370   if (code == COMPOUND_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR
4371       && TREE_OPERAND (TREE_OPERAND (t, 0), 0) == s)
4372     return TREE_OPERAND (t, 1);
4373
4374   /* See if this is a COND_EXPR or a simple arithmetic operator.   We
4375      don't bother handling any other types.  */
4376   else if (code == COND_EXPR)
4377     {
4378       TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
4379       TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
4380       TREE_OPERAND (t, 2) = strip_compound_expr (TREE_OPERAND (t, 2), s);
4381     }
4382   else if (TREE_CODE_CLASS (code) == '1')
4383     TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
4384   else if (TREE_CODE_CLASS (code) == '<'
4385            || TREE_CODE_CLASS (code) == '2')
4386     {
4387       TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
4388       TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
4389     }
4390
4391   return t;
4392 }
4393 \f
4394 /* Return a node which has the indicated constant VALUE (either 0 or
4395    1), and is of the indicated TYPE.  */
4396
4397 static tree
4398 constant_boolean_node (int value, tree type)
4399 {
4400   if (type == integer_type_node)
4401     return value ? integer_one_node : integer_zero_node;
4402   else if (TREE_CODE (type) == BOOLEAN_TYPE)
4403     return (*lang_hooks.truthvalue_conversion) (value ? integer_one_node :
4404                                                 integer_zero_node);
4405   else
4406     {
4407       tree t = build_int_2 (value, 0);
4408
4409       TREE_TYPE (t) = type;
4410       return t;
4411     }
4412 }
4413
4414 /* Utility function for the following routine, to see how complex a nesting of
4415    COND_EXPRs can be.  EXPR is the expression and LIMIT is a count beyond which
4416    we don't care (to avoid spending too much time on complex expressions.).  */
4417
4418 static int
4419 count_cond (tree expr, int lim)
4420 {
4421   int ctrue, cfalse;
4422
4423   if (TREE_CODE (expr) != COND_EXPR)
4424     return 0;
4425   else if (lim <= 0)
4426     return 0;
4427
4428   ctrue = count_cond (TREE_OPERAND (expr, 1), lim - 1);
4429   cfalse = count_cond (TREE_OPERAND (expr, 2), lim - 1 - ctrue);
4430   return MIN (lim, 1 + ctrue + cfalse);
4431 }
4432
4433 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
4434    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
4435    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
4436    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
4437    COND is the first argument to CODE; otherwise (as in the example
4438    given here), it is the second argument.  TYPE is the type of the
4439    original expression.  */
4440
4441 static tree
4442 fold_binary_op_with_conditional_arg (enum tree_code code, tree type,
4443                                      tree cond, tree arg, int cond_first_p)
4444 {
4445   tree test, true_value, false_value;
4446   tree lhs = NULL_TREE;
4447   tree rhs = NULL_TREE;
4448   /* In the end, we'll produce a COND_EXPR.  Both arms of the
4449      conditional expression will be binary operations.  The left-hand
4450      side of the expression to be executed if the condition is true
4451      will be pointed to by TRUE_LHS.  Similarly, the right-hand side
4452      of the expression to be executed if the condition is true will be
4453      pointed to by TRUE_RHS.  FALSE_LHS and FALSE_RHS are analogous --
4454      but apply to the expression to be executed if the conditional is
4455      false.  */
4456   tree *true_lhs;
4457   tree *true_rhs;
4458   tree *false_lhs;
4459   tree *false_rhs;
4460   /* These are the codes to use for the left-hand side and right-hand
4461      side of the COND_EXPR.  Normally, they are the same as CODE.  */
4462   enum tree_code lhs_code = code;
4463   enum tree_code rhs_code = code;
4464   /* And these are the types of the expressions.  */
4465   tree lhs_type = type;
4466   tree rhs_type = type;
4467   int save = 0;
4468
4469   if (cond_first_p)
4470     {
4471       true_rhs = false_rhs = &arg;
4472       true_lhs = &true_value;
4473       false_lhs = &false_value;
4474     }
4475   else
4476     {
4477       true_lhs = false_lhs = &arg;
4478       true_rhs = &true_value;
4479       false_rhs = &false_value;
4480     }
4481
4482   if (TREE_CODE (cond) == COND_EXPR)
4483     {
4484       test = TREE_OPERAND (cond, 0);
4485       true_value = TREE_OPERAND (cond, 1);
4486       false_value = TREE_OPERAND (cond, 2);
4487       /* If this operand throws an expression, then it does not make
4488          sense to try to perform a logical or arithmetic operation
4489          involving it.  Instead of building `a + throw 3' for example,
4490          we simply build `a, throw 3'.  */
4491       if (VOID_TYPE_P (TREE_TYPE (true_value)))
4492         {
4493           if (! cond_first_p)
4494             {
4495               lhs_code = COMPOUND_EXPR;
4496               lhs_type = void_type_node;
4497             }
4498           else
4499             lhs = true_value;
4500         }
4501       if (VOID_TYPE_P (TREE_TYPE (false_value)))
4502         {
4503           if (! cond_first_p)
4504             {
4505               rhs_code = COMPOUND_EXPR;
4506               rhs_type = void_type_node;
4507             }
4508           else
4509             rhs = false_value;
4510         }
4511     }
4512   else
4513     {
4514       tree testtype = TREE_TYPE (cond);
4515       test = cond;
4516       true_value = convert (testtype, integer_one_node);
4517       false_value = convert (testtype, integer_zero_node);
4518     }
4519
4520   /* If ARG is complex we want to make sure we only evaluate it once.  Though
4521      this is only required if it is volatile, it might be more efficient even
4522      if it is not.  However, if we succeed in folding one part to a constant,
4523      we do not need to make this SAVE_EXPR.  Since we do this optimization
4524      primarily to see if we do end up with constant and this SAVE_EXPR
4525      interferes with later optimizations, suppressing it when we can is
4526      important.
4527
4528      If we are not in a function, we can't make a SAVE_EXPR, so don't try to
4529      do so.  Don't try to see if the result is a constant if an arm is a
4530      COND_EXPR since we get exponential behavior in that case.  */
4531
4532   if (saved_expr_p (arg))
4533     save = 1;
4534   else if (lhs == 0 && rhs == 0
4535            && !TREE_CONSTANT (arg)
4536            && (*lang_hooks.decls.global_bindings_p) () == 0
4537            && ((TREE_CODE (arg) != VAR_DECL && TREE_CODE (arg) != PARM_DECL)
4538                || TREE_SIDE_EFFECTS (arg)))
4539     {
4540       if (TREE_CODE (true_value) != COND_EXPR)
4541         lhs = fold (build (lhs_code, lhs_type, *true_lhs, *true_rhs));
4542
4543       if (TREE_CODE (false_value) != COND_EXPR)
4544         rhs = fold (build (rhs_code, rhs_type, *false_lhs, *false_rhs));
4545
4546       if ((lhs == 0 || ! TREE_CONSTANT (lhs))
4547           && (rhs == 0 || !TREE_CONSTANT (rhs)))
4548         {
4549           arg = save_expr (arg);
4550           lhs = rhs = 0;
4551           save = 1;
4552         }
4553     }
4554
4555   if (lhs == 0)
4556     lhs = fold (build (lhs_code, lhs_type, *true_lhs, *true_rhs));
4557   if (rhs == 0)
4558     rhs = fold (build (rhs_code, rhs_type, *false_lhs, *false_rhs));
4559
4560   test = fold (build (COND_EXPR, type, test, lhs, rhs));
4561
4562   if (save)
4563     return build (COMPOUND_EXPR, type,
4564                   convert (void_type_node, arg),
4565                   strip_compound_expr (test, arg));
4566   else
4567     return convert (type, test);
4568 }
4569
4570 \f
4571 /* Subroutine of fold() that checks for the addition of +/- 0.0.
4572
4573    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
4574    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
4575    ADDEND is the same as X.
4576
4577    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
4578    and finite.  The problematic cases are when X is zero, and its mode
4579    has signed zeros.  In the case of rounding towards -infinity,
4580    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
4581    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
4582
4583 static bool
4584 fold_real_zero_addition_p (tree type, tree addend, int negate)
4585 {
4586   if (!real_zerop (addend))
4587     return false;
4588
4589   /* Don't allow the fold with -fsignaling-nans.  */
4590   if (HONOR_SNANS (TYPE_MODE (type)))
4591     return false;
4592
4593   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
4594   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
4595     return true;
4596
4597   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
4598   if (TREE_CODE (addend) == REAL_CST
4599       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
4600     negate = !negate;
4601
4602   /* The mode has signed zeros, and we have to honor their sign.
4603      In this situation, there is only one case we can return true for.
4604      X - 0 is the same as X unless rounding towards -infinity is
4605      supported.  */
4606   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
4607 }
4608
4609 /* Subroutine of fold() that checks comparisons of built-in math
4610    functions against real constants.
4611
4612    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
4613    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
4614    is the type of the result and ARG0 and ARG1 are the operands of the
4615    comparison.  ARG1 must be a TREE_REAL_CST.
4616
4617    The function returns the constant folded tree if a simplification
4618    can be made, and NULL_TREE otherwise.  */
4619
4620 static tree
4621 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
4622                      tree type, tree arg0, tree arg1)
4623 {
4624   REAL_VALUE_TYPE c;
4625
4626   if (fcode == BUILT_IN_SQRT
4627       || fcode == BUILT_IN_SQRTF
4628       || fcode == BUILT_IN_SQRTL)
4629     {
4630       tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
4631       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
4632
4633       c = TREE_REAL_CST (arg1);
4634       if (REAL_VALUE_NEGATIVE (c))
4635         {
4636           /* sqrt(x) < y is always false, if y is negative.  */
4637           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
4638             return omit_one_operand (type,
4639                                      convert (type, integer_zero_node),
4640                                      arg);
4641
4642           /* sqrt(x) > y is always true, if y is negative and we
4643              don't care about NaNs, i.e. negative values of x.  */
4644           if (code == NE_EXPR || !HONOR_NANS (mode))
4645             return omit_one_operand (type,
4646                                      convert (type, integer_one_node),
4647                                      arg);
4648
4649           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
4650           return fold (build (GE_EXPR, type, arg,
4651                               build_real (TREE_TYPE (arg), dconst0)));
4652         }
4653       else if (code == GT_EXPR || code == GE_EXPR)
4654         {
4655           REAL_VALUE_TYPE c2;
4656
4657           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
4658           real_convert (&c2, mode, &c2);
4659
4660           if (REAL_VALUE_ISINF (c2))
4661             {
4662               /* sqrt(x) > y is x == +Inf, when y is very large.  */
4663               if (HONOR_INFINITIES (mode))
4664                 return fold (build (EQ_EXPR, type, arg,
4665                                     build_real (TREE_TYPE (arg), c2)));
4666
4667               /* sqrt(x) > y is always false, when y is very large
4668                  and we don't care about infinities.  */
4669               return omit_one_operand (type,
4670                                        convert (type, integer_zero_node),
4671                                        arg);
4672             }
4673
4674           /* sqrt(x) > c is the same as x > c*c.  */
4675           return fold (build (code, type, arg,
4676                               build_real (TREE_TYPE (arg), c2)));
4677         }
4678       else if (code == LT_EXPR || code == LE_EXPR)
4679         {
4680           REAL_VALUE_TYPE c2;
4681
4682           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
4683           real_convert (&c2, mode, &c2);
4684
4685           if (REAL_VALUE_ISINF (c2))
4686             {
4687               /* sqrt(x) < y is always true, when y is a very large
4688                  value and we don't care about NaNs or Infinities.  */
4689               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
4690                 return omit_one_operand (type,
4691                                          convert (type, integer_one_node),
4692                                          arg);
4693
4694               /* sqrt(x) < y is x != +Inf when y is very large and we
4695                  don't care about NaNs.  */
4696               if (! HONOR_NANS (mode))
4697                 return fold (build (NE_EXPR, type, arg,
4698                                     build_real (TREE_TYPE (arg), c2)));
4699
4700               /* sqrt(x) < y is x >= 0 when y is very large and we
4701                  don't care about Infinities.  */
4702               if (! HONOR_INFINITIES (mode))
4703                 return fold (build (GE_EXPR, type, arg,
4704                                     build_real (TREE_TYPE (arg), dconst0)));
4705
4706               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
4707               if ((*lang_hooks.decls.global_bindings_p) () != 0
4708                   || CONTAINS_PLACEHOLDER_P (arg))
4709                 return NULL_TREE;
4710
4711               arg = save_expr (arg);
4712               return fold (build (TRUTH_ANDIF_EXPR, type,
4713                                   fold (build (GE_EXPR, type, arg,
4714                                                build_real (TREE_TYPE (arg),
4715                                                            dconst0))),
4716                                   fold (build (NE_EXPR, type, arg,
4717                                                build_real (TREE_TYPE (arg),
4718                                                            c2)))));
4719             }
4720
4721           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
4722           if (! HONOR_NANS (mode))
4723             return fold (build (code, type, arg,
4724                                 build_real (TREE_TYPE (arg), c2)));
4725
4726           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
4727           if ((*lang_hooks.decls.global_bindings_p) () == 0
4728               && ! CONTAINS_PLACEHOLDER_P (arg))
4729             {
4730               arg = save_expr (arg);
4731               return fold (build (TRUTH_ANDIF_EXPR, type,
4732                                   fold (build (GE_EXPR, type, arg,
4733                                                build_real (TREE_TYPE (arg),
4734                                                            dconst0))),
4735                                   fold (build (code, type, arg,
4736                                                build_real (TREE_TYPE (arg),
4737                                                            c2)))));
4738             }
4739         }
4740     }
4741
4742   return NULL_TREE;
4743 }
4744
4745 /* Subroutine of fold() that optimizes comparisons against Infinities,
4746    either +Inf or -Inf.
4747
4748    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
4749    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
4750    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
4751
4752    The function returns the constant folded tree if a simplification
4753    can be made, and NULL_TREE otherwise.  */
4754
4755 static tree
4756 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
4757 {
4758   enum machine_mode mode;
4759   REAL_VALUE_TYPE max;
4760   tree temp;
4761   bool neg;
4762
4763   mode = TYPE_MODE (TREE_TYPE (arg0));
4764
4765   /* For negative infinity swap the sense of the comparison.  */
4766   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
4767   if (neg)
4768     code = swap_tree_comparison (code);
4769
4770   switch (code)
4771     {
4772     case GT_EXPR:
4773       /* x > +Inf is always false, if with ignore sNANs.  */
4774       if (HONOR_SNANS (mode))
4775         return NULL_TREE;
4776       return omit_one_operand (type,
4777                                convert (type, integer_zero_node),
4778                                arg0);
4779
4780     case LE_EXPR:
4781       /* x <= +Inf is always true, if we don't case about NaNs.  */
4782       if (! HONOR_NANS (mode))
4783         return omit_one_operand (type,
4784                                  convert (type, integer_one_node),
4785                                  arg0);
4786
4787       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
4788       if ((*lang_hooks.decls.global_bindings_p) () == 0
4789           && ! CONTAINS_PLACEHOLDER_P (arg0))
4790         {
4791           arg0 = save_expr (arg0);
4792           return fold (build (EQ_EXPR, type, arg0, arg0));
4793         }
4794       break;
4795
4796     case EQ_EXPR:
4797     case GE_EXPR:
4798       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
4799       real_maxval (&max, neg, mode);
4800       return fold (build (neg ? LT_EXPR : GT_EXPR, type,
4801                           arg0, build_real (TREE_TYPE (arg0), max)));
4802
4803     case LT_EXPR:
4804       /* x < +Inf is always equal to x <= DBL_MAX.  */
4805       real_maxval (&max, neg, mode);
4806       return fold (build (neg ? GE_EXPR : LE_EXPR, type,
4807                           arg0, build_real (TREE_TYPE (arg0), max)));
4808
4809     case NE_EXPR:
4810       /* x != +Inf is always equal to !(x > DBL_MAX).  */
4811       real_maxval (&max, neg, mode);
4812       if (! HONOR_NANS (mode))
4813         return fold (build (neg ? GE_EXPR : LE_EXPR, type,
4814                             arg0, build_real (TREE_TYPE (arg0), max)));
4815       temp = fold (build (neg ? LT_EXPR : GT_EXPR, type,
4816                           arg0, build_real (TREE_TYPE (arg0), max)));
4817       return fold (build1 (TRUTH_NOT_EXPR, type, temp));
4818
4819     default:
4820       break;
4821     }
4822
4823   return NULL_TREE;
4824 }
4825
4826 /* If CODE with arguments ARG0 and ARG1 represents a single bit
4827    equality/inequality test, then return a simplified form of
4828    the test using shifts and logical operations.  Otherwise return
4829    NULL.  TYPE is the desired result type.  */
4830  
4831 tree
4832 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
4833                       tree result_type)
4834 {
4835   /* If this is a TRUTH_NOT_EXPR, it may have a single bit test inside
4836      operand 0.  */
4837   if (code == TRUTH_NOT_EXPR)
4838     {
4839       code = TREE_CODE (arg0);
4840       if (code != NE_EXPR && code != EQ_EXPR)
4841         return NULL_TREE;
4842
4843       /* Extract the arguments of the EQ/NE.  */
4844       arg1 = TREE_OPERAND (arg0, 1);
4845       arg0 = TREE_OPERAND (arg0, 0);
4846
4847       /* This requires us to invert the code.  */ 
4848       code = (code == EQ_EXPR ? NE_EXPR : EQ_EXPR);
4849     }
4850
4851   /* If this is testing a single bit, we can optimize the test.  */
4852   if ((code == NE_EXPR || code == EQ_EXPR)
4853       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
4854       && integer_pow2p (TREE_OPERAND (arg0, 1)))
4855     {
4856       tree inner = TREE_OPERAND (arg0, 0);
4857       tree type = TREE_TYPE (arg0);
4858       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
4859       enum machine_mode operand_mode = TYPE_MODE (type);
4860       int ops_unsigned;
4861       tree signed_type, unsigned_type;
4862       tree arg00;
4863   
4864       /* If we have (A & C) != 0 where C is the sign bit of A, convert
4865          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
4866       arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
4867       if (arg00 != NULL_TREE)
4868         {
4869           tree stype = (*lang_hooks.types.signed_type) (TREE_TYPE (arg00));
4870           return fold (build (code == EQ_EXPR ? GE_EXPR : LT_EXPR, result_type,
4871                               convert (stype, arg00),
4872                               convert (stype, integer_zero_node)));
4873         }
4874
4875       /* At this point, we know that arg0 is not testing the sign bit.  */
4876       if (TYPE_PRECISION (type) - 1 == bitnum)
4877         abort ();
4878       
4879       /* Otherwise we have (A & C) != 0 where C is a single bit, 
4880          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
4881          Similarly for (A & C) == 0.  */
4882
4883       /* If INNER is a right shift of a constant and it plus BITNUM does
4884          not overflow, adjust BITNUM and INNER.  */
4885       if (TREE_CODE (inner) == RSHIFT_EXPR
4886           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
4887           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
4888           && bitnum < TYPE_PRECISION (type)
4889           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
4890                                    bitnum - TYPE_PRECISION (type)))
4891         {
4892           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
4893           inner = TREE_OPERAND (inner, 0);
4894         }
4895
4896       /* If we are going to be able to omit the AND below, we must do our
4897          operations as unsigned.  If we must use the AND, we have a choice.
4898          Normally unsigned is faster, but for some machines signed is.  */
4899 #ifdef LOAD_EXTEND_OP
4900       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND ? 0 : 1);
4901 #else
4902       ops_unsigned = 1;
4903 #endif
4904
4905       signed_type = (*lang_hooks.types.type_for_mode) (operand_mode, 0);
4906       unsigned_type = (*lang_hooks.types.type_for_mode) (operand_mode, 1);
4907
4908       if (bitnum != 0)
4909         inner = build (RSHIFT_EXPR, ops_unsigned ? unsigned_type : signed_type,
4910                        inner, size_int (bitnum));
4911
4912       if (code == EQ_EXPR)
4913         inner = build (BIT_XOR_EXPR, ops_unsigned ? unsigned_type : signed_type,
4914                        inner, integer_one_node);
4915
4916       /* Put the AND last so it can combine with more things.  */
4917       inner = build (BIT_AND_EXPR, ops_unsigned ? unsigned_type : signed_type,
4918                      inner, integer_one_node);
4919
4920       /* Make sure to return the proper type.  */
4921       if (TREE_TYPE (inner) != result_type)
4922         inner = convert (result_type, inner);
4923
4924       return inner;
4925     }
4926   return NULL_TREE;
4927 }
4928
4929 /* Perform constant folding and related simplification of EXPR.
4930    The related simplifications include x*1 => x, x*0 => 0, etc.,
4931    and application of the associative law.
4932    NOP_EXPR conversions may be removed freely (as long as we
4933    are careful not to change the C type of the overall expression)
4934    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
4935    but we can constant-fold them if they have constant operands.  */
4936
4937 #ifdef ENABLE_FOLD_CHECKING
4938 # define fold(x) fold_1 (x)
4939 static tree fold_1 (tree);
4940 static
4941 #endif
4942 tree
4943 fold (tree expr)
4944 {
4945   tree t = expr, orig_t;
4946   tree t1 = NULL_TREE;
4947   tree tem;
4948   tree type = TREE_TYPE (expr);
4949   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4950   enum tree_code code = TREE_CODE (t);
4951   int kind = TREE_CODE_CLASS (code);
4952   int invert;
4953   /* WINS will be nonzero when the switch is done
4954      if all operands are constant.  */
4955   int wins = 1;
4956
4957   /* Don't try to process an RTL_EXPR since its operands aren't trees.
4958      Likewise for a SAVE_EXPR that's already been evaluated.  */
4959   if (code == RTL_EXPR || (code == SAVE_EXPR && SAVE_EXPR_RTL (t) != 0))
4960     return t;
4961
4962   /* Return right away if a constant.  */
4963   if (kind == 'c')
4964     return t;
4965
4966 #ifdef MAX_INTEGER_COMPUTATION_MODE
4967   check_max_integer_computation_mode (expr);
4968 #endif
4969   orig_t = t;
4970
4971   if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
4972     {
4973       tree subop;
4974
4975       /* Special case for conversion ops that can have fixed point args.  */
4976       arg0 = TREE_OPERAND (t, 0);
4977
4978       /* Don't use STRIP_NOPS, because signedness of argument type matters.  */
4979       if (arg0 != 0)
4980         STRIP_SIGN_NOPS (arg0);
4981
4982       if (arg0 != 0 && TREE_CODE (arg0) == COMPLEX_CST)
4983         subop = TREE_REALPART (arg0);
4984       else
4985         subop = arg0;
4986
4987       if (subop != 0 && TREE_CODE (subop) != INTEGER_CST
4988           && TREE_CODE (subop) != REAL_CST
4989           )
4990         /* Note that TREE_CONSTANT isn't enough:
4991            static var addresses are constant but we can't
4992            do arithmetic on them.  */
4993         wins = 0;
4994     }
4995   else if (IS_EXPR_CODE_CLASS (kind) || kind == 'r')
4996     {
4997       int len = first_rtl_op (code);
4998       int i;
4999       for (i = 0; i < len; i++)
5000         {
5001           tree op = TREE_OPERAND (t, i);
5002           tree subop;
5003
5004           if (op == 0)
5005             continue;           /* Valid for CALL_EXPR, at least.  */
5006
5007           if (kind == '<' || code == RSHIFT_EXPR)
5008             {
5009               /* Signedness matters here.  Perhaps we can refine this
5010                  later.  */
5011               STRIP_SIGN_NOPS (op);
5012             }
5013           else
5014             /* Strip any conversions that don't change the mode.  */
5015             STRIP_NOPS (op);
5016
5017           if (TREE_CODE (op) == COMPLEX_CST)
5018             subop = TREE_REALPART (op);
5019           else
5020             subop = op;
5021
5022           if (TREE_CODE (subop) != INTEGER_CST
5023               && TREE_CODE (subop) != REAL_CST)
5024             /* Note that TREE_CONSTANT isn't enough:
5025                static var addresses are constant but we can't
5026                do arithmetic on them.  */
5027             wins = 0;
5028
5029           if (i == 0)
5030             arg0 = op;
5031           else if (i == 1)
5032             arg1 = op;
5033         }
5034     }
5035
5036   /* If this is a commutative operation, and ARG0 is a constant, move it
5037      to ARG1 to reduce the number of tests below.  */
5038   if ((code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
5039        || code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
5040        || code == BIT_AND_EXPR)
5041       && ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) != INTEGER_CST)
5042           || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) != REAL_CST)))
5043     {
5044       tem = arg0; arg0 = arg1; arg1 = tem;
5045
5046       if (t == orig_t)
5047         t = copy_node (t);
5048       TREE_OPERAND (t, 0) = arg0;
5049       TREE_OPERAND (t, 1) = arg1;
5050     }
5051
5052   /* Now WINS is set as described above,
5053      ARG0 is the first operand of EXPR,
5054      and ARG1 is the second operand (if it has more than one operand).
5055
5056      First check for cases where an arithmetic operation is applied to a
5057      compound, conditional, or comparison operation.  Push the arithmetic
5058      operation inside the compound or conditional to see if any folding
5059      can then be done.  Convert comparison to conditional for this purpose.
5060      The also optimizes non-constant cases that used to be done in
5061      expand_expr.
5062
5063      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
5064      one of the operands is a comparison and the other is a comparison, a
5065      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
5066      code below would make the expression more complex.  Change it to a
5067      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
5068      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
5069
5070   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
5071        || code == EQ_EXPR || code == NE_EXPR)
5072       && ((truth_value_p (TREE_CODE (arg0))
5073            && (truth_value_p (TREE_CODE (arg1))
5074                || (TREE_CODE (arg1) == BIT_AND_EXPR
5075                    && integer_onep (TREE_OPERAND (arg1, 1)))))
5076           || (truth_value_p (TREE_CODE (arg1))
5077               && (truth_value_p (TREE_CODE (arg0))
5078                   || (TREE_CODE (arg0) == BIT_AND_EXPR
5079                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
5080     {
5081       t = fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
5082                        : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
5083                        : TRUTH_XOR_EXPR,
5084                        type, arg0, arg1));
5085
5086       if (code == EQ_EXPR)
5087         t = invert_truthvalue (t);
5088
5089       return t;
5090     }
5091
5092   if (TREE_CODE_CLASS (code) == '1')
5093     {
5094       if (TREE_CODE (arg0) == COMPOUND_EXPR)
5095         return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
5096                       fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
5097       else if (TREE_CODE (arg0) == COND_EXPR)
5098         {
5099           tree arg01 = TREE_OPERAND (arg0, 1);
5100           tree arg02 = TREE_OPERAND (arg0, 2);
5101           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
5102             arg01 = fold (build1 (code, type, arg01));
5103           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
5104             arg02 = fold (build1 (code, type, arg02));
5105           t = fold (build (COND_EXPR, type, TREE_OPERAND (arg0, 0),
5106                            arg01, arg02));
5107
5108           /* If this was a conversion, and all we did was to move into
5109              inside the COND_EXPR, bring it back out.  But leave it if
5110              it is a conversion from integer to integer and the
5111              result precision is no wider than a word since such a
5112              conversion is cheap and may be optimized away by combine,
5113              while it couldn't if it were outside the COND_EXPR.  Then return
5114              so we don't get into an infinite recursion loop taking the
5115              conversion out and then back in.  */
5116
5117           if ((code == NOP_EXPR || code == CONVERT_EXPR
5118                || code == NON_LVALUE_EXPR)
5119               && TREE_CODE (t) == COND_EXPR
5120               && TREE_CODE (TREE_OPERAND (t, 1)) == code
5121               && TREE_CODE (TREE_OPERAND (t, 2)) == code
5122               && ! VOID_TYPE_P (TREE_OPERAND (t, 1))
5123               && ! VOID_TYPE_P (TREE_OPERAND (t, 2))
5124               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0))
5125                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 2), 0)))
5126               && ! (INTEGRAL_TYPE_P (TREE_TYPE (t))
5127                     && (INTEGRAL_TYPE_P
5128                         (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0))))
5129                     && TYPE_PRECISION (TREE_TYPE (t)) <= BITS_PER_WORD))
5130             t = build1 (code, type,
5131                         build (COND_EXPR,
5132                                TREE_TYPE (TREE_OPERAND
5133                                           (TREE_OPERAND (t, 1), 0)),
5134                                TREE_OPERAND (t, 0),
5135                                TREE_OPERAND (TREE_OPERAND (t, 1), 0),
5136                                TREE_OPERAND (TREE_OPERAND (t, 2), 0)));
5137           return t;
5138         }
5139       else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
5140         return fold (build (COND_EXPR, type, arg0,
5141                             fold (build1 (code, type, integer_one_node)),
5142                             fold (build1 (code, type, integer_zero_node))));
5143    }
5144   else if (TREE_CODE_CLASS (code) == '<'
5145            && TREE_CODE (arg0) == COMPOUND_EXPR)
5146     return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
5147                   fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
5148   else if (TREE_CODE_CLASS (code) == '<'
5149            && TREE_CODE (arg1) == COMPOUND_EXPR)
5150     return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
5151                   fold (build (code, type, arg0, TREE_OPERAND (arg1, 1))));
5152   else if (TREE_CODE_CLASS (code) == '2'
5153            || TREE_CODE_CLASS (code) == '<')
5154     {
5155       if (TREE_CODE (arg1) == COMPOUND_EXPR
5156           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg1, 0))
5157           && ! TREE_SIDE_EFFECTS (arg0))
5158         return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
5159                       fold (build (code, type,
5160                                    arg0, TREE_OPERAND (arg1, 1))));
5161       else if ((TREE_CODE (arg1) == COND_EXPR
5162                 || (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
5163                     && TREE_CODE_CLASS (code) != '<'))
5164                && (TREE_CODE (arg0) != COND_EXPR
5165                    || count_cond (arg0, 25) + count_cond (arg1, 25) <= 25)
5166                && (! TREE_SIDE_EFFECTS (arg0)
5167                    || ((*lang_hooks.decls.global_bindings_p) () == 0
5168                        && ! CONTAINS_PLACEHOLDER_P (arg0))))
5169         return
5170           fold_binary_op_with_conditional_arg (code, type, arg1, arg0,
5171                                                /*cond_first_p=*/0);
5172       else if (TREE_CODE (arg0) == COMPOUND_EXPR)
5173         return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
5174                       fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
5175       else if ((TREE_CODE (arg0) == COND_EXPR
5176                 || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
5177                     && TREE_CODE_CLASS (code) != '<'))
5178                && (TREE_CODE (arg1) != COND_EXPR
5179                    || count_cond (arg0, 25) + count_cond (arg1, 25) <= 25)
5180                && (! TREE_SIDE_EFFECTS (arg1)
5181                    || ((*lang_hooks.decls.global_bindings_p) () == 0
5182                        && ! CONTAINS_PLACEHOLDER_P (arg1))))
5183         return
5184           fold_binary_op_with_conditional_arg (code, type, arg0, arg1,
5185                                                /*cond_first_p=*/1);
5186     }
5187
5188   switch (code)
5189     {
5190     case INTEGER_CST:
5191     case REAL_CST:
5192     case VECTOR_CST:
5193     case STRING_CST:
5194     case COMPLEX_CST:
5195     case CONSTRUCTOR:
5196       return t;
5197
5198     case CONST_DECL:
5199       return fold (DECL_INITIAL (t));
5200
5201     case NOP_EXPR:
5202     case FLOAT_EXPR:
5203     case CONVERT_EXPR:
5204     case FIX_TRUNC_EXPR:
5205       /* Other kinds of FIX are not handled properly by fold_convert.  */
5206
5207       if (TREE_TYPE (TREE_OPERAND (t, 0)) == TREE_TYPE (t))
5208         return TREE_OPERAND (t, 0);
5209
5210       /* Handle cases of two conversions in a row.  */
5211       if (TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
5212           || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
5213         {
5214           tree inside_type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5215           tree inter_type = TREE_TYPE (TREE_OPERAND (t, 0));
5216           tree final_type = TREE_TYPE (t);
5217           int inside_int = INTEGRAL_TYPE_P (inside_type);
5218           int inside_ptr = POINTER_TYPE_P (inside_type);
5219           int inside_float = FLOAT_TYPE_P (inside_type);
5220           unsigned int inside_prec = TYPE_PRECISION (inside_type);
5221           int inside_unsignedp = TREE_UNSIGNED (inside_type);
5222           int inter_int = INTEGRAL_TYPE_P (inter_type);
5223           int inter_ptr = POINTER_TYPE_P (inter_type);
5224           int inter_float = FLOAT_TYPE_P (inter_type);
5225           unsigned int inter_prec = TYPE_PRECISION (inter_type);
5226           int inter_unsignedp = TREE_UNSIGNED (inter_type);
5227           int final_int = INTEGRAL_TYPE_P (final_type);
5228           int final_ptr = POINTER_TYPE_P (final_type);
5229           int final_float = FLOAT_TYPE_P (final_type);
5230           unsigned int final_prec = TYPE_PRECISION (final_type);
5231           int final_unsignedp = TREE_UNSIGNED (final_type);
5232
5233           /* In addition to the cases of two conversions in a row
5234              handled below, if we are converting something to its own
5235              type via an object of identical or wider precision, neither
5236              conversion is needed.  */
5237           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (final_type)
5238               && ((inter_int && final_int) || (inter_float && final_float))
5239               && inter_prec >= final_prec)
5240             return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5241
5242           /* Likewise, if the intermediate and final types are either both
5243              float or both integer, we don't need the middle conversion if
5244              it is wider than the final type and doesn't change the signedness
5245              (for integers).  Avoid this if the final type is a pointer
5246              since then we sometimes need the inner conversion.  Likewise if
5247              the outer has a precision not equal to the size of its mode.  */
5248           if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
5249                || (inter_float && inside_float))
5250               && inter_prec >= inside_prec
5251               && (inter_float || inter_unsignedp == inside_unsignedp)
5252               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
5253                     && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
5254               && ! final_ptr)
5255             return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5256
5257           /* If we have a sign-extension of a zero-extended value, we can
5258              replace that by a single zero-extension.  */
5259           if (inside_int && inter_int && final_int
5260               && inside_prec < inter_prec && inter_prec < final_prec
5261               && inside_unsignedp && !inter_unsignedp)
5262             return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5263
5264           /* Two conversions in a row are not needed unless:
5265              - some conversion is floating-point (overstrict for now), or
5266              - the intermediate type is narrower than both initial and
5267                final, or
5268              - the intermediate type and innermost type differ in signedness,
5269                and the outermost type is wider than the intermediate, or
5270              - the initial type is a pointer type and the precisions of the
5271                intermediate and final types differ, or
5272              - the final type is a pointer type and the precisions of the
5273                initial and intermediate types differ.  */
5274           if (! inside_float && ! inter_float && ! final_float
5275               && (inter_prec > inside_prec || inter_prec > final_prec)
5276               && ! (inside_int && inter_int
5277                     && inter_unsignedp != inside_unsignedp
5278                     && inter_prec < final_prec)
5279               && ((inter_unsignedp && inter_prec > inside_prec)
5280                   == (final_unsignedp && final_prec > inter_prec))
5281               && ! (inside_ptr && inter_prec != final_prec)
5282               && ! (final_ptr && inside_prec != inter_prec)
5283               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
5284                     && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
5285               && ! final_ptr)
5286             return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5287         }
5288
5289       if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
5290           && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1))
5291           /* Detect assigning a bitfield.  */
5292           && !(TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == COMPONENT_REF
5293                && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 1))))
5294         {
5295           /* Don't leave an assignment inside a conversion
5296              unless assigning a bitfield.  */
5297           tree prev = TREE_OPERAND (t, 0);
5298           if (t == orig_t)
5299             t = copy_node (t);
5300           TREE_OPERAND (t, 0) = TREE_OPERAND (prev, 1);
5301           /* First do the assignment, then return converted constant.  */
5302           t = build (COMPOUND_EXPR, TREE_TYPE (t), prev, fold (t));
5303           TREE_USED (t) = 1;
5304           return t;
5305         }
5306
5307       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
5308          constants (if x has signed type, the sign bit cannot be set
5309          in c).  This folds extension into the BIT_AND_EXPR.  */
5310       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
5311           && TREE_CODE (TREE_TYPE (t)) != BOOLEAN_TYPE
5312           && TREE_CODE (TREE_OPERAND (t, 0)) == BIT_AND_EXPR
5313           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 1)) == INTEGER_CST)
5314         {
5315           tree and = TREE_OPERAND (t, 0);
5316           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
5317           int change = 0;
5318
5319           if (TREE_UNSIGNED (TREE_TYPE (and))
5320               || (TYPE_PRECISION (TREE_TYPE (t))
5321                   <= TYPE_PRECISION (TREE_TYPE (and))))
5322             change = 1;
5323           else if (TYPE_PRECISION (TREE_TYPE (and1))
5324                    <= HOST_BITS_PER_WIDE_INT
5325                    && host_integerp (and1, 1))
5326             {
5327               unsigned HOST_WIDE_INT cst;
5328
5329               cst = tree_low_cst (and1, 1);
5330               cst &= (HOST_WIDE_INT) -1
5331                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
5332               change = (cst == 0);
5333 #ifdef LOAD_EXTEND_OP
5334               if (change
5335                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
5336                       == ZERO_EXTEND))
5337                 {
5338                   tree uns = (*lang_hooks.types.unsigned_type) (TREE_TYPE (and0));
5339                   and0 = convert (uns, and0);
5340                   and1 = convert (uns, and1);
5341                 }
5342 #endif
5343             }
5344           if (change)
5345             return fold (build (BIT_AND_EXPR, TREE_TYPE (t),
5346                                 convert (TREE_TYPE (t), and0),
5347                                 convert (TREE_TYPE (t), and1)));
5348         }
5349
5350       if (!wins)
5351         {
5352           if (TREE_CONSTANT (t) != TREE_CONSTANT (arg0))
5353             {
5354               if (t == orig_t)
5355                 t = copy_node (t);
5356               TREE_CONSTANT (t) = TREE_CONSTANT (arg0);
5357             }
5358           return t;
5359         }
5360       return fold_convert (t, arg0);
5361
5362     case VIEW_CONVERT_EXPR:
5363       if (TREE_CODE (TREE_OPERAND (t, 0)) == VIEW_CONVERT_EXPR)
5364         return build1 (VIEW_CONVERT_EXPR, type,
5365                        TREE_OPERAND (TREE_OPERAND (t, 0), 0));
5366       return t;
5367
5368     case COMPONENT_REF:
5369       if (TREE_CODE (arg0) == CONSTRUCTOR
5370           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
5371         {
5372           tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
5373           if (m)
5374             t = TREE_VALUE (m);
5375         }
5376       return t;
5377
5378     case RANGE_EXPR:
5379       if (TREE_CONSTANT (t) != wins)
5380         {
5381           if (t == orig_t)
5382             t = copy_node (t);
5383           TREE_CONSTANT (t) = wins;
5384         }
5385       return t;
5386
5387     case NEGATE_EXPR:
5388       if (wins)
5389         {
5390           if (TREE_CODE (arg0) == INTEGER_CST)
5391             {
5392               unsigned HOST_WIDE_INT low;
5393               HOST_WIDE_INT high;
5394               int overflow = neg_double (TREE_INT_CST_LOW (arg0),
5395                                          TREE_INT_CST_HIGH (arg0),
5396                                          &low, &high);
5397               t = build_int_2 (low, high);
5398               TREE_TYPE (t) = type;
5399               TREE_OVERFLOW (t)
5400                 = (TREE_OVERFLOW (arg0)
5401                    | force_fit_type (t, overflow && !TREE_UNSIGNED (type)));
5402               TREE_CONSTANT_OVERFLOW (t)
5403                 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
5404             }
5405           else if (TREE_CODE (arg0) == REAL_CST)
5406             t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
5407         }
5408       else if (TREE_CODE (arg0) == NEGATE_EXPR)
5409         return TREE_OPERAND (arg0, 0);
5410       /* Convert -((double)float) into (double)(-float).  */
5411       else if (TREE_CODE (arg0) == NOP_EXPR
5412                && TREE_CODE (type) == REAL_TYPE)
5413         {
5414           tree targ0 = strip_float_extensions (arg0);
5415           if (targ0 != arg0)
5416             return convert (type, build1 (NEGATE_EXPR, TREE_TYPE (targ0), targ0));
5417
5418         }
5419
5420       /* Convert - (a - b) to (b - a) for non-floating-point.  */
5421       else if (TREE_CODE (arg0) == MINUS_EXPR
5422                && (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
5423         return build (MINUS_EXPR, type, TREE_OPERAND (arg0, 1),
5424                       TREE_OPERAND (arg0, 0));
5425
5426       /* Convert -f(x) into f(-x) where f is sin, tan or atan.  */
5427       switch (builtin_mathfn_code (arg0))
5428         {
5429         case BUILT_IN_SIN:
5430         case BUILT_IN_SINF:
5431         case BUILT_IN_SINL:
5432         case BUILT_IN_TAN:
5433         case BUILT_IN_TANF:
5434         case BUILT_IN_TANL:
5435         case BUILT_IN_ATAN:
5436         case BUILT_IN_ATANF:
5437         case BUILT_IN_ATANL:
5438           if (negate_expr_p (TREE_VALUE (TREE_OPERAND (arg0, 1))))
5439             {
5440               tree fndecl, arg, arglist;
5441
5442               fndecl = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
5443               arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
5444               arg = fold (build1 (NEGATE_EXPR, type, arg));
5445               arglist = build_tree_list (NULL_TREE, arg);
5446               return build_function_call_expr (fndecl, arglist);
5447             }
5448           break;
5449
5450         default:
5451           break;
5452         }
5453       return t;
5454
5455     case ABS_EXPR:
5456       if (wins)
5457         {
5458           if (TREE_CODE (arg0) == INTEGER_CST)
5459             {
5460               /* If the value is unsigned, then the absolute value is
5461                  the same as the ordinary value.  */
5462               if (TREE_UNSIGNED (type))
5463                 return arg0;
5464               /* Similarly, if the value is non-negative.  */
5465               else if (INT_CST_LT (integer_minus_one_node, arg0))
5466                 return arg0;
5467               /* If the value is negative, then the absolute value is
5468                  its negation.  */
5469               else
5470                 {
5471                   unsigned HOST_WIDE_INT low;
5472                   HOST_WIDE_INT high;
5473                   int overflow = neg_double (TREE_INT_CST_LOW (arg0),
5474                                              TREE_INT_CST_HIGH (arg0),
5475                                              &low, &high);
5476                   t = build_int_2 (low, high);
5477                   TREE_TYPE (t) = type;
5478                   TREE_OVERFLOW (t)
5479                     = (TREE_OVERFLOW (arg0)
5480                        | force_fit_type (t, overflow));
5481                   TREE_CONSTANT_OVERFLOW (t)
5482                     = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
5483                 }
5484             }
5485           else if (TREE_CODE (arg0) == REAL_CST)
5486             {
5487               if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
5488                 t = build_real (type,
5489                                 REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
5490             }
5491         }
5492       else if (TREE_CODE (arg0) == NEGATE_EXPR)
5493         return fold (build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0)));
5494       /* Convert fabs((double)float) into (double)fabsf(float).  */
5495       else if (TREE_CODE (arg0) == NOP_EXPR
5496                && TREE_CODE (type) == REAL_TYPE)
5497         {
5498           tree targ0 = strip_float_extensions (arg0);
5499           if (targ0 != arg0)
5500             return convert (type, fold (build1 (ABS_EXPR, TREE_TYPE (targ0),
5501                                                 targ0)));
5502         }
5503       else if (tree_expr_nonnegative_p (arg0))
5504         return arg0;
5505       return t;
5506
5507     case CONJ_EXPR:
5508       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
5509         return convert (type, arg0);
5510       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
5511         return build (COMPLEX_EXPR, type,
5512                       TREE_OPERAND (arg0, 0),
5513                       negate_expr (TREE_OPERAND (arg0, 1)));
5514       else if (TREE_CODE (arg0) == COMPLEX_CST)
5515         return build_complex (type, TREE_REALPART (arg0),
5516                               negate_expr (TREE_IMAGPART (arg0)));
5517       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
5518         return fold (build (TREE_CODE (arg0), type,
5519                             fold (build1 (CONJ_EXPR, type,
5520                                           TREE_OPERAND (arg0, 0))),
5521                             fold (build1 (CONJ_EXPR,
5522                                           type, TREE_OPERAND (arg0, 1)))));
5523       else if (TREE_CODE (arg0) == CONJ_EXPR)
5524         return TREE_OPERAND (arg0, 0);
5525       return t;
5526
5527     case BIT_NOT_EXPR:
5528       if (wins)
5529         {
5530           t = build_int_2 (~ TREE_INT_CST_LOW (arg0),
5531                            ~ TREE_INT_CST_HIGH (arg0));
5532           TREE_TYPE (t) = type;
5533           force_fit_type (t, 0);
5534           TREE_OVERFLOW (t) = TREE_OVERFLOW (arg0);
5535           TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (arg0);
5536         }
5537       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
5538         return TREE_OPERAND (arg0, 0);
5539       return t;
5540
5541     case PLUS_EXPR:
5542       /* A + (-B) -> A - B */
5543       if (TREE_CODE (arg1) == NEGATE_EXPR)
5544         return fold (build (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
5545       /* (-A) + B -> B - A */
5546       if (TREE_CODE (arg0) == NEGATE_EXPR)
5547         return fold (build (MINUS_EXPR, type, arg1, TREE_OPERAND (arg0, 0)));
5548       else if (! FLOAT_TYPE_P (type))
5549         {
5550           if (integer_zerop (arg1))
5551             return non_lvalue (convert (type, arg0));
5552
5553           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
5554              with a constant, and the two constants have no bits in common,
5555              we should treat this as a BIT_IOR_EXPR since this may produce more
5556              simplifications.  */
5557           if (TREE_CODE (arg0) == BIT_AND_EXPR
5558               && TREE_CODE (arg1) == BIT_AND_EXPR
5559               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
5560               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
5561               && integer_zerop (const_binop (BIT_AND_EXPR,
5562                                              TREE_OPERAND (arg0, 1),
5563                                              TREE_OPERAND (arg1, 1), 0)))
5564             {
5565               code = BIT_IOR_EXPR;
5566               goto bit_ior;
5567             }
5568
5569           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
5570              (plus (plus (mult) (mult)) (foo)) so that we can
5571              take advantage of the factoring cases below.  */
5572           if ((TREE_CODE (arg0) == PLUS_EXPR
5573                && TREE_CODE (arg1) == MULT_EXPR)
5574               || (TREE_CODE (arg1) == PLUS_EXPR
5575                   && TREE_CODE (arg0) == MULT_EXPR))
5576             {
5577               tree parg0, parg1, parg, marg;
5578
5579               if (TREE_CODE (arg0) == PLUS_EXPR)
5580                 parg = arg0, marg = arg1;
5581               else
5582                 parg = arg1, marg = arg0;
5583               parg0 = TREE_OPERAND (parg, 0);
5584               parg1 = TREE_OPERAND (parg, 1);
5585               STRIP_NOPS (parg0);
5586               STRIP_NOPS (parg1);
5587
5588               if (TREE_CODE (parg0) == MULT_EXPR
5589                   && TREE_CODE (parg1) != MULT_EXPR)
5590                 return fold (build (PLUS_EXPR, type,
5591                                     fold (build (PLUS_EXPR, type,
5592                                                  convert (type, parg0),
5593                                                  convert (type, marg))),
5594                                     convert (type, parg1)));
5595               if (TREE_CODE (parg0) != MULT_EXPR
5596                   && TREE_CODE (parg1) == MULT_EXPR)
5597                 return fold (build (PLUS_EXPR, type,
5598                                     fold (build (PLUS_EXPR, type,
5599                                                  convert (type, parg1),
5600                                                  convert (type, marg))),
5601                                     convert (type, parg0)));
5602             }
5603
5604           if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
5605             {
5606               tree arg00, arg01, arg10, arg11;
5607               tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
5608
5609               /* (A * C) + (B * C) -> (A+B) * C.
5610                  We are most concerned about the case where C is a constant,
5611                  but other combinations show up during loop reduction.  Since
5612                  it is not difficult, try all four possibilities.  */
5613
5614               arg00 = TREE_OPERAND (arg0, 0);
5615               arg01 = TREE_OPERAND (arg0, 1);
5616               arg10 = TREE_OPERAND (arg1, 0);
5617               arg11 = TREE_OPERAND (arg1, 1);
5618               same = NULL_TREE;
5619
5620               if (operand_equal_p (arg01, arg11, 0))
5621                 same = arg01, alt0 = arg00, alt1 = arg10;
5622               else if (operand_equal_p (arg00, arg10, 0))
5623                 same = arg00, alt0 = arg01, alt1 = arg11;
5624               else if (operand_equal_p (arg00, arg11, 0))
5625                 same = arg00, alt0 = arg01, alt1 = arg10;
5626               else if (operand_equal_p (arg01, arg10, 0))
5627                 same = arg01, alt0 = arg00, alt1 = arg11;
5628
5629               /* No identical multiplicands; see if we can find a common
5630                  power-of-two factor in non-power-of-two multiplies.  This
5631                  can help in multi-dimensional array access.  */
5632               else if (TREE_CODE (arg01) == INTEGER_CST
5633                        && TREE_CODE (arg11) == INTEGER_CST
5634                        && TREE_INT_CST_HIGH (arg01) == 0
5635                        && TREE_INT_CST_HIGH (arg11) == 0)
5636                 {
5637                   HOST_WIDE_INT int01, int11, tmp;
5638                   int01 = TREE_INT_CST_LOW (arg01);
5639                   int11 = TREE_INT_CST_LOW (arg11);
5640
5641                   /* Move min of absolute values to int11.  */
5642                   if ((int01 >= 0 ? int01 : -int01)
5643                       < (int11 >= 0 ? int11 : -int11))
5644                     {
5645                       tmp = int01, int01 = int11, int11 = tmp;
5646                       alt0 = arg00, arg00 = arg10, arg10 = alt0;
5647                       alt0 = arg01, arg01 = arg11, arg11 = alt0;
5648                     }
5649
5650                   if (exact_log2 (int11) > 0 && int01 % int11 == 0)
5651                     {
5652                       alt0 = fold (build (MULT_EXPR, type, arg00,
5653                                           build_int_2 (int01 / int11, 0)));
5654                       alt1 = arg10;
5655                       same = arg11;
5656                     }
5657                 }
5658
5659               if (same)
5660                 return fold (build (MULT_EXPR, type,
5661                                     fold (build (PLUS_EXPR, type, alt0, alt1)),
5662                                     same));
5663             }
5664         }
5665       else
5666         {
5667           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
5668           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
5669             return non_lvalue (convert (type, arg0));
5670
5671           /* Likewise if the operands are reversed.  */
5672           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
5673             return non_lvalue (convert (type, arg1));
5674
5675           /* Convert x+x into x*2.0.  */
5676           if (operand_equal_p (arg0, arg1, 0))
5677             return fold (build (MULT_EXPR, type, arg0,
5678                                 build_real (type, dconst2)));
5679
5680           /* Convert x*c+x into x*(c+1).  */
5681           if (flag_unsafe_math_optimizations
5682               && TREE_CODE (arg0) == MULT_EXPR
5683               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
5684               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
5685               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
5686             {
5687               REAL_VALUE_TYPE c;
5688
5689               c = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
5690               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
5691               return fold (build (MULT_EXPR, type, arg1,
5692                                   build_real (type, c)));
5693             }
5694
5695           /* Convert x+x*c into x*(c+1).  */
5696           if (flag_unsafe_math_optimizations
5697               && TREE_CODE (arg1) == MULT_EXPR
5698               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
5699               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
5700               && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
5701             {
5702               REAL_VALUE_TYPE c;
5703
5704               c = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
5705               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
5706               return fold (build (MULT_EXPR, type, arg0,
5707                                   build_real (type, c)));
5708             }
5709
5710           /* Convert x*c1+x*c2 into x*(c1+c2).  */
5711           if (flag_unsafe_math_optimizations
5712               && TREE_CODE (arg0) == MULT_EXPR
5713               && TREE_CODE (arg1) == MULT_EXPR
5714               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
5715               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
5716               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
5717               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
5718               && operand_equal_p (TREE_OPERAND (arg0, 0),
5719                                   TREE_OPERAND (arg1, 0), 0))
5720             {
5721               REAL_VALUE_TYPE c1, c2;
5722
5723               c1 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
5724               c2 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
5725               real_arithmetic (&c1, PLUS_EXPR, &c1, &c2);
5726               return fold (build (MULT_EXPR, type,
5727                                   TREE_OPERAND (arg0, 0),
5728                                   build_real (type, c1)));
5729             }
5730         }
5731
5732      bit_rotate:
5733       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
5734          is a rotate of A by C1 bits.  */
5735       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
5736          is a rotate of A by B bits.  */
5737       {
5738         enum tree_code code0, code1;
5739         code0 = TREE_CODE (arg0);
5740         code1 = TREE_CODE (arg1);
5741         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
5742              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
5743             && operand_equal_p (TREE_OPERAND (arg0, 0),
5744                                 TREE_OPERAND (arg1, 0), 0)
5745             && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
5746           {
5747             tree tree01, tree11;
5748             enum tree_code code01, code11;
5749
5750             tree01 = TREE_OPERAND (arg0, 1);
5751             tree11 = TREE_OPERAND (arg1, 1);
5752             STRIP_NOPS (tree01);
5753             STRIP_NOPS (tree11);
5754             code01 = TREE_CODE (tree01);
5755             code11 = TREE_CODE (tree11);
5756             if (code01 == INTEGER_CST
5757                 && code11 == INTEGER_CST
5758                 && TREE_INT_CST_HIGH (tree01) == 0
5759                 && TREE_INT_CST_HIGH (tree11) == 0
5760                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
5761                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
5762               return build (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
5763                             code0 == LSHIFT_EXPR ? tree01 : tree11);
5764             else if (code11 == MINUS_EXPR)
5765               {
5766                 tree tree110, tree111;
5767                 tree110 = TREE_OPERAND (tree11, 0);
5768                 tree111 = TREE_OPERAND (tree11, 1);
5769                 STRIP_NOPS (tree110);
5770                 STRIP_NOPS (tree111);
5771                 if (TREE_CODE (tree110) == INTEGER_CST
5772                     && 0 == compare_tree_int (tree110,
5773                                               TYPE_PRECISION
5774                                               (TREE_TYPE (TREE_OPERAND
5775                                                           (arg0, 0))))
5776                     && operand_equal_p (tree01, tree111, 0))
5777                   return build ((code0 == LSHIFT_EXPR
5778                                  ? LROTATE_EXPR
5779                                  : RROTATE_EXPR),
5780                                 type, TREE_OPERAND (arg0, 0), tree01);
5781               }
5782             else if (code01 == MINUS_EXPR)
5783               {
5784                 tree tree010, tree011;
5785                 tree010 = TREE_OPERAND (tree01, 0);
5786                 tree011 = TREE_OPERAND (tree01, 1);
5787                 STRIP_NOPS (tree010);
5788                 STRIP_NOPS (tree011);
5789                 if (TREE_CODE (tree010) == INTEGER_CST
5790                     && 0 == compare_tree_int (tree010,
5791                                               TYPE_PRECISION
5792                                               (TREE_TYPE (TREE_OPERAND
5793                                                           (arg0, 0))))
5794                     && operand_equal_p (tree11, tree011, 0))
5795                   return build ((code0 != LSHIFT_EXPR
5796                                  ? LROTATE_EXPR
5797                                  : RROTATE_EXPR),
5798                                 type, TREE_OPERAND (arg0, 0), tree11);
5799               }
5800           }
5801       }
5802
5803     associate:
5804       /* In most languages, can't associate operations on floats through
5805          parentheses.  Rather than remember where the parentheses were, we
5806          don't associate floats at all.  It shouldn't matter much.  However,
5807          associating multiplications is only very slightly inaccurate, so do
5808          that if -funsafe-math-optimizations is specified.  */
5809
5810       if (! wins
5811           && (! FLOAT_TYPE_P (type)
5812               || (flag_unsafe_math_optimizations && code == MULT_EXPR)))
5813         {
5814           tree var0, con0, lit0, minus_lit0;
5815           tree var1, con1, lit1, minus_lit1;
5816
5817           /* Split both trees into variables, constants, and literals.  Then
5818              associate each group together, the constants with literals,
5819              then the result with variables.  This increases the chances of
5820              literals being recombined later and of generating relocatable
5821              expressions for the sum of a constant and literal.  */
5822           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
5823           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
5824                              code == MINUS_EXPR);
5825
5826           /* Only do something if we found more than two objects.  Otherwise,
5827              nothing has changed and we risk infinite recursion.  */
5828           if (2 < ((var0 != 0) + (var1 != 0)
5829                    + (con0 != 0) + (con1 != 0)
5830                    + (lit0 != 0) + (lit1 != 0)
5831                    + (minus_lit0 != 0) + (minus_lit1 != 0)))
5832             {
5833               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
5834               if (code == MINUS_EXPR)
5835                 code = PLUS_EXPR;
5836
5837               var0 = associate_trees (var0, var1, code, type);
5838               con0 = associate_trees (con0, con1, code, type);
5839               lit0 = associate_trees (lit0, lit1, code, type);
5840               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
5841
5842               /* Preserve the MINUS_EXPR if the negative part of the literal is
5843                  greater than the positive part.  Otherwise, the multiplicative
5844                  folding code (i.e extract_muldiv) may be fooled in case
5845                  unsigned constants are subtracted, like in the following
5846                  example: ((X*2 + 4) - 8U)/2.  */
5847               if (minus_lit0 && lit0)
5848                 {
5849                   if (tree_int_cst_lt (lit0, minus_lit0))
5850                     {
5851                       minus_lit0 = associate_trees (minus_lit0, lit0,
5852                                                     MINUS_EXPR, type);
5853                       lit0 = 0;
5854                     }
5855                   else
5856                     {
5857                       lit0 = associate_trees (lit0, minus_lit0,
5858                                               MINUS_EXPR, type);
5859                       minus_lit0 = 0;
5860                     }
5861                 }
5862               if (minus_lit0)
5863                 {
5864                   if (con0 == 0)
5865                     return convert (type, associate_trees (var0, minus_lit0,
5866                                                            MINUS_EXPR, type));
5867                   else
5868                     {
5869                       con0 = associate_trees (con0, minus_lit0,
5870                                               MINUS_EXPR, type);
5871                       return convert (type, associate_trees (var0, con0,
5872                                                              PLUS_EXPR, type));
5873                     }
5874                 }
5875
5876               con0 = associate_trees (con0, lit0, code, type);
5877               return convert (type, associate_trees (var0, con0, code, type));
5878             }
5879         }
5880
5881     binary:
5882       if (wins)
5883         t1 = const_binop (code, arg0, arg1, 0);
5884       if (t1 != NULL_TREE)
5885         {
5886           /* The return value should always have
5887              the same type as the original expression.  */
5888           if (TREE_TYPE (t1) != TREE_TYPE (t))
5889             t1 = convert (TREE_TYPE (t), t1);
5890
5891           return t1;
5892         }
5893       return t;
5894
5895     case MINUS_EXPR:
5896       /* A - (-B) -> A + B */
5897       if (TREE_CODE (arg1) == NEGATE_EXPR)
5898         return fold (build (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
5899       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
5900       if (TREE_CODE (arg0) == NEGATE_EXPR
5901           && (FLOAT_TYPE_P (type)
5902               || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))
5903           && negate_expr_p (arg1)
5904           && (! TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
5905           && (! TREE_SIDE_EFFECTS (arg1) || TREE_CONSTANT (arg0)))
5906         return fold (build (MINUS_EXPR, type, negate_expr (arg1),
5907                             TREE_OPERAND (arg0, 0)));
5908
5909       if (! FLOAT_TYPE_P (type))
5910         {
5911           if (! wins && integer_zerop (arg0))
5912             return negate_expr (convert (type, arg1));
5913           if (integer_zerop (arg1))
5914             return non_lvalue (convert (type, arg0));
5915
5916           /* (A * C) - (B * C) -> (A-B) * C.  Since we are most concerned
5917              about the case where C is a constant, just try one of the
5918              four possibilities.  */
5919
5920           if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR
5921               && operand_equal_p (TREE_OPERAND (arg0, 1),
5922                                   TREE_OPERAND (arg1, 1), 0))
5923             return fold (build (MULT_EXPR, type,
5924                                 fold (build (MINUS_EXPR, type,
5925                                              TREE_OPERAND (arg0, 0),
5926                                              TREE_OPERAND (arg1, 0))),
5927                                 TREE_OPERAND (arg0, 1)));
5928
5929           /* Fold A - (A & B) into ~B & A.  */
5930           if (!TREE_SIDE_EFFECTS (arg0)
5931               && TREE_CODE (arg1) == BIT_AND_EXPR)
5932             {
5933               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
5934                 return fold (build (BIT_AND_EXPR, type,
5935                                     fold (build1 (BIT_NOT_EXPR, type,
5936                                                   TREE_OPERAND (arg1, 0))),
5937                                     arg0));
5938               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
5939                 return fold (build (BIT_AND_EXPR, type,
5940                                     fold (build1 (BIT_NOT_EXPR, type,
5941                                                   TREE_OPERAND (arg1, 1))),
5942                                     arg0));
5943             }
5944         }
5945
5946       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
5947       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
5948         return non_lvalue (convert (type, arg0));
5949
5950       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
5951          ARG0 is zero and X + ARG0 reduces to X, since that would mean
5952          (-ARG1 + ARG0) reduces to -ARG1.  */
5953       else if (!wins && fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
5954         return negate_expr (convert (type, arg1));
5955
5956       /* Fold &x - &x.  This can happen from &x.foo - &x.
5957          This is unsafe for certain floats even in non-IEEE formats.
5958          In IEEE, it is unsafe because it does wrong for NaNs.
5959          Also note that operand_equal_p is always false if an operand
5960          is volatile.  */
5961
5962       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
5963           && operand_equal_p (arg0, arg1, 0))
5964         return convert (type, integer_zero_node);
5965
5966       goto associate;
5967
5968     case MULT_EXPR:
5969       /* (-A) * (-B) -> A * B  */
5970       if (TREE_CODE (arg0) == NEGATE_EXPR && TREE_CODE (arg1) == NEGATE_EXPR)
5971         return fold (build (MULT_EXPR, type, TREE_OPERAND (arg0, 0),
5972                             TREE_OPERAND (arg1, 0)));
5973
5974       if (! FLOAT_TYPE_P (type))
5975         {
5976           if (integer_zerop (arg1))
5977             return omit_one_operand (type, arg1, arg0);
5978           if (integer_onep (arg1))
5979             return non_lvalue (convert (type, arg0));
5980
5981           /* (a * (1 << b)) is (a << b)  */
5982           if (TREE_CODE (arg1) == LSHIFT_EXPR
5983               && integer_onep (TREE_OPERAND (arg1, 0)))
5984             return fold (build (LSHIFT_EXPR, type, arg0,
5985                                 TREE_OPERAND (arg1, 1)));
5986           if (TREE_CODE (arg0) == LSHIFT_EXPR
5987               && integer_onep (TREE_OPERAND (arg0, 0)))
5988             return fold (build (LSHIFT_EXPR, type, arg1,
5989                                 TREE_OPERAND (arg0, 1)));
5990
5991           if (TREE_CODE (arg1) == INTEGER_CST
5992               && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0),
5993                                              convert (type, arg1),
5994                                              code, NULL_TREE)))
5995             return convert (type, tem);
5996
5997         }
5998       else
5999         {
6000           /* Maybe fold x * 0 to 0.  The expressions aren't the same
6001              when x is NaN, since x * 0 is also NaN.  Nor are they the
6002              same in modes with signed zeros, since multiplying a
6003              negative value by 0 gives -0, not +0.  */
6004           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
6005               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
6006               && real_zerop (arg1))
6007             return omit_one_operand (type, arg1, arg0);
6008           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
6009           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
6010               && real_onep (arg1))
6011             return non_lvalue (convert (type, arg0));
6012
6013           /* Transform x * -1.0 into -x.  */
6014           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
6015               && real_minus_onep (arg1))
6016             return fold (build1 (NEGATE_EXPR, type, arg0));
6017
6018           if (flag_unsafe_math_optimizations)
6019             {
6020               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
6021               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
6022
6023               /* Optimizations of sqrt(...)*sqrt(...).  */
6024               if ((fcode0 == BUILT_IN_SQRT && fcode1 == BUILT_IN_SQRT)
6025                   || (fcode0 == BUILT_IN_SQRTF && fcode1 == BUILT_IN_SQRTF)
6026                   || (fcode0 == BUILT_IN_SQRTL && fcode1 == BUILT_IN_SQRTL))
6027                 {
6028                   tree sqrtfn, arg, arglist;
6029                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
6030                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
6031
6032                   /* Optimize sqrt(x)*sqrt(x) as x.  */
6033                   if (operand_equal_p (arg00, arg10, 0)
6034                       && ! HONOR_SNANS (TYPE_MODE (type)))
6035                     return arg00;
6036
6037                   /* Optimize sqrt(x)*sqrt(y) as sqrt(x*y).  */
6038                   sqrtfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6039                   arg = fold (build (MULT_EXPR, type, arg00, arg10));
6040                   arglist = build_tree_list (NULL_TREE, arg);
6041                   return build_function_call_expr (sqrtfn, arglist);
6042                 }
6043
6044               /* Optimize exp(x)*exp(y) as exp(x+y).  */
6045               if ((fcode0 == BUILT_IN_EXP && fcode1 == BUILT_IN_EXP)
6046                   || (fcode0 == BUILT_IN_EXPF && fcode1 == BUILT_IN_EXPF)
6047                   || (fcode0 == BUILT_IN_EXPL && fcode1 == BUILT_IN_EXPL))
6048                 {
6049                   tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6050                   tree arg = build (PLUS_EXPR, type,
6051                                     TREE_VALUE (TREE_OPERAND (arg0, 1)),
6052                                     TREE_VALUE (TREE_OPERAND (arg1, 1)));
6053                   tree arglist = build_tree_list (NULL_TREE, fold (arg));
6054                   return build_function_call_expr (expfn, arglist);
6055                 }
6056
6057               /* Optimizations of pow(...)*pow(...).  */
6058               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
6059                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
6060                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
6061                 {
6062                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
6063                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
6064                                                                      1)));
6065                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
6066                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
6067                                                                      1)));
6068
6069                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
6070                   if (operand_equal_p (arg01, arg11, 0))
6071                     {
6072                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6073                       tree arg = build (MULT_EXPR, type, arg00, arg10);
6074                       tree arglist = tree_cons (NULL_TREE, fold (arg),
6075                                                 build_tree_list (NULL_TREE,
6076                                                                  arg01));
6077                       return build_function_call_expr (powfn, arglist);
6078                     }
6079
6080                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
6081                   if (operand_equal_p (arg00, arg10, 0))
6082                     {
6083                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6084                       tree arg = fold (build (PLUS_EXPR, type, arg01, arg11));
6085                       tree arglist = tree_cons (NULL_TREE, arg00,
6086                                                 build_tree_list (NULL_TREE,
6087                                                                  arg));
6088                       return build_function_call_expr (powfn, arglist);
6089                     }
6090                 }
6091
6092               /* Optimize tan(x)*cos(x) as sin(x).  */
6093               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
6094                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
6095                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
6096                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
6097                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
6098                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
6099                   && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
6100                                       TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
6101                 {
6102                   tree sinfn;
6103
6104                   switch (fcode0)
6105                     {
6106                     case BUILT_IN_TAN:
6107                     case BUILT_IN_COS:
6108                       sinfn = implicit_built_in_decls[BUILT_IN_SIN];
6109                       break;
6110                     case BUILT_IN_TANF:
6111                     case BUILT_IN_COSF:
6112                       sinfn = implicit_built_in_decls[BUILT_IN_SINF];
6113                       break;
6114                     case BUILT_IN_TANL:
6115                     case BUILT_IN_COSL:
6116                       sinfn = implicit_built_in_decls[BUILT_IN_SINL];
6117                       break;
6118                     default:
6119                       sinfn = NULL_TREE;
6120                     }
6121
6122                   if (sinfn != NULL_TREE)
6123                     return build_function_call_expr (sinfn,
6124                                                      TREE_OPERAND (arg0, 1));
6125                 }
6126
6127               /* Optimize x*pow(x,c) as pow(x,c+1).  */
6128               if (fcode1 == BUILT_IN_POW
6129                   || fcode1 == BUILT_IN_POWF
6130                   || fcode1 == BUILT_IN_POWL)
6131                 {
6132                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
6133                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
6134                                                                      1)));
6135                   if (TREE_CODE (arg11) == REAL_CST
6136                       && ! TREE_CONSTANT_OVERFLOW (arg11)
6137                       && operand_equal_p (arg0, arg10, 0))
6138                     {
6139                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
6140                       REAL_VALUE_TYPE c;
6141                       tree arg, arglist;
6142
6143                       c = TREE_REAL_CST (arg11);
6144                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
6145                       arg = build_real (type, c);
6146                       arglist = build_tree_list (NULL_TREE, arg);
6147                       arglist = tree_cons (NULL_TREE, arg0, arglist);
6148                       return build_function_call_expr (powfn, arglist);
6149                     }
6150                 }
6151
6152               /* Optimize pow(x,c)*x as pow(x,c+1).  */
6153               if (fcode0 == BUILT_IN_POW
6154                   || fcode0 == BUILT_IN_POWF
6155                   || fcode0 == BUILT_IN_POWL)
6156                 {
6157                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
6158                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
6159                                                                      1)));
6160                   if (TREE_CODE (arg01) == REAL_CST
6161                       && ! TREE_CONSTANT_OVERFLOW (arg01)
6162                       && operand_equal_p (arg1, arg00, 0))
6163                     {
6164                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6165                       REAL_VALUE_TYPE c;
6166                       tree arg, arglist;
6167
6168                       c = TREE_REAL_CST (arg01);
6169                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
6170                       arg = build_real (type, c);
6171                       arglist = build_tree_list (NULL_TREE, arg);
6172                       arglist = tree_cons (NULL_TREE, arg1, arglist);
6173                       return build_function_call_expr (powfn, arglist);
6174                     }
6175                 }
6176
6177               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
6178               if (! optimize_size
6179                   && operand_equal_p (arg0, arg1, 0))
6180                 {
6181                   tree powfn;
6182
6183                   if (type == double_type_node)
6184                     powfn = implicit_built_in_decls[BUILT_IN_POW];
6185                   else if (type == float_type_node)
6186                     powfn = implicit_built_in_decls[BUILT_IN_POWF];
6187                   else if (type == long_double_type_node)
6188                     powfn = implicit_built_in_decls[BUILT_IN_POWL];
6189                   else
6190                     powfn = NULL_TREE;
6191
6192                   if (powfn)
6193                     {
6194                       tree arg = build_real (type, dconst2);
6195                       tree arglist = build_tree_list (NULL_TREE, arg);
6196                       arglist = tree_cons (NULL_TREE, arg0, arglist);
6197                       return build_function_call_expr (powfn, arglist);
6198                     }
6199                 }
6200             }
6201         }
6202       goto associate;
6203
6204     case BIT_IOR_EXPR:
6205     bit_ior:
6206       if (integer_all_onesp (arg1))
6207         return omit_one_operand (type, arg1, arg0);
6208       if (integer_zerop (arg1))
6209         return non_lvalue (convert (type, arg0));
6210       t1 = distribute_bit_expr (code, type, arg0, arg1);
6211       if (t1 != NULL_TREE)
6212         return t1;
6213
6214       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
6215
6216          This results in more efficient code for machines without a NAND
6217          instruction.  Combine will canonicalize to the first form
6218          which will allow use of NAND instructions provided by the
6219          backend if they exist.  */
6220       if (TREE_CODE (arg0) == BIT_NOT_EXPR
6221           && TREE_CODE (arg1) == BIT_NOT_EXPR)
6222         {
6223           return fold (build1 (BIT_NOT_EXPR, type,
6224                                build (BIT_AND_EXPR, type,
6225                                       TREE_OPERAND (arg0, 0),
6226                                       TREE_OPERAND (arg1, 0))));
6227         }
6228
6229       /* See if this can be simplified into a rotate first.  If that
6230          is unsuccessful continue in the association code.  */
6231       goto bit_rotate;
6232
6233     case BIT_XOR_EXPR:
6234       if (integer_zerop (arg1))
6235         return non_lvalue (convert (type, arg0));
6236       if (integer_all_onesp (arg1))
6237         return fold (build1 (BIT_NOT_EXPR, type, arg0));
6238
6239       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
6240          with a constant, and the two constants have no bits in common,
6241          we should treat this as a BIT_IOR_EXPR since this may produce more
6242          simplifications.  */
6243       if (TREE_CODE (arg0) == BIT_AND_EXPR
6244           && TREE_CODE (arg1) == BIT_AND_EXPR
6245           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
6246           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
6247           && integer_zerop (const_binop (BIT_AND_EXPR,
6248                                          TREE_OPERAND (arg0, 1),
6249                                          TREE_OPERAND (arg1, 1), 0)))
6250         {
6251           code = BIT_IOR_EXPR;
6252           goto bit_ior;
6253         }
6254
6255       /* See if this can be simplified into a rotate first.  If that
6256          is unsuccessful continue in the association code.  */
6257       goto bit_rotate;
6258
6259     case BIT_AND_EXPR:
6260     bit_and:
6261       if (integer_all_onesp (arg1))
6262         return non_lvalue (convert (type, arg0));
6263       if (integer_zerop (arg1))
6264         return omit_one_operand (type, arg1, arg0);
6265       t1 = distribute_bit_expr (code, type, arg0, arg1);
6266       if (t1 != NULL_TREE)
6267         return t1;
6268       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
6269       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
6270           && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
6271         {
6272           unsigned int prec
6273             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
6274
6275           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
6276               && (~TREE_INT_CST_LOW (arg1)
6277                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
6278             return build1 (NOP_EXPR, type, TREE_OPERAND (arg0, 0));
6279         }
6280
6281       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
6282
6283          This results in more efficient code for machines without a NOR
6284          instruction.  Combine will canonicalize to the first form
6285          which will allow use of NOR instructions provided by the
6286          backend if they exist.  */
6287       if (TREE_CODE (arg0) == BIT_NOT_EXPR
6288           && TREE_CODE (arg1) == BIT_NOT_EXPR)
6289         {
6290           return fold (build1 (BIT_NOT_EXPR, type,
6291                                build (BIT_IOR_EXPR, type,
6292                                       TREE_OPERAND (arg0, 0),
6293                                       TREE_OPERAND (arg1, 0))));
6294         }
6295
6296       goto associate;
6297
6298     case BIT_ANDTC_EXPR:
6299       if (integer_all_onesp (arg0))
6300         return non_lvalue (convert (type, arg1));
6301       if (integer_zerop (arg0))
6302         return omit_one_operand (type, arg0, arg1);
6303       if (TREE_CODE (arg1) == INTEGER_CST)
6304         {
6305           arg1 = fold (build1 (BIT_NOT_EXPR, type, arg1));
6306           code = BIT_AND_EXPR;
6307           goto bit_and;
6308         }
6309       goto binary;
6310
6311     case RDIV_EXPR:
6312       /* Don't touch a floating-point divide by zero unless the mode
6313          of the constant can represent infinity.  */
6314       if (TREE_CODE (arg1) == REAL_CST
6315           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
6316           && real_zerop (arg1))
6317         return t;
6318
6319       /* (-A) / (-B) -> A / B  */
6320       if (TREE_CODE (arg0) == NEGATE_EXPR && TREE_CODE (arg1) == NEGATE_EXPR)
6321         return fold (build (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
6322                             TREE_OPERAND (arg1, 0)));
6323
6324       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
6325       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
6326           && real_onep (arg1))
6327         return non_lvalue (convert (type, arg0));
6328
6329       /* If ARG1 is a constant, we can convert this to a multiply by the
6330          reciprocal.  This does not have the same rounding properties,
6331          so only do this if -funsafe-math-optimizations.  We can actually
6332          always safely do it if ARG1 is a power of two, but it's hard to
6333          tell if it is or not in a portable manner.  */
6334       if (TREE_CODE (arg1) == REAL_CST)
6335         {
6336           if (flag_unsafe_math_optimizations
6337               && 0 != (tem = const_binop (code, build_real (type, dconst1),
6338                                           arg1, 0)))
6339             return fold (build (MULT_EXPR, type, arg0, tem));
6340           /* Find the reciprocal if optimizing and the result is exact.  */
6341           else if (optimize)
6342             {
6343               REAL_VALUE_TYPE r;
6344               r = TREE_REAL_CST (arg1);
6345               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
6346                 {
6347                   tem = build_real (type, r);
6348                   return fold (build (MULT_EXPR, type, arg0, tem));
6349                 }
6350             }
6351         }
6352       /* Convert A/B/C to A/(B*C).  */
6353       if (flag_unsafe_math_optimizations
6354           && TREE_CODE (arg0) == RDIV_EXPR)
6355         {
6356           return fold (build (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
6357                               build (MULT_EXPR, type, TREE_OPERAND (arg0, 1),
6358                                      arg1)));
6359         }
6360       /* Convert A/(B/C) to (A/B)*C.  */
6361       if (flag_unsafe_math_optimizations
6362           && TREE_CODE (arg1) == RDIV_EXPR)
6363         {
6364           return fold (build (MULT_EXPR, type,
6365                               build (RDIV_EXPR, type, arg0,
6366                                      TREE_OPERAND (arg1, 0)),
6367                               TREE_OPERAND (arg1, 1)));
6368         }
6369
6370       if (flag_unsafe_math_optimizations)
6371         {
6372           enum built_in_function fcode = builtin_mathfn_code (arg1);
6373           /* Optimize x/exp(y) into x*exp(-y).  */
6374           if (fcode == BUILT_IN_EXP
6375               || fcode == BUILT_IN_EXPF
6376               || fcode == BUILT_IN_EXPL)
6377             {
6378               tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
6379               tree arg = build1 (NEGATE_EXPR, type,
6380                                  TREE_VALUE (TREE_OPERAND (arg1, 1)));
6381               tree arglist = build_tree_list (NULL_TREE, fold (arg));
6382               arg1 = build_function_call_expr (expfn, arglist);
6383               return fold (build (MULT_EXPR, type, arg0, arg1));
6384             }
6385
6386           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
6387           if (fcode == BUILT_IN_POW
6388               || fcode == BUILT_IN_POWF
6389               || fcode == BUILT_IN_POWL)
6390             {
6391               tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
6392               tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
6393               tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1, 1)));
6394               tree neg11 = fold (build1 (NEGATE_EXPR, type, arg11));
6395               tree arglist = tree_cons(NULL_TREE, arg10,
6396                                        build_tree_list (NULL_TREE, neg11));
6397               arg1 = build_function_call_expr (powfn, arglist);
6398               return fold (build (MULT_EXPR, type, arg0, arg1));
6399             }
6400         }
6401
6402       if (flag_unsafe_math_optimizations)
6403         {
6404           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
6405           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
6406
6407           /* Optimize sin(x)/cos(x) as tan(x).  */
6408           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
6409                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
6410                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
6411               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
6412                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
6413             {
6414               tree tanfn;
6415
6416               if (fcode0 == BUILT_IN_SIN)
6417                 tanfn = implicit_built_in_decls[BUILT_IN_TAN];
6418               else if (fcode0 == BUILT_IN_SINF)
6419                 tanfn = implicit_built_in_decls[BUILT_IN_TANF];
6420               else if (fcode0 == BUILT_IN_SINL)
6421                 tanfn = implicit_built_in_decls[BUILT_IN_TANL];
6422               else
6423                 tanfn = NULL_TREE;
6424
6425               if (tanfn != NULL_TREE)
6426                 return build_function_call_expr (tanfn,
6427                                                  TREE_OPERAND (arg0, 1));
6428             }
6429
6430           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
6431           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
6432                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
6433                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
6434               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
6435                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
6436             {
6437               tree tanfn;
6438
6439               if (fcode0 == BUILT_IN_COS)
6440                 tanfn = implicit_built_in_decls[BUILT_IN_TAN];
6441               else if (fcode0 == BUILT_IN_COSF)
6442                 tanfn = implicit_built_in_decls[BUILT_IN_TANF];
6443               else if (fcode0 == BUILT_IN_COSL)
6444                 tanfn = implicit_built_in_decls[BUILT_IN_TANL];
6445               else
6446                 tanfn = NULL_TREE;
6447
6448               if (tanfn != NULL_TREE)
6449                 {
6450                   tree tmp = TREE_OPERAND (arg0, 1);
6451                   tmp = build_function_call_expr (tanfn, tmp);
6452                   return fold (build (RDIV_EXPR, type,
6453                                       build_real (type, dconst1),
6454                                       tmp));
6455                 }
6456             }
6457
6458           /* Optimize pow(x,c)/x as pow(x,c-1).  */
6459           if (fcode0 == BUILT_IN_POW
6460               || fcode0 == BUILT_IN_POWF
6461               || fcode0 == BUILT_IN_POWL)
6462             {
6463               tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
6464               tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
6465               if (TREE_CODE (arg01) == REAL_CST
6466                   && ! TREE_CONSTANT_OVERFLOW (arg01)
6467                   && operand_equal_p (arg1, arg00, 0))
6468                 {
6469                   tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
6470                   REAL_VALUE_TYPE c;
6471                   tree arg, arglist;
6472
6473                   c = TREE_REAL_CST (arg01);
6474                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
6475                   arg = build_real (type, c);
6476                   arglist = build_tree_list (NULL_TREE, arg);
6477                   arglist = tree_cons (NULL_TREE, arg1, arglist);
6478                   return build_function_call_expr (powfn, arglist);
6479                 }
6480             }
6481         }
6482       goto binary;
6483
6484     case TRUNC_DIV_EXPR:
6485     case ROUND_DIV_EXPR:
6486     case FLOOR_DIV_EXPR:
6487     case CEIL_DIV_EXPR:
6488     case EXACT_DIV_EXPR:
6489       if (integer_onep (arg1))
6490         return non_lvalue (convert (type, arg0));
6491       if (integer_zerop (arg1))
6492         return t;
6493
6494       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
6495          operation, EXACT_DIV_EXPR.
6496
6497          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
6498          At one time others generated faster code, it's not clear if they do
6499          after the last round to changes to the DIV code in expmed.c.  */
6500       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
6501           && multiple_of_p (type, arg0, arg1))
6502         return fold (build (EXACT_DIV_EXPR, type, arg0, arg1));
6503
6504       if (TREE_CODE (arg1) == INTEGER_CST
6505           && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), arg1,
6506                                          code, NULL_TREE)))
6507         return convert (type, tem);
6508
6509       goto binary;
6510
6511     case CEIL_MOD_EXPR:
6512     case FLOOR_MOD_EXPR:
6513     case ROUND_MOD_EXPR:
6514     case TRUNC_MOD_EXPR:
6515       if (integer_onep (arg1))
6516         return omit_one_operand (type, integer_zero_node, arg0);
6517       if (integer_zerop (arg1))
6518         return t;
6519
6520       if (TREE_CODE (arg1) == INTEGER_CST
6521           && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), arg1,
6522                                          code, NULL_TREE)))
6523         return convert (type, tem);
6524
6525       goto binary;
6526
6527     case LROTATE_EXPR:
6528     case RROTATE_EXPR:
6529       if (integer_all_onesp (arg0))
6530         return omit_one_operand (type, arg0, arg1);
6531       goto shift;
6532
6533     case RSHIFT_EXPR:
6534       /* Optimize -1 >> x for arithmetic right shifts.  */
6535       if (integer_all_onesp (arg0) && ! TREE_UNSIGNED (type))
6536         return omit_one_operand (type, arg0, arg1);
6537       /* ... fall through ...  */
6538
6539     case LSHIFT_EXPR:
6540     shift:
6541       if (integer_zerop (arg1))
6542         return non_lvalue (convert (type, arg0));
6543       if (integer_zerop (arg0))
6544         return omit_one_operand (type, arg0, arg1);
6545
6546       /* Since negative shift count is not well-defined,
6547          don't try to compute it in the compiler.  */
6548       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
6549         return t;
6550       /* Rewrite an LROTATE_EXPR by a constant into an
6551          RROTATE_EXPR by a new constant.  */
6552       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
6553         {
6554           if (t == orig_t)
6555             t = copy_node (t);
6556           TREE_SET_CODE (t, RROTATE_EXPR);
6557           code = RROTATE_EXPR;
6558           TREE_OPERAND (t, 1) = arg1
6559             = const_binop
6560               (MINUS_EXPR,
6561                convert (TREE_TYPE (arg1),
6562                         build_int_2 (GET_MODE_BITSIZE (TYPE_MODE (type)), 0)),
6563                arg1, 0);
6564           if (tree_int_cst_sgn (arg1) < 0)
6565             return t;
6566         }
6567
6568       /* If we have a rotate of a bit operation with the rotate count and
6569          the second operand of the bit operation both constant,
6570          permute the two operations.  */
6571       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
6572           && (TREE_CODE (arg0) == BIT_AND_EXPR
6573               || TREE_CODE (arg0) == BIT_ANDTC_EXPR
6574               || TREE_CODE (arg0) == BIT_IOR_EXPR
6575               || TREE_CODE (arg0) == BIT_XOR_EXPR)
6576           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
6577         return fold (build (TREE_CODE (arg0), type,
6578                             fold (build (code, type,
6579                                          TREE_OPERAND (arg0, 0), arg1)),
6580                             fold (build (code, type,
6581                                          TREE_OPERAND (arg0, 1), arg1))));
6582
6583       /* Two consecutive rotates adding up to the width of the mode can
6584          be ignored.  */
6585       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
6586           && TREE_CODE (arg0) == RROTATE_EXPR
6587           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
6588           && TREE_INT_CST_HIGH (arg1) == 0
6589           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
6590           && ((TREE_INT_CST_LOW (arg1)
6591                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
6592               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
6593         return TREE_OPERAND (arg0, 0);
6594
6595       goto binary;
6596
6597     case MIN_EXPR:
6598       if (operand_equal_p (arg0, arg1, 0))
6599         return omit_one_operand (type, arg0, arg1);
6600       if (INTEGRAL_TYPE_P (type)
6601           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), 1))
6602         return omit_one_operand (type, arg1, arg0);
6603       goto associate;
6604
6605     case MAX_EXPR:
6606       if (operand_equal_p (arg0, arg1, 0))
6607         return omit_one_operand (type, arg0, arg1);
6608       if (INTEGRAL_TYPE_P (type)
6609           && TYPE_MAX_VALUE (type)
6610           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), 1))
6611         return omit_one_operand (type, arg1, arg0);
6612       goto associate;
6613
6614     case TRUTH_NOT_EXPR:
6615       /* Note that the operand of this must be an int
6616          and its values must be 0 or 1.
6617          ("true" is a fixed value perhaps depending on the language,
6618          but we don't handle values other than 1 correctly yet.)  */
6619       tem = invert_truthvalue (arg0);
6620       /* Avoid infinite recursion.  */
6621       if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
6622         {
6623           tem = fold_single_bit_test (code, arg0, arg1, type);
6624           if (tem)
6625             return tem;
6626           return t;
6627         }
6628       return convert (type, tem);
6629
6630     case TRUTH_ANDIF_EXPR:
6631       /* Note that the operands of this must be ints
6632          and their values must be 0 or 1.
6633          ("true" is a fixed value perhaps depending on the language.)  */
6634       /* If first arg is constant zero, return it.  */
6635       if (integer_zerop (arg0))
6636         return convert (type, arg0);
6637     case TRUTH_AND_EXPR:
6638       /* If either arg is constant true, drop it.  */
6639       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
6640         return non_lvalue (convert (type, arg1));
6641       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
6642           /* Preserve sequence points.  */
6643           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
6644         return non_lvalue (convert (type, arg0));
6645       /* If second arg is constant zero, result is zero, but first arg
6646          must be evaluated.  */
6647       if (integer_zerop (arg1))
6648         return omit_one_operand (type, arg1, arg0);
6649       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
6650          case will be handled here.  */
6651       if (integer_zerop (arg0))
6652         return omit_one_operand (type, arg0, arg1);
6653
6654     truth_andor:
6655       /* We only do these simplifications if we are optimizing.  */
6656       if (!optimize)
6657         return t;
6658
6659       /* Check for things like (A || B) && (A || C).  We can convert this
6660          to A || (B && C).  Note that either operator can be any of the four
6661          truth and/or operations and the transformation will still be
6662          valid.   Also note that we only care about order for the
6663          ANDIF and ORIF operators.  If B contains side effects, this
6664          might change the truth-value of A.  */
6665       if (TREE_CODE (arg0) == TREE_CODE (arg1)
6666           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
6667               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
6668               || TREE_CODE (arg0) == TRUTH_AND_EXPR
6669               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
6670           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
6671         {
6672           tree a00 = TREE_OPERAND (arg0, 0);
6673           tree a01 = TREE_OPERAND (arg0, 1);
6674           tree a10 = TREE_OPERAND (arg1, 0);
6675           tree a11 = TREE_OPERAND (arg1, 1);
6676           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
6677                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
6678                              && (code == TRUTH_AND_EXPR
6679                                  || code == TRUTH_OR_EXPR));
6680
6681           if (operand_equal_p (a00, a10, 0))
6682             return fold (build (TREE_CODE (arg0), type, a00,
6683                                 fold (build (code, type, a01, a11))));
6684           else if (commutative && operand_equal_p (a00, a11, 0))
6685             return fold (build (TREE_CODE (arg0), type, a00,
6686                                 fold (build (code, type, a01, a10))));
6687           else if (commutative && operand_equal_p (a01, a10, 0))
6688             return fold (build (TREE_CODE (arg0), type, a01,
6689                                 fold (build (code, type, a00, a11))));
6690
6691           /* This case if tricky because we must either have commutative
6692              operators or else A10 must not have side-effects.  */
6693
6694           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
6695                    && operand_equal_p (a01, a11, 0))
6696             return fold (build (TREE_CODE (arg0), type,
6697                                 fold (build (code, type, a00, a10)),
6698                                 a01));
6699         }
6700
6701       /* See if we can build a range comparison.  */
6702       if (0 != (tem = fold_range_test (t)))
6703         return tem;
6704
6705       /* Check for the possibility of merging component references.  If our
6706          lhs is another similar operation, try to merge its rhs with our
6707          rhs.  Then try to merge our lhs and rhs.  */
6708       if (TREE_CODE (arg0) == code
6709           && 0 != (tem = fold_truthop (code, type,
6710                                        TREE_OPERAND (arg0, 1), arg1)))
6711         return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
6712
6713       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
6714         return tem;
6715
6716       return t;
6717
6718     case TRUTH_ORIF_EXPR:
6719       /* Note that the operands of this must be ints
6720          and their values must be 0 or true.
6721          ("true" is a fixed value perhaps depending on the language.)  */
6722       /* If first arg is constant true, return it.  */
6723       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
6724         return convert (type, arg0);
6725     case TRUTH_OR_EXPR:
6726       /* If either arg is constant zero, drop it.  */
6727       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
6728         return non_lvalue (convert (type, arg1));
6729       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
6730           /* Preserve sequence points.  */
6731           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
6732         return non_lvalue (convert (type, arg0));
6733       /* If second arg is constant true, result is true, but we must
6734          evaluate first arg.  */
6735       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
6736         return omit_one_operand (type, arg1, arg0);
6737       /* Likewise for first arg, but note this only occurs here for
6738          TRUTH_OR_EXPR.  */
6739       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
6740         return omit_one_operand (type, arg0, arg1);
6741       goto truth_andor;
6742
6743     case TRUTH_XOR_EXPR:
6744       /* If either arg is constant zero, drop it.  */
6745       if (integer_zerop (arg0))
6746         return non_lvalue (convert (type, arg1));
6747       if (integer_zerop (arg1))
6748         return non_lvalue (convert (type, arg0));
6749       /* If either arg is constant true, this is a logical inversion.  */
6750       if (integer_onep (arg0))
6751         return non_lvalue (convert (type, invert_truthvalue (arg1)));
6752       if (integer_onep (arg1))
6753         return non_lvalue (convert (type, invert_truthvalue (arg0)));
6754       return t;
6755
6756     case EQ_EXPR:
6757     case NE_EXPR:
6758     case LT_EXPR:
6759     case GT_EXPR:
6760     case LE_EXPR:
6761     case GE_EXPR:
6762       /* If one arg is a real or integer constant, put it last.  */
6763       if ((TREE_CODE (arg0) == INTEGER_CST
6764            && TREE_CODE (arg1) != INTEGER_CST)
6765           || (TREE_CODE (arg0) == REAL_CST
6766               && TREE_CODE (arg0) != REAL_CST))
6767         {
6768           if (t == orig_t)
6769             t = copy_node (t);
6770           TREE_OPERAND (t, 0) = arg1;
6771           TREE_OPERAND (t, 1) = arg0;
6772           arg0 = TREE_OPERAND (t, 0);
6773           arg1 = TREE_OPERAND (t, 1);
6774           code = swap_tree_comparison (code);
6775           TREE_SET_CODE (t, code);
6776         }
6777
6778       if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
6779         {
6780           tree targ0 = strip_float_extensions (arg0);
6781           tree targ1 = strip_float_extensions (arg1);
6782           tree newtype = TREE_TYPE (targ0);
6783
6784           if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
6785             newtype = TREE_TYPE (targ1);
6786
6787           /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
6788           if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
6789             return fold (build (code, type, convert (newtype, targ0),
6790                                 convert (newtype, targ1)));
6791
6792           /* (-a) CMP (-b) -> b CMP a  */
6793           if (TREE_CODE (arg0) == NEGATE_EXPR
6794               && TREE_CODE (arg1) == NEGATE_EXPR)
6795             return fold (build (code, type, TREE_OPERAND (arg1, 0),
6796                                 TREE_OPERAND (arg0, 0)));
6797
6798           if (TREE_CODE (arg1) == REAL_CST)
6799           {
6800             REAL_VALUE_TYPE cst;
6801             cst = TREE_REAL_CST (arg1);
6802
6803             /* (-a) CMP CST -> a swap(CMP) (-CST)  */
6804             if (TREE_CODE (arg0) == NEGATE_EXPR)
6805               return
6806                 fold (build (swap_tree_comparison (code), type,
6807                              TREE_OPERAND (arg0, 0),
6808                              build_real (TREE_TYPE (arg1),
6809                                          REAL_VALUE_NEGATE (cst))));
6810
6811             /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
6812             /* a CMP (-0) -> a CMP 0  */
6813             if (REAL_VALUE_MINUS_ZERO (cst))
6814               return fold (build (code, type, arg0,
6815                                   build_real (TREE_TYPE (arg1), dconst0)));
6816
6817             /* x != NaN is always true, other ops are always false.  */
6818             if (REAL_VALUE_ISNAN (cst)
6819                 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
6820               {
6821                 t = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
6822                 return omit_one_operand (type, convert (type, t), arg0);
6823               }
6824
6825             /* Fold comparisons against infinity.  */
6826             if (REAL_VALUE_ISINF (cst))
6827               {
6828                 tem = fold_inf_compare (code, type, arg0, arg1);
6829                 if (tem != NULL_TREE)
6830                   return tem;
6831               }
6832           }
6833
6834           /* If this is a comparison of a real constant with a PLUS_EXPR
6835              or a MINUS_EXPR of a real constant, we can convert it into a
6836              comparison with a revised real constant as long as no overflow
6837              occurs when unsafe_math_optimizations are enabled.  */
6838           if (flag_unsafe_math_optimizations
6839               && TREE_CODE (arg1) == REAL_CST
6840               && (TREE_CODE (arg0) == PLUS_EXPR
6841                   || TREE_CODE (arg0) == MINUS_EXPR)
6842               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
6843               && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
6844                                           ? MINUS_EXPR : PLUS_EXPR,
6845                                           arg1, TREE_OPERAND (arg0, 1), 0))
6846               && ! TREE_CONSTANT_OVERFLOW (tem))
6847             return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
6848
6849           /* Likewise, we can simplify a comparison of a real constant with
6850              a MINUS_EXPR whose first operand is also a real constant, i.e.
6851              (c1 - x) < c2 becomes x > c1-c2.  */
6852           if (flag_unsafe_math_optimizations
6853               && TREE_CODE (arg1) == REAL_CST
6854               && TREE_CODE (arg0) == MINUS_EXPR
6855               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
6856               && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
6857                                           arg1, 0))
6858               && ! TREE_CONSTANT_OVERFLOW (tem))
6859             return fold (build (swap_tree_comparison (code), type,
6860                                 TREE_OPERAND (arg0, 1), tem));
6861
6862           /* Fold comparisons against built-in math functions.  */
6863           if (TREE_CODE (arg1) == REAL_CST
6864               && flag_unsafe_math_optimizations
6865               && ! flag_errno_math)
6866             {
6867               enum built_in_function fcode = builtin_mathfn_code (arg0);
6868
6869               if (fcode != END_BUILTINS)
6870                 {
6871                   tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
6872                   if (tem != NULL_TREE)
6873                     return tem;
6874                 }
6875             }
6876         }
6877
6878       /* Convert foo++ == CONST into ++foo == CONST + INCR.
6879          First, see if one arg is constant; find the constant arg
6880          and the other one.  */
6881       {
6882         tree constop = 0, varop = NULL_TREE;
6883         int constopnum = -1;
6884
6885         if (TREE_CONSTANT (arg1))
6886           constopnum = 1, constop = arg1, varop = arg0;
6887         if (TREE_CONSTANT (arg0))
6888           constopnum = 0, constop = arg0, varop = arg1;
6889
6890         if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR)
6891           {
6892             /* This optimization is invalid for ordered comparisons
6893                if CONST+INCR overflows or if foo+incr might overflow.
6894                This optimization is invalid for floating point due to rounding.
6895                For pointer types we assume overflow doesn't happen.  */
6896             if (POINTER_TYPE_P (TREE_TYPE (varop))
6897                 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
6898                     && (code == EQ_EXPR || code == NE_EXPR)))
6899               {
6900                 tree newconst
6901                   = fold (build (PLUS_EXPR, TREE_TYPE (varop),
6902                                  constop, TREE_OPERAND (varop, 1)));
6903
6904                 /* Do not overwrite the current varop to be a preincrement,
6905                    create a new node so that we won't confuse our caller who
6906                    might create trees and throw them away, reusing the
6907                    arguments that they passed to build.  This shows up in
6908                    the THEN or ELSE parts of ?: being postincrements.  */
6909                 varop = build (PREINCREMENT_EXPR, TREE_TYPE (varop),
6910                                TREE_OPERAND (varop, 0),
6911                                TREE_OPERAND (varop, 1));
6912
6913                 /* If VAROP is a reference to a bitfield, we must mask
6914                    the constant by the width of the field.  */
6915                 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
6916                     && DECL_BIT_FIELD(TREE_OPERAND
6917                                       (TREE_OPERAND (varop, 0), 1)))
6918                   {
6919                     int size
6920                       = TREE_INT_CST_LOW (DECL_SIZE
6921                                           (TREE_OPERAND
6922                                            (TREE_OPERAND (varop, 0), 1)));
6923                     tree mask, unsigned_type;
6924                     unsigned int precision;
6925                     tree folded_compare;
6926
6927                     /* First check whether the comparison would come out
6928                        always the same.  If we don't do that we would
6929                        change the meaning with the masking.  */
6930                     if (constopnum == 0)
6931                       folded_compare = fold (build (code, type, constop,
6932                                                     TREE_OPERAND (varop, 0)));
6933                     else
6934                       folded_compare = fold (build (code, type,
6935                                                     TREE_OPERAND (varop, 0),
6936                                                     constop));
6937                     if (integer_zerop (folded_compare)
6938                         || integer_onep (folded_compare))
6939                       return omit_one_operand (type, folded_compare, varop);
6940
6941                     unsigned_type = (*lang_hooks.types.type_for_size)(size, 1);
6942                     precision = TYPE_PRECISION (unsigned_type);
6943                     mask = build_int_2 (~0, ~0);
6944                     TREE_TYPE (mask) = unsigned_type;
6945                     force_fit_type (mask, 0);
6946                     mask = const_binop (RSHIFT_EXPR, mask,
6947                                         size_int (precision - size), 0);
6948                     newconst = fold (build (BIT_AND_EXPR,
6949                                             TREE_TYPE (varop), newconst,
6950                                             convert (TREE_TYPE (varop),
6951                                                      mask)));
6952                   }
6953
6954                 t = build (code, type,
6955                            (constopnum == 0) ? newconst : varop,
6956                            (constopnum == 1) ? newconst : varop);
6957                 return t;
6958               }
6959           }
6960         else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
6961           {
6962             if (POINTER_TYPE_P (TREE_TYPE (varop))
6963                 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
6964                     && (code == EQ_EXPR || code == NE_EXPR)))
6965               {
6966                 tree newconst
6967                   = fold (build (MINUS_EXPR, TREE_TYPE (varop),
6968                                  constop, TREE_OPERAND (varop, 1)));
6969
6970                 /* Do not overwrite the current varop to be a predecrement,
6971                    create a new node so that we won't confuse our caller who
6972                    might create trees and throw them away, reusing the
6973                    arguments that they passed to build.  This shows up in
6974                    the THEN or ELSE parts of ?: being postdecrements.  */
6975                 varop = build (PREDECREMENT_EXPR, TREE_TYPE (varop),
6976                                TREE_OPERAND (varop, 0),
6977                                TREE_OPERAND (varop, 1));
6978
6979                 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
6980                     && DECL_BIT_FIELD(TREE_OPERAND
6981                                       (TREE_OPERAND (varop, 0), 1)))
6982                   {
6983                     int size
6984                       = TREE_INT_CST_LOW (DECL_SIZE
6985                                           (TREE_OPERAND
6986                                            (TREE_OPERAND (varop, 0), 1)));
6987                     tree mask, unsigned_type;
6988                     unsigned int precision;
6989                     tree folded_compare;
6990
6991                     if (constopnum == 0)
6992                       folded_compare = fold (build (code, type, constop,
6993                                                     TREE_OPERAND (varop, 0)));
6994                     else
6995                       folded_compare = fold (build (code, type,
6996                                                     TREE_OPERAND (varop, 0),
6997                                                     constop));
6998                     if (integer_zerop (folded_compare)
6999                         || integer_onep (folded_compare))
7000                       return omit_one_operand (type, folded_compare, varop);
7001
7002                     unsigned_type = (*lang_hooks.types.type_for_size)(size, 1);
7003                     precision = TYPE_PRECISION (unsigned_type);
7004                     mask = build_int_2 (~0, ~0);
7005                     TREE_TYPE (mask) = TREE_TYPE (varop);
7006                     force_fit_type (mask, 0);
7007                     mask = const_binop (RSHIFT_EXPR, mask,
7008                                         size_int (precision - size), 0);
7009                     newconst = fold (build (BIT_AND_EXPR,
7010                                             TREE_TYPE (varop), newconst,
7011                                             convert (TREE_TYPE (varop),
7012                                                      mask)));
7013                   }
7014
7015                 t = build (code, type,
7016                            (constopnum == 0) ? newconst : varop,
7017                            (constopnum == 1) ? newconst : varop);
7018                 return t;
7019               }
7020           }
7021       }
7022
7023       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
7024          This transformation affects the cases which are handled in later
7025          optimizations involving comparisons with non-negative constants.  */
7026       if (TREE_CODE (arg1) == INTEGER_CST
7027           && TREE_CODE (arg0) != INTEGER_CST
7028           && tree_int_cst_sgn (arg1) > 0)
7029         {
7030           switch (code)
7031             {
7032             case GE_EXPR:
7033               code = GT_EXPR;
7034               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
7035               t = build (code, type, TREE_OPERAND (t, 0), arg1);
7036               break;
7037
7038             case LT_EXPR:
7039               code = LE_EXPR;
7040               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
7041               t = build (code, type, TREE_OPERAND (t, 0), arg1);
7042               break;
7043
7044             default:
7045               break;
7046             }
7047         }
7048
7049       /* Comparisons with the highest or lowest possible integer of
7050          the specified size will have known values.  */
7051       {
7052         int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg1)));
7053
7054         if (TREE_CODE (arg1) == INTEGER_CST
7055             && ! TREE_CONSTANT_OVERFLOW (arg1)
7056             && width <= HOST_BITS_PER_WIDE_INT
7057             && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
7058                 || POINTER_TYPE_P (TREE_TYPE (arg1))))
7059           {
7060             unsigned HOST_WIDE_INT signed_max;
7061             unsigned HOST_WIDE_INT max, min;
7062
7063             signed_max = ((unsigned HOST_WIDE_INT) 1 << (width - 1)) - 1;
7064
7065             if (TREE_UNSIGNED (TREE_TYPE (arg1)))
7066               {
7067                 max = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
7068                 min = 0;
7069               }
7070             else
7071               {
7072                 max = signed_max;
7073                 min = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
7074               }
7075
7076             if (TREE_INT_CST_HIGH (arg1) == 0
7077                 && TREE_INT_CST_LOW (arg1) == max)
7078               switch (code)
7079                 {
7080                 case GT_EXPR:
7081                   return omit_one_operand (type,
7082                                            convert (type, integer_zero_node),
7083                                            arg0);
7084                 case GE_EXPR:
7085                   code = EQ_EXPR;
7086                   if (t == orig_t)
7087                     t = copy_node (t);
7088                   TREE_SET_CODE (t, EQ_EXPR);
7089                   break;
7090                 case LE_EXPR:
7091                   return omit_one_operand (type,
7092                                            convert (type, integer_one_node),
7093                                            arg0);
7094                 case LT_EXPR:
7095                   code = NE_EXPR;
7096                   if (t == orig_t)
7097                     t = copy_node (t);
7098                   TREE_SET_CODE (t, NE_EXPR);
7099                   break;
7100
7101                 /* The GE_EXPR and LT_EXPR cases above are not normally
7102                    reached because of  previous transformations.  */
7103
7104                 default:
7105                   break;
7106                 }
7107             else if (TREE_INT_CST_HIGH (arg1) == 0
7108                      && TREE_INT_CST_LOW (arg1) == max - 1)
7109               switch (code)
7110                 {
7111                 case GT_EXPR:
7112                   code = EQ_EXPR;
7113                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
7114                   t = build (code, type, TREE_OPERAND (t, 0), arg1);
7115                   break;
7116                 case LE_EXPR:
7117                   code = NE_EXPR;
7118                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
7119                   t = build (code, type, TREE_OPERAND (t, 0), arg1);
7120                   break;
7121                 default:
7122                   break;
7123                 }
7124             else if (TREE_INT_CST_HIGH (arg1) == (min ? -1 : 0)
7125                      && TREE_INT_CST_LOW (arg1) == min)
7126               switch (code)
7127                 {
7128                 case LT_EXPR:
7129                   return omit_one_operand (type,
7130                                            convert (type, integer_zero_node),
7131                                            arg0);
7132                 case LE_EXPR:
7133                   code = EQ_EXPR;
7134                   if (t == orig_t)
7135                     t = copy_node (t);
7136                   TREE_SET_CODE (t, EQ_EXPR);
7137                   break;
7138
7139                 case GE_EXPR:
7140                   return omit_one_operand (type,
7141                                            convert (type, integer_one_node),
7142                                            arg0);
7143                 case GT_EXPR:
7144                   code = NE_EXPR;
7145                   if (t == orig_t)
7146                     t = copy_node (t);
7147                   TREE_SET_CODE (t, NE_EXPR);
7148                   break;
7149
7150                 default:
7151                   break;
7152                 }
7153             else if (TREE_INT_CST_HIGH (arg1) == (min ? -1 : 0)
7154                      && TREE_INT_CST_LOW (arg1) == min + 1)
7155               switch (code)
7156                 {
7157                 case GE_EXPR:
7158                   code = NE_EXPR;
7159                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
7160                   t = build (code, type, TREE_OPERAND (t, 0), arg1);
7161                   break;
7162                 case LT_EXPR:
7163                   code = EQ_EXPR;
7164                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
7165                   t = build (code, type, TREE_OPERAND (t, 0), arg1);
7166                   break;
7167                 default:
7168                   break;
7169                 }
7170
7171             else if (TREE_INT_CST_HIGH (arg1) == 0
7172                      && TREE_INT_CST_LOW (arg1) == signed_max
7173                      && TREE_UNSIGNED (TREE_TYPE (arg1))
7174                      /* signed_type does not work on pointer types.  */
7175                      && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
7176               {
7177                 /* The following case also applies to X < signed_max+1
7178                    and X >= signed_max+1 because previous transformations.  */
7179                 if (code == LE_EXPR || code == GT_EXPR)
7180                   {
7181                     tree st0, st1;
7182                     st0 = (*lang_hooks.types.signed_type) (TREE_TYPE (arg0));
7183                     st1 = (*lang_hooks.types.signed_type) (TREE_TYPE (arg1));
7184                     return fold
7185                       (build (code == LE_EXPR ? GE_EXPR: LT_EXPR,
7186                               type, convert (st0, arg0),
7187                               convert (st1, integer_zero_node)));
7188                   }
7189               }
7190           }
7191       }
7192
7193       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
7194          a MINUS_EXPR of a constant, we can convert it into a comparison with
7195          a revised constant as long as no overflow occurs.  */
7196       if ((code == EQ_EXPR || code == NE_EXPR)
7197           && TREE_CODE (arg1) == INTEGER_CST
7198           && (TREE_CODE (arg0) == PLUS_EXPR
7199               || TREE_CODE (arg0) == MINUS_EXPR)
7200           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7201           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
7202                                       ? MINUS_EXPR : PLUS_EXPR,
7203                                       arg1, TREE_OPERAND (arg0, 1), 0))
7204           && ! TREE_CONSTANT_OVERFLOW (tem))
7205         return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
7206
7207       /* Similarly for a NEGATE_EXPR.  */
7208       else if ((code == EQ_EXPR || code == NE_EXPR)
7209                && TREE_CODE (arg0) == NEGATE_EXPR
7210                && TREE_CODE (arg1) == INTEGER_CST
7211                && 0 != (tem = negate_expr (arg1))
7212                && TREE_CODE (tem) == INTEGER_CST
7213                && ! TREE_CONSTANT_OVERFLOW (tem))
7214         return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
7215
7216       /* If we have X - Y == 0, we can convert that to X == Y and similarly
7217          for !=.  Don't do this for ordered comparisons due to overflow.  */
7218       else if ((code == NE_EXPR || code == EQ_EXPR)
7219                && integer_zerop (arg1) && TREE_CODE (arg0) == MINUS_EXPR)
7220         return fold (build (code, type,
7221                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1)));
7222
7223       /* If we are widening one operand of an integer comparison,
7224          see if the other operand is similarly being widened.  Perhaps we
7225          can do the comparison in the narrower type.  */
7226       else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
7227                && TREE_CODE (arg0) == NOP_EXPR
7228                && (tem = get_unwidened (arg0, NULL_TREE)) != arg0
7229                && (t1 = get_unwidened (arg1, TREE_TYPE (tem))) != 0
7230                && (TREE_TYPE (t1) == TREE_TYPE (tem)
7231                    || (TREE_CODE (t1) == INTEGER_CST
7232                        && int_fits_type_p (t1, TREE_TYPE (tem)))))
7233         return fold (build (code, type, tem, convert (TREE_TYPE (tem), t1)));
7234
7235       /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
7236          constant, we can simplify it.  */
7237       else if (TREE_CODE (arg1) == INTEGER_CST
7238                && (TREE_CODE (arg0) == MIN_EXPR
7239                    || TREE_CODE (arg0) == MAX_EXPR)
7240                && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
7241         return optimize_minmax_comparison (t);
7242
7243       /* If we are comparing an ABS_EXPR with a constant, we can
7244          convert all the cases into explicit comparisons, but they may
7245          well not be faster than doing the ABS and one comparison.
7246          But ABS (X) <= C is a range comparison, which becomes a subtraction
7247          and a comparison, and is probably faster.  */
7248       else if (code == LE_EXPR && TREE_CODE (arg1) == INTEGER_CST
7249                && TREE_CODE (arg0) == ABS_EXPR
7250                && ! TREE_SIDE_EFFECTS (arg0)
7251                && (0 != (tem = negate_expr (arg1)))
7252                && TREE_CODE (tem) == INTEGER_CST
7253                && ! TREE_CONSTANT_OVERFLOW (tem))
7254         return fold (build (TRUTH_ANDIF_EXPR, type,
7255                             build (GE_EXPR, type, TREE_OPERAND (arg0, 0), tem),
7256                             build (LE_EXPR, type,
7257                                    TREE_OPERAND (arg0, 0), arg1)));
7258
7259       /* If this is an EQ or NE comparison with zero and ARG0 is
7260          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
7261          two operations, but the latter can be done in one less insn
7262          on machines that have only two-operand insns or on which a
7263          constant cannot be the first operand.  */
7264       if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
7265           && TREE_CODE (arg0) == BIT_AND_EXPR)
7266         {
7267           if (TREE_CODE (TREE_OPERAND (arg0, 0)) == LSHIFT_EXPR
7268               && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)))
7269             return
7270               fold (build (code, type,
7271                            build (BIT_AND_EXPR, TREE_TYPE (arg0),
7272                                   build (RSHIFT_EXPR,
7273                                          TREE_TYPE (TREE_OPERAND (arg0, 0)),
7274                                          TREE_OPERAND (arg0, 1),
7275                                          TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)),
7276                                   convert (TREE_TYPE (arg0),
7277                                            integer_one_node)),
7278                            arg1));
7279           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
7280                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
7281             return
7282               fold (build (code, type,
7283                            build (BIT_AND_EXPR, TREE_TYPE (arg0),
7284                                   build (RSHIFT_EXPR,
7285                                          TREE_TYPE (TREE_OPERAND (arg0, 1)),
7286                                          TREE_OPERAND (arg0, 0),
7287                                          TREE_OPERAND (TREE_OPERAND (arg0, 1), 1)),
7288                                   convert (TREE_TYPE (arg0),
7289                                            integer_one_node)),
7290                            arg1));
7291         }
7292
7293       /* If this is an NE or EQ comparison of zero against the result of a
7294          signed MOD operation whose second operand is a power of 2, make
7295          the MOD operation unsigned since it is simpler and equivalent.  */
7296       if ((code == NE_EXPR || code == EQ_EXPR)
7297           && integer_zerop (arg1)
7298           && ! TREE_UNSIGNED (TREE_TYPE (arg0))
7299           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
7300               || TREE_CODE (arg0) == CEIL_MOD_EXPR
7301               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
7302               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
7303           && integer_pow2p (TREE_OPERAND (arg0, 1)))
7304         {
7305           tree newtype = (*lang_hooks.types.unsigned_type) (TREE_TYPE (arg0));
7306           tree newmod = build (TREE_CODE (arg0), newtype,
7307                                convert (newtype, TREE_OPERAND (arg0, 0)),
7308                                convert (newtype, TREE_OPERAND (arg0, 1)));
7309
7310           return build (code, type, newmod, convert (newtype, arg1));
7311         }
7312
7313       /* If this is an NE comparison of zero with an AND of one, remove the
7314          comparison since the AND will give the correct value.  */
7315       if (code == NE_EXPR && integer_zerop (arg1)
7316           && TREE_CODE (arg0) == BIT_AND_EXPR
7317           && integer_onep (TREE_OPERAND (arg0, 1)))
7318         return convert (type, arg0);
7319
7320       /* If we have (A & C) == C where C is a power of 2, convert this into
7321          (A & C) != 0.  Similarly for NE_EXPR.  */
7322       if ((code == EQ_EXPR || code == NE_EXPR)
7323           && TREE_CODE (arg0) == BIT_AND_EXPR
7324           && integer_pow2p (TREE_OPERAND (arg0, 1))
7325           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
7326         return fold (build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
7327                             arg0, integer_zero_node));
7328
7329       /* If we have (A & C) != 0 or (A & C) == 0 and C is a power of
7330          2, then fold the expression into shifts and logical operations.  */
7331       tem = fold_single_bit_test (code, arg0, arg1, type);
7332       if (tem)
7333         return tem;
7334
7335       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
7336          Similarly for NE_EXPR.  */
7337       if ((code == EQ_EXPR || code == NE_EXPR)
7338           && TREE_CODE (arg0) == BIT_AND_EXPR
7339           && TREE_CODE (arg1) == INTEGER_CST
7340           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
7341         {
7342           tree dandnotc = fold (build (BIT_ANDTC_EXPR, TREE_TYPE (arg0),
7343                                        arg1, TREE_OPERAND (arg0, 1)));
7344           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
7345           if (!integer_zerop (dandnotc))
7346             return omit_one_operand (type, rslt, arg0);
7347         }
7348
7349       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
7350          Similarly for NE_EXPR.  */
7351       if ((code == EQ_EXPR || code == NE_EXPR)
7352           && TREE_CODE (arg0) == BIT_IOR_EXPR
7353           && TREE_CODE (arg1) == INTEGER_CST
7354           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
7355         {
7356           tree candnotd = fold (build (BIT_ANDTC_EXPR, TREE_TYPE (arg0),
7357                                        TREE_OPERAND (arg0, 1), arg1));
7358           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
7359           if (!integer_zerop (candnotd))
7360             return omit_one_operand (type, rslt, arg0);
7361         }
7362
7363       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
7364          and similarly for >= into !=.  */
7365       if ((code == LT_EXPR || code == GE_EXPR)
7366           && TREE_UNSIGNED (TREE_TYPE (arg0))
7367           && TREE_CODE (arg1) == LSHIFT_EXPR
7368           && integer_onep (TREE_OPERAND (arg1, 0)))
7369         return build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
7370                       build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
7371                              TREE_OPERAND (arg1, 1)),
7372                       convert (TREE_TYPE (arg0), integer_zero_node));
7373
7374       else if ((code == LT_EXPR || code == GE_EXPR)
7375                && TREE_UNSIGNED (TREE_TYPE (arg0))
7376                && (TREE_CODE (arg1) == NOP_EXPR
7377                    || TREE_CODE (arg1) == CONVERT_EXPR)
7378                && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
7379                && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
7380         return
7381           build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
7382                  convert (TREE_TYPE (arg0),
7383                           build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
7384                                  TREE_OPERAND (TREE_OPERAND (arg1, 0), 1))),
7385                  convert (TREE_TYPE (arg0), integer_zero_node));
7386
7387       /* Simplify comparison of something with itself.  (For IEEE
7388          floating-point, we can only do some of these simplifications.)  */
7389       if (operand_equal_p (arg0, arg1, 0))
7390         {
7391           switch (code)
7392             {
7393             case EQ_EXPR:
7394             case GE_EXPR:
7395             case LE_EXPR:
7396               if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
7397                   || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
7398                 return constant_boolean_node (1, type);
7399               code = EQ_EXPR;
7400               if (t == orig_t)
7401                 t = copy_node (t);
7402               TREE_SET_CODE (t, code);
7403               break;
7404
7405             case NE_EXPR:
7406               /* For NE, we can only do this simplification if integer
7407                  or we don't honor IEEE floating point NaNs.  */
7408               if (FLOAT_TYPE_P (TREE_TYPE (arg0))
7409                   && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
7410                 break;
7411               /* ... fall through ...  */
7412             case GT_EXPR:
7413             case LT_EXPR:
7414               return constant_boolean_node (0, type);
7415             default:
7416               abort ();
7417             }
7418         }
7419
7420       /* If we are comparing an expression that just has comparisons
7421          of two integer values, arithmetic expressions of those comparisons,
7422          and constants, we can simplify it.  There are only three cases
7423          to check: the two values can either be equal, the first can be
7424          greater, or the second can be greater.  Fold the expression for
7425          those three values.  Since each value must be 0 or 1, we have
7426          eight possibilities, each of which corresponds to the constant 0
7427          or 1 or one of the six possible comparisons.
7428
7429          This handles common cases like (a > b) == 0 but also handles
7430          expressions like  ((x > y) - (y > x)) > 0, which supposedly
7431          occur in macroized code.  */
7432
7433       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
7434         {
7435           tree cval1 = 0, cval2 = 0;
7436           int save_p = 0;
7437
7438           if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
7439               /* Don't handle degenerate cases here; they should already
7440                  have been handled anyway.  */
7441               && cval1 != 0 && cval2 != 0
7442               && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
7443               && TREE_TYPE (cval1) == TREE_TYPE (cval2)
7444               && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
7445               && TYPE_MAX_VALUE (TREE_TYPE (cval1))
7446               && TYPE_MAX_VALUE (TREE_TYPE (cval2))
7447               && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
7448                                     TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
7449             {
7450               tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
7451               tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
7452
7453               /* We can't just pass T to eval_subst in case cval1 or cval2
7454                  was the same as ARG1.  */
7455
7456               tree high_result
7457                 = fold (build (code, type,
7458                                eval_subst (arg0, cval1, maxval, cval2, minval),
7459                                arg1));
7460               tree equal_result
7461                 = fold (build (code, type,
7462                                eval_subst (arg0, cval1, maxval, cval2, maxval),
7463                                arg1));
7464               tree low_result
7465                 = fold (build (code, type,
7466                                eval_subst (arg0, cval1, minval, cval2, maxval),
7467                                arg1));
7468
7469               /* All three of these results should be 0 or 1.  Confirm they
7470                  are.  Then use those values to select the proper code
7471                  to use.  */
7472
7473               if ((integer_zerop (high_result)
7474                    || integer_onep (high_result))
7475                   && (integer_zerop (equal_result)
7476                       || integer_onep (equal_result))
7477                   && (integer_zerop (low_result)
7478                       || integer_onep (low_result)))
7479                 {
7480                   /* Make a 3-bit mask with the high-order bit being the
7481                      value for `>', the next for '=', and the low for '<'.  */
7482                   switch ((integer_onep (high_result) * 4)
7483                           + (integer_onep (equal_result) * 2)
7484                           + integer_onep (low_result))
7485                     {
7486                     case 0:
7487                       /* Always false.  */
7488                       return omit_one_operand (type, integer_zero_node, arg0);
7489                     case 1:
7490                       code = LT_EXPR;
7491                       break;
7492                     case 2:
7493                       code = EQ_EXPR;
7494                       break;
7495                     case 3:
7496                       code = LE_EXPR;
7497                       break;
7498                     case 4:
7499                       code = GT_EXPR;
7500                       break;
7501                     case 5:
7502                       code = NE_EXPR;
7503                       break;
7504                     case 6:
7505                       code = GE_EXPR;
7506                       break;
7507                     case 7:
7508                       /* Always true.  */
7509                       return omit_one_operand (type, integer_one_node, arg0);
7510                     }
7511
7512                   t = build (code, type, cval1, cval2);
7513                   if (save_p)
7514                     return save_expr (t);
7515                   else
7516                     return fold (t);
7517                 }
7518             }
7519         }
7520
7521       /* If this is a comparison of a field, we may be able to simplify it.  */
7522       if (((TREE_CODE (arg0) == COMPONENT_REF
7523             && (*lang_hooks.can_use_bit_fields_p) ())
7524            || TREE_CODE (arg0) == BIT_FIELD_REF)
7525           && (code == EQ_EXPR || code == NE_EXPR)
7526           /* Handle the constant case even without -O
7527              to make sure the warnings are given.  */
7528           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
7529         {
7530           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
7531           return t1 ? t1 : t;
7532         }
7533
7534       /* If this is a comparison of complex values and either or both sides
7535          are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
7536          comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
7537          This may prevent needless evaluations.  */
7538       if ((code == EQ_EXPR || code == NE_EXPR)
7539           && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
7540           && (TREE_CODE (arg0) == COMPLEX_EXPR
7541               || TREE_CODE (arg1) == COMPLEX_EXPR
7542               || TREE_CODE (arg0) == COMPLEX_CST
7543               || TREE_CODE (arg1) == COMPLEX_CST))
7544         {
7545           tree subtype = TREE_TYPE (TREE_TYPE (arg0));
7546           tree real0, imag0, real1, imag1;
7547
7548           arg0 = save_expr (arg0);
7549           arg1 = save_expr (arg1);
7550           real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
7551           imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
7552           real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
7553           imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
7554
7555           return fold (build ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
7556                                : TRUTH_ORIF_EXPR),
7557                               type,
7558                               fold (build (code, type, real0, real1)),
7559                               fold (build (code, type, imag0, imag1))));
7560         }
7561
7562       /* Optimize comparisons of strlen vs zero to a compare of the
7563          first character of the string vs zero.  To wit,
7564                 strlen(ptr) == 0   =>  *ptr == 0
7565                 strlen(ptr) != 0   =>  *ptr != 0
7566          Other cases should reduce to one of these two (or a constant)
7567          due to the return value of strlen being unsigned.  */
7568       if ((code == EQ_EXPR || code == NE_EXPR)
7569           && integer_zerop (arg1)
7570           && TREE_CODE (arg0) == CALL_EXPR
7571           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ADDR_EXPR)
7572         {
7573           tree fndecl = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7574           tree arglist;
7575
7576           if (TREE_CODE (fndecl) == FUNCTION_DECL
7577               && DECL_BUILT_IN (fndecl)
7578               && DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_MD
7579               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
7580               && (arglist = TREE_OPERAND (arg0, 1))
7581               && TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
7582               && ! TREE_CHAIN (arglist))
7583             return fold (build (code, type,
7584                                 build1 (INDIRECT_REF, char_type_node,
7585                                         TREE_VALUE(arglist)),
7586                                 integer_zero_node));
7587         }
7588
7589       /* From here on, the only cases we handle are when the result is
7590          known to be a constant.
7591
7592          To compute GT, swap the arguments and do LT.
7593          To compute GE, do LT and invert the result.
7594          To compute LE, swap the arguments, do LT and invert the result.
7595          To compute NE, do EQ and invert the result.
7596
7597          Therefore, the code below must handle only EQ and LT.  */
7598
7599       if (code == LE_EXPR || code == GT_EXPR)
7600         {
7601           tem = arg0, arg0 = arg1, arg1 = tem;
7602           code = swap_tree_comparison (code);
7603         }
7604
7605       /* Note that it is safe to invert for real values here because we
7606          will check below in the one case that it matters.  */
7607
7608       t1 = NULL_TREE;
7609       invert = 0;
7610       if (code == NE_EXPR || code == GE_EXPR)
7611         {
7612           invert = 1;
7613           code = invert_tree_comparison (code);
7614         }
7615
7616       /* Compute a result for LT or EQ if args permit;
7617          otherwise return T.  */
7618       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
7619         {
7620           if (code == EQ_EXPR)
7621             t1 = build_int_2 (tree_int_cst_equal (arg0, arg1), 0);
7622           else
7623             t1 = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0))
7624                                ? INT_CST_LT_UNSIGNED (arg0, arg1)
7625                                : INT_CST_LT (arg0, arg1)),
7626                               0);
7627         }
7628
7629 #if 0 /* This is no longer useful, but breaks some real code.  */
7630       /* Assume a nonexplicit constant cannot equal an explicit one,
7631          since such code would be undefined anyway.
7632          Exception: on sysvr4, using #pragma weak,
7633          a label can come out as 0.  */
7634       else if (TREE_CODE (arg1) == INTEGER_CST
7635                && !integer_zerop (arg1)
7636                && TREE_CONSTANT (arg0)
7637                && TREE_CODE (arg0) == ADDR_EXPR
7638                && code == EQ_EXPR)
7639         t1 = build_int_2 (0, 0);
7640 #endif
7641       /* Two real constants can be compared explicitly.  */
7642       else if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
7643         {
7644           /* If either operand is a NaN, the result is false with two
7645              exceptions: First, an NE_EXPR is true on NaNs, but that case
7646              is already handled correctly since we will be inverting the
7647              result for NE_EXPR.  Second, if we had inverted a LE_EXPR
7648              or a GE_EXPR into a LT_EXPR, we must return true so that it
7649              will be inverted into false.  */
7650
7651           if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
7652               || REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
7653             t1 = build_int_2 (invert && code == LT_EXPR, 0);
7654
7655           else if (code == EQ_EXPR)
7656             t1 = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
7657                                                  TREE_REAL_CST (arg1)),
7658                               0);
7659           else
7660             t1 = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0),
7661                                                 TREE_REAL_CST (arg1)),
7662                               0);
7663         }
7664
7665       if (t1 == NULL_TREE)
7666         return t;
7667
7668       if (invert)
7669         TREE_INT_CST_LOW (t1) ^= 1;
7670
7671       TREE_TYPE (t1) = type;
7672       if (TREE_CODE (type) == BOOLEAN_TYPE)
7673         return (*lang_hooks.truthvalue_conversion) (t1);
7674       return t1;
7675
7676     case COND_EXPR:
7677       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
7678          so all simple results must be passed through pedantic_non_lvalue.  */
7679       if (TREE_CODE (arg0) == INTEGER_CST)
7680         return pedantic_non_lvalue
7681           (TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1)));
7682       else if (operand_equal_p (arg1, TREE_OPERAND (expr, 2), 0))
7683         return pedantic_omit_one_operand (type, arg1, arg0);
7684
7685       /* If the second operand is zero, invert the comparison and swap
7686          the second and third operands.  Likewise if the second operand
7687          is constant and the third is not or if the third operand is
7688          equivalent to the first operand of the comparison.  */
7689
7690       if (integer_zerop (arg1)
7691           || (TREE_CONSTANT (arg1) && ! TREE_CONSTANT (TREE_OPERAND (t, 2)))
7692           || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
7693               && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
7694                                                  TREE_OPERAND (t, 2),
7695                                                  TREE_OPERAND (arg0, 1))))
7696         {
7697           /* See if this can be inverted.  If it can't, possibly because
7698              it was a floating-point inequality comparison, don't do
7699              anything.  */
7700           tem = invert_truthvalue (arg0);
7701
7702           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
7703             {
7704               t = build (code, type, tem,
7705                          TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
7706               arg0 = tem;
7707               /* arg1 should be the first argument of the new T.  */
7708               arg1 = TREE_OPERAND (t, 1);
7709               STRIP_NOPS (arg1);
7710             }
7711         }
7712
7713       /* If we have A op B ? A : C, we may be able to convert this to a
7714          simpler expression, depending on the operation and the values
7715          of B and C.  Signed zeros prevent all of these transformations,
7716          for reasons given above each one.  */
7717
7718       if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
7719           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
7720                                              arg1, TREE_OPERAND (arg0, 1))
7721           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
7722         {
7723           tree arg2 = TREE_OPERAND (t, 2);
7724           enum tree_code comp_code = TREE_CODE (arg0);
7725
7726           STRIP_NOPS (arg2);
7727
7728           /* If we have A op 0 ? A : -A, consider applying the following
7729              transformations:
7730
7731              A == 0? A : -A    same as -A
7732              A != 0? A : -A    same as A
7733              A >= 0? A : -A    same as abs (A)
7734              A > 0?  A : -A    same as abs (A)
7735              A <= 0? A : -A    same as -abs (A)
7736              A < 0?  A : -A    same as -abs (A)
7737
7738              None of these transformations work for modes with signed
7739              zeros.  If A is +/-0, the first two transformations will
7740              change the sign of the result (from +0 to -0, or vice
7741              versa).  The last four will fix the sign of the result,
7742              even though the original expressions could be positive or
7743              negative, depending on the sign of A.
7744
7745              Note that all these transformations are correct if A is
7746              NaN, since the two alternatives (A and -A) are also NaNs.  */
7747           if ((FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 1)))
7748                ? real_zerop (TREE_OPERAND (arg0, 1))
7749                : integer_zerop (TREE_OPERAND (arg0, 1)))
7750               && TREE_CODE (arg2) == NEGATE_EXPR
7751               && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
7752             switch (comp_code)
7753               {
7754               case EQ_EXPR:
7755                 return
7756                   pedantic_non_lvalue
7757                     (convert (type,
7758                               negate_expr
7759                               (convert (TREE_TYPE (TREE_OPERAND (t, 1)),
7760                                         arg1))));
7761               case NE_EXPR:
7762                 return pedantic_non_lvalue (convert (type, arg1));
7763               case GE_EXPR:
7764               case GT_EXPR:
7765                 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
7766                   arg1 = convert ((*lang_hooks.types.signed_type)
7767                                   (TREE_TYPE (arg1)), arg1);
7768                 return pedantic_non_lvalue
7769                   (convert (type, fold (build1 (ABS_EXPR,
7770                                                 TREE_TYPE (arg1), arg1))));
7771               case LE_EXPR:
7772               case LT_EXPR:
7773                 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
7774                   arg1 = convert ((lang_hooks.types.signed_type)
7775                                   (TREE_TYPE (arg1)), arg1);
7776                 return pedantic_non_lvalue
7777                   (negate_expr (convert (type,
7778                                          fold (build1 (ABS_EXPR,
7779                                                        TREE_TYPE (arg1),
7780                                                        arg1)))));
7781               default:
7782                 abort ();
7783               }
7784
7785           /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
7786              A == 0 ? A : 0 is always 0 unless A is -0.  Note that
7787              both transformations are correct when A is NaN: A != 0
7788              is then true, and A == 0 is false.  */
7789
7790           if (integer_zerop (TREE_OPERAND (arg0, 1)) && integer_zerop (arg2))
7791             {
7792               if (comp_code == NE_EXPR)
7793                 return pedantic_non_lvalue (convert (type, arg1));
7794               else if (comp_code == EQ_EXPR)
7795                 return pedantic_non_lvalue (convert (type, integer_zero_node));
7796             }
7797
7798           /* Try some transformations of A op B ? A : B.
7799
7800              A == B? A : B    same as B
7801              A != B? A : B    same as A
7802              A >= B? A : B    same as max (A, B)
7803              A > B?  A : B    same as max (B, A)
7804              A <= B? A : B    same as min (A, B)
7805              A < B?  A : B    same as min (B, A)
7806
7807              As above, these transformations don't work in the presence
7808              of signed zeros.  For example, if A and B are zeros of
7809              opposite sign, the first two transformations will change
7810              the sign of the result.  In the last four, the original
7811              expressions give different results for (A=+0, B=-0) and
7812              (A=-0, B=+0), but the transformed expressions do not.
7813
7814              The first two transformations are correct if either A or B
7815              is a NaN.  In the first transformation, the condition will
7816              be false, and B will indeed be chosen.  In the case of the
7817              second transformation, the condition A != B will be true,
7818              and A will be chosen.
7819
7820              The conversions to max() and min() are not correct if B is
7821              a number and A is not.  The conditions in the original
7822              expressions will be false, so all four give B.  The min()
7823              and max() versions would give a NaN instead.  */
7824           if (operand_equal_for_comparison_p (TREE_OPERAND (arg0, 1),
7825                                               arg2, TREE_OPERAND (arg0, 0)))
7826             {
7827               tree comp_op0 = TREE_OPERAND (arg0, 0);
7828               tree comp_op1 = TREE_OPERAND (arg0, 1);
7829               tree comp_type = TREE_TYPE (comp_op0);
7830
7831               /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
7832               if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
7833                 {
7834                   comp_type = type;
7835                   comp_op0 = arg1;
7836                   comp_op1 = arg2;
7837                 }
7838
7839               switch (comp_code)
7840                 {
7841                 case EQ_EXPR:
7842                   return pedantic_non_lvalue (convert (type, arg2));
7843                 case NE_EXPR:
7844                   return pedantic_non_lvalue (convert (type, arg1));
7845                 case LE_EXPR:
7846                 case LT_EXPR:
7847                   /* In C++ a ?: expression can be an lvalue, so put the
7848                      operand which will be used if they are equal first
7849                      so that we can convert this back to the
7850                      corresponding COND_EXPR.  */
7851                   if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
7852                     return pedantic_non_lvalue
7853                       (convert (type, fold (build (MIN_EXPR, comp_type,
7854                                                    (comp_code == LE_EXPR
7855                                                     ? comp_op0 : comp_op1),
7856                                                    (comp_code == LE_EXPR
7857                                                     ? comp_op1 : comp_op0)))));
7858                   break;
7859                 case GE_EXPR:
7860                 case GT_EXPR:
7861                   if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
7862                     return pedantic_non_lvalue
7863                       (convert (type, fold (build (MAX_EXPR, comp_type,
7864                                                    (comp_code == GE_EXPR
7865                                                     ? comp_op0 : comp_op1),
7866                                                    (comp_code == GE_EXPR
7867                                                     ? comp_op1 : comp_op0)))));
7868                   break;
7869                 default:
7870                   abort ();
7871                 }
7872             }
7873
7874           /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
7875              we might still be able to simplify this.  For example,
7876              if C1 is one less or one more than C2, this might have started
7877              out as a MIN or MAX and been transformed by this function.
7878              Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
7879
7880           if (INTEGRAL_TYPE_P (type)
7881               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7882               && TREE_CODE (arg2) == INTEGER_CST)
7883             switch (comp_code)
7884               {
7885               case EQ_EXPR:
7886                 /* We can replace A with C1 in this case.  */
7887                 arg1 = convert (type, TREE_OPERAND (arg0, 1));
7888                 t = build (code, type, TREE_OPERAND (t, 0), arg1,
7889                            TREE_OPERAND (t, 2));
7890                 break;
7891
7892               case LT_EXPR:
7893                 /* If C1 is C2 + 1, this is min(A, C2).  */
7894                 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
7895                     && operand_equal_p (TREE_OPERAND (arg0, 1),
7896                                         const_binop (PLUS_EXPR, arg2,
7897                                                      integer_one_node, 0), 1))
7898                   return pedantic_non_lvalue
7899                     (fold (build (MIN_EXPR, type, arg1, arg2)));
7900                 break;
7901
7902               case LE_EXPR:
7903                 /* If C1 is C2 - 1, this is min(A, C2).  */
7904                 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
7905                     && operand_equal_p (TREE_OPERAND (arg0, 1),
7906                                         const_binop (MINUS_EXPR, arg2,
7907                                                      integer_one_node, 0), 1))
7908                   return pedantic_non_lvalue
7909                     (fold (build (MIN_EXPR, type, arg1, arg2)));
7910                 break;
7911
7912               case GT_EXPR:
7913                 /* If C1 is C2 - 1, this is max(A, C2).  */
7914                 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
7915                     && operand_equal_p (TREE_OPERAND (arg0, 1),
7916                                         const_binop (MINUS_EXPR, arg2,
7917                                                      integer_one_node, 0), 1))
7918                   return pedantic_non_lvalue
7919                     (fold (build (MAX_EXPR, type, arg1, arg2)));
7920                 break;
7921
7922               case GE_EXPR:
7923                 /* If C1 is C2 + 1, this is max(A, C2).  */
7924                 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
7925                     && operand_equal_p (TREE_OPERAND (arg0, 1),
7926                                         const_binop (PLUS_EXPR, arg2,
7927                                                      integer_one_node, 0), 1))
7928                   return pedantic_non_lvalue
7929                     (fold (build (MAX_EXPR, type, arg1, arg2)));
7930                 break;
7931               case NE_EXPR:
7932                 break;
7933               default:
7934                 abort ();
7935               }
7936         }
7937
7938       /* If the second operand is simpler than the third, swap them
7939          since that produces better jump optimization results.  */
7940       if ((TREE_CONSTANT (arg1) || DECL_P (arg1)
7941            || TREE_CODE (arg1) == SAVE_EXPR)
7942           && ! (TREE_CONSTANT (TREE_OPERAND (t, 2))
7943                 || DECL_P (TREE_OPERAND (t, 2))
7944                 || TREE_CODE (TREE_OPERAND (t, 2)) == SAVE_EXPR))
7945         {
7946           /* See if this can be inverted.  If it can't, possibly because
7947              it was a floating-point inequality comparison, don't do
7948              anything.  */
7949           tem = invert_truthvalue (arg0);
7950
7951           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
7952             {
7953               t = build (code, type, tem,
7954                          TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
7955               arg0 = tem;
7956               /* arg1 should be the first argument of the new T.  */
7957               arg1 = TREE_OPERAND (t, 1);
7958               STRIP_NOPS (arg1);
7959             }
7960         }
7961
7962       /* Convert A ? 1 : 0 to simply A.  */
7963       if (integer_onep (TREE_OPERAND (t, 1))
7964           && integer_zerop (TREE_OPERAND (t, 2))
7965           /* If we try to convert TREE_OPERAND (t, 0) to our type, the
7966              call to fold will try to move the conversion inside
7967              a COND, which will recurse.  In that case, the COND_EXPR
7968              is probably the best choice, so leave it alone.  */
7969           && type == TREE_TYPE (arg0))
7970         return pedantic_non_lvalue (arg0);
7971
7972       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
7973          over COND_EXPR in cases such as floating point comparisons.  */
7974       if (integer_zerop (TREE_OPERAND (t, 1))
7975           && integer_onep (TREE_OPERAND (t, 2))
7976           && truth_value_p (TREE_CODE (arg0)))
7977         return pedantic_non_lvalue (convert (type,
7978                                              invert_truthvalue (arg0)));
7979
7980       /* Look for expressions of the form A & 2 ? 2 : 0.  The result of this
7981          operation is simply A & 2.  */
7982
7983       if (integer_zerop (TREE_OPERAND (t, 2))
7984           && TREE_CODE (arg0) == NE_EXPR
7985           && integer_zerop (TREE_OPERAND (arg0, 1))
7986           && integer_pow2p (arg1)
7987           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
7988           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
7989                               arg1, 1))
7990         return pedantic_non_lvalue (convert (type, TREE_OPERAND (arg0, 0)));
7991
7992       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
7993       if (integer_zerop (TREE_OPERAND (t, 2))
7994           && truth_value_p (TREE_CODE (arg0))
7995           && truth_value_p (TREE_CODE (arg1)))
7996         return pedantic_non_lvalue (fold (build (TRUTH_ANDIF_EXPR, type,
7997                                                  arg0, arg1)));
7998
7999       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
8000       if (integer_onep (TREE_OPERAND (t, 2))
8001           && truth_value_p (TREE_CODE (arg0))
8002           && truth_value_p (TREE_CODE (arg1)))
8003         {
8004           /* Only perform transformation if ARG0 is easily inverted.  */
8005           tem = invert_truthvalue (arg0);
8006           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
8007             return pedantic_non_lvalue (fold (build (TRUTH_ORIF_EXPR, type,
8008                                                      tem, arg1)));
8009         }
8010
8011       return t;
8012
8013     case COMPOUND_EXPR:
8014       /* When pedantic, a compound expression can be neither an lvalue
8015          nor an integer constant expression.  */
8016       if (TREE_SIDE_EFFECTS (arg0) || pedantic)
8017         return t;
8018       /* Don't let (0, 0) be null pointer constant.  */
8019       if (integer_zerop (arg1))
8020         return build1 (NOP_EXPR, type, arg1);
8021       return convert (type, arg1);
8022
8023     case COMPLEX_EXPR:
8024       if (wins)
8025         return build_complex (type, arg0, arg1);
8026       return t;
8027
8028     case REALPART_EXPR:
8029       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8030         return t;
8031       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
8032         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8033                                  TREE_OPERAND (arg0, 1));
8034       else if (TREE_CODE (arg0) == COMPLEX_CST)
8035         return TREE_REALPART (arg0);
8036       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8037         return fold (build (TREE_CODE (arg0), type,
8038                             fold (build1 (REALPART_EXPR, type,
8039                                           TREE_OPERAND (arg0, 0))),
8040                             fold (build1 (REALPART_EXPR,
8041                                           type, TREE_OPERAND (arg0, 1)))));
8042       return t;
8043
8044     case IMAGPART_EXPR:
8045       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8046         return convert (type, integer_zero_node);
8047       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
8048         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8049                                  TREE_OPERAND (arg0, 0));
8050       else if (TREE_CODE (arg0) == COMPLEX_CST)
8051         return TREE_IMAGPART (arg0);
8052       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8053         return fold (build (TREE_CODE (arg0), type,
8054                             fold (build1 (IMAGPART_EXPR, type,
8055                                           TREE_OPERAND (arg0, 0))),
8056                             fold (build1 (IMAGPART_EXPR, type,
8057                                           TREE_OPERAND (arg0, 1)))));
8058       return t;
8059
8060       /* Pull arithmetic ops out of the CLEANUP_POINT_EXPR where
8061          appropriate.  */
8062     case CLEANUP_POINT_EXPR:
8063       if (! has_cleanups (arg0))
8064         return TREE_OPERAND (t, 0);
8065
8066       {
8067         enum tree_code code0 = TREE_CODE (arg0);
8068         int kind0 = TREE_CODE_CLASS (code0);
8069         tree arg00 = TREE_OPERAND (arg0, 0);
8070         tree arg01;
8071
8072         if (kind0 == '1' || code0 == TRUTH_NOT_EXPR)
8073           return fold (build1 (code0, type,
8074                                fold (build1 (CLEANUP_POINT_EXPR,
8075                                              TREE_TYPE (arg00), arg00))));
8076
8077         if (kind0 == '<' || kind0 == '2'
8078             || code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR
8079             || code0 == TRUTH_AND_EXPR   || code0 == TRUTH_OR_EXPR
8080             || code0 == TRUTH_XOR_EXPR)
8081           {
8082             arg01 = TREE_OPERAND (arg0, 1);
8083
8084             if (TREE_CONSTANT (arg00)
8085                 || ((code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR)
8086                     && ! has_cleanups (arg00)))
8087               return fold (build (code0, type, arg00,
8088                                   fold (build1 (CLEANUP_POINT_EXPR,
8089                                                 TREE_TYPE (arg01), arg01))));
8090
8091             if (TREE_CONSTANT (arg01))
8092               return fold (build (code0, type,
8093                                   fold (build1 (CLEANUP_POINT_EXPR,
8094                                                 TREE_TYPE (arg00), arg00)),
8095                                   arg01));
8096           }
8097
8098         return t;
8099       }
8100
8101     case CALL_EXPR:
8102       /* Check for a built-in function.  */
8103       if (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR
8104           && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (expr, 0), 0))
8105               == FUNCTION_DECL)
8106           && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (expr, 0), 0)))
8107         {
8108           tree tmp = fold_builtin (expr);
8109           if (tmp)
8110             return tmp;
8111         }
8112       return t;
8113
8114     default:
8115       return t;
8116     } /* switch (code) */
8117 }
8118
8119 #ifdef ENABLE_FOLD_CHECKING
8120 #undef fold
8121
8122 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
8123 static void fold_check_failed (tree, tree);
8124 void print_fold_checksum (tree);
8125
8126 /* When --enable-checking=fold, compute a digest of expr before
8127    and after actual fold call to see if fold did not accidentally
8128    change original expr.  */
8129
8130 tree
8131 fold (tree expr)
8132 {
8133   tree ret;
8134   struct md5_ctx ctx;
8135   unsigned char checksum_before[16], checksum_after[16];
8136   htab_t ht;
8137
8138   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
8139   md5_init_ctx (&ctx);
8140   fold_checksum_tree (expr, &ctx, ht);
8141   md5_finish_ctx (&ctx, checksum_before);
8142   htab_empty (ht);
8143
8144   ret = fold_1 (expr);
8145
8146   md5_init_ctx (&ctx);
8147   fold_checksum_tree (expr, &ctx, ht);
8148   md5_finish_ctx (&ctx, checksum_after);
8149   htab_delete (ht);
8150
8151   if (memcmp (checksum_before, checksum_after, 16))
8152     fold_check_failed (expr, ret);
8153
8154   return ret;
8155 }
8156
8157 void
8158 print_fold_checksum (tree expr)
8159 {
8160   struct md5_ctx ctx;
8161   unsigned char checksum[16], cnt;
8162   htab_t ht;
8163
8164   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
8165   md5_init_ctx (&ctx);
8166   fold_checksum_tree (expr, &ctx, ht);
8167   md5_finish_ctx (&ctx, checksum);
8168   htab_delete (ht);
8169   for (cnt = 0; cnt < 16; ++cnt)
8170     fprintf (stderr, "%02x", checksum[cnt]);
8171   putc ('\n', stderr);
8172 }
8173
8174 static void
8175 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
8176 {
8177   internal_error ("fold check: original tree changed by fold");
8178 }
8179
8180 static void
8181 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
8182 {
8183   void **slot;
8184   enum tree_code code;
8185   char buf[sizeof (struct tree_decl)];
8186   int i, len;
8187
8188   if (sizeof (struct tree_exp) + 5 * sizeof (tree)
8189       > sizeof (struct tree_decl)
8190       || sizeof (struct tree_type) > sizeof (struct tree_decl))
8191     abort ();
8192   if (expr == NULL)
8193     return;
8194   slot = htab_find_slot (ht, expr, INSERT);
8195   if (*slot != NULL)
8196     return;
8197   *slot = expr;
8198   code = TREE_CODE (expr);
8199   if (code == SAVE_EXPR && SAVE_EXPR_NOPLACEHOLDER (expr))
8200     {
8201       /* Allow SAVE_EXPR_NOPLACEHOLDER flag to be modified.  */
8202       memcpy (buf, expr, tree_size (expr));
8203       expr = (tree) buf;
8204       SAVE_EXPR_NOPLACEHOLDER (expr) = 0;
8205     }
8206   else if (TREE_CODE_CLASS (code) == 'd' && DECL_ASSEMBLER_NAME_SET_P (expr))
8207     {
8208       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
8209       memcpy (buf, expr, tree_size (expr));
8210       expr = (tree) buf;
8211       SET_DECL_ASSEMBLER_NAME (expr, NULL);
8212     }
8213   else if (TREE_CODE_CLASS (code) == 't'
8214            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)))
8215     {
8216       /* Allow TYPE_POINTER_TO and TYPE_REFERENCE_TO to be modified.  */
8217       memcpy (buf, expr, tree_size (expr));
8218       expr = (tree) buf;
8219       TYPE_POINTER_TO (expr) = NULL;
8220       TYPE_REFERENCE_TO (expr) = NULL;
8221     }
8222   md5_process_bytes (expr, tree_size (expr), ctx);
8223   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
8224   if (TREE_CODE_CLASS (code) != 't' && TREE_CODE_CLASS (code) != 'd')
8225     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
8226   len = TREE_CODE_LENGTH (code);
8227   switch (TREE_CODE_CLASS (code))
8228     {
8229     case 'c':
8230       switch (code)
8231         {
8232         case STRING_CST:
8233           md5_process_bytes (TREE_STRING_POINTER (expr),
8234                              TREE_STRING_LENGTH (expr), ctx);
8235           break;
8236         case COMPLEX_CST:
8237           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
8238           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
8239           break;
8240         case VECTOR_CST:
8241           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
8242           break;
8243         default:
8244           break;
8245         }
8246       break;
8247     case 'x':
8248       switch (code)
8249         {
8250         case TREE_LIST:
8251           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
8252           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
8253           break;
8254         case TREE_VEC:
8255           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
8256             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
8257           break;
8258         default:
8259           break;
8260         }
8261       break;
8262     case 'e':
8263       switch (code)
8264         {
8265         case SAVE_EXPR: len = 2; break;
8266         case GOTO_SUBROUTINE_EXPR: len = 0; break;
8267         case RTL_EXPR: len = 0; break;
8268         case WITH_CLEANUP_EXPR: len = 2; break;
8269         default: break;
8270         }
8271       /* FALLTHROUGH */
8272     case 'r':
8273     case '<':
8274     case '1':
8275     case '2':
8276     case 's':
8277       for (i = 0; i < len; ++i)
8278         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
8279       break;
8280     case 'd':
8281       fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
8282       fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
8283       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
8284       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
8285       fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
8286       fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
8287       fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
8288       fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
8289       fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
8290       fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
8291       fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
8292       break;
8293     case 't':
8294       fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
8295       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
8296       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
8297       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
8298       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
8299       fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
8300       fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
8301       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
8302       fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
8303       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
8304       break;
8305     default:
8306       break;
8307     }
8308 }
8309
8310 #endif
8311
8312 /* Perform constant folding and related simplification of intializer
8313    expression EXPR.  This behaves identically to "fold" but ignores
8314    potential run-time traps and exceptions that fold must preserve.  */
8315
8316 tree
8317 fold_initializer (tree expr)
8318 {
8319   int saved_signaling_nans = flag_signaling_nans;
8320   int saved_trapping_math = flag_trapping_math;
8321   int saved_trapv = flag_trapv;
8322   tree result;
8323
8324   flag_signaling_nans = 0;
8325   flag_trapping_math = 0;
8326   flag_trapv = 0;
8327
8328   result = fold (expr);
8329
8330   flag_signaling_nans = saved_signaling_nans;
8331   flag_trapping_math = saved_trapping_math;
8332   flag_trapv = saved_trapv;
8333
8334   return result;
8335 }
8336
8337 /* Determine if first argument is a multiple of second argument.  Return 0 if
8338    it is not, or we cannot easily determined it to be.
8339
8340    An example of the sort of thing we care about (at this point; this routine
8341    could surely be made more general, and expanded to do what the *_DIV_EXPR's
8342    fold cases do now) is discovering that
8343
8344      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
8345
8346    is a multiple of
8347
8348      SAVE_EXPR (J * 8)
8349
8350    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
8351
8352    This code also handles discovering that
8353
8354      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
8355
8356    is a multiple of 8 so we don't have to worry about dealing with a
8357    possible remainder.
8358
8359    Note that we *look* inside a SAVE_EXPR only to determine how it was
8360    calculated; it is not safe for fold to do much of anything else with the
8361    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
8362    at run time.  For example, the latter example above *cannot* be implemented
8363    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
8364    evaluation time of the original SAVE_EXPR is not necessarily the same at
8365    the time the new expression is evaluated.  The only optimization of this
8366    sort that would be valid is changing
8367
8368      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
8369
8370    divided by 8 to
8371
8372      SAVE_EXPR (I) * SAVE_EXPR (J)
8373
8374    (where the same SAVE_EXPR (J) is used in the original and the
8375    transformed version).  */
8376
8377 static int
8378 multiple_of_p (tree type, tree top, tree bottom)
8379 {
8380   if (operand_equal_p (top, bottom, 0))
8381     return 1;
8382
8383   if (TREE_CODE (type) != INTEGER_TYPE)
8384     return 0;
8385
8386   switch (TREE_CODE (top))
8387     {
8388     case MULT_EXPR:
8389       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
8390               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
8391
8392     case PLUS_EXPR:
8393     case MINUS_EXPR:
8394       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
8395               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
8396
8397     case LSHIFT_EXPR:
8398       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
8399         {
8400           tree op1, t1;
8401
8402           op1 = TREE_OPERAND (top, 1);
8403           /* const_binop may not detect overflow correctly,
8404              so check for it explicitly here.  */
8405           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
8406               > TREE_INT_CST_LOW (op1)
8407               && TREE_INT_CST_HIGH (op1) == 0
8408               && 0 != (t1 = convert (type,
8409                                      const_binop (LSHIFT_EXPR, size_one_node,
8410                                                   op1, 0)))
8411               && ! TREE_OVERFLOW (t1))
8412             return multiple_of_p (type, t1, bottom);
8413         }
8414       return 0;
8415
8416     case NOP_EXPR:
8417       /* Can't handle conversions from non-integral or wider integral type.  */
8418       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
8419           || (TYPE_PRECISION (type)
8420               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
8421         return 0;
8422
8423       /* .. fall through ...  */
8424
8425     case SAVE_EXPR:
8426       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
8427
8428     case INTEGER_CST:
8429       if (TREE_CODE (bottom) != INTEGER_CST
8430           || (TREE_UNSIGNED (type)
8431               && (tree_int_cst_sgn (top) < 0
8432                   || tree_int_cst_sgn (bottom) < 0)))
8433         return 0;
8434       return integer_zerop (const_binop (TRUNC_MOD_EXPR,
8435                                          top, bottom, 0));
8436
8437     default:
8438       return 0;
8439     }
8440 }
8441
8442 /* Return true if `t' is known to be non-negative.  */
8443
8444 int
8445 tree_expr_nonnegative_p (tree t)
8446 {
8447   switch (TREE_CODE (t))
8448     {
8449     case ABS_EXPR:
8450     case FFS_EXPR:
8451     case POPCOUNT_EXPR:
8452     case PARITY_EXPR:
8453       return 1;
8454
8455     case CLZ_EXPR:
8456     case CTZ_EXPR:
8457       /* These are undefined at zero.  This is true even if
8458          C[LT]Z_DEFINED_VALUE_AT_ZERO is set, since what we're
8459          computing here is a user-visible property.  */
8460       return 0;
8461
8462     case INTEGER_CST:
8463       return tree_int_cst_sgn (t) >= 0;
8464
8465     case REAL_CST:
8466       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
8467
8468     case PLUS_EXPR:
8469       if (FLOAT_TYPE_P (TREE_TYPE (t)))
8470         return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8471                && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8472
8473       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
8474          both unsigned and at least 2 bits shorter than the result.  */
8475       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
8476           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
8477           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
8478         {
8479           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
8480           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
8481           if (TREE_CODE (inner1) == INTEGER_TYPE && TREE_UNSIGNED (inner1)
8482               && TREE_CODE (inner2) == INTEGER_TYPE && TREE_UNSIGNED (inner2))
8483             {
8484               unsigned int prec = MAX (TYPE_PRECISION (inner1),
8485                                        TYPE_PRECISION (inner2)) + 1;
8486               return prec < TYPE_PRECISION (TREE_TYPE (t));
8487             }
8488         }
8489       break;
8490
8491     case MULT_EXPR:
8492       if (FLOAT_TYPE_P (TREE_TYPE (t)))
8493         {
8494           /* x * x for floating point x is always non-negative.  */
8495           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
8496             return 1;
8497           return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8498                  && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8499         }
8500
8501       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
8502          both unsigned and their total bits is shorter than the result.  */
8503       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
8504           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
8505           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
8506         {
8507           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
8508           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
8509           if (TREE_CODE (inner1) == INTEGER_TYPE && TREE_UNSIGNED (inner1)
8510               && TREE_CODE (inner2) == INTEGER_TYPE && TREE_UNSIGNED (inner2))
8511             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
8512                    < TYPE_PRECISION (TREE_TYPE (t));
8513         }
8514       return 0;
8515
8516     case TRUNC_DIV_EXPR:
8517     case CEIL_DIV_EXPR:
8518     case FLOOR_DIV_EXPR:
8519     case ROUND_DIV_EXPR:
8520       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8521              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8522
8523     case TRUNC_MOD_EXPR:
8524     case CEIL_MOD_EXPR:
8525     case FLOOR_MOD_EXPR:
8526     case ROUND_MOD_EXPR:
8527       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8528
8529     case RDIV_EXPR:
8530       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8531              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8532
8533     case NOP_EXPR:
8534       {
8535         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
8536         tree outer_type = TREE_TYPE (t);
8537
8538         if (TREE_CODE (outer_type) == REAL_TYPE)
8539           {
8540             if (TREE_CODE (inner_type) == REAL_TYPE)
8541               return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8542             if (TREE_CODE (inner_type) == INTEGER_TYPE)
8543               {
8544                 if (TREE_UNSIGNED (inner_type))
8545                   return 1;
8546                 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8547               }
8548           }
8549         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
8550           {
8551             if (TREE_CODE (inner_type) == REAL_TYPE)
8552               return tree_expr_nonnegative_p (TREE_OPERAND (t,0));
8553             if (TREE_CODE (inner_type) == INTEGER_TYPE)
8554               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
8555                       && TREE_UNSIGNED (inner_type);
8556           }
8557       }
8558       break;
8559
8560     case COND_EXPR:
8561       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
8562         && tree_expr_nonnegative_p (TREE_OPERAND (t, 2));
8563     case COMPOUND_EXPR:
8564       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8565     case MIN_EXPR:
8566       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8567         && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8568     case MAX_EXPR:
8569       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
8570         || tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8571     case MODIFY_EXPR:
8572       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8573     case BIND_EXPR:
8574       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
8575     case SAVE_EXPR:
8576       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8577     case NON_LVALUE_EXPR:
8578       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8579     case FLOAT_EXPR:
8580       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
8581     case RTL_EXPR:
8582       return rtl_expr_nonnegative_p (RTL_EXPR_RTL (t));
8583
8584     case CALL_EXPR:
8585       if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
8586         {
8587           tree fndecl = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
8588           tree arglist = TREE_OPERAND (t, 1);
8589           if (TREE_CODE (fndecl) == FUNCTION_DECL
8590               && DECL_BUILT_IN (fndecl)
8591               && DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_MD)
8592             switch (DECL_FUNCTION_CODE (fndecl))
8593               {
8594               case BUILT_IN_CABS:
8595               case BUILT_IN_CABSL:
8596               case BUILT_IN_CABSF:
8597               case BUILT_IN_EXP:
8598               case BUILT_IN_EXPF:
8599               case BUILT_IN_EXPL:
8600               case BUILT_IN_FABS:
8601               case BUILT_IN_FABSF:
8602               case BUILT_IN_FABSL:
8603               case BUILT_IN_SQRT:
8604               case BUILT_IN_SQRTF:
8605               case BUILT_IN_SQRTL:
8606                 return 1;
8607
8608               case BUILT_IN_ATAN:
8609               case BUILT_IN_ATANF:
8610               case BUILT_IN_ATANL:
8611               case BUILT_IN_CEIL:
8612               case BUILT_IN_CEILF:
8613               case BUILT_IN_CEILL:
8614               case BUILT_IN_FLOOR:
8615               case BUILT_IN_FLOORF:
8616               case BUILT_IN_FLOORL:
8617               case BUILT_IN_NEARBYINT:
8618               case BUILT_IN_NEARBYINTF:
8619               case BUILT_IN_NEARBYINTL:
8620               case BUILT_IN_ROUND:
8621               case BUILT_IN_ROUNDF:
8622               case BUILT_IN_ROUNDL:
8623               case BUILT_IN_TRUNC:
8624               case BUILT_IN_TRUNCF:
8625               case BUILT_IN_TRUNCL:
8626                 return tree_expr_nonnegative_p (TREE_VALUE (arglist));
8627
8628               case BUILT_IN_POW:
8629               case BUILT_IN_POWF:
8630               case BUILT_IN_POWL:
8631                 return tree_expr_nonnegative_p (TREE_VALUE (arglist));
8632
8633               default:
8634                 break;
8635               }
8636         }
8637
8638       /* ... fall through ...  */
8639
8640     default:
8641       if (truth_value_p (TREE_CODE (t)))
8642         /* Truth values evaluate to 0 or 1, which is nonnegative.  */
8643         return 1;
8644     }
8645
8646   /* We don't know sign of `t', so be conservative and return false.  */
8647   return 0;
8648 }
8649
8650 /* Return true if `r' is known to be non-negative.
8651    Only handles constants at the moment.  */
8652
8653 int
8654 rtl_expr_nonnegative_p (rtx r)
8655 {
8656   switch (GET_CODE (r))
8657     {
8658     case CONST_INT:
8659       return INTVAL (r) >= 0;
8660
8661     case CONST_DOUBLE:
8662       if (GET_MODE (r) == VOIDmode)
8663         return CONST_DOUBLE_HIGH (r) >= 0;
8664       return 0;
8665
8666     case CONST_VECTOR:
8667       {
8668         int units, i;
8669         rtx elt;
8670
8671         units = CONST_VECTOR_NUNITS (r);
8672
8673         for (i = 0; i < units; ++i)
8674           {
8675             elt = CONST_VECTOR_ELT (r, i);
8676             if (!rtl_expr_nonnegative_p (elt))
8677               return 0;
8678           }
8679
8680         return 1;
8681       }
8682
8683     case SYMBOL_REF:
8684     case LABEL_REF:
8685       /* These are always nonnegative.  */
8686       return 1;
8687
8688     default:
8689       return 0;
8690     }
8691 }
8692
8693 #include "gt-fold-const.h"