OSDN Git Service

* fold-const.c (fold_binary_to_constant): Delete obsolete comment.
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005 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, an overflowable flag and prior
43    overflow indicators.  It forces the value to fit the type and sets
44    TREE_OVERFLOW and TREE_CONSTANT_OVERFLOW as appropriate.  */
45
46 #include "config.h"
47 #include "system.h"
48 #include "coretypes.h"
49 #include "tm.h"
50 #include "flags.h"
51 #include "tree.h"
52 #include "real.h"
53 #include "rtl.h"
54 #include "expr.h"
55 #include "tm_p.h"
56 #include "toplev.h"
57 #include "ggc.h"
58 #include "hashtab.h"
59 #include "langhooks.h"
60 #include "md5.h"
61
62 /* The following constants represent a bit based encoding of GCC's
63    comparison operators.  This encoding simplifies transformations
64    on relational comparison operators, such as AND and OR.  */
65 enum comparison_code {
66   COMPCODE_FALSE = 0,
67   COMPCODE_LT = 1,
68   COMPCODE_EQ = 2,
69   COMPCODE_LE = 3,
70   COMPCODE_GT = 4,
71   COMPCODE_LTGT = 5,
72   COMPCODE_GE = 6,
73   COMPCODE_ORD = 7,
74   COMPCODE_UNORD = 8,
75   COMPCODE_UNLT = 9,
76   COMPCODE_UNEQ = 10,
77   COMPCODE_UNLE = 11,
78   COMPCODE_UNGT = 12,
79   COMPCODE_NE = 13,
80   COMPCODE_UNGE = 14,
81   COMPCODE_TRUE = 15
82 };
83
84 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
85 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
86 static bool negate_mathfn_p (enum built_in_function);
87 static bool negate_expr_p (tree);
88 static tree negate_expr (tree);
89 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
90 static tree associate_trees (tree, tree, enum tree_code, tree);
91 static tree const_binop (enum tree_code, tree, tree, int);
92 static enum tree_code invert_tree_comparison (enum tree_code, bool);
93 static enum comparison_code comparison_to_compcode (enum tree_code);
94 static enum tree_code compcode_to_comparison (enum comparison_code);
95 static tree combine_comparisons (enum tree_code, enum tree_code,
96                                  enum tree_code, tree, tree, tree);
97 static int truth_value_p (enum tree_code);
98 static int operand_equal_for_comparison_p (tree, tree, tree);
99 static int twoval_comparison_p (tree, tree *, tree *, int *);
100 static tree eval_subst (tree, tree, tree, tree, tree);
101 static tree pedantic_omit_one_operand (tree, tree, tree);
102 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
103 static tree make_bit_field_ref (tree, tree, int, int, int);
104 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
105 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
106                                     enum machine_mode *, int *, int *,
107                                     tree *, tree *);
108 static int all_ones_mask_p (tree, int);
109 static tree sign_bit_p (tree, tree);
110 static int simple_operand_p (tree);
111 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
112 static tree make_range (tree, int *, tree *, tree *);
113 static tree build_range_check (tree, tree, int, tree, tree);
114 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
115                          tree);
116 static tree fold_range_test (enum tree_code, tree, tree, tree);
117 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
118 static tree unextend (tree, int, int, tree);
119 static tree fold_truthop (enum tree_code, tree, tree, tree);
120 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
121 static tree extract_muldiv (tree, tree, enum tree_code, tree);
122 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree);
123 static int multiple_of_p (tree, tree, tree);
124 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
125                                                  tree, tree,
126                                                  tree, tree, int);
127 static bool fold_real_zero_addition_p (tree, tree, int);
128 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
129                                  tree, tree, tree);
130 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
131 static tree fold_div_compare (enum tree_code, tree, tree, tree);
132 static bool reorder_operands_p (tree, tree);
133 static tree fold_negate_const (tree, tree);
134 static tree fold_not_const (tree, tree);
135 static tree fold_relational_const (enum tree_code, tree, tree, tree);
136 static bool tree_expr_nonzero_p (tree);
137
138 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
139    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
140    and SUM1.  Then this yields nonzero if overflow occurred during the
141    addition.
142
143    Overflow occurs if A and B have the same sign, but A and SUM differ in
144    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
145    sign.  */
146 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
147 \f
148 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
149    We do that by representing the two-word integer in 4 words, with only
150    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
151    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
152
153 #define LOWPART(x) \
154   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
155 #define HIGHPART(x) \
156   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
157 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
158
159 /* Unpack a two-word integer into 4 words.
160    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
161    WORDS points to the array of HOST_WIDE_INTs.  */
162
163 static void
164 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
165 {
166   words[0] = LOWPART (low);
167   words[1] = HIGHPART (low);
168   words[2] = LOWPART (hi);
169   words[3] = HIGHPART (hi);
170 }
171
172 /* Pack an array of 4 words into a two-word integer.
173    WORDS points to the array of words.
174    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
175
176 static void
177 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
178         HOST_WIDE_INT *hi)
179 {
180   *low = words[0] + words[1] * BASE;
181   *hi = words[2] + words[3] * BASE;
182 }
183 \f
184 /* T is an INT_CST node.  OVERFLOWABLE indicates if we are interested
185    in overflow of the value, when >0 we are only interested in signed
186    overflow, for <0 we are interested in any overflow.  OVERFLOWED
187    indicates whether overflow has already occurred.  CONST_OVERFLOWED
188    indicates whether constant overflow has already occurred.  We force
189    T's value to be within range of T's type (by setting to 0 or 1 all
190    the bits outside the type's range).  We set TREE_OVERFLOWED if,
191         OVERFLOWED is nonzero,
192         or OVERFLOWABLE is >0 and signed overflow occurs
193         or OVERFLOWABLE is <0 and any overflow occurs
194    We set TREE_CONSTANT_OVERFLOWED if,
195         CONST_OVERFLOWED is nonzero
196         or we set TREE_OVERFLOWED.
197   We return either the original T, or a copy.  */
198
199 tree
200 force_fit_type (tree t, int overflowable,
201                 bool overflowed, bool overflowed_const)
202 {
203   unsigned HOST_WIDE_INT low;
204   HOST_WIDE_INT high;
205   unsigned int prec;
206   int sign_extended_type;
207
208   gcc_assert (TREE_CODE (t) == INTEGER_CST);
209
210   low = TREE_INT_CST_LOW (t);
211   high = TREE_INT_CST_HIGH (t);
212
213   if (POINTER_TYPE_P (TREE_TYPE (t))
214       || TREE_CODE (TREE_TYPE (t)) == OFFSET_TYPE)
215     prec = POINTER_SIZE;
216   else
217     prec = TYPE_PRECISION (TREE_TYPE (t));
218   /* Size types *are* sign extended.  */
219   sign_extended_type = (!TYPE_UNSIGNED (TREE_TYPE (t))
220                         || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
221                             && TYPE_IS_SIZETYPE (TREE_TYPE (t))));
222
223   /* First clear all bits that are beyond the type's precision.  */
224
225   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
226     ;
227   else if (prec > HOST_BITS_PER_WIDE_INT)
228     high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
229   else
230     {
231       high = 0;
232       if (prec < HOST_BITS_PER_WIDE_INT)
233         low &= ~((HOST_WIDE_INT) (-1) << prec);
234     }
235
236   if (!sign_extended_type)
237     /* No sign extension */;
238   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
239     /* Correct width already.  */;
240   else if (prec > HOST_BITS_PER_WIDE_INT)
241     {
242       /* Sign extend top half? */
243       if (high & ((unsigned HOST_WIDE_INT)1
244                   << (prec - HOST_BITS_PER_WIDE_INT - 1)))
245         high |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
246     }
247   else if (prec == HOST_BITS_PER_WIDE_INT)
248     {
249       if ((HOST_WIDE_INT)low < 0)
250         high = -1;
251     }
252   else
253     {
254       /* Sign extend bottom half? */
255       if (low & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
256         {
257           high = -1;
258           low |= (HOST_WIDE_INT)(-1) << prec;
259         }
260     }
261
262   /* If the value changed, return a new node.  */
263   if (overflowed || overflowed_const
264       || low != TREE_INT_CST_LOW (t) || high != TREE_INT_CST_HIGH (t))
265     {
266       t = build_int_cst_wide (TREE_TYPE (t), low, high);
267
268       if (overflowed
269           || overflowable < 0
270           || (overflowable > 0 && sign_extended_type))
271         {
272           t = copy_node (t);
273           TREE_OVERFLOW (t) = 1;
274           TREE_CONSTANT_OVERFLOW (t) = 1;
275         }
276       else if (overflowed_const)
277         {
278           t = copy_node (t);
279           TREE_CONSTANT_OVERFLOW (t) = 1;
280         }
281     }
282
283   return t;
284 }
285 \f
286 /* Add two doubleword integers with doubleword result.
287    Each argument is given as two `HOST_WIDE_INT' pieces.
288    One argument is L1 and H1; the other, L2 and H2.
289    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
290
291 int
292 add_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
293             unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
294             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
295 {
296   unsigned HOST_WIDE_INT l;
297   HOST_WIDE_INT h;
298
299   l = l1 + l2;
300   h = h1 + h2 + (l < l1);
301
302   *lv = l;
303   *hv = h;
304   return OVERFLOW_SUM_SIGN (h1, h2, h);
305 }
306
307 /* Negate a doubleword integer with doubleword result.
308    Return nonzero if the operation overflows, assuming it's signed.
309    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
310    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
311
312 int
313 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
314             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
315 {
316   if (l1 == 0)
317     {
318       *lv = 0;
319       *hv = - h1;
320       return (*hv & h1) < 0;
321     }
322   else
323     {
324       *lv = -l1;
325       *hv = ~h1;
326       return 0;
327     }
328 }
329 \f
330 /* Multiply two doubleword integers with doubleword result.
331    Return nonzero if the operation overflows, assuming it's signed.
332    Each argument is given as two `HOST_WIDE_INT' pieces.
333    One argument is L1 and H1; the other, L2 and H2.
334    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
335
336 int
337 mul_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
338             unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
339             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
340 {
341   HOST_WIDE_INT arg1[4];
342   HOST_WIDE_INT arg2[4];
343   HOST_WIDE_INT prod[4 * 2];
344   unsigned HOST_WIDE_INT carry;
345   int i, j, k;
346   unsigned HOST_WIDE_INT toplow, neglow;
347   HOST_WIDE_INT tophigh, neghigh;
348
349   encode (arg1, l1, h1);
350   encode (arg2, l2, h2);
351
352   memset (prod, 0, sizeof prod);
353
354   for (i = 0; i < 4; i++)
355     {
356       carry = 0;
357       for (j = 0; j < 4; j++)
358         {
359           k = i + j;
360           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
361           carry += arg1[i] * arg2[j];
362           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
363           carry += prod[k];
364           prod[k] = LOWPART (carry);
365           carry = HIGHPART (carry);
366         }
367       prod[i + 4] = carry;
368     }
369
370   decode (prod, lv, hv);        /* This ignores prod[4] through prod[4*2-1] */
371
372   /* Check for overflow by calculating the top half of the answer in full;
373      it should agree with the low half's sign bit.  */
374   decode (prod + 4, &toplow, &tophigh);
375   if (h1 < 0)
376     {
377       neg_double (l2, h2, &neglow, &neghigh);
378       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
379     }
380   if (h2 < 0)
381     {
382       neg_double (l1, h1, &neglow, &neghigh);
383       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
384     }
385   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
386 }
387 \f
388 /* Shift the doubleword integer in L1, H1 left by COUNT places
389    keeping only PREC bits of result.
390    Shift right if COUNT is negative.
391    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
392    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
393
394 void
395 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
396                HOST_WIDE_INT count, unsigned int prec,
397                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
398 {
399   unsigned HOST_WIDE_INT signmask;
400
401   if (count < 0)
402     {
403       rshift_double (l1, h1, -count, prec, lv, hv, arith);
404       return;
405     }
406
407   if (SHIFT_COUNT_TRUNCATED)
408     count %= prec;
409
410   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
411     {
412       /* Shifting by the host word size is undefined according to the
413          ANSI standard, so we must handle this as a special case.  */
414       *hv = 0;
415       *lv = 0;
416     }
417   else if (count >= HOST_BITS_PER_WIDE_INT)
418     {
419       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
420       *lv = 0;
421     }
422   else
423     {
424       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
425              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
426       *lv = l1 << count;
427     }
428
429   /* Sign extend all bits that are beyond the precision.  */
430
431   signmask = -((prec > HOST_BITS_PER_WIDE_INT
432                 ? ((unsigned HOST_WIDE_INT) *hv
433                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
434                 : (*lv >> (prec - 1))) & 1);
435
436   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
437     ;
438   else if (prec >= HOST_BITS_PER_WIDE_INT)
439     {
440       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
441       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
442     }
443   else
444     {
445       *hv = signmask;
446       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
447       *lv |= signmask << prec;
448     }
449 }
450
451 /* Shift the doubleword integer in L1, H1 right by COUNT places
452    keeping only PREC bits of result.  COUNT must be positive.
453    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
454    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
455
456 void
457 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
458                HOST_WIDE_INT count, unsigned int prec,
459                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
460                int arith)
461 {
462   unsigned HOST_WIDE_INT signmask;
463
464   signmask = (arith
465               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
466               : 0);
467
468   if (SHIFT_COUNT_TRUNCATED)
469     count %= prec;
470
471   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
472     {
473       /* Shifting by the host word size is undefined according to the
474          ANSI standard, so we must handle this as a special case.  */
475       *hv = 0;
476       *lv = 0;
477     }
478   else if (count >= HOST_BITS_PER_WIDE_INT)
479     {
480       *hv = 0;
481       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
482     }
483   else
484     {
485       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
486       *lv = ((l1 >> count)
487              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
488     }
489
490   /* Zero / sign extend all bits that are beyond the precision.  */
491
492   if (count >= (HOST_WIDE_INT)prec)
493     {
494       *hv = signmask;
495       *lv = signmask;
496     }
497   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
498     ;
499   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
500     {
501       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
502       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
503     }
504   else
505     {
506       *hv = signmask;
507       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
508       *lv |= signmask << (prec - count);
509     }
510 }
511 \f
512 /* Rotate the doubleword integer in L1, H1 left by COUNT places
513    keeping only PREC bits of result.
514    Rotate right if COUNT is negative.
515    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
516
517 void
518 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
519                 HOST_WIDE_INT count, unsigned int prec,
520                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
521 {
522   unsigned HOST_WIDE_INT s1l, s2l;
523   HOST_WIDE_INT s1h, s2h;
524
525   count %= prec;
526   if (count < 0)
527     count += prec;
528
529   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
530   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
531   *lv = s1l | s2l;
532   *hv = s1h | s2h;
533 }
534
535 /* Rotate the doubleword integer in L1, H1 left by COUNT places
536    keeping only PREC bits of result.  COUNT must be positive.
537    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
538
539 void
540 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
541                 HOST_WIDE_INT count, unsigned int prec,
542                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
543 {
544   unsigned HOST_WIDE_INT s1l, s2l;
545   HOST_WIDE_INT s1h, s2h;
546
547   count %= prec;
548   if (count < 0)
549     count += prec;
550
551   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
552   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
553   *lv = s1l | s2l;
554   *hv = s1h | s2h;
555 }
556 \f
557 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
558    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
559    CODE is a tree code for a kind of division, one of
560    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
561    or EXACT_DIV_EXPR
562    It controls how the quotient is rounded to an integer.
563    Return nonzero if the operation overflows.
564    UNS nonzero says do unsigned division.  */
565
566 int
567 div_and_round_double (enum tree_code code, int uns,
568                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
569                       HOST_WIDE_INT hnum_orig,
570                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
571                       HOST_WIDE_INT hden_orig,
572                       unsigned HOST_WIDE_INT *lquo,
573                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
574                       HOST_WIDE_INT *hrem)
575 {
576   int quo_neg = 0;
577   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
578   HOST_WIDE_INT den[4], quo[4];
579   int i, j;
580   unsigned HOST_WIDE_INT work;
581   unsigned HOST_WIDE_INT carry = 0;
582   unsigned HOST_WIDE_INT lnum = lnum_orig;
583   HOST_WIDE_INT hnum = hnum_orig;
584   unsigned HOST_WIDE_INT lden = lden_orig;
585   HOST_WIDE_INT hden = hden_orig;
586   int overflow = 0;
587
588   if (hden == 0 && lden == 0)
589     overflow = 1, lden = 1;
590
591   /* Calculate quotient sign and convert operands to unsigned.  */
592   if (!uns)
593     {
594       if (hnum < 0)
595         {
596           quo_neg = ~ quo_neg;
597           /* (minimum integer) / (-1) is the only overflow case.  */
598           if (neg_double (lnum, hnum, &lnum, &hnum)
599               && ((HOST_WIDE_INT) lden & hden) == -1)
600             overflow = 1;
601         }
602       if (hden < 0)
603         {
604           quo_neg = ~ quo_neg;
605           neg_double (lden, hden, &lden, &hden);
606         }
607     }
608
609   if (hnum == 0 && hden == 0)
610     {                           /* single precision */
611       *hquo = *hrem = 0;
612       /* This unsigned division rounds toward zero.  */
613       *lquo = lnum / lden;
614       goto finish_up;
615     }
616
617   if (hnum == 0)
618     {                           /* trivial case: dividend < divisor */
619       /* hden != 0 already checked.  */
620       *hquo = *lquo = 0;
621       *hrem = hnum;
622       *lrem = lnum;
623       goto finish_up;
624     }
625
626   memset (quo, 0, sizeof quo);
627
628   memset (num, 0, sizeof num);  /* to zero 9th element */
629   memset (den, 0, sizeof den);
630
631   encode (num, lnum, hnum);
632   encode (den, lden, hden);
633
634   /* Special code for when the divisor < BASE.  */
635   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
636     {
637       /* hnum != 0 already checked.  */
638       for (i = 4 - 1; i >= 0; i--)
639         {
640           work = num[i] + carry * BASE;
641           quo[i] = work / lden;
642           carry = work % lden;
643         }
644     }
645   else
646     {
647       /* Full double precision division,
648          with thanks to Don Knuth's "Seminumerical Algorithms".  */
649       int num_hi_sig, den_hi_sig;
650       unsigned HOST_WIDE_INT quo_est, scale;
651
652       /* Find the highest nonzero divisor digit.  */
653       for (i = 4 - 1;; i--)
654         if (den[i] != 0)
655           {
656             den_hi_sig = i;
657             break;
658           }
659
660       /* Insure that the first digit of the divisor is at least BASE/2.
661          This is required by the quotient digit estimation algorithm.  */
662
663       scale = BASE / (den[den_hi_sig] + 1);
664       if (scale > 1)
665         {               /* scale divisor and dividend */
666           carry = 0;
667           for (i = 0; i <= 4 - 1; i++)
668             {
669               work = (num[i] * scale) + carry;
670               num[i] = LOWPART (work);
671               carry = HIGHPART (work);
672             }
673
674           num[4] = carry;
675           carry = 0;
676           for (i = 0; i <= 4 - 1; i++)
677             {
678               work = (den[i] * scale) + carry;
679               den[i] = LOWPART (work);
680               carry = HIGHPART (work);
681               if (den[i] != 0) den_hi_sig = i;
682             }
683         }
684
685       num_hi_sig = 4;
686
687       /* Main loop */
688       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
689         {
690           /* Guess the next quotient digit, quo_est, by dividing the first
691              two remaining dividend digits by the high order quotient digit.
692              quo_est is never low and is at most 2 high.  */
693           unsigned HOST_WIDE_INT tmp;
694
695           num_hi_sig = i + den_hi_sig + 1;
696           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
697           if (num[num_hi_sig] != den[den_hi_sig])
698             quo_est = work / den[den_hi_sig];
699           else
700             quo_est = BASE - 1;
701
702           /* Refine quo_est so it's usually correct, and at most one high.  */
703           tmp = work - quo_est * den[den_hi_sig];
704           if (tmp < BASE
705               && (den[den_hi_sig - 1] * quo_est
706                   > (tmp * BASE + num[num_hi_sig - 2])))
707             quo_est--;
708
709           /* Try QUO_EST as the quotient digit, by multiplying the
710              divisor by QUO_EST and subtracting from the remaining dividend.
711              Keep in mind that QUO_EST is the I - 1st digit.  */
712
713           carry = 0;
714           for (j = 0; j <= den_hi_sig; j++)
715             {
716               work = quo_est * den[j] + carry;
717               carry = HIGHPART (work);
718               work = num[i + j] - LOWPART (work);
719               num[i + j] = LOWPART (work);
720               carry += HIGHPART (work) != 0;
721             }
722
723           /* If quo_est was high by one, then num[i] went negative and
724              we need to correct things.  */
725           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
726             {
727               quo_est--;
728               carry = 0;                /* add divisor back in */
729               for (j = 0; j <= den_hi_sig; j++)
730                 {
731                   work = num[i + j] + den[j] + carry;
732                   carry = HIGHPART (work);
733                   num[i + j] = LOWPART (work);
734                 }
735
736               num [num_hi_sig] += carry;
737             }
738
739           /* Store the quotient digit.  */
740           quo[i] = quo_est;
741         }
742     }
743
744   decode (quo, lquo, hquo);
745
746  finish_up:
747   /* If result is negative, make it so.  */
748   if (quo_neg)
749     neg_double (*lquo, *hquo, lquo, hquo);
750
751   /* Compute trial remainder:  rem = num - (quo * den)  */
752   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
753   neg_double (*lrem, *hrem, lrem, hrem);
754   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
755
756   switch (code)
757     {
758     case TRUNC_DIV_EXPR:
759     case TRUNC_MOD_EXPR:        /* round toward zero */
760     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
761       return overflow;
762
763     case FLOOR_DIV_EXPR:
764     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
765       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
766         {
767           /* quo = quo - 1;  */
768           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
769                       lquo, hquo);
770         }
771       else
772         return overflow;
773       break;
774
775     case CEIL_DIV_EXPR:
776     case CEIL_MOD_EXPR:         /* round toward positive infinity */
777       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
778         {
779           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
780                       lquo, hquo);
781         }
782       else
783         return overflow;
784       break;
785
786     case ROUND_DIV_EXPR:
787     case ROUND_MOD_EXPR:        /* round to closest integer */
788       {
789         unsigned HOST_WIDE_INT labs_rem = *lrem;
790         HOST_WIDE_INT habs_rem = *hrem;
791         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
792         HOST_WIDE_INT habs_den = hden, htwice;
793
794         /* Get absolute values.  */
795         if (*hrem < 0)
796           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
797         if (hden < 0)
798           neg_double (lden, hden, &labs_den, &habs_den);
799
800         /* If (2 * abs (lrem) >= abs (lden)) */
801         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
802                     labs_rem, habs_rem, &ltwice, &htwice);
803
804         if (((unsigned HOST_WIDE_INT) habs_den
805              < (unsigned HOST_WIDE_INT) htwice)
806             || (((unsigned HOST_WIDE_INT) habs_den
807                  == (unsigned HOST_WIDE_INT) htwice)
808                 && (labs_den < ltwice)))
809           {
810             if (*hquo < 0)
811               /* quo = quo - 1;  */
812               add_double (*lquo, *hquo,
813                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
814             else
815               /* quo = quo + 1; */
816               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
817                           lquo, hquo);
818           }
819         else
820           return overflow;
821       }
822       break;
823
824     default:
825       gcc_unreachable ();
826     }
827
828   /* Compute true remainder:  rem = num - (quo * den)  */
829   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
830   neg_double (*lrem, *hrem, lrem, hrem);
831   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
832   return overflow;
833 }
834 \f
835 /* Return true if built-in mathematical function specified by CODE
836    preserves the sign of it argument, i.e. -f(x) == f(-x).  */
837
838 static bool
839 negate_mathfn_p (enum built_in_function code)
840 {
841   switch (code)
842     {
843     case BUILT_IN_ASIN:
844     case BUILT_IN_ASINF:
845     case BUILT_IN_ASINL:
846     case BUILT_IN_ATAN:
847     case BUILT_IN_ATANF:
848     case BUILT_IN_ATANL:
849     case BUILT_IN_SIN:
850     case BUILT_IN_SINF:
851     case BUILT_IN_SINL:
852     case BUILT_IN_TAN:
853     case BUILT_IN_TANF:
854     case BUILT_IN_TANL:
855       return true;
856
857     default:
858       break;
859     }
860   return false;
861 }
862
863 /* Check whether we may negate an integer constant T without causing
864    overflow.  */
865
866 bool
867 may_negate_without_overflow_p (tree t)
868 {
869   unsigned HOST_WIDE_INT val;
870   unsigned int prec;
871   tree type;
872
873   gcc_assert (TREE_CODE (t) == INTEGER_CST);
874
875   type = TREE_TYPE (t);
876   if (TYPE_UNSIGNED (type))
877     return false;
878
879   prec = TYPE_PRECISION (type);
880   if (prec > HOST_BITS_PER_WIDE_INT)
881     {
882       if (TREE_INT_CST_LOW (t) != 0)
883         return true;
884       prec -= HOST_BITS_PER_WIDE_INT;
885       val = TREE_INT_CST_HIGH (t);
886     }
887   else
888     val = TREE_INT_CST_LOW (t);
889   if (prec < HOST_BITS_PER_WIDE_INT)
890     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
891   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
892 }
893
894 /* Determine whether an expression T can be cheaply negated using
895    the function negate_expr.  */
896
897 static bool
898 negate_expr_p (tree t)
899 {
900   tree type;
901
902   if (t == 0)
903     return false;
904
905   type = TREE_TYPE (t);
906
907   STRIP_SIGN_NOPS (t);
908   switch (TREE_CODE (t))
909     {
910     case INTEGER_CST:
911       if (TYPE_UNSIGNED (type) || ! flag_trapv)
912         return true;
913
914       /* Check that -CST will not overflow type.  */
915       return may_negate_without_overflow_p (t);
916
917     case REAL_CST:
918     case NEGATE_EXPR:
919       return true;
920
921     case COMPLEX_CST:
922       return negate_expr_p (TREE_REALPART (t))
923              && negate_expr_p (TREE_IMAGPART (t));
924
925     case PLUS_EXPR:
926       if (FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
927         return false;
928       /* -(A + B) -> (-B) - A.  */
929       if (negate_expr_p (TREE_OPERAND (t, 1))
930           && reorder_operands_p (TREE_OPERAND (t, 0),
931                                  TREE_OPERAND (t, 1)))
932         return true;
933       /* -(A + B) -> (-A) - B.  */
934       return negate_expr_p (TREE_OPERAND (t, 0));
935
936     case MINUS_EXPR:
937       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
938       return (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
939              && reorder_operands_p (TREE_OPERAND (t, 0),
940                                     TREE_OPERAND (t, 1));
941
942     case MULT_EXPR:
943       if (TYPE_UNSIGNED (TREE_TYPE (t)))
944         break;
945
946       /* Fall through.  */
947
948     case RDIV_EXPR:
949       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
950         return negate_expr_p (TREE_OPERAND (t, 1))
951                || negate_expr_p (TREE_OPERAND (t, 0));
952       break;
953
954     case NOP_EXPR:
955       /* Negate -((double)float) as (double)(-float).  */
956       if (TREE_CODE (type) == REAL_TYPE)
957         {
958           tree tem = strip_float_extensions (t);
959           if (tem != t)
960             return negate_expr_p (tem);
961         }
962       break;
963
964     case CALL_EXPR:
965       /* Negate -f(x) as f(-x).  */
966       if (negate_mathfn_p (builtin_mathfn_code (t)))
967         return negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1)));
968       break;
969
970     case RSHIFT_EXPR:
971       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
972       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
973         {
974           tree op1 = TREE_OPERAND (t, 1);
975           if (TREE_INT_CST_HIGH (op1) == 0
976               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
977                  == TREE_INT_CST_LOW (op1))
978             return true;
979         }
980       break;
981
982     default:
983       break;
984     }
985   return false;
986 }
987
988 /* Given T, an expression, return the negation of T.  Allow for T to be
989    null, in which case return null.  */
990
991 static tree
992 negate_expr (tree t)
993 {
994   tree type;
995   tree tem;
996
997   if (t == 0)
998     return 0;
999
1000   type = TREE_TYPE (t);
1001   STRIP_SIGN_NOPS (t);
1002
1003   switch (TREE_CODE (t))
1004     {
1005     case INTEGER_CST:
1006       tem = fold_negate_const (t, type);
1007       if (! TREE_OVERFLOW (tem)
1008           || TYPE_UNSIGNED (type)
1009           || ! flag_trapv)
1010         return tem;
1011       break;
1012
1013     case REAL_CST:
1014       tem = fold_negate_const (t, type);
1015       /* Two's complement FP formats, such as c4x, may overflow.  */
1016       if (! TREE_OVERFLOW (tem) || ! flag_trapping_math)
1017         return fold_convert (type, tem);
1018       break;
1019
1020     case COMPLEX_CST:
1021       {
1022         tree rpart = negate_expr (TREE_REALPART (t));
1023         tree ipart = negate_expr (TREE_IMAGPART (t));
1024
1025         if ((TREE_CODE (rpart) == REAL_CST
1026              && TREE_CODE (ipart) == REAL_CST)
1027             || (TREE_CODE (rpart) == INTEGER_CST
1028                 && TREE_CODE (ipart) == INTEGER_CST))
1029           return build_complex (type, rpart, ipart);
1030       }
1031       break;
1032
1033     case NEGATE_EXPR:
1034       return fold_convert (type, TREE_OPERAND (t, 0));
1035
1036     case PLUS_EXPR:
1037       if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1038         {
1039           /* -(A + B) -> (-B) - A.  */
1040           if (negate_expr_p (TREE_OPERAND (t, 1))
1041               && reorder_operands_p (TREE_OPERAND (t, 0),
1042                                      TREE_OPERAND (t, 1)))
1043             {
1044               tem = negate_expr (TREE_OPERAND (t, 1));
1045               tem = fold_build2 (MINUS_EXPR, TREE_TYPE (t),
1046                                  tem, TREE_OPERAND (t, 0));
1047               return fold_convert (type, tem);
1048             }
1049
1050           /* -(A + B) -> (-A) - B.  */
1051           if (negate_expr_p (TREE_OPERAND (t, 0)))
1052             {
1053               tem = negate_expr (TREE_OPERAND (t, 0));
1054               tem = fold_build2 (MINUS_EXPR, TREE_TYPE (t),
1055                                  tem, TREE_OPERAND (t, 1));
1056               return fold_convert (type, tem);
1057             }
1058         }
1059       break;
1060
1061     case MINUS_EXPR:
1062       /* - (A - B) -> B - A  */
1063       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1064           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1065         return fold_convert (type,
1066                              fold_build2 (MINUS_EXPR, TREE_TYPE (t),
1067                                           TREE_OPERAND (t, 1),
1068                                           TREE_OPERAND (t, 0)));
1069       break;
1070
1071     case MULT_EXPR:
1072       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1073         break;
1074
1075       /* Fall through.  */
1076
1077     case RDIV_EXPR:
1078       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1079         {
1080           tem = TREE_OPERAND (t, 1);
1081           if (negate_expr_p (tem))
1082             return fold_convert (type,
1083                                  fold_build2 (TREE_CODE (t), TREE_TYPE (t),
1084                                               TREE_OPERAND (t, 0),
1085                                               negate_expr (tem)));
1086           tem = TREE_OPERAND (t, 0);
1087           if (negate_expr_p (tem))
1088             return fold_convert (type,
1089                                  fold_build2 (TREE_CODE (t), TREE_TYPE (t),
1090                                               negate_expr (tem),
1091                                               TREE_OPERAND (t, 1)));
1092         }
1093       break;
1094
1095     case NOP_EXPR:
1096       /* Convert -((double)float) into (double)(-float).  */
1097       if (TREE_CODE (type) == REAL_TYPE)
1098         {
1099           tem = strip_float_extensions (t);
1100           if (tem != t && negate_expr_p (tem))
1101             return fold_convert (type, negate_expr (tem));
1102         }
1103       break;
1104
1105     case CALL_EXPR:
1106       /* Negate -f(x) as f(-x).  */
1107       if (negate_mathfn_p (builtin_mathfn_code (t))
1108           && negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1))))
1109         {
1110           tree fndecl, arg, arglist;
1111
1112           fndecl = get_callee_fndecl (t);
1113           arg = negate_expr (TREE_VALUE (TREE_OPERAND (t, 1)));
1114           arglist = build_tree_list (NULL_TREE, arg);
1115           return build_function_call_expr (fndecl, arglist);
1116         }
1117       break;
1118
1119     case RSHIFT_EXPR:
1120       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1121       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1122         {
1123           tree op1 = TREE_OPERAND (t, 1);
1124           if (TREE_INT_CST_HIGH (op1) == 0
1125               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1126                  == TREE_INT_CST_LOW (op1))
1127             {
1128               tree ntype = TYPE_UNSIGNED (type)
1129                            ? lang_hooks.types.signed_type (type)
1130                            : lang_hooks.types.unsigned_type (type);
1131               tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1132               temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1133               return fold_convert (type, temp);
1134             }
1135         }
1136       break;
1137
1138     default:
1139       break;
1140     }
1141
1142   tem = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1143   return fold_convert (type, tem);
1144 }
1145 \f
1146 /* Split a tree IN into a constant, literal and variable parts that could be
1147    combined with CODE to make IN.  "constant" means an expression with
1148    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1149    commutative arithmetic operation.  Store the constant part into *CONP,
1150    the literal in *LITP and return the variable part.  If a part isn't
1151    present, set it to null.  If the tree does not decompose in this way,
1152    return the entire tree as the variable part and the other parts as null.
1153
1154    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1155    case, we negate an operand that was subtracted.  Except if it is a
1156    literal for which we use *MINUS_LITP instead.
1157
1158    If NEGATE_P is true, we are negating all of IN, again except a literal
1159    for which we use *MINUS_LITP instead.
1160
1161    If IN is itself a literal or constant, return it as appropriate.
1162
1163    Note that we do not guarantee that any of the three values will be the
1164    same type as IN, but they will have the same signedness and mode.  */
1165
1166 static tree
1167 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1168             tree *minus_litp, int negate_p)
1169 {
1170   tree var = 0;
1171
1172   *conp = 0;
1173   *litp = 0;
1174   *minus_litp = 0;
1175
1176   /* Strip any conversions that don't change the machine mode or signedness.  */
1177   STRIP_SIGN_NOPS (in);
1178
1179   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
1180     *litp = in;
1181   else if (TREE_CODE (in) == code
1182            || (! FLOAT_TYPE_P (TREE_TYPE (in))
1183                /* We can associate addition and subtraction together (even
1184                   though the C standard doesn't say so) for integers because
1185                   the value is not affected.  For reals, the value might be
1186                   affected, so we can't.  */
1187                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1188                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1189     {
1190       tree op0 = TREE_OPERAND (in, 0);
1191       tree op1 = TREE_OPERAND (in, 1);
1192       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1193       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1194
1195       /* First see if either of the operands is a literal, then a constant.  */
1196       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
1197         *litp = op0, op0 = 0;
1198       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
1199         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1200
1201       if (op0 != 0 && TREE_CONSTANT (op0))
1202         *conp = op0, op0 = 0;
1203       else if (op1 != 0 && TREE_CONSTANT (op1))
1204         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1205
1206       /* If we haven't dealt with either operand, this is not a case we can
1207          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1208       if (op0 != 0 && op1 != 0)
1209         var = in;
1210       else if (op0 != 0)
1211         var = op0;
1212       else
1213         var = op1, neg_var_p = neg1_p;
1214
1215       /* Now do any needed negations.  */
1216       if (neg_litp_p)
1217         *minus_litp = *litp, *litp = 0;
1218       if (neg_conp_p)
1219         *conp = negate_expr (*conp);
1220       if (neg_var_p)
1221         var = negate_expr (var);
1222     }
1223   else if (TREE_CONSTANT (in))
1224     *conp = in;
1225   else
1226     var = in;
1227
1228   if (negate_p)
1229     {
1230       if (*litp)
1231         *minus_litp = *litp, *litp = 0;
1232       else if (*minus_litp)
1233         *litp = *minus_litp, *minus_litp = 0;
1234       *conp = negate_expr (*conp);
1235       var = negate_expr (var);
1236     }
1237
1238   return var;
1239 }
1240
1241 /* Re-associate trees split by the above function.  T1 and T2 are either
1242    expressions to associate or null.  Return the new expression, if any.  If
1243    we build an operation, do it in TYPE and with CODE.  */
1244
1245 static tree
1246 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1247 {
1248   if (t1 == 0)
1249     return t2;
1250   else if (t2 == 0)
1251     return t1;
1252
1253   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1254      try to fold this since we will have infinite recursion.  But do
1255      deal with any NEGATE_EXPRs.  */
1256   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1257       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1258     {
1259       if (code == PLUS_EXPR)
1260         {
1261           if (TREE_CODE (t1) == NEGATE_EXPR)
1262             return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1263                            fold_convert (type, TREE_OPERAND (t1, 0)));
1264           else if (TREE_CODE (t2) == NEGATE_EXPR)
1265             return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1266                            fold_convert (type, TREE_OPERAND (t2, 0)));
1267           else if (integer_zerop (t2))
1268             return fold_convert (type, t1);
1269         }
1270       else if (code == MINUS_EXPR)
1271         {
1272           if (integer_zerop (t2))
1273             return fold_convert (type, t1);
1274         }
1275
1276       return build2 (code, type, fold_convert (type, t1),
1277                      fold_convert (type, t2));
1278     }
1279
1280   return fold_build2 (code, type, fold_convert (type, t1),
1281                       fold_convert (type, t2));
1282 }
1283 \f
1284 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1285    to produce a new constant.
1286
1287    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1288
1289 tree
1290 int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1291 {
1292   unsigned HOST_WIDE_INT int1l, int2l;
1293   HOST_WIDE_INT int1h, int2h;
1294   unsigned HOST_WIDE_INT low;
1295   HOST_WIDE_INT hi;
1296   unsigned HOST_WIDE_INT garbagel;
1297   HOST_WIDE_INT garbageh;
1298   tree t;
1299   tree type = TREE_TYPE (arg1);
1300   int uns = TYPE_UNSIGNED (type);
1301   int is_sizetype
1302     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1303   int overflow = 0;
1304
1305   int1l = TREE_INT_CST_LOW (arg1);
1306   int1h = TREE_INT_CST_HIGH (arg1);
1307   int2l = TREE_INT_CST_LOW (arg2);
1308   int2h = TREE_INT_CST_HIGH (arg2);
1309
1310   switch (code)
1311     {
1312     case BIT_IOR_EXPR:
1313       low = int1l | int2l, hi = int1h | int2h;
1314       break;
1315
1316     case BIT_XOR_EXPR:
1317       low = int1l ^ int2l, hi = int1h ^ int2h;
1318       break;
1319
1320     case BIT_AND_EXPR:
1321       low = int1l & int2l, hi = int1h & int2h;
1322       break;
1323
1324     case RSHIFT_EXPR:
1325       int2l = -int2l;
1326     case LSHIFT_EXPR:
1327       /* It's unclear from the C standard whether shifts can overflow.
1328          The following code ignores overflow; perhaps a C standard
1329          interpretation ruling is needed.  */
1330       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1331                      &low, &hi, !uns);
1332       break;
1333
1334     case RROTATE_EXPR:
1335       int2l = - int2l;
1336     case LROTATE_EXPR:
1337       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1338                       &low, &hi);
1339       break;
1340
1341     case PLUS_EXPR:
1342       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1343       break;
1344
1345     case MINUS_EXPR:
1346       neg_double (int2l, int2h, &low, &hi);
1347       add_double (int1l, int1h, low, hi, &low, &hi);
1348       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1349       break;
1350
1351     case MULT_EXPR:
1352       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1353       break;
1354
1355     case TRUNC_DIV_EXPR:
1356     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1357     case EXACT_DIV_EXPR:
1358       /* This is a shortcut for a common special case.  */
1359       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1360           && ! TREE_CONSTANT_OVERFLOW (arg1)
1361           && ! TREE_CONSTANT_OVERFLOW (arg2)
1362           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1363         {
1364           if (code == CEIL_DIV_EXPR)
1365             int1l += int2l - 1;
1366
1367           low = int1l / int2l, hi = 0;
1368           break;
1369         }
1370
1371       /* ... fall through ...  */
1372
1373     case ROUND_DIV_EXPR:
1374       if (int2h == 0 && int2l == 1)
1375         {
1376           low = int1l, hi = int1h;
1377           break;
1378         }
1379       if (int1l == int2l && int1h == int2h
1380           && ! (int1l == 0 && int1h == 0))
1381         {
1382           low = 1, hi = 0;
1383           break;
1384         }
1385       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1386                                        &low, &hi, &garbagel, &garbageh);
1387       break;
1388
1389     case TRUNC_MOD_EXPR:
1390     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1391       /* This is a shortcut for a common special case.  */
1392       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1393           && ! TREE_CONSTANT_OVERFLOW (arg1)
1394           && ! TREE_CONSTANT_OVERFLOW (arg2)
1395           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1396         {
1397           if (code == CEIL_MOD_EXPR)
1398             int1l += int2l - 1;
1399           low = int1l % int2l, hi = 0;
1400           break;
1401         }
1402
1403       /* ... fall through ...  */
1404
1405     case ROUND_MOD_EXPR:
1406       overflow = div_and_round_double (code, uns,
1407                                        int1l, int1h, int2l, int2h,
1408                                        &garbagel, &garbageh, &low, &hi);
1409       break;
1410
1411     case MIN_EXPR:
1412     case MAX_EXPR:
1413       if (uns)
1414         low = (((unsigned HOST_WIDE_INT) int1h
1415                 < (unsigned HOST_WIDE_INT) int2h)
1416                || (((unsigned HOST_WIDE_INT) int1h
1417                     == (unsigned HOST_WIDE_INT) int2h)
1418                    && int1l < int2l));
1419       else
1420         low = (int1h < int2h
1421                || (int1h == int2h && int1l < int2l));
1422
1423       if (low == (code == MIN_EXPR))
1424         low = int1l, hi = int1h;
1425       else
1426         low = int2l, hi = int2h;
1427       break;
1428
1429     default:
1430       gcc_unreachable ();
1431     }
1432
1433   t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1434
1435   if (notrunc)
1436     {
1437       /* Propagate overflow flags ourselves.  */
1438       if (((!uns || is_sizetype) && overflow)
1439           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1440         {
1441           t = copy_node (t);
1442           TREE_OVERFLOW (t) = 1;
1443           TREE_CONSTANT_OVERFLOW (t) = 1;
1444         }
1445       else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1446         {
1447           t = copy_node (t);
1448           TREE_CONSTANT_OVERFLOW (t) = 1;
1449         }
1450     }
1451   else
1452     t = force_fit_type (t, 1,
1453                         ((!uns || is_sizetype) && overflow)
1454                         | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2),
1455                         TREE_CONSTANT_OVERFLOW (arg1)
1456                         | TREE_CONSTANT_OVERFLOW (arg2));
1457
1458   return t;
1459 }
1460
1461 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1462    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1463    are the same kind of constant and the same machine mode.
1464
1465    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1466
1467 static tree
1468 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1469 {
1470   STRIP_NOPS (arg1);
1471   STRIP_NOPS (arg2);
1472
1473   if (TREE_CODE (arg1) == INTEGER_CST)
1474     return int_const_binop (code, arg1, arg2, notrunc);
1475
1476   if (TREE_CODE (arg1) == REAL_CST)
1477     {
1478       enum machine_mode mode;
1479       REAL_VALUE_TYPE d1;
1480       REAL_VALUE_TYPE d2;
1481       REAL_VALUE_TYPE value;
1482       REAL_VALUE_TYPE result;
1483       bool inexact;
1484       tree t, type;
1485
1486       d1 = TREE_REAL_CST (arg1);
1487       d2 = TREE_REAL_CST (arg2);
1488
1489       type = TREE_TYPE (arg1);
1490       mode = TYPE_MODE (type);
1491
1492       /* Don't perform operation if we honor signaling NaNs and
1493          either operand is a NaN.  */
1494       if (HONOR_SNANS (mode)
1495           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1496         return NULL_TREE;
1497
1498       /* Don't perform operation if it would raise a division
1499          by zero exception.  */
1500       if (code == RDIV_EXPR
1501           && REAL_VALUES_EQUAL (d2, dconst0)
1502           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1503         return NULL_TREE;
1504
1505       /* If either operand is a NaN, just return it.  Otherwise, set up
1506          for floating-point trap; we return an overflow.  */
1507       if (REAL_VALUE_ISNAN (d1))
1508         return arg1;
1509       else if (REAL_VALUE_ISNAN (d2))
1510         return arg2;
1511
1512       inexact = real_arithmetic (&value, code, &d1, &d2);
1513       real_convert (&result, mode, &value);
1514
1515       /* Don't constant fold this floating point operation if the
1516          result may dependent upon the run-time rounding mode and
1517          flag_rounding_math is set, or if GCC's software emulation
1518          is unable to accurately represent the result.  */
1519       
1520       if ((flag_rounding_math
1521            || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1522                && !flag_unsafe_math_optimizations))
1523           && (inexact || !real_identical (&result, &value)))
1524         return NULL_TREE;
1525
1526       t = build_real (type, result);
1527
1528       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1529       TREE_CONSTANT_OVERFLOW (t)
1530         = TREE_OVERFLOW (t)
1531           | TREE_CONSTANT_OVERFLOW (arg1)
1532           | TREE_CONSTANT_OVERFLOW (arg2);
1533       return t;
1534     }
1535   if (TREE_CODE (arg1) == COMPLEX_CST)
1536     {
1537       tree type = TREE_TYPE (arg1);
1538       tree r1 = TREE_REALPART (arg1);
1539       tree i1 = TREE_IMAGPART (arg1);
1540       tree r2 = TREE_REALPART (arg2);
1541       tree i2 = TREE_IMAGPART (arg2);
1542       tree t;
1543
1544       switch (code)
1545         {
1546         case PLUS_EXPR:
1547           t = build_complex (type,
1548                              const_binop (PLUS_EXPR, r1, r2, notrunc),
1549                              const_binop (PLUS_EXPR, i1, i2, notrunc));
1550           break;
1551
1552         case MINUS_EXPR:
1553           t = build_complex (type,
1554                              const_binop (MINUS_EXPR, r1, r2, notrunc),
1555                              const_binop (MINUS_EXPR, i1, i2, notrunc));
1556           break;
1557
1558         case MULT_EXPR:
1559           t = build_complex (type,
1560                              const_binop (MINUS_EXPR,
1561                                           const_binop (MULT_EXPR,
1562                                                        r1, r2, notrunc),
1563                                           const_binop (MULT_EXPR,
1564                                                        i1, i2, notrunc),
1565                                           notrunc),
1566                              const_binop (PLUS_EXPR,
1567                                           const_binop (MULT_EXPR,
1568                                                        r1, i2, notrunc),
1569                                           const_binop (MULT_EXPR,
1570                                                        i1, r2, notrunc),
1571                                           notrunc));
1572           break;
1573
1574         case RDIV_EXPR:
1575           {
1576             tree magsquared
1577               = const_binop (PLUS_EXPR,
1578                              const_binop (MULT_EXPR, r2, r2, notrunc),
1579                              const_binop (MULT_EXPR, i2, i2, notrunc),
1580                              notrunc);
1581
1582             t = build_complex (type,
1583                                const_binop
1584                                (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1585                                 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1586                                 const_binop (PLUS_EXPR,
1587                                              const_binop (MULT_EXPR, r1, r2,
1588                                                           notrunc),
1589                                              const_binop (MULT_EXPR, i1, i2,
1590                                                           notrunc),
1591                                              notrunc),
1592                                 magsquared, notrunc),
1593                                const_binop
1594                                (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1595                                 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1596                                 const_binop (MINUS_EXPR,
1597                                              const_binop (MULT_EXPR, i1, r2,
1598                                                           notrunc),
1599                                              const_binop (MULT_EXPR, r1, i2,
1600                                                           notrunc),
1601                                              notrunc),
1602                                 magsquared, notrunc));
1603           }
1604           break;
1605
1606         default:
1607           gcc_unreachable ();
1608         }
1609       return t;
1610     }
1611   return 0;
1612 }
1613
1614 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
1615    indicates which particular sizetype to create.  */
1616
1617 tree
1618 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1619 {
1620   return build_int_cst (sizetype_tab[(int) kind], number);
1621 }
1622 \f
1623 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1624    is a tree code.  The type of the result is taken from the operands.
1625    Both must be the same type integer type and it must be a size type.
1626    If the operands are constant, so is the result.  */
1627
1628 tree
1629 size_binop (enum tree_code code, tree arg0, tree arg1)
1630 {
1631   tree type = TREE_TYPE (arg0);
1632
1633   gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1634               && type == TREE_TYPE (arg1));
1635
1636   /* Handle the special case of two integer constants faster.  */
1637   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1638     {
1639       /* And some specific cases even faster than that.  */
1640       if (code == PLUS_EXPR && integer_zerop (arg0))
1641         return arg1;
1642       else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1643                && integer_zerop (arg1))
1644         return arg0;
1645       else if (code == MULT_EXPR && integer_onep (arg0))
1646         return arg1;
1647
1648       /* Handle general case of two integer constants.  */
1649       return int_const_binop (code, arg0, arg1, 0);
1650     }
1651
1652   if (arg0 == error_mark_node || arg1 == error_mark_node)
1653     return error_mark_node;
1654
1655   return fold_build2 (code, type, arg0, arg1);
1656 }
1657
1658 /* Given two values, either both of sizetype or both of bitsizetype,
1659    compute the difference between the two values.  Return the value
1660    in signed type corresponding to the type of the operands.  */
1661
1662 tree
1663 size_diffop (tree arg0, tree arg1)
1664 {
1665   tree type = TREE_TYPE (arg0);
1666   tree ctype;
1667
1668   gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1669               && type == TREE_TYPE (arg1));
1670
1671   /* If the type is already signed, just do the simple thing.  */
1672   if (!TYPE_UNSIGNED (type))
1673     return size_binop (MINUS_EXPR, arg0, arg1);
1674
1675   ctype = type == bitsizetype ? sbitsizetype : ssizetype;
1676
1677   /* If either operand is not a constant, do the conversions to the signed
1678      type and subtract.  The hardware will do the right thing with any
1679      overflow in the subtraction.  */
1680   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1681     return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
1682                        fold_convert (ctype, arg1));
1683
1684   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1685      Otherwise, subtract the other way, convert to CTYPE (we know that can't
1686      overflow) and negate (which can't either).  Special-case a result
1687      of zero while we're here.  */
1688   if (tree_int_cst_equal (arg0, arg1))
1689     return fold_convert (ctype, integer_zero_node);
1690   else if (tree_int_cst_lt (arg1, arg0))
1691     return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
1692   else
1693     return size_binop (MINUS_EXPR, fold_convert (ctype, integer_zero_node),
1694                        fold_convert (ctype, size_binop (MINUS_EXPR,
1695                                                         arg1, arg0)));
1696 }
1697 \f
1698 /* A subroutine of fold_convert_const handling conversions of an
1699    INTEGER_CST to another integer type.  */
1700
1701 static tree
1702 fold_convert_const_int_from_int (tree type, tree arg1)
1703 {
1704   tree t;
1705
1706   /* Given an integer constant, make new constant with new type,
1707      appropriately sign-extended or truncated.  */
1708   t = build_int_cst_wide (type, TREE_INT_CST_LOW (arg1),
1709                           TREE_INT_CST_HIGH (arg1));
1710
1711   t = force_fit_type (t,
1712                       /* Don't set the overflow when
1713                          converting a pointer  */
1714                       !POINTER_TYPE_P (TREE_TYPE (arg1)),
1715                       (TREE_INT_CST_HIGH (arg1) < 0
1716                        && (TYPE_UNSIGNED (type)
1717                            < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1718                       | TREE_OVERFLOW (arg1),
1719                       TREE_CONSTANT_OVERFLOW (arg1));
1720
1721   return t;
1722 }
1723
1724 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1725    to an integer type.  */
1726
1727 static tree
1728 fold_convert_const_int_from_real (enum tree_code code, tree type, tree arg1)
1729 {
1730   int overflow = 0;
1731   tree t;
1732
1733   /* The following code implements the floating point to integer
1734      conversion rules required by the Java Language Specification,
1735      that IEEE NaNs are mapped to zero and values that overflow
1736      the target precision saturate, i.e. values greater than
1737      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1738      are mapped to INT_MIN.  These semantics are allowed by the
1739      C and C++ standards that simply state that the behavior of
1740      FP-to-integer conversion is unspecified upon overflow.  */
1741
1742   HOST_WIDE_INT high, low;
1743   REAL_VALUE_TYPE r;
1744   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
1745
1746   switch (code)
1747     {
1748     case FIX_TRUNC_EXPR:
1749       real_trunc (&r, VOIDmode, &x);
1750       break;
1751
1752     case FIX_CEIL_EXPR:
1753       real_ceil (&r, VOIDmode, &x);
1754       break;
1755
1756     case FIX_FLOOR_EXPR:
1757       real_floor (&r, VOIDmode, &x);
1758       break;
1759
1760     case FIX_ROUND_EXPR:
1761       real_round (&r, VOIDmode, &x);
1762       break;
1763
1764     default:
1765       gcc_unreachable ();
1766     }
1767
1768   /* If R is NaN, return zero and show we have an overflow.  */
1769   if (REAL_VALUE_ISNAN (r))
1770     {
1771       overflow = 1;
1772       high = 0;
1773       low = 0;
1774     }
1775
1776   /* See if R is less than the lower bound or greater than the
1777      upper bound.  */
1778
1779   if (! overflow)
1780     {
1781       tree lt = TYPE_MIN_VALUE (type);
1782       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
1783       if (REAL_VALUES_LESS (r, l))
1784         {
1785           overflow = 1;
1786           high = TREE_INT_CST_HIGH (lt);
1787           low = TREE_INT_CST_LOW (lt);
1788         }
1789     }
1790
1791   if (! overflow)
1792     {
1793       tree ut = TYPE_MAX_VALUE (type);
1794       if (ut)
1795         {
1796           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
1797           if (REAL_VALUES_LESS (u, r))
1798             {
1799               overflow = 1;
1800               high = TREE_INT_CST_HIGH (ut);
1801               low = TREE_INT_CST_LOW (ut);
1802             }
1803         }
1804     }
1805
1806   if (! overflow)
1807     REAL_VALUE_TO_INT (&low, &high, r);
1808
1809   t = build_int_cst_wide (type, low, high);
1810
1811   t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg1),
1812                       TREE_CONSTANT_OVERFLOW (arg1));
1813   return t;
1814 }
1815
1816 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1817    to another floating point type.  */
1818
1819 static tree
1820 fold_convert_const_real_from_real (tree type, tree arg1)
1821 {
1822   REAL_VALUE_TYPE value;
1823   tree t;
1824
1825   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
1826   t = build_real (type, value);
1827
1828   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
1829   TREE_CONSTANT_OVERFLOW (t)
1830     = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1831   return t;
1832 }
1833
1834 /* Attempt to fold type conversion operation CODE of expression ARG1 to
1835    type TYPE.  If no simplification can be done return NULL_TREE.  */
1836
1837 static tree
1838 fold_convert_const (enum tree_code code, tree type, tree arg1)
1839 {
1840   if (TREE_TYPE (arg1) == type)
1841     return arg1;
1842
1843   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
1844     {
1845       if (TREE_CODE (arg1) == INTEGER_CST)
1846         return fold_convert_const_int_from_int (type, arg1);
1847       else if (TREE_CODE (arg1) == REAL_CST)
1848         return fold_convert_const_int_from_real (code, type, arg1);
1849     }
1850   else if (TREE_CODE (type) == REAL_TYPE)
1851     {
1852       if (TREE_CODE (arg1) == INTEGER_CST)
1853         return build_real_from_int_cst (type, arg1);
1854       if (TREE_CODE (arg1) == REAL_CST)
1855         return fold_convert_const_real_from_real (type, arg1);
1856     }
1857   return NULL_TREE;
1858 }
1859
1860 /* Construct a vector of zero elements of vector type TYPE.  */
1861
1862 static tree
1863 build_zero_vector (tree type)
1864 {
1865   tree elem, list;
1866   int i, units;
1867
1868   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
1869   units = TYPE_VECTOR_SUBPARTS (type);
1870   
1871   list = NULL_TREE;
1872   for (i = 0; i < units; i++)
1873     list = tree_cons (NULL_TREE, elem, list);
1874   return build_vector (type, list);
1875 }
1876
1877 /* Convert expression ARG to type TYPE.  Used by the middle-end for
1878    simple conversions in preference to calling the front-end's convert.  */
1879
1880 tree
1881 fold_convert (tree type, tree arg)
1882 {
1883   tree orig = TREE_TYPE (arg);
1884   tree tem;
1885
1886   if (type == orig)
1887     return arg;
1888
1889   if (TREE_CODE (arg) == ERROR_MARK
1890       || TREE_CODE (type) == ERROR_MARK
1891       || TREE_CODE (orig) == ERROR_MARK)
1892     return error_mark_node;
1893
1894   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)
1895       || lang_hooks.types_compatible_p (TYPE_MAIN_VARIANT (type),
1896                                         TYPE_MAIN_VARIANT (orig)))
1897     return fold_build1 (NOP_EXPR, type, arg);
1898
1899   switch (TREE_CODE (type))
1900     {
1901     case INTEGER_TYPE: case CHAR_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
1902     case POINTER_TYPE: case REFERENCE_TYPE:
1903     case OFFSET_TYPE:
1904       if (TREE_CODE (arg) == INTEGER_CST)
1905         {
1906           tem = fold_convert_const (NOP_EXPR, type, arg);
1907           if (tem != NULL_TREE)
1908             return tem;
1909         }
1910       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1911           || TREE_CODE (orig) == OFFSET_TYPE)
1912         return fold_build1 (NOP_EXPR, type, arg);
1913       if (TREE_CODE (orig) == COMPLEX_TYPE)
1914         {
1915           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
1916           return fold_convert (type, tem);
1917         }
1918       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
1919                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1920       return fold_build1 (NOP_EXPR, type, arg);
1921
1922     case REAL_TYPE:
1923       if (TREE_CODE (arg) == INTEGER_CST)
1924         {
1925           tem = fold_convert_const (FLOAT_EXPR, type, arg);
1926           if (tem != NULL_TREE)
1927             return tem;
1928         }
1929       else if (TREE_CODE (arg) == REAL_CST)
1930         {
1931           tem = fold_convert_const (NOP_EXPR, type, arg);
1932           if (tem != NULL_TREE)
1933             return tem;
1934         }
1935
1936       switch (TREE_CODE (orig))
1937         {
1938         case INTEGER_TYPE: case CHAR_TYPE:
1939         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1940         case POINTER_TYPE: case REFERENCE_TYPE:
1941           return fold_build1 (FLOAT_EXPR, type, arg);
1942
1943         case REAL_TYPE:
1944           return fold_build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
1945                               type, arg);
1946
1947         case COMPLEX_TYPE:
1948           tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
1949           return fold_convert (type, tem);
1950
1951         default:
1952           gcc_unreachable ();
1953         }
1954
1955     case COMPLEX_TYPE:
1956       switch (TREE_CODE (orig))
1957         {
1958         case INTEGER_TYPE: case CHAR_TYPE:
1959         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1960         case POINTER_TYPE: case REFERENCE_TYPE:
1961         case REAL_TYPE:
1962           return build2 (COMPLEX_EXPR, type,
1963                          fold_convert (TREE_TYPE (type), arg),
1964                          fold_convert (TREE_TYPE (type), integer_zero_node));
1965         case COMPLEX_TYPE:
1966           {
1967             tree rpart, ipart;
1968
1969             if (TREE_CODE (arg) == COMPLEX_EXPR)
1970               {
1971                 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
1972                 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
1973                 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
1974               }
1975
1976             arg = save_expr (arg);
1977             rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
1978             ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
1979             rpart = fold_convert (TREE_TYPE (type), rpart);
1980             ipart = fold_convert (TREE_TYPE (type), ipart);
1981             return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
1982           }
1983
1984         default:
1985           gcc_unreachable ();
1986         }
1987
1988     case VECTOR_TYPE:
1989       if (integer_zerop (arg))
1990         return build_zero_vector (type);
1991       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1992       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1993                   || TREE_CODE (orig) == VECTOR_TYPE);
1994       return fold_build1 (NOP_EXPR, type, arg);
1995
1996     case VOID_TYPE:
1997       return fold_build1 (CONVERT_EXPR, type, fold_ignored_result (arg));
1998
1999     default:
2000       gcc_unreachable ();
2001     }
2002 }
2003 \f
2004 /* Return false if expr can be assumed not to be an value, true
2005    otherwise.  */
2006
2007 static bool
2008 maybe_lvalue_p (tree x)
2009 {
2010   /* We only need to wrap lvalue tree codes.  */
2011   switch (TREE_CODE (x))
2012   {
2013   case VAR_DECL:
2014   case PARM_DECL:
2015   case RESULT_DECL:
2016   case LABEL_DECL:
2017   case FUNCTION_DECL:
2018   case SSA_NAME:
2019
2020   case COMPONENT_REF:
2021   case INDIRECT_REF:
2022   case ALIGN_INDIRECT_REF:
2023   case MISALIGNED_INDIRECT_REF:
2024   case ARRAY_REF:
2025   case ARRAY_RANGE_REF:
2026   case BIT_FIELD_REF:
2027   case OBJ_TYPE_REF:
2028
2029   case REALPART_EXPR:
2030   case IMAGPART_EXPR:
2031   case PREINCREMENT_EXPR:
2032   case PREDECREMENT_EXPR:
2033   case SAVE_EXPR:
2034   case TRY_CATCH_EXPR:
2035   case WITH_CLEANUP_EXPR:
2036   case COMPOUND_EXPR:
2037   case MODIFY_EXPR:
2038   case TARGET_EXPR:
2039   case COND_EXPR:
2040   case BIND_EXPR:
2041   case MIN_EXPR:
2042   case MAX_EXPR:
2043     break;
2044
2045   default:
2046     /* Assume the worst for front-end tree codes.  */
2047     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2048       break;
2049     return false;
2050   }
2051
2052   return true;
2053 }
2054
2055 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2056
2057 tree
2058 non_lvalue (tree x)
2059 {
2060   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2061      us.  */
2062   if (in_gimple_form)
2063     return x;
2064
2065   if (! maybe_lvalue_p (x))
2066     return x;
2067   return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2068 }
2069
2070 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2071    Zero means allow extended lvalues.  */
2072
2073 int pedantic_lvalues;
2074
2075 /* When pedantic, return an expr equal to X but certainly not valid as a
2076    pedantic lvalue.  Otherwise, return X.  */
2077
2078 static tree
2079 pedantic_non_lvalue (tree x)
2080 {
2081   if (pedantic_lvalues)
2082     return non_lvalue (x);
2083   else
2084     return x;
2085 }
2086 \f
2087 /* Given a tree comparison code, return the code that is the logical inverse
2088    of the given code.  It is not safe to do this for floating-point
2089    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2090    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2091
2092 static enum tree_code
2093 invert_tree_comparison (enum tree_code code, bool honor_nans)
2094 {
2095   if (honor_nans && flag_trapping_math)
2096     return ERROR_MARK;
2097
2098   switch (code)
2099     {
2100     case EQ_EXPR:
2101       return NE_EXPR;
2102     case NE_EXPR:
2103       return EQ_EXPR;
2104     case GT_EXPR:
2105       return honor_nans ? UNLE_EXPR : LE_EXPR;
2106     case GE_EXPR:
2107       return honor_nans ? UNLT_EXPR : LT_EXPR;
2108     case LT_EXPR:
2109       return honor_nans ? UNGE_EXPR : GE_EXPR;
2110     case LE_EXPR:
2111       return honor_nans ? UNGT_EXPR : GT_EXPR;
2112     case LTGT_EXPR:
2113       return UNEQ_EXPR;
2114     case UNEQ_EXPR:
2115       return LTGT_EXPR;
2116     case UNGT_EXPR:
2117       return LE_EXPR;
2118     case UNGE_EXPR:
2119       return LT_EXPR;
2120     case UNLT_EXPR:
2121       return GE_EXPR;
2122     case UNLE_EXPR:
2123       return GT_EXPR;
2124     case ORDERED_EXPR:
2125       return UNORDERED_EXPR;
2126     case UNORDERED_EXPR:
2127       return ORDERED_EXPR;
2128     default:
2129       gcc_unreachable ();
2130     }
2131 }
2132
2133 /* Similar, but return the comparison that results if the operands are
2134    swapped.  This is safe for floating-point.  */
2135
2136 enum tree_code
2137 swap_tree_comparison (enum tree_code code)
2138 {
2139   switch (code)
2140     {
2141     case EQ_EXPR:
2142     case NE_EXPR:
2143       return code;
2144     case GT_EXPR:
2145       return LT_EXPR;
2146     case GE_EXPR:
2147       return LE_EXPR;
2148     case LT_EXPR:
2149       return GT_EXPR;
2150     case LE_EXPR:
2151       return GE_EXPR;
2152     default:
2153       gcc_unreachable ();
2154     }
2155 }
2156
2157
2158 /* Convert a comparison tree code from an enum tree_code representation
2159    into a compcode bit-based encoding.  This function is the inverse of
2160    compcode_to_comparison.  */
2161
2162 static enum comparison_code
2163 comparison_to_compcode (enum tree_code code)
2164 {
2165   switch (code)
2166     {
2167     case LT_EXPR:
2168       return COMPCODE_LT;
2169     case EQ_EXPR:
2170       return COMPCODE_EQ;
2171     case LE_EXPR:
2172       return COMPCODE_LE;
2173     case GT_EXPR:
2174       return COMPCODE_GT;
2175     case NE_EXPR:
2176       return COMPCODE_NE;
2177     case GE_EXPR:
2178       return COMPCODE_GE;
2179     case ORDERED_EXPR:
2180       return COMPCODE_ORD;
2181     case UNORDERED_EXPR:
2182       return COMPCODE_UNORD;
2183     case UNLT_EXPR:
2184       return COMPCODE_UNLT;
2185     case UNEQ_EXPR:
2186       return COMPCODE_UNEQ;
2187     case UNLE_EXPR:
2188       return COMPCODE_UNLE;
2189     case UNGT_EXPR:
2190       return COMPCODE_UNGT;
2191     case LTGT_EXPR:
2192       return COMPCODE_LTGT;
2193     case UNGE_EXPR:
2194       return COMPCODE_UNGE;
2195     default:
2196       gcc_unreachable ();
2197     }
2198 }
2199
2200 /* Convert a compcode bit-based encoding of a comparison operator back
2201    to GCC's enum tree_code representation.  This function is the
2202    inverse of comparison_to_compcode.  */
2203
2204 static enum tree_code
2205 compcode_to_comparison (enum comparison_code code)
2206 {
2207   switch (code)
2208     {
2209     case COMPCODE_LT:
2210       return LT_EXPR;
2211     case COMPCODE_EQ:
2212       return EQ_EXPR;
2213     case COMPCODE_LE:
2214       return LE_EXPR;
2215     case COMPCODE_GT:
2216       return GT_EXPR;
2217     case COMPCODE_NE:
2218       return NE_EXPR;
2219     case COMPCODE_GE:
2220       return GE_EXPR;
2221     case COMPCODE_ORD:
2222       return ORDERED_EXPR;
2223     case COMPCODE_UNORD:
2224       return UNORDERED_EXPR;
2225     case COMPCODE_UNLT:
2226       return UNLT_EXPR;
2227     case COMPCODE_UNEQ:
2228       return UNEQ_EXPR;
2229     case COMPCODE_UNLE:
2230       return UNLE_EXPR;
2231     case COMPCODE_UNGT:
2232       return UNGT_EXPR;
2233     case COMPCODE_LTGT:
2234       return LTGT_EXPR;
2235     case COMPCODE_UNGE:
2236       return UNGE_EXPR;
2237     default:
2238       gcc_unreachable ();
2239     }
2240 }
2241
2242 /* Return a tree for the comparison which is the combination of
2243    doing the AND or OR (depending on CODE) of the two operations LCODE
2244    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2245    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2246    if this makes the transformation invalid.  */
2247
2248 tree
2249 combine_comparisons (enum tree_code code, enum tree_code lcode,
2250                      enum tree_code rcode, tree truth_type,
2251                      tree ll_arg, tree lr_arg)
2252 {
2253   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2254   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2255   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2256   enum comparison_code compcode;
2257
2258   switch (code)
2259     {
2260     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2261       compcode = lcompcode & rcompcode;
2262       break;
2263
2264     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2265       compcode = lcompcode | rcompcode;
2266       break;
2267
2268     default:
2269       return NULL_TREE;
2270     }
2271
2272   if (!honor_nans)
2273     {
2274       /* Eliminate unordered comparisons, as well as LTGT and ORD
2275          which are not used unless the mode has NaNs.  */
2276       compcode &= ~COMPCODE_UNORD;
2277       if (compcode == COMPCODE_LTGT)
2278         compcode = COMPCODE_NE;
2279       else if (compcode == COMPCODE_ORD)
2280         compcode = COMPCODE_TRUE;
2281     }
2282    else if (flag_trapping_math)
2283      {
2284         /* Check that the original operation and the optimized ones will trap
2285            under the same condition.  */
2286         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2287                      && (lcompcode != COMPCODE_EQ)
2288                      && (lcompcode != COMPCODE_ORD);
2289         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2290                      && (rcompcode != COMPCODE_EQ)
2291                      && (rcompcode != COMPCODE_ORD);
2292         bool trap = (compcode & COMPCODE_UNORD) == 0
2293                     && (compcode != COMPCODE_EQ)
2294                     && (compcode != COMPCODE_ORD);
2295
2296         /* In a short-circuited boolean expression the LHS might be
2297            such that the RHS, if evaluated, will never trap.  For
2298            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2299            if neither x nor y is NaN.  (This is a mixed blessing: for
2300            example, the expression above will never trap, hence
2301            optimizing it to x < y would be invalid).  */
2302         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2303             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2304           rtrap = false;
2305
2306         /* If the comparison was short-circuited, and only the RHS
2307            trapped, we may now generate a spurious trap.  */
2308         if (rtrap && !ltrap
2309             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2310           return NULL_TREE;
2311
2312         /* If we changed the conditions that cause a trap, we lose.  */
2313         if ((ltrap || rtrap) != trap)
2314           return NULL_TREE;
2315       }
2316
2317   if (compcode == COMPCODE_TRUE)
2318     return constant_boolean_node (true, truth_type);
2319   else if (compcode == COMPCODE_FALSE)
2320     return constant_boolean_node (false, truth_type);
2321   else
2322     return fold_build2 (compcode_to_comparison (compcode),
2323                         truth_type, ll_arg, lr_arg);
2324 }
2325
2326 /* Return nonzero if CODE is a tree code that represents a truth value.  */
2327
2328 static int
2329 truth_value_p (enum tree_code code)
2330 {
2331   return (TREE_CODE_CLASS (code) == tcc_comparison
2332           || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2333           || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2334           || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2335 }
2336 \f
2337 /* Return nonzero if two operands (typically of the same tree node)
2338    are necessarily equal.  If either argument has side-effects this
2339    function returns zero.  FLAGS modifies behavior as follows:
2340
2341    If OEP_ONLY_CONST is set, only return nonzero for constants.
2342    This function tests whether the operands are indistinguishable;
2343    it does not test whether they are equal using C's == operation.
2344    The distinction is important for IEEE floating point, because
2345    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2346    (2) two NaNs may be indistinguishable, but NaN!=NaN.
2347
2348    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2349    even though it may hold multiple values during a function.
2350    This is because a GCC tree node guarantees that nothing else is
2351    executed between the evaluation of its "operands" (which may often
2352    be evaluated in arbitrary order).  Hence if the operands themselves
2353    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2354    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
2355    unset means assuming isochronic (or instantaneous) tree equivalence.
2356    Unless comparing arbitrary expression trees, such as from different
2357    statements, this flag can usually be left unset.
2358
2359    If OEP_PURE_SAME is set, then pure functions with identical arguments
2360    are considered the same.  It is used when the caller has other ways
2361    to ensure that global memory is unchanged in between.  */
2362
2363 int
2364 operand_equal_p (tree arg0, tree arg1, unsigned int flags)
2365 {
2366   /* If either is ERROR_MARK, they aren't equal.  */
2367   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
2368     return 0;
2369
2370   /* If both types don't have the same signedness, then we can't consider
2371      them equal.  We must check this before the STRIP_NOPS calls
2372      because they may change the signedness of the arguments.  */
2373   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2374     return 0;
2375
2376   STRIP_NOPS (arg0);
2377   STRIP_NOPS (arg1);
2378
2379   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2380       /* This is needed for conversions and for COMPONENT_REF.
2381          Might as well play it safe and always test this.  */
2382       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2383       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2384       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2385     return 0;
2386
2387   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2388      We don't care about side effects in that case because the SAVE_EXPR
2389      takes care of that for us. In all other cases, two expressions are
2390      equal if they have no side effects.  If we have two identical
2391      expressions with side effects that should be treated the same due
2392      to the only side effects being identical SAVE_EXPR's, that will
2393      be detected in the recursive calls below.  */
2394   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2395       && (TREE_CODE (arg0) == SAVE_EXPR
2396           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2397     return 1;
2398
2399   /* Next handle constant cases, those for which we can return 1 even
2400      if ONLY_CONST is set.  */
2401   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2402     switch (TREE_CODE (arg0))
2403       {
2404       case INTEGER_CST:
2405         return (! TREE_CONSTANT_OVERFLOW (arg0)
2406                 && ! TREE_CONSTANT_OVERFLOW (arg1)
2407                 && tree_int_cst_equal (arg0, arg1));
2408
2409       case REAL_CST:
2410         return (! TREE_CONSTANT_OVERFLOW (arg0)
2411                 && ! TREE_CONSTANT_OVERFLOW (arg1)
2412                 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2413                                           TREE_REAL_CST (arg1)));
2414
2415       case VECTOR_CST:
2416         {
2417           tree v1, v2;
2418
2419           if (TREE_CONSTANT_OVERFLOW (arg0)
2420               || TREE_CONSTANT_OVERFLOW (arg1))
2421             return 0;
2422
2423           v1 = TREE_VECTOR_CST_ELTS (arg0);
2424           v2 = TREE_VECTOR_CST_ELTS (arg1);
2425           while (v1 && v2)
2426             {
2427               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
2428                                     flags))
2429                 return 0;
2430               v1 = TREE_CHAIN (v1);
2431               v2 = TREE_CHAIN (v2);
2432             }
2433
2434           return 1;
2435         }
2436
2437       case COMPLEX_CST:
2438         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2439                                  flags)
2440                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2441                                     flags));
2442
2443       case STRING_CST:
2444         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2445                 && ! memcmp (TREE_STRING_POINTER (arg0),
2446                               TREE_STRING_POINTER (arg1),
2447                               TREE_STRING_LENGTH (arg0)));
2448
2449       case ADDR_EXPR:
2450         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2451                                 0);
2452       default:
2453         break;
2454       }
2455
2456   if (flags & OEP_ONLY_CONST)
2457     return 0;
2458
2459 /* Define macros to test an operand from arg0 and arg1 for equality and a
2460    variant that allows null and views null as being different from any
2461    non-null value.  In the latter case, if either is null, the both
2462    must be; otherwise, do the normal comparison.  */
2463 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
2464                                     TREE_OPERAND (arg1, N), flags)
2465
2466 #define OP_SAME_WITH_NULL(N)                            \
2467   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
2468    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2469
2470   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2471     {
2472     case tcc_unary:
2473       /* Two conversions are equal only if signedness and modes match.  */
2474       switch (TREE_CODE (arg0))
2475         {
2476         case NOP_EXPR:
2477         case CONVERT_EXPR:
2478         case FIX_CEIL_EXPR:
2479         case FIX_TRUNC_EXPR:
2480         case FIX_FLOOR_EXPR:
2481         case FIX_ROUND_EXPR:
2482           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2483               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2484             return 0;
2485           break;
2486         default:
2487           break;
2488         }
2489
2490       return OP_SAME (0);
2491
2492
2493     case tcc_comparison:
2494     case tcc_binary:
2495       if (OP_SAME (0) && OP_SAME (1))
2496         return 1;
2497
2498       /* For commutative ops, allow the other order.  */
2499       return (commutative_tree_code (TREE_CODE (arg0))
2500               && operand_equal_p (TREE_OPERAND (arg0, 0),
2501                                   TREE_OPERAND (arg1, 1), flags)
2502               && operand_equal_p (TREE_OPERAND (arg0, 1),
2503                                   TREE_OPERAND (arg1, 0), flags));
2504
2505     case tcc_reference:
2506       /* If either of the pointer (or reference) expressions we are
2507          dereferencing contain a side effect, these cannot be equal.  */
2508       if (TREE_SIDE_EFFECTS (arg0)
2509           || TREE_SIDE_EFFECTS (arg1))
2510         return 0;
2511
2512       switch (TREE_CODE (arg0))
2513         {
2514         case INDIRECT_REF:
2515         case ALIGN_INDIRECT_REF:
2516         case MISALIGNED_INDIRECT_REF:
2517         case REALPART_EXPR:
2518         case IMAGPART_EXPR:
2519           return OP_SAME (0);
2520
2521         case ARRAY_REF:
2522         case ARRAY_RANGE_REF:
2523           /* Operands 2 and 3 may be null.  */
2524           return (OP_SAME (0)
2525                   && OP_SAME (1)
2526                   && OP_SAME_WITH_NULL (2)
2527                   && OP_SAME_WITH_NULL (3));
2528
2529         case COMPONENT_REF:
2530           /* Handle operand 2 the same as for ARRAY_REF.  */
2531           return OP_SAME (0) && OP_SAME (1) && OP_SAME_WITH_NULL (2);
2532
2533         case BIT_FIELD_REF:
2534           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
2535
2536         default:
2537           return 0;
2538         }
2539
2540     case tcc_expression:
2541       switch (TREE_CODE (arg0))
2542         {
2543         case ADDR_EXPR:
2544         case TRUTH_NOT_EXPR:
2545           return OP_SAME (0);
2546
2547         case TRUTH_ANDIF_EXPR:
2548         case TRUTH_ORIF_EXPR:
2549           return OP_SAME (0) && OP_SAME (1);
2550
2551         case TRUTH_AND_EXPR:
2552         case TRUTH_OR_EXPR:
2553         case TRUTH_XOR_EXPR:
2554           if (OP_SAME (0) && OP_SAME (1))
2555             return 1;
2556
2557           /* Otherwise take into account this is a commutative operation.  */
2558           return (operand_equal_p (TREE_OPERAND (arg0, 0),
2559                                    TREE_OPERAND (arg1, 1), flags)
2560                   && operand_equal_p (TREE_OPERAND (arg0, 1),
2561                                       TREE_OPERAND (arg1, 0), flags));
2562
2563         case CALL_EXPR:
2564           /* If the CALL_EXPRs call different functions, then they
2565              clearly can not be equal.  */
2566           if (!OP_SAME (0))
2567             return 0;
2568
2569           {
2570             unsigned int cef = call_expr_flags (arg0);
2571             if (flags & OEP_PURE_SAME)
2572               cef &= ECF_CONST | ECF_PURE;
2573             else
2574               cef &= ECF_CONST;
2575             if (!cef)
2576               return 0;
2577           }
2578
2579           /* Now see if all the arguments are the same.  operand_equal_p
2580              does not handle TREE_LIST, so we walk the operands here
2581              feeding them to operand_equal_p.  */
2582           arg0 = TREE_OPERAND (arg0, 1);
2583           arg1 = TREE_OPERAND (arg1, 1);
2584           while (arg0 && arg1)
2585             {
2586               if (! operand_equal_p (TREE_VALUE (arg0), TREE_VALUE (arg1),
2587                                      flags))
2588                 return 0;
2589
2590               arg0 = TREE_CHAIN (arg0);
2591               arg1 = TREE_CHAIN (arg1);
2592             }
2593
2594           /* If we get here and both argument lists are exhausted
2595              then the CALL_EXPRs are equal.  */
2596           return ! (arg0 || arg1);
2597
2598         default:
2599           return 0;
2600         }
2601
2602     case tcc_declaration:
2603       /* Consider __builtin_sqrt equal to sqrt.  */
2604       return (TREE_CODE (arg0) == FUNCTION_DECL
2605               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2606               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2607               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
2608
2609     default:
2610       return 0;
2611     }
2612
2613 #undef OP_SAME
2614 #undef OP_SAME_WITH_NULL
2615 }
2616 \f
2617 /* Similar to operand_equal_p, but see if ARG0 might have been made by
2618    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
2619
2620    When in doubt, return 0.  */
2621
2622 static int
2623 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
2624 {
2625   int unsignedp1, unsignedpo;
2626   tree primarg0, primarg1, primother;
2627   unsigned int correct_width;
2628
2629   if (operand_equal_p (arg0, arg1, 0))
2630     return 1;
2631
2632   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
2633       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
2634     return 0;
2635
2636   /* Discard any conversions that don't change the modes of ARG0 and ARG1
2637      and see if the inner values are the same.  This removes any
2638      signedness comparison, which doesn't matter here.  */
2639   primarg0 = arg0, primarg1 = arg1;
2640   STRIP_NOPS (primarg0);
2641   STRIP_NOPS (primarg1);
2642   if (operand_equal_p (primarg0, primarg1, 0))
2643     return 1;
2644
2645   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
2646      actual comparison operand, ARG0.
2647
2648      First throw away any conversions to wider types
2649      already present in the operands.  */
2650
2651   primarg1 = get_narrower (arg1, &unsignedp1);
2652   primother = get_narrower (other, &unsignedpo);
2653
2654   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
2655   if (unsignedp1 == unsignedpo
2656       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
2657       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
2658     {
2659       tree type = TREE_TYPE (arg0);
2660
2661       /* Make sure shorter operand is extended the right way
2662          to match the longer operand.  */
2663       primarg1 = fold_convert (lang_hooks.types.signed_or_unsigned_type
2664                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
2665
2666       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
2667         return 1;
2668     }
2669
2670   return 0;
2671 }
2672 \f
2673 /* See if ARG is an expression that is either a comparison or is performing
2674    arithmetic on comparisons.  The comparisons must only be comparing
2675    two different values, which will be stored in *CVAL1 and *CVAL2; if
2676    they are nonzero it means that some operands have already been found.
2677    No variables may be used anywhere else in the expression except in the
2678    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
2679    the expression and save_expr needs to be called with CVAL1 and CVAL2.
2680
2681    If this is true, return 1.  Otherwise, return zero.  */
2682
2683 static int
2684 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
2685 {
2686   enum tree_code code = TREE_CODE (arg);
2687   enum tree_code_class class = TREE_CODE_CLASS (code);
2688
2689   /* We can handle some of the tcc_expression cases here.  */
2690   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
2691     class = tcc_unary;
2692   else if (class == tcc_expression
2693            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2694                || code == COMPOUND_EXPR))
2695     class = tcc_binary;
2696
2697   else if (class == tcc_expression && code == SAVE_EXPR
2698            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
2699     {
2700       /* If we've already found a CVAL1 or CVAL2, this expression is
2701          two complex to handle.  */
2702       if (*cval1 || *cval2)
2703         return 0;
2704
2705       class = tcc_unary;
2706       *save_p = 1;
2707     }
2708
2709   switch (class)
2710     {
2711     case tcc_unary:
2712       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
2713
2714     case tcc_binary:
2715       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2716               && twoval_comparison_p (TREE_OPERAND (arg, 1),
2717                                       cval1, cval2, save_p));
2718
2719     case tcc_constant:
2720       return 1;
2721
2722     case tcc_expression:
2723       if (code == COND_EXPR)
2724         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2725                                      cval1, cval2, save_p)
2726                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2727                                         cval1, cval2, save_p)
2728                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
2729                                         cval1, cval2, save_p));
2730       return 0;
2731
2732     case tcc_comparison:
2733       /* First see if we can handle the first operand, then the second.  For
2734          the second operand, we know *CVAL1 can't be zero.  It must be that
2735          one side of the comparison is each of the values; test for the
2736          case where this isn't true by failing if the two operands
2737          are the same.  */
2738
2739       if (operand_equal_p (TREE_OPERAND (arg, 0),
2740                            TREE_OPERAND (arg, 1), 0))
2741         return 0;
2742
2743       if (*cval1 == 0)
2744         *cval1 = TREE_OPERAND (arg, 0);
2745       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2746         ;
2747       else if (*cval2 == 0)
2748         *cval2 = TREE_OPERAND (arg, 0);
2749       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2750         ;
2751       else
2752         return 0;
2753
2754       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2755         ;
2756       else if (*cval2 == 0)
2757         *cval2 = TREE_OPERAND (arg, 1);
2758       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2759         ;
2760       else
2761         return 0;
2762
2763       return 1;
2764
2765     default:
2766       return 0;
2767     }
2768 }
2769 \f
2770 /* ARG is a tree that is known to contain just arithmetic operations and
2771    comparisons.  Evaluate the operations in the tree substituting NEW0 for
2772    any occurrence of OLD0 as an operand of a comparison and likewise for
2773    NEW1 and OLD1.  */
2774
2775 static tree
2776 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
2777 {
2778   tree type = TREE_TYPE (arg);
2779   enum tree_code code = TREE_CODE (arg);
2780   enum tree_code_class class = TREE_CODE_CLASS (code);
2781
2782   /* We can handle some of the tcc_expression cases here.  */
2783   if (class == tcc_expression && code == TRUTH_NOT_EXPR)
2784     class = tcc_unary;
2785   else if (class == tcc_expression
2786            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2787     class = tcc_binary;
2788
2789   switch (class)
2790     {
2791     case tcc_unary:
2792       return fold_build1 (code, type,
2793                           eval_subst (TREE_OPERAND (arg, 0),
2794                                       old0, new0, old1, new1));
2795
2796     case tcc_binary:
2797       return fold_build2 (code, type,
2798                           eval_subst (TREE_OPERAND (arg, 0),
2799                                       old0, new0, old1, new1),
2800                           eval_subst (TREE_OPERAND (arg, 1),
2801                                       old0, new0, old1, new1));
2802
2803     case tcc_expression:
2804       switch (code)
2805         {
2806         case SAVE_EXPR:
2807           return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2808
2809         case COMPOUND_EXPR:
2810           return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2811
2812         case COND_EXPR:
2813           return fold_build3 (code, type,
2814                               eval_subst (TREE_OPERAND (arg, 0),
2815                                           old0, new0, old1, new1),
2816                               eval_subst (TREE_OPERAND (arg, 1),
2817                                           old0, new0, old1, new1),
2818                               eval_subst (TREE_OPERAND (arg, 2),
2819                                           old0, new0, old1, new1));
2820         default:
2821           break;
2822         }
2823       /* Fall through - ???  */
2824
2825     case tcc_comparison:
2826       {
2827         tree arg0 = TREE_OPERAND (arg, 0);
2828         tree arg1 = TREE_OPERAND (arg, 1);
2829
2830         /* We need to check both for exact equality and tree equality.  The
2831            former will be true if the operand has a side-effect.  In that
2832            case, we know the operand occurred exactly once.  */
2833
2834         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2835           arg0 = new0;
2836         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2837           arg0 = new1;
2838
2839         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2840           arg1 = new0;
2841         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2842           arg1 = new1;
2843
2844         return fold_build2 (code, type, arg0, arg1);
2845       }
2846
2847     default:
2848       return arg;
2849     }
2850 }
2851 \f
2852 /* Return a tree for the case when the result of an expression is RESULT
2853    converted to TYPE and OMITTED was previously an operand of the expression
2854    but is now not needed (e.g., we folded OMITTED * 0).
2855
2856    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
2857    the conversion of RESULT to TYPE.  */
2858
2859 tree
2860 omit_one_operand (tree type, tree result, tree omitted)
2861 {
2862   tree t = fold_convert (type, result);
2863
2864   if (TREE_SIDE_EFFECTS (omitted))
2865     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
2866
2867   return non_lvalue (t);
2868 }
2869
2870 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
2871
2872 static tree
2873 pedantic_omit_one_operand (tree type, tree result, tree omitted)
2874 {
2875   tree t = fold_convert (type, result);
2876
2877   if (TREE_SIDE_EFFECTS (omitted))
2878     return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
2879
2880   return pedantic_non_lvalue (t);
2881 }
2882
2883 /* Return a tree for the case when the result of an expression is RESULT
2884    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
2885    of the expression but are now not needed.
2886
2887    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
2888    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
2889    evaluated before OMITTED2.  Otherwise, if neither has side effects,
2890    just do the conversion of RESULT to TYPE.  */
2891
2892 tree
2893 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
2894 {
2895   tree t = fold_convert (type, result);
2896
2897   if (TREE_SIDE_EFFECTS (omitted2))
2898     t = build2 (COMPOUND_EXPR, type, omitted2, t);
2899   if (TREE_SIDE_EFFECTS (omitted1))
2900     t = build2 (COMPOUND_EXPR, type, omitted1, t);
2901
2902   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
2903 }
2904
2905 \f
2906 /* Return a simplified tree node for the truth-negation of ARG.  This
2907    never alters ARG itself.  We assume that ARG is an operation that
2908    returns a truth value (0 or 1).
2909
2910    FIXME: one would think we would fold the result, but it causes
2911    problems with the dominator optimizer.  */
2912 tree
2913 invert_truthvalue (tree arg)
2914 {
2915   tree type = TREE_TYPE (arg);
2916   enum tree_code code = TREE_CODE (arg);
2917
2918   if (code == ERROR_MARK)
2919     return arg;
2920
2921   /* If this is a comparison, we can simply invert it, except for
2922      floating-point non-equality comparisons, in which case we just
2923      enclose a TRUTH_NOT_EXPR around what we have.  */
2924
2925   if (TREE_CODE_CLASS (code) == tcc_comparison)
2926     {
2927       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
2928       if (FLOAT_TYPE_P (op_type)
2929           && flag_trapping_math
2930           && code != ORDERED_EXPR && code != UNORDERED_EXPR
2931           && code != NE_EXPR && code != EQ_EXPR)
2932         return build1 (TRUTH_NOT_EXPR, type, arg);
2933       else
2934         {
2935           code = invert_tree_comparison (code,
2936                                          HONOR_NANS (TYPE_MODE (op_type)));
2937           if (code == ERROR_MARK)
2938             return build1 (TRUTH_NOT_EXPR, type, arg);
2939           else
2940             return build2 (code, type,
2941                            TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
2942         }
2943     }
2944
2945   switch (code)
2946     {
2947     case INTEGER_CST:
2948       return constant_boolean_node (integer_zerop (arg), type);
2949
2950     case TRUTH_AND_EXPR:
2951       return build2 (TRUTH_OR_EXPR, type,
2952                      invert_truthvalue (TREE_OPERAND (arg, 0)),
2953                      invert_truthvalue (TREE_OPERAND (arg, 1)));
2954
2955     case TRUTH_OR_EXPR:
2956       return build2 (TRUTH_AND_EXPR, type,
2957                      invert_truthvalue (TREE_OPERAND (arg, 0)),
2958                      invert_truthvalue (TREE_OPERAND (arg, 1)));
2959
2960     case TRUTH_XOR_EXPR:
2961       /* Here we can invert either operand.  We invert the first operand
2962          unless the second operand is a TRUTH_NOT_EXPR in which case our
2963          result is the XOR of the first operand with the inside of the
2964          negation of the second operand.  */
2965
2966       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
2967         return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2968                        TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
2969       else
2970         return build2 (TRUTH_XOR_EXPR, type,
2971                        invert_truthvalue (TREE_OPERAND (arg, 0)),
2972                        TREE_OPERAND (arg, 1));
2973
2974     case TRUTH_ANDIF_EXPR:
2975       return build2 (TRUTH_ORIF_EXPR, type,
2976                      invert_truthvalue (TREE_OPERAND (arg, 0)),
2977                      invert_truthvalue (TREE_OPERAND (arg, 1)));
2978
2979     case TRUTH_ORIF_EXPR:
2980       return build2 (TRUTH_ANDIF_EXPR, type,
2981                      invert_truthvalue (TREE_OPERAND (arg, 0)),
2982                      invert_truthvalue (TREE_OPERAND (arg, 1)));
2983
2984     case TRUTH_NOT_EXPR:
2985       return TREE_OPERAND (arg, 0);
2986
2987     case COND_EXPR:
2988       return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
2989                      invert_truthvalue (TREE_OPERAND (arg, 1)),
2990                      invert_truthvalue (TREE_OPERAND (arg, 2)));
2991
2992     case COMPOUND_EXPR:
2993       return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2994                      invert_truthvalue (TREE_OPERAND (arg, 1)));
2995
2996     case NON_LVALUE_EXPR:
2997       return invert_truthvalue (TREE_OPERAND (arg, 0));
2998
2999     case NOP_EXPR:
3000       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3001         break;
3002
3003     case CONVERT_EXPR:
3004     case FLOAT_EXPR:
3005       return build1 (TREE_CODE (arg), type,
3006                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3007
3008     case BIT_AND_EXPR:
3009       if (!integer_onep (TREE_OPERAND (arg, 1)))
3010         break;
3011       return build2 (EQ_EXPR, type, arg,
3012                      fold_convert (type, integer_zero_node));
3013
3014     case SAVE_EXPR:
3015       return build1 (TRUTH_NOT_EXPR, type, arg);
3016
3017     case CLEANUP_POINT_EXPR:
3018       return build1 (CLEANUP_POINT_EXPR, type,
3019                      invert_truthvalue (TREE_OPERAND (arg, 0)));
3020
3021     default:
3022       break;
3023     }
3024   gcc_assert (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE);
3025   return build1 (TRUTH_NOT_EXPR, type, arg);
3026 }
3027
3028 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3029    operands are another bit-wise operation with a common input.  If so,
3030    distribute the bit operations to save an operation and possibly two if
3031    constants are involved.  For example, convert
3032         (A | B) & (A | C) into A | (B & C)
3033    Further simplification will occur if B and C are constants.
3034
3035    If this optimization cannot be done, 0 will be returned.  */
3036
3037 static tree
3038 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3039 {
3040   tree common;
3041   tree left, right;
3042
3043   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3044       || TREE_CODE (arg0) == code
3045       || (TREE_CODE (arg0) != BIT_AND_EXPR
3046           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3047     return 0;
3048
3049   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3050     {
3051       common = TREE_OPERAND (arg0, 0);
3052       left = TREE_OPERAND (arg0, 1);
3053       right = TREE_OPERAND (arg1, 1);
3054     }
3055   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3056     {
3057       common = TREE_OPERAND (arg0, 0);
3058       left = TREE_OPERAND (arg0, 1);
3059       right = TREE_OPERAND (arg1, 0);
3060     }
3061   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3062     {
3063       common = TREE_OPERAND (arg0, 1);
3064       left = TREE_OPERAND (arg0, 0);
3065       right = TREE_OPERAND (arg1, 1);
3066     }
3067   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3068     {
3069       common = TREE_OPERAND (arg0, 1);
3070       left = TREE_OPERAND (arg0, 0);
3071       right = TREE_OPERAND (arg1, 0);
3072     }
3073   else
3074     return 0;
3075
3076   return fold_build2 (TREE_CODE (arg0), type, common,
3077                       fold_build2 (code, type, left, right));
3078 }
3079 \f
3080 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3081    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
3082
3083 static tree
3084 make_bit_field_ref (tree inner, tree type, int bitsize, int bitpos,
3085                     int unsignedp)
3086 {
3087   tree result;
3088
3089   if (bitpos == 0)
3090     {
3091       tree size = TYPE_SIZE (TREE_TYPE (inner));
3092       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3093            || POINTER_TYPE_P (TREE_TYPE (inner)))
3094           && host_integerp (size, 0) 
3095           && tree_low_cst (size, 0) == bitsize)
3096         return fold_convert (type, inner);
3097     }
3098
3099   result = build3 (BIT_FIELD_REF, type, inner,
3100                    size_int (bitsize), bitsize_int (bitpos));
3101
3102   BIT_FIELD_REF_UNSIGNED (result) = unsignedp;
3103
3104   return result;
3105 }
3106
3107 /* Optimize a bit-field compare.
3108
3109    There are two cases:  First is a compare against a constant and the
3110    second is a comparison of two items where the fields are at the same
3111    bit position relative to the start of a chunk (byte, halfword, word)
3112    large enough to contain it.  In these cases we can avoid the shift
3113    implicit in bitfield extractions.
3114
3115    For constants, we emit a compare of the shifted constant with the
3116    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3117    compared.  For two fields at the same position, we do the ANDs with the
3118    similar mask and compare the result of the ANDs.
3119
3120    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3121    COMPARE_TYPE is the type of the comparison, and LHS and RHS
3122    are the left and right operands of the comparison, respectively.
3123
3124    If the optimization described above can be done, we return the resulting
3125    tree.  Otherwise we return zero.  */
3126
3127 static tree
3128 optimize_bit_field_compare (enum tree_code code, tree compare_type,
3129                             tree lhs, tree rhs)
3130 {
3131   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3132   tree type = TREE_TYPE (lhs);
3133   tree signed_type, unsigned_type;
3134   int const_p = TREE_CODE (rhs) == INTEGER_CST;
3135   enum machine_mode lmode, rmode, nmode;
3136   int lunsignedp, runsignedp;
3137   int lvolatilep = 0, rvolatilep = 0;
3138   tree linner, rinner = NULL_TREE;
3139   tree mask;
3140   tree offset;
3141
3142   /* Get all the information about the extractions being done.  If the bit size
3143      if the same as the size of the underlying object, we aren't doing an
3144      extraction at all and so can do nothing.  We also don't want to
3145      do anything if the inner expression is a PLACEHOLDER_EXPR since we
3146      then will no longer be able to replace it.  */
3147   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3148                                 &lunsignedp, &lvolatilep, false);
3149   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3150       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
3151     return 0;
3152
3153  if (!const_p)
3154    {
3155      /* If this is not a constant, we can only do something if bit positions,
3156         sizes, and signedness are the same.  */
3157      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3158                                    &runsignedp, &rvolatilep, false);
3159
3160      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3161          || lunsignedp != runsignedp || offset != 0
3162          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
3163        return 0;
3164    }
3165
3166   /* See if we can find a mode to refer to this field.  We should be able to,
3167      but fail if we can't.  */
3168   nmode = get_best_mode (lbitsize, lbitpos,
3169                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3170                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3171                                 TYPE_ALIGN (TREE_TYPE (rinner))),
3172                          word_mode, lvolatilep || rvolatilep);
3173   if (nmode == VOIDmode)
3174     return 0;
3175
3176   /* Set signed and unsigned types of the precision of this mode for the
3177      shifts below.  */
3178   signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3179   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3180
3181   /* Compute the bit position and size for the new reference and our offset
3182      within it. If the new reference is the same size as the original, we
3183      won't optimize anything, so return zero.  */
3184   nbitsize = GET_MODE_BITSIZE (nmode);
3185   nbitpos = lbitpos & ~ (nbitsize - 1);
3186   lbitpos -= nbitpos;
3187   if (nbitsize == lbitsize)
3188     return 0;
3189
3190   if (BYTES_BIG_ENDIAN)
3191     lbitpos = nbitsize - lbitsize - lbitpos;
3192
3193   /* Make the mask to be used against the extracted field.  */
3194   mask = build_int_cst (unsigned_type, -1);
3195   mask = force_fit_type (mask, 0, false, false);
3196   mask = fold_convert (unsigned_type, mask);
3197   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
3198   mask = const_binop (RSHIFT_EXPR, mask,
3199                       size_int (nbitsize - lbitsize - lbitpos), 0);
3200
3201   if (! const_p)
3202     /* If not comparing with constant, just rework the comparison
3203        and return.  */
3204     return build2 (code, compare_type,
3205                    build2 (BIT_AND_EXPR, unsigned_type,
3206                            make_bit_field_ref (linner, unsigned_type,
3207                                                nbitsize, nbitpos, 1),
3208                            mask),
3209                    build2 (BIT_AND_EXPR, unsigned_type,
3210                            make_bit_field_ref (rinner, unsigned_type,
3211                                                nbitsize, nbitpos, 1),
3212                            mask));
3213
3214   /* Otherwise, we are handling the constant case. See if the constant is too
3215      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
3216      this not only for its own sake, but to avoid having to test for this
3217      error case below.  If we didn't, we might generate wrong code.
3218
3219      For unsigned fields, the constant shifted right by the field length should
3220      be all zero.  For signed fields, the high-order bits should agree with
3221      the sign bit.  */
3222
3223   if (lunsignedp)
3224     {
3225       if (! integer_zerop (const_binop (RSHIFT_EXPR,
3226                                         fold_convert (unsigned_type, rhs),
3227                                         size_int (lbitsize), 0)))
3228         {
3229           warning ("comparison is always %d due to width of bit-field",
3230                    code == NE_EXPR);
3231           return constant_boolean_node (code == NE_EXPR, compare_type);
3232         }
3233     }
3234   else
3235     {
3236       tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs),
3237                               size_int (lbitsize - 1), 0);
3238       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
3239         {
3240           warning ("comparison is always %d due to width of bit-field",
3241                    code == NE_EXPR);
3242           return constant_boolean_node (code == NE_EXPR, compare_type);
3243         }
3244     }
3245
3246   /* Single-bit compares should always be against zero.  */
3247   if (lbitsize == 1 && ! integer_zerop (rhs))
3248     {
3249       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3250       rhs = fold_convert (type, integer_zero_node);
3251     }
3252
3253   /* Make a new bitfield reference, shift the constant over the
3254      appropriate number of bits and mask it with the computed mask
3255      (in case this was a signed field).  If we changed it, make a new one.  */
3256   lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
3257   if (lvolatilep)
3258     {
3259       TREE_SIDE_EFFECTS (lhs) = 1;
3260       TREE_THIS_VOLATILE (lhs) = 1;
3261     }
3262
3263   rhs = fold (const_binop (BIT_AND_EXPR,
3264                            const_binop (LSHIFT_EXPR,
3265                                         fold_convert (unsigned_type, rhs),
3266                                         size_int (lbitpos), 0),
3267                            mask, 0));
3268
3269   return build2 (code, compare_type,
3270                  build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
3271                  rhs);
3272 }
3273 \f
3274 /* Subroutine for fold_truthop: decode a field reference.
3275
3276    If EXP is a comparison reference, we return the innermost reference.
3277
3278    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3279    set to the starting bit number.
3280
3281    If the innermost field can be completely contained in a mode-sized
3282    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3283
3284    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3285    otherwise it is not changed.
3286
3287    *PUNSIGNEDP is set to the signedness of the field.
3288
3289    *PMASK is set to the mask used.  This is either contained in a
3290    BIT_AND_EXPR or derived from the width of the field.
3291
3292    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3293
3294    Return 0 if this is not a component reference or is one that we can't
3295    do anything with.  */
3296
3297 static tree
3298 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3299                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3300                         int *punsignedp, int *pvolatilep,
3301                         tree *pmask, tree *pand_mask)
3302 {
3303   tree outer_type = 0;
3304   tree and_mask = 0;
3305   tree mask, inner, offset;
3306   tree unsigned_type;
3307   unsigned int precision;
3308
3309   /* All the optimizations using this function assume integer fields.
3310      There are problems with FP fields since the type_for_size call
3311      below can fail for, e.g., XFmode.  */
3312   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3313     return 0;
3314
3315   /* We are interested in the bare arrangement of bits, so strip everything
3316      that doesn't affect the machine mode.  However, record the type of the
3317      outermost expression if it may matter below.  */
3318   if (TREE_CODE (exp) == NOP_EXPR
3319       || TREE_CODE (exp) == CONVERT_EXPR
3320       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3321     outer_type = TREE_TYPE (exp);
3322   STRIP_NOPS (exp);
3323
3324   if (TREE_CODE (exp) == BIT_AND_EXPR)
3325     {
3326       and_mask = TREE_OPERAND (exp, 1);
3327       exp = TREE_OPERAND (exp, 0);
3328       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3329       if (TREE_CODE (and_mask) != INTEGER_CST)
3330         return 0;
3331     }
3332
3333   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3334                                punsignedp, pvolatilep, false);
3335   if ((inner == exp && and_mask == 0)
3336       || *pbitsize < 0 || offset != 0
3337       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3338     return 0;
3339
3340   /* If the number of bits in the reference is the same as the bitsize of
3341      the outer type, then the outer type gives the signedness. Otherwise
3342      (in case of a small bitfield) the signedness is unchanged.  */
3343   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3344     *punsignedp = TYPE_UNSIGNED (outer_type);
3345
3346   /* Compute the mask to access the bitfield.  */
3347   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3348   precision = TYPE_PRECISION (unsigned_type);
3349
3350   mask = build_int_cst (unsigned_type, -1);
3351   mask = force_fit_type (mask, 0, false, false);
3352
3353   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3354   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3355
3356   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3357   if (and_mask != 0)
3358     mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3359                         fold_convert (unsigned_type, and_mask), mask);
3360
3361   *pmask = mask;
3362   *pand_mask = and_mask;
3363   return inner;
3364 }
3365
3366 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3367    bit positions.  */
3368
3369 static int
3370 all_ones_mask_p (tree mask, int size)
3371 {
3372   tree type = TREE_TYPE (mask);
3373   unsigned int precision = TYPE_PRECISION (type);
3374   tree tmask;
3375
3376   tmask = build_int_cst (lang_hooks.types.signed_type (type), -1);
3377   tmask = force_fit_type (tmask, 0, false, false);
3378
3379   return
3380     tree_int_cst_equal (mask,
3381                         const_binop (RSHIFT_EXPR,
3382                                      const_binop (LSHIFT_EXPR, tmask,
3383                                                   size_int (precision - size),
3384                                                   0),
3385                                      size_int (precision - size), 0));
3386 }
3387
3388 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3389    represents the sign bit of EXP's type.  If EXP represents a sign
3390    or zero extension, also test VAL against the unextended type.
3391    The return value is the (sub)expression whose sign bit is VAL,
3392    or NULL_TREE otherwise.  */
3393
3394 static tree
3395 sign_bit_p (tree exp, tree val)
3396 {
3397   unsigned HOST_WIDE_INT mask_lo, lo;
3398   HOST_WIDE_INT mask_hi, hi;
3399   int width;
3400   tree t;
3401
3402   /* Tree EXP must have an integral type.  */
3403   t = TREE_TYPE (exp);
3404   if (! INTEGRAL_TYPE_P (t))
3405     return NULL_TREE;
3406
3407   /* Tree VAL must be an integer constant.  */
3408   if (TREE_CODE (val) != INTEGER_CST
3409       || TREE_CONSTANT_OVERFLOW (val))
3410     return NULL_TREE;
3411
3412   width = TYPE_PRECISION (t);
3413   if (width > HOST_BITS_PER_WIDE_INT)
3414     {
3415       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3416       lo = 0;
3417
3418       mask_hi = ((unsigned HOST_WIDE_INT) -1
3419                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
3420       mask_lo = -1;
3421     }
3422   else
3423     {
3424       hi = 0;
3425       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3426
3427       mask_hi = 0;
3428       mask_lo = ((unsigned HOST_WIDE_INT) -1
3429                  >> (HOST_BITS_PER_WIDE_INT - width));
3430     }
3431
3432   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3433      treat VAL as if it were unsigned.  */
3434   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3435       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3436     return exp;
3437
3438   /* Handle extension from a narrower type.  */
3439   if (TREE_CODE (exp) == NOP_EXPR
3440       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3441     return sign_bit_p (TREE_OPERAND (exp, 0), val);
3442
3443   return NULL_TREE;
3444 }
3445
3446 /* Subroutine for fold_truthop: determine if an operand is simple enough
3447    to be evaluated unconditionally.  */
3448
3449 static int
3450 simple_operand_p (tree exp)
3451 {
3452   /* Strip any conversions that don't change the machine mode.  */
3453   STRIP_NOPS (exp);
3454
3455   return (CONSTANT_CLASS_P (exp)
3456           || TREE_CODE (exp) == SSA_NAME
3457           || (DECL_P (exp)
3458               && ! TREE_ADDRESSABLE (exp)
3459               && ! TREE_THIS_VOLATILE (exp)
3460               && ! DECL_NONLOCAL (exp)
3461               /* Don't regard global variables as simple.  They may be
3462                  allocated in ways unknown to the compiler (shared memory,
3463                  #pragma weak, etc).  */
3464               && ! TREE_PUBLIC (exp)
3465               && ! DECL_EXTERNAL (exp)
3466               /* Loading a static variable is unduly expensive, but global
3467                  registers aren't expensive.  */
3468               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
3469 }
3470 \f
3471 /* The following functions are subroutines to fold_range_test and allow it to
3472    try to change a logical combination of comparisons into a range test.
3473
3474    For example, both
3475         X == 2 || X == 3 || X == 4 || X == 5
3476    and
3477         X >= 2 && X <= 5
3478    are converted to
3479         (unsigned) (X - 2) <= 3
3480
3481    We describe each set of comparisons as being either inside or outside
3482    a range, using a variable named like IN_P, and then describe the
3483    range with a lower and upper bound.  If one of the bounds is omitted,
3484    it represents either the highest or lowest value of the type.
3485
3486    In the comments below, we represent a range by two numbers in brackets
3487    preceded by a "+" to designate being inside that range, or a "-" to
3488    designate being outside that range, so the condition can be inverted by
3489    flipping the prefix.  An omitted bound is represented by a "-".  For
3490    example, "- [-, 10]" means being outside the range starting at the lowest
3491    possible value and ending at 10, in other words, being greater than 10.
3492    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
3493    always false.
3494
3495    We set up things so that the missing bounds are handled in a consistent
3496    manner so neither a missing bound nor "true" and "false" need to be
3497    handled using a special case.  */
3498
3499 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
3500    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
3501    and UPPER1_P are nonzero if the respective argument is an upper bound
3502    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
3503    must be specified for a comparison.  ARG1 will be converted to ARG0's
3504    type if both are specified.  */
3505
3506 static tree
3507 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
3508              tree arg1, int upper1_p)
3509 {
3510   tree tem;
3511   int result;
3512   int sgn0, sgn1;
3513
3514   /* If neither arg represents infinity, do the normal operation.
3515      Else, if not a comparison, return infinity.  Else handle the special
3516      comparison rules. Note that most of the cases below won't occur, but
3517      are handled for consistency.  */
3518
3519   if (arg0 != 0 && arg1 != 0)
3520     {
3521       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
3522                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
3523       STRIP_NOPS (tem);
3524       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
3525     }
3526
3527   if (TREE_CODE_CLASS (code) != tcc_comparison)
3528     return 0;
3529
3530   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
3531      for neither.  In real maths, we cannot assume open ended ranges are
3532      the same. But, this is computer arithmetic, where numbers are finite.
3533      We can therefore make the transformation of any unbounded range with
3534      the value Z, Z being greater than any representable number. This permits
3535      us to treat unbounded ranges as equal.  */
3536   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
3537   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
3538   switch (code)
3539     {
3540     case EQ_EXPR:
3541       result = sgn0 == sgn1;
3542       break;
3543     case NE_EXPR:
3544       result = sgn0 != sgn1;
3545       break;
3546     case LT_EXPR:
3547       result = sgn0 < sgn1;
3548       break;
3549     case LE_EXPR:
3550       result = sgn0 <= sgn1;
3551       break;
3552     case GT_EXPR:
3553       result = sgn0 > sgn1;
3554       break;
3555     case GE_EXPR:
3556       result = sgn0 >= sgn1;
3557       break;
3558     default:
3559       gcc_unreachable ();
3560     }
3561
3562   return constant_boolean_node (result, type);
3563 }
3564 \f
3565 /* Given EXP, a logical expression, set the range it is testing into
3566    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
3567    actually being tested.  *PLOW and *PHIGH will be made of the same type
3568    as the returned expression.  If EXP is not a comparison, we will most
3569    likely not be returning a useful value and range.  */
3570
3571 static tree
3572 make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
3573 {
3574   enum tree_code code;
3575   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
3576   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
3577   int in_p, n_in_p;
3578   tree low, high, n_low, n_high;
3579
3580   /* Start with simply saying "EXP != 0" and then look at the code of EXP
3581      and see if we can refine the range.  Some of the cases below may not
3582      happen, but it doesn't seem worth worrying about this.  We "continue"
3583      the outer loop when we've changed something; otherwise we "break"
3584      the switch, which will "break" the while.  */
3585
3586   in_p = 0;
3587   low = high = fold_convert (TREE_TYPE (exp), integer_zero_node);
3588
3589   while (1)
3590     {
3591       code = TREE_CODE (exp);
3592       exp_type = TREE_TYPE (exp);
3593
3594       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
3595         {
3596           if (TREE_CODE_LENGTH (code) > 0)
3597             arg0 = TREE_OPERAND (exp, 0);
3598           if (TREE_CODE_CLASS (code) == tcc_comparison
3599               || TREE_CODE_CLASS (code) == tcc_unary
3600               || TREE_CODE_CLASS (code) == tcc_binary)
3601             arg0_type = TREE_TYPE (arg0);
3602           if (TREE_CODE_CLASS (code) == tcc_binary
3603               || TREE_CODE_CLASS (code) == tcc_comparison
3604               || (TREE_CODE_CLASS (code) == tcc_expression
3605                   && TREE_CODE_LENGTH (code) > 1))
3606             arg1 = TREE_OPERAND (exp, 1);
3607         }
3608
3609       switch (code)
3610         {
3611         case TRUTH_NOT_EXPR:
3612           in_p = ! in_p, exp = arg0;
3613           continue;
3614
3615         case EQ_EXPR: case NE_EXPR:
3616         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
3617           /* We can only do something if the range is testing for zero
3618              and if the second operand is an integer constant.  Note that
3619              saying something is "in" the range we make is done by
3620              complementing IN_P since it will set in the initial case of
3621              being not equal to zero; "out" is leaving it alone.  */
3622           if (low == 0 || high == 0
3623               || ! integer_zerop (low) || ! integer_zerop (high)
3624               || TREE_CODE (arg1) != INTEGER_CST)
3625             break;
3626
3627           switch (code)
3628             {
3629             case NE_EXPR:  /* - [c, c]  */
3630               low = high = arg1;
3631               break;
3632             case EQ_EXPR:  /* + [c, c]  */
3633               in_p = ! in_p, low = high = arg1;
3634               break;
3635             case GT_EXPR:  /* - [-, c] */
3636               low = 0, high = arg1;
3637               break;
3638             case GE_EXPR:  /* + [c, -] */
3639               in_p = ! in_p, low = arg1, high = 0;
3640               break;
3641             case LT_EXPR:  /* - [c, -] */
3642               low = arg1, high = 0;
3643               break;
3644             case LE_EXPR:  /* + [-, c] */
3645               in_p = ! in_p, low = 0, high = arg1;
3646               break;
3647             default:
3648               gcc_unreachable ();
3649             }
3650
3651           /* If this is an unsigned comparison, we also know that EXP is
3652              greater than or equal to zero.  We base the range tests we make
3653              on that fact, so we record it here so we can parse existing
3654              range tests.  We test arg0_type since often the return type
3655              of, e.g. EQ_EXPR, is boolean.  */
3656           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
3657             {
3658               if (! merge_ranges (&n_in_p, &n_low, &n_high,
3659                                   in_p, low, high, 1,
3660                                   fold_convert (arg0_type, integer_zero_node),
3661                                   NULL_TREE))
3662                 break;
3663
3664               in_p = n_in_p, low = n_low, high = n_high;
3665
3666               /* If the high bound is missing, but we have a nonzero low
3667                  bound, reverse the range so it goes from zero to the low bound
3668                  minus 1.  */
3669               if (high == 0 && low && ! integer_zerop (low))
3670                 {
3671                   in_p = ! in_p;
3672                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
3673                                       integer_one_node, 0);
3674                   low = fold_convert (arg0_type, integer_zero_node);
3675                 }
3676             }
3677
3678           exp = arg0;
3679           continue;
3680
3681         case NEGATE_EXPR:
3682           /* (-x) IN [a,b] -> x in [-b, -a]  */
3683           n_low = range_binop (MINUS_EXPR, exp_type,
3684                                fold_convert (exp_type, integer_zero_node),
3685                                0, high, 1);
3686           n_high = range_binop (MINUS_EXPR, exp_type,
3687                                 fold_convert (exp_type, integer_zero_node),
3688                                 0, low, 0);
3689           low = n_low, high = n_high;
3690           exp = arg0;
3691           continue;
3692
3693         case BIT_NOT_EXPR:
3694           /* ~ X -> -X - 1  */
3695           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
3696                         fold_convert (exp_type, integer_one_node));
3697           continue;
3698
3699         case PLUS_EXPR:  case MINUS_EXPR:
3700           if (TREE_CODE (arg1) != INTEGER_CST)
3701             break;
3702
3703           /* If EXP is signed, any overflow in the computation is undefined,
3704              so we don't worry about it so long as our computations on
3705              the bounds don't overflow.  For unsigned, overflow is defined
3706              and this is exactly the right thing.  */
3707           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3708                                arg0_type, low, 0, arg1, 0);
3709           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3710                                 arg0_type, high, 1, arg1, 0);
3711           if ((n_low != 0 && TREE_OVERFLOW (n_low))
3712               || (n_high != 0 && TREE_OVERFLOW (n_high)))
3713             break;
3714
3715           /* Check for an unsigned range which has wrapped around the maximum
3716              value thus making n_high < n_low, and normalize it.  */
3717           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
3718             {
3719               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
3720                                  integer_one_node, 0);
3721               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
3722                                   integer_one_node, 0);
3723
3724               /* If the range is of the form +/- [ x+1, x ], we won't
3725                  be able to normalize it.  But then, it represents the
3726                  whole range or the empty set, so make it
3727                  +/- [ -, - ].  */
3728               if (tree_int_cst_equal (n_low, low)
3729                   && tree_int_cst_equal (n_high, high))
3730                 low = high = 0;
3731               else
3732                 in_p = ! in_p;
3733             }
3734           else
3735             low = n_low, high = n_high;
3736
3737           exp = arg0;
3738           continue;
3739
3740         case NOP_EXPR:  case NON_LVALUE_EXPR:  case CONVERT_EXPR:
3741           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
3742             break;
3743
3744           if (! INTEGRAL_TYPE_P (arg0_type)
3745               || (low != 0 && ! int_fits_type_p (low, arg0_type))
3746               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
3747             break;
3748
3749           n_low = low, n_high = high;
3750
3751           if (n_low != 0)
3752             n_low = fold_convert (arg0_type, n_low);
3753
3754           if (n_high != 0)
3755             n_high = fold_convert (arg0_type, n_high);
3756
3757
3758           /* If we're converting arg0 from an unsigned type, to exp,
3759              a signed type,  we will be doing the comparison as unsigned.
3760              The tests above have already verified that LOW and HIGH
3761              are both positive.
3762
3763              So we have to ensure that we will handle large unsigned
3764              values the same way that the current signed bounds treat
3765              negative values.  */
3766
3767           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
3768             {
3769               tree high_positive;
3770               tree equiv_type = lang_hooks.types.type_for_mode
3771                 (TYPE_MODE (arg0_type), 1);
3772
3773               /* A range without an upper bound is, naturally, unbounded.
3774                  Since convert would have cropped a very large value, use
3775                  the max value for the destination type.  */
3776               high_positive
3777                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
3778                 : TYPE_MAX_VALUE (arg0_type);
3779
3780               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
3781                 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
3782                                              fold_convert (arg0_type,
3783                                                            high_positive),
3784                                              fold_convert (arg0_type,
3785                                                            integer_one_node));
3786
3787               /* If the low bound is specified, "and" the range with the
3788                  range for which the original unsigned value will be
3789                  positive.  */
3790               if (low != 0)
3791                 {
3792                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
3793                                       1, n_low, n_high, 1,
3794                                       fold_convert (arg0_type,
3795                                                     integer_zero_node),
3796                                       high_positive))
3797                     break;
3798
3799                   in_p = (n_in_p == in_p);
3800                 }
3801               else
3802                 {
3803                   /* Otherwise, "or" the range with the range of the input
3804                      that will be interpreted as negative.  */
3805                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
3806                                       0, n_low, n_high, 1,
3807                                       fold_convert (arg0_type,
3808                                                     integer_zero_node),
3809                                       high_positive))
3810                     break;
3811
3812                   in_p = (in_p != n_in_p);
3813                 }
3814             }
3815
3816           exp = arg0;
3817           low = n_low, high = n_high;
3818           continue;
3819
3820         default:
3821           break;
3822         }
3823
3824       break;
3825     }
3826
3827   /* If EXP is a constant, we can evaluate whether this is true or false.  */
3828   if (TREE_CODE (exp) == INTEGER_CST)
3829     {
3830       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
3831                                                  exp, 0, low, 0))
3832                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
3833                                                     exp, 1, high, 1)));
3834       low = high = 0;
3835       exp = 0;
3836     }
3837
3838   *pin_p = in_p, *plow = low, *phigh = high;
3839   return exp;
3840 }
3841 \f
3842 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
3843    type, TYPE, return an expression to test if EXP is in (or out of, depending
3844    on IN_P) the range.  Return 0 if the test couldn't be created.  */
3845
3846 static tree
3847 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
3848 {
3849   tree etype = TREE_TYPE (exp);
3850   tree value;
3851
3852   if (! in_p)
3853     {
3854       value = build_range_check (type, exp, 1, low, high);
3855       if (value != 0)
3856         return invert_truthvalue (value);
3857
3858       return 0;
3859     }
3860
3861   if (low == 0 && high == 0)
3862     return fold_convert (type, integer_one_node);
3863
3864   if (low == 0)
3865     return fold_build2 (LE_EXPR, type, exp, high);
3866
3867   if (high == 0)
3868     return fold_build2 (GE_EXPR, type, exp, low);
3869
3870   if (operand_equal_p (low, high, 0))
3871     return fold_build2 (EQ_EXPR, type, exp, low);
3872
3873   if (integer_zerop (low))
3874     {
3875       if (! TYPE_UNSIGNED (etype))
3876         {
3877           etype = lang_hooks.types.unsigned_type (etype);
3878           high = fold_convert (etype, high);
3879           exp = fold_convert (etype, exp);
3880         }
3881       return build_range_check (type, exp, 1, 0, high);
3882     }
3883
3884   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
3885   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
3886     {
3887       unsigned HOST_WIDE_INT lo;
3888       HOST_WIDE_INT hi;
3889       int prec;
3890
3891       prec = TYPE_PRECISION (etype);
3892       if (prec <= HOST_BITS_PER_WIDE_INT)
3893         {
3894           hi = 0;
3895           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
3896         }
3897       else
3898         {
3899           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
3900           lo = (unsigned HOST_WIDE_INT) -1;
3901         }
3902
3903       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
3904         {
3905           if (TYPE_UNSIGNED (etype))
3906             {
3907               etype = lang_hooks.types.signed_type (etype);
3908               exp = fold_convert (etype, exp);
3909             }
3910           return fold_build2 (GT_EXPR, type, exp,
3911                               fold_convert (etype, integer_zero_node));
3912         }
3913     }
3914
3915   value = const_binop (MINUS_EXPR, high, low, 0);
3916   if (value != 0 && TREE_OVERFLOW (value) && ! TYPE_UNSIGNED (etype))
3917     {
3918       tree utype, minv, maxv;
3919
3920       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
3921          for the type in question, as we rely on this here.  */
3922       switch (TREE_CODE (etype))
3923         {
3924         case INTEGER_TYPE:
3925         case ENUMERAL_TYPE:
3926         case CHAR_TYPE:
3927           utype = lang_hooks.types.unsigned_type (etype);
3928           maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
3929           maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
3930                               integer_one_node, 1);
3931           minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
3932           if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
3933                                           minv, 1, maxv, 1)))
3934             {
3935               etype = utype;
3936               high = fold_convert (etype, high);
3937               low = fold_convert (etype, low);
3938               exp = fold_convert (etype, exp);
3939               value = const_binop (MINUS_EXPR, high, low, 0);
3940             }
3941           break;
3942         default:
3943           break;
3944         }
3945     }
3946
3947   if (value != 0 && ! TREE_OVERFLOW (value))
3948     return build_range_check (type,
3949                               fold_build2 (MINUS_EXPR, etype, exp, low),
3950                               1, fold_convert (etype, integer_zero_node),
3951                               value);
3952
3953   return 0;
3954 }
3955 \f
3956 /* Given two ranges, see if we can merge them into one.  Return 1 if we
3957    can, 0 if we can't.  Set the output range into the specified parameters.  */
3958
3959 static int
3960 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
3961               tree high0, int in1_p, tree low1, tree high1)
3962 {
3963   int no_overlap;
3964   int subset;
3965   int temp;
3966   tree tem;
3967   int in_p;
3968   tree low, high;
3969   int lowequal = ((low0 == 0 && low1 == 0)
3970                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3971                                                 low0, 0, low1, 0)));
3972   int highequal = ((high0 == 0 && high1 == 0)
3973                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3974                                                  high0, 1, high1, 1)));
3975
3976   /* Make range 0 be the range that starts first, or ends last if they
3977      start at the same value.  Swap them if it isn't.  */
3978   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
3979                                  low0, 0, low1, 0))
3980       || (lowequal
3981           && integer_onep (range_binop (GT_EXPR, integer_type_node,
3982                                         high1, 1, high0, 1))))
3983     {
3984       temp = in0_p, in0_p = in1_p, in1_p = temp;
3985       tem = low0, low0 = low1, low1 = tem;
3986       tem = high0, high0 = high1, high1 = tem;
3987     }
3988
3989   /* Now flag two cases, whether the ranges are disjoint or whether the
3990      second range is totally subsumed in the first.  Note that the tests
3991      below are simplified by the ones above.  */
3992   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
3993                                           high0, 1, low1, 0));
3994   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
3995                                       high1, 1, high0, 1));
3996
3997   /* We now have four cases, depending on whether we are including or
3998      excluding the two ranges.  */
3999   if (in0_p && in1_p)
4000     {
4001       /* If they don't overlap, the result is false.  If the second range
4002          is a subset it is the result.  Otherwise, the range is from the start
4003          of the second to the end of the first.  */
4004       if (no_overlap)
4005         in_p = 0, low = high = 0;
4006       else if (subset)
4007         in_p = 1, low = low1, high = high1;
4008       else
4009         in_p = 1, low = low1, high = high0;
4010     }
4011
4012   else if (in0_p && ! in1_p)
4013     {
4014       /* If they don't overlap, the result is the first range.  If they are
4015          equal, the result is false.  If the second range is a subset of the
4016          first, and the ranges begin at the same place, we go from just after
4017          the end of the first range to the end of the second.  If the second
4018          range is not a subset of the first, or if it is a subset and both
4019          ranges end at the same place, the range starts at the start of the
4020          first range and ends just before the second range.
4021          Otherwise, we can't describe this as a single range.  */
4022       if (no_overlap)
4023         in_p = 1, low = low0, high = high0;
4024       else if (lowequal && highequal)
4025         in_p = 0, low = high = 0;
4026       else if (subset && lowequal)
4027         {
4028           in_p = 1, high = high0;
4029           low = range_binop (PLUS_EXPR, NULL_TREE, high1, 0,
4030                              integer_one_node, 0);
4031         }
4032       else if (! subset || highequal)
4033         {
4034           in_p = 1, low = low0;
4035           high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
4036                               integer_one_node, 0);
4037         }
4038       else
4039         return 0;
4040     }
4041
4042   else if (! in0_p && in1_p)
4043     {
4044       /* If they don't overlap, the result is the second range.  If the second
4045          is a subset of the first, the result is false.  Otherwise,
4046          the range starts just after the first range and ends at the
4047          end of the second.  */
4048       if (no_overlap)
4049         in_p = 1, low = low1, high = high1;
4050       else if (subset || highequal)
4051         in_p = 0, low = high = 0;
4052       else
4053         {
4054           in_p = 1, high = high1;
4055           low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
4056                              integer_one_node, 0);
4057         }
4058     }
4059
4060   else
4061     {
4062       /* The case where we are excluding both ranges.  Here the complex case
4063          is if they don't overlap.  In that case, the only time we have a
4064          range is if they are adjacent.  If the second is a subset of the
4065          first, the result is the first.  Otherwise, the range to exclude
4066          starts at the beginning of the first range and ends at the end of the
4067          second.  */
4068       if (no_overlap)
4069         {
4070           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4071                                          range_binop (PLUS_EXPR, NULL_TREE,
4072                                                       high0, 1,
4073                                                       integer_one_node, 1),
4074                                          1, low1, 0)))
4075             in_p = 0, low = low0, high = high1;
4076           else
4077             {
4078               /* Canonicalize - [min, x] into - [-, x].  */
4079               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4080                 switch (TREE_CODE (TREE_TYPE (low0)))
4081                   {
4082                   case ENUMERAL_TYPE:
4083                     if (TYPE_PRECISION (TREE_TYPE (low0))
4084                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4085                       break;
4086                     /* FALLTHROUGH */
4087                   case INTEGER_TYPE:
4088                   case CHAR_TYPE:
4089                     if (tree_int_cst_equal (low0,
4090                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4091                       low0 = 0;
4092                     break;
4093                   case POINTER_TYPE:
4094                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4095                         && integer_zerop (low0))
4096                       low0 = 0;
4097                     break;
4098                   default:
4099                     break;
4100                   }
4101
4102               /* Canonicalize - [x, max] into - [x, -].  */
4103               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4104                 switch (TREE_CODE (TREE_TYPE (high1)))
4105                   {
4106                   case ENUMERAL_TYPE:
4107                     if (TYPE_PRECISION (TREE_TYPE (high1))
4108                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4109                       break;
4110                     /* FALLTHROUGH */
4111                   case INTEGER_TYPE:
4112                   case CHAR_TYPE:
4113                     if (tree_int_cst_equal (high1,
4114                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4115                       high1 = 0;
4116                     break;
4117                   case POINTER_TYPE:
4118                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4119                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4120                                                        high1, 1,
4121                                                        integer_one_node, 1)))
4122                       high1 = 0;
4123                     break;
4124                   default:
4125                     break;
4126                   }
4127
4128               /* The ranges might be also adjacent between the maximum and
4129                  minimum values of the given type.  For
4130                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4131                  return + [x + 1, y - 1].  */
4132               if (low0 == 0 && high1 == 0)
4133                 {
4134                   low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
4135                                      integer_one_node, 1);
4136                   high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
4137                                       integer_one_node, 0);
4138                   if (low == 0 || high == 0)
4139                     return 0;
4140
4141                   in_p = 1;
4142                 }
4143               else
4144                 return 0;
4145             }
4146         }
4147       else if (subset)
4148         in_p = 0, low = low0, high = high0;
4149       else
4150         in_p = 0, low = low0, high = high1;
4151     }
4152
4153   *pin_p = in_p, *plow = low, *phigh = high;
4154   return 1;
4155 }
4156 \f
4157
4158 /* Subroutine of fold, looking inside expressions of the form
4159    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4160    of the COND_EXPR.  This function is being used also to optimize
4161    A op B ? C : A, by reversing the comparison first.
4162
4163    Return a folded expression whose code is not a COND_EXPR
4164    anymore, or NULL_TREE if no folding opportunity is found.  */
4165
4166 static tree
4167 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4168 {
4169   enum tree_code comp_code = TREE_CODE (arg0);
4170   tree arg00 = TREE_OPERAND (arg0, 0);
4171   tree arg01 = TREE_OPERAND (arg0, 1);
4172   tree arg1_type = TREE_TYPE (arg1);
4173   tree tem;
4174
4175   STRIP_NOPS (arg1);
4176   STRIP_NOPS (arg2);
4177
4178   /* If we have A op 0 ? A : -A, consider applying the following
4179      transformations:
4180
4181      A == 0? A : -A    same as -A
4182      A != 0? A : -A    same as A
4183      A >= 0? A : -A    same as abs (A)
4184      A > 0?  A : -A    same as abs (A)
4185      A <= 0? A : -A    same as -abs (A)
4186      A < 0?  A : -A    same as -abs (A)
4187
4188      None of these transformations work for modes with signed
4189      zeros.  If A is +/-0, the first two transformations will
4190      change the sign of the result (from +0 to -0, or vice
4191      versa).  The last four will fix the sign of the result,
4192      even though the original expressions could be positive or
4193      negative, depending on the sign of A.
4194
4195      Note that all these transformations are correct if A is
4196      NaN, since the two alternatives (A and -A) are also NaNs.  */
4197   if ((FLOAT_TYPE_P (TREE_TYPE (arg01))
4198        ? real_zerop (arg01)
4199        : integer_zerop (arg01))
4200       && ((TREE_CODE (arg2) == NEGATE_EXPR
4201            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4202              /* In the case that A is of the form X-Y, '-A' (arg2) may
4203                 have already been folded to Y-X, check for that. */
4204           || (TREE_CODE (arg1) == MINUS_EXPR
4205               && TREE_CODE (arg2) == MINUS_EXPR
4206               && operand_equal_p (TREE_OPERAND (arg1, 0),
4207                                   TREE_OPERAND (arg2, 1), 0)
4208               && operand_equal_p (TREE_OPERAND (arg1, 1),
4209                                   TREE_OPERAND (arg2, 0), 0))))
4210     switch (comp_code)
4211       {
4212       case EQ_EXPR:
4213       case UNEQ_EXPR:
4214         tem = fold_convert (arg1_type, arg1);
4215         return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4216       case NE_EXPR:
4217       case LTGT_EXPR:
4218         return pedantic_non_lvalue (fold_convert (type, arg1));
4219       case UNGE_EXPR:
4220       case UNGT_EXPR:
4221         if (flag_trapping_math)
4222           break;
4223         /* Fall through.  */
4224       case GE_EXPR:
4225       case GT_EXPR:
4226         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4227           arg1 = fold_convert (lang_hooks.types.signed_type
4228                                (TREE_TYPE (arg1)), arg1);
4229         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4230         return pedantic_non_lvalue (fold_convert (type, tem));
4231       case UNLE_EXPR:
4232       case UNLT_EXPR:
4233         if (flag_trapping_math)
4234           break;
4235       case LE_EXPR:
4236       case LT_EXPR:
4237         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4238           arg1 = fold_convert (lang_hooks.types.signed_type
4239                                (TREE_TYPE (arg1)), arg1);
4240         tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4241         return negate_expr (fold_convert (type, tem));
4242       default:
4243         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4244         break;
4245       }
4246
4247   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4248      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4249      both transformations are correct when A is NaN: A != 0
4250      is then true, and A == 0 is false.  */
4251
4252   if (integer_zerop (arg01) && integer_zerop (arg2))
4253     {
4254       if (comp_code == NE_EXPR)
4255         return pedantic_non_lvalue (fold_convert (type, arg1));
4256       else if (comp_code == EQ_EXPR)
4257         return fold_convert (type, integer_zero_node);
4258     }
4259
4260   /* Try some transformations of A op B ? A : B.
4261
4262      A == B? A : B    same as B
4263      A != B? A : B    same as A
4264      A >= B? A : B    same as max (A, B)
4265      A > B?  A : B    same as max (B, A)
4266      A <= B? A : B    same as min (A, B)
4267      A < B?  A : B    same as min (B, A)
4268
4269      As above, these transformations don't work in the presence
4270      of signed zeros.  For example, if A and B are zeros of
4271      opposite sign, the first two transformations will change
4272      the sign of the result.  In the last four, the original
4273      expressions give different results for (A=+0, B=-0) and
4274      (A=-0, B=+0), but the transformed expressions do not.
4275
4276      The first two transformations are correct if either A or B
4277      is a NaN.  In the first transformation, the condition will
4278      be false, and B will indeed be chosen.  In the case of the
4279      second transformation, the condition A != B will be true,
4280      and A will be chosen.
4281
4282      The conversions to max() and min() are not correct if B is
4283      a number and A is not.  The conditions in the original
4284      expressions will be false, so all four give B.  The min()
4285      and max() versions would give a NaN instead.  */
4286   if (operand_equal_for_comparison_p (arg01, arg2, arg00)
4287       /* Avoid these transformations if the COND_EXPR may be used
4288          as an lvalue in the C++ front-end.  PR c++/19199.  */
4289       && (in_gimple_form
4290           || strcmp (lang_hooks.name, "GNU C++") != 0
4291           || ! maybe_lvalue_p (arg1)
4292           || ! maybe_lvalue_p (arg2)))
4293     {
4294       tree comp_op0 = arg00;
4295       tree comp_op1 = arg01;
4296       tree comp_type = TREE_TYPE (comp_op0);
4297
4298       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
4299       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4300         {
4301           comp_type = type;
4302           comp_op0 = arg1;
4303           comp_op1 = arg2;
4304         }
4305
4306       switch (comp_code)
4307         {
4308         case EQ_EXPR:
4309           return pedantic_non_lvalue (fold_convert (type, arg2));
4310         case NE_EXPR:
4311           return pedantic_non_lvalue (fold_convert (type, arg1));
4312         case LE_EXPR:
4313         case LT_EXPR:
4314         case UNLE_EXPR:
4315         case UNLT_EXPR:
4316           /* In C++ a ?: expression can be an lvalue, so put the
4317              operand which will be used if they are equal first
4318              so that we can convert this back to the
4319              corresponding COND_EXPR.  */
4320           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4321             {
4322               comp_op0 = fold_convert (comp_type, comp_op0);
4323               comp_op1 = fold_convert (comp_type, comp_op1);
4324               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4325                     ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4326                     : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4327               return pedantic_non_lvalue (fold_convert (type, tem));
4328             }
4329           break;
4330         case GE_EXPR:
4331         case GT_EXPR:
4332         case UNGE_EXPR:
4333         case UNGT_EXPR:
4334           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4335             {
4336               comp_op0 = fold_convert (comp_type, comp_op0);
4337               comp_op1 = fold_convert (comp_type, comp_op1);
4338               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4339                     ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
4340                     : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
4341               return pedantic_non_lvalue (fold_convert (type, tem));
4342             }
4343           break;
4344         case UNEQ_EXPR:
4345           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4346             return pedantic_non_lvalue (fold_convert (type, arg2));
4347           break;
4348         case LTGT_EXPR:
4349           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4350             return pedantic_non_lvalue (fold_convert (type, arg1));
4351           break;
4352         default:
4353           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4354           break;
4355         }
4356     }
4357
4358   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4359      we might still be able to simplify this.  For example,
4360      if C1 is one less or one more than C2, this might have started
4361      out as a MIN or MAX and been transformed by this function.
4362      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
4363
4364   if (INTEGRAL_TYPE_P (type)
4365       && TREE_CODE (arg01) == INTEGER_CST
4366       && TREE_CODE (arg2) == INTEGER_CST)
4367     switch (comp_code)
4368       {
4369       case EQ_EXPR:
4370         /* We can replace A with C1 in this case.  */
4371         arg1 = fold_convert (type, arg01);
4372         return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
4373
4374       case LT_EXPR:
4375         /* If C1 is C2 + 1, this is min(A, C2).  */
4376         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4377                                OEP_ONLY_CONST)
4378             && operand_equal_p (arg01,
4379                                 const_binop (PLUS_EXPR, arg2,
4380                                              integer_one_node, 0),
4381                                 OEP_ONLY_CONST))
4382           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4383                                                    type, arg1, arg2));
4384         break;
4385
4386       case LE_EXPR:
4387         /* If C1 is C2 - 1, this is min(A, C2).  */
4388         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4389                                OEP_ONLY_CONST)
4390             && operand_equal_p (arg01,
4391                                 const_binop (MINUS_EXPR, arg2,
4392                                              integer_one_node, 0),
4393                                 OEP_ONLY_CONST))
4394           return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4395                                                    type, arg1, arg2));
4396         break;
4397
4398       case GT_EXPR:
4399         /* If C1 is C2 - 1, this is max(A, C2).  */
4400         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4401                                OEP_ONLY_CONST)
4402             && operand_equal_p (arg01,
4403                                 const_binop (MINUS_EXPR, arg2,
4404                                              integer_one_node, 0),
4405                                 OEP_ONLY_CONST))
4406           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4407                                                    type, arg1, arg2));
4408         break;
4409
4410       case GE_EXPR:
4411         /* If C1 is C2 + 1, this is max(A, C2).  */
4412         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4413                                OEP_ONLY_CONST)
4414             && operand_equal_p (arg01,
4415                                 const_binop (PLUS_EXPR, arg2,
4416                                              integer_one_node, 0),
4417                                 OEP_ONLY_CONST))
4418           return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4419                                                    type, arg1, arg2));
4420         break;
4421       case NE_EXPR:
4422         break;
4423       default:
4424         gcc_unreachable ();
4425       }
4426
4427   return NULL_TREE;
4428 }
4429
4430
4431 \f
4432 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4433 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
4434 #endif
4435
4436 /* EXP is some logical combination of boolean tests.  See if we can
4437    merge it into some range test.  Return the new tree if so.  */
4438
4439 static tree
4440 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
4441 {
4442   int or_op = (code == TRUTH_ORIF_EXPR
4443                || code == TRUTH_OR_EXPR);
4444   int in0_p, in1_p, in_p;
4445   tree low0, low1, low, high0, high1, high;
4446   tree lhs = make_range (op0, &in0_p, &low0, &high0);
4447   tree rhs = make_range (op1, &in1_p, &low1, &high1);
4448   tree tem;
4449
4450   /* If this is an OR operation, invert both sides; we will invert
4451      again at the end.  */
4452   if (or_op)
4453     in0_p = ! in0_p, in1_p = ! in1_p;
4454
4455   /* If both expressions are the same, if we can merge the ranges, and we
4456      can build the range test, return it or it inverted.  If one of the
4457      ranges is always true or always false, consider it to be the same
4458      expression as the other.  */
4459   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
4460       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4461                        in1_p, low1, high1)
4462       && 0 != (tem = (build_range_check (type,
4463                                          lhs != 0 ? lhs
4464                                          : rhs != 0 ? rhs : integer_zero_node,
4465                                          in_p, low, high))))
4466     return or_op ? invert_truthvalue (tem) : tem;
4467
4468   /* On machines where the branch cost is expensive, if this is a
4469      short-circuited branch and the underlying object on both sides
4470      is the same, make a non-short-circuit operation.  */
4471   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
4472            && lhs != 0 && rhs != 0
4473            && (code == TRUTH_ANDIF_EXPR
4474                || code == TRUTH_ORIF_EXPR)
4475            && operand_equal_p (lhs, rhs, 0))
4476     {
4477       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
4478          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
4479          which cases we can't do this.  */
4480       if (simple_operand_p (lhs))
4481         return build2 (code == TRUTH_ANDIF_EXPR
4482                        ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4483                        type, op0, op1);
4484
4485       else if (lang_hooks.decls.global_bindings_p () == 0
4486                && ! CONTAINS_PLACEHOLDER_P (lhs))
4487         {
4488           tree common = save_expr (lhs);
4489
4490           if (0 != (lhs = build_range_check (type, common,
4491                                              or_op ? ! in0_p : in0_p,
4492                                              low0, high0))
4493               && (0 != (rhs = build_range_check (type, common,
4494                                                  or_op ? ! in1_p : in1_p,
4495                                                  low1, high1))))
4496             return build2 (code == TRUTH_ANDIF_EXPR
4497                            ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4498                            type, lhs, rhs);
4499         }
4500     }
4501
4502   return 0;
4503 }
4504 \f
4505 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
4506    bit value.  Arrange things so the extra bits will be set to zero if and
4507    only if C is signed-extended to its full width.  If MASK is nonzero,
4508    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
4509
4510 static tree
4511 unextend (tree c, int p, int unsignedp, tree mask)
4512 {
4513   tree type = TREE_TYPE (c);
4514   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
4515   tree temp;
4516
4517   if (p == modesize || unsignedp)
4518     return c;
4519
4520   /* We work by getting just the sign bit into the low-order bit, then
4521      into the high-order bit, then sign-extend.  We then XOR that value
4522      with C.  */
4523   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
4524   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
4525
4526   /* We must use a signed type in order to get an arithmetic right shift.
4527      However, we must also avoid introducing accidental overflows, so that
4528      a subsequent call to integer_zerop will work.  Hence we must
4529      do the type conversion here.  At this point, the constant is either
4530      zero or one, and the conversion to a signed type can never overflow.
4531      We could get an overflow if this conversion is done anywhere else.  */
4532   if (TYPE_UNSIGNED (type))
4533     temp = fold_convert (lang_hooks.types.signed_type (type), temp);
4534
4535   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
4536   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
4537   if (mask != 0)
4538     temp = const_binop (BIT_AND_EXPR, temp,
4539                         fold_convert (TREE_TYPE (c), mask), 0);
4540   /* If necessary, convert the type back to match the type of C.  */
4541   if (TYPE_UNSIGNED (type))
4542     temp = fold_convert (type, temp);
4543
4544   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
4545 }
4546 \f
4547 /* Find ways of folding logical expressions of LHS and RHS:
4548    Try to merge two comparisons to the same innermost item.
4549    Look for range tests like "ch >= '0' && ch <= '9'".
4550    Look for combinations of simple terms on machines with expensive branches
4551    and evaluate the RHS unconditionally.
4552
4553    For example, if we have p->a == 2 && p->b == 4 and we can make an
4554    object large enough to span both A and B, we can do this with a comparison
4555    against the object ANDed with the a mask.
4556
4557    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
4558    operations to do this with one comparison.
4559
4560    We check for both normal comparisons and the BIT_AND_EXPRs made this by
4561    function and the one above.
4562
4563    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
4564    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
4565
4566    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
4567    two operands.
4568
4569    We return the simplified tree or 0 if no optimization is possible.  */
4570
4571 static tree
4572 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
4573 {
4574   /* If this is the "or" of two comparisons, we can do something if
4575      the comparisons are NE_EXPR.  If this is the "and", we can do something
4576      if the comparisons are EQ_EXPR.  I.e.,
4577         (a->b == 2 && a->c == 4) can become (a->new == NEW).
4578
4579      WANTED_CODE is this operation code.  For single bit fields, we can
4580      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
4581      comparison for one-bit fields.  */
4582
4583   enum tree_code wanted_code;
4584   enum tree_code lcode, rcode;
4585   tree ll_arg, lr_arg, rl_arg, rr_arg;
4586   tree ll_inner, lr_inner, rl_inner, rr_inner;
4587   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
4588   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
4589   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
4590   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
4591   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
4592   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
4593   enum machine_mode lnmode, rnmode;
4594   tree ll_mask, lr_mask, rl_mask, rr_mask;
4595   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
4596   tree l_const, r_const;
4597   tree lntype, rntype, result;
4598   int first_bit, end_bit;
4599   int volatilep;
4600
4601   /* Start by getting the comparison codes.  Fail if anything is volatile.
4602      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
4603      it were surrounded with a NE_EXPR.  */
4604
4605   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
4606     return 0;
4607
4608   lcode = TREE_CODE (lhs);
4609   rcode = TREE_CODE (rhs);
4610
4611   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
4612     {
4613       lhs = build2 (NE_EXPR, truth_type, lhs,
4614                     fold_convert (TREE_TYPE (lhs), integer_zero_node));
4615       lcode = NE_EXPR;
4616     }
4617
4618   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
4619     {
4620       rhs = build2 (NE_EXPR, truth_type, rhs,
4621                     fold_convert (TREE_TYPE (rhs), integer_zero_node));
4622       rcode = NE_EXPR;
4623     }
4624
4625   if (TREE_CODE_CLASS (lcode) != tcc_comparison
4626       || TREE_CODE_CLASS (rcode) != tcc_comparison)
4627     return 0;
4628
4629   ll_arg = TREE_OPERAND (lhs, 0);
4630   lr_arg = TREE_OPERAND (lhs, 1);
4631   rl_arg = TREE_OPERAND (rhs, 0);
4632   rr_arg = TREE_OPERAND (rhs, 1);
4633
4634   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
4635   if (simple_operand_p (ll_arg)
4636       && simple_operand_p (lr_arg))
4637     {
4638       tree result;
4639       if (operand_equal_p (ll_arg, rl_arg, 0)
4640           && operand_equal_p (lr_arg, rr_arg, 0))
4641         {
4642           result = combine_comparisons (code, lcode, rcode,
4643                                         truth_type, ll_arg, lr_arg);
4644           if (result)
4645             return result;
4646         }
4647       else if (operand_equal_p (ll_arg, rr_arg, 0)
4648                && operand_equal_p (lr_arg, rl_arg, 0))
4649         {
4650           result = combine_comparisons (code, lcode,
4651                                         swap_tree_comparison (rcode),
4652                                         truth_type, ll_arg, lr_arg);
4653           if (result)
4654             return result;
4655         }
4656     }
4657
4658   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
4659           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
4660
4661   /* If the RHS can be evaluated unconditionally and its operands are
4662      simple, it wins to evaluate the RHS unconditionally on machines
4663      with expensive branches.  In this case, this isn't a comparison
4664      that can be merged.  Avoid doing this if the RHS is a floating-point
4665      comparison since those can trap.  */
4666
4667   if (BRANCH_COST >= 2
4668       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
4669       && simple_operand_p (rl_arg)
4670       && simple_operand_p (rr_arg))
4671     {
4672       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
4673       if (code == TRUTH_OR_EXPR
4674           && lcode == NE_EXPR && integer_zerop (lr_arg)
4675           && rcode == NE_EXPR && integer_zerop (rr_arg)
4676           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
4677         return build2 (NE_EXPR, truth_type,
4678                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
4679                                ll_arg, rl_arg),
4680                        fold_convert (TREE_TYPE (ll_arg), integer_zero_node));
4681
4682       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
4683       if (code == TRUTH_AND_EXPR
4684           && lcode == EQ_EXPR && integer_zerop (lr_arg)
4685           && rcode == EQ_EXPR && integer_zerop (rr_arg)
4686           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
4687         return build2 (EQ_EXPR, truth_type,
4688                        build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
4689                                ll_arg, rl_arg),
4690                        fold_convert (TREE_TYPE (ll_arg), integer_zero_node));
4691
4692       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
4693         return build2 (code, truth_type, lhs, rhs);
4694     }
4695
4696   /* See if the comparisons can be merged.  Then get all the parameters for
4697      each side.  */
4698
4699   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
4700       || (rcode != EQ_EXPR && rcode != NE_EXPR))
4701     return 0;
4702
4703   volatilep = 0;
4704   ll_inner = decode_field_reference (ll_arg,
4705                                      &ll_bitsize, &ll_bitpos, &ll_mode,
4706                                      &ll_unsignedp, &volatilep, &ll_mask,
4707                                      &ll_and_mask);
4708   lr_inner = decode_field_reference (lr_arg,
4709                                      &lr_bitsize, &lr_bitpos, &lr_mode,
4710                                      &lr_unsignedp, &volatilep, &lr_mask,
4711                                      &lr_and_mask);
4712   rl_inner = decode_field_reference (rl_arg,
4713                                      &rl_bitsize, &rl_bitpos, &rl_mode,
4714                                      &rl_unsignedp, &volatilep, &rl_mask,
4715                                      &rl_and_mask);
4716   rr_inner = decode_field_reference (rr_arg,
4717                                      &rr_bitsize, &rr_bitpos, &rr_mode,
4718                                      &rr_unsignedp, &volatilep, &rr_mask,
4719                                      &rr_and_mask);
4720
4721   /* It must be true that the inner operation on the lhs of each
4722      comparison must be the same if we are to be able to do anything.
4723      Then see if we have constants.  If not, the same must be true for
4724      the rhs's.  */
4725   if (volatilep || ll_inner == 0 || rl_inner == 0
4726       || ! operand_equal_p (ll_inner, rl_inner, 0))
4727     return 0;
4728
4729   if (TREE_CODE (lr_arg) == INTEGER_CST
4730       && TREE_CODE (rr_arg) == INTEGER_CST)
4731     l_const = lr_arg, r_const = rr_arg;
4732   else if (lr_inner == 0 || rr_inner == 0
4733            || ! operand_equal_p (lr_inner, rr_inner, 0))
4734     return 0;
4735   else
4736     l_const = r_const = 0;
4737
4738   /* If either comparison code is not correct for our logical operation,
4739      fail.  However, we can convert a one-bit comparison against zero into
4740      the opposite comparison against that bit being set in the field.  */
4741
4742   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
4743   if (lcode != wanted_code)
4744     {
4745       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
4746         {
4747           /* Make the left operand unsigned, since we are only interested
4748              in the value of one bit.  Otherwise we are doing the wrong
4749              thing below.  */
4750           ll_unsignedp = 1;
4751           l_const = ll_mask;
4752         }
4753       else
4754         return 0;
4755     }
4756
4757   /* This is analogous to the code for l_const above.  */
4758   if (rcode != wanted_code)
4759     {
4760       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
4761         {
4762           rl_unsignedp = 1;
4763           r_const = rl_mask;
4764         }
4765       else
4766         return 0;
4767     }
4768
4769   /* After this point all optimizations will generate bit-field
4770      references, which we might not want.  */
4771   if (! lang_hooks.can_use_bit_fields_p ())
4772     return 0;
4773
4774   /* See if we can find a mode that contains both fields being compared on
4775      the left.  If we can't, fail.  Otherwise, update all constants and masks
4776      to be relative to a field of that size.  */
4777   first_bit = MIN (ll_bitpos, rl_bitpos);
4778   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
4779   lnmode = get_best_mode (end_bit - first_bit, first_bit,
4780                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
4781                           volatilep);
4782   if (lnmode == VOIDmode)
4783     return 0;
4784
4785   lnbitsize = GET_MODE_BITSIZE (lnmode);
4786   lnbitpos = first_bit & ~ (lnbitsize - 1);
4787   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
4788   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
4789
4790   if (BYTES_BIG_ENDIAN)
4791     {
4792       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
4793       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
4794     }
4795
4796   ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
4797                          size_int (xll_bitpos), 0);
4798   rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
4799                          size_int (xrl_bitpos), 0);
4800
4801   if (l_const)
4802     {
4803       l_const = fold_convert (lntype, l_const);
4804       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
4805       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
4806       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
4807                                         fold_build1 (BIT_NOT_EXPR,
4808                                                      lntype, ll_mask),
4809                                         0)))
4810         {
4811           warning ("comparison is always %d", wanted_code == NE_EXPR);
4812
4813           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
4814         }
4815     }
4816   if (r_const)
4817     {
4818       r_const = fold_convert (lntype, r_const);
4819       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
4820       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
4821       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
4822                                         fold_build1 (BIT_NOT_EXPR,
4823                                                      lntype, rl_mask),
4824                                         0)))
4825         {
4826           warning ("comparison is always %d", wanted_code == NE_EXPR);
4827
4828           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
4829         }
4830     }
4831
4832   /* If the right sides are not constant, do the same for it.  Also,
4833      disallow this optimization if a size or signedness mismatch occurs
4834      between the left and right sides.  */
4835   if (l_const == 0)
4836     {
4837       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
4838           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
4839           /* Make sure the two fields on the right
4840              correspond to the left without being swapped.  */
4841           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
4842         return 0;
4843
4844       first_bit = MIN (lr_bitpos, rr_bitpos);
4845       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
4846       rnmode = get_best_mode (end_bit - first_bit, first_bit,
4847                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
4848                               volatilep);
4849       if (rnmode == VOIDmode)
4850         return 0;
4851
4852       rnbitsize = GET_MODE_BITSIZE (rnmode);
4853       rnbitpos = first_bit & ~ (rnbitsize - 1);
4854       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
4855       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
4856
4857       if (BYTES_BIG_ENDIAN)
4858         {
4859           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
4860           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
4861         }
4862
4863       lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
4864                              size_int (xlr_bitpos), 0);
4865       rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
4866                              size_int (xrr_bitpos), 0);
4867
4868       /* Make a mask that corresponds to both fields being compared.
4869          Do this for both items being compared.  If the operands are the
4870          same size and the bits being compared are in the same position
4871          then we can do this by masking both and comparing the masked
4872          results.  */
4873       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
4874       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
4875       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
4876         {
4877           lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
4878                                     ll_unsignedp || rl_unsignedp);
4879           if (! all_ones_mask_p (ll_mask, lnbitsize))
4880             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
4881
4882           rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
4883                                     lr_unsignedp || rr_unsignedp);
4884           if (! all_ones_mask_p (lr_mask, rnbitsize))
4885             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
4886
4887           return build2 (wanted_code, truth_type, lhs, rhs);
4888         }
4889
4890       /* There is still another way we can do something:  If both pairs of
4891          fields being compared are adjacent, we may be able to make a wider
4892          field containing them both.
4893
4894          Note that we still must mask the lhs/rhs expressions.  Furthermore,
4895          the mask must be shifted to account for the shift done by
4896          make_bit_field_ref.  */
4897       if ((ll_bitsize + ll_bitpos == rl_bitpos
4898            && lr_bitsize + lr_bitpos == rr_bitpos)
4899           || (ll_bitpos == rl_bitpos + rl_bitsize
4900               && lr_bitpos == rr_bitpos + rr_bitsize))
4901         {
4902           tree type;
4903
4904           lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
4905                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
4906           rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
4907                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
4908
4909           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
4910                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
4911           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
4912                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
4913
4914           /* Convert to the smaller type before masking out unwanted bits.  */
4915           type = lntype;
4916           if (lntype != rntype)
4917             {
4918               if (lnbitsize > rnbitsize)
4919                 {
4920                   lhs = fold_convert (rntype, lhs);
4921                   ll_mask = fold_convert (rntype, ll_mask);
4922                   type = rntype;
4923                 }
4924               else if (lnbitsize < rnbitsize)
4925                 {
4926                   rhs = fold_convert (lntype, rhs);
4927                   lr_mask = fold_convert (lntype, lr_mask);
4928                   type = lntype;
4929                 }
4930             }
4931
4932           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
4933             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
4934
4935           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
4936             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
4937
4938           return build2 (wanted_code, truth_type, lhs, rhs);
4939         }
4940
4941       return 0;
4942     }
4943
4944   /* Handle the case of comparisons with constants.  If there is something in
4945      common between the masks, those bits of the constants must be the same.
4946      If not, the condition is always false.  Test for this to avoid generating
4947      incorrect code below.  */
4948   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
4949   if (! integer_zerop (result)
4950       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
4951                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
4952     {
4953       if (wanted_code == NE_EXPR)
4954         {
4955           warning ("%<or%> of unmatched not-equal tests is always 1");
4956           return constant_boolean_node (true, truth_type);
4957         }
4958       else
4959         {
4960           warning ("%<and%> of mutually exclusive equal-tests is always 0");
4961           return constant_boolean_node (false, truth_type);
4962         }
4963     }
4964
4965   /* Construct the expression we will return.  First get the component
4966      reference we will make.  Unless the mask is all ones the width of
4967      that field, perform the mask operation.  Then compare with the
4968      merged constant.  */
4969   result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
4970                                ll_unsignedp || rl_unsignedp);
4971
4972   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
4973   if (! all_ones_mask_p (ll_mask, lnbitsize))
4974     result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
4975
4976   return build2 (wanted_code, truth_type, result,
4977                  const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
4978 }
4979 \f
4980 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
4981    constant.  */
4982
4983 static tree
4984 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
4985 {
4986   tree arg0 = op0;
4987   enum tree_code op_code;
4988   tree comp_const = op1;
4989   tree minmax_const;
4990   int consts_equal, consts_lt;
4991   tree inner;
4992
4993   STRIP_SIGN_NOPS (arg0);
4994
4995   op_code = TREE_CODE (arg0);
4996   minmax_const = TREE_OPERAND (arg0, 1);
4997   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
4998   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
4999   inner = TREE_OPERAND (arg0, 0);
5000
5001   /* If something does not permit us to optimize, return the original tree.  */
5002   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5003       || TREE_CODE (comp_const) != INTEGER_CST
5004       || TREE_CONSTANT_OVERFLOW (comp_const)
5005       || TREE_CODE (minmax_const) != INTEGER_CST
5006       || TREE_CONSTANT_OVERFLOW (minmax_const))
5007     return NULL_TREE;
5008
5009   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5010      and GT_EXPR, doing the rest with recursive calls using logical
5011      simplifications.  */
5012   switch (code)
5013     {
5014     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5015       {
5016         /* FIXME: We should be able to invert code without building a
5017            scratch tree node, but doing so would require us to
5018            duplicate a part of invert_truthvalue here.  */
5019         tree tem = invert_truthvalue (build2 (code, type, op0, op1));
5020         tem = optimize_minmax_comparison (TREE_CODE (tem),
5021                                           TREE_TYPE (tem),
5022                                           TREE_OPERAND (tem, 0),
5023                                           TREE_OPERAND (tem, 1));
5024         return invert_truthvalue (tem);
5025       }
5026
5027     case GE_EXPR:
5028       return
5029         fold_build2 (TRUTH_ORIF_EXPR, type,
5030                      optimize_minmax_comparison
5031                      (EQ_EXPR, type, arg0, comp_const),
5032                      optimize_minmax_comparison
5033                      (GT_EXPR, type, arg0, comp_const));
5034
5035     case EQ_EXPR:
5036       if (op_code == MAX_EXPR && consts_equal)
5037         /* MAX (X, 0) == 0  ->  X <= 0  */
5038         return fold_build2 (LE_EXPR, type, inner, comp_const);
5039
5040       else if (op_code == MAX_EXPR && consts_lt)
5041         /* MAX (X, 0) == 5  ->  X == 5   */
5042         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5043
5044       else if (op_code == MAX_EXPR)
5045         /* MAX (X, 0) == -1  ->  false  */
5046         return omit_one_operand (type, integer_zero_node, inner);
5047
5048       else if (consts_equal)
5049         /* MIN (X, 0) == 0  ->  X >= 0  */
5050         return fold_build2 (GE_EXPR, type, inner, comp_const);
5051
5052       else if (consts_lt)
5053         /* MIN (X, 0) == 5  ->  false  */
5054         return omit_one_operand (type, integer_zero_node, inner);
5055
5056       else
5057         /* MIN (X, 0) == -1  ->  X == -1  */
5058         return fold_build2 (EQ_EXPR, type, inner, comp_const);
5059
5060     case GT_EXPR:
5061       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5062         /* MAX (X, 0) > 0  ->  X > 0
5063            MAX (X, 0) > 5  ->  X > 5  */
5064         return fold_build2 (GT_EXPR, type, inner, comp_const);
5065
5066       else if (op_code == MAX_EXPR)
5067         /* MAX (X, 0) > -1  ->  true  */
5068         return omit_one_operand (type, integer_one_node, inner);
5069
5070       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5071         /* MIN (X, 0) > 0  ->  false
5072            MIN (X, 0) > 5  ->  false  */
5073         return omit_one_operand (type, integer_zero_node, inner);
5074
5075       else
5076         /* MIN (X, 0) > -1  ->  X > -1  */
5077         return fold_build2 (GT_EXPR, type, inner, comp_const);
5078
5079     default:
5080       return NULL_TREE;
5081     }
5082 }
5083 \f
5084 /* T is an integer expression that is being multiplied, divided, or taken a
5085    modulus (CODE says which and what kind of divide or modulus) by a
5086    constant C.  See if we can eliminate that operation by folding it with
5087    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5088    should be used for the computation if wider than our type.
5089
5090    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5091    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5092    expression would not overflow or that overflow is undefined for the type
5093    in the language in question.
5094
5095    We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5096    the machine has a multiply-accumulate insn or that this is part of an
5097    addressing calculation.
5098
5099    If we return a non-null expression, it is an equivalent form of the
5100    original computation, but need not be in the original type.  */
5101
5102 static tree
5103 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type)
5104 {
5105   /* To avoid exponential search depth, refuse to allow recursion past
5106      three levels.  Beyond that (1) it's highly unlikely that we'll find
5107      something interesting and (2) we've probably processed it before
5108      when we built the inner expression.  */
5109
5110   static int depth;
5111   tree ret;
5112
5113   if (depth > 3)
5114     return NULL;
5115
5116   depth++;
5117   ret = extract_muldiv_1 (t, c, code, wide_type);
5118   depth--;
5119
5120   return ret;
5121 }
5122
5123 static tree
5124 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
5125 {
5126   tree type = TREE_TYPE (t);
5127   enum tree_code tcode = TREE_CODE (t);
5128   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5129                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5130                 ? wide_type : type);
5131   tree t1, t2;
5132   int same_p = tcode == code;
5133   tree op0 = NULL_TREE, op1 = NULL_TREE;
5134
5135   /* Don't deal with constants of zero here; they confuse the code below.  */
5136   if (integer_zerop (c))
5137     return NULL_TREE;
5138
5139   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5140     op0 = TREE_OPERAND (t, 0);
5141
5142   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5143     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5144
5145   /* Note that we need not handle conditional operations here since fold
5146      already handles those cases.  So just do arithmetic here.  */
5147   switch (tcode)
5148     {
5149     case INTEGER_CST:
5150       /* For a constant, we can always simplify if we are a multiply
5151          or (for divide and modulus) if it is a multiple of our constant.  */
5152       if (code == MULT_EXPR
5153           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5154         return const_binop (code, fold_convert (ctype, t),
5155                             fold_convert (ctype, c), 0);
5156       break;
5157
5158     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
5159       /* If op0 is an expression ...  */
5160       if ((COMPARISON_CLASS_P (op0)
5161            || UNARY_CLASS_P (op0)
5162            || BINARY_CLASS_P (op0)
5163            || EXPRESSION_CLASS_P (op0))
5164           /* ... and is unsigned, and its type is smaller than ctype,
5165              then we cannot pass through as widening.  */
5166           && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5167                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5168                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5169                && (GET_MODE_SIZE (TYPE_MODE (ctype))
5170                    > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5171               /* ... or this is a truncation (t is narrower than op0),
5172                  then we cannot pass through this narrowing.  */
5173               || (GET_MODE_SIZE (TYPE_MODE (type))
5174                   < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5175               /* ... or signedness changes for division or modulus,
5176                  then we cannot pass through this conversion.  */
5177               || (code != MULT_EXPR
5178                   && (TYPE_UNSIGNED (ctype)
5179                       != TYPE_UNSIGNED (TREE_TYPE (op0))))))
5180         break;
5181
5182       /* Pass the constant down and see if we can make a simplification.  If
5183          we can, replace this expression with the inner simplification for
5184          possible later conversion to our or some other type.  */
5185       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5186           && TREE_CODE (t2) == INTEGER_CST
5187           && ! TREE_CONSTANT_OVERFLOW (t2)
5188           && (0 != (t1 = extract_muldiv (op0, t2, code,
5189                                          code == MULT_EXPR
5190                                          ? ctype : NULL_TREE))))
5191         return t1;
5192       break;
5193
5194     case ABS_EXPR:
5195       /* If widening the type changes it from signed to unsigned, then we
5196          must avoid building ABS_EXPR itself as unsigned.  */
5197       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5198         {
5199           tree cstype = (*lang_hooks.types.signed_type) (ctype);
5200           if ((t1 = extract_muldiv (op0, c, code, cstype)) != 0)
5201             {
5202               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5203               return fold_convert (ctype, t1);
5204             }
5205           break;
5206         }
5207       /* FALLTHROUGH */
5208     case NEGATE_EXPR:
5209       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
5210         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5211       break;
5212
5213     case MIN_EXPR:  case MAX_EXPR:
5214       /* If widening the type changes the signedness, then we can't perform
5215          this optimization as that changes the result.  */
5216       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5217         break;
5218
5219       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
5220       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0
5221           && (t2 = extract_muldiv (op1, c, code, wide_type)) != 0)
5222         {
5223           if (tree_int_cst_sgn (c) < 0)
5224             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5225
5226           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5227                               fold_convert (ctype, t2));
5228         }
5229       break;
5230
5231     case LSHIFT_EXPR:  case RSHIFT_EXPR:
5232       /* If the second operand is constant, this is a multiplication
5233          or floor division, by a power of two, so we can treat it that
5234          way unless the multiplier or divisor overflows.  Signed
5235          left-shift overflow is implementation-defined rather than
5236          undefined in C90, so do not convert signed left shift into
5237          multiplication.  */
5238       if (TREE_CODE (op1) == INTEGER_CST
5239           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5240           /* const_binop may not detect overflow correctly,
5241              so check for it explicitly here.  */
5242           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5243           && TREE_INT_CST_HIGH (op1) == 0
5244           && 0 != (t1 = fold_convert (ctype,
5245                                       const_binop (LSHIFT_EXPR,
5246                                                    size_one_node,
5247                                                    op1, 0)))
5248           && ! TREE_OVERFLOW (t1))
5249         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5250                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
5251                                        ctype, fold_convert (ctype, op0), t1),
5252                                c, code, wide_type);
5253       break;
5254
5255     case PLUS_EXPR:  case MINUS_EXPR:
5256       /* See if we can eliminate the operation on both sides.  If we can, we
5257          can return a new PLUS or MINUS.  If we can't, the only remaining
5258          cases where we can do anything are if the second operand is a
5259          constant.  */
5260       t1 = extract_muldiv (op0, c, code, wide_type);
5261       t2 = extract_muldiv (op1, c, code, wide_type);
5262       if (t1 != 0 && t2 != 0
5263           && (code == MULT_EXPR
5264               /* If not multiplication, we can only do this if both operands
5265                  are divisible by c.  */
5266               || (multiple_of_p (ctype, op0, c)
5267                   && multiple_of_p (ctype, op1, c))))
5268         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5269                             fold_convert (ctype, t2));
5270
5271       /* If this was a subtraction, negate OP1 and set it to be an addition.
5272          This simplifies the logic below.  */
5273       if (tcode == MINUS_EXPR)
5274         tcode = PLUS_EXPR, op1 = negate_expr (op1);
5275
5276       if (TREE_CODE (op1) != INTEGER_CST)
5277         break;
5278
5279       /* If either OP1 or C are negative, this optimization is not safe for
5280          some of the division and remainder types while for others we need
5281          to change the code.  */
5282       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5283         {
5284           if (code == CEIL_DIV_EXPR)
5285             code = FLOOR_DIV_EXPR;
5286           else if (code == FLOOR_DIV_EXPR)
5287             code = CEIL_DIV_EXPR;
5288           else if (code != MULT_EXPR
5289                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5290             break;
5291         }
5292
5293       /* If it's a multiply or a division/modulus operation of a multiple
5294          of our constant, do the operation and verify it doesn't overflow.  */
5295       if (code == MULT_EXPR
5296           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5297         {
5298           op1 = const_binop (code, fold_convert (ctype, op1),
5299                              fold_convert (ctype, c), 0);
5300           /* We allow the constant to overflow with wrapping semantics.  */
5301           if (op1 == 0
5302               || (TREE_OVERFLOW (op1) && ! flag_wrapv))
5303             break;
5304         }
5305       else
5306         break;
5307
5308       /* If we have an unsigned type is not a sizetype, we cannot widen
5309          the operation since it will change the result if the original
5310          computation overflowed.  */
5311       if (TYPE_UNSIGNED (ctype)
5312           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5313           && ctype != type)
5314         break;
5315
5316       /* If we were able to eliminate our operation from the first side,
5317          apply our operation to the second side and reform the PLUS.  */
5318       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5319         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5320
5321       /* The last case is if we are a multiply.  In that case, we can
5322          apply the distributive law to commute the multiply and addition
5323          if the multiplication of the constants doesn't overflow.  */
5324       if (code == MULT_EXPR)
5325         return fold_build2 (tcode, ctype,
5326                             fold_build2 (code, ctype,
5327                                          fold_convert (ctype, op0),
5328                                          fold_convert (ctype, c)),
5329                             op1);
5330
5331       break;
5332
5333     case MULT_EXPR:
5334       /* We have a special case here if we are doing something like
5335          (C * 8) % 4 since we know that's zero.  */
5336       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5337            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5338           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5339           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5340         return omit_one_operand (type, integer_zero_node, op0);
5341
5342       /* ... fall through ...  */
5343
5344     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
5345     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
5346       /* If we can extract our operation from the LHS, do so and return a
5347          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
5348          do something only if the second operand is a constant.  */
5349       if (same_p
5350           && (t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
5351         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5352                             fold_convert (ctype, op1));
5353       else if (tcode == MULT_EXPR && code == MULT_EXPR
5354                && (t1 = extract_muldiv (op1, c, code, wide_type)) != 0)
5355         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5356                             fold_convert (ctype, t1));
5357       else if (TREE_CODE (op1) != INTEGER_CST)
5358         return 0;
5359
5360       /* If these are the same operation types, we can associate them
5361          assuming no overflow.  */
5362       if (tcode == code
5363           && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5364                                      fold_convert (ctype, c), 0))
5365           && ! TREE_OVERFLOW (t1))
5366         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5367
5368       /* If these operations "cancel" each other, we have the main
5369          optimizations of this pass, which occur when either constant is a
5370          multiple of the other, in which case we replace this with either an
5371          operation or CODE or TCODE.
5372
5373          If we have an unsigned type that is not a sizetype, we cannot do
5374          this since it will change the result if the original computation
5375          overflowed.  */
5376       if ((! TYPE_UNSIGNED (ctype)
5377            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5378           && ! flag_wrapv
5379           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5380               || (tcode == MULT_EXPR
5381                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5382                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
5383         {
5384           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5385             return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5386                                 fold_convert (ctype,
5387                                               const_binop (TRUNC_DIV_EXPR,
5388                                                            op1, c, 0)));
5389           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5390             return fold_build2 (code, ctype, fold_convert (ctype, op0),
5391                                 fold_convert (ctype,
5392                                               const_binop (TRUNC_DIV_EXPR,
5393                                                            c, op1, 0)));
5394         }
5395       break;
5396
5397     default:
5398       break;
5399     }
5400
5401   return 0;
5402 }
5403 \f
5404 /* Return a node which has the indicated constant VALUE (either 0 or
5405    1), and is of the indicated TYPE.  */
5406
5407 tree
5408 constant_boolean_node (int value, tree type)
5409 {
5410   if (type == integer_type_node)
5411     return value ? integer_one_node : integer_zero_node;
5412   else if (type == boolean_type_node)
5413     return value ? boolean_true_node : boolean_false_node;
5414   else
5415     return build_int_cst (type, value);
5416 }
5417
5418
5419 /* Return true if expr looks like an ARRAY_REF and set base and
5420    offset to the appropriate trees.  If there is no offset,
5421    offset is set to NULL_TREE.  */
5422
5423 static bool
5424 extract_array_ref (tree expr, tree *base, tree *offset)
5425 {
5426   /* We have to be careful with stripping nops as with the
5427      base type the meaning of the offset can change.  */
5428   tree inner_expr = expr;
5429   STRIP_NOPS (inner_expr);
5430   /* One canonical form is a PLUS_EXPR with the first
5431      argument being an ADDR_EXPR with a possible NOP_EXPR
5432      attached.  */
5433   if (TREE_CODE (expr) == PLUS_EXPR)
5434     {
5435       tree op0 = TREE_OPERAND (expr, 0);
5436       STRIP_NOPS (op0);
5437       if (TREE_CODE (op0) == ADDR_EXPR)
5438         {
5439           *base = TREE_OPERAND (expr, 0);
5440           *offset = TREE_OPERAND (expr, 1);
5441           return true;
5442         }
5443     }
5444   /* Other canonical form is an ADDR_EXPR of an ARRAY_REF,
5445      which we transform into an ADDR_EXPR with appropriate
5446      offset.  For other arguments to the ADDR_EXPR we assume
5447      zero offset and as such do not care about the ADDR_EXPR
5448      type and strip possible nops from it.  */
5449   else if (TREE_CODE (inner_expr) == ADDR_EXPR)
5450     {
5451       tree op0 = TREE_OPERAND (inner_expr, 0);
5452       if (TREE_CODE (op0) == ARRAY_REF)
5453         {
5454           *base = build_fold_addr_expr (TREE_OPERAND (op0, 0));
5455           *offset = TREE_OPERAND (op0, 1);
5456         }
5457       else
5458         {
5459           *base = inner_expr;
5460           *offset = NULL_TREE;
5461         }
5462       return true;
5463     }
5464
5465   return false;
5466 }
5467
5468
5469 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
5470    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
5471    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
5472    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
5473    COND is the first argument to CODE; otherwise (as in the example
5474    given here), it is the second argument.  TYPE is the type of the
5475    original expression.  Return NULL_TREE if no simplification is
5476    possible.  */
5477
5478 static tree
5479 fold_binary_op_with_conditional_arg (enum tree_code code,
5480                                      tree type, tree op0, tree op1,
5481                                      tree cond, tree arg, int cond_first_p)
5482 {
5483   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
5484   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
5485   tree test, true_value, false_value;
5486   tree lhs = NULL_TREE;
5487   tree rhs = NULL_TREE;
5488
5489   /* This transformation is only worthwhile if we don't have to wrap
5490      arg in a SAVE_EXPR, and the operation can be simplified on at least
5491      one of the branches once its pushed inside the COND_EXPR.  */
5492   if (!TREE_CONSTANT (arg))
5493     return NULL_TREE;
5494
5495   if (TREE_CODE (cond) == COND_EXPR)
5496     {
5497       test = TREE_OPERAND (cond, 0);
5498       true_value = TREE_OPERAND (cond, 1);
5499       false_value = TREE_OPERAND (cond, 2);
5500       /* If this operand throws an expression, then it does not make
5501          sense to try to perform a logical or arithmetic operation
5502          involving it.  */
5503       if (VOID_TYPE_P (TREE_TYPE (true_value)))
5504         lhs = true_value;
5505       if (VOID_TYPE_P (TREE_TYPE (false_value)))
5506         rhs = false_value;
5507     }
5508   else
5509     {
5510       tree testtype = TREE_TYPE (cond);
5511       test = cond;
5512       true_value = constant_boolean_node (true, testtype);
5513       false_value = constant_boolean_node (false, testtype);
5514     }
5515
5516   arg = fold_convert (arg_type, arg);
5517   if (lhs == 0)
5518     {
5519       true_value = fold_convert (cond_type, true_value);
5520       if (cond_first_p)
5521         lhs = fold_build2 (code, type, true_value, arg);
5522       else
5523         lhs = fold_build2 (code, type, arg, true_value);
5524     }
5525   if (rhs == 0)
5526     {
5527       false_value = fold_convert (cond_type, false_value);
5528       if (cond_first_p)
5529         rhs = fold_build2 (code, type, false_value, arg);
5530       else
5531         rhs = fold_build2 (code, type, arg, false_value);
5532     }
5533
5534   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
5535   return fold_convert (type, test);
5536 }
5537
5538 \f
5539 /* Subroutine of fold() that checks for the addition of +/- 0.0.
5540
5541    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
5542    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
5543    ADDEND is the same as X.
5544
5545    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
5546    and finite.  The problematic cases are when X is zero, and its mode
5547    has signed zeros.  In the case of rounding towards -infinity,
5548    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
5549    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
5550
5551 static bool
5552 fold_real_zero_addition_p (tree type, tree addend, int negate)
5553 {
5554   if (!real_zerop (addend))
5555     return false;
5556
5557   /* Don't allow the fold with -fsignaling-nans.  */
5558   if (HONOR_SNANS (TYPE_MODE (type)))
5559     return false;
5560
5561   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
5562   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
5563     return true;
5564
5565   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
5566   if (TREE_CODE (addend) == REAL_CST
5567       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
5568     negate = !negate;
5569
5570   /* The mode has signed zeros, and we have to honor their sign.
5571      In this situation, there is only one case we can return true for.
5572      X - 0 is the same as X unless rounding towards -infinity is
5573      supported.  */
5574   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
5575 }
5576
5577 /* Subroutine of fold() that checks comparisons of built-in math
5578    functions against real constants.
5579
5580    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
5581    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
5582    is the type of the result and ARG0 and ARG1 are the operands of the
5583    comparison.  ARG1 must be a TREE_REAL_CST.
5584
5585    The function returns the constant folded tree if a simplification
5586    can be made, and NULL_TREE otherwise.  */
5587
5588 static tree
5589 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
5590                      tree type, tree arg0, tree arg1)
5591 {
5592   REAL_VALUE_TYPE c;
5593
5594   if (BUILTIN_SQRT_P (fcode))
5595     {
5596       tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
5597       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
5598
5599       c = TREE_REAL_CST (arg1);
5600       if (REAL_VALUE_NEGATIVE (c))
5601         {
5602           /* sqrt(x) < y is always false, if y is negative.  */
5603           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
5604             return omit_one_operand (type, integer_zero_node, arg);
5605
5606           /* sqrt(x) > y is always true, if y is negative and we
5607              don't care about NaNs, i.e. negative values of x.  */
5608           if (code == NE_EXPR || !HONOR_NANS (mode))
5609             return omit_one_operand (type, integer_one_node, arg);
5610
5611           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
5612           return fold_build2 (GE_EXPR, type, arg,
5613                               build_real (TREE_TYPE (arg), dconst0));
5614         }
5615       else if (code == GT_EXPR || code == GE_EXPR)
5616         {
5617           REAL_VALUE_TYPE c2;
5618
5619           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
5620           real_convert (&c2, mode, &c2);
5621
5622           if (REAL_VALUE_ISINF (c2))
5623             {
5624               /* sqrt(x) > y is x == +Inf, when y is very large.  */
5625               if (HONOR_INFINITIES (mode))
5626                 return fold_build2 (EQ_EXPR, type, arg,
5627                                     build_real (TREE_TYPE (arg), c2));
5628
5629               /* sqrt(x) > y is always false, when y is very large
5630                  and we don't care about infinities.  */
5631               return omit_one_operand (type, integer_zero_node, arg);
5632             }
5633
5634           /* sqrt(x) > c is the same as x > c*c.  */
5635           return fold_build2 (code, type, arg,
5636                               build_real (TREE_TYPE (arg), c2));
5637         }
5638       else if (code == LT_EXPR || code == LE_EXPR)
5639         {
5640           REAL_VALUE_TYPE c2;
5641
5642           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
5643           real_convert (&c2, mode, &c2);
5644
5645           if (REAL_VALUE_ISINF (c2))
5646             {
5647               /* sqrt(x) < y is always true, when y is a very large
5648                  value and we don't care about NaNs or Infinities.  */
5649               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
5650                 return omit_one_operand (type, integer_one_node, arg);
5651
5652               /* sqrt(x) < y is x != +Inf when y is very large and we
5653                  don't care about NaNs.  */
5654               if (! HONOR_NANS (mode))
5655                 return fold_build2 (NE_EXPR, type, arg,
5656                                     build_real (TREE_TYPE (arg), c2));
5657
5658               /* sqrt(x) < y is x >= 0 when y is very large and we
5659                  don't care about Infinities.  */
5660               if (! HONOR_INFINITIES (mode))
5661                 return fold_build2 (GE_EXPR, type, arg,
5662                                     build_real (TREE_TYPE (arg), dconst0));
5663
5664               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
5665               if (lang_hooks.decls.global_bindings_p () != 0
5666                   || CONTAINS_PLACEHOLDER_P (arg))
5667                 return NULL_TREE;
5668
5669               arg = save_expr (arg);
5670               return fold_build2 (TRUTH_ANDIF_EXPR, type,
5671                                   fold_build2 (GE_EXPR, type, arg,
5672                                                build_real (TREE_TYPE (arg),
5673                                                            dconst0)),
5674                                   fold_build2 (NE_EXPR, type, arg,
5675                                                build_real (TREE_TYPE (arg),
5676                                                            c2)));
5677             }
5678
5679           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
5680           if (! HONOR_NANS (mode))
5681             return fold_build2 (code, type, arg,
5682                                 build_real (TREE_TYPE (arg), c2));
5683
5684           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
5685           if (lang_hooks.decls.global_bindings_p () == 0
5686               && ! CONTAINS_PLACEHOLDER_P (arg))
5687             {
5688               arg = save_expr (arg);
5689               return fold_build2 (TRUTH_ANDIF_EXPR, type,
5690                                   fold_build2 (GE_EXPR, type, arg,
5691                                                build_real (TREE_TYPE (arg),
5692                                                            dconst0)),
5693                                   fold_build2 (code, type, arg,
5694                                                build_real (TREE_TYPE (arg),
5695                                                            c2)));
5696             }
5697         }
5698     }
5699
5700   return NULL_TREE;
5701 }
5702
5703 /* Subroutine of fold() that optimizes comparisons against Infinities,
5704    either +Inf or -Inf.
5705
5706    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
5707    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
5708    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
5709
5710    The function returns the constant folded tree if a simplification
5711    can be made, and NULL_TREE otherwise.  */
5712
5713 static tree
5714 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
5715 {
5716   enum machine_mode mode;
5717   REAL_VALUE_TYPE max;
5718   tree temp;
5719   bool neg;
5720
5721   mode = TYPE_MODE (TREE_TYPE (arg0));
5722
5723   /* For negative infinity swap the sense of the comparison.  */
5724   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
5725   if (neg)
5726     code = swap_tree_comparison (code);
5727
5728   switch (code)
5729     {
5730     case GT_EXPR:
5731       /* x > +Inf is always false, if with ignore sNANs.  */
5732       if (HONOR_SNANS (mode))
5733         return NULL_TREE;
5734       return omit_one_operand (type, integer_zero_node, arg0);
5735
5736     case LE_EXPR:
5737       /* x <= +Inf is always true, if we don't case about NaNs.  */
5738       if (! HONOR_NANS (mode))
5739         return omit_one_operand (type, integer_one_node, arg0);
5740
5741       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
5742       if (lang_hooks.decls.global_bindings_p () == 0
5743           && ! CONTAINS_PLACEHOLDER_P (arg0))
5744         {
5745           arg0 = save_expr (arg0);
5746           return fold_build2 (EQ_EXPR, type, arg0, arg0);
5747         }
5748       break;
5749
5750     case EQ_EXPR:
5751     case GE_EXPR:
5752       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
5753       real_maxval (&max, neg, mode);
5754       return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
5755                           arg0, build_real (TREE_TYPE (arg0), max));
5756
5757     case LT_EXPR:
5758       /* x < +Inf is always equal to x <= DBL_MAX.  */
5759       real_maxval (&max, neg, mode);
5760       return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
5761                           arg0, build_real (TREE_TYPE (arg0), max));
5762
5763     case NE_EXPR:
5764       /* x != +Inf is always equal to !(x > DBL_MAX).  */
5765       real_maxval (&max, neg, mode);
5766       if (! HONOR_NANS (mode))
5767         return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
5768                             arg0, build_real (TREE_TYPE (arg0), max));
5769
5770       /* The transformation below creates non-gimple code and thus is
5771          not appropriate if we are in gimple form.  */
5772       if (in_gimple_form)
5773         return NULL_TREE;
5774
5775       temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
5776                           arg0, build_real (TREE_TYPE (arg0), max));
5777       return fold_build1 (TRUTH_NOT_EXPR, type, temp);
5778
5779     default:
5780       break;
5781     }
5782
5783   return NULL_TREE;
5784 }
5785
5786 /* Subroutine of fold() that optimizes comparisons of a division by
5787    a nonzero integer constant against an integer constant, i.e.
5788    X/C1 op C2.
5789
5790    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
5791    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
5792    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
5793
5794    The function returns the constant folded tree if a simplification
5795    can be made, and NULL_TREE otherwise.  */
5796
5797 static tree
5798 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
5799 {
5800   tree prod, tmp, hi, lo;
5801   tree arg00 = TREE_OPERAND (arg0, 0);
5802   tree arg01 = TREE_OPERAND (arg0, 1);
5803   unsigned HOST_WIDE_INT lpart;
5804   HOST_WIDE_INT hpart;
5805   int overflow;
5806
5807   /* We have to do this the hard way to detect unsigned overflow.
5808      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
5809   overflow = mul_double (TREE_INT_CST_LOW (arg01),
5810                          TREE_INT_CST_HIGH (arg01),
5811                          TREE_INT_CST_LOW (arg1),
5812                          TREE_INT_CST_HIGH (arg1), &lpart, &hpart);
5813   prod = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
5814   prod = force_fit_type (prod, -1, overflow, false);
5815
5816   if (TYPE_UNSIGNED (TREE_TYPE (arg0)))
5817     {
5818       tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
5819       lo = prod;
5820
5821       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
5822       overflow = add_double (TREE_INT_CST_LOW (prod),
5823                              TREE_INT_CST_HIGH (prod),
5824                              TREE_INT_CST_LOW (tmp),
5825                              TREE_INT_CST_HIGH (tmp),
5826                              &lpart, &hpart);
5827       hi = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
5828       hi = force_fit_type (hi, -1, overflow | TREE_OVERFLOW (prod),
5829                            TREE_CONSTANT_OVERFLOW (prod));
5830     }
5831   else if (tree_int_cst_sgn (arg01) >= 0)
5832     {
5833       tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
5834       switch (tree_int_cst_sgn (arg1))
5835         {
5836         case -1:
5837           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
5838           hi = prod;
5839           break;
5840
5841         case  0:
5842           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
5843           hi = tmp;
5844           break;
5845
5846         case  1:
5847           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
5848           lo = prod;
5849           break;
5850
5851         default:
5852           gcc_unreachable ();
5853         }
5854     }
5855   else
5856     {
5857       /* A negative divisor reverses the relational operators.  */
5858       code = swap_tree_comparison (code);
5859
5860       tmp = int_const_binop (PLUS_EXPR, arg01, integer_one_node, 0);
5861       switch (tree_int_cst_sgn (arg1))
5862         {
5863         case -1:
5864           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
5865           lo = prod;
5866           break;
5867
5868         case  0:
5869           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
5870           lo = tmp;
5871           break;
5872
5873         case  1:
5874           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
5875           hi = prod;
5876           break;
5877
5878         default:
5879           gcc_unreachable ();
5880         }
5881     }
5882
5883   switch (code)
5884     {
5885     case EQ_EXPR:
5886       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
5887         return omit_one_operand (type, integer_zero_node, arg00);
5888       if (TREE_OVERFLOW (hi))
5889         return fold_build2 (GE_EXPR, type, arg00, lo);
5890       if (TREE_OVERFLOW (lo))
5891         return fold_build2 (LE_EXPR, type, arg00, hi);
5892       return build_range_check (type, arg00, 1, lo, hi);
5893
5894     case NE_EXPR:
5895       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
5896         return omit_one_operand (type, integer_one_node, arg00);
5897       if (TREE_OVERFLOW (hi))
5898         return fold_build2 (LT_EXPR, type, arg00, lo);
5899       if (TREE_OVERFLOW (lo))
5900         return fold_build2 (GT_EXPR, type, arg00, hi);
5901       return build_range_check (type, arg00, 0, lo, hi);
5902
5903     case LT_EXPR:
5904       if (TREE_OVERFLOW (lo))
5905         return omit_one_operand (type, integer_zero_node, arg00);
5906       return fold_build2 (LT_EXPR, type, arg00, lo);
5907
5908     case LE_EXPR:
5909       if (TREE_OVERFLOW (hi))
5910         return omit_one_operand (type, integer_one_node, arg00);
5911       return fold_build2 (LE_EXPR, type, arg00, hi);
5912
5913     case GT_EXPR:
5914       if (TREE_OVERFLOW (hi))
5915         return omit_one_operand (type, integer_zero_node, arg00);
5916       return fold_build2 (GT_EXPR, type, arg00, hi);
5917
5918     case GE_EXPR:
5919       if (TREE_OVERFLOW (lo))
5920         return omit_one_operand (type, integer_one_node, arg00);
5921       return fold_build2 (GE_EXPR, type, arg00, lo);
5922
5923     default:
5924       break;
5925     }
5926
5927   return NULL_TREE;
5928 }
5929
5930
5931 /* If CODE with arguments ARG0 and ARG1 represents a single bit
5932    equality/inequality test, then return a simplified form of
5933    the test using shifts and logical operations.  Otherwise return
5934    NULL.  TYPE is the desired result type.  */
5935
5936 tree
5937 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
5938                       tree result_type)
5939 {
5940   /* If this is testing a single bit, we can optimize the test.  */
5941   if ((code == NE_EXPR || code == EQ_EXPR)
5942       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
5943       && integer_pow2p (TREE_OPERAND (arg0, 1)))
5944     {
5945       tree inner = TREE_OPERAND (arg0, 0);
5946       tree type = TREE_TYPE (arg0);
5947       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
5948       enum machine_mode operand_mode = TYPE_MODE (type);
5949       int ops_unsigned;
5950       tree signed_type, unsigned_type, intermediate_type;
5951       tree arg00;
5952
5953       /* If we have (A & C) != 0 where C is the sign bit of A, convert
5954          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
5955       arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
5956       if (arg00 != NULL_TREE
5957           /* This is only a win if casting to a signed type is cheap,
5958              i.e. when arg00's type is not a partial mode.  */
5959           && TYPE_PRECISION (TREE_TYPE (arg00))
5960              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
5961         {
5962           tree stype = lang_hooks.types.signed_type (TREE_TYPE (arg00));
5963           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
5964                               result_type, fold_convert (stype, arg00),
5965                               fold_convert (stype, integer_zero_node));
5966         }
5967
5968       /* Otherwise we have (A & C) != 0 where C is a single bit,
5969          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
5970          Similarly for (A & C) == 0.  */
5971
5972       /* If INNER is a right shift of a constant and it plus BITNUM does
5973          not overflow, adjust BITNUM and INNER.  */
5974       if (TREE_CODE (inner) == RSHIFT_EXPR
5975           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
5976           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
5977           && bitnum < TYPE_PRECISION (type)
5978           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
5979                                    bitnum - TYPE_PRECISION (type)))
5980         {
5981           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
5982           inner = TREE_OPERAND (inner, 0);
5983         }
5984
5985       /* If we are going to be able to omit the AND below, we must do our
5986          operations as unsigned.  If we must use the AND, we have a choice.
5987          Normally unsigned is faster, but for some machines signed is.  */
5988 #ifdef LOAD_EXTEND_OP
5989       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
5990                       && !flag_syntax_only) ? 0 : 1;
5991 #else
5992       ops_unsigned = 1;
5993 #endif
5994
5995       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
5996       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
5997       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
5998       inner = fold_convert (intermediate_type, inner);
5999
6000       if (bitnum != 0)
6001         inner = build2 (RSHIFT_EXPR, intermediate_type,
6002                         inner, size_int (bitnum));
6003
6004       if (code == EQ_EXPR)
6005         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type,
6006                              inner, integer_one_node);
6007
6008       /* Put the AND last so it can combine with more things.  */
6009       inner = build2 (BIT_AND_EXPR, intermediate_type,
6010                       inner, integer_one_node);
6011
6012       /* Make sure to return the proper type.  */
6013       inner = fold_convert (result_type, inner);
6014
6015       return inner;
6016     }
6017   return NULL_TREE;
6018 }
6019
6020 /* Check whether we are allowed to reorder operands arg0 and arg1,
6021    such that the evaluation of arg1 occurs before arg0.  */
6022
6023 static bool
6024 reorder_operands_p (tree arg0, tree arg1)
6025 {
6026   if (! flag_evaluation_order)
6027       return true;
6028   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6029     return true;
6030   return ! TREE_SIDE_EFFECTS (arg0)
6031          && ! TREE_SIDE_EFFECTS (arg1);
6032 }
6033
6034 /* Test whether it is preferable two swap two operands, ARG0 and
6035    ARG1, for example because ARG0 is an integer constant and ARG1
6036    isn't.  If REORDER is true, only recommend swapping if we can
6037    evaluate the operands in reverse order.  */
6038
6039 bool
6040 tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
6041 {
6042   STRIP_SIGN_NOPS (arg0);
6043   STRIP_SIGN_NOPS (arg1);
6044
6045   if (TREE_CODE (arg1) == INTEGER_CST)
6046     return 0;
6047   if (TREE_CODE (arg0) == INTEGER_CST)
6048     return 1;
6049
6050   if (TREE_CODE (arg1) == REAL_CST)
6051     return 0;
6052   if (TREE_CODE (arg0) == REAL_CST)
6053     return 1;
6054
6055   if (TREE_CODE (arg1) == COMPLEX_CST)
6056     return 0;
6057   if (TREE_CODE (arg0) == COMPLEX_CST)
6058     return 1;
6059
6060   if (TREE_CONSTANT (arg1))
6061     return 0;
6062   if (TREE_CONSTANT (arg0))
6063     return 1;
6064
6065   if (optimize_size)
6066     return 0;
6067
6068   if (reorder && flag_evaluation_order
6069       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6070     return 0;
6071
6072   if (DECL_P (arg1))
6073     return 0;
6074   if (DECL_P (arg0))
6075     return 1;
6076
6077   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6078      for commutative and comparison operators.  Ensuring a canonical
6079      form allows the optimizers to find additional redundancies without
6080      having to explicitly check for both orderings.  */
6081   if (TREE_CODE (arg0) == SSA_NAME
6082       && TREE_CODE (arg1) == SSA_NAME
6083       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6084     return 1;
6085
6086   return 0;
6087 }
6088
6089 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6090    ARG0 is extended to a wider type.  */
6091
6092 static tree
6093 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6094 {
6095   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6096   tree arg1_unw;
6097   tree shorter_type, outer_type;
6098   tree min, max;
6099   bool above, below;
6100
6101   if (arg0_unw == arg0)
6102     return NULL_TREE;
6103   shorter_type = TREE_TYPE (arg0_unw);
6104
6105 #ifdef HAVE_canonicalize_funcptr_for_compare
6106   /* Disable this optimization if we're casting a function pointer
6107      type on targets that require function pointer canonicalization.  */
6108   if (HAVE_canonicalize_funcptr_for_compare
6109       && TREE_CODE (shorter_type) == POINTER_TYPE
6110       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6111     return NULL_TREE;
6112 #endif
6113
6114   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6115     return NULL_TREE;
6116
6117   arg1_unw = get_unwidened (arg1, shorter_type);
6118   if (!arg1_unw)
6119     return NULL_TREE;
6120
6121   /* If possible, express the comparison in the shorter mode.  */
6122   if ((code == EQ_EXPR || code == NE_EXPR
6123        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6124       && (TREE_TYPE (arg1_unw) == shorter_type
6125           || (TREE_CODE (arg1_unw) == INTEGER_CST
6126               && TREE_CODE (shorter_type) == INTEGER_TYPE
6127               && int_fits_type_p (arg1_unw, shorter_type))))
6128     return fold_build2 (code, type, arg0_unw,
6129                        fold_convert (shorter_type, arg1_unw));
6130
6131   if (TREE_CODE (arg1_unw) != INTEGER_CST)
6132     return NULL_TREE;
6133
6134   /* If we are comparing with the integer that does not fit into the range
6135      of the shorter type, the result is known.  */
6136   outer_type = TREE_TYPE (arg1_unw);
6137   min = lower_bound_in_type (outer_type, shorter_type);
6138   max = upper_bound_in_type (outer_type, shorter_type);
6139
6140   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6141                                                    max, arg1_unw));
6142   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6143                                                    arg1_unw, min));
6144
6145   switch (code)
6146     {
6147     case EQ_EXPR:
6148       if (above || below)
6149         return omit_one_operand (type, integer_zero_node, arg0);
6150       break;
6151
6152     case NE_EXPR:
6153       if (above || below)
6154         return omit_one_operand (type, integer_one_node, arg0);
6155       break;
6156
6157     case LT_EXPR:
6158     case LE_EXPR:
6159       if (above)
6160         return omit_one_operand (type, integer_one_node, arg0);
6161       else if (below)
6162         return omit_one_operand (type, integer_zero_node, arg0);
6163
6164     case GT_EXPR:
6165     case GE_EXPR:
6166       if (above)
6167         return omit_one_operand (type, integer_zero_node, arg0);
6168       else if (below)
6169         return omit_one_operand (type, integer_one_node, arg0);
6170
6171     default:
6172       break;
6173     }
6174
6175   return NULL_TREE;
6176 }
6177
6178 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6179    ARG0 just the signedness is changed.  */
6180
6181 static tree
6182 fold_sign_changed_comparison (enum tree_code code, tree type,
6183                               tree arg0, tree arg1)
6184 {
6185   tree arg0_inner, tmp;
6186   tree inner_type, outer_type;
6187
6188   if (TREE_CODE (arg0) != NOP_EXPR
6189       && TREE_CODE (arg0) != CONVERT_EXPR)
6190     return NULL_TREE;
6191
6192   outer_type = TREE_TYPE (arg0);
6193   arg0_inner = TREE_OPERAND (arg0, 0);
6194   inner_type = TREE_TYPE (arg0_inner);
6195
6196 #ifdef HAVE_canonicalize_funcptr_for_compare
6197   /* Disable this optimization if we're casting a function pointer
6198      type on targets that require function pointer canonicalization.  */
6199   if (HAVE_canonicalize_funcptr_for_compare
6200       && TREE_CODE (inner_type) == POINTER_TYPE
6201       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6202     return NULL_TREE;
6203 #endif
6204
6205   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6206     return NULL_TREE;
6207
6208   if (TREE_CODE (arg1) != INTEGER_CST
6209       && !((TREE_CODE (arg1) == NOP_EXPR
6210             || TREE_CODE (arg1) == CONVERT_EXPR)
6211            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6212     return NULL_TREE;
6213
6214   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6215       && code != NE_EXPR
6216       && code != EQ_EXPR)
6217     return NULL_TREE;
6218
6219   if (TREE_CODE (arg1) == INTEGER_CST)
6220     {
6221       tmp = build_int_cst_wide (inner_type,
6222                                 TREE_INT_CST_LOW (arg1),
6223                                 TREE_INT_CST_HIGH (arg1));
6224       arg1 = force_fit_type (tmp, 0,
6225                              TREE_OVERFLOW (arg1),
6226                              TREE_CONSTANT_OVERFLOW (arg1));
6227     }
6228   else
6229     arg1 = fold_convert (inner_type, arg1);
6230
6231   return fold_build2 (code, type, arg0_inner, arg1);
6232 }
6233
6234 /* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6235    step of the array.  ADDR is the address. MULT is the multiplicative expression.
6236    If the function succeeds, the new address expression is returned.  Otherwise
6237    NULL_TREE is returned.  */
6238
6239 static tree
6240 try_move_mult_to_index (enum tree_code code, tree addr, tree mult)
6241 {
6242   tree s, delta, step;
6243   tree arg0 = TREE_OPERAND (mult, 0), arg1 = TREE_OPERAND (mult, 1);
6244   tree ref = TREE_OPERAND (addr, 0), pref;
6245   tree ret, pos;
6246   tree itype;
6247
6248   STRIP_NOPS (arg0);
6249   STRIP_NOPS (arg1);
6250   
6251   if (TREE_CODE (arg0) == INTEGER_CST)
6252     {
6253       s = arg0;
6254       delta = arg1;
6255     }
6256   else if (TREE_CODE (arg1) == INTEGER_CST)
6257     {
6258       s = arg1;
6259       delta = arg0;
6260     }
6261   else
6262     return NULL_TREE;
6263
6264   for (;; ref = TREE_OPERAND (ref, 0))
6265     {
6266       if (TREE_CODE (ref) == ARRAY_REF)
6267         {
6268           step = array_ref_element_size (ref);
6269
6270           if (TREE_CODE (step) != INTEGER_CST)
6271             continue;
6272
6273           itype = TREE_TYPE (step);
6274
6275           /* If the type sizes do not match, we might run into problems
6276              when one of them would overflow.  */
6277           if (TYPE_PRECISION (itype) != TYPE_PRECISION (TREE_TYPE (s)))
6278             continue;
6279
6280           if (!operand_equal_p (step, fold_convert (itype, s), 0))
6281             continue;
6282
6283           delta = fold_convert (itype, delta);
6284           break;
6285         }
6286
6287       if (!handled_component_p (ref))
6288         return NULL_TREE;
6289     }
6290
6291   /* We found the suitable array reference.  So copy everything up to it,
6292      and replace the index.  */
6293
6294   pref = TREE_OPERAND (addr, 0);
6295   ret = copy_node (pref);
6296   pos = ret;
6297
6298   while (pref != ref)
6299     {
6300       pref = TREE_OPERAND (pref, 0);
6301       TREE_OPERAND (pos, 0) = copy_node (pref);
6302       pos = TREE_OPERAND (pos, 0);
6303     }
6304
6305   TREE_OPERAND (pos, 1) = fold_build2 (code, itype,
6306                                        TREE_OPERAND (pos, 1),
6307                                        delta);
6308
6309   return build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6310 }
6311
6312
6313 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6314    means A >= Y && A != MAX, but in this case we know that
6315    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6316
6317 static tree
6318 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6319 {
6320   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6321
6322   if (TREE_CODE (bound) == LT_EXPR)
6323     a = TREE_OPERAND (bound, 0);
6324   else if (TREE_CODE (bound) == GT_EXPR)
6325     a = TREE_OPERAND (bound, 1);
6326   else
6327     return NULL_TREE;
6328
6329   typea = TREE_TYPE (a);
6330   if (!INTEGRAL_TYPE_P (typea)
6331       && !POINTER_TYPE_P (typea))
6332     return NULL_TREE;
6333
6334   if (TREE_CODE (ineq) == LT_EXPR)
6335     {
6336       a1 = TREE_OPERAND (ineq, 1);
6337       y = TREE_OPERAND (ineq, 0);
6338     }
6339   else if (TREE_CODE (ineq) == GT_EXPR)
6340     {
6341       a1 = TREE_OPERAND (ineq, 0);
6342       y = TREE_OPERAND (ineq, 1);
6343     }
6344   else
6345     return NULL_TREE;
6346
6347   if (TREE_TYPE (a1) != typea)
6348     return NULL_TREE;
6349
6350   diff = fold_build2 (MINUS_EXPR, typea, a1, a);
6351   if (!integer_onep (diff))
6352     return NULL_TREE;
6353
6354   return fold_build2 (GE_EXPR, type, a, y);
6355 }
6356
6357 /* Fold complex addition when both components are accessible by parts.
6358    Return non-null if successful.  CODE should be PLUS_EXPR for addition,
6359    or MINUS_EXPR for subtraction.  */
6360
6361 static tree
6362 fold_complex_add (tree type, tree ac, tree bc, enum tree_code code)
6363 {
6364   tree ar, ai, br, bi, rr, ri, inner_type;
6365
6366   if (TREE_CODE (ac) == COMPLEX_EXPR)
6367     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6368   else if (TREE_CODE (ac) == COMPLEX_CST)
6369     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6370   else
6371     return NULL;
6372
6373   if (TREE_CODE (bc) == COMPLEX_EXPR)
6374     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6375   else if (TREE_CODE (bc) == COMPLEX_CST)
6376     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6377   else
6378     return NULL;
6379
6380   inner_type = TREE_TYPE (type);
6381
6382   rr = fold_build2 (code, inner_type, ar, br); 
6383   ri = fold_build2 (code, inner_type, ai, bi); 
6384
6385   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6386 }
6387
6388 /* Perform some simplifications of complex multiplication when one or more
6389    of the components are constants or zeros.  Return non-null if successful.  */
6390
6391 tree
6392 fold_complex_mult_parts (tree type, tree ar, tree ai, tree br, tree bi)
6393 {
6394   tree rr, ri, inner_type, zero;
6395   bool ar0, ai0, br0, bi0, bi1;
6396
6397   inner_type = TREE_TYPE (type);
6398   zero = NULL;
6399
6400   if (SCALAR_FLOAT_TYPE_P (inner_type))
6401     {
6402       ar0 = ai0 = br0 = bi0 = bi1 = false;
6403
6404       /* We're only interested in +0.0 here, thus we don't use real_zerop.  */
6405
6406       if (TREE_CODE (ar) == REAL_CST
6407           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ar), dconst0))
6408         ar0 = true, zero = ar;
6409
6410       if (TREE_CODE (ai) == REAL_CST
6411           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst0))
6412         ai0 = true, zero = ai;
6413
6414       if (TREE_CODE (br) == REAL_CST
6415           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (br), dconst0))
6416         br0 = true, zero = br;
6417
6418       if (TREE_CODE (bi) == REAL_CST)
6419         {
6420           if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst0))
6421             bi0 = true, zero = bi;
6422           else if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst1))
6423             bi1 = true;
6424         }
6425     }
6426   else
6427     {
6428       ar0 = integer_zerop (ar);
6429       if (ar0)
6430         zero = ar;
6431       ai0 = integer_zerop (ai);
6432       if (ai0)
6433         zero = ai;
6434       br0 = integer_zerop (br);
6435       if (br0)
6436         zero = br;
6437       bi0 = integer_zerop (bi);
6438       if (bi0)
6439         {
6440           zero = bi;
6441           bi1 = false;
6442         }
6443       else
6444         bi1 = integer_onep (bi);
6445     }
6446
6447   /* We won't optimize anything below unless something is zero.  */
6448   if (zero == NULL)
6449     return NULL;
6450
6451   if (ai0 && br0 && bi1)
6452     {
6453       rr = zero;
6454       ri = ar;
6455     }
6456   else if (ai0 && bi0)
6457     {
6458       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6459       ri = zero;
6460     }
6461   else if (ai0 && br0)
6462     {
6463       rr = zero;
6464       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6465     }
6466   else if (ar0 && bi0)
6467     {
6468       rr = zero;
6469       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6470     }
6471   else if (ar0 && br0)
6472     {
6473       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6474       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6475       ri = zero;
6476     }
6477   else if (bi0)
6478     {
6479       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6480       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6481     }
6482   else if (ai0)
6483     {
6484       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6485       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6486     }
6487   else if (br0)
6488     {
6489       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6490       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6491       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6492     }
6493   else if (ar0)
6494     {
6495       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6496       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6497       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6498     }
6499   else
6500     return NULL;
6501
6502   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6503 }
6504
6505 static tree
6506 fold_complex_mult (tree type, tree ac, tree bc)
6507 {
6508   tree ar, ai, br, bi;
6509
6510   if (TREE_CODE (ac) == COMPLEX_EXPR)
6511     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6512   else if (TREE_CODE (ac) == COMPLEX_CST)
6513     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6514   else
6515     return NULL;
6516
6517   if (TREE_CODE (bc) == COMPLEX_EXPR)
6518     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6519   else if (TREE_CODE (bc) == COMPLEX_CST)
6520     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6521   else
6522     return NULL;
6523
6524   return fold_complex_mult_parts (type, ar, ai, br, bi);
6525 }
6526
6527 /* Perform some simplifications of complex division when one or more of
6528    the components are constants or zeros.  Return non-null if successful.  */
6529
6530 tree
6531 fold_complex_div_parts (tree type, tree ar, tree ai, tree br, tree bi,
6532                         enum tree_code code)
6533 {
6534   tree rr, ri, inner_type, zero;
6535   bool ar0, ai0, br0, bi0, bi1;
6536
6537   inner_type = TREE_TYPE (type);
6538   zero = NULL;
6539
6540   if (SCALAR_FLOAT_TYPE_P (inner_type))
6541     {
6542       ar0 = ai0 = br0 = bi0 = bi1 = false;
6543
6544       /* We're only interested in +0.0 here, thus we don't use real_zerop.  */
6545
6546       if (TREE_CODE (ar) == REAL_CST
6547           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ar), dconst0))
6548         ar0 = true, zero = ar;
6549
6550       if (TREE_CODE (ai) == REAL_CST
6551           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst0))
6552         ai0 = true, zero = ai;
6553
6554       if (TREE_CODE (br) == REAL_CST
6555           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (br), dconst0))
6556         br0 = true, zero = br;
6557
6558       if (TREE_CODE (bi) == REAL_CST)
6559         {
6560           if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst0))
6561             bi0 = true, zero = bi;
6562           else if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst1))
6563             bi1 = true;
6564         }
6565     }
6566   else
6567     {
6568       ar0 = integer_zerop (ar);
6569       if (ar0)
6570         zero = ar;
6571       ai0 = integer_zerop (ai);
6572       if (ai0)
6573         zero = ai;
6574       br0 = integer_zerop (br);
6575       if (br0)
6576         zero = br;
6577       bi0 = integer_zerop (bi);
6578       if (bi0)
6579         {
6580           zero = bi;
6581           bi1 = false;
6582         }
6583       else
6584         bi1 = integer_onep (bi);
6585     }
6586
6587   /* We won't optimize anything below unless something is zero.  */
6588   if (zero == NULL)
6589     return NULL;
6590
6591   if (ai0 && bi0)
6592     {
6593       rr = fold_build2 (code, inner_type, ar, br);
6594       ri = zero;
6595     }
6596   else if (ai0 && br0)
6597     {
6598       rr = zero;
6599       ri = fold_build2 (code, inner_type, ar, bi);
6600       ri = fold_build1 (NEGATE_EXPR, inner_type, ri);
6601     }
6602   else if (ar0 && bi0)
6603     {
6604       rr = zero;
6605       ri = fold_build2 (code, inner_type, ai, br);
6606     }
6607   else if (ar0 && br0)
6608     {
6609       rr = fold_build2 (code, inner_type, ai, bi);
6610       ri = zero;
6611     }
6612   else if (bi0)
6613     {
6614       rr = fold_build2 (code, inner_type, ar, br);
6615       ri = fold_build2 (code, inner_type, ai, br);
6616     }
6617   else if (br0)
6618     {
6619       rr = fold_build2 (code, inner_type, ai, bi);
6620       ri = fold_build2 (code, inner_type, ar, bi);
6621       ri = fold_build1 (NEGATE_EXPR, inner_type, ri);
6622     }
6623   else
6624     return NULL;
6625
6626   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6627 }
6628
6629 static tree
6630 fold_complex_div (tree type, tree ac, tree bc, enum tree_code code)
6631 {
6632   tree ar, ai, br, bi;
6633
6634   if (TREE_CODE (ac) == COMPLEX_EXPR)
6635     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6636   else if (TREE_CODE (ac) == COMPLEX_CST)
6637     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6638   else
6639     return NULL;
6640
6641   if (TREE_CODE (bc) == COMPLEX_EXPR)
6642     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6643   else if (TREE_CODE (bc) == COMPLEX_CST)
6644     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6645   else
6646     return NULL;
6647
6648   return fold_complex_div_parts (type, ar, ai, br, bi, code);
6649 }
6650
6651 /* Fold a unary expression of code CODE and type TYPE with operand
6652    OP0.  Return the folded expression if folding is successful.
6653    Otherwise, return NULL_TREE.  */
6654
6655 static tree
6656 fold_unary (enum tree_code code, tree type, tree op0)
6657 {
6658   tree tem;
6659   tree arg0;
6660   enum tree_code_class kind = TREE_CODE_CLASS (code);
6661
6662   gcc_assert (IS_EXPR_CODE_CLASS (kind)
6663               && TREE_CODE_LENGTH (code) == 1);
6664
6665   arg0 = op0;
6666   if (arg0)
6667     {
6668       if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
6669         {
6670           /* Don't use STRIP_NOPS, because signedness of argument type matters.  */
6671           STRIP_SIGN_NOPS (arg0);
6672         }
6673       else
6674         {
6675           /* Strip any conversions that don't change the mode.  This
6676              is safe for every expression, except for a comparison
6677              expression because its signedness is derived from its
6678              operands.
6679
6680              Note that this is done as an internal manipulation within
6681              the constant folder, in order to find the simplest
6682              representation of the arguments so that their form can be
6683              studied.  In any cases, the appropriate type conversions
6684              should be put back in the tree that will get out of the
6685              constant folder.  */
6686           STRIP_NOPS (arg0);
6687         }
6688     }
6689
6690   if (TREE_CODE_CLASS (code) == tcc_unary)
6691     {
6692       if (TREE_CODE (arg0) == COMPOUND_EXPR)
6693         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
6694                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
6695       else if (TREE_CODE (arg0) == COND_EXPR)
6696         {
6697           tree arg01 = TREE_OPERAND (arg0, 1);
6698           tree arg02 = TREE_OPERAND (arg0, 2);
6699           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
6700             arg01 = fold_build1 (code, type, arg01);
6701           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
6702             arg02 = fold_build1 (code, type, arg02);
6703           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
6704                              arg01, arg02);
6705
6706           /* If this was a conversion, and all we did was to move into
6707              inside the COND_EXPR, bring it back out.  But leave it if
6708              it is a conversion from integer to integer and the
6709              result precision is no wider than a word since such a
6710              conversion is cheap and may be optimized away by combine,
6711              while it couldn't if it were outside the COND_EXPR.  Then return
6712              so we don't get into an infinite recursion loop taking the
6713              conversion out and then back in.  */
6714
6715           if ((code == NOP_EXPR || code == CONVERT_EXPR
6716                || code == NON_LVALUE_EXPR)
6717               && TREE_CODE (tem) == COND_EXPR
6718               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
6719               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
6720               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
6721               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
6722               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
6723                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
6724               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
6725                      && (INTEGRAL_TYPE_P
6726                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
6727                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
6728                   || flag_syntax_only))
6729             tem = build1 (code, type,
6730                           build3 (COND_EXPR,
6731                                   TREE_TYPE (TREE_OPERAND
6732                                              (TREE_OPERAND (tem, 1), 0)),
6733                                   TREE_OPERAND (tem, 0),
6734                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
6735                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
6736           return tem;
6737         }
6738       else if (COMPARISON_CLASS_P (arg0))
6739         {
6740           if (TREE_CODE (type) == BOOLEAN_TYPE)
6741             {
6742               arg0 = copy_node (arg0);
6743               TREE_TYPE (arg0) = type;
6744               return arg0;
6745             }
6746           else if (TREE_CODE (type) != INTEGER_TYPE)
6747             return fold_build3 (COND_EXPR, type, arg0,
6748                                 fold_build1 (code, type,
6749                                              integer_one_node),
6750                                 fold_build1 (code, type,
6751                                              integer_zero_node));
6752         }
6753    }
6754
6755   switch (code)
6756     {
6757     case NOP_EXPR:
6758     case FLOAT_EXPR:
6759     case CONVERT_EXPR:
6760     case FIX_TRUNC_EXPR:
6761     case FIX_CEIL_EXPR:
6762     case FIX_FLOOR_EXPR:
6763     case FIX_ROUND_EXPR:
6764       if (TREE_TYPE (op0) == type)
6765         return op0;
6766
6767       /* Handle cases of two conversions in a row.  */
6768       if (TREE_CODE (op0) == NOP_EXPR
6769           || TREE_CODE (op0) == CONVERT_EXPR)
6770         {
6771           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
6772           tree inter_type = TREE_TYPE (op0);
6773           int inside_int = INTEGRAL_TYPE_P (inside_type);
6774           int inside_ptr = POINTER_TYPE_P (inside_type);
6775           int inside_float = FLOAT_TYPE_P (inside_type);
6776           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
6777           unsigned int inside_prec = TYPE_PRECISION (inside_type);
6778           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
6779           int inter_int = INTEGRAL_TYPE_P (inter_type);
6780           int inter_ptr = POINTER_TYPE_P (inter_type);
6781           int inter_float = FLOAT_TYPE_P (inter_type);
6782           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
6783           unsigned int inter_prec = TYPE_PRECISION (inter_type);
6784           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
6785           int final_int = INTEGRAL_TYPE_P (type);
6786           int final_ptr = POINTER_TYPE_P (type);
6787           int final_float = FLOAT_TYPE_P (type);
6788           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
6789           unsigned int final_prec = TYPE_PRECISION (type);
6790           int final_unsignedp = TYPE_UNSIGNED (type);
6791
6792           /* In addition to the cases of two conversions in a row
6793              handled below, if we are converting something to its own
6794              type via an object of identical or wider precision, neither
6795              conversion is needed.  */
6796           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
6797               && ((inter_int && final_int) || (inter_float && final_float))
6798               && inter_prec >= final_prec)
6799             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6800
6801           /* Likewise, if the intermediate and final types are either both
6802              float or both integer, we don't need the middle conversion if
6803              it is wider than the final type and doesn't change the signedness
6804              (for integers).  Avoid this if the final type is a pointer
6805              since then we sometimes need the inner conversion.  Likewise if
6806              the outer has a precision not equal to the size of its mode.  */
6807           if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
6808                || (inter_float && inside_float)
6809                || (inter_vec && inside_vec))
6810               && inter_prec >= inside_prec
6811               && (inter_float || inter_vec
6812                   || inter_unsignedp == inside_unsignedp)
6813               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6814                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
6815               && ! final_ptr
6816               && (! final_vec || inter_prec == inside_prec))
6817             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6818
6819           /* If we have a sign-extension of a zero-extended value, we can
6820              replace that by a single zero-extension.  */
6821           if (inside_int && inter_int && final_int
6822               && inside_prec < inter_prec && inter_prec < final_prec
6823               && inside_unsignedp && !inter_unsignedp)
6824             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6825
6826           /* Two conversions in a row are not needed unless:
6827              - some conversion is floating-point (overstrict for now), or
6828              - some conversion is a vector (overstrict for now), or
6829              - the intermediate type is narrower than both initial and
6830                final, or
6831              - the intermediate type and innermost type differ in signedness,
6832                and the outermost type is wider than the intermediate, or
6833              - the initial type is a pointer type and the precisions of the
6834                intermediate and final types differ, or
6835              - the final type is a pointer type and the precisions of the
6836                initial and intermediate types differ.  */
6837           if (! inside_float && ! inter_float && ! final_float
6838               && ! inside_vec && ! inter_vec && ! final_vec
6839               && (inter_prec > inside_prec || inter_prec > final_prec)
6840               && ! (inside_int && inter_int
6841                     && inter_unsignedp != inside_unsignedp
6842                     && inter_prec < final_prec)
6843               && ((inter_unsignedp && inter_prec > inside_prec)
6844                   == (final_unsignedp && final_prec > inter_prec))
6845               && ! (inside_ptr && inter_prec != final_prec)
6846               && ! (final_ptr && inside_prec != inter_prec)
6847               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6848                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
6849               && ! final_ptr)
6850             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6851         }
6852
6853       if (TREE_CODE (op0) == MODIFY_EXPR
6854           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
6855           /* Detect assigning a bitfield.  */
6856           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
6857                && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
6858         {
6859           /* Don't leave an assignment inside a conversion
6860              unless assigning a bitfield.  */
6861           tem = fold_build1 (code, type, TREE_OPERAND (op0, 1));
6862           /* First do the assignment, then return converted constant.  */
6863           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
6864           TREE_NO_WARNING (tem) = 1;
6865           TREE_USED (tem) = 1;
6866           return tem;
6867         }
6868
6869       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
6870          constants (if x has signed type, the sign bit cannot be set
6871          in c).  This folds extension into the BIT_AND_EXPR.  */
6872       if (INTEGRAL_TYPE_P (type)
6873           && TREE_CODE (type) != BOOLEAN_TYPE
6874           && TREE_CODE (op0) == BIT_AND_EXPR
6875           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
6876         {
6877           tree and = op0;
6878           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
6879           int change = 0;
6880
6881           if (TYPE_UNSIGNED (TREE_TYPE (and))
6882               || (TYPE_PRECISION (type)
6883                   <= TYPE_PRECISION (TREE_TYPE (and))))
6884             change = 1;
6885           else if (TYPE_PRECISION (TREE_TYPE (and1))
6886                    <= HOST_BITS_PER_WIDE_INT
6887                    && host_integerp (and1, 1))
6888             {
6889               unsigned HOST_WIDE_INT cst;
6890
6891               cst = tree_low_cst (and1, 1);
6892               cst &= (HOST_WIDE_INT) -1
6893                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
6894               change = (cst == 0);
6895 #ifdef LOAD_EXTEND_OP
6896               if (change
6897                   && !flag_syntax_only
6898                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
6899                       == ZERO_EXTEND))
6900                 {
6901                   tree uns = lang_hooks.types.unsigned_type (TREE_TYPE (and0));
6902                   and0 = fold_convert (uns, and0);
6903                   and1 = fold_convert (uns, and1);
6904                 }
6905 #endif
6906             }
6907           if (change)
6908             {
6909               tem = build_int_cst_wide (type, TREE_INT_CST_LOW (and1),
6910                                         TREE_INT_CST_HIGH (and1));
6911               tem = force_fit_type (tem, 0, TREE_OVERFLOW (and1),
6912                                     TREE_CONSTANT_OVERFLOW (and1));
6913               return fold_build2 (BIT_AND_EXPR, type,
6914                                   fold_convert (type, and0), tem);
6915             }
6916         }
6917
6918       /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
6919          T2 being pointers to types of the same size.  */
6920       if (POINTER_TYPE_P (type)
6921           && BINARY_CLASS_P (arg0)
6922           && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
6923           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
6924         {
6925           tree arg00 = TREE_OPERAND (arg0, 0);
6926           tree t0 = type;
6927           tree t1 = TREE_TYPE (arg00);
6928           tree tt0 = TREE_TYPE (t0);
6929           tree tt1 = TREE_TYPE (t1);
6930           tree s0 = TYPE_SIZE (tt0);
6931           tree s1 = TYPE_SIZE (tt1);
6932
6933           if (s0 && s1 && operand_equal_p (s0, s1, OEP_ONLY_CONST))
6934             return build2 (TREE_CODE (arg0), t0, fold_convert (t0, arg00),
6935                            TREE_OPERAND (arg0, 1));
6936         }
6937
6938       tem = fold_convert_const (code, type, arg0);
6939       return tem ? tem : NULL_TREE;
6940
6941     case VIEW_CONVERT_EXPR:
6942       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
6943         return build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
6944       return NULL_TREE;
6945
6946     case NEGATE_EXPR:
6947       if (negate_expr_p (arg0))
6948         return fold_convert (type, negate_expr (arg0));
6949       /* Convert - (~A) to A + 1.  */
6950       if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == BIT_NOT_EXPR)
6951         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (arg0, 0),
6952                             build_int_cst (type, 1));
6953       return NULL_TREE;
6954
6955     case ABS_EXPR:
6956       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
6957         return fold_abs_const (arg0, type);
6958       else if (TREE_CODE (arg0) == NEGATE_EXPR)
6959         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
6960       /* Convert fabs((double)float) into (double)fabsf(float).  */
6961       else if (TREE_CODE (arg0) == NOP_EXPR
6962                && TREE_CODE (type) == REAL_TYPE)
6963         {
6964           tree targ0 = strip_float_extensions (arg0);
6965           if (targ0 != arg0)
6966             return fold_convert (type, fold_build1 (ABS_EXPR,
6967                                                     TREE_TYPE (targ0),
6968                                                     targ0));
6969         }
6970       else if (tree_expr_nonnegative_p (arg0))
6971         return arg0;
6972
6973       /* Strip sign ops from argument.  */
6974       if (TREE_CODE (type) == REAL_TYPE)
6975         {
6976           tem = fold_strip_sign_ops (arg0);
6977           if (tem)
6978             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
6979         }
6980       return NULL_TREE;
6981
6982     case CONJ_EXPR:
6983       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
6984         return fold_convert (type, arg0);
6985       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
6986         return build2 (COMPLEX_EXPR, type,
6987                        TREE_OPERAND (arg0, 0),
6988                        negate_expr (TREE_OPERAND (arg0, 1)));
6989       else if (TREE_CODE (arg0) == COMPLEX_CST)
6990         return build_complex (type, TREE_REALPART (arg0),
6991                               negate_expr (TREE_IMAGPART (arg0)));
6992       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
6993         return fold_build2 (TREE_CODE (arg0), type,
6994                             fold_build1 (CONJ_EXPR, type,
6995                                          TREE_OPERAND (arg0, 0)),
6996                             fold_build1 (CONJ_EXPR, type,
6997                                          TREE_OPERAND (arg0, 1)));
6998       else if (TREE_CODE (arg0) == CONJ_EXPR)
6999         return TREE_OPERAND (arg0, 0);
7000       return NULL_TREE;
7001
7002     case BIT_NOT_EXPR:
7003       if (TREE_CODE (arg0) == INTEGER_CST)
7004         return fold_not_const (arg0, type);
7005       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7006         return TREE_OPERAND (arg0, 0);
7007       /* Convert ~ (-A) to A - 1.  */
7008       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7009         return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7010                             build_int_cst (type, 1));
7011       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
7012       else if (INTEGRAL_TYPE_P (type)
7013                && ((TREE_CODE (arg0) == MINUS_EXPR
7014                     && integer_onep (TREE_OPERAND (arg0, 1)))
7015                    || (TREE_CODE (arg0) == PLUS_EXPR
7016                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7017         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7018       return NULL_TREE;
7019
7020     case TRUTH_NOT_EXPR:
7021       /* The argument to invert_truthvalue must have Boolean type.  */
7022       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7023           arg0 = fold_convert (boolean_type_node, arg0);
7024
7025       /* Note that the operand of this must be an int
7026          and its values must be 0 or 1.
7027          ("true" is a fixed value perhaps depending on the language,
7028          but we don't handle values other than 1 correctly yet.)  */
7029       tem = invert_truthvalue (arg0);
7030       /* Avoid infinite recursion.  */
7031       if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
7032         return NULL_TREE;
7033       return fold_convert (type, tem);
7034
7035     case REALPART_EXPR:
7036       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7037         return NULL_TREE;
7038       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
7039         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7040                                  TREE_OPERAND (arg0, 1));
7041       else if (TREE_CODE (arg0) == COMPLEX_CST)
7042         return TREE_REALPART (arg0);
7043       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7044         return fold_build2 (TREE_CODE (arg0), type,
7045                             fold_build1 (REALPART_EXPR, type,
7046                                          TREE_OPERAND (arg0, 0)),
7047                             fold_build1 (REALPART_EXPR, type,
7048                                          TREE_OPERAND (arg0, 1)));
7049       return NULL_TREE;
7050
7051     case IMAGPART_EXPR:
7052       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7053         return fold_convert (type, integer_zero_node);
7054       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
7055         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
7056                                  TREE_OPERAND (arg0, 0));
7057       else if (TREE_CODE (arg0) == COMPLEX_CST)
7058         return TREE_IMAGPART (arg0);
7059       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7060         return fold_build2 (TREE_CODE (arg0), type,
7061                             fold_build1 (IMAGPART_EXPR, type,
7062                                          TREE_OPERAND (arg0, 0)),
7063                             fold_build1 (IMAGPART_EXPR, type,
7064                                          TREE_OPERAND (arg0, 1)));
7065       return NULL_TREE;
7066
7067     default:
7068       return NULL_TREE;
7069     } /* switch (code) */
7070 }
7071
7072 /* Fold a binary expression of code CODE and type TYPE with operands
7073    OP0 and OP1.  Return the folded expression if folding is
7074    successful.  Otherwise, return NULL_TREE.  */
7075
7076 static tree
7077 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
7078 {
7079   tree t1 = NULL_TREE;
7080   tree tem;
7081   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
7082   enum tree_code_class kind = TREE_CODE_CLASS (code);
7083
7084   /* WINS will be nonzero when the switch is done
7085      if all operands are constant.  */
7086   int wins = 1;
7087
7088   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7089               && TREE_CODE_LENGTH (code) == 2);
7090
7091   arg0 = op0;
7092   arg1 = op1;
7093
7094   if (arg0)
7095     {
7096       tree subop;
7097
7098       /* Strip any conversions that don't change the mode.  This is
7099          safe for every expression, except for a comparison expression
7100          because its signedness is derived from its operands.  So, in
7101          the latter case, only strip conversions that don't change the
7102          signedness.
7103
7104          Note that this is done as an internal manipulation within the
7105          constant folder, in order to find the simplest representation
7106          of the arguments so that their form can be studied.  In any
7107          cases, the appropriate type conversions should be put back in
7108          the tree that will get out of the constant folder.  */
7109       if (kind == tcc_comparison)
7110         STRIP_SIGN_NOPS (arg0);
7111       else
7112         STRIP_NOPS (arg0);
7113
7114       if (TREE_CODE (arg0) == COMPLEX_CST)
7115         subop = TREE_REALPART (arg0);
7116       else
7117         subop = arg0;
7118
7119       if (TREE_CODE (subop) != INTEGER_CST
7120           && TREE_CODE (subop) != REAL_CST)
7121         /* Note that TREE_CONSTANT isn't enough:
7122            static var addresses are constant but we can't
7123            do arithmetic on them.  */
7124         wins = 0;
7125     }
7126
7127   if (arg1)
7128     {
7129       tree subop;
7130
7131       /* Strip any conversions that don't change the mode.  This is
7132          safe for every expression, except for a comparison expression
7133          because its signedness is derived from its operands.  So, in
7134          the latter case, only strip conversions that don't change the
7135          signedness.
7136
7137          Note that this is done as an internal manipulation within the
7138          constant folder, in order to find the simplest representation
7139          of the arguments so that their form can be studied.  In any
7140          cases, the appropriate type conversions should be put back in
7141          the tree that will get out of the constant folder.  */
7142       if (kind == tcc_comparison)
7143         STRIP_SIGN_NOPS (arg1);
7144       else
7145         STRIP_NOPS (arg1);
7146
7147       if (TREE_CODE (arg1) == COMPLEX_CST)
7148         subop = TREE_REALPART (arg1);
7149       else
7150         subop = arg1;
7151
7152       if (TREE_CODE (subop) != INTEGER_CST
7153           && TREE_CODE (subop) != REAL_CST)
7154         /* Note that TREE_CONSTANT isn't enough:
7155            static var addresses are constant but we can't
7156            do arithmetic on them.  */
7157         wins = 0;
7158     }
7159
7160   /* If this is a commutative operation, and ARG0 is a constant, move it
7161      to ARG1 to reduce the number of tests below.  */
7162   if (commutative_tree_code (code)
7163       && tree_swap_operands_p (arg0, arg1, true))
7164     return fold_build2 (code, type, op1, op0);
7165
7166   /* Now WINS is set as described above,
7167      ARG0 is the first operand of EXPR,
7168      and ARG1 is the second operand (if it has more than one operand).
7169
7170      First check for cases where an arithmetic operation is applied to a
7171      compound, conditional, or comparison operation.  Push the arithmetic
7172      operation inside the compound or conditional to see if any folding
7173      can then be done.  Convert comparison to conditional for this purpose.
7174      The also optimizes non-constant cases that used to be done in
7175      expand_expr.
7176
7177      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
7178      one of the operands is a comparison and the other is a comparison, a
7179      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
7180      code below would make the expression more complex.  Change it to a
7181      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
7182      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
7183
7184   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
7185        || code == EQ_EXPR || code == NE_EXPR)
7186       && ((truth_value_p (TREE_CODE (arg0))
7187            && (truth_value_p (TREE_CODE (arg1))
7188                || (TREE_CODE (arg1) == BIT_AND_EXPR
7189                    && integer_onep (TREE_OPERAND (arg1, 1)))))
7190           || (truth_value_p (TREE_CODE (arg1))
7191               && (truth_value_p (TREE_CODE (arg0))
7192                   || (TREE_CODE (arg0) == BIT_AND_EXPR
7193                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
7194     {
7195       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
7196                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
7197                          : TRUTH_XOR_EXPR,
7198                          boolean_type_node,
7199                          fold_convert (boolean_type_node, arg0),
7200                          fold_convert (boolean_type_node, arg1));
7201
7202       if (code == EQ_EXPR)
7203         tem = invert_truthvalue (tem);
7204
7205       return fold_convert (type, tem);
7206     }
7207
7208   if (TREE_CODE_CLASS (code) == tcc_comparison
7209            && TREE_CODE (arg0) == COMPOUND_EXPR)
7210     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7211                    fold_build2 (code, type, TREE_OPERAND (arg0, 1), arg1));
7212   else if (TREE_CODE_CLASS (code) == tcc_comparison
7213            && TREE_CODE (arg1) == COMPOUND_EXPR)
7214     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
7215                    fold_build2 (code, type, arg0, TREE_OPERAND (arg1, 1)));
7216   else if (TREE_CODE_CLASS (code) == tcc_binary
7217            || TREE_CODE_CLASS (code) == tcc_comparison)
7218     {
7219       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7220         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7221                        fold_build2 (code, type, TREE_OPERAND (arg0, 1),
7222                                     arg1));
7223       if (TREE_CODE (arg1) == COMPOUND_EXPR
7224           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
7225         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
7226                        fold_build2 (code, type,
7227                                     arg0, TREE_OPERAND (arg1, 1)));
7228
7229       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
7230         {
7231           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
7232                                                      arg0, arg1, 
7233                                                      /*cond_first_p=*/1);
7234           if (tem != NULL_TREE)
7235             return tem;
7236         }
7237
7238       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
7239         {
7240           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
7241                                                      arg1, arg0, 
7242                                                      /*cond_first_p=*/0);
7243           if (tem != NULL_TREE)
7244             return tem;
7245         }
7246     }
7247
7248   switch (code)
7249     {
7250     case PLUS_EXPR:
7251       /* A + (-B) -> A - B */
7252       if (TREE_CODE (arg1) == NEGATE_EXPR)
7253         return fold_build2 (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
7254       /* (-A) + B -> B - A */
7255       if (TREE_CODE (arg0) == NEGATE_EXPR
7256           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
7257         return fold_build2 (MINUS_EXPR, type, arg1, TREE_OPERAND (arg0, 0));
7258       /* Convert ~A + 1 to -A.  */
7259       if (INTEGRAL_TYPE_P (type)
7260           && TREE_CODE (arg0) == BIT_NOT_EXPR
7261           && integer_onep (arg1))
7262         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7263
7264       if (TREE_CODE (type) == COMPLEX_TYPE)
7265         {
7266           tem = fold_complex_add (type, arg0, arg1, PLUS_EXPR);
7267           if (tem)
7268             return tem;
7269         }
7270
7271       if (! FLOAT_TYPE_P (type))
7272         {
7273           if (integer_zerop (arg1))
7274             return non_lvalue (fold_convert (type, arg0));
7275
7276           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
7277              with a constant, and the two constants have no bits in common,
7278              we should treat this as a BIT_IOR_EXPR since this may produce more
7279              simplifications.  */
7280           if (TREE_CODE (arg0) == BIT_AND_EXPR
7281               && TREE_CODE (arg1) == BIT_AND_EXPR
7282               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7283               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
7284               && integer_zerop (const_binop (BIT_AND_EXPR,
7285                                              TREE_OPERAND (arg0, 1),
7286                                              TREE_OPERAND (arg1, 1), 0)))
7287             {
7288               code = BIT_IOR_EXPR;
7289               goto bit_ior;
7290             }
7291
7292           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
7293              (plus (plus (mult) (mult)) (foo)) so that we can
7294              take advantage of the factoring cases below.  */
7295           if (((TREE_CODE (arg0) == PLUS_EXPR
7296                 || TREE_CODE (arg0) == MINUS_EXPR)
7297                && TREE_CODE (arg1) == MULT_EXPR)
7298               || ((TREE_CODE (arg1) == PLUS_EXPR
7299                    || TREE_CODE (arg1) == MINUS_EXPR)
7300                   && TREE_CODE (arg0) == MULT_EXPR))
7301             {
7302               tree parg0, parg1, parg, marg;
7303               enum tree_code pcode;
7304
7305               if (TREE_CODE (arg1) == MULT_EXPR)
7306                 parg = arg0, marg = arg1;
7307               else
7308                 parg = arg1, marg = arg0;
7309               pcode = TREE_CODE (parg);
7310               parg0 = TREE_OPERAND (parg, 0);
7311               parg1 = TREE_OPERAND (parg, 1);
7312               STRIP_NOPS (parg0);
7313               STRIP_NOPS (parg1);
7314
7315               if (TREE_CODE (parg0) == MULT_EXPR
7316                   && TREE_CODE (parg1) != MULT_EXPR)
7317                 return fold_build2 (pcode, type,
7318                                     fold_build2 (PLUS_EXPR, type,
7319                                                  fold_convert (type, parg0),
7320                                                  fold_convert (type, marg)),
7321                                     fold_convert (type, parg1));
7322               if (TREE_CODE (parg0) != MULT_EXPR
7323                   && TREE_CODE (parg1) == MULT_EXPR)
7324                 return fold_build2 (PLUS_EXPR, type,
7325                                     fold_convert (type, parg0),
7326                                     fold_build2 (pcode, type,
7327                                                  fold_convert (type, marg),
7328                                                  fold_convert (type,
7329                                                                parg1)));
7330             }
7331
7332           if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
7333             {
7334               tree arg00, arg01, arg10, arg11;
7335               tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7336
7337               /* (A * C) + (B * C) -> (A+B) * C.
7338                  We are most concerned about the case where C is a constant,
7339                  but other combinations show up during loop reduction.  Since
7340                  it is not difficult, try all four possibilities.  */
7341
7342               arg00 = TREE_OPERAND (arg0, 0);
7343               arg01 = TREE_OPERAND (arg0, 1);
7344               arg10 = TREE_OPERAND (arg1, 0);
7345               arg11 = TREE_OPERAND (arg1, 1);
7346               same = NULL_TREE;
7347
7348               if (operand_equal_p (arg01, arg11, 0))
7349                 same = arg01, alt0 = arg00, alt1 = arg10;
7350               else if (operand_equal_p (arg00, arg10, 0))
7351                 same = arg00, alt0 = arg01, alt1 = arg11;
7352               else if (operand_equal_p (arg00, arg11, 0))
7353                 same = arg00, alt0 = arg01, alt1 = arg10;
7354               else if (operand_equal_p (arg01, arg10, 0))
7355                 same = arg01, alt0 = arg00, alt1 = arg11;
7356
7357               /* No identical multiplicands; see if we can find a common
7358                  power-of-two factor in non-power-of-two multiplies.  This
7359                  can help in multi-dimensional array access.  */
7360               else if (TREE_CODE (arg01) == INTEGER_CST
7361                        && TREE_CODE (arg11) == INTEGER_CST
7362                        && TREE_INT_CST_HIGH (arg01) == 0
7363                        && TREE_INT_CST_HIGH (arg11) == 0)
7364                 {
7365                   HOST_WIDE_INT int01, int11, tmp;
7366                   int01 = TREE_INT_CST_LOW (arg01);
7367                   int11 = TREE_INT_CST_LOW (arg11);
7368
7369                   /* Move min of absolute values to int11.  */
7370                   if ((int01 >= 0 ? int01 : -int01)
7371                       < (int11 >= 0 ? int11 : -int11))
7372                     {
7373                       tmp = int01, int01 = int11, int11 = tmp;
7374                       alt0 = arg00, arg00 = arg10, arg10 = alt0;
7375                       alt0 = arg01, arg01 = arg11, arg11 = alt0;
7376                     }
7377
7378                   if (exact_log2 (int11) > 0 && int01 % int11 == 0)
7379                     {
7380                       alt0 = fold_build2 (MULT_EXPR, type, arg00,
7381                                           build_int_cst (NULL_TREE,
7382                                                          int01 / int11));
7383                       alt1 = arg10;
7384                       same = arg11;
7385                     }
7386                 }
7387
7388               if (same)
7389                 return fold_build2 (MULT_EXPR, type,
7390                                     fold_build2 (PLUS_EXPR, type,
7391                                                  fold_convert (type, alt0),
7392                                                  fold_convert (type, alt1)),
7393                                     same);
7394             }
7395
7396           /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
7397              of the array.  Loop optimizer sometimes produce this type of
7398              expressions.  */
7399           if (TREE_CODE (arg0) == ADDR_EXPR
7400               && TREE_CODE (arg1) == MULT_EXPR)
7401             {
7402               tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
7403               if (tem)
7404                 return fold_convert (type, fold (tem));
7405             }
7406           else if (TREE_CODE (arg1) == ADDR_EXPR
7407                    && TREE_CODE (arg0) == MULT_EXPR)
7408             {
7409               tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
7410               if (tem)
7411                 return fold_convert (type, fold (tem));
7412             }
7413         }
7414       else
7415         {
7416           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
7417           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
7418             return non_lvalue (fold_convert (type, arg0));
7419
7420           /* Likewise if the operands are reversed.  */
7421           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
7422             return non_lvalue (fold_convert (type, arg1));
7423
7424           /* Convert X + -C into X - C.  */
7425           if (TREE_CODE (arg1) == REAL_CST
7426               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
7427             {
7428               tem = fold_negate_const (arg1, type);
7429               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
7430                 return fold_build2 (MINUS_EXPR, type,
7431                                     fold_convert (type, arg0),
7432                                     fold_convert (type, tem));
7433             }
7434
7435           /* Convert x+x into x*2.0.  */
7436           if (operand_equal_p (arg0, arg1, 0)
7437               && SCALAR_FLOAT_TYPE_P (type))
7438             return fold_build2 (MULT_EXPR, type, arg0,
7439                                 build_real (type, dconst2));
7440
7441           /* Convert x*c+x into x*(c+1).  */
7442           if (flag_unsafe_math_optimizations
7443               && TREE_CODE (arg0) == MULT_EXPR
7444               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
7445               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
7446               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
7447             {
7448               REAL_VALUE_TYPE c;
7449
7450               c = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
7451               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7452               return fold_build2 (MULT_EXPR, type, arg1,
7453                                   build_real (type, c));
7454             }
7455
7456           /* Convert x+x*c into x*(c+1).  */
7457           if (flag_unsafe_math_optimizations
7458               && TREE_CODE (arg1) == MULT_EXPR
7459               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
7460               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
7461               && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
7462             {
7463               REAL_VALUE_TYPE c;
7464
7465               c = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
7466               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7467               return fold_build2 (MULT_EXPR, type, arg0,
7468                                   build_real (type, c));
7469             }
7470
7471           /* Convert x*c1+x*c2 into x*(c1+c2).  */
7472           if (flag_unsafe_math_optimizations
7473               && TREE_CODE (arg0) == MULT_EXPR
7474               && TREE_CODE (arg1) == MULT_EXPR
7475               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
7476               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
7477               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
7478               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
7479               && operand_equal_p (TREE_OPERAND (arg0, 0),
7480                                   TREE_OPERAND (arg1, 0), 0))
7481             {
7482               REAL_VALUE_TYPE c1, c2;
7483
7484               c1 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
7485               c2 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
7486               real_arithmetic (&c1, PLUS_EXPR, &c1, &c2);
7487               return fold_build2 (MULT_EXPR, type,
7488                                   TREE_OPERAND (arg0, 0),
7489                                   build_real (type, c1));
7490             }
7491           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  */
7492           if (flag_unsafe_math_optimizations
7493               && TREE_CODE (arg1) == PLUS_EXPR
7494               && TREE_CODE (arg0) != MULT_EXPR)
7495             {
7496               tree tree10 = TREE_OPERAND (arg1, 0);
7497               tree tree11 = TREE_OPERAND (arg1, 1);
7498               if (TREE_CODE (tree11) == MULT_EXPR
7499                   && TREE_CODE (tree10) == MULT_EXPR)
7500                 {
7501                   tree tree0;
7502                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
7503                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
7504                 }
7505             }
7506           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  */
7507           if (flag_unsafe_math_optimizations
7508               && TREE_CODE (arg0) == PLUS_EXPR
7509               && TREE_CODE (arg1) != MULT_EXPR)
7510             {
7511               tree tree00 = TREE_OPERAND (arg0, 0);
7512               tree tree01 = TREE_OPERAND (arg0, 1);
7513               if (TREE_CODE (tree01) == MULT_EXPR
7514                   && TREE_CODE (tree00) == MULT_EXPR)
7515                 {
7516                   tree tree0;
7517                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
7518                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
7519                 }
7520             }
7521         }
7522
7523      bit_rotate:
7524       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
7525          is a rotate of A by C1 bits.  */
7526       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
7527          is a rotate of A by B bits.  */
7528       {
7529         enum tree_code code0, code1;
7530         code0 = TREE_CODE (arg0);
7531         code1 = TREE_CODE (arg1);
7532         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
7533              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
7534             && operand_equal_p (TREE_OPERAND (arg0, 0),
7535                                 TREE_OPERAND (arg1, 0), 0)
7536             && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
7537           {
7538             tree tree01, tree11;
7539             enum tree_code code01, code11;
7540
7541             tree01 = TREE_OPERAND (arg0, 1);
7542             tree11 = TREE_OPERAND (arg1, 1);
7543             STRIP_NOPS (tree01);
7544             STRIP_NOPS (tree11);
7545             code01 = TREE_CODE (tree01);
7546             code11 = TREE_CODE (tree11);
7547             if (code01 == INTEGER_CST
7548                 && code11 == INTEGER_CST
7549                 && TREE_INT_CST_HIGH (tree01) == 0
7550                 && TREE_INT_CST_HIGH (tree11) == 0
7551                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
7552                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
7553               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
7554                              code0 == LSHIFT_EXPR ? tree01 : tree11);
7555             else if (code11 == MINUS_EXPR)
7556               {
7557                 tree tree110, tree111;
7558                 tree110 = TREE_OPERAND (tree11, 0);
7559                 tree111 = TREE_OPERAND (tree11, 1);
7560                 STRIP_NOPS (tree110);
7561                 STRIP_NOPS (tree111);
7562                 if (TREE_CODE (tree110) == INTEGER_CST
7563                     && 0 == compare_tree_int (tree110,
7564                                               TYPE_PRECISION
7565                                               (TREE_TYPE (TREE_OPERAND
7566                                                           (arg0, 0))))
7567                     && operand_equal_p (tree01, tree111, 0))
7568                   return build2 ((code0 == LSHIFT_EXPR
7569                                   ? LROTATE_EXPR
7570                                   : RROTATE_EXPR),
7571                                  type, TREE_OPERAND (arg0, 0), tree01);
7572               }
7573             else if (code01 == MINUS_EXPR)
7574               {
7575                 tree tree010, tree011;
7576                 tree010 = TREE_OPERAND (tree01, 0);
7577                 tree011 = TREE_OPERAND (tree01, 1);
7578                 STRIP_NOPS (tree010);
7579                 STRIP_NOPS (tree011);
7580                 if (TREE_CODE (tree010) == INTEGER_CST
7581                     && 0 == compare_tree_int (tree010,
7582                                               TYPE_PRECISION
7583                                               (TREE_TYPE (TREE_OPERAND
7584                                                           (arg0, 0))))
7585                     && operand_equal_p (tree11, tree011, 0))
7586                   return build2 ((code0 != LSHIFT_EXPR
7587                                   ? LROTATE_EXPR
7588                                   : RROTATE_EXPR),
7589                                  type, TREE_OPERAND (arg0, 0), tree11);
7590               }
7591           }
7592       }
7593
7594     associate:
7595       /* In most languages, can't associate operations on floats through
7596          parentheses.  Rather than remember where the parentheses were, we
7597          don't associate floats at all, unless the user has specified
7598          -funsafe-math-optimizations.  */
7599
7600       if (! wins
7601           && (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
7602         {
7603           tree var0, con0, lit0, minus_lit0;
7604           tree var1, con1, lit1, minus_lit1;
7605
7606           /* Split both trees into variables, constants, and literals.  Then
7607              associate each group together, the constants with literals,
7608              then the result with variables.  This increases the chances of
7609              literals being recombined later and of generating relocatable
7610              expressions for the sum of a constant and literal.  */
7611           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
7612           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
7613                              code == MINUS_EXPR);
7614
7615           /* Only do something if we found more than two objects.  Otherwise,
7616              nothing has changed and we risk infinite recursion.  */
7617           if (2 < ((var0 != 0) + (var1 != 0)
7618                    + (con0 != 0) + (con1 != 0)
7619                    + (lit0 != 0) + (lit1 != 0)
7620                    + (minus_lit0 != 0) + (minus_lit1 != 0)))
7621             {
7622               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
7623               if (code == MINUS_EXPR)
7624                 code = PLUS_EXPR;
7625
7626               var0 = associate_trees (var0, var1, code, type);
7627               con0 = associate_trees (con0, con1, code, type);
7628               lit0 = associate_trees (lit0, lit1, code, type);
7629               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
7630
7631               /* Preserve the MINUS_EXPR if the negative part of the literal is
7632                  greater than the positive part.  Otherwise, the multiplicative
7633                  folding code (i.e extract_muldiv) may be fooled in case
7634                  unsigned constants are subtracted, like in the following
7635                  example: ((X*2 + 4) - 8U)/2.  */
7636               if (minus_lit0 && lit0)
7637                 {
7638                   if (TREE_CODE (lit0) == INTEGER_CST
7639                       && TREE_CODE (minus_lit0) == INTEGER_CST
7640                       && tree_int_cst_lt (lit0, minus_lit0))
7641                     {
7642                       minus_lit0 = associate_trees (minus_lit0, lit0,
7643                                                     MINUS_EXPR, type);
7644                       lit0 = 0;
7645                     }
7646                   else
7647                     {
7648                       lit0 = associate_trees (lit0, minus_lit0,
7649                                               MINUS_EXPR, type);
7650                       minus_lit0 = 0;
7651                     }
7652                 }
7653               if (minus_lit0)
7654                 {
7655                   if (con0 == 0)
7656                     return fold_convert (type,
7657                                          associate_trees (var0, minus_lit0,
7658                                                           MINUS_EXPR, type));
7659                   else
7660                     {
7661                       con0 = associate_trees (con0, minus_lit0,
7662                                               MINUS_EXPR, type);
7663                       return fold_convert (type,
7664                                            associate_trees (var0, con0,
7665                                                             PLUS_EXPR, type));
7666                     }
7667                 }
7668
7669               con0 = associate_trees (con0, lit0, code, type);
7670               return fold_convert (type, associate_trees (var0, con0,
7671                                                           code, type));
7672             }
7673         }
7674
7675     binary:
7676       if (wins)
7677         t1 = const_binop (code, arg0, arg1, 0);
7678       if (t1 != NULL_TREE)
7679         {
7680           /* The return value should always have
7681              the same type as the original expression.  */
7682           if (TREE_TYPE (t1) != type)
7683             t1 = fold_convert (type, t1);
7684
7685           return t1;
7686         }
7687       return NULL_TREE;
7688
7689     case MINUS_EXPR:
7690       /* A - (-B) -> A + B */
7691       if (TREE_CODE (arg1) == NEGATE_EXPR)
7692         return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
7693       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
7694       if (TREE_CODE (arg0) == NEGATE_EXPR
7695           && (FLOAT_TYPE_P (type)
7696               || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))
7697           && negate_expr_p (arg1)
7698           && reorder_operands_p (arg0, arg1))
7699         return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
7700                             TREE_OPERAND (arg0, 0));
7701       /* Convert -A - 1 to ~A.  */
7702       if (INTEGRAL_TYPE_P (type)
7703           && TREE_CODE (arg0) == NEGATE_EXPR
7704           && integer_onep (arg1))
7705         return fold_build1 (BIT_NOT_EXPR, type, TREE_OPERAND (arg0, 0));
7706
7707       /* Convert -1 - A to ~A.  */
7708       if (INTEGRAL_TYPE_P (type)
7709           && integer_all_onesp (arg0))
7710         return fold_build1 (BIT_NOT_EXPR, type, arg1);
7711
7712       if (TREE_CODE (type) == COMPLEX_TYPE)
7713         {
7714           tem = fold_complex_add (type, arg0, arg1, MINUS_EXPR);
7715           if (tem)
7716             return tem;
7717         }
7718
7719       if (! FLOAT_TYPE_P (type))
7720         {
7721           if (! wins && integer_zerop (arg0))
7722             return negate_expr (fold_convert (type, arg1));
7723           if (integer_zerop (arg1))
7724             return non_lvalue (fold_convert (type, arg0));
7725
7726           /* Fold A - (A & B) into ~B & A.  */
7727           if (!TREE_SIDE_EFFECTS (arg0)
7728               && TREE_CODE (arg1) == BIT_AND_EXPR)
7729             {
7730               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
7731                 return fold_build2 (BIT_AND_EXPR, type,
7732                                     fold_build1 (BIT_NOT_EXPR, type,
7733                                                  TREE_OPERAND (arg1, 0)),
7734                                     arg0);
7735               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
7736                 return fold_build2 (BIT_AND_EXPR, type,
7737                                     fold_build1 (BIT_NOT_EXPR, type,
7738                                                  TREE_OPERAND (arg1, 1)),
7739                                     arg0);
7740             }
7741
7742           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
7743              any power of 2 minus 1.  */
7744           if (TREE_CODE (arg0) == BIT_AND_EXPR
7745               && TREE_CODE (arg1) == BIT_AND_EXPR
7746               && operand_equal_p (TREE_OPERAND (arg0, 0),
7747                                   TREE_OPERAND (arg1, 0), 0))
7748             {
7749               tree mask0 = TREE_OPERAND (arg0, 1);
7750               tree mask1 = TREE_OPERAND (arg1, 1);
7751               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
7752
7753               if (operand_equal_p (tem, mask1, 0))
7754                 {
7755                   tem = fold_build2 (BIT_XOR_EXPR, type,
7756                                      TREE_OPERAND (arg0, 0), mask1);
7757                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
7758                 }
7759             }
7760         }
7761
7762       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
7763       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
7764         return non_lvalue (fold_convert (type, arg0));
7765
7766       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
7767          ARG0 is zero and X + ARG0 reduces to X, since that would mean
7768          (-ARG1 + ARG0) reduces to -ARG1.  */
7769       else if (!wins && fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
7770         return negate_expr (fold_convert (type, arg1));
7771
7772       /* Fold &x - &x.  This can happen from &x.foo - &x.
7773          This is unsafe for certain floats even in non-IEEE formats.
7774          In IEEE, it is unsafe because it does wrong for NaNs.
7775          Also note that operand_equal_p is always false if an operand
7776          is volatile.  */
7777
7778       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
7779           && operand_equal_p (arg0, arg1, 0))
7780         return fold_convert (type, integer_zero_node);
7781
7782       /* A - B -> A + (-B) if B is easily negatable.  */
7783       if (!wins && negate_expr_p (arg1)
7784           && ((FLOAT_TYPE_P (type)
7785                /* Avoid this transformation if B is a positive REAL_CST.  */
7786                && (TREE_CODE (arg1) != REAL_CST
7787                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
7788               || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
7789         return fold_build2 (PLUS_EXPR, type, arg0, negate_expr (arg1));
7790
7791       /* Try folding difference of addresses.  */
7792       {
7793         HOST_WIDE_INT diff;
7794
7795         if ((TREE_CODE (arg0) == ADDR_EXPR
7796              || TREE_CODE (arg1) == ADDR_EXPR)
7797             && ptr_difference_const (arg0, arg1, &diff))
7798           return build_int_cst_type (type, diff);
7799       }
7800           
7801       /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
7802          of the array.  Loop optimizer sometimes produce this type of
7803          expressions.  */
7804       if (TREE_CODE (arg0) == ADDR_EXPR
7805           && TREE_CODE (arg1) == MULT_EXPR)
7806         {
7807           tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
7808           if (tem)
7809             return fold_convert (type, fold (tem));
7810         }
7811
7812       if (TREE_CODE (arg0) == MULT_EXPR
7813           && TREE_CODE (arg1) == MULT_EXPR
7814           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
7815         {
7816           /* (A * C) - (B * C) -> (A-B) * C.  */
7817           if (operand_equal_p (TREE_OPERAND (arg0, 1),
7818                                TREE_OPERAND (arg1, 1), 0))
7819             return fold_build2 (MULT_EXPR, type,
7820                                 fold_build2 (MINUS_EXPR, type,
7821                                              TREE_OPERAND (arg0, 0),
7822                                              TREE_OPERAND (arg1, 0)),
7823                                 TREE_OPERAND (arg0, 1));
7824           /* (A * C1) - (A * C2) -> A * (C1-C2).  */
7825           if (operand_equal_p (TREE_OPERAND (arg0, 0),
7826                                TREE_OPERAND (arg1, 0), 0))
7827             return fold_build2 (MULT_EXPR, type,
7828                                 TREE_OPERAND (arg0, 0),
7829                                 fold_build2 (MINUS_EXPR, type,
7830                                              TREE_OPERAND (arg0, 1),
7831                                              TREE_OPERAND (arg1, 1)));
7832         }
7833
7834       goto associate;
7835
7836     case MULT_EXPR:
7837       /* (-A) * (-B) -> A * B  */
7838       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
7839         return fold_build2 (MULT_EXPR, type,
7840                             TREE_OPERAND (arg0, 0),
7841                             negate_expr (arg1));
7842       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
7843         return fold_build2 (MULT_EXPR, type,
7844                             negate_expr (arg0),
7845                             TREE_OPERAND (arg1, 0));
7846
7847       if (TREE_CODE (type) == COMPLEX_TYPE)
7848         {
7849           tem = fold_complex_mult (type, arg0, arg1);
7850           if (tem)
7851             return tem;
7852         }
7853
7854       if (! FLOAT_TYPE_P (type))
7855         {
7856           if (integer_zerop (arg1))
7857             return omit_one_operand (type, arg1, arg0);
7858           if (integer_onep (arg1))
7859             return non_lvalue (fold_convert (type, arg0));
7860           /* Transform x * -1 into -x.  */
7861           if (integer_all_onesp (arg1))
7862             return fold_convert (type, negate_expr (arg0));
7863
7864           /* (a * (1 << b)) is (a << b)  */
7865           if (TREE_CODE (arg1) == LSHIFT_EXPR
7866               && integer_onep (TREE_OPERAND (arg1, 0)))
7867             return fold_build2 (LSHIFT_EXPR, type, arg0,
7868                                 TREE_OPERAND (arg1, 1));
7869           if (TREE_CODE (arg0) == LSHIFT_EXPR
7870               && integer_onep (TREE_OPERAND (arg0, 0)))
7871             return fold_build2 (LSHIFT_EXPR, type, arg1,
7872                                 TREE_OPERAND (arg0, 1));
7873
7874           if (TREE_CODE (arg1) == INTEGER_CST
7875               && 0 != (tem = extract_muldiv (op0,
7876                                              fold_convert (type, arg1),
7877                                              code, NULL_TREE)))
7878             return fold_convert (type, tem);
7879
7880         }
7881       else
7882         {
7883           /* Maybe fold x * 0 to 0.  The expressions aren't the same
7884              when x is NaN, since x * 0 is also NaN.  Nor are they the
7885              same in modes with signed zeros, since multiplying a
7886              negative value by 0 gives -0, not +0.  */
7887           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
7888               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
7889               && real_zerop (arg1))
7890             return omit_one_operand (type, arg1, arg0);
7891           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
7892           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7893               && real_onep (arg1))
7894             return non_lvalue (fold_convert (type, arg0));
7895
7896           /* Transform x * -1.0 into -x.  */
7897           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7898               && real_minus_onep (arg1))
7899             return fold_convert (type, negate_expr (arg0));
7900
7901           /* Convert (C1/X)*C2 into (C1*C2)/X.  */
7902           if (flag_unsafe_math_optimizations
7903               && TREE_CODE (arg0) == RDIV_EXPR
7904               && TREE_CODE (arg1) == REAL_CST
7905               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
7906             {
7907               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
7908                                       arg1, 0);
7909               if (tem)
7910                 return fold_build2 (RDIV_EXPR, type, tem,
7911                                     TREE_OPERAND (arg0, 1));
7912             }
7913
7914           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
7915           if (operand_equal_p (arg0, arg1, 0))
7916             {
7917               tree tem = fold_strip_sign_ops (arg0);
7918               if (tem != NULL_TREE)
7919                 {
7920                   tem = fold_convert (type, tem);
7921                   return fold_build2 (MULT_EXPR, type, tem, tem);
7922                 }
7923             }
7924
7925           if (flag_unsafe_math_optimizations)
7926             {
7927               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
7928               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
7929
7930               /* Optimizations of root(...)*root(...).  */
7931               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
7932                 {
7933                   tree rootfn, arg, arglist;
7934                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7935                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7936
7937                   /* Optimize sqrt(x)*sqrt(x) as x.  */
7938                   if (BUILTIN_SQRT_P (fcode0)
7939                       && operand_equal_p (arg00, arg10, 0)
7940                       && ! HONOR_SNANS (TYPE_MODE (type)))
7941                     return arg00;
7942
7943                   /* Optimize root(x)*root(y) as root(x*y).  */
7944                   rootfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7945                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
7946                   arglist = build_tree_list (NULL_TREE, arg);
7947                   return build_function_call_expr (rootfn, arglist);
7948                 }
7949
7950               /* Optimize expN(x)*expN(y) as expN(x+y).  */
7951               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
7952                 {
7953                   tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7954                   tree arg = fold_build2 (PLUS_EXPR, type,
7955                                           TREE_VALUE (TREE_OPERAND (arg0, 1)),
7956                                           TREE_VALUE (TREE_OPERAND (arg1, 1)));
7957                   tree arglist = build_tree_list (NULL_TREE, arg);
7958                   return build_function_call_expr (expfn, arglist);
7959                 }
7960
7961               /* Optimizations of pow(...)*pow(...).  */
7962               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
7963                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
7964                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
7965                 {
7966                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7967                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
7968                                                                      1)));
7969                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7970                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
7971                                                                      1)));
7972
7973                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
7974                   if (operand_equal_p (arg01, arg11, 0))
7975                     {
7976                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7977                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
7978                       tree arglist = tree_cons (NULL_TREE, arg,
7979                                                 build_tree_list (NULL_TREE,
7980                                                                  arg01));
7981                       return build_function_call_expr (powfn, arglist);
7982                     }
7983
7984                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
7985                   if (operand_equal_p (arg00, arg10, 0))
7986                     {
7987                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7988                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
7989                       tree arglist = tree_cons (NULL_TREE, arg00,
7990                                                 build_tree_list (NULL_TREE,
7991                                                                  arg));
7992                       return build_function_call_expr (powfn, arglist);
7993                     }
7994                 }
7995
7996               /* Optimize tan(x)*cos(x) as sin(x).  */
7997               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
7998                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
7999                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
8000                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
8001                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
8002                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
8003                   && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8004                                       TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8005                 {
8006                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
8007
8008                   if (sinfn != NULL_TREE)
8009                     return build_function_call_expr (sinfn,
8010                                                      TREE_OPERAND (arg0, 1));
8011                 }
8012
8013               /* Optimize x*pow(x,c) as pow(x,c+1).  */
8014               if (fcode1 == BUILT_IN_POW
8015                   || fcode1 == BUILT_IN_POWF
8016                   || fcode1 == BUILT_IN_POWL)
8017                 {
8018                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8019                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
8020                                                                      1)));
8021                   if (TREE_CODE (arg11) == REAL_CST
8022                       && ! TREE_CONSTANT_OVERFLOW (arg11)
8023                       && operand_equal_p (arg0, arg10, 0))
8024                     {
8025                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8026                       REAL_VALUE_TYPE c;
8027                       tree arg, arglist;
8028
8029                       c = TREE_REAL_CST (arg11);
8030                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
8031                       arg = build_real (type, c);
8032                       arglist = build_tree_list (NULL_TREE, arg);
8033                       arglist = tree_cons (NULL_TREE, arg0, arglist);
8034                       return build_function_call_expr (powfn, arglist);
8035                     }
8036                 }
8037
8038               /* Optimize pow(x,c)*x as pow(x,c+1).  */
8039               if (fcode0 == BUILT_IN_POW
8040                   || fcode0 == BUILT_IN_POWF
8041                   || fcode0 == BUILT_IN_POWL)
8042                 {
8043                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8044                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
8045                                                                      1)));
8046                   if (TREE_CODE (arg01) == REAL_CST
8047                       && ! TREE_CONSTANT_OVERFLOW (arg01)
8048                       && operand_equal_p (arg1, arg00, 0))
8049                     {
8050                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8051                       REAL_VALUE_TYPE c;
8052                       tree arg, arglist;
8053
8054                       c = TREE_REAL_CST (arg01);
8055                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
8056                       arg = build_real (type, c);
8057                       arglist = build_tree_list (NULL_TREE, arg);
8058                       arglist = tree_cons (NULL_TREE, arg1, arglist);
8059                       return build_function_call_expr (powfn, arglist);
8060                     }
8061                 }
8062
8063               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
8064               if (! optimize_size
8065                   && operand_equal_p (arg0, arg1, 0))
8066                 {
8067                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
8068
8069                   if (powfn)
8070                     {
8071                       tree arg = build_real (type, dconst2);
8072                       tree arglist = build_tree_list (NULL_TREE, arg);
8073                       arglist = tree_cons (NULL_TREE, arg0, arglist);
8074                       return build_function_call_expr (powfn, arglist);
8075                     }
8076                 }
8077             }
8078         }
8079       goto associate;
8080
8081     case BIT_IOR_EXPR:
8082     bit_ior:
8083       if (integer_all_onesp (arg1))
8084         return omit_one_operand (type, arg1, arg0);
8085       if (integer_zerop (arg1))
8086         return non_lvalue (fold_convert (type, arg0));
8087       if (operand_equal_p (arg0, arg1, 0))
8088         return non_lvalue (fold_convert (type, arg0));
8089
8090       /* ~X | X is -1.  */
8091       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8092           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8093         {
8094           t1 = build_int_cst (type, -1);
8095           t1 = force_fit_type (t1, 0, false, false);
8096           return omit_one_operand (type, t1, arg1);
8097         }
8098
8099       /* X | ~X is -1.  */
8100       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8101           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8102         {
8103           t1 = build_int_cst (type, -1);
8104           t1 = force_fit_type (t1, 0, false, false);
8105           return omit_one_operand (type, t1, arg0);
8106         }
8107
8108       t1 = distribute_bit_expr (code, type, arg0, arg1);
8109       if (t1 != NULL_TREE)
8110         return t1;
8111
8112       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
8113
8114          This results in more efficient code for machines without a NAND
8115          instruction.  Combine will canonicalize to the first form
8116          which will allow use of NAND instructions provided by the
8117          backend if they exist.  */
8118       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8119           && TREE_CODE (arg1) == BIT_NOT_EXPR)
8120         {
8121           return fold_build1 (BIT_NOT_EXPR, type,
8122                               build2 (BIT_AND_EXPR, type,
8123                                       TREE_OPERAND (arg0, 0),
8124                                       TREE_OPERAND (arg1, 0)));
8125         }
8126
8127       /* See if this can be simplified into a rotate first.  If that
8128          is unsuccessful continue in the association code.  */
8129       goto bit_rotate;
8130
8131     case BIT_XOR_EXPR:
8132       if (integer_zerop (arg1))
8133         return non_lvalue (fold_convert (type, arg0));
8134       if (integer_all_onesp (arg1))
8135         return fold_build1 (BIT_NOT_EXPR, type, arg0);
8136       if (operand_equal_p (arg0, arg1, 0))
8137         return omit_one_operand (type, integer_zero_node, arg0);
8138
8139       /* ~X ^ X is -1.  */
8140       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8141           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8142         {
8143           t1 = build_int_cst (type, -1);
8144           t1 = force_fit_type (t1, 0, false, false);
8145           return omit_one_operand (type, t1, arg1);
8146         }
8147
8148       /* X ^ ~X is -1.  */
8149       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8150           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8151         {
8152           t1 = build_int_cst (type, -1);
8153           t1 = force_fit_type (t1, 0, false, false);
8154           return omit_one_operand (type, t1, arg0);
8155         }
8156
8157       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
8158          with a constant, and the two constants have no bits in common,
8159          we should treat this as a BIT_IOR_EXPR since this may produce more
8160          simplifications.  */
8161       if (TREE_CODE (arg0) == BIT_AND_EXPR
8162           && TREE_CODE (arg1) == BIT_AND_EXPR
8163           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8164           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8165           && integer_zerop (const_binop (BIT_AND_EXPR,
8166                                          TREE_OPERAND (arg0, 1),
8167                                          TREE_OPERAND (arg1, 1), 0)))
8168         {
8169           code = BIT_IOR_EXPR;
8170           goto bit_ior;
8171         }
8172
8173       /* See if this can be simplified into a rotate first.  If that
8174          is unsuccessful continue in the association code.  */
8175       goto bit_rotate;
8176
8177     case BIT_AND_EXPR:
8178       if (integer_all_onesp (arg1))
8179         return non_lvalue (fold_convert (type, arg0));
8180       if (integer_zerop (arg1))
8181         return omit_one_operand (type, arg1, arg0);
8182       if (operand_equal_p (arg0, arg1, 0))
8183         return non_lvalue (fold_convert (type, arg0));
8184
8185       /* ~X & X is always zero.  */
8186       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8187           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8188         return omit_one_operand (type, integer_zero_node, arg1);
8189
8190       /* X & ~X is always zero.  */
8191       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8192           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8193         return omit_one_operand (type, integer_zero_node, arg0);
8194
8195       t1 = distribute_bit_expr (code, type, arg0, arg1);
8196       if (t1 != NULL_TREE)
8197         return t1;
8198       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
8199       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
8200           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
8201         {
8202           unsigned int prec
8203             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
8204
8205           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
8206               && (~TREE_INT_CST_LOW (arg1)
8207                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
8208             return fold_convert (type, TREE_OPERAND (arg0, 0));
8209         }
8210
8211       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
8212
8213          This results in more efficient code for machines without a NOR
8214          instruction.  Combine will canonicalize to the first form
8215          which will allow use of NOR instructions provided by the
8216          backend if they exist.  */
8217       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8218           && TREE_CODE (arg1) == BIT_NOT_EXPR)
8219         {
8220           return fold_build1 (BIT_NOT_EXPR, type,
8221                               build2 (BIT_IOR_EXPR, type,
8222                                       TREE_OPERAND (arg0, 0),
8223                                       TREE_OPERAND (arg1, 0)));
8224         }
8225
8226       goto associate;
8227
8228     case RDIV_EXPR:
8229       /* Don't touch a floating-point divide by zero unless the mode
8230          of the constant can represent infinity.  */
8231       if (TREE_CODE (arg1) == REAL_CST
8232           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
8233           && real_zerop (arg1))
8234         return NULL_TREE;
8235
8236       /* (-A) / (-B) -> A / B  */
8237       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
8238         return fold_build2 (RDIV_EXPR, type,
8239                             TREE_OPERAND (arg0, 0),
8240                             negate_expr (arg1));
8241       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
8242         return fold_build2 (RDIV_EXPR, type,
8243                             negate_expr (arg0),
8244                             TREE_OPERAND (arg1, 0));
8245
8246       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
8247       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
8248           && real_onep (arg1))
8249         return non_lvalue (fold_convert (type, arg0));
8250
8251       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
8252       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
8253           && real_minus_onep (arg1))
8254         return non_lvalue (fold_convert (type, negate_expr (arg0)));
8255
8256       /* If ARG1 is a constant, we can convert this to a multiply by the
8257          reciprocal.  This does not have the same rounding properties,
8258          so only do this if -funsafe-math-optimizations.  We can actually
8259          always safely do it if ARG1 is a power of two, but it's hard to
8260          tell if it is or not in a portable manner.  */
8261       if (TREE_CODE (arg1) == REAL_CST)
8262         {
8263           if (flag_unsafe_math_optimizations
8264               && 0 != (tem = const_binop (code, build_real (type, dconst1),
8265                                           arg1, 0)))
8266             return fold_build2 (MULT_EXPR, type, arg0, tem);
8267           /* Find the reciprocal if optimizing and the result is exact.  */
8268           if (optimize)
8269             {
8270               REAL_VALUE_TYPE r;
8271               r = TREE_REAL_CST (arg1);
8272               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
8273                 {
8274                   tem = build_real (type, r);
8275                   return fold_build2 (MULT_EXPR, type, arg0, tem);
8276                 }
8277             }
8278         }
8279       /* Convert A/B/C to A/(B*C).  */
8280       if (flag_unsafe_math_optimizations
8281           && TREE_CODE (arg0) == RDIV_EXPR)
8282         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
8283                             fold_build2 (MULT_EXPR, type,
8284                                          TREE_OPERAND (arg0, 1), arg1));
8285
8286       /* Convert A/(B/C) to (A/B)*C.  */
8287       if (flag_unsafe_math_optimizations
8288           && TREE_CODE (arg1) == RDIV_EXPR)
8289         return fold_build2 (MULT_EXPR, type,
8290                             fold_build2 (RDIV_EXPR, type, arg0,
8291                                          TREE_OPERAND (arg1, 0)),
8292                             TREE_OPERAND (arg1, 1));
8293
8294       /* Convert C1/(X*C2) into (C1/C2)/X.  */
8295       if (flag_unsafe_math_optimizations
8296           && TREE_CODE (arg1) == MULT_EXPR
8297           && TREE_CODE (arg0) == REAL_CST
8298           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
8299         {
8300           tree tem = const_binop (RDIV_EXPR, arg0,
8301                                   TREE_OPERAND (arg1, 1), 0);
8302           if (tem)
8303             return fold_build2 (RDIV_EXPR, type, tem,
8304                                 TREE_OPERAND (arg1, 0));
8305         }
8306
8307       if (TREE_CODE (type) == COMPLEX_TYPE)
8308         {
8309           tem = fold_complex_div (type, arg0, arg1, code);
8310           if (tem)
8311             return tem;
8312         }
8313
8314       if (flag_unsafe_math_optimizations)
8315         {
8316           enum built_in_function fcode = builtin_mathfn_code (arg1);
8317           /* Optimize x/expN(y) into x*expN(-y).  */
8318           if (BUILTIN_EXPONENT_P (fcode))
8319             {
8320               tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8321               tree arg = negate_expr (TREE_VALUE (TREE_OPERAND (arg1, 1)));
8322               tree arglist = build_tree_list (NULL_TREE,
8323                                               fold_convert (type, arg));
8324               arg1 = build_function_call_expr (expfn, arglist);
8325               return fold_build2 (MULT_EXPR, type, arg0, arg1);
8326             }
8327
8328           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
8329           if (fcode == BUILT_IN_POW
8330               || fcode == BUILT_IN_POWF
8331               || fcode == BUILT_IN_POWL)
8332             {
8333               tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8334               tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8335               tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1, 1)));
8336               tree neg11 = fold_convert (type, negate_expr (arg11));
8337               tree arglist = tree_cons(NULL_TREE, arg10,
8338                                        build_tree_list (NULL_TREE, neg11));
8339               arg1 = build_function_call_expr (powfn, arglist);
8340               return fold_build2 (MULT_EXPR, type, arg0, arg1);
8341             }
8342         }
8343
8344       if (flag_unsafe_math_optimizations)
8345         {
8346           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
8347           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
8348
8349           /* Optimize sin(x)/cos(x) as tan(x).  */
8350           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
8351                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
8352                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
8353               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8354                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8355             {
8356               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
8357
8358               if (tanfn != NULL_TREE)
8359                 return build_function_call_expr (tanfn,
8360                                                  TREE_OPERAND (arg0, 1));
8361             }
8362
8363           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
8364           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
8365                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
8366                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
8367               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8368                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8369             {
8370               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
8371
8372               if (tanfn != NULL_TREE)
8373                 {
8374                   tree tmp = TREE_OPERAND (arg0, 1);
8375                   tmp = build_function_call_expr (tanfn, tmp);
8376                   return fold_build2 (RDIV_EXPR, type,
8377                                       build_real (type, dconst1), tmp);
8378                 }
8379             }
8380
8381           /* Optimize pow(x,c)/x as pow(x,c-1).  */
8382           if (fcode0 == BUILT_IN_POW
8383               || fcode0 == BUILT_IN_POWF
8384               || fcode0 == BUILT_IN_POWL)
8385             {
8386               tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8387               tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
8388               if (TREE_CODE (arg01) == REAL_CST
8389                   && ! TREE_CONSTANT_OVERFLOW (arg01)
8390                   && operand_equal_p (arg1, arg00, 0))
8391                 {
8392                   tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8393                   REAL_VALUE_TYPE c;
8394                   tree arg, arglist;
8395
8396                   c = TREE_REAL_CST (arg01);
8397                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
8398                   arg = build_real (type, c);
8399                   arglist = build_tree_list (NULL_TREE, arg);
8400                   arglist = tree_cons (NULL_TREE, arg1, arglist);
8401                   return build_function_call_expr (powfn, arglist);
8402                 }
8403             }
8404         }
8405       goto binary;
8406
8407     case TRUNC_DIV_EXPR:
8408     case ROUND_DIV_EXPR:
8409     case FLOOR_DIV_EXPR:
8410     case CEIL_DIV_EXPR:
8411     case EXACT_DIV_EXPR:
8412       if (integer_onep (arg1))
8413         return non_lvalue (fold_convert (type, arg0));
8414       if (integer_zerop (arg1))
8415         return NULL_TREE;
8416       /* X / -1 is -X.  */
8417       if (!TYPE_UNSIGNED (type)
8418           && TREE_CODE (arg1) == INTEGER_CST
8419           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
8420           && TREE_INT_CST_HIGH (arg1) == -1)
8421         return fold_convert (type, negate_expr (arg0));
8422
8423       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
8424          operation, EXACT_DIV_EXPR.
8425
8426          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
8427          At one time others generated faster code, it's not clear if they do
8428          after the last round to changes to the DIV code in expmed.c.  */
8429       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
8430           && multiple_of_p (type, arg0, arg1))
8431         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
8432
8433       if (TREE_CODE (arg1) == INTEGER_CST
8434           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE)))
8435         return fold_convert (type, tem);
8436
8437       if (TREE_CODE (type) == COMPLEX_TYPE)
8438         {
8439           tem = fold_complex_div (type, arg0, arg1, code);
8440           if (tem)
8441             return tem;
8442         }
8443       goto binary;
8444
8445     case CEIL_MOD_EXPR:
8446     case FLOOR_MOD_EXPR:
8447     case ROUND_MOD_EXPR:
8448     case TRUNC_MOD_EXPR:
8449       /* X % 1 is always zero, but be sure to preserve any side
8450          effects in X.  */
8451       if (integer_onep (arg1))
8452         return omit_one_operand (type, integer_zero_node, arg0);
8453
8454       /* X % 0, return X % 0 unchanged so that we can get the
8455          proper warnings and errors.  */
8456       if (integer_zerop (arg1))
8457         return NULL_TREE;
8458
8459       /* 0 % X is always zero, but be sure to preserve any side
8460          effects in X.  Place this after checking for X == 0.  */
8461       if (integer_zerop (arg0))
8462         return omit_one_operand (type, integer_zero_node, arg1);
8463
8464       /* X % -1 is zero.  */
8465       if (!TYPE_UNSIGNED (type)
8466           && TREE_CODE (arg1) == INTEGER_CST
8467           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
8468           && TREE_INT_CST_HIGH (arg1) == -1)
8469         return omit_one_operand (type, integer_zero_node, arg0);
8470
8471       /* Optimize unsigned TRUNC_MOD_EXPR by a power of two into a
8472          BIT_AND_EXPR, i.e. "X % C" into "X & C2".  */
8473       if (code == TRUNC_MOD_EXPR
8474           && TYPE_UNSIGNED (type)
8475           && integer_pow2p (arg1))
8476         {
8477           unsigned HOST_WIDE_INT high, low;
8478           tree mask;
8479           int l;
8480
8481           l = tree_log2 (arg1);
8482           if (l >= HOST_BITS_PER_WIDE_INT)
8483             {
8484               high = ((unsigned HOST_WIDE_INT) 1
8485                       << (l - HOST_BITS_PER_WIDE_INT)) - 1;
8486               low = -1;
8487             }
8488           else
8489             {
8490               high = 0;
8491               low = ((unsigned HOST_WIDE_INT) 1 << l) - 1;
8492             }
8493
8494           mask = build_int_cst_wide (type, low, high);
8495           return fold_build2 (BIT_AND_EXPR, type,
8496                               fold_convert (type, arg0), mask);
8497         }
8498
8499       /* X % -C is the same as X % C.  */
8500       if (code == TRUNC_MOD_EXPR
8501           && !TYPE_UNSIGNED (type)
8502           && TREE_CODE (arg1) == INTEGER_CST
8503           && TREE_INT_CST_HIGH (arg1) < 0
8504           && !flag_trapv
8505           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
8506           && !sign_bit_p (arg1, arg1))
8507         return fold_build2 (code, type, fold_convert (type, arg0),
8508                             fold_convert (type, negate_expr (arg1)));
8509
8510       /* X % -Y is the same as X % Y.  */
8511       if (code == TRUNC_MOD_EXPR
8512           && !TYPE_UNSIGNED (type)
8513           && TREE_CODE (arg1) == NEGATE_EXPR
8514           && !flag_trapv)
8515         return fold_build2 (code, type, fold_convert (type, arg0),
8516                             fold_convert (type, TREE_OPERAND (arg1, 0)));
8517
8518       if (TREE_CODE (arg1) == INTEGER_CST
8519           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE)))
8520         return fold_convert (type, tem);
8521
8522       goto binary;
8523
8524     case LROTATE_EXPR:
8525     case RROTATE_EXPR:
8526       if (integer_all_onesp (arg0))
8527         return omit_one_operand (type, arg0, arg1);
8528       goto shift;
8529
8530     case RSHIFT_EXPR:
8531       /* Optimize -1 >> x for arithmetic right shifts.  */
8532       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
8533         return omit_one_operand (type, arg0, arg1);
8534       /* ... fall through ...  */
8535
8536     case LSHIFT_EXPR:
8537     shift:
8538       if (integer_zerop (arg1))
8539         return non_lvalue (fold_convert (type, arg0));
8540       if (integer_zerop (arg0))
8541         return omit_one_operand (type, arg0, arg1);
8542
8543       /* Since negative shift count is not well-defined,
8544          don't try to compute it in the compiler.  */
8545       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
8546         return NULL_TREE;
8547       /* Rewrite an LROTATE_EXPR by a constant into an
8548          RROTATE_EXPR by a new constant.  */
8549       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
8550         {
8551           tree tem = build_int_cst (NULL_TREE,
8552                                     GET_MODE_BITSIZE (TYPE_MODE (type)));
8553           tem = fold_convert (TREE_TYPE (arg1), tem);
8554           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
8555           return fold_build2 (RROTATE_EXPR, type, arg0, tem);
8556         }
8557
8558       /* If we have a rotate of a bit operation with the rotate count and
8559          the second operand of the bit operation both constant,
8560          permute the two operations.  */
8561       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
8562           && (TREE_CODE (arg0) == BIT_AND_EXPR
8563               || TREE_CODE (arg0) == BIT_IOR_EXPR
8564               || TREE_CODE (arg0) == BIT_XOR_EXPR)
8565           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8566         return fold_build2 (TREE_CODE (arg0), type,
8567                             fold_build2 (code, type,
8568                                          TREE_OPERAND (arg0, 0), arg1),
8569                             fold_build2 (code, type,
8570                                          TREE_OPERAND (arg0, 1), arg1));
8571
8572       /* Two consecutive rotates adding up to the width of the mode can
8573          be ignored.  */
8574       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
8575           && TREE_CODE (arg0) == RROTATE_EXPR
8576           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8577           && TREE_INT_CST_HIGH (arg1) == 0
8578           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
8579           && ((TREE_INT_CST_LOW (arg1)
8580                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
8581               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
8582         return TREE_OPERAND (arg0, 0);
8583
8584       goto binary;
8585
8586     case MIN_EXPR:
8587       if (operand_equal_p (arg0, arg1, 0))
8588         return omit_one_operand (type, arg0, arg1);
8589       if (INTEGRAL_TYPE_P (type)
8590           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
8591         return omit_one_operand (type, arg1, arg0);
8592       goto associate;
8593
8594     case MAX_EXPR:
8595       if (operand_equal_p (arg0, arg1, 0))
8596         return omit_one_operand (type, arg0, arg1);
8597       if (INTEGRAL_TYPE_P (type)
8598           && TYPE_MAX_VALUE (type)
8599           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
8600         return omit_one_operand (type, arg1, arg0);
8601       goto associate;
8602
8603     case TRUTH_ANDIF_EXPR:
8604       /* Note that the operands of this must be ints
8605          and their values must be 0 or 1.
8606          ("true" is a fixed value perhaps depending on the language.)  */
8607       /* If first arg is constant zero, return it.  */
8608       if (integer_zerop (arg0))
8609         return fold_convert (type, arg0);
8610     case TRUTH_AND_EXPR:
8611       /* If either arg is constant true, drop it.  */
8612       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8613         return non_lvalue (fold_convert (type, arg1));
8614       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
8615           /* Preserve sequence points.  */
8616           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
8617         return non_lvalue (fold_convert (type, arg0));
8618       /* If second arg is constant zero, result is zero, but first arg
8619          must be evaluated.  */
8620       if (integer_zerop (arg1))
8621         return omit_one_operand (type, arg1, arg0);
8622       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
8623          case will be handled here.  */
8624       if (integer_zerop (arg0))
8625         return omit_one_operand (type, arg0, arg1);
8626
8627       /* !X && X is always false.  */
8628       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8629           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8630         return omit_one_operand (type, integer_zero_node, arg1);
8631       /* X && !X is always false.  */
8632       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8633           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8634         return omit_one_operand (type, integer_zero_node, arg0);
8635
8636       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
8637          means A >= Y && A != MAX, but in this case we know that
8638          A < X <= MAX.  */
8639
8640       if (!TREE_SIDE_EFFECTS (arg0)
8641           && !TREE_SIDE_EFFECTS (arg1))
8642         {
8643           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
8644           if (tem)
8645             return fold_build2 (code, type, tem, arg1);
8646
8647           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
8648           if (tem)
8649             return fold_build2 (code, type, arg0, tem);
8650         }
8651
8652     truth_andor:
8653       /* We only do these simplifications if we are optimizing.  */
8654       if (!optimize)
8655         return NULL_TREE;
8656
8657       /* Check for things like (A || B) && (A || C).  We can convert this
8658          to A || (B && C).  Note that either operator can be any of the four
8659          truth and/or operations and the transformation will still be
8660          valid.   Also note that we only care about order for the
8661          ANDIF and ORIF operators.  If B contains side effects, this
8662          might change the truth-value of A.  */
8663       if (TREE_CODE (arg0) == TREE_CODE (arg1)
8664           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8665               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8666               || TREE_CODE (arg0) == TRUTH_AND_EXPR
8667               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8668           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
8669         {
8670           tree a00 = TREE_OPERAND (arg0, 0);
8671           tree a01 = TREE_OPERAND (arg0, 1);
8672           tree a10 = TREE_OPERAND (arg1, 0);
8673           tree a11 = TREE_OPERAND (arg1, 1);
8674           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8675                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8676                              && (code == TRUTH_AND_EXPR
8677                                  || code == TRUTH_OR_EXPR));
8678
8679           if (operand_equal_p (a00, a10, 0))
8680             return fold_build2 (TREE_CODE (arg0), type, a00,
8681                                 fold_build2 (code, type, a01, a11));
8682           else if (commutative && operand_equal_p (a00, a11, 0))
8683             return fold_build2 (TREE_CODE (arg0), type, a00,
8684                                 fold_build2 (code, type, a01, a10));
8685           else if (commutative && operand_equal_p (a01, a10, 0))
8686             return fold_build2 (TREE_CODE (arg0), type, a01,
8687                                 fold_build2 (code, type, a00, a11));
8688
8689           /* This case if tricky because we must either have commutative
8690              operators or else A10 must not have side-effects.  */
8691
8692           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8693                    && operand_equal_p (a01, a11, 0))
8694             return fold_build2 (TREE_CODE (arg0), type,
8695                                 fold_build2 (code, type, a00, a10),
8696                                 a01);
8697         }
8698
8699       /* See if we can build a range comparison.  */
8700       if (0 != (tem = fold_range_test (code, type, op0, op1)))
8701         return tem;
8702
8703       /* Check for the possibility of merging component references.  If our
8704          lhs is another similar operation, try to merge its rhs with our
8705          rhs.  Then try to merge our lhs and rhs.  */
8706       if (TREE_CODE (arg0) == code
8707           && 0 != (tem = fold_truthop (code, type,
8708                                        TREE_OPERAND (arg0, 1), arg1)))
8709         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8710
8711       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
8712         return tem;
8713
8714       return NULL_TREE;
8715
8716     case TRUTH_ORIF_EXPR:
8717       /* Note that the operands of this must be ints
8718          and their values must be 0 or true.
8719          ("true" is a fixed value perhaps depending on the language.)  */
8720       /* If first arg is constant true, return it.  */
8721       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8722         return fold_convert (type, arg0);
8723     case TRUTH_OR_EXPR:
8724       /* If either arg is constant zero, drop it.  */
8725       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
8726         return non_lvalue (fold_convert (type, arg1));
8727       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
8728           /* Preserve sequence points.  */
8729           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
8730         return non_lvalue (fold_convert (type, arg0));
8731       /* If second arg is constant true, result is true, but we must
8732          evaluate first arg.  */
8733       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
8734         return omit_one_operand (type, arg1, arg0);
8735       /* Likewise for first arg, but note this only occurs here for
8736          TRUTH_OR_EXPR.  */
8737       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8738         return omit_one_operand (type, arg0, arg1);
8739
8740       /* !X || X is always true.  */
8741       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8742           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8743         return omit_one_operand (type, integer_one_node, arg1);
8744       /* X || !X is always true.  */
8745       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8746           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8747         return omit_one_operand (type, integer_one_node, arg0);
8748
8749       goto truth_andor;
8750
8751     case TRUTH_XOR_EXPR:
8752       /* If the second arg is constant zero, drop it.  */
8753       if (integer_zerop (arg1))
8754         return non_lvalue (fold_convert (type, arg0));
8755       /* If the second arg is constant true, this is a logical inversion.  */
8756       if (integer_onep (arg1))
8757         {
8758           /* Only call invert_truthvalue if operand is a truth value.  */
8759           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8760             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
8761           else
8762             tem = invert_truthvalue (arg0);
8763           return non_lvalue (fold_convert (type, tem));
8764         }
8765       /* Identical arguments cancel to zero.  */
8766       if (operand_equal_p (arg0, arg1, 0))
8767         return omit_one_operand (type, integer_zero_node, arg0);
8768
8769       /* !X ^ X is always true.  */
8770       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8771           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8772         return omit_one_operand (type, integer_one_node, arg1);
8773
8774       /* X ^ !X is always true.  */
8775       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8776           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8777         return omit_one_operand (type, integer_one_node, arg0);
8778
8779       return NULL_TREE;
8780
8781     case EQ_EXPR:
8782     case NE_EXPR:
8783     case LT_EXPR:
8784     case GT_EXPR:
8785     case LE_EXPR:
8786     case GE_EXPR:
8787       /* If one arg is a real or integer constant, put it last.  */
8788       if (tree_swap_operands_p (arg0, arg1, true))
8789         return fold_build2 (swap_tree_comparison (code), type, arg1, arg0);
8790
8791       /* If this is an equality comparison of the address of a non-weak
8792          object against zero, then we know the result.  */
8793       if ((code == EQ_EXPR || code == NE_EXPR)
8794           && TREE_CODE (arg0) == ADDR_EXPR
8795           && DECL_P (TREE_OPERAND (arg0, 0))
8796           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8797           && integer_zerop (arg1))
8798         return constant_boolean_node (code != EQ_EXPR, type);
8799
8800       /* If this is an equality comparison of the address of two non-weak,
8801          unaliased symbols neither of which are extern (since we do not
8802          have access to attributes for externs), then we know the result.  */
8803       if ((code == EQ_EXPR || code == NE_EXPR)
8804           && TREE_CODE (arg0) == ADDR_EXPR
8805           && DECL_P (TREE_OPERAND (arg0, 0))
8806           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8807           && ! lookup_attribute ("alias",
8808                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
8809           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
8810           && TREE_CODE (arg1) == ADDR_EXPR
8811           && DECL_P (TREE_OPERAND (arg1, 0))
8812           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
8813           && ! lookup_attribute ("alias",
8814                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
8815           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
8816         return constant_boolean_node (operand_equal_p (arg0, arg1, 0)
8817                                       ? code == EQ_EXPR : code != EQ_EXPR,
8818                                       type);
8819
8820       /* If this is a comparison of two exprs that look like an
8821          ARRAY_REF of the same object, then we can fold this to a
8822          comparison of the two offsets.  */
8823       if (TREE_CODE_CLASS (code) == tcc_comparison)
8824         {
8825           tree base0, offset0, base1, offset1;
8826
8827           if (extract_array_ref (arg0, &base0, &offset0)
8828               && extract_array_ref (arg1, &base1, &offset1)
8829               && operand_equal_p (base0, base1, 0))
8830             {
8831               if (offset0 == NULL_TREE
8832                   && offset1 == NULL_TREE)
8833                 {
8834                   offset0 = integer_zero_node;
8835                   offset1 = integer_zero_node;
8836                 }
8837               else if (offset0 == NULL_TREE)
8838                 offset0 = build_int_cst (TREE_TYPE (offset1), 0);
8839               else if (offset1 == NULL_TREE)
8840                 offset1 = build_int_cst (TREE_TYPE (offset0), 0);
8841
8842               if (TREE_TYPE (offset0) == TREE_TYPE (offset1))
8843                 return fold_build2 (code, type, offset0, offset1);
8844             }
8845         }
8846
8847       if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8848         {
8849           tree targ0 = strip_float_extensions (arg0);
8850           tree targ1 = strip_float_extensions (arg1);
8851           tree newtype = TREE_TYPE (targ0);
8852
8853           if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8854             newtype = TREE_TYPE (targ1);
8855
8856           /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
8857           if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8858             return fold_build2 (code, type, fold_convert (newtype, targ0),
8859                                 fold_convert (newtype, targ1));
8860
8861           /* (-a) CMP (-b) -> b CMP a  */
8862           if (TREE_CODE (arg0) == NEGATE_EXPR
8863               && TREE_CODE (arg1) == NEGATE_EXPR)
8864             return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8865                                 TREE_OPERAND (arg0, 0));
8866
8867           if (TREE_CODE (arg1) == REAL_CST)
8868           {
8869             REAL_VALUE_TYPE cst;
8870             cst = TREE_REAL_CST (arg1);
8871
8872             /* (-a) CMP CST -> a swap(CMP) (-CST)  */
8873             if (TREE_CODE (arg0) == NEGATE_EXPR)
8874               return
8875                 fold_build2 (swap_tree_comparison (code), type,
8876                              TREE_OPERAND (arg0, 0),
8877                              build_real (TREE_TYPE (arg1),
8878                                          REAL_VALUE_NEGATE (cst)));
8879
8880             /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
8881             /* a CMP (-0) -> a CMP 0  */
8882             if (REAL_VALUE_MINUS_ZERO (cst))
8883               return fold_build2 (code, type, arg0,
8884                                   build_real (TREE_TYPE (arg1), dconst0));
8885
8886             /* x != NaN is always true, other ops are always false.  */
8887             if (REAL_VALUE_ISNAN (cst)
8888                 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8889               {
8890                 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8891                 return omit_one_operand (type, tem, arg0);
8892               }
8893
8894             /* Fold comparisons against infinity.  */
8895             if (REAL_VALUE_ISINF (cst))
8896               {
8897                 tem = fold_inf_compare (code, type, arg0, arg1);
8898                 if (tem != NULL_TREE)
8899                   return tem;
8900               }
8901           }
8902
8903           /* If this is a comparison of a real constant with a PLUS_EXPR
8904              or a MINUS_EXPR of a real constant, we can convert it into a
8905              comparison with a revised real constant as long as no overflow
8906              occurs when unsafe_math_optimizations are enabled.  */
8907           if (flag_unsafe_math_optimizations
8908               && TREE_CODE (arg1) == REAL_CST
8909               && (TREE_CODE (arg0) == PLUS_EXPR
8910                   || TREE_CODE (arg0) == MINUS_EXPR)
8911               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8912               && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8913                                           ? MINUS_EXPR : PLUS_EXPR,
8914                                           arg1, TREE_OPERAND (arg0, 1), 0))
8915               && ! TREE_CONSTANT_OVERFLOW (tem))
8916             return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8917
8918           /* Likewise, we can simplify a comparison of a real constant with
8919              a MINUS_EXPR whose first operand is also a real constant, i.e.
8920              (c1 - x) < c2 becomes x > c1-c2.  */
8921           if (flag_unsafe_math_optimizations
8922               && TREE_CODE (arg1) == REAL_CST
8923               && TREE_CODE (arg0) == MINUS_EXPR
8924               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8925               && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8926                                           arg1, 0))
8927               && ! TREE_CONSTANT_OVERFLOW (tem))
8928             return fold_build2 (swap_tree_comparison (code), type,
8929                                 TREE_OPERAND (arg0, 1), tem);
8930
8931           /* Fold comparisons against built-in math functions.  */
8932           if (TREE_CODE (arg1) == REAL_CST
8933               && flag_unsafe_math_optimizations
8934               && ! flag_errno_math)
8935             {
8936               enum built_in_function fcode = builtin_mathfn_code (arg0);
8937
8938               if (fcode != END_BUILTINS)
8939                 {
8940                   tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8941                   if (tem != NULL_TREE)
8942                     return tem;
8943                 }
8944             }
8945         }
8946
8947       /* Convert foo++ == CONST into ++foo == CONST + INCR.  */
8948       if (TREE_CONSTANT (arg1)
8949           && (TREE_CODE (arg0) == POSTINCREMENT_EXPR
8950               || TREE_CODE (arg0) == POSTDECREMENT_EXPR)
8951           /* This optimization is invalid for ordered comparisons
8952              if CONST+INCR overflows or if foo+incr might overflow.
8953              This optimization is invalid for floating point due to rounding.
8954              For pointer types we assume overflow doesn't happen.  */
8955           && (POINTER_TYPE_P (TREE_TYPE (arg0))
8956               || (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8957                   && (code == EQ_EXPR || code == NE_EXPR))))
8958         {
8959           tree varop, newconst;
8960
8961           if (TREE_CODE (arg0) == POSTINCREMENT_EXPR)
8962             {
8963               newconst = fold_build2 (PLUS_EXPR, TREE_TYPE (arg0),
8964                                       arg1, TREE_OPERAND (arg0, 1));
8965               varop = build2 (PREINCREMENT_EXPR, TREE_TYPE (arg0),
8966                               TREE_OPERAND (arg0, 0),
8967                               TREE_OPERAND (arg0, 1));
8968             }
8969           else
8970             {
8971               newconst = fold_build2 (MINUS_EXPR, TREE_TYPE (arg0),
8972                                       arg1, TREE_OPERAND (arg0, 1));
8973               varop = build2 (PREDECREMENT_EXPR, TREE_TYPE (arg0),
8974                               TREE_OPERAND (arg0, 0),
8975                               TREE_OPERAND (arg0, 1));
8976             }
8977
8978
8979           /* If VAROP is a reference to a bitfield, we must mask
8980              the constant by the width of the field.  */
8981           if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
8982               && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))
8983               && host_integerp (DECL_SIZE (TREE_OPERAND
8984                                            (TREE_OPERAND (varop, 0), 1)), 1))
8985             {
8986               tree fielddecl = TREE_OPERAND (TREE_OPERAND (varop, 0), 1);
8987               HOST_WIDE_INT size = tree_low_cst (DECL_SIZE (fielddecl), 1);
8988               tree folded_compare, shift;
8989
8990               /* First check whether the comparison would come out
8991                  always the same.  If we don't do that we would
8992                  change the meaning with the masking.  */
8993               folded_compare = fold_build2 (code, type,
8994                                             TREE_OPERAND (varop, 0), arg1);
8995               if (integer_zerop (folded_compare)
8996                   || integer_onep (folded_compare))
8997                 return omit_one_operand (type, folded_compare, varop);
8998
8999               shift = build_int_cst (NULL_TREE,
9000                                      TYPE_PRECISION (TREE_TYPE (varop)) - size);
9001               shift = fold_convert (TREE_TYPE (varop), shift);
9002               newconst = fold_build2 (LSHIFT_EXPR, TREE_TYPE (varop),
9003                                       newconst, shift);
9004               newconst = fold_build2 (RSHIFT_EXPR, TREE_TYPE (varop),
9005                                       newconst, shift);
9006             }
9007
9008           return fold_build2 (code, type, varop, newconst);
9009         }
9010
9011       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
9012          This transformation affects the cases which are handled in later
9013          optimizations involving comparisons with non-negative constants.  */
9014       if (TREE_CODE (arg1) == INTEGER_CST
9015           && TREE_CODE (arg0) != INTEGER_CST
9016           && tree_int_cst_sgn (arg1) > 0)
9017         {
9018           switch (code)
9019             {
9020             case GE_EXPR:
9021               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9022               return fold_build2 (GT_EXPR, type, arg0, arg1);
9023
9024             case LT_EXPR:
9025               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9026               return fold_build2 (LE_EXPR, type, arg0, arg1);
9027
9028             default:
9029               break;
9030             }
9031         }
9032
9033       /* Comparisons with the highest or lowest possible integer of
9034          the specified size will have known values.  */
9035       {
9036         int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg1)));
9037
9038         if (TREE_CODE (arg1) == INTEGER_CST
9039             && ! TREE_CONSTANT_OVERFLOW (arg1)
9040             && width <= 2 * HOST_BITS_PER_WIDE_INT
9041             && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9042                 || POINTER_TYPE_P (TREE_TYPE (arg1))))
9043           {
9044             HOST_WIDE_INT signed_max_hi;
9045             unsigned HOST_WIDE_INT signed_max_lo;
9046             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
9047
9048             if (width <= HOST_BITS_PER_WIDE_INT)
9049               {
9050                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
9051                                 - 1;
9052                 signed_max_hi = 0;
9053                 max_hi = 0;
9054
9055                 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
9056                   {
9057                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
9058                     min_lo = 0;
9059                     min_hi = 0;
9060                   }
9061                 else
9062                   {
9063                     max_lo = signed_max_lo;
9064                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
9065                     min_hi = -1;
9066                   }
9067               }
9068             else
9069               {
9070                 width -= HOST_BITS_PER_WIDE_INT;
9071                 signed_max_lo = -1;
9072                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
9073                                 - 1;
9074                 max_lo = -1;
9075                 min_lo = 0;
9076
9077                 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
9078                   {
9079                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
9080                     min_hi = 0;
9081                   }
9082                 else
9083                   {
9084                     max_hi = signed_max_hi;
9085                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
9086                   }
9087               }
9088
9089             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
9090                 && TREE_INT_CST_LOW (arg1) == max_lo)
9091               switch (code)
9092                 {
9093                 case GT_EXPR:
9094                   return omit_one_operand (type, integer_zero_node, arg0);
9095
9096                 case GE_EXPR:
9097                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9098
9099                 case LE_EXPR:
9100                   return omit_one_operand (type, integer_one_node, arg0);
9101
9102                 case LT_EXPR:
9103                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9104
9105                 /* The GE_EXPR and LT_EXPR cases above are not normally
9106                    reached because of previous transformations.  */
9107
9108                 default:
9109                   break;
9110                 }
9111             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9112                      == max_hi
9113                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
9114               switch (code)
9115                 {
9116                 case GT_EXPR:
9117                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
9118                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9119                 case LE_EXPR:
9120                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
9121                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9122                 default:
9123                   break;
9124                 }
9125             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9126                      == min_hi
9127                      && TREE_INT_CST_LOW (arg1) == min_lo)
9128               switch (code)
9129                 {
9130                 case LT_EXPR:
9131                   return omit_one_operand (type, integer_zero_node, arg0);
9132
9133                 case LE_EXPR:
9134                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9135
9136                 case GE_EXPR:
9137                   return omit_one_operand (type, integer_one_node, arg0);
9138
9139                 case GT_EXPR:
9140                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9141
9142                 default:
9143                   break;
9144                 }
9145             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9146                      == min_hi
9147                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
9148               switch (code)
9149                 {
9150                 case GE_EXPR:
9151                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9152                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9153                 case LT_EXPR:
9154                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9155                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9156                 default:
9157                   break;
9158                 }
9159
9160             else if (!in_gimple_form
9161                      && TREE_INT_CST_HIGH (arg1) == signed_max_hi
9162                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
9163                      && TYPE_UNSIGNED (TREE_TYPE (arg1))
9164                      /* signed_type does not work on pointer types.  */
9165                      && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9166               {
9167                 /* The following case also applies to X < signed_max+1
9168                    and X >= signed_max+1 because previous transformations.  */
9169                 if (code == LE_EXPR || code == GT_EXPR)
9170                   {
9171                     tree st0, st1;
9172                     st0 = lang_hooks.types.signed_type (TREE_TYPE (arg0));
9173                     st1 = lang_hooks.types.signed_type (TREE_TYPE (arg1));
9174                     return fold
9175                       (build2 (code == LE_EXPR ? GE_EXPR: LT_EXPR,
9176                                type, fold_convert (st0, arg0),
9177                                fold_convert (st1, integer_zero_node)));
9178                   }
9179               }
9180           }
9181       }
9182
9183       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
9184          a MINUS_EXPR of a constant, we can convert it into a comparison with
9185          a revised constant as long as no overflow occurs.  */
9186       if ((code == EQ_EXPR || code == NE_EXPR)
9187           && TREE_CODE (arg1) == INTEGER_CST
9188           && (TREE_CODE (arg0) == PLUS_EXPR
9189               || TREE_CODE (arg0) == MINUS_EXPR)
9190           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9191           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9192                                       ? MINUS_EXPR : PLUS_EXPR,
9193                                       arg1, TREE_OPERAND (arg0, 1), 0))
9194           && ! TREE_CONSTANT_OVERFLOW (tem))
9195         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9196
9197       /* Similarly for a NEGATE_EXPR.  */
9198       else if ((code == EQ_EXPR || code == NE_EXPR)
9199                && TREE_CODE (arg0) == NEGATE_EXPR
9200                && TREE_CODE (arg1) == INTEGER_CST
9201                && 0 != (tem = negate_expr (arg1))
9202                && TREE_CODE (tem) == INTEGER_CST
9203                && ! TREE_CONSTANT_OVERFLOW (tem))
9204         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9205
9206       /* If we have X - Y == 0, we can convert that to X == Y and similarly
9207          for !=.  Don't do this for ordered comparisons due to overflow.  */
9208       else if ((code == NE_EXPR || code == EQ_EXPR)
9209                && integer_zerop (arg1) && TREE_CODE (arg0) == MINUS_EXPR)
9210         return fold_build2 (code, type,
9211                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
9212
9213       else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9214                && (TREE_CODE (arg0) == NOP_EXPR
9215                    || TREE_CODE (arg0) == CONVERT_EXPR))
9216         {
9217           /* If we are widening one operand of an integer comparison,
9218              see if the other operand is similarly being widened.  Perhaps we
9219              can do the comparison in the narrower type.  */
9220           tem = fold_widened_comparison (code, type, arg0, arg1);
9221           if (tem)
9222             return tem;
9223
9224           /* Or if we are changing signedness.  */
9225           tem = fold_sign_changed_comparison (code, type, arg0, arg1);
9226           if (tem)
9227             return tem;
9228         }
9229
9230       /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9231          constant, we can simplify it.  */
9232       else if (TREE_CODE (arg1) == INTEGER_CST
9233                && (TREE_CODE (arg0) == MIN_EXPR
9234                    || TREE_CODE (arg0) == MAX_EXPR)
9235                && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9236         {
9237           tem = optimize_minmax_comparison (code, type, op0, op1);
9238           if (tem)
9239             return tem;
9240
9241           return NULL_TREE;
9242         }
9243
9244       /* If we are comparing an ABS_EXPR with a constant, we can
9245          convert all the cases into explicit comparisons, but they may
9246          well not be faster than doing the ABS and one comparison.
9247          But ABS (X) <= C is a range comparison, which becomes a subtraction
9248          and a comparison, and is probably faster.  */
9249       else if (code == LE_EXPR && TREE_CODE (arg1) == INTEGER_CST
9250                && TREE_CODE (arg0) == ABS_EXPR
9251                && ! TREE_SIDE_EFFECTS (arg0)
9252                && (0 != (tem = negate_expr (arg1)))
9253                && TREE_CODE (tem) == INTEGER_CST
9254                && ! TREE_CONSTANT_OVERFLOW (tem))
9255         return fold_build2 (TRUTH_ANDIF_EXPR, type,
9256                             build2 (GE_EXPR, type,
9257                                     TREE_OPERAND (arg0, 0), tem),
9258                             build2 (LE_EXPR, type,
9259                                     TREE_OPERAND (arg0, 0), arg1));
9260
9261       /* Convert ABS_EXPR<x> >= 0 to true.  */
9262       else if (code == GE_EXPR
9263                && tree_expr_nonnegative_p (arg0)
9264                && (integer_zerop (arg1)
9265                    || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9266                        && real_zerop (arg1))))
9267         return omit_one_operand (type, integer_one_node, arg0);
9268
9269       /* Convert ABS_EXPR<x> < 0 to false.  */
9270       else if (code == LT_EXPR
9271                && tree_expr_nonnegative_p (arg0)
9272                && (integer_zerop (arg1) || real_zerop (arg1)))
9273         return omit_one_operand (type, integer_zero_node, arg0);
9274
9275       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
9276       else if ((code == EQ_EXPR || code == NE_EXPR)
9277                && TREE_CODE (arg0) == ABS_EXPR
9278                && (integer_zerop (arg1) || real_zerop (arg1)))
9279         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
9280
9281       /* If this is an EQ or NE comparison with zero and ARG0 is
9282          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
9283          two operations, but the latter can be done in one less insn
9284          on machines that have only two-operand insns or on which a
9285          constant cannot be the first operand.  */
9286       if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
9287           && TREE_CODE (arg0) == BIT_AND_EXPR)
9288         {
9289           tree arg00 = TREE_OPERAND (arg0, 0);
9290           tree arg01 = TREE_OPERAND (arg0, 1);
9291           if (TREE_CODE (arg00) == LSHIFT_EXPR
9292               && integer_onep (TREE_OPERAND (arg00, 0)))
9293             return
9294               fold_build2 (code, type,
9295                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9296                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
9297                                            arg01, TREE_OPERAND (arg00, 1)),
9298                                    fold_convert (TREE_TYPE (arg0),
9299                                                  integer_one_node)),
9300                            arg1);
9301           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
9302                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
9303             return
9304               fold_build2 (code, type,
9305                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9306                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
9307                                            arg00, TREE_OPERAND (arg01, 1)),
9308                                    fold_convert (TREE_TYPE (arg0),
9309                                                  integer_one_node)),
9310                            arg1);
9311         }
9312
9313       /* If this is an NE or EQ comparison of zero against the result of a
9314          signed MOD operation whose second operand is a power of 2, make
9315          the MOD operation unsigned since it is simpler and equivalent.  */
9316       if ((code == NE_EXPR || code == EQ_EXPR)
9317           && integer_zerop (arg1)
9318           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
9319           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
9320               || TREE_CODE (arg0) == CEIL_MOD_EXPR
9321               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
9322               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
9323           && integer_pow2p (TREE_OPERAND (arg0, 1)))
9324         {
9325           tree newtype = lang_hooks.types.unsigned_type (TREE_TYPE (arg0));
9326           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
9327                                      fold_convert (newtype,
9328                                                    TREE_OPERAND (arg0, 0)),
9329                                      fold_convert (newtype,
9330                                                    TREE_OPERAND (arg0, 1)));
9331
9332           return fold_build2 (code, type, newmod,
9333                               fold_convert (newtype, arg1));
9334         }
9335
9336       /* If this is an NE comparison of zero with an AND of one, remove the
9337          comparison since the AND will give the correct value.  */
9338       if (code == NE_EXPR && integer_zerop (arg1)
9339           && TREE_CODE (arg0) == BIT_AND_EXPR
9340           && integer_onep (TREE_OPERAND (arg0, 1)))
9341         return fold_convert (type, arg0);
9342
9343       /* If we have (A & C) == C where C is a power of 2, convert this into
9344          (A & C) != 0.  Similarly for NE_EXPR.  */
9345       if ((code == EQ_EXPR || code == NE_EXPR)
9346           && TREE_CODE (arg0) == BIT_AND_EXPR
9347           && integer_pow2p (TREE_OPERAND (arg0, 1))
9348           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9349         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
9350                             arg0, fold_convert (TREE_TYPE (arg0),
9351                                                 integer_zero_node));
9352
9353       /* If we have (A & C) != 0 or (A & C) == 0 and C is a power of
9354          2, then fold the expression into shifts and logical operations.  */
9355       tem = fold_single_bit_test (code, arg0, arg1, type);
9356       if (tem)
9357         return tem;
9358
9359       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
9360          Similarly for NE_EXPR.  */
9361       if ((code == EQ_EXPR || code == NE_EXPR)
9362           && TREE_CODE (arg0) == BIT_AND_EXPR
9363           && TREE_CODE (arg1) == INTEGER_CST
9364           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9365         {
9366           tree notc = fold_build1 (BIT_NOT_EXPR,
9367                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
9368                                    TREE_OPERAND (arg0, 1));
9369           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9370                                        arg1, notc);
9371           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
9372           if (integer_nonzerop (dandnotc))
9373             return omit_one_operand (type, rslt, arg0);
9374         }
9375
9376       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
9377          Similarly for NE_EXPR.  */
9378       if ((code == EQ_EXPR || code == NE_EXPR)
9379           && TREE_CODE (arg0) == BIT_IOR_EXPR
9380           && TREE_CODE (arg1) == INTEGER_CST
9381           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9382         {
9383           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
9384           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9385                                        TREE_OPERAND (arg0, 1), notd);
9386           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
9387           if (integer_nonzerop (candnotd))
9388             return omit_one_operand (type, rslt, arg0);
9389         }
9390
9391       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
9392          and similarly for >= into !=.  */
9393       if ((code == LT_EXPR || code == GE_EXPR)
9394           && TYPE_UNSIGNED (TREE_TYPE (arg0))
9395           && TREE_CODE (arg1) == LSHIFT_EXPR
9396           && integer_onep (TREE_OPERAND (arg1, 0)))
9397         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
9398                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
9399                                TREE_OPERAND (arg1, 1)),
9400                        fold_convert (TREE_TYPE (arg0), integer_zero_node));
9401
9402       else if ((code == LT_EXPR || code == GE_EXPR)
9403                && TYPE_UNSIGNED (TREE_TYPE (arg0))
9404                && (TREE_CODE (arg1) == NOP_EXPR
9405                    || TREE_CODE (arg1) == CONVERT_EXPR)
9406                && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
9407                && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
9408         return
9409           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
9410                   fold_convert (TREE_TYPE (arg0),
9411                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
9412                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
9413                                                       1))),
9414                   fold_convert (TREE_TYPE (arg0), integer_zero_node));
9415
9416       /* Simplify comparison of something with itself.  (For IEEE
9417          floating-point, we can only do some of these simplifications.)  */
9418       if (operand_equal_p (arg0, arg1, 0))
9419         {
9420           switch (code)
9421             {
9422             case EQ_EXPR:
9423               if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9424                   || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9425                 return constant_boolean_node (1, type);
9426               break;
9427
9428             case GE_EXPR:
9429             case LE_EXPR:
9430               if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9431                   || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9432                 return constant_boolean_node (1, type);
9433               return fold_build2 (EQ_EXPR, type, arg0, arg1);
9434
9435             case NE_EXPR:
9436               /* For NE, we can only do this simplification if integer
9437                  or we don't honor IEEE floating point NaNs.  */
9438               if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9439                   && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9440                 break;
9441               /* ... fall through ...  */
9442             case GT_EXPR:
9443             case LT_EXPR:
9444               return constant_boolean_node (0, type);
9445             default:
9446               gcc_unreachable ();
9447             }
9448         }
9449
9450       /* If we are comparing an expression that just has comparisons
9451          of two integer values, arithmetic expressions of those comparisons,
9452          and constants, we can simplify it.  There are only three cases
9453          to check: the two values can either be equal, the first can be
9454          greater, or the second can be greater.  Fold the expression for
9455          those three values.  Since each value must be 0 or 1, we have
9456          eight possibilities, each of which corresponds to the constant 0
9457          or 1 or one of the six possible comparisons.
9458
9459          This handles common cases like (a > b) == 0 but also handles
9460          expressions like  ((x > y) - (y > x)) > 0, which supposedly
9461          occur in macroized code.  */
9462
9463       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9464         {
9465           tree cval1 = 0, cval2 = 0;
9466           int save_p = 0;
9467
9468           if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9469               /* Don't handle degenerate cases here; they should already
9470                  have been handled anyway.  */
9471               && cval1 != 0 && cval2 != 0
9472               && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9473               && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9474               && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9475               && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9476               && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9477               && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9478                                     TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9479             {
9480               tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9481               tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9482
9483               /* We can't just pass T to eval_subst in case cval1 or cval2
9484                  was the same as ARG1.  */
9485
9486               tree high_result
9487                 = fold_build2 (code, type,
9488                                eval_subst (arg0, cval1, maxval,
9489                                            cval2, minval),
9490                                arg1);
9491               tree equal_result
9492                 = fold_build2 (code, type,
9493                                eval_subst (arg0, cval1, maxval,
9494                                            cval2, maxval),
9495                                arg1);
9496               tree low_result
9497                 = fold_build2 (code, type,
9498                                eval_subst (arg0, cval1, minval,
9499                                            cval2, maxval),
9500                                arg1);
9501
9502               /* All three of these results should be 0 or 1.  Confirm they
9503                  are.  Then use those values to select the proper code
9504                  to use.  */
9505
9506               if ((integer_zerop (high_result)
9507                    || integer_onep (high_result))
9508                   && (integer_zerop (equal_result)
9509                       || integer_onep (equal_result))
9510                   && (integer_zerop (low_result)
9511                       || integer_onep (low_result)))
9512                 {
9513                   /* Make a 3-bit mask with the high-order bit being the
9514                      value for `>', the next for '=', and the low for '<'.  */
9515                   switch ((integer_onep (high_result) * 4)
9516                           + (integer_onep (equal_result) * 2)
9517                           + integer_onep (low_result))
9518                     {
9519                     case 0:
9520                       /* Always false.  */
9521                       return omit_one_operand (type, integer_zero_node, arg0);
9522                     case 1:
9523                       code = LT_EXPR;
9524                       break;
9525                     case 2:
9526                       code = EQ_EXPR;
9527                       break;
9528                     case 3:
9529                       code = LE_EXPR;
9530                       break;
9531                     case 4:
9532                       code = GT_EXPR;
9533                       break;
9534                     case 5:
9535                       code = NE_EXPR;
9536                       break;
9537                     case 6:
9538                       code = GE_EXPR;
9539                       break;
9540                     case 7:
9541                       /* Always true.  */
9542                       return omit_one_operand (type, integer_one_node, arg0);
9543                     }
9544
9545                   if (save_p)
9546                     return save_expr (build2 (code, type, cval1, cval2));
9547                   else
9548                     return fold_build2 (code, type, cval1, cval2);
9549                 }
9550             }
9551         }
9552
9553       /* If this is a comparison of a field, we may be able to simplify it.  */
9554       if (((TREE_CODE (arg0) == COMPONENT_REF
9555             && lang_hooks.can_use_bit_fields_p ())
9556            || TREE_CODE (arg0) == BIT_FIELD_REF)
9557           && (code == EQ_EXPR || code == NE_EXPR)
9558           /* Handle the constant case even without -O
9559              to make sure the warnings are given.  */
9560           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
9561         {
9562           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
9563           if (t1)
9564             return t1;
9565         }
9566
9567       /* If this is a comparison of complex values and either or both sides
9568          are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
9569          comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
9570          This may prevent needless evaluations.  */
9571       if ((code == EQ_EXPR || code == NE_EXPR)
9572           && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
9573           && (TREE_CODE (arg0) == COMPLEX_EXPR
9574               || TREE_CODE (arg1) == COMPLEX_EXPR
9575               || TREE_CODE (arg0) == COMPLEX_CST
9576               || TREE_CODE (arg1) == COMPLEX_CST))
9577         {
9578           tree subtype = TREE_TYPE (TREE_TYPE (arg0));
9579           tree real0, imag0, real1, imag1;
9580
9581           arg0 = save_expr (arg0);
9582           arg1 = save_expr (arg1);
9583           real0 = fold_build1 (REALPART_EXPR, subtype, arg0);
9584           imag0 = fold_build1 (IMAGPART_EXPR, subtype, arg0);
9585           real1 = fold_build1 (REALPART_EXPR, subtype, arg1);
9586           imag1 = fold_build1 (IMAGPART_EXPR, subtype, arg1);
9587
9588           return fold_build2 ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
9589                                : TRUTH_ORIF_EXPR),
9590                               type,
9591                               fold_build2 (code, type, real0, real1),
9592                               fold_build2 (code, type, imag0, imag1));
9593         }
9594
9595       /* Optimize comparisons of strlen vs zero to a compare of the
9596          first character of the string vs zero.  To wit,
9597                 strlen(ptr) == 0   =>  *ptr == 0
9598                 strlen(ptr) != 0   =>  *ptr != 0
9599          Other cases should reduce to one of these two (or a constant)
9600          due to the return value of strlen being unsigned.  */
9601       if ((code == EQ_EXPR || code == NE_EXPR)
9602           && integer_zerop (arg1)
9603           && TREE_CODE (arg0) == CALL_EXPR)
9604         {
9605           tree fndecl = get_callee_fndecl (arg0);
9606           tree arglist;
9607
9608           if (fndecl
9609               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
9610               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
9611               && (arglist = TREE_OPERAND (arg0, 1))
9612               && TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
9613               && ! TREE_CHAIN (arglist))
9614             return fold_build2 (code, type,
9615                                 build1 (INDIRECT_REF, char_type_node,
9616                                         TREE_VALUE (arglist)),
9617                                 fold_convert (char_type_node,
9618                                               integer_zero_node));
9619         }
9620
9621       /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9622          into a single range test.  */
9623       if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9624            || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9625           && TREE_CODE (arg1) == INTEGER_CST
9626           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9627           && !integer_zerop (TREE_OPERAND (arg0, 1))
9628           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9629           && !TREE_OVERFLOW (arg1))
9630         {
9631           t1 = fold_div_compare (code, type, arg0, arg1);
9632           if (t1 != NULL_TREE)
9633             return t1;
9634         }
9635
9636       if ((code == EQ_EXPR || code == NE_EXPR)
9637           && !TREE_SIDE_EFFECTS (arg0)
9638           && integer_zerop (arg1)
9639           && tree_expr_nonzero_p (arg0))
9640         return constant_boolean_node (code==NE_EXPR, type);
9641
9642       t1 = fold_relational_const (code, type, arg0, arg1);
9643       return t1 == NULL_TREE ? NULL_TREE : t1;
9644
9645     case UNORDERED_EXPR:
9646     case ORDERED_EXPR:
9647     case UNLT_EXPR:
9648     case UNLE_EXPR:
9649     case UNGT_EXPR:
9650     case UNGE_EXPR:
9651     case UNEQ_EXPR:
9652     case LTGT_EXPR:
9653       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9654         {
9655           t1 = fold_relational_const (code, type, arg0, arg1);
9656           if (t1 != NULL_TREE)
9657             return t1;
9658         }
9659
9660       /* If the first operand is NaN, the result is constant.  */
9661       if (TREE_CODE (arg0) == REAL_CST
9662           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
9663           && (code != LTGT_EXPR || ! flag_trapping_math))
9664         {
9665           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
9666                ? integer_zero_node
9667                : integer_one_node;
9668           return omit_one_operand (type, t1, arg1);
9669         }
9670
9671       /* If the second operand is NaN, the result is constant.  */
9672       if (TREE_CODE (arg1) == REAL_CST
9673           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
9674           && (code != LTGT_EXPR || ! flag_trapping_math))
9675         {
9676           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
9677                ? integer_zero_node
9678                : integer_one_node;
9679           return omit_one_operand (type, t1, arg0);
9680         }
9681
9682       /* Simplify unordered comparison of something with itself.  */
9683       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
9684           && operand_equal_p (arg0, arg1, 0))
9685         return constant_boolean_node (1, type);
9686
9687       if (code == LTGT_EXPR
9688           && !flag_trapping_math
9689           && operand_equal_p (arg0, arg1, 0))
9690         return constant_boolean_node (0, type);
9691
9692       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9693       {
9694         tree targ0 = strip_float_extensions (arg0);
9695         tree targ1 = strip_float_extensions (arg1);
9696         tree newtype = TREE_TYPE (targ0);
9697
9698         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9699           newtype = TREE_TYPE (targ1);
9700
9701         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9702           return fold_build2 (code, type, fold_convert (newtype, targ0),
9703                               fold_convert (newtype, targ1));
9704       }
9705
9706       return NULL_TREE;
9707
9708     case COMPOUND_EXPR:
9709       /* When pedantic, a compound expression can be neither an lvalue
9710          nor an integer constant expression.  */
9711       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
9712         return NULL_TREE;
9713       /* Don't let (0, 0) be null pointer constant.  */
9714       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
9715                                  : fold_convert (type, arg1);
9716       return pedantic_non_lvalue (tem);
9717
9718     case COMPLEX_EXPR:
9719       if (wins)
9720         return build_complex (type, arg0, arg1);
9721       return NULL_TREE;
9722
9723     default:
9724       return NULL_TREE;
9725     } /* switch (code) */
9726 }
9727
9728 /* Fold a ternary expression of code CODE and type TYPE with operands
9729    OP0, OP1, and OP2.  Return the folded expression if folding is
9730    successful.  Otherwise, return NULL_TREE.  */
9731
9732 static tree
9733 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
9734 {
9735   tree tem;
9736   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
9737   enum tree_code_class kind = TREE_CODE_CLASS (code);
9738
9739   gcc_assert (IS_EXPR_CODE_CLASS (kind)
9740               && TREE_CODE_LENGTH (code) == 3);
9741
9742   /* Strip any conversions that don't change the mode.  This is safe
9743      for every expression, except for a comparison expression because
9744      its signedness is derived from its operands.  So, in the latter
9745      case, only strip conversions that don't change the signedness.
9746
9747      Note that this is done as an internal manipulation within the
9748      constant folder, in order to find the simplest representation of
9749      the arguments so that their form can be studied.  In any cases,
9750      the appropriate type conversions should be put back in the tree
9751      that will get out of the constant folder.  */
9752   if (op0)
9753     {
9754       arg0 = op0;
9755       STRIP_NOPS (arg0);
9756     }
9757
9758   if (op1)
9759     {
9760       arg1 = op1;
9761       STRIP_NOPS (arg1);
9762     }
9763
9764   switch (code)
9765     {
9766     case COMPONENT_REF:
9767       if (TREE_CODE (arg0) == CONSTRUCTOR
9768           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
9769         {
9770           tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
9771           if (m)
9772             return TREE_VALUE (m);
9773         }
9774       return NULL_TREE;
9775
9776     case COND_EXPR:
9777       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
9778          so all simple results must be passed through pedantic_non_lvalue.  */
9779       if (TREE_CODE (arg0) == INTEGER_CST)
9780         {
9781           tem = integer_zerop (arg0) ? op2 : op1;
9782           /* Only optimize constant conditions when the selected branch
9783              has the same type as the COND_EXPR.  This avoids optimizing
9784              away "c ? x : throw", where the throw has a void type.  */
9785           if (! VOID_TYPE_P (TREE_TYPE (tem))
9786               || VOID_TYPE_P (type))
9787             return pedantic_non_lvalue (tem);
9788           return NULL_TREE;
9789         }
9790       if (operand_equal_p (arg1, op2, 0))
9791         return pedantic_omit_one_operand (type, arg1, arg0);
9792
9793       /* If we have A op B ? A : C, we may be able to convert this to a
9794          simpler expression, depending on the operation and the values
9795          of B and C.  Signed zeros prevent all of these transformations,
9796          for reasons given above each one.
9797
9798          Also try swapping the arguments and inverting the conditional.  */
9799       if (COMPARISON_CLASS_P (arg0)
9800           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
9801                                              arg1, TREE_OPERAND (arg0, 1))
9802           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
9803         {
9804           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
9805           if (tem)
9806             return tem;
9807         }
9808
9809       if (COMPARISON_CLASS_P (arg0)
9810           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
9811                                              op2,
9812                                              TREE_OPERAND (arg0, 1))
9813           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
9814         {
9815           tem = invert_truthvalue (arg0);
9816           if (COMPARISON_CLASS_P (tem))
9817             {
9818               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
9819               if (tem)
9820                 return tem;
9821             }
9822         }
9823
9824       /* If the second operand is simpler than the third, swap them
9825          since that produces better jump optimization results.  */
9826       if (tree_swap_operands_p (op1, op2, false))
9827         {
9828           /* See if this can be inverted.  If it can't, possibly because
9829              it was a floating-point inequality comparison, don't do
9830              anything.  */
9831           tem = invert_truthvalue (arg0);
9832
9833           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
9834             return fold_build3 (code, type, tem, op2, op1);
9835         }
9836
9837       /* Convert A ? 1 : 0 to simply A.  */
9838       if (integer_onep (op1)
9839           && integer_zerop (op2)
9840           /* If we try to convert OP0 to our type, the
9841              call to fold will try to move the conversion inside
9842              a COND, which will recurse.  In that case, the COND_EXPR
9843              is probably the best choice, so leave it alone.  */
9844           && type == TREE_TYPE (arg0))
9845         return pedantic_non_lvalue (arg0);
9846
9847       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
9848          over COND_EXPR in cases such as floating point comparisons.  */
9849       if (integer_zerop (op1)
9850           && integer_onep (op2)
9851           && truth_value_p (TREE_CODE (arg0)))
9852         return pedantic_non_lvalue (fold_convert (type,
9853                                                   invert_truthvalue (arg0)));
9854
9855       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
9856       if (TREE_CODE (arg0) == LT_EXPR
9857           && integer_zerop (TREE_OPERAND (arg0, 1))
9858           && integer_zerop (op2)
9859           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
9860         return fold_convert (type, fold_build2 (BIT_AND_EXPR,
9861                                                 TREE_TYPE (tem), tem, arg1));
9862
9863       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
9864          already handled above.  */
9865       if (TREE_CODE (arg0) == BIT_AND_EXPR
9866           && integer_onep (TREE_OPERAND (arg0, 1))
9867           && integer_zerop (op2)
9868           && integer_pow2p (arg1))
9869         {
9870           tree tem = TREE_OPERAND (arg0, 0);
9871           STRIP_NOPS (tem);
9872           if (TREE_CODE (tem) == RSHIFT_EXPR
9873               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
9874               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
9875                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
9876             return fold_build2 (BIT_AND_EXPR, type,
9877                                 TREE_OPERAND (tem, 0), arg1);
9878         }
9879
9880       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
9881          is probably obsolete because the first operand should be a
9882          truth value (that's why we have the two cases above), but let's
9883          leave it in until we can confirm this for all front-ends.  */
9884       if (integer_zerop (op2)
9885           && TREE_CODE (arg0) == NE_EXPR
9886           && integer_zerop (TREE_OPERAND (arg0, 1))
9887           && integer_pow2p (arg1)
9888           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
9889           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
9890                               arg1, OEP_ONLY_CONST))
9891         return pedantic_non_lvalue (fold_convert (type,
9892                                                   TREE_OPERAND (arg0, 0)));
9893
9894       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
9895       if (integer_zerop (op2)
9896           && truth_value_p (TREE_CODE (arg0))
9897           && truth_value_p (TREE_CODE (arg1)))
9898         return fold_build2 (TRUTH_ANDIF_EXPR, type, arg0, arg1);
9899
9900       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
9901       if (integer_onep (op2)
9902           && truth_value_p (TREE_CODE (arg0))
9903           && truth_value_p (TREE_CODE (arg1)))
9904         {
9905           /* Only perform transformation if ARG0 is easily inverted.  */
9906           tem = invert_truthvalue (arg0);
9907           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
9908             return fold_build2 (TRUTH_ORIF_EXPR, type, tem, arg1);
9909         }
9910
9911       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
9912       if (integer_zerop (arg1)
9913           && truth_value_p (TREE_CODE (arg0))
9914           && truth_value_p (TREE_CODE (op2)))
9915         {
9916           /* Only perform transformation if ARG0 is easily inverted.  */
9917           tem = invert_truthvalue (arg0);
9918           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
9919             return fold_build2 (TRUTH_ANDIF_EXPR, type, tem, op2);
9920         }
9921
9922       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
9923       if (integer_onep (arg1)
9924           && truth_value_p (TREE_CODE (arg0))
9925           && truth_value_p (TREE_CODE (op2)))
9926         return fold_build2 (TRUTH_ORIF_EXPR, type, arg0, op2);
9927
9928       return NULL_TREE;
9929
9930     case CALL_EXPR:
9931       /* Check for a built-in function.  */
9932       if (TREE_CODE (op0) == ADDR_EXPR
9933           && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
9934           && DECL_BUILT_IN (TREE_OPERAND (op0, 0)))
9935         {
9936           tree fndecl = TREE_OPERAND (op0, 0);
9937           tree arglist = op1;
9938           tree tmp = fold_builtin (fndecl, arglist, false);
9939           if (tmp)
9940             return tmp;
9941         }
9942       return NULL_TREE;
9943
9944     default:
9945       return NULL_TREE;
9946     } /* switch (code) */
9947 }
9948
9949 /* Perform constant folding and related simplification of EXPR.
9950    The related simplifications include x*1 => x, x*0 => 0, etc.,
9951    and application of the associative law.
9952    NOP_EXPR conversions may be removed freely (as long as we
9953    are careful not to change the type of the overall expression).
9954    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
9955    but we can constant-fold them if they have constant operands.  */
9956
9957 #ifdef ENABLE_FOLD_CHECKING
9958 # define fold(x) fold_1 (x)
9959 static tree fold_1 (tree);
9960 static
9961 #endif
9962 tree
9963 fold (tree expr)
9964 {
9965   const tree t = expr;
9966   enum tree_code code = TREE_CODE (t);
9967   enum tree_code_class kind = TREE_CODE_CLASS (code);
9968   tree tem;
9969
9970   /* Return right away if a constant.  */
9971   if (kind == tcc_constant)
9972     return t;
9973
9974   if (IS_EXPR_CODE_CLASS (kind))
9975     {
9976       tree type = TREE_TYPE (t);
9977       tree op0, op1, op2;
9978
9979       switch (TREE_CODE_LENGTH (code))
9980         {
9981         case 1:
9982           op0 = TREE_OPERAND (t, 0);
9983           tem = fold_unary (code, type, op0);
9984           return tem ? tem : expr;
9985         case 2:
9986           op0 = TREE_OPERAND (t, 0);
9987           op1 = TREE_OPERAND (t, 1);
9988           tem = fold_binary (code, type, op0, op1);
9989           return tem ? tem : expr;
9990         case 3:
9991           op0 = TREE_OPERAND (t, 0);
9992           op1 = TREE_OPERAND (t, 1);
9993           op2 = TREE_OPERAND (t, 2);
9994           tem = fold_ternary (code, type, op0, op1, op2);
9995           return tem ? tem : expr;
9996         default:
9997           break;
9998         }
9999     }
10000
10001   switch (code)
10002     {
10003     case CONST_DECL:
10004       return fold (DECL_INITIAL (t));
10005
10006     case ASSERT_EXPR:
10007       {
10008         /* Given ASSERT_EXPR <Y, COND>, return Y if COND can be folded
10009            to boolean_true_node.  If COND folds to boolean_false_node,
10010            return ASSERT_EXPR <Y, 0>.  Otherwise, return the original
10011            expression.  */
10012         tree c = fold (ASSERT_EXPR_COND (t));
10013         if (c == boolean_true_node)
10014           return ASSERT_EXPR_VAR (t);
10015         else if (c == boolean_false_node)
10016           return build (ASSERT_EXPR, TREE_TYPE (t), ASSERT_EXPR_VAR (t), c);
10017         else
10018           return t;
10019       }
10020
10021     default:
10022       return t;
10023     } /* switch (code) */
10024 }
10025
10026 #ifdef ENABLE_FOLD_CHECKING
10027 #undef fold
10028
10029 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
10030 static void fold_check_failed (tree, tree);
10031 void print_fold_checksum (tree);
10032
10033 /* When --enable-checking=fold, compute a digest of expr before
10034    and after actual fold call to see if fold did not accidentally
10035    change original expr.  */
10036
10037 tree
10038 fold (tree expr)
10039 {
10040   tree ret;
10041   struct md5_ctx ctx;
10042   unsigned char checksum_before[16], checksum_after[16];
10043   htab_t ht;
10044
10045   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
10046   md5_init_ctx (&ctx);
10047   fold_checksum_tree (expr, &ctx, ht);
10048   md5_finish_ctx (&ctx, checksum_before);
10049   htab_empty (ht);
10050
10051   ret = fold_1 (expr);
10052
10053   md5_init_ctx (&ctx);
10054   fold_checksum_tree (expr, &ctx, ht);
10055   md5_finish_ctx (&ctx, checksum_after);
10056   htab_delete (ht);
10057
10058   if (memcmp (checksum_before, checksum_after, 16))
10059     fold_check_failed (expr, ret);
10060
10061   return ret;
10062 }
10063
10064 void
10065 print_fold_checksum (tree expr)
10066 {
10067   struct md5_ctx ctx;
10068   unsigned char checksum[16], cnt;
10069   htab_t ht;
10070
10071   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
10072   md5_init_ctx (&ctx);
10073   fold_checksum_tree (expr, &ctx, ht);
10074   md5_finish_ctx (&ctx, checksum);
10075   htab_delete (ht);
10076   for (cnt = 0; cnt < 16; ++cnt)
10077     fprintf (stderr, "%02x", checksum[cnt]);
10078   putc ('\n', stderr);
10079 }
10080
10081 static void
10082 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
10083 {
10084   internal_error ("fold check: original tree changed by fold");
10085 }
10086
10087 static void
10088 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
10089 {
10090   void **slot;
10091   enum tree_code code;
10092   char buf[sizeof (struct tree_decl)];
10093   int i, len;
10094
10095   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
10096                <= sizeof (struct tree_decl))
10097               && sizeof (struct tree_type) <= sizeof (struct tree_decl));
10098   if (expr == NULL)
10099     return;
10100   slot = htab_find_slot (ht, expr, INSERT);
10101   if (*slot != NULL)
10102     return;
10103   *slot = expr;
10104   code = TREE_CODE (expr);
10105   if (TREE_CODE_CLASS (code) == tcc_declaration
10106       && DECL_ASSEMBLER_NAME_SET_P (expr))
10107     {
10108       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
10109       memcpy (buf, expr, tree_size (expr));
10110       expr = (tree) buf;
10111       SET_DECL_ASSEMBLER_NAME (expr, NULL);
10112     }
10113   else if (TREE_CODE_CLASS (code) == tcc_type
10114            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
10115                || TYPE_CACHED_VALUES_P (expr)))
10116     {
10117       /* Allow these fields to be modified.  */
10118       memcpy (buf, expr, tree_size (expr));
10119       expr = (tree) buf;
10120       TYPE_POINTER_TO (expr) = NULL;
10121       TYPE_REFERENCE_TO (expr) = NULL;
10122       if (TYPE_CACHED_VALUES_P (expr))
10123         {
10124           TYPE_CACHED_VALUES_P (expr) = 0;
10125           TYPE_CACHED_VALUES (expr) = NULL;
10126         }
10127     }
10128   md5_process_bytes (expr, tree_size (expr), ctx);
10129   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
10130   if (TREE_CODE_CLASS (code) != tcc_type
10131       && TREE_CODE_CLASS (code) != tcc_declaration)
10132     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
10133   switch (TREE_CODE_CLASS (code))
10134     {
10135     case tcc_constant:
10136       switch (code)
10137         {
10138         case STRING_CST:
10139           md5_process_bytes (TREE_STRING_POINTER (expr),
10140                              TREE_STRING_LENGTH (expr), ctx);
10141           break;
10142         case COMPLEX_CST:
10143           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
10144           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
10145           break;
10146         case VECTOR_CST:
10147           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
10148           break;
10149         default:
10150           break;
10151         }
10152       break;
10153     case tcc_exceptional:
10154       switch (code)
10155         {
10156         case TREE_LIST:
10157           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
10158           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
10159           break;
10160         case TREE_VEC:
10161           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
10162             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
10163           break;
10164         default:
10165           break;
10166         }
10167       break;
10168     case tcc_expression:
10169     case tcc_reference:
10170     case tcc_comparison:
10171     case tcc_unary:
10172     case tcc_binary:
10173     case tcc_statement:
10174       len = TREE_CODE_LENGTH (code);
10175       for (i = 0; i < len; ++i)
10176         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
10177       break;
10178     case tcc_declaration:
10179       fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
10180       fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
10181       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
10182       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
10183       fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
10184       fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
10185       fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
10186       fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
10187       fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
10188       fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
10189       fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
10190       break;
10191     case tcc_type:
10192       if (TREE_CODE (expr) == ENUMERAL_TYPE)
10193         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
10194       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
10195       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
10196       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
10197       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
10198       if (INTEGRAL_TYPE_P (expr)
10199           || SCALAR_FLOAT_TYPE_P (expr))
10200         {
10201           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
10202           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
10203         }
10204       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
10205       if (TREE_CODE (expr) == RECORD_TYPE
10206           || TREE_CODE (expr) == UNION_TYPE
10207           || TREE_CODE (expr) == QUAL_UNION_TYPE)
10208         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
10209       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
10210       break;
10211     default:
10212       break;
10213     }
10214 }
10215
10216 #endif
10217
10218 /* Fold a unary tree expression with code CODE of type TYPE with an
10219    operand OP0.  Return a folded expression if successful.  Otherwise,
10220    return a tree expression with code CODE of type TYPE with an
10221    operand OP0.  */
10222
10223 tree
10224 fold_build1 (enum tree_code code, tree type, tree op0)
10225 {
10226   tree tem = fold_unary (code, type, op0);
10227   if (tem)
10228     return tem;
10229
10230   return build1 (code, type, op0);
10231 }
10232
10233 /* Fold a binary tree expression with code CODE of type TYPE with
10234    operands OP0 and OP1.  Return a folded expression if successful.
10235    Otherwise, return a tree expression with code CODE of type TYPE
10236    with operands OP0 and OP1.  */
10237
10238 tree
10239 fold_build2 (enum tree_code code, tree type, tree op0, tree op1)
10240 {
10241   tree tem = fold_binary (code, type, op0, op1);
10242   if (tem)
10243     return tem;
10244
10245   return build2 (code, type, op0, op1);
10246 }
10247
10248 /* Fold a ternary tree expression with code CODE of type TYPE with
10249    operands OP0, OP1, and OP2.  Return a folded expression if
10250    successful.  Otherwise, return a tree expression with code CODE of
10251    type TYPE with operands OP0, OP1, and OP2.  */
10252
10253 tree
10254 fold_build3 (enum tree_code code, tree type, tree op0, tree op1, tree op2)
10255 {
10256   tree tem = fold_ternary (code, type, op0, op1, op2);
10257   if (tem)
10258     return tem;
10259
10260   return build3 (code, type, op0, op1, op2);
10261 }
10262
10263 /* Perform constant folding and related simplification of initializer
10264    expression EXPR.  This behaves identically to "fold" but ignores
10265    potential run-time traps and exceptions that fold must preserve.  */
10266
10267 tree
10268 fold_initializer (tree expr)
10269 {
10270   int saved_signaling_nans = flag_signaling_nans;
10271   int saved_trapping_math = flag_trapping_math;
10272   int saved_rounding_math = flag_rounding_math;
10273   int saved_trapv = flag_trapv;
10274   tree result;
10275
10276   flag_signaling_nans = 0;
10277   flag_trapping_math = 0;
10278   flag_rounding_math = 0;
10279   flag_trapv = 0;
10280
10281   result = fold (expr);
10282
10283   flag_signaling_nans = saved_signaling_nans;
10284   flag_trapping_math = saved_trapping_math;
10285   flag_rounding_math = saved_rounding_math;
10286   flag_trapv = saved_trapv;
10287
10288   return result;
10289 }
10290
10291 /* Determine if first argument is a multiple of second argument.  Return 0 if
10292    it is not, or we cannot easily determined it to be.
10293
10294    An example of the sort of thing we care about (at this point; this routine
10295    could surely be made more general, and expanded to do what the *_DIV_EXPR's
10296    fold cases do now) is discovering that
10297
10298      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
10299
10300    is a multiple of
10301
10302      SAVE_EXPR (J * 8)
10303
10304    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
10305
10306    This code also handles discovering that
10307
10308      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
10309
10310    is a multiple of 8 so we don't have to worry about dealing with a
10311    possible remainder.
10312
10313    Note that we *look* inside a SAVE_EXPR only to determine how it was
10314    calculated; it is not safe for fold to do much of anything else with the
10315    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
10316    at run time.  For example, the latter example above *cannot* be implemented
10317    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
10318    evaluation time of the original SAVE_EXPR is not necessarily the same at
10319    the time the new expression is evaluated.  The only optimization of this
10320    sort that would be valid is changing
10321
10322      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
10323
10324    divided by 8 to
10325
10326      SAVE_EXPR (I) * SAVE_EXPR (J)
10327
10328    (where the same SAVE_EXPR (J) is used in the original and the
10329    transformed version).  */
10330
10331 static int
10332 multiple_of_p (tree type, tree top, tree bottom)
10333 {
10334   if (operand_equal_p (top, bottom, 0))
10335     return 1;
10336
10337   if (TREE_CODE (type) != INTEGER_TYPE)
10338     return 0;
10339
10340   switch (TREE_CODE (top))
10341     {
10342     case BIT_AND_EXPR:
10343       /* Bitwise and provides a power of two multiple.  If the mask is
10344          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
10345       if (!integer_pow2p (bottom))
10346         return 0;
10347       /* FALLTHRU */
10348
10349     case MULT_EXPR:
10350       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
10351               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
10352
10353     case PLUS_EXPR:
10354     case MINUS_EXPR:
10355       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
10356               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
10357
10358     case LSHIFT_EXPR:
10359       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
10360         {
10361           tree op1, t1;
10362
10363           op1 = TREE_OPERAND (top, 1);
10364           /* const_binop may not detect overflow correctly,
10365              so check for it explicitly here.  */
10366           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
10367               > TREE_INT_CST_LOW (op1)
10368               && TREE_INT_CST_HIGH (op1) == 0
10369               && 0 != (t1 = fold_convert (type,
10370                                           const_binop (LSHIFT_EXPR,
10371                                                        size_one_node,
10372                                                        op1, 0)))
10373               && ! TREE_OVERFLOW (t1))
10374             return multiple_of_p (type, t1, bottom);
10375         }
10376       return 0;
10377
10378     case NOP_EXPR:
10379       /* Can't handle conversions from non-integral or wider integral type.  */
10380       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
10381           || (TYPE_PRECISION (type)
10382               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
10383         return 0;
10384
10385       /* .. fall through ...  */
10386
10387     case SAVE_EXPR:
10388       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
10389
10390     case INTEGER_CST:
10391       if (TREE_CODE (bottom) != INTEGER_CST
10392           || (TYPE_UNSIGNED (type)
10393               && (tree_int_cst_sgn (top) < 0
10394                   || tree_int_cst_sgn (bottom) < 0)))
10395         return 0;
10396       return integer_zerop (const_binop (TRUNC_MOD_EXPR,
10397                                          top, bottom, 0));
10398
10399     default:
10400       return 0;
10401     }
10402 }
10403
10404 /* Return true if `t' is known to be non-negative.  */
10405
10406 int
10407 tree_expr_nonnegative_p (tree t)
10408 {
10409   switch (TREE_CODE (t))
10410     {
10411     case ABS_EXPR:
10412       return 1;
10413
10414     case INTEGER_CST:
10415       return tree_int_cst_sgn (t) >= 0;
10416
10417     case REAL_CST:
10418       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
10419
10420     case PLUS_EXPR:
10421       if (FLOAT_TYPE_P (TREE_TYPE (t)))
10422         return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10423                && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10424
10425       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
10426          both unsigned and at least 2 bits shorter than the result.  */
10427       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
10428           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
10429           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
10430         {
10431           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
10432           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
10433           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
10434               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
10435             {
10436               unsigned int prec = MAX (TYPE_PRECISION (inner1),
10437                                        TYPE_PRECISION (inner2)) + 1;
10438               return prec < TYPE_PRECISION (TREE_TYPE (t));
10439             }
10440         }
10441       break;
10442
10443     case MULT_EXPR:
10444       if (FLOAT_TYPE_P (TREE_TYPE (t)))
10445         {
10446           /* x * x for floating point x is always non-negative.  */
10447           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
10448             return 1;
10449           return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10450                  && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10451         }
10452
10453       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
10454          both unsigned and their total bits is shorter than the result.  */
10455       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
10456           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
10457           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
10458         {
10459           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
10460           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
10461           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
10462               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
10463             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
10464                    < TYPE_PRECISION (TREE_TYPE (t));
10465         }
10466       return 0;
10467
10468     case TRUNC_DIV_EXPR:
10469     case CEIL_DIV_EXPR:
10470     case FLOOR_DIV_EXPR:
10471     case ROUND_DIV_EXPR:
10472       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10473              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10474
10475     case TRUNC_MOD_EXPR:
10476     case CEIL_MOD_EXPR:
10477     case FLOOR_MOD_EXPR:
10478     case ROUND_MOD_EXPR:
10479       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10480
10481     case RDIV_EXPR:
10482       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10483              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10484
10485     case BIT_AND_EXPR:
10486       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
10487              || tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10488     case BIT_IOR_EXPR:
10489     case BIT_XOR_EXPR:
10490       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10491              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10492
10493     case NOP_EXPR:
10494       {
10495         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
10496         tree outer_type = TREE_TYPE (t);
10497
10498         if (TREE_CODE (outer_type) == REAL_TYPE)
10499           {
10500             if (TREE_CODE (inner_type) == REAL_TYPE)
10501               return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10502             if (TREE_CODE (inner_type) == INTEGER_TYPE)
10503               {
10504                 if (TYPE_UNSIGNED (inner_type))
10505                   return 1;
10506                 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10507               }
10508           }
10509         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
10510           {
10511             if (TREE_CODE (inner_type) == REAL_TYPE)
10512               return tree_expr_nonnegative_p (TREE_OPERAND (t,0));
10513             if (TREE_CODE (inner_type) == INTEGER_TYPE)
10514               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
10515                       && TYPE_UNSIGNED (inner_type);
10516           }
10517       }
10518       break;
10519
10520     case COND_EXPR:
10521       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
10522         && tree_expr_nonnegative_p (TREE_OPERAND (t, 2));
10523     case COMPOUND_EXPR:
10524       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10525     case MIN_EXPR:
10526       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10527         && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10528     case MAX_EXPR:
10529       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10530         || tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10531     case MODIFY_EXPR:
10532       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10533     case BIND_EXPR:
10534       return tree_expr_nonnegative_p (expr_last (TREE_OPERAND (t, 1)));
10535     case SAVE_EXPR:
10536       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10537     case NON_LVALUE_EXPR:
10538       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10539     case FLOAT_EXPR:
10540       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10541
10542     case TARGET_EXPR:
10543       {
10544         tree temp = TARGET_EXPR_SLOT (t);
10545         t = TARGET_EXPR_INITIAL (t);
10546
10547         /* If the initializer is non-void, then it's a normal expression
10548            that will be assigned to the slot.  */
10549         if (!VOID_TYPE_P (t))
10550           return tree_expr_nonnegative_p (t);
10551
10552         /* Otherwise, the initializer sets the slot in some way.  One common
10553            way is an assignment statement at the end of the initializer.  */
10554         while (1)
10555           {
10556             if (TREE_CODE (t) == BIND_EXPR)
10557               t = expr_last (BIND_EXPR_BODY (t));
10558             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
10559                      || TREE_CODE (t) == TRY_CATCH_EXPR)
10560               t = expr_last (TREE_OPERAND (t, 0));
10561             else if (TREE_CODE (t) == STATEMENT_LIST)
10562               t = expr_last (t);
10563             else
10564               break;
10565           }
10566         if (TREE_CODE (t) == MODIFY_EXPR
10567             && TREE_OPERAND (t, 0) == temp)
10568           return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10569
10570         return 0;
10571       }
10572
10573     case CALL_EXPR:
10574       {
10575         tree fndecl = get_callee_fndecl (t);
10576         tree arglist = TREE_OPERAND (t, 1);
10577         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
10578           switch (DECL_FUNCTION_CODE (fndecl))
10579             {
10580 #define CASE_BUILTIN_F(BUILT_IN_FN) \
10581   case BUILT_IN_FN: case BUILT_IN_FN##F: case BUILT_IN_FN##L:
10582 #define CASE_BUILTIN_I(BUILT_IN_FN) \
10583   case BUILT_IN_FN: case BUILT_IN_FN##L: case BUILT_IN_FN##LL:
10584
10585             CASE_BUILTIN_F (BUILT_IN_ACOS)
10586             CASE_BUILTIN_F (BUILT_IN_ACOSH)
10587             CASE_BUILTIN_F (BUILT_IN_CABS)
10588             CASE_BUILTIN_F (BUILT_IN_COSH)
10589             CASE_BUILTIN_F (BUILT_IN_ERFC)
10590             CASE_BUILTIN_F (BUILT_IN_EXP)
10591             CASE_BUILTIN_F (BUILT_IN_EXP10)
10592             CASE_BUILTIN_F (BUILT_IN_EXP2)
10593             CASE_BUILTIN_F (BUILT_IN_FABS)
10594             CASE_BUILTIN_F (BUILT_IN_FDIM)
10595             CASE_BUILTIN_F (BUILT_IN_FREXP)
10596             CASE_BUILTIN_F (BUILT_IN_HYPOT)
10597             CASE_BUILTIN_F (BUILT_IN_POW10)
10598             CASE_BUILTIN_I (BUILT_IN_FFS)
10599             CASE_BUILTIN_I (BUILT_IN_PARITY)
10600             CASE_BUILTIN_I (BUILT_IN_POPCOUNT)
10601               /* Always true.  */
10602               return 1;
10603
10604             CASE_BUILTIN_F (BUILT_IN_SQRT)
10605               /* sqrt(-0.0) is -0.0.  */
10606               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
10607                 return 1;
10608               return tree_expr_nonnegative_p (TREE_VALUE (arglist));
10609
10610             CASE_BUILTIN_F (BUILT_IN_ASINH)
10611             CASE_BUILTIN_F (BUILT_IN_ATAN)
10612             CASE_BUILTIN_F (BUILT_IN_ATANH)
10613             CASE_BUILTIN_F (BUILT_IN_CBRT)
10614             CASE_BUILTIN_F (BUILT_IN_CEIL)
10615             CASE_BUILTIN_F (BUILT_IN_ERF)
10616             CASE_BUILTIN_F (BUILT_IN_EXPM1)
10617             CASE_BUILTIN_F (BUILT_IN_FLOOR)
10618             CASE_BUILTIN_F (BUILT_IN_FMOD)
10619             CASE_BUILTIN_F (BUILT_IN_LCEIL)
10620             CASE_BUILTIN_F (BUILT_IN_LDEXP)
10621             CASE_BUILTIN_F (BUILT_IN_LFLOOR)
10622             CASE_BUILTIN_F (BUILT_IN_LLCEIL)
10623             CASE_BUILTIN_F (BUILT_IN_LLFLOOR)
10624             CASE_BUILTIN_F (BUILT_IN_LLRINT)
10625             CASE_BUILTIN_F (BUILT_IN_LLROUND)
10626             CASE_BUILTIN_F (BUILT_IN_LRINT)
10627             CASE_BUILTIN_F (BUILT_IN_LROUND)
10628             CASE_BUILTIN_F (BUILT_IN_MODF)
10629             CASE_BUILTIN_F (BUILT_IN_NEARBYINT)
10630             CASE_BUILTIN_F (BUILT_IN_POW)
10631             CASE_BUILTIN_F (BUILT_IN_RINT)
10632             CASE_BUILTIN_F (BUILT_IN_ROUND)
10633             CASE_BUILTIN_F (BUILT_IN_SIGNBIT)
10634             CASE_BUILTIN_F (BUILT_IN_SINH)
10635             CASE_BUILTIN_F (BUILT_IN_TANH)
10636             CASE_BUILTIN_F (BUILT_IN_TRUNC)
10637               /* True if the 1st argument is nonnegative.  */
10638               return tree_expr_nonnegative_p (TREE_VALUE (arglist));
10639
10640             CASE_BUILTIN_F (BUILT_IN_FMAX)
10641               /* True if the 1st OR 2nd arguments are nonnegative.  */
10642               return tree_expr_nonnegative_p (TREE_VALUE (arglist))
10643                 || tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10644
10645             CASE_BUILTIN_F (BUILT_IN_FMIN)
10646               /* True if the 1st AND 2nd arguments are nonnegative.  */
10647               return tree_expr_nonnegative_p (TREE_VALUE (arglist))
10648                 && tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10649
10650             CASE_BUILTIN_F (BUILT_IN_COPYSIGN)
10651               /* True if the 2nd argument is nonnegative.  */
10652               return tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10653
10654             default:
10655               break;
10656 #undef CASE_BUILTIN_F
10657 #undef CASE_BUILTIN_I
10658             }
10659       }
10660
10661       /* ... fall through ...  */
10662
10663     default:
10664       if (truth_value_p (TREE_CODE (t)))
10665         /* Truth values evaluate to 0 or 1, which is nonnegative.  */
10666         return 1;
10667     }
10668
10669   /* We don't know sign of `t', so be conservative and return false.  */
10670   return 0;
10671 }
10672
10673 /* Return true when T is an address and is known to be nonzero.
10674    For floating point we further ensure that T is not denormal.
10675    Similar logic is present in nonzero_address in rtlanal.h.  */
10676
10677 static bool
10678 tree_expr_nonzero_p (tree t)
10679 {
10680   tree type = TREE_TYPE (t);
10681
10682   /* Doing something useful for floating point would need more work.  */
10683   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
10684     return false;
10685
10686   switch (TREE_CODE (t))
10687     {
10688     case ABS_EXPR:
10689       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10690         return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10691
10692     case INTEGER_CST:
10693       /* We used to test for !integer_zerop here.  This does not work correctly
10694          if TREE_CONSTANT_OVERFLOW (t).  */
10695       return (TREE_INT_CST_LOW (t) != 0
10696               || TREE_INT_CST_HIGH (t) != 0);
10697
10698     case PLUS_EXPR:
10699       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10700         {
10701           /* With the presence of negative values it is hard
10702              to say something.  */
10703           if (!tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10704               || !tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
10705             return false;
10706           /* One of operands must be positive and the other non-negative.  */
10707           return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10708                   || tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10709         }
10710       break;
10711
10712     case MULT_EXPR:
10713       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10714         {
10715           return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10716                   && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10717         }
10718       break;
10719
10720     case NOP_EXPR:
10721       {
10722         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
10723         tree outer_type = TREE_TYPE (t);
10724
10725         return (TYPE_PRECISION (inner_type) >= TYPE_PRECISION (outer_type)
10726                 && tree_expr_nonzero_p (TREE_OPERAND (t, 0)));
10727       }
10728       break;
10729
10730    case ADDR_EXPR:
10731       {
10732         tree base = get_base_address (TREE_OPERAND (t, 0));
10733
10734         if (!base)
10735           return false;
10736
10737         /* Weak declarations may link to NULL.  */
10738         if (DECL_P (base))
10739           return !DECL_WEAK (base);
10740
10741         /* Constants are never weak.  */
10742         if (CONSTANT_CLASS_P (base))
10743           return true;
10744
10745         return false;
10746       }
10747
10748     case COND_EXPR:
10749       return (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10750               && tree_expr_nonzero_p (TREE_OPERAND (t, 2)));
10751
10752     case MIN_EXPR:
10753       return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10754               && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10755
10756     case MAX_EXPR:
10757       if (tree_expr_nonzero_p (TREE_OPERAND (t, 0)))
10758         {
10759           /* When both operands are nonzero, then MAX must be too.  */
10760           if (tree_expr_nonzero_p (TREE_OPERAND (t, 1)))
10761             return true;
10762
10763           /* MAX where operand 0 is positive is positive.  */
10764           return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10765         }
10766       /* MAX where operand 1 is positive is positive.  */
10767       else if (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10768                && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
10769         return true;
10770       break;
10771
10772     case COMPOUND_EXPR:
10773     case MODIFY_EXPR:
10774     case BIND_EXPR:
10775       return tree_expr_nonzero_p (TREE_OPERAND (t, 1));
10776
10777     case SAVE_EXPR:
10778     case NON_LVALUE_EXPR:
10779       return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10780
10781     case BIT_IOR_EXPR:
10782       return tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10783              || tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10784
10785     default:
10786       break;
10787     }
10788   return false;
10789 }
10790
10791 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
10792    attempt to fold the expression to a constant without modifying TYPE,
10793    OP0 or OP1.
10794
10795    If the expression could be simplified to a constant, then return
10796    the constant.  If the expression would not be simplified to a
10797    constant, then return NULL_TREE.  */
10798
10799 tree
10800 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
10801 {
10802   tree tem = fold_binary (code, type, op0, op1);
10803   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
10804 }
10805
10806 /* Given the components of a unary expression CODE, TYPE and OP0,
10807    attempt to fold the expression to a constant without modifying
10808    TYPE or OP0.
10809
10810    If the expression could be simplified to a constant, then return
10811    the constant.  If the expression would not be simplified to a
10812    constant, then return NULL_TREE.  */
10813
10814 tree
10815 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
10816 {
10817   tree tem = fold_unary (code, type, op0);
10818   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
10819 }
10820
10821 /* If EXP represents referencing an element in a constant string
10822    (either via pointer arithmetic or array indexing), return the
10823    tree representing the value accessed, otherwise return NULL.  */
10824
10825 tree
10826 fold_read_from_constant_string (tree exp)
10827 {
10828   if (TREE_CODE (exp) == INDIRECT_REF || TREE_CODE (exp) == ARRAY_REF)
10829     {
10830       tree exp1 = TREE_OPERAND (exp, 0);
10831       tree index;
10832       tree string;
10833
10834       if (TREE_CODE (exp) == INDIRECT_REF)
10835         string = string_constant (exp1, &index);
10836       else
10837         {
10838           tree low_bound = array_ref_low_bound (exp);
10839           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
10840
10841           /* Optimize the special-case of a zero lower bound.
10842
10843              We convert the low_bound to sizetype to avoid some problems
10844              with constant folding.  (E.g. suppose the lower bound is 1,
10845              and its mode is QI.  Without the conversion,l (ARRAY
10846              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
10847              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
10848           if (! integer_zerop (low_bound))
10849             index = size_diffop (index, fold_convert (sizetype, low_bound));
10850
10851           string = exp1;
10852         }
10853
10854       if (string
10855           && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (string))
10856           && TREE_CODE (string) == STRING_CST
10857           && TREE_CODE (index) == INTEGER_CST
10858           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
10859           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
10860               == MODE_INT)
10861           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
10862         return fold_convert (TREE_TYPE (exp),
10863                              build_int_cst (NULL_TREE,
10864                                             (TREE_STRING_POINTER (string)
10865                                              [TREE_INT_CST_LOW (index)])));
10866     }
10867   return NULL;
10868 }
10869
10870 /* Return the tree for neg (ARG0) when ARG0 is known to be either
10871    an integer constant or real constant.
10872
10873    TYPE is the type of the result.  */
10874
10875 static tree
10876 fold_negate_const (tree arg0, tree type)
10877 {
10878   tree t = NULL_TREE;
10879
10880   switch (TREE_CODE (arg0))
10881     {
10882     case INTEGER_CST:
10883       {
10884         unsigned HOST_WIDE_INT low;
10885         HOST_WIDE_INT high;
10886         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
10887                                    TREE_INT_CST_HIGH (arg0),
10888                                    &low, &high);
10889         t = build_int_cst_wide (type, low, high);
10890         t = force_fit_type (t, 1,
10891                             (overflow | TREE_OVERFLOW (arg0))
10892                             && !TYPE_UNSIGNED (type),
10893                             TREE_CONSTANT_OVERFLOW (arg0));
10894         break;
10895       }
10896
10897     case REAL_CST:
10898       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
10899       break;
10900
10901     default:
10902       gcc_unreachable ();
10903     }
10904
10905   return t;
10906 }
10907
10908 /* Return the tree for abs (ARG0) when ARG0 is known to be either
10909    an integer constant or real constant.
10910
10911    TYPE is the type of the result.  */
10912
10913 tree
10914 fold_abs_const (tree arg0, tree type)
10915 {
10916   tree t = NULL_TREE;
10917
10918   switch (TREE_CODE (arg0))
10919     {
10920     case INTEGER_CST:
10921       /* If the value is unsigned, then the absolute value is
10922          the same as the ordinary value.  */
10923       if (TYPE_UNSIGNED (type))
10924         t = arg0;
10925       /* Similarly, if the value is non-negative.  */
10926       else if (INT_CST_LT (integer_minus_one_node, arg0))
10927         t = arg0;
10928       /* If the value is negative, then the absolute value is
10929          its negation.  */
10930       else
10931         {
10932           unsigned HOST_WIDE_INT low;
10933           HOST_WIDE_INT high;
10934           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
10935                                      TREE_INT_CST_HIGH (arg0),
10936                                      &low, &high);
10937           t = build_int_cst_wide (type, low, high);
10938           t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg0),
10939                               TREE_CONSTANT_OVERFLOW (arg0));
10940         }
10941       break;
10942
10943     case REAL_CST:
10944       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
10945         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
10946       else
10947         t =  arg0;
10948       break;
10949
10950     default:
10951       gcc_unreachable ();
10952     }
10953
10954   return t;
10955 }
10956
10957 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
10958    constant.  TYPE is the type of the result.  */
10959
10960 static tree
10961 fold_not_const (tree arg0, tree type)
10962 {
10963   tree t = NULL_TREE;
10964
10965   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
10966
10967   t = build_int_cst_wide (type,
10968                           ~ TREE_INT_CST_LOW (arg0),
10969                           ~ TREE_INT_CST_HIGH (arg0));
10970   t = force_fit_type (t, 0, TREE_OVERFLOW (arg0),
10971                       TREE_CONSTANT_OVERFLOW (arg0));
10972
10973   return t;
10974 }
10975
10976 /* Given CODE, a relational operator, the target type, TYPE and two
10977    constant operands OP0 and OP1, return the result of the
10978    relational operation.  If the result is not a compile time
10979    constant, then return NULL_TREE.  */
10980
10981 static tree
10982 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
10983 {
10984   int result, invert;
10985
10986   /* From here on, the only cases we handle are when the result is
10987      known to be a constant.  */
10988
10989   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
10990     {
10991       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
10992       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
10993
10994       /* Handle the cases where either operand is a NaN.  */
10995       if (real_isnan (c0) || real_isnan (c1))
10996         {
10997           switch (code)
10998             {
10999             case EQ_EXPR:
11000             case ORDERED_EXPR:
11001               result = 0;
11002               break;
11003
11004             case NE_EXPR:
11005             case UNORDERED_EXPR:
11006             case UNLT_EXPR:
11007             case UNLE_EXPR:
11008             case UNGT_EXPR:
11009             case UNGE_EXPR:
11010             case UNEQ_EXPR:
11011               result = 1;
11012               break;
11013
11014             case LT_EXPR:
11015             case LE_EXPR:
11016             case GT_EXPR:
11017             case GE_EXPR:
11018             case LTGT_EXPR:
11019               if (flag_trapping_math)
11020                 return NULL_TREE;
11021               result = 0;
11022               break;
11023
11024             default:
11025               gcc_unreachable ();
11026             }
11027
11028           return constant_boolean_node (result, type);
11029         }
11030
11031       return constant_boolean_node (real_compare (code, c0, c1), type);
11032     }
11033
11034   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
11035
11036      To compute GT, swap the arguments and do LT.
11037      To compute GE, do LT and invert the result.
11038      To compute LE, swap the arguments, do LT and invert the result.
11039      To compute NE, do EQ and invert the result.
11040
11041      Therefore, the code below must handle only EQ and LT.  */
11042
11043   if (code == LE_EXPR || code == GT_EXPR)
11044     {
11045       tree tem = op0;
11046       op0 = op1;
11047       op1 = tem;
11048       code = swap_tree_comparison (code);
11049     }
11050
11051   /* Note that it is safe to invert for real values here because we
11052      have already handled the one case that it matters.  */
11053
11054   invert = 0;
11055   if (code == NE_EXPR || code == GE_EXPR)
11056     {
11057       invert = 1;
11058       code = invert_tree_comparison (code, false);
11059     }
11060
11061   /* Compute a result for LT or EQ if args permit;
11062      Otherwise return T.  */
11063   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
11064     {
11065       if (code == EQ_EXPR)
11066         result = tree_int_cst_equal (op0, op1);
11067       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
11068         result = INT_CST_LT_UNSIGNED (op0, op1);
11069       else
11070         result = INT_CST_LT (op0, op1);
11071     }
11072   else
11073     return NULL_TREE;
11074
11075   if (invert)
11076     result ^= 1;
11077   return constant_boolean_node (result, type);
11078 }
11079
11080 /* Build an expression for the a clean point containing EXPR with type TYPE.
11081    Don't build a cleanup point expression for EXPR which don't have side
11082    effects.  */
11083
11084 tree
11085 fold_build_cleanup_point_expr (tree type, tree expr)
11086 {
11087   /* If the expression does not have side effects then we don't have to wrap
11088      it with a cleanup point expression.  */
11089   if (!TREE_SIDE_EFFECTS (expr))
11090     return expr;
11091
11092   /* If the expression is a return, check to see if the expression inside the
11093      return has no side effects or the right hand side of the modify expression
11094      inside the return. If either don't have side effects set we don't need to
11095      wrap the expression in a cleanup point expression.  Note we don't check the
11096      left hand side of the modify because it should always be a return decl.  */
11097   if (TREE_CODE (expr) == RETURN_EXPR)
11098     {
11099       tree op = TREE_OPERAND (expr, 0);
11100       if (!op || !TREE_SIDE_EFFECTS (op))
11101         return expr;
11102       op = TREE_OPERAND (op, 1);
11103       if (!TREE_SIDE_EFFECTS (op))
11104         return expr;
11105     }
11106   
11107   return build1 (CLEANUP_POINT_EXPR, type, expr);
11108 }
11109
11110 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
11111    avoid confusing the gimplify process.  */
11112
11113 tree
11114 build_fold_addr_expr_with_type (tree t, tree ptrtype)
11115 {
11116   /* The size of the object is not relevant when talking about its address.  */
11117   if (TREE_CODE (t) == WITH_SIZE_EXPR)
11118     t = TREE_OPERAND (t, 0);
11119
11120   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
11121   if (TREE_CODE (t) == INDIRECT_REF
11122       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
11123     {
11124       t = TREE_OPERAND (t, 0);
11125       if (TREE_TYPE (t) != ptrtype)
11126         t = build1 (NOP_EXPR, ptrtype, t);
11127     }
11128   else
11129     {
11130       tree base = t;
11131
11132       while (handled_component_p (base))
11133         base = TREE_OPERAND (base, 0);
11134       if (DECL_P (base))
11135         TREE_ADDRESSABLE (base) = 1;
11136
11137       t = build1 (ADDR_EXPR, ptrtype, t);
11138     }
11139
11140   return t;
11141 }
11142
11143 tree
11144 build_fold_addr_expr (tree t)
11145 {
11146   return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
11147 }
11148
11149 /* Given a pointer value T, return a simplified version of an indirection
11150    through T, or NULL_TREE if no simplification is possible.  */
11151
11152 static tree
11153 fold_indirect_ref_1 (tree t)
11154 {
11155   tree type = TREE_TYPE (TREE_TYPE (t));
11156   tree sub = t;
11157   tree subtype;
11158
11159   STRIP_NOPS (sub);
11160   subtype = TREE_TYPE (sub);
11161   if (!POINTER_TYPE_P (subtype))
11162     return NULL_TREE;
11163
11164   if (TREE_CODE (sub) == ADDR_EXPR)
11165     {
11166       tree op = TREE_OPERAND (sub, 0);
11167       tree optype = TREE_TYPE (op);
11168       /* *&p => p */
11169       if (lang_hooks.types_compatible_p (type, optype))
11170         return op;
11171       /* *(foo *)&fooarray => fooarray[0] */
11172       else if (TREE_CODE (optype) == ARRAY_TYPE
11173                && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
11174         {
11175           tree type_domain = TYPE_DOMAIN (optype);
11176           tree min_val = size_zero_node;
11177           if (type_domain && TYPE_MIN_VALUE (type_domain))
11178             min_val = TYPE_MIN_VALUE (type_domain);
11179           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
11180         }
11181     }
11182
11183   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
11184   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
11185       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
11186     {
11187       tree type_domain;
11188       tree min_val = size_zero_node;
11189       sub = build_fold_indirect_ref (sub);
11190       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
11191       if (type_domain && TYPE_MIN_VALUE (type_domain))
11192         min_val = TYPE_MIN_VALUE (type_domain);
11193       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
11194     }
11195
11196   return NULL_TREE;
11197 }
11198
11199 /* Builds an expression for an indirection through T, simplifying some
11200    cases.  */
11201
11202 tree
11203 build_fold_indirect_ref (tree t)
11204 {
11205   tree sub = fold_indirect_ref_1 (t);
11206
11207   if (sub)
11208     return sub;
11209   else
11210     return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
11211 }
11212
11213 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
11214
11215 tree
11216 fold_indirect_ref (tree t)
11217 {
11218   tree sub = fold_indirect_ref_1 (TREE_OPERAND (t, 0));
11219
11220   if (sub)
11221     return sub;
11222   else
11223     return t;
11224 }
11225
11226 /* Strip non-trapping, non-side-effecting tree nodes from an expression
11227    whose result is ignored.  The type of the returned tree need not be
11228    the same as the original expression.  */
11229
11230 tree
11231 fold_ignored_result (tree t)
11232 {
11233   if (!TREE_SIDE_EFFECTS (t))
11234     return integer_zero_node;
11235
11236   for (;;)
11237     switch (TREE_CODE_CLASS (TREE_CODE (t)))
11238       {
11239       case tcc_unary:
11240         t = TREE_OPERAND (t, 0);
11241         break;
11242
11243       case tcc_binary:
11244       case tcc_comparison:
11245         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
11246           t = TREE_OPERAND (t, 0);
11247         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
11248           t = TREE_OPERAND (t, 1);
11249         else
11250           return t;
11251         break;
11252
11253       case tcc_expression:
11254         switch (TREE_CODE (t))
11255           {
11256           case COMPOUND_EXPR:
11257             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
11258               return t;
11259             t = TREE_OPERAND (t, 0);
11260             break;
11261
11262           case COND_EXPR:
11263             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
11264                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
11265               return t;
11266             t = TREE_OPERAND (t, 0);
11267             break;
11268
11269           default:
11270             return t;
11271           }
11272         break;
11273
11274       default:
11275         return t;
11276       }
11277 }
11278
11279 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
11280    This can only be applied to objects of a sizetype.  */
11281
11282 tree
11283 round_up (tree value, int divisor)
11284 {
11285   tree div = NULL_TREE;
11286
11287   gcc_assert (divisor > 0);
11288   if (divisor == 1)
11289     return value;
11290
11291   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
11292      have to do anything.  Only do this when we are not given a const,
11293      because in that case, this check is more expensive than just
11294      doing it.  */
11295   if (TREE_CODE (value) != INTEGER_CST)
11296     {
11297       div = build_int_cst (TREE_TYPE (value), divisor);
11298
11299       if (multiple_of_p (TREE_TYPE (value), value, div))
11300         return value;
11301     }
11302
11303   /* If divisor is a power of two, simplify this to bit manipulation.  */
11304   if (divisor == (divisor & -divisor))
11305     {
11306       tree t;
11307
11308       t = build_int_cst (TREE_TYPE (value), divisor - 1);
11309       value = size_binop (PLUS_EXPR, value, t);
11310       t = build_int_cst (TREE_TYPE (value), -divisor);
11311       value = size_binop (BIT_AND_EXPR, value, t);
11312     }
11313   else
11314     {
11315       if (!div)
11316         div = build_int_cst (TREE_TYPE (value), divisor);
11317       value = size_binop (CEIL_DIV_EXPR, value, div);
11318       value = size_binop (MULT_EXPR, value, div);
11319     }
11320
11321   return value;
11322 }
11323
11324 /* Likewise, but round down.  */
11325
11326 tree
11327 round_down (tree value, int divisor)
11328 {
11329   tree div = NULL_TREE;
11330
11331   gcc_assert (divisor > 0);
11332   if (divisor == 1)
11333     return value;
11334
11335   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
11336      have to do anything.  Only do this when we are not given a const,
11337      because in that case, this check is more expensive than just
11338      doing it.  */
11339   if (TREE_CODE (value) != INTEGER_CST)
11340     {
11341       div = build_int_cst (TREE_TYPE (value), divisor);
11342
11343       if (multiple_of_p (TREE_TYPE (value), value, div))
11344         return value;
11345     }
11346
11347   /* If divisor is a power of two, simplify this to bit manipulation.  */
11348   if (divisor == (divisor & -divisor))
11349     {
11350       tree t;
11351
11352       t = build_int_cst (TREE_TYPE (value), -divisor);
11353       value = size_binop (BIT_AND_EXPR, value, t);
11354     }
11355   else
11356     {
11357       if (!div)
11358         div = build_int_cst (TREE_TYPE (value), divisor);
11359       value = size_binop (FLOOR_DIV_EXPR, value, div);
11360       value = size_binop (MULT_EXPR, value, div);
11361     }
11362
11363   return value;
11364 }
11365
11366 /* Returns the pointer to the base of the object addressed by EXP and
11367    extracts the information about the offset of the access, storing it
11368    to PBITPOS and POFFSET.  */
11369
11370 static tree
11371 split_address_to_core_and_offset (tree exp,
11372                                   HOST_WIDE_INT *pbitpos, tree *poffset)
11373 {
11374   tree core;
11375   enum machine_mode mode;
11376   int unsignedp, volatilep;
11377   HOST_WIDE_INT bitsize;
11378
11379   if (TREE_CODE (exp) == ADDR_EXPR)
11380     {
11381       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
11382                                   poffset, &mode, &unsignedp, &volatilep,
11383                                   false);
11384
11385       if (TREE_CODE (core) == INDIRECT_REF)
11386         core = TREE_OPERAND (core, 0);
11387     }
11388   else
11389     {
11390       core = exp;
11391       *pbitpos = 0;
11392       *poffset = NULL_TREE;
11393     }
11394
11395   return core;
11396 }
11397
11398 /* Returns true if addresses of E1 and E2 differ by a constant, false
11399    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
11400
11401 bool
11402 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
11403 {
11404   tree core1, core2;
11405   HOST_WIDE_INT bitpos1, bitpos2;
11406   tree toffset1, toffset2, tdiff, type;
11407
11408   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
11409   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
11410
11411   if (bitpos1 % BITS_PER_UNIT != 0
11412       || bitpos2 % BITS_PER_UNIT != 0
11413       || !operand_equal_p (core1, core2, 0))
11414     return false;
11415
11416   if (toffset1 && toffset2)
11417     {
11418       type = TREE_TYPE (toffset1);
11419       if (type != TREE_TYPE (toffset2))
11420         toffset2 = fold_convert (type, toffset2);
11421
11422       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
11423       if (!host_integerp (tdiff, 0))
11424         return false;
11425
11426       *diff = tree_low_cst (tdiff, 0);
11427     }
11428   else if (toffset1 || toffset2)
11429     {
11430       /* If only one of the offsets is non-constant, the difference cannot
11431          be a constant.  */
11432       return false;
11433     }
11434   else
11435     *diff = 0;
11436
11437   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
11438   return true;
11439 }
11440
11441 /* Simplify the floating point expression EXP when the sign of the
11442    result is not significant.  Return NULL_TREE if no simplification
11443    is possible.  */
11444
11445 tree
11446 fold_strip_sign_ops (tree exp)
11447 {
11448   tree arg0, arg1;
11449
11450   switch (TREE_CODE (exp))
11451     {
11452     case ABS_EXPR:
11453     case NEGATE_EXPR:
11454       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
11455       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
11456
11457     case MULT_EXPR:
11458     case RDIV_EXPR:
11459       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
11460         return NULL_TREE;
11461       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
11462       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
11463       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
11464         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
11465                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
11466                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
11467       break;
11468
11469     default:
11470       break;
11471     }
11472   return NULL_TREE;
11473 }
11474