OSDN Git Service

* config/ia64/ia64.c: Fix a comment typo.
[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 (0, "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 (0, "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 (0, "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 (0, "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 (0, "%<or%> of unmatched not-equal tests is always 1");
4956           return constant_boolean_node (true, truth_type);
4957         }
4958       else
4959         {
4960           warning (0, "%<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 the test
5933    using a sign testing.  Otherwise return NULL.  TYPE is the desired
5934    result type.  */
5935
5936 static tree
5937 fold_single_bit_test_into_sign_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       /* If we have (A & C) != 0 where C is the sign bit of A, convert
5946          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
5947       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
5948
5949       if (arg00 != NULL_TREE
5950           /* This is only a win if casting to a signed type is cheap,
5951              i.e. when arg00's type is not a partial mode.  */
5952           && TYPE_PRECISION (TREE_TYPE (arg00))
5953              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
5954         {
5955           tree stype = lang_hooks.types.signed_type (TREE_TYPE (arg00));
5956           return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
5957                               result_type, fold_convert (stype, arg00),
5958                               fold_convert (stype, integer_zero_node));
5959         }
5960     }
5961
5962   return NULL_TREE;
5963 }
5964
5965 /* If CODE with arguments ARG0 and ARG1 represents a single bit
5966    equality/inequality test, then return a simplified form of
5967    the test using shifts and logical operations.  Otherwise return
5968    NULL.  TYPE is the desired result type.  */
5969
5970 tree
5971 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
5972                       tree result_type)
5973 {
5974   /* If this is testing a single bit, we can optimize the test.  */
5975   if ((code == NE_EXPR || code == EQ_EXPR)
5976       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
5977       && integer_pow2p (TREE_OPERAND (arg0, 1)))
5978     {
5979       tree inner = TREE_OPERAND (arg0, 0);
5980       tree type = TREE_TYPE (arg0);
5981       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
5982       enum machine_mode operand_mode = TYPE_MODE (type);
5983       int ops_unsigned;
5984       tree signed_type, unsigned_type, intermediate_type;
5985       tree tem;
5986
5987       /* First, see if we can fold the single bit test into a sign-bit
5988          test.  */
5989       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
5990                                                  result_type);
5991       if (tem)
5992         return tem;
5993
5994       /* Otherwise we have (A & C) != 0 where C is a single bit,
5995          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
5996          Similarly for (A & C) == 0.  */
5997
5998       /* If INNER is a right shift of a constant and it plus BITNUM does
5999          not overflow, adjust BITNUM and INNER.  */
6000       if (TREE_CODE (inner) == RSHIFT_EXPR
6001           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6002           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6003           && bitnum < TYPE_PRECISION (type)
6004           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6005                                    bitnum - TYPE_PRECISION (type)))
6006         {
6007           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6008           inner = TREE_OPERAND (inner, 0);
6009         }
6010
6011       /* If we are going to be able to omit the AND below, we must do our
6012          operations as unsigned.  If we must use the AND, we have a choice.
6013          Normally unsigned is faster, but for some machines signed is.  */
6014 #ifdef LOAD_EXTEND_OP
6015       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
6016                       && !flag_syntax_only) ? 0 : 1;
6017 #else
6018       ops_unsigned = 1;
6019 #endif
6020
6021       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6022       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6023       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6024       inner = fold_convert (intermediate_type, inner);
6025
6026       if (bitnum != 0)
6027         inner = build2 (RSHIFT_EXPR, intermediate_type,
6028                         inner, size_int (bitnum));
6029
6030       if (code == EQ_EXPR)
6031         inner = fold_build2 (BIT_XOR_EXPR, intermediate_type,
6032                              inner, integer_one_node);
6033
6034       /* Put the AND last so it can combine with more things.  */
6035       inner = build2 (BIT_AND_EXPR, intermediate_type,
6036                       inner, integer_one_node);
6037
6038       /* Make sure to return the proper type.  */
6039       inner = fold_convert (result_type, inner);
6040
6041       return inner;
6042     }
6043   return NULL_TREE;
6044 }
6045
6046 /* Check whether we are allowed to reorder operands arg0 and arg1,
6047    such that the evaluation of arg1 occurs before arg0.  */
6048
6049 static bool
6050 reorder_operands_p (tree arg0, tree arg1)
6051 {
6052   if (! flag_evaluation_order)
6053       return true;
6054   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6055     return true;
6056   return ! TREE_SIDE_EFFECTS (arg0)
6057          && ! TREE_SIDE_EFFECTS (arg1);
6058 }
6059
6060 /* Test whether it is preferable two swap two operands, ARG0 and
6061    ARG1, for example because ARG0 is an integer constant and ARG1
6062    isn't.  If REORDER is true, only recommend swapping if we can
6063    evaluate the operands in reverse order.  */
6064
6065 bool
6066 tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
6067 {
6068   STRIP_SIGN_NOPS (arg0);
6069   STRIP_SIGN_NOPS (arg1);
6070
6071   if (TREE_CODE (arg1) == INTEGER_CST)
6072     return 0;
6073   if (TREE_CODE (arg0) == INTEGER_CST)
6074     return 1;
6075
6076   if (TREE_CODE (arg1) == REAL_CST)
6077     return 0;
6078   if (TREE_CODE (arg0) == REAL_CST)
6079     return 1;
6080
6081   if (TREE_CODE (arg1) == COMPLEX_CST)
6082     return 0;
6083   if (TREE_CODE (arg0) == COMPLEX_CST)
6084     return 1;
6085
6086   if (TREE_CONSTANT (arg1))
6087     return 0;
6088   if (TREE_CONSTANT (arg0))
6089     return 1;
6090
6091   if (optimize_size)
6092     return 0;
6093
6094   if (reorder && flag_evaluation_order
6095       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6096     return 0;
6097
6098   if (DECL_P (arg1))
6099     return 0;
6100   if (DECL_P (arg0))
6101     return 1;
6102
6103   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6104      for commutative and comparison operators.  Ensuring a canonical
6105      form allows the optimizers to find additional redundancies without
6106      having to explicitly check for both orderings.  */
6107   if (TREE_CODE (arg0) == SSA_NAME
6108       && TREE_CODE (arg1) == SSA_NAME
6109       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6110     return 1;
6111
6112   return 0;
6113 }
6114
6115 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6116    ARG0 is extended to a wider type.  */
6117
6118 static tree
6119 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6120 {
6121   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6122   tree arg1_unw;
6123   tree shorter_type, outer_type;
6124   tree min, max;
6125   bool above, below;
6126
6127   if (arg0_unw == arg0)
6128     return NULL_TREE;
6129   shorter_type = TREE_TYPE (arg0_unw);
6130
6131 #ifdef HAVE_canonicalize_funcptr_for_compare
6132   /* Disable this optimization if we're casting a function pointer
6133      type on targets that require function pointer canonicalization.  */
6134   if (HAVE_canonicalize_funcptr_for_compare
6135       && TREE_CODE (shorter_type) == POINTER_TYPE
6136       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6137     return NULL_TREE;
6138 #endif
6139
6140   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6141     return NULL_TREE;
6142
6143   arg1_unw = get_unwidened (arg1, shorter_type);
6144   if (!arg1_unw)
6145     return NULL_TREE;
6146
6147   /* If possible, express the comparison in the shorter mode.  */
6148   if ((code == EQ_EXPR || code == NE_EXPR
6149        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6150       && (TREE_TYPE (arg1_unw) == shorter_type
6151           || (TREE_CODE (arg1_unw) == INTEGER_CST
6152               && (TREE_CODE (shorter_type) == INTEGER_TYPE
6153                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6154               && int_fits_type_p (arg1_unw, shorter_type))))
6155     return fold_build2 (code, type, arg0_unw,
6156                        fold_convert (shorter_type, arg1_unw));
6157
6158   if (TREE_CODE (arg1_unw) != INTEGER_CST)
6159     return NULL_TREE;
6160
6161   /* If we are comparing with the integer that does not fit into the range
6162      of the shorter type, the result is known.  */
6163   outer_type = TREE_TYPE (arg1_unw);
6164   min = lower_bound_in_type (outer_type, shorter_type);
6165   max = upper_bound_in_type (outer_type, shorter_type);
6166
6167   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6168                                                    max, arg1_unw));
6169   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6170                                                    arg1_unw, min));
6171
6172   switch (code)
6173     {
6174     case EQ_EXPR:
6175       if (above || below)
6176         return omit_one_operand (type, integer_zero_node, arg0);
6177       break;
6178
6179     case NE_EXPR:
6180       if (above || below)
6181         return omit_one_operand (type, integer_one_node, arg0);
6182       break;
6183
6184     case LT_EXPR:
6185     case LE_EXPR:
6186       if (above)
6187         return omit_one_operand (type, integer_one_node, arg0);
6188       else if (below)
6189         return omit_one_operand (type, integer_zero_node, arg0);
6190
6191     case GT_EXPR:
6192     case GE_EXPR:
6193       if (above)
6194         return omit_one_operand (type, integer_zero_node, arg0);
6195       else if (below)
6196         return omit_one_operand (type, integer_one_node, arg0);
6197
6198     default:
6199       break;
6200     }
6201
6202   return NULL_TREE;
6203 }
6204
6205 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6206    ARG0 just the signedness is changed.  */
6207
6208 static tree
6209 fold_sign_changed_comparison (enum tree_code code, tree type,
6210                               tree arg0, tree arg1)
6211 {
6212   tree arg0_inner, tmp;
6213   tree inner_type, outer_type;
6214
6215   if (TREE_CODE (arg0) != NOP_EXPR
6216       && TREE_CODE (arg0) != CONVERT_EXPR)
6217     return NULL_TREE;
6218
6219   outer_type = TREE_TYPE (arg0);
6220   arg0_inner = TREE_OPERAND (arg0, 0);
6221   inner_type = TREE_TYPE (arg0_inner);
6222
6223 #ifdef HAVE_canonicalize_funcptr_for_compare
6224   /* Disable this optimization if we're casting a function pointer
6225      type on targets that require function pointer canonicalization.  */
6226   if (HAVE_canonicalize_funcptr_for_compare
6227       && TREE_CODE (inner_type) == POINTER_TYPE
6228       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6229     return NULL_TREE;
6230 #endif
6231
6232   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6233     return NULL_TREE;
6234
6235   if (TREE_CODE (arg1) != INTEGER_CST
6236       && !((TREE_CODE (arg1) == NOP_EXPR
6237             || TREE_CODE (arg1) == CONVERT_EXPR)
6238            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6239     return NULL_TREE;
6240
6241   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6242       && code != NE_EXPR
6243       && code != EQ_EXPR)
6244     return NULL_TREE;
6245
6246   if (TREE_CODE (arg1) == INTEGER_CST)
6247     {
6248       tmp = build_int_cst_wide (inner_type,
6249                                 TREE_INT_CST_LOW (arg1),
6250                                 TREE_INT_CST_HIGH (arg1));
6251       arg1 = force_fit_type (tmp, 0,
6252                              TREE_OVERFLOW (arg1),
6253                              TREE_CONSTANT_OVERFLOW (arg1));
6254     }
6255   else
6256     arg1 = fold_convert (inner_type, arg1);
6257
6258   return fold_build2 (code, type, arg0_inner, arg1);
6259 }
6260
6261 /* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6262    step of the array.  ADDR is the address. MULT is the multiplicative expression.
6263    If the function succeeds, the new address expression is returned.  Otherwise
6264    NULL_TREE is returned.  */
6265
6266 static tree
6267 try_move_mult_to_index (enum tree_code code, tree addr, tree mult)
6268 {
6269   tree s, delta, step;
6270   tree arg0 = TREE_OPERAND (mult, 0), arg1 = TREE_OPERAND (mult, 1);
6271   tree ref = TREE_OPERAND (addr, 0), pref;
6272   tree ret, pos;
6273   tree itype;
6274
6275   STRIP_NOPS (arg0);
6276   STRIP_NOPS (arg1);
6277   
6278   if (TREE_CODE (arg0) == INTEGER_CST)
6279     {
6280       s = arg0;
6281       delta = arg1;
6282     }
6283   else if (TREE_CODE (arg1) == INTEGER_CST)
6284     {
6285       s = arg1;
6286       delta = arg0;
6287     }
6288   else
6289     return NULL_TREE;
6290
6291   for (;; ref = TREE_OPERAND (ref, 0))
6292     {
6293       if (TREE_CODE (ref) == ARRAY_REF)
6294         {
6295           step = array_ref_element_size (ref);
6296
6297           if (TREE_CODE (step) != INTEGER_CST)
6298             continue;
6299
6300           itype = TREE_TYPE (step);
6301
6302           /* If the type sizes do not match, we might run into problems
6303              when one of them would overflow.  */
6304           if (TYPE_PRECISION (itype) != TYPE_PRECISION (TREE_TYPE (s)))
6305             continue;
6306
6307           if (!operand_equal_p (step, fold_convert (itype, s), 0))
6308             continue;
6309
6310           delta = fold_convert (itype, delta);
6311           break;
6312         }
6313
6314       if (!handled_component_p (ref))
6315         return NULL_TREE;
6316     }
6317
6318   /* We found the suitable array reference.  So copy everything up to it,
6319      and replace the index.  */
6320
6321   pref = TREE_OPERAND (addr, 0);
6322   ret = copy_node (pref);
6323   pos = ret;
6324
6325   while (pref != ref)
6326     {
6327       pref = TREE_OPERAND (pref, 0);
6328       TREE_OPERAND (pos, 0) = copy_node (pref);
6329       pos = TREE_OPERAND (pos, 0);
6330     }
6331
6332   TREE_OPERAND (pos, 1) = fold_build2 (code, itype,
6333                                        TREE_OPERAND (pos, 1),
6334                                        delta);
6335
6336   return build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6337 }
6338
6339
6340 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
6341    means A >= Y && A != MAX, but in this case we know that
6342    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
6343
6344 static tree
6345 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6346 {
6347   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6348
6349   if (TREE_CODE (bound) == LT_EXPR)
6350     a = TREE_OPERAND (bound, 0);
6351   else if (TREE_CODE (bound) == GT_EXPR)
6352     a = TREE_OPERAND (bound, 1);
6353   else
6354     return NULL_TREE;
6355
6356   typea = TREE_TYPE (a);
6357   if (!INTEGRAL_TYPE_P (typea)
6358       && !POINTER_TYPE_P (typea))
6359     return NULL_TREE;
6360
6361   if (TREE_CODE (ineq) == LT_EXPR)
6362     {
6363       a1 = TREE_OPERAND (ineq, 1);
6364       y = TREE_OPERAND (ineq, 0);
6365     }
6366   else if (TREE_CODE (ineq) == GT_EXPR)
6367     {
6368       a1 = TREE_OPERAND (ineq, 0);
6369       y = TREE_OPERAND (ineq, 1);
6370     }
6371   else
6372     return NULL_TREE;
6373
6374   if (TREE_TYPE (a1) != typea)
6375     return NULL_TREE;
6376
6377   diff = fold_build2 (MINUS_EXPR, typea, a1, a);
6378   if (!integer_onep (diff))
6379     return NULL_TREE;
6380
6381   return fold_build2 (GE_EXPR, type, a, y);
6382 }
6383
6384 /* Fold complex addition when both components are accessible by parts.
6385    Return non-null if successful.  CODE should be PLUS_EXPR for addition,
6386    or MINUS_EXPR for subtraction.  */
6387
6388 static tree
6389 fold_complex_add (tree type, tree ac, tree bc, enum tree_code code)
6390 {
6391   tree ar, ai, br, bi, rr, ri, inner_type;
6392
6393   if (TREE_CODE (ac) == COMPLEX_EXPR)
6394     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6395   else if (TREE_CODE (ac) == COMPLEX_CST)
6396     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6397   else
6398     return NULL;
6399
6400   if (TREE_CODE (bc) == COMPLEX_EXPR)
6401     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6402   else if (TREE_CODE (bc) == COMPLEX_CST)
6403     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6404   else
6405     return NULL;
6406
6407   inner_type = TREE_TYPE (type);
6408
6409   rr = fold_build2 (code, inner_type, ar, br); 
6410   ri = fold_build2 (code, inner_type, ai, bi); 
6411
6412   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6413 }
6414
6415 /* Perform some simplifications of complex multiplication when one or more
6416    of the components are constants or zeros.  Return non-null if successful.  */
6417
6418 tree
6419 fold_complex_mult_parts (tree type, tree ar, tree ai, tree br, tree bi)
6420 {
6421   tree rr, ri, inner_type, zero;
6422   bool ar0, ai0, br0, bi0, bi1;
6423
6424   inner_type = TREE_TYPE (type);
6425   zero = NULL;
6426
6427   if (SCALAR_FLOAT_TYPE_P (inner_type))
6428     {
6429       ar0 = ai0 = br0 = bi0 = bi1 = false;
6430
6431       /* We're only interested in +0.0 here, thus we don't use real_zerop.  */
6432
6433       if (TREE_CODE (ar) == REAL_CST
6434           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ar), dconst0))
6435         ar0 = true, zero = ar;
6436
6437       if (TREE_CODE (ai) == REAL_CST
6438           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst0))
6439         ai0 = true, zero = ai;
6440
6441       if (TREE_CODE (br) == REAL_CST
6442           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (br), dconst0))
6443         br0 = true, zero = br;
6444
6445       if (TREE_CODE (bi) == REAL_CST)
6446         {
6447           if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst0))
6448             bi0 = true, zero = bi;
6449           else if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst1))
6450             bi1 = true;
6451         }
6452     }
6453   else
6454     {
6455       ar0 = integer_zerop (ar);
6456       if (ar0)
6457         zero = ar;
6458       ai0 = integer_zerop (ai);
6459       if (ai0)
6460         zero = ai;
6461       br0 = integer_zerop (br);
6462       if (br0)
6463         zero = br;
6464       bi0 = integer_zerop (bi);
6465       if (bi0)
6466         {
6467           zero = bi;
6468           bi1 = false;
6469         }
6470       else
6471         bi1 = integer_onep (bi);
6472     }
6473
6474   /* We won't optimize anything below unless something is zero.  */
6475   if (zero == NULL)
6476     return NULL;
6477
6478   if (ai0 && br0 && bi1)
6479     {
6480       rr = zero;
6481       ri = ar;
6482     }
6483   else if (ai0 && bi0)
6484     {
6485       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6486       ri = zero;
6487     }
6488   else if (ai0 && br0)
6489     {
6490       rr = zero;
6491       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6492     }
6493   else if (ar0 && bi0)
6494     {
6495       rr = zero;
6496       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6497     }
6498   else if (ar0 && br0)
6499     {
6500       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6501       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6502       ri = zero;
6503     }
6504   else if (bi0)
6505     {
6506       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6507       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6508     }
6509   else if (ai0)
6510     {
6511       rr = fold_build2 (MULT_EXPR, inner_type, ar, br);
6512       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6513     }
6514   else if (br0)
6515     {
6516       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6517       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6518       ri = fold_build2 (MULT_EXPR, inner_type, ar, bi);
6519     }
6520   else if (ar0)
6521     {
6522       rr = fold_build2 (MULT_EXPR, inner_type, ai, bi);
6523       rr = fold_build1 (NEGATE_EXPR, inner_type, rr);
6524       ri = fold_build2 (MULT_EXPR, inner_type, ai, br);
6525     }
6526   else
6527     return NULL;
6528
6529   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6530 }
6531
6532 static tree
6533 fold_complex_mult (tree type, tree ac, tree bc)
6534 {
6535   tree ar, ai, br, bi;
6536
6537   if (TREE_CODE (ac) == COMPLEX_EXPR)
6538     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6539   else if (TREE_CODE (ac) == COMPLEX_CST)
6540     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6541   else
6542     return NULL;
6543
6544   if (TREE_CODE (bc) == COMPLEX_EXPR)
6545     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6546   else if (TREE_CODE (bc) == COMPLEX_CST)
6547     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6548   else
6549     return NULL;
6550
6551   return fold_complex_mult_parts (type, ar, ai, br, bi);
6552 }
6553
6554 /* Perform some simplifications of complex division when one or more of
6555    the components are constants or zeros.  Return non-null if successful.  */
6556
6557 tree
6558 fold_complex_div_parts (tree type, tree ar, tree ai, tree br, tree bi,
6559                         enum tree_code code)
6560 {
6561   tree rr, ri, inner_type, zero;
6562   bool ar0, ai0, br0, bi0, bi1;
6563
6564   inner_type = TREE_TYPE (type);
6565   zero = NULL;
6566
6567   if (SCALAR_FLOAT_TYPE_P (inner_type))
6568     {
6569       ar0 = ai0 = br0 = bi0 = bi1 = false;
6570
6571       /* We're only interested in +0.0 here, thus we don't use real_zerop.  */
6572
6573       if (TREE_CODE (ar) == REAL_CST
6574           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ar), dconst0))
6575         ar0 = true, zero = ar;
6576
6577       if (TREE_CODE (ai) == REAL_CST
6578           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst0))
6579         ai0 = true, zero = ai;
6580
6581       if (TREE_CODE (br) == REAL_CST
6582           && REAL_VALUES_IDENTICAL (TREE_REAL_CST (br), dconst0))
6583         br0 = true, zero = br;
6584
6585       if (TREE_CODE (bi) == REAL_CST)
6586         {
6587           if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst0))
6588             bi0 = true, zero = bi;
6589           else if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (bi), dconst1))
6590             bi1 = true;
6591         }
6592     }
6593   else
6594     {
6595       ar0 = integer_zerop (ar);
6596       if (ar0)
6597         zero = ar;
6598       ai0 = integer_zerop (ai);
6599       if (ai0)
6600         zero = ai;
6601       br0 = integer_zerop (br);
6602       if (br0)
6603         zero = br;
6604       bi0 = integer_zerop (bi);
6605       if (bi0)
6606         {
6607           zero = bi;
6608           bi1 = false;
6609         }
6610       else
6611         bi1 = integer_onep (bi);
6612     }
6613
6614   /* We won't optimize anything below unless something is zero.  */
6615   if (zero == NULL)
6616     return NULL;
6617
6618   if (ai0 && bi0)
6619     {
6620       rr = fold_build2 (code, inner_type, ar, br);
6621       ri = zero;
6622     }
6623   else if (ai0 && br0)
6624     {
6625       rr = zero;
6626       ri = fold_build2 (code, inner_type, ar, bi);
6627       ri = fold_build1 (NEGATE_EXPR, inner_type, ri);
6628     }
6629   else if (ar0 && bi0)
6630     {
6631       rr = zero;
6632       ri = fold_build2 (code, inner_type, ai, br);
6633     }
6634   else if (ar0 && br0)
6635     {
6636       rr = fold_build2 (code, inner_type, ai, bi);
6637       ri = zero;
6638     }
6639   else if (bi0)
6640     {
6641       rr = fold_build2 (code, inner_type, ar, br);
6642       ri = fold_build2 (code, inner_type, ai, br);
6643     }
6644   else if (br0)
6645     {
6646       rr = fold_build2 (code, inner_type, ai, bi);
6647       ri = fold_build2 (code, inner_type, ar, bi);
6648       ri = fold_build1 (NEGATE_EXPR, inner_type, ri);
6649     }
6650   else
6651     return NULL;
6652
6653   return fold_build2 (COMPLEX_EXPR, type, rr, ri);
6654 }
6655
6656 static tree
6657 fold_complex_div (tree type, tree ac, tree bc, enum tree_code code)
6658 {
6659   tree ar, ai, br, bi;
6660
6661   if (TREE_CODE (ac) == COMPLEX_EXPR)
6662     ar = TREE_OPERAND (ac, 0), ai = TREE_OPERAND (ac, 1);
6663   else if (TREE_CODE (ac) == COMPLEX_CST)
6664     ar = TREE_REALPART (ac), ai = TREE_IMAGPART (ac);
6665   else
6666     return NULL;
6667
6668   if (TREE_CODE (bc) == COMPLEX_EXPR)
6669     br = TREE_OPERAND (bc, 0), bi = TREE_OPERAND (bc, 1);
6670   else if (TREE_CODE (bc) == COMPLEX_CST)
6671     br = TREE_REALPART (bc), bi = TREE_IMAGPART (bc);
6672   else
6673     return NULL;
6674
6675   return fold_complex_div_parts (type, ar, ai, br, bi, code);
6676 }
6677
6678 /* Fold a unary expression of code CODE and type TYPE with operand
6679    OP0.  Return the folded expression if folding is successful.
6680    Otherwise, return NULL_TREE.  */
6681
6682 tree
6683 fold_unary (enum tree_code code, tree type, tree op0)
6684 {
6685   tree tem;
6686   tree arg0;
6687   enum tree_code_class kind = TREE_CODE_CLASS (code);
6688
6689   gcc_assert (IS_EXPR_CODE_CLASS (kind)
6690               && TREE_CODE_LENGTH (code) == 1);
6691
6692   arg0 = op0;
6693   if (arg0)
6694     {
6695       if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
6696         {
6697           /* Don't use STRIP_NOPS, because signedness of argument type matters.  */
6698           STRIP_SIGN_NOPS (arg0);
6699         }
6700       else
6701         {
6702           /* Strip any conversions that don't change the mode.  This
6703              is safe for every expression, except for a comparison
6704              expression because its signedness is derived from its
6705              operands.
6706
6707              Note that this is done as an internal manipulation within
6708              the constant folder, in order to find the simplest
6709              representation of the arguments so that their form can be
6710              studied.  In any cases, the appropriate type conversions
6711              should be put back in the tree that will get out of the
6712              constant folder.  */
6713           STRIP_NOPS (arg0);
6714         }
6715     }
6716
6717   if (TREE_CODE_CLASS (code) == tcc_unary)
6718     {
6719       if (TREE_CODE (arg0) == COMPOUND_EXPR)
6720         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
6721                        fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
6722       else if (TREE_CODE (arg0) == COND_EXPR)
6723         {
6724           tree arg01 = TREE_OPERAND (arg0, 1);
6725           tree arg02 = TREE_OPERAND (arg0, 2);
6726           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
6727             arg01 = fold_build1 (code, type, arg01);
6728           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
6729             arg02 = fold_build1 (code, type, arg02);
6730           tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
6731                              arg01, arg02);
6732
6733           /* If this was a conversion, and all we did was to move into
6734              inside the COND_EXPR, bring it back out.  But leave it if
6735              it is a conversion from integer to integer and the
6736              result precision is no wider than a word since such a
6737              conversion is cheap and may be optimized away by combine,
6738              while it couldn't if it were outside the COND_EXPR.  Then return
6739              so we don't get into an infinite recursion loop taking the
6740              conversion out and then back in.  */
6741
6742           if ((code == NOP_EXPR || code == CONVERT_EXPR
6743                || code == NON_LVALUE_EXPR)
6744               && TREE_CODE (tem) == COND_EXPR
6745               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
6746               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
6747               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
6748               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
6749               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
6750                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
6751               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
6752                      && (INTEGRAL_TYPE_P
6753                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
6754                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
6755                   || flag_syntax_only))
6756             tem = build1 (code, type,
6757                           build3 (COND_EXPR,
6758                                   TREE_TYPE (TREE_OPERAND
6759                                              (TREE_OPERAND (tem, 1), 0)),
6760                                   TREE_OPERAND (tem, 0),
6761                                   TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
6762                                   TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
6763           return tem;
6764         }
6765       else if (COMPARISON_CLASS_P (arg0))
6766         {
6767           if (TREE_CODE (type) == BOOLEAN_TYPE)
6768             {
6769               arg0 = copy_node (arg0);
6770               TREE_TYPE (arg0) = type;
6771               return arg0;
6772             }
6773           else if (TREE_CODE (type) != INTEGER_TYPE)
6774             return fold_build3 (COND_EXPR, type, arg0,
6775                                 fold_build1 (code, type,
6776                                              integer_one_node),
6777                                 fold_build1 (code, type,
6778                                              integer_zero_node));
6779         }
6780    }
6781
6782   switch (code)
6783     {
6784     case NOP_EXPR:
6785     case FLOAT_EXPR:
6786     case CONVERT_EXPR:
6787     case FIX_TRUNC_EXPR:
6788     case FIX_CEIL_EXPR:
6789     case FIX_FLOOR_EXPR:
6790     case FIX_ROUND_EXPR:
6791       if (TREE_TYPE (op0) == type)
6792         return op0;
6793
6794       /* Handle cases of two conversions in a row.  */
6795       if (TREE_CODE (op0) == NOP_EXPR
6796           || TREE_CODE (op0) == CONVERT_EXPR)
6797         {
6798           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
6799           tree inter_type = TREE_TYPE (op0);
6800           int inside_int = INTEGRAL_TYPE_P (inside_type);
6801           int inside_ptr = POINTER_TYPE_P (inside_type);
6802           int inside_float = FLOAT_TYPE_P (inside_type);
6803           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
6804           unsigned int inside_prec = TYPE_PRECISION (inside_type);
6805           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
6806           int inter_int = INTEGRAL_TYPE_P (inter_type);
6807           int inter_ptr = POINTER_TYPE_P (inter_type);
6808           int inter_float = FLOAT_TYPE_P (inter_type);
6809           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
6810           unsigned int inter_prec = TYPE_PRECISION (inter_type);
6811           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
6812           int final_int = INTEGRAL_TYPE_P (type);
6813           int final_ptr = POINTER_TYPE_P (type);
6814           int final_float = FLOAT_TYPE_P (type);
6815           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
6816           unsigned int final_prec = TYPE_PRECISION (type);
6817           int final_unsignedp = TYPE_UNSIGNED (type);
6818
6819           /* In addition to the cases of two conversions in a row
6820              handled below, if we are converting something to its own
6821              type via an object of identical or wider precision, neither
6822              conversion is needed.  */
6823           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
6824               && ((inter_int && final_int) || (inter_float && final_float))
6825               && inter_prec >= final_prec)
6826             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6827
6828           /* Likewise, if the intermediate and final types are either both
6829              float or both integer, we don't need the middle conversion if
6830              it is wider than the final type and doesn't change the signedness
6831              (for integers).  Avoid this if the final type is a pointer
6832              since then we sometimes need the inner conversion.  Likewise if
6833              the outer has a precision not equal to the size of its mode.  */
6834           if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
6835                || (inter_float && inside_float)
6836                || (inter_vec && inside_vec))
6837               && inter_prec >= inside_prec
6838               && (inter_float || inter_vec
6839                   || inter_unsignedp == inside_unsignedp)
6840               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6841                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
6842               && ! final_ptr
6843               && (! final_vec || inter_prec == inside_prec))
6844             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6845
6846           /* If we have a sign-extension of a zero-extended value, we can
6847              replace that by a single zero-extension.  */
6848           if (inside_int && inter_int && final_int
6849               && inside_prec < inter_prec && inter_prec < final_prec
6850               && inside_unsignedp && !inter_unsignedp)
6851             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6852
6853           /* Two conversions in a row are not needed unless:
6854              - some conversion is floating-point (overstrict for now), or
6855              - some conversion is a vector (overstrict for now), or
6856              - the intermediate type is narrower than both initial and
6857                final, or
6858              - the intermediate type and innermost type differ in signedness,
6859                and the outermost type is wider than the intermediate, or
6860              - the initial type is a pointer type and the precisions of the
6861                intermediate and final types differ, or
6862              - the final type is a pointer type and the precisions of the
6863                initial and intermediate types differ.  */
6864           if (! inside_float && ! inter_float && ! final_float
6865               && ! inside_vec && ! inter_vec && ! final_vec
6866               && (inter_prec > inside_prec || inter_prec > final_prec)
6867               && ! (inside_int && inter_int
6868                     && inter_unsignedp != inside_unsignedp
6869                     && inter_prec < final_prec)
6870               && ((inter_unsignedp && inter_prec > inside_prec)
6871                   == (final_unsignedp && final_prec > inter_prec))
6872               && ! (inside_ptr && inter_prec != final_prec)
6873               && ! (final_ptr && inside_prec != inter_prec)
6874               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6875                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
6876               && ! final_ptr)
6877             return fold_build1 (code, type, TREE_OPERAND (op0, 0));
6878         }
6879
6880       if (TREE_CODE (op0) == MODIFY_EXPR
6881           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
6882           /* Detect assigning a bitfield.  */
6883           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
6884                && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
6885         {
6886           /* Don't leave an assignment inside a conversion
6887              unless assigning a bitfield.  */
6888           tem = fold_build1 (code, type, TREE_OPERAND (op0, 1));
6889           /* First do the assignment, then return converted constant.  */
6890           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
6891           TREE_NO_WARNING (tem) = 1;
6892           TREE_USED (tem) = 1;
6893           return tem;
6894         }
6895
6896       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
6897          constants (if x has signed type, the sign bit cannot be set
6898          in c).  This folds extension into the BIT_AND_EXPR.  */
6899       if (INTEGRAL_TYPE_P (type)
6900           && TREE_CODE (type) != BOOLEAN_TYPE
6901           && TREE_CODE (op0) == BIT_AND_EXPR
6902           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
6903         {
6904           tree and = op0;
6905           tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
6906           int change = 0;
6907
6908           if (TYPE_UNSIGNED (TREE_TYPE (and))
6909               || (TYPE_PRECISION (type)
6910                   <= TYPE_PRECISION (TREE_TYPE (and))))
6911             change = 1;
6912           else if (TYPE_PRECISION (TREE_TYPE (and1))
6913                    <= HOST_BITS_PER_WIDE_INT
6914                    && host_integerp (and1, 1))
6915             {
6916               unsigned HOST_WIDE_INT cst;
6917
6918               cst = tree_low_cst (and1, 1);
6919               cst &= (HOST_WIDE_INT) -1
6920                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
6921               change = (cst == 0);
6922 #ifdef LOAD_EXTEND_OP
6923               if (change
6924                   && !flag_syntax_only
6925                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
6926                       == ZERO_EXTEND))
6927                 {
6928                   tree uns = lang_hooks.types.unsigned_type (TREE_TYPE (and0));
6929                   and0 = fold_convert (uns, and0);
6930                   and1 = fold_convert (uns, and1);
6931                 }
6932 #endif
6933             }
6934           if (change)
6935             {
6936               tem = build_int_cst_wide (type, TREE_INT_CST_LOW (and1),
6937                                         TREE_INT_CST_HIGH (and1));
6938               tem = force_fit_type (tem, 0, TREE_OVERFLOW (and1),
6939                                     TREE_CONSTANT_OVERFLOW (and1));
6940               return fold_build2 (BIT_AND_EXPR, type,
6941                                   fold_convert (type, and0), tem);
6942             }
6943         }
6944
6945       /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
6946          T2 being pointers to types of the same size.  */
6947       if (POINTER_TYPE_P (type)
6948           && BINARY_CLASS_P (arg0)
6949           && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
6950           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
6951         {
6952           tree arg00 = TREE_OPERAND (arg0, 0);
6953           tree t0 = type;
6954           tree t1 = TREE_TYPE (arg00);
6955           tree tt0 = TREE_TYPE (t0);
6956           tree tt1 = TREE_TYPE (t1);
6957           tree s0 = TYPE_SIZE (tt0);
6958           tree s1 = TYPE_SIZE (tt1);
6959
6960           if (s0 && s1 && operand_equal_p (s0, s1, OEP_ONLY_CONST))
6961             return build2 (TREE_CODE (arg0), t0, fold_convert (t0, arg00),
6962                            TREE_OPERAND (arg0, 1));
6963         }
6964
6965       tem = fold_convert_const (code, type, arg0);
6966       return tem ? tem : NULL_TREE;
6967
6968     case VIEW_CONVERT_EXPR:
6969       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
6970         return build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
6971       return NULL_TREE;
6972
6973     case NEGATE_EXPR:
6974       if (negate_expr_p (arg0))
6975         return fold_convert (type, negate_expr (arg0));
6976       /* Convert - (~A) to A + 1.  */
6977       if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == BIT_NOT_EXPR)
6978         return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (arg0, 0),
6979                             build_int_cst (type, 1));
6980       return NULL_TREE;
6981
6982     case ABS_EXPR:
6983       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
6984         return fold_abs_const (arg0, type);
6985       else if (TREE_CODE (arg0) == NEGATE_EXPR)
6986         return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
6987       /* Convert fabs((double)float) into (double)fabsf(float).  */
6988       else if (TREE_CODE (arg0) == NOP_EXPR
6989                && TREE_CODE (type) == REAL_TYPE)
6990         {
6991           tree targ0 = strip_float_extensions (arg0);
6992           if (targ0 != arg0)
6993             return fold_convert (type, fold_build1 (ABS_EXPR,
6994                                                     TREE_TYPE (targ0),
6995                                                     targ0));
6996         }
6997       else if (tree_expr_nonnegative_p (arg0))
6998         return arg0;
6999
7000       /* Strip sign ops from argument.  */
7001       if (TREE_CODE (type) == REAL_TYPE)
7002         {
7003           tem = fold_strip_sign_ops (arg0);
7004           if (tem)
7005             return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7006         }
7007       return NULL_TREE;
7008
7009     case CONJ_EXPR:
7010       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7011         return fold_convert (type, arg0);
7012       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
7013         return build2 (COMPLEX_EXPR, type,
7014                        TREE_OPERAND (arg0, 0),
7015                        negate_expr (TREE_OPERAND (arg0, 1)));
7016       else if (TREE_CODE (arg0) == COMPLEX_CST)
7017         return build_complex (type, TREE_REALPART (arg0),
7018                               negate_expr (TREE_IMAGPART (arg0)));
7019       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7020         return fold_build2 (TREE_CODE (arg0), type,
7021                             fold_build1 (CONJ_EXPR, type,
7022                                          TREE_OPERAND (arg0, 0)),
7023                             fold_build1 (CONJ_EXPR, type,
7024                                          TREE_OPERAND (arg0, 1)));
7025       else if (TREE_CODE (arg0) == CONJ_EXPR)
7026         return TREE_OPERAND (arg0, 0);
7027       return NULL_TREE;
7028
7029     case BIT_NOT_EXPR:
7030       if (TREE_CODE (arg0) == INTEGER_CST)
7031         return fold_not_const (arg0, type);
7032       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7033         return TREE_OPERAND (arg0, 0);
7034       /* Convert ~ (-A) to A - 1.  */
7035       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7036         return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7037                             build_int_cst (type, 1));
7038       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
7039       else if (INTEGRAL_TYPE_P (type)
7040                && ((TREE_CODE (arg0) == MINUS_EXPR
7041                     && integer_onep (TREE_OPERAND (arg0, 1)))
7042                    || (TREE_CODE (arg0) == PLUS_EXPR
7043                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7044         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7045       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
7046       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7047                && (tem = fold_unary (BIT_NOT_EXPR, type,
7048                                      fold_convert (type,
7049                                                    TREE_OPERAND (arg0, 0)))))
7050         return fold_build2 (BIT_XOR_EXPR, type, tem,
7051                             fold_convert (type, TREE_OPERAND (arg0, 1)));
7052       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7053                && (tem = fold_unary (BIT_NOT_EXPR, type,
7054                                      fold_convert (type,
7055                                                    TREE_OPERAND (arg0, 1)))))
7056         return fold_build2 (BIT_XOR_EXPR, type,
7057                             fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
7058
7059       return NULL_TREE;
7060
7061     case TRUTH_NOT_EXPR:
7062       /* The argument to invert_truthvalue must have Boolean type.  */
7063       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7064           arg0 = fold_convert (boolean_type_node, arg0);
7065
7066       /* Note that the operand of this must be an int
7067          and its values must be 0 or 1.
7068          ("true" is a fixed value perhaps depending on the language,
7069          but we don't handle values other than 1 correctly yet.)  */
7070       tem = invert_truthvalue (arg0);
7071       /* Avoid infinite recursion.  */
7072       if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
7073         return NULL_TREE;
7074       return fold_convert (type, tem);
7075
7076     case REALPART_EXPR:
7077       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7078         return NULL_TREE;
7079       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
7080         return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7081                                  TREE_OPERAND (arg0, 1));
7082       else if (TREE_CODE (arg0) == COMPLEX_CST)
7083         return TREE_REALPART (arg0);
7084       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7085         return fold_build2 (TREE_CODE (arg0), type,
7086                             fold_build1 (REALPART_EXPR, type,
7087                                          TREE_OPERAND (arg0, 0)),
7088                             fold_build1 (REALPART_EXPR, type,
7089                                          TREE_OPERAND (arg0, 1)));
7090       return NULL_TREE;
7091
7092     case IMAGPART_EXPR:
7093       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7094         return fold_convert (type, integer_zero_node);
7095       else if (TREE_CODE (arg0) == COMPLEX_EXPR)
7096         return omit_one_operand (type, TREE_OPERAND (arg0, 1),
7097                                  TREE_OPERAND (arg0, 0));
7098       else if (TREE_CODE (arg0) == COMPLEX_CST)
7099         return TREE_IMAGPART (arg0);
7100       else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7101         return fold_build2 (TREE_CODE (arg0), type,
7102                             fold_build1 (IMAGPART_EXPR, type,
7103                                          TREE_OPERAND (arg0, 0)),
7104                             fold_build1 (IMAGPART_EXPR, type,
7105                                          TREE_OPERAND (arg0, 1)));
7106       return NULL_TREE;
7107
7108     default:
7109       return NULL_TREE;
7110     } /* switch (code) */
7111 }
7112
7113 /* Fold a binary expression of code CODE and type TYPE with operands
7114    OP0 and OP1.  Return the folded expression if folding is
7115    successful.  Otherwise, return NULL_TREE.  */
7116
7117 tree
7118 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
7119 {
7120   tree t1 = NULL_TREE;
7121   tree tem;
7122   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
7123   enum tree_code_class kind = TREE_CODE_CLASS (code);
7124
7125   /* WINS will be nonzero when the switch is done
7126      if all operands are constant.  */
7127   int wins = 1;
7128
7129   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7130               && TREE_CODE_LENGTH (code) == 2);
7131
7132   arg0 = op0;
7133   arg1 = op1;
7134
7135   if (arg0)
7136     {
7137       tree subop;
7138
7139       /* Strip any conversions that don't change the mode.  This is
7140          safe for every expression, except for a comparison expression
7141          because its signedness is derived from its operands.  So, in
7142          the latter case, only strip conversions that don't change the
7143          signedness.
7144
7145          Note that this is done as an internal manipulation within the
7146          constant folder, in order to find the simplest representation
7147          of the arguments so that their form can be studied.  In any
7148          cases, the appropriate type conversions should be put back in
7149          the tree that will get out of the constant folder.  */
7150       if (kind == tcc_comparison)
7151         STRIP_SIGN_NOPS (arg0);
7152       else
7153         STRIP_NOPS (arg0);
7154
7155       if (TREE_CODE (arg0) == COMPLEX_CST)
7156         subop = TREE_REALPART (arg0);
7157       else
7158         subop = arg0;
7159
7160       if (TREE_CODE (subop) != INTEGER_CST
7161           && TREE_CODE (subop) != REAL_CST)
7162         /* Note that TREE_CONSTANT isn't enough:
7163            static var addresses are constant but we can't
7164            do arithmetic on them.  */
7165         wins = 0;
7166     }
7167
7168   if (arg1)
7169     {
7170       tree subop;
7171
7172       /* Strip any conversions that don't change the mode.  This is
7173          safe for every expression, except for a comparison expression
7174          because its signedness is derived from its operands.  So, in
7175          the latter case, only strip conversions that don't change the
7176          signedness.
7177
7178          Note that this is done as an internal manipulation within the
7179          constant folder, in order to find the simplest representation
7180          of the arguments so that their form can be studied.  In any
7181          cases, the appropriate type conversions should be put back in
7182          the tree that will get out of the constant folder.  */
7183       if (kind == tcc_comparison)
7184         STRIP_SIGN_NOPS (arg1);
7185       else
7186         STRIP_NOPS (arg1);
7187
7188       if (TREE_CODE (arg1) == COMPLEX_CST)
7189         subop = TREE_REALPART (arg1);
7190       else
7191         subop = arg1;
7192
7193       if (TREE_CODE (subop) != INTEGER_CST
7194           && TREE_CODE (subop) != REAL_CST)
7195         /* Note that TREE_CONSTANT isn't enough:
7196            static var addresses are constant but we can't
7197            do arithmetic on them.  */
7198         wins = 0;
7199     }
7200
7201   /* If this is a commutative operation, and ARG0 is a constant, move it
7202      to ARG1 to reduce the number of tests below.  */
7203   if (commutative_tree_code (code)
7204       && tree_swap_operands_p (arg0, arg1, true))
7205     return fold_build2 (code, type, op1, op0);
7206
7207   /* Now WINS is set as described above,
7208      ARG0 is the first operand of EXPR,
7209      and ARG1 is the second operand (if it has more than one operand).
7210
7211      First check for cases where an arithmetic operation is applied to a
7212      compound, conditional, or comparison operation.  Push the arithmetic
7213      operation inside the compound or conditional to see if any folding
7214      can then be done.  Convert comparison to conditional for this purpose.
7215      The also optimizes non-constant cases that used to be done in
7216      expand_expr.
7217
7218      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
7219      one of the operands is a comparison and the other is a comparison, a
7220      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
7221      code below would make the expression more complex.  Change it to a
7222      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
7223      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
7224
7225   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
7226        || code == EQ_EXPR || code == NE_EXPR)
7227       && ((truth_value_p (TREE_CODE (arg0))
7228            && (truth_value_p (TREE_CODE (arg1))
7229                || (TREE_CODE (arg1) == BIT_AND_EXPR
7230                    && integer_onep (TREE_OPERAND (arg1, 1)))))
7231           || (truth_value_p (TREE_CODE (arg1))
7232               && (truth_value_p (TREE_CODE (arg0))
7233                   || (TREE_CODE (arg0) == BIT_AND_EXPR
7234                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
7235     {
7236       tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
7237                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
7238                          : TRUTH_XOR_EXPR,
7239                          boolean_type_node,
7240                          fold_convert (boolean_type_node, arg0),
7241                          fold_convert (boolean_type_node, arg1));
7242
7243       if (code == EQ_EXPR)
7244         tem = invert_truthvalue (tem);
7245
7246       return fold_convert (type, tem);
7247     }
7248
7249   if (TREE_CODE_CLASS (code) == tcc_comparison
7250            && TREE_CODE (arg0) == COMPOUND_EXPR)
7251     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7252                    fold_build2 (code, type, TREE_OPERAND (arg0, 1), arg1));
7253   else if (TREE_CODE_CLASS (code) == tcc_comparison
7254            && TREE_CODE (arg1) == COMPOUND_EXPR)
7255     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
7256                    fold_build2 (code, type, arg0, TREE_OPERAND (arg1, 1)));
7257   else if (TREE_CODE_CLASS (code) == tcc_binary
7258            || TREE_CODE_CLASS (code) == tcc_comparison)
7259     {
7260       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7261         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7262                        fold_build2 (code, type, TREE_OPERAND (arg0, 1),
7263                                     arg1));
7264       if (TREE_CODE (arg1) == COMPOUND_EXPR
7265           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
7266         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
7267                        fold_build2 (code, type,
7268                                     arg0, TREE_OPERAND (arg1, 1)));
7269
7270       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
7271         {
7272           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
7273                                                      arg0, arg1, 
7274                                                      /*cond_first_p=*/1);
7275           if (tem != NULL_TREE)
7276             return tem;
7277         }
7278
7279       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
7280         {
7281           tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
7282                                                      arg1, arg0, 
7283                                                      /*cond_first_p=*/0);
7284           if (tem != NULL_TREE)
7285             return tem;
7286         }
7287     }
7288
7289   switch (code)
7290     {
7291     case PLUS_EXPR:
7292       /* A + (-B) -> A - B */
7293       if (TREE_CODE (arg1) == NEGATE_EXPR)
7294         return fold_build2 (MINUS_EXPR, type,
7295                             fold_convert (type, arg0),
7296                             fold_convert (type, TREE_OPERAND (arg1, 0)));
7297       /* (-A) + B -> B - A */
7298       if (TREE_CODE (arg0) == NEGATE_EXPR
7299           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
7300         return fold_build2 (MINUS_EXPR, type,
7301                             fold_convert (type, arg1),
7302                             fold_convert (type, TREE_OPERAND (arg0, 0)));
7303       /* Convert ~A + 1 to -A.  */
7304       if (INTEGRAL_TYPE_P (type)
7305           && TREE_CODE (arg0) == BIT_NOT_EXPR
7306           && integer_onep (arg1))
7307         return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7308
7309       if (TREE_CODE (type) == COMPLEX_TYPE)
7310         {
7311           tem = fold_complex_add (type, arg0, arg1, PLUS_EXPR);
7312           if (tem)
7313             return tem;
7314         }
7315
7316       if (! FLOAT_TYPE_P (type))
7317         {
7318           if (integer_zerop (arg1))
7319             return non_lvalue (fold_convert (type, arg0));
7320
7321           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
7322              with a constant, and the two constants have no bits in common,
7323              we should treat this as a BIT_IOR_EXPR since this may produce more
7324              simplifications.  */
7325           if (TREE_CODE (arg0) == BIT_AND_EXPR
7326               && TREE_CODE (arg1) == BIT_AND_EXPR
7327               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7328               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
7329               && integer_zerop (const_binop (BIT_AND_EXPR,
7330                                              TREE_OPERAND (arg0, 1),
7331                                              TREE_OPERAND (arg1, 1), 0)))
7332             {
7333               code = BIT_IOR_EXPR;
7334               goto bit_ior;
7335             }
7336
7337           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
7338              (plus (plus (mult) (mult)) (foo)) so that we can
7339              take advantage of the factoring cases below.  */
7340           if (((TREE_CODE (arg0) == PLUS_EXPR
7341                 || TREE_CODE (arg0) == MINUS_EXPR)
7342                && TREE_CODE (arg1) == MULT_EXPR)
7343               || ((TREE_CODE (arg1) == PLUS_EXPR
7344                    || TREE_CODE (arg1) == MINUS_EXPR)
7345                   && TREE_CODE (arg0) == MULT_EXPR))
7346             {
7347               tree parg0, parg1, parg, marg;
7348               enum tree_code pcode;
7349
7350               if (TREE_CODE (arg1) == MULT_EXPR)
7351                 parg = arg0, marg = arg1;
7352               else
7353                 parg = arg1, marg = arg0;
7354               pcode = TREE_CODE (parg);
7355               parg0 = TREE_OPERAND (parg, 0);
7356               parg1 = TREE_OPERAND (parg, 1);
7357               STRIP_NOPS (parg0);
7358               STRIP_NOPS (parg1);
7359
7360               if (TREE_CODE (parg0) == MULT_EXPR
7361                   && TREE_CODE (parg1) != MULT_EXPR)
7362                 return fold_build2 (pcode, type,
7363                                     fold_build2 (PLUS_EXPR, type,
7364                                                  fold_convert (type, parg0),
7365                                                  fold_convert (type, marg)),
7366                                     fold_convert (type, parg1));
7367               if (TREE_CODE (parg0) != MULT_EXPR
7368                   && TREE_CODE (parg1) == MULT_EXPR)
7369                 return fold_build2 (PLUS_EXPR, type,
7370                                     fold_convert (type, parg0),
7371                                     fold_build2 (pcode, type,
7372                                                  fold_convert (type, marg),
7373                                                  fold_convert (type,
7374                                                                parg1)));
7375             }
7376
7377           if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
7378             {
7379               tree arg00, arg01, arg10, arg11;
7380               tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7381
7382               /* (A * C) + (B * C) -> (A+B) * C.
7383                  We are most concerned about the case where C is a constant,
7384                  but other combinations show up during loop reduction.  Since
7385                  it is not difficult, try all four possibilities.  */
7386
7387               arg00 = TREE_OPERAND (arg0, 0);
7388               arg01 = TREE_OPERAND (arg0, 1);
7389               arg10 = TREE_OPERAND (arg1, 0);
7390               arg11 = TREE_OPERAND (arg1, 1);
7391               same = NULL_TREE;
7392
7393               if (operand_equal_p (arg01, arg11, 0))
7394                 same = arg01, alt0 = arg00, alt1 = arg10;
7395               else if (operand_equal_p (arg00, arg10, 0))
7396                 same = arg00, alt0 = arg01, alt1 = arg11;
7397               else if (operand_equal_p (arg00, arg11, 0))
7398                 same = arg00, alt0 = arg01, alt1 = arg10;
7399               else if (operand_equal_p (arg01, arg10, 0))
7400                 same = arg01, alt0 = arg00, alt1 = arg11;
7401
7402               /* No identical multiplicands; see if we can find a common
7403                  power-of-two factor in non-power-of-two multiplies.  This
7404                  can help in multi-dimensional array access.  */
7405               else if (TREE_CODE (arg01) == INTEGER_CST
7406                        && TREE_CODE (arg11) == INTEGER_CST
7407                        && TREE_INT_CST_HIGH (arg01) == 0
7408                        && TREE_INT_CST_HIGH (arg11) == 0)
7409                 {
7410                   HOST_WIDE_INT int01, int11, tmp;
7411                   int01 = TREE_INT_CST_LOW (arg01);
7412                   int11 = TREE_INT_CST_LOW (arg11);
7413
7414                   /* Move min of absolute values to int11.  */
7415                   if ((int01 >= 0 ? int01 : -int01)
7416                       < (int11 >= 0 ? int11 : -int11))
7417                     {
7418                       tmp = int01, int01 = int11, int11 = tmp;
7419                       alt0 = arg00, arg00 = arg10, arg10 = alt0;
7420                       alt0 = arg01, arg01 = arg11, arg11 = alt0;
7421                     }
7422
7423                   if (exact_log2 (int11) > 0 && int01 % int11 == 0)
7424                     {
7425                       alt0 = fold_build2 (MULT_EXPR, type, arg00,
7426                                           build_int_cst (NULL_TREE,
7427                                                          int01 / int11));
7428                       alt1 = arg10;
7429                       same = arg11;
7430                     }
7431                 }
7432
7433               if (same)
7434                 return fold_build2 (MULT_EXPR, type,
7435                                     fold_build2 (PLUS_EXPR, type,
7436                                                  fold_convert (type, alt0),
7437                                                  fold_convert (type, alt1)),
7438                                     fold_convert (type, same));
7439             }
7440
7441           /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
7442              of the array.  Loop optimizer sometimes produce this type of
7443              expressions.  */
7444           if (TREE_CODE (arg0) == ADDR_EXPR
7445               && TREE_CODE (arg1) == MULT_EXPR)
7446             {
7447               tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
7448               if (tem)
7449                 return fold_convert (type, fold (tem));
7450             }
7451           else if (TREE_CODE (arg1) == ADDR_EXPR
7452                    && TREE_CODE (arg0) == MULT_EXPR)
7453             {
7454               tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
7455               if (tem)
7456                 return fold_convert (type, fold (tem));
7457             }
7458         }
7459       else
7460         {
7461           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
7462           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
7463             return non_lvalue (fold_convert (type, arg0));
7464
7465           /* Likewise if the operands are reversed.  */
7466           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
7467             return non_lvalue (fold_convert (type, arg1));
7468
7469           /* Convert X + -C into X - C.  */
7470           if (TREE_CODE (arg1) == REAL_CST
7471               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
7472             {
7473               tem = fold_negate_const (arg1, type);
7474               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
7475                 return fold_build2 (MINUS_EXPR, type,
7476                                     fold_convert (type, arg0),
7477                                     fold_convert (type, tem));
7478             }
7479
7480           /* Convert x+x into x*2.0.  */
7481           if (operand_equal_p (arg0, arg1, 0)
7482               && SCALAR_FLOAT_TYPE_P (type))
7483             return fold_build2 (MULT_EXPR, type, arg0,
7484                                 build_real (type, dconst2));
7485
7486           /* Convert x*c+x into x*(c+1).  */
7487           if (flag_unsafe_math_optimizations
7488               && TREE_CODE (arg0) == MULT_EXPR
7489               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
7490               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
7491               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
7492             {
7493               REAL_VALUE_TYPE c;
7494
7495               c = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
7496               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7497               return fold_build2 (MULT_EXPR, type, arg1,
7498                                   build_real (type, c));
7499             }
7500
7501           /* Convert x+x*c into x*(c+1).  */
7502           if (flag_unsafe_math_optimizations
7503               && TREE_CODE (arg1) == MULT_EXPR
7504               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
7505               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
7506               && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
7507             {
7508               REAL_VALUE_TYPE c;
7509
7510               c = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
7511               real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7512               return fold_build2 (MULT_EXPR, type, arg0,
7513                                   build_real (type, c));
7514             }
7515
7516           /* Convert x*c1+x*c2 into x*(c1+c2).  */
7517           if (flag_unsafe_math_optimizations
7518               && TREE_CODE (arg0) == MULT_EXPR
7519               && TREE_CODE (arg1) == MULT_EXPR
7520               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
7521               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
7522               && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
7523               && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
7524               && operand_equal_p (TREE_OPERAND (arg0, 0),
7525                                   TREE_OPERAND (arg1, 0), 0))
7526             {
7527               REAL_VALUE_TYPE c1, c2;
7528
7529               c1 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
7530               c2 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
7531               real_arithmetic (&c1, PLUS_EXPR, &c1, &c2);
7532               return fold_build2 (MULT_EXPR, type,
7533                                   TREE_OPERAND (arg0, 0),
7534                                   build_real (type, c1));
7535             }
7536           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  */
7537           if (flag_unsafe_math_optimizations
7538               && TREE_CODE (arg1) == PLUS_EXPR
7539               && TREE_CODE (arg0) != MULT_EXPR)
7540             {
7541               tree tree10 = TREE_OPERAND (arg1, 0);
7542               tree tree11 = TREE_OPERAND (arg1, 1);
7543               if (TREE_CODE (tree11) == MULT_EXPR
7544                   && TREE_CODE (tree10) == MULT_EXPR)
7545                 {
7546                   tree tree0;
7547                   tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
7548                   return fold_build2 (PLUS_EXPR, type, tree0, tree11);
7549                 }
7550             }
7551           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  */
7552           if (flag_unsafe_math_optimizations
7553               && TREE_CODE (arg0) == PLUS_EXPR
7554               && TREE_CODE (arg1) != MULT_EXPR)
7555             {
7556               tree tree00 = TREE_OPERAND (arg0, 0);
7557               tree tree01 = TREE_OPERAND (arg0, 1);
7558               if (TREE_CODE (tree01) == MULT_EXPR
7559                   && TREE_CODE (tree00) == MULT_EXPR)
7560                 {
7561                   tree tree0;
7562                   tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
7563                   return fold_build2 (PLUS_EXPR, type, tree00, tree0);
7564                 }
7565             }
7566         }
7567
7568      bit_rotate:
7569       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
7570          is a rotate of A by C1 bits.  */
7571       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
7572          is a rotate of A by B bits.  */
7573       {
7574         enum tree_code code0, code1;
7575         code0 = TREE_CODE (arg0);
7576         code1 = TREE_CODE (arg1);
7577         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
7578              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
7579             && operand_equal_p (TREE_OPERAND (arg0, 0),
7580                                 TREE_OPERAND (arg1, 0), 0)
7581             && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
7582           {
7583             tree tree01, tree11;
7584             enum tree_code code01, code11;
7585
7586             tree01 = TREE_OPERAND (arg0, 1);
7587             tree11 = TREE_OPERAND (arg1, 1);
7588             STRIP_NOPS (tree01);
7589             STRIP_NOPS (tree11);
7590             code01 = TREE_CODE (tree01);
7591             code11 = TREE_CODE (tree11);
7592             if (code01 == INTEGER_CST
7593                 && code11 == INTEGER_CST
7594                 && TREE_INT_CST_HIGH (tree01) == 0
7595                 && TREE_INT_CST_HIGH (tree11) == 0
7596                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
7597                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
7598               return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
7599                              code0 == LSHIFT_EXPR ? tree01 : tree11);
7600             else if (code11 == MINUS_EXPR)
7601               {
7602                 tree tree110, tree111;
7603                 tree110 = TREE_OPERAND (tree11, 0);
7604                 tree111 = TREE_OPERAND (tree11, 1);
7605                 STRIP_NOPS (tree110);
7606                 STRIP_NOPS (tree111);
7607                 if (TREE_CODE (tree110) == INTEGER_CST
7608                     && 0 == compare_tree_int (tree110,
7609                                               TYPE_PRECISION
7610                                               (TREE_TYPE (TREE_OPERAND
7611                                                           (arg0, 0))))
7612                     && operand_equal_p (tree01, tree111, 0))
7613                   return build2 ((code0 == LSHIFT_EXPR
7614                                   ? LROTATE_EXPR
7615                                   : RROTATE_EXPR),
7616                                  type, TREE_OPERAND (arg0, 0), tree01);
7617               }
7618             else if (code01 == MINUS_EXPR)
7619               {
7620                 tree tree010, tree011;
7621                 tree010 = TREE_OPERAND (tree01, 0);
7622                 tree011 = TREE_OPERAND (tree01, 1);
7623                 STRIP_NOPS (tree010);
7624                 STRIP_NOPS (tree011);
7625                 if (TREE_CODE (tree010) == INTEGER_CST
7626                     && 0 == compare_tree_int (tree010,
7627                                               TYPE_PRECISION
7628                                               (TREE_TYPE (TREE_OPERAND
7629                                                           (arg0, 0))))
7630                     && operand_equal_p (tree11, tree011, 0))
7631                   return build2 ((code0 != LSHIFT_EXPR
7632                                   ? LROTATE_EXPR
7633                                   : RROTATE_EXPR),
7634                                  type, TREE_OPERAND (arg0, 0), tree11);
7635               }
7636           }
7637       }
7638
7639     associate:
7640       /* In most languages, can't associate operations on floats through
7641          parentheses.  Rather than remember where the parentheses were, we
7642          don't associate floats at all, unless the user has specified
7643          -funsafe-math-optimizations.  */
7644
7645       if (! wins
7646           && (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
7647         {
7648           tree var0, con0, lit0, minus_lit0;
7649           tree var1, con1, lit1, minus_lit1;
7650
7651           /* Split both trees into variables, constants, and literals.  Then
7652              associate each group together, the constants with literals,
7653              then the result with variables.  This increases the chances of
7654              literals being recombined later and of generating relocatable
7655              expressions for the sum of a constant and literal.  */
7656           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
7657           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
7658                              code == MINUS_EXPR);
7659
7660           /* Only do something if we found more than two objects.  Otherwise,
7661              nothing has changed and we risk infinite recursion.  */
7662           if (2 < ((var0 != 0) + (var1 != 0)
7663                    + (con0 != 0) + (con1 != 0)
7664                    + (lit0 != 0) + (lit1 != 0)
7665                    + (minus_lit0 != 0) + (minus_lit1 != 0)))
7666             {
7667               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
7668               if (code == MINUS_EXPR)
7669                 code = PLUS_EXPR;
7670
7671               var0 = associate_trees (var0, var1, code, type);
7672               con0 = associate_trees (con0, con1, code, type);
7673               lit0 = associate_trees (lit0, lit1, code, type);
7674               minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
7675
7676               /* Preserve the MINUS_EXPR if the negative part of the literal is
7677                  greater than the positive part.  Otherwise, the multiplicative
7678                  folding code (i.e extract_muldiv) may be fooled in case
7679                  unsigned constants are subtracted, like in the following
7680                  example: ((X*2 + 4) - 8U)/2.  */
7681               if (minus_lit0 && lit0)
7682                 {
7683                   if (TREE_CODE (lit0) == INTEGER_CST
7684                       && TREE_CODE (minus_lit0) == INTEGER_CST
7685                       && tree_int_cst_lt (lit0, minus_lit0))
7686                     {
7687                       minus_lit0 = associate_trees (minus_lit0, lit0,
7688                                                     MINUS_EXPR, type);
7689                       lit0 = 0;
7690                     }
7691                   else
7692                     {
7693                       lit0 = associate_trees (lit0, minus_lit0,
7694                                               MINUS_EXPR, type);
7695                       minus_lit0 = 0;
7696                     }
7697                 }
7698               if (minus_lit0)
7699                 {
7700                   if (con0 == 0)
7701                     return fold_convert (type,
7702                                          associate_trees (var0, minus_lit0,
7703                                                           MINUS_EXPR, type));
7704                   else
7705                     {
7706                       con0 = associate_trees (con0, minus_lit0,
7707                                               MINUS_EXPR, type);
7708                       return fold_convert (type,
7709                                            associate_trees (var0, con0,
7710                                                             PLUS_EXPR, type));
7711                     }
7712                 }
7713
7714               con0 = associate_trees (con0, lit0, code, type);
7715               return fold_convert (type, associate_trees (var0, con0,
7716                                                           code, type));
7717             }
7718         }
7719
7720     binary:
7721       if (wins)
7722         t1 = const_binop (code, arg0, arg1, 0);
7723       if (t1 != NULL_TREE)
7724         {
7725           /* The return value should always have
7726              the same type as the original expression.  */
7727           if (TREE_TYPE (t1) != type)
7728             t1 = fold_convert (type, t1);
7729
7730           return t1;
7731         }
7732       return NULL_TREE;
7733
7734     case MINUS_EXPR:
7735       /* A - (-B) -> A + B */
7736       if (TREE_CODE (arg1) == NEGATE_EXPR)
7737         return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
7738       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
7739       if (TREE_CODE (arg0) == NEGATE_EXPR
7740           && (FLOAT_TYPE_P (type)
7741               || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))
7742           && negate_expr_p (arg1)
7743           && reorder_operands_p (arg0, arg1))
7744         return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
7745                             TREE_OPERAND (arg0, 0));
7746       /* Convert -A - 1 to ~A.  */
7747       if (INTEGRAL_TYPE_P (type)
7748           && TREE_CODE (arg0) == NEGATE_EXPR
7749           && integer_onep (arg1))
7750         return fold_build1 (BIT_NOT_EXPR, type, TREE_OPERAND (arg0, 0));
7751
7752       /* Convert -1 - A to ~A.  */
7753       if (INTEGRAL_TYPE_P (type)
7754           && integer_all_onesp (arg0))
7755         return fold_build1 (BIT_NOT_EXPR, type, arg1);
7756
7757       if (TREE_CODE (type) == COMPLEX_TYPE)
7758         {
7759           tem = fold_complex_add (type, arg0, arg1, MINUS_EXPR);
7760           if (tem)
7761             return tem;
7762         }
7763
7764       if (! FLOAT_TYPE_P (type))
7765         {
7766           if (! wins && integer_zerop (arg0))
7767             return negate_expr (fold_convert (type, arg1));
7768           if (integer_zerop (arg1))
7769             return non_lvalue (fold_convert (type, arg0));
7770
7771           /* Fold A - (A & B) into ~B & A.  */
7772           if (!TREE_SIDE_EFFECTS (arg0)
7773               && TREE_CODE (arg1) == BIT_AND_EXPR)
7774             {
7775               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
7776                 return fold_build2 (BIT_AND_EXPR, type,
7777                                     fold_build1 (BIT_NOT_EXPR, type,
7778                                                  TREE_OPERAND (arg1, 0)),
7779                                     arg0);
7780               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
7781                 return fold_build2 (BIT_AND_EXPR, type,
7782                                     fold_build1 (BIT_NOT_EXPR, type,
7783                                                  TREE_OPERAND (arg1, 1)),
7784                                     arg0);
7785             }
7786
7787           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
7788              any power of 2 minus 1.  */
7789           if (TREE_CODE (arg0) == BIT_AND_EXPR
7790               && TREE_CODE (arg1) == BIT_AND_EXPR
7791               && operand_equal_p (TREE_OPERAND (arg0, 0),
7792                                   TREE_OPERAND (arg1, 0), 0))
7793             {
7794               tree mask0 = TREE_OPERAND (arg0, 1);
7795               tree mask1 = TREE_OPERAND (arg1, 1);
7796               tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
7797
7798               if (operand_equal_p (tem, mask1, 0))
7799                 {
7800                   tem = fold_build2 (BIT_XOR_EXPR, type,
7801                                      TREE_OPERAND (arg0, 0), mask1);
7802                   return fold_build2 (MINUS_EXPR, type, tem, mask1);
7803                 }
7804             }
7805         }
7806
7807       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
7808       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
7809         return non_lvalue (fold_convert (type, arg0));
7810
7811       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
7812          ARG0 is zero and X + ARG0 reduces to X, since that would mean
7813          (-ARG1 + ARG0) reduces to -ARG1.  */
7814       else if (!wins && fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
7815         return negate_expr (fold_convert (type, arg1));
7816
7817       /* Fold &x - &x.  This can happen from &x.foo - &x.
7818          This is unsafe for certain floats even in non-IEEE formats.
7819          In IEEE, it is unsafe because it does wrong for NaNs.
7820          Also note that operand_equal_p is always false if an operand
7821          is volatile.  */
7822
7823       if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
7824           && operand_equal_p (arg0, arg1, 0))
7825         return fold_convert (type, integer_zero_node);
7826
7827       /* A - B -> A + (-B) if B is easily negatable.  */
7828       if (!wins && negate_expr_p (arg1)
7829           && ((FLOAT_TYPE_P (type)
7830                /* Avoid this transformation if B is a positive REAL_CST.  */
7831                && (TREE_CODE (arg1) != REAL_CST
7832                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
7833               || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
7834         return fold_build2 (PLUS_EXPR, type, arg0, negate_expr (arg1));
7835
7836       /* Try folding difference of addresses.  */
7837       {
7838         HOST_WIDE_INT diff;
7839
7840         if ((TREE_CODE (arg0) == ADDR_EXPR
7841              || TREE_CODE (arg1) == ADDR_EXPR)
7842             && ptr_difference_const (arg0, arg1, &diff))
7843           return build_int_cst_type (type, diff);
7844       }
7845
7846       /* Fold &a[i] - &a[j] to i-j.  */
7847       if (TREE_CODE (arg0) == ADDR_EXPR
7848           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
7849           && TREE_CODE (arg1) == ADDR_EXPR
7850           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
7851         {
7852           tree aref0 = TREE_OPERAND (arg0, 0);
7853           tree aref1 = TREE_OPERAND (arg1, 0);
7854           if (operand_equal_p (TREE_OPERAND (aref0, 0),
7855                                TREE_OPERAND (aref1, 0), 0))
7856             {
7857               tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
7858               tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
7859               tree esz = array_ref_element_size (aref0);
7860               tree diff = build2 (MINUS_EXPR, type, op0, op1);
7861               return fold_build2 (MULT_EXPR, type, diff,
7862                                   fold_convert (type, esz));
7863                                   
7864             }
7865         }
7866
7867       /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
7868          of the array.  Loop optimizer sometimes produce this type of
7869          expressions.  */
7870       if (TREE_CODE (arg0) == ADDR_EXPR
7871           && TREE_CODE (arg1) == MULT_EXPR)
7872         {
7873           tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
7874           if (tem)
7875             return fold_convert (type, fold (tem));
7876         }
7877
7878       if (TREE_CODE (arg0) == MULT_EXPR
7879           && TREE_CODE (arg1) == MULT_EXPR
7880           && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
7881         {
7882           /* (A * C) - (B * C) -> (A-B) * C.  */
7883           if (operand_equal_p (TREE_OPERAND (arg0, 1),
7884                                TREE_OPERAND (arg1, 1), 0))
7885             return fold_build2 (MULT_EXPR, type,
7886                                 fold_build2 (MINUS_EXPR, type,
7887                                              TREE_OPERAND (arg0, 0),
7888                                              TREE_OPERAND (arg1, 0)),
7889                                 TREE_OPERAND (arg0, 1));
7890           /* (A * C1) - (A * C2) -> A * (C1-C2).  */
7891           if (operand_equal_p (TREE_OPERAND (arg0, 0),
7892                                TREE_OPERAND (arg1, 0), 0))
7893             return fold_build2 (MULT_EXPR, type,
7894                                 TREE_OPERAND (arg0, 0),
7895                                 fold_build2 (MINUS_EXPR, type,
7896                                              TREE_OPERAND (arg0, 1),
7897                                              TREE_OPERAND (arg1, 1)));
7898         }
7899
7900       goto associate;
7901
7902     case MULT_EXPR:
7903       /* (-A) * (-B) -> A * B  */
7904       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
7905         return fold_build2 (MULT_EXPR, type,
7906                             TREE_OPERAND (arg0, 0),
7907                             negate_expr (arg1));
7908       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
7909         return fold_build2 (MULT_EXPR, type,
7910                             negate_expr (arg0),
7911                             TREE_OPERAND (arg1, 0));
7912
7913       if (TREE_CODE (type) == COMPLEX_TYPE)
7914         {
7915           tem = fold_complex_mult (type, arg0, arg1);
7916           if (tem)
7917             return tem;
7918         }
7919
7920       if (! FLOAT_TYPE_P (type))
7921         {
7922           if (integer_zerop (arg1))
7923             return omit_one_operand (type, arg1, arg0);
7924           if (integer_onep (arg1))
7925             return non_lvalue (fold_convert (type, arg0));
7926           /* Transform x * -1 into -x.  */
7927           if (integer_all_onesp (arg1))
7928             return fold_convert (type, negate_expr (arg0));
7929
7930           /* (a * (1 << b)) is (a << b)  */
7931           if (TREE_CODE (arg1) == LSHIFT_EXPR
7932               && integer_onep (TREE_OPERAND (arg1, 0)))
7933             return fold_build2 (LSHIFT_EXPR, type, arg0,
7934                                 TREE_OPERAND (arg1, 1));
7935           if (TREE_CODE (arg0) == LSHIFT_EXPR
7936               && integer_onep (TREE_OPERAND (arg0, 0)))
7937             return fold_build2 (LSHIFT_EXPR, type, arg1,
7938                                 TREE_OPERAND (arg0, 1));
7939
7940           if (TREE_CODE (arg1) == INTEGER_CST
7941               && 0 != (tem = extract_muldiv (op0,
7942                                              fold_convert (type, arg1),
7943                                              code, NULL_TREE)))
7944             return fold_convert (type, tem);
7945
7946         }
7947       else
7948         {
7949           /* Maybe fold x * 0 to 0.  The expressions aren't the same
7950              when x is NaN, since x * 0 is also NaN.  Nor are they the
7951              same in modes with signed zeros, since multiplying a
7952              negative value by 0 gives -0, not +0.  */
7953           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
7954               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
7955               && real_zerop (arg1))
7956             return omit_one_operand (type, arg1, arg0);
7957           /* In IEEE floating point, x*1 is not equivalent to x for snans.  */
7958           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7959               && real_onep (arg1))
7960             return non_lvalue (fold_convert (type, arg0));
7961
7962           /* Transform x * -1.0 into -x.  */
7963           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7964               && real_minus_onep (arg1))
7965             return fold_convert (type, negate_expr (arg0));
7966
7967           /* Convert (C1/X)*C2 into (C1*C2)/X.  */
7968           if (flag_unsafe_math_optimizations
7969               && TREE_CODE (arg0) == RDIV_EXPR
7970               && TREE_CODE (arg1) == REAL_CST
7971               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
7972             {
7973               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
7974                                       arg1, 0);
7975               if (tem)
7976                 return fold_build2 (RDIV_EXPR, type, tem,
7977                                     TREE_OPERAND (arg0, 1));
7978             }
7979
7980           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
7981           if (operand_equal_p (arg0, arg1, 0))
7982             {
7983               tree tem = fold_strip_sign_ops (arg0);
7984               if (tem != NULL_TREE)
7985                 {
7986                   tem = fold_convert (type, tem);
7987                   return fold_build2 (MULT_EXPR, type, tem, tem);
7988                 }
7989             }
7990
7991           if (flag_unsafe_math_optimizations)
7992             {
7993               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
7994               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
7995
7996               /* Optimizations of root(...)*root(...).  */
7997               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
7998                 {
7999                   tree rootfn, arg, arglist;
8000                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8001                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8002
8003                   /* Optimize sqrt(x)*sqrt(x) as x.  */
8004                   if (BUILTIN_SQRT_P (fcode0)
8005                       && operand_equal_p (arg00, arg10, 0)
8006                       && ! HONOR_SNANS (TYPE_MODE (type)))
8007                     return arg00;
8008
8009                   /* Optimize root(x)*root(y) as root(x*y).  */
8010                   rootfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8011                   arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
8012                   arglist = build_tree_list (NULL_TREE, arg);
8013                   return build_function_call_expr (rootfn, arglist);
8014                 }
8015
8016               /* Optimize expN(x)*expN(y) as expN(x+y).  */
8017               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
8018                 {
8019                   tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8020                   tree arg = fold_build2 (PLUS_EXPR, type,
8021                                           TREE_VALUE (TREE_OPERAND (arg0, 1)),
8022                                           TREE_VALUE (TREE_OPERAND (arg1, 1)));
8023                   tree arglist = build_tree_list (NULL_TREE, arg);
8024                   return build_function_call_expr (expfn, arglist);
8025                 }
8026
8027               /* Optimizations of pow(...)*pow(...).  */
8028               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
8029                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
8030                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
8031                 {
8032                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8033                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
8034                                                                      1)));
8035                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8036                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
8037                                                                      1)));
8038
8039                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
8040                   if (operand_equal_p (arg01, arg11, 0))
8041                     {
8042                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8043                       tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
8044                       tree arglist = tree_cons (NULL_TREE, arg,
8045                                                 build_tree_list (NULL_TREE,
8046                                                                  arg01));
8047                       return build_function_call_expr (powfn, arglist);
8048                     }
8049
8050                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
8051                   if (operand_equal_p (arg00, arg10, 0))
8052                     {
8053                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8054                       tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
8055                       tree arglist = tree_cons (NULL_TREE, arg00,
8056                                                 build_tree_list (NULL_TREE,
8057                                                                  arg));
8058                       return build_function_call_expr (powfn, arglist);
8059                     }
8060                 }
8061
8062               /* Optimize tan(x)*cos(x) as sin(x).  */
8063               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
8064                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
8065                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
8066                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
8067                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
8068                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
8069                   && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8070                                       TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8071                 {
8072                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
8073
8074                   if (sinfn != NULL_TREE)
8075                     return build_function_call_expr (sinfn,
8076                                                      TREE_OPERAND (arg0, 1));
8077                 }
8078
8079               /* Optimize x*pow(x,c) as pow(x,c+1).  */
8080               if (fcode1 == BUILT_IN_POW
8081                   || fcode1 == BUILT_IN_POWF
8082                   || fcode1 == BUILT_IN_POWL)
8083                 {
8084                   tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8085                   tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
8086                                                                      1)));
8087                   if (TREE_CODE (arg11) == REAL_CST
8088                       && ! TREE_CONSTANT_OVERFLOW (arg11)
8089                       && operand_equal_p (arg0, arg10, 0))
8090                     {
8091                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8092                       REAL_VALUE_TYPE c;
8093                       tree arg, arglist;
8094
8095                       c = TREE_REAL_CST (arg11);
8096                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
8097                       arg = build_real (type, c);
8098                       arglist = build_tree_list (NULL_TREE, arg);
8099                       arglist = tree_cons (NULL_TREE, arg0, arglist);
8100                       return build_function_call_expr (powfn, arglist);
8101                     }
8102                 }
8103
8104               /* Optimize pow(x,c)*x as pow(x,c+1).  */
8105               if (fcode0 == BUILT_IN_POW
8106                   || fcode0 == BUILT_IN_POWF
8107                   || fcode0 == BUILT_IN_POWL)
8108                 {
8109                   tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8110                   tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
8111                                                                      1)));
8112                   if (TREE_CODE (arg01) == REAL_CST
8113                       && ! TREE_CONSTANT_OVERFLOW (arg01)
8114                       && operand_equal_p (arg1, arg00, 0))
8115                     {
8116                       tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8117                       REAL_VALUE_TYPE c;
8118                       tree arg, arglist;
8119
8120                       c = TREE_REAL_CST (arg01);
8121                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
8122                       arg = build_real (type, c);
8123                       arglist = build_tree_list (NULL_TREE, arg);
8124                       arglist = tree_cons (NULL_TREE, arg1, arglist);
8125                       return build_function_call_expr (powfn, arglist);
8126                     }
8127                 }
8128
8129               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
8130               if (! optimize_size
8131                   && operand_equal_p (arg0, arg1, 0))
8132                 {
8133                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
8134
8135                   if (powfn)
8136                     {
8137                       tree arg = build_real (type, dconst2);
8138                       tree arglist = build_tree_list (NULL_TREE, arg);
8139                       arglist = tree_cons (NULL_TREE, arg0, arglist);
8140                       return build_function_call_expr (powfn, arglist);
8141                     }
8142                 }
8143             }
8144         }
8145       goto associate;
8146
8147     case BIT_IOR_EXPR:
8148     bit_ior:
8149       if (integer_all_onesp (arg1))
8150         return omit_one_operand (type, arg1, arg0);
8151       if (integer_zerop (arg1))
8152         return non_lvalue (fold_convert (type, arg0));
8153       if (operand_equal_p (arg0, arg1, 0))
8154         return non_lvalue (fold_convert (type, arg0));
8155
8156       /* ~X | X is -1.  */
8157       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8158           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8159         {
8160           t1 = build_int_cst (type, -1);
8161           t1 = force_fit_type (t1, 0, false, false);
8162           return omit_one_operand (type, t1, arg1);
8163         }
8164
8165       /* X | ~X is -1.  */
8166       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8167           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8168         {
8169           t1 = build_int_cst (type, -1);
8170           t1 = force_fit_type (t1, 0, false, false);
8171           return omit_one_operand (type, t1, arg0);
8172         }
8173
8174       t1 = distribute_bit_expr (code, type, arg0, arg1);
8175       if (t1 != NULL_TREE)
8176         return t1;
8177
8178       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
8179
8180          This results in more efficient code for machines without a NAND
8181          instruction.  Combine will canonicalize to the first form
8182          which will allow use of NAND instructions provided by the
8183          backend if they exist.  */
8184       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8185           && TREE_CODE (arg1) == BIT_NOT_EXPR)
8186         {
8187           return fold_build1 (BIT_NOT_EXPR, type,
8188                               build2 (BIT_AND_EXPR, type,
8189                                       TREE_OPERAND (arg0, 0),
8190                                       TREE_OPERAND (arg1, 0)));
8191         }
8192
8193       /* See if this can be simplified into a rotate first.  If that
8194          is unsuccessful continue in the association code.  */
8195       goto bit_rotate;
8196
8197     case BIT_XOR_EXPR:
8198       if (integer_zerop (arg1))
8199         return non_lvalue (fold_convert (type, arg0));
8200       if (integer_all_onesp (arg1))
8201         return fold_build1 (BIT_NOT_EXPR, type, arg0);
8202       if (operand_equal_p (arg0, arg1, 0))
8203         return omit_one_operand (type, integer_zero_node, arg0);
8204
8205       /* ~X ^ X is -1.  */
8206       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8207           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8208         {
8209           t1 = build_int_cst (type, -1);
8210           t1 = force_fit_type (t1, 0, false, false);
8211           return omit_one_operand (type, t1, arg1);
8212         }
8213
8214       /* X ^ ~X is -1.  */
8215       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8216           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8217         {
8218           t1 = build_int_cst (type, -1);
8219           t1 = force_fit_type (t1, 0, false, false);
8220           return omit_one_operand (type, t1, arg0);
8221         }
8222
8223       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
8224          with a constant, and the two constants have no bits in common,
8225          we should treat this as a BIT_IOR_EXPR since this may produce more
8226          simplifications.  */
8227       if (TREE_CODE (arg0) == BIT_AND_EXPR
8228           && TREE_CODE (arg1) == BIT_AND_EXPR
8229           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8230           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8231           && integer_zerop (const_binop (BIT_AND_EXPR,
8232                                          TREE_OPERAND (arg0, 1),
8233                                          TREE_OPERAND (arg1, 1), 0)))
8234         {
8235           code = BIT_IOR_EXPR;
8236           goto bit_ior;
8237         }
8238
8239       /* Convert ~X ^ ~Y to X ^ Y.  */
8240       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8241           && TREE_CODE (arg1) == BIT_NOT_EXPR)
8242         return fold_build2 (code, type,
8243                             fold_convert (type, TREE_OPERAND (arg0, 0)),
8244                             fold_convert (type, TREE_OPERAND (arg1, 0)));
8245
8246       /* See if this can be simplified into a rotate first.  If that
8247          is unsuccessful continue in the association code.  */
8248       goto bit_rotate;
8249
8250     case BIT_AND_EXPR:
8251       if (integer_all_onesp (arg1))
8252         return non_lvalue (fold_convert (type, arg0));
8253       if (integer_zerop (arg1))
8254         return omit_one_operand (type, arg1, arg0);
8255       if (operand_equal_p (arg0, arg1, 0))
8256         return non_lvalue (fold_convert (type, arg0));
8257
8258       /* ~X & X is always zero.  */
8259       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8260           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8261         return omit_one_operand (type, integer_zero_node, arg1);
8262
8263       /* X & ~X is always zero.  */
8264       if (TREE_CODE (arg1) == BIT_NOT_EXPR
8265           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8266         return omit_one_operand (type, integer_zero_node, arg0);
8267
8268       t1 = distribute_bit_expr (code, type, arg0, arg1);
8269       if (t1 != NULL_TREE)
8270         return t1;
8271       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
8272       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
8273           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
8274         {
8275           unsigned int prec
8276             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
8277
8278           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
8279               && (~TREE_INT_CST_LOW (arg1)
8280                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
8281             return fold_convert (type, TREE_OPERAND (arg0, 0));
8282         }
8283
8284       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
8285
8286          This results in more efficient code for machines without a NOR
8287          instruction.  Combine will canonicalize to the first form
8288          which will allow use of NOR instructions provided by the
8289          backend if they exist.  */
8290       if (TREE_CODE (arg0) == BIT_NOT_EXPR
8291           && TREE_CODE (arg1) == BIT_NOT_EXPR)
8292         {
8293           return fold_build1 (BIT_NOT_EXPR, type,
8294                               build2 (BIT_IOR_EXPR, type,
8295                                       TREE_OPERAND (arg0, 0),
8296                                       TREE_OPERAND (arg1, 0)));
8297         }
8298
8299       goto associate;
8300
8301     case RDIV_EXPR:
8302       /* Don't touch a floating-point divide by zero unless the mode
8303          of the constant can represent infinity.  */
8304       if (TREE_CODE (arg1) == REAL_CST
8305           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
8306           && real_zerop (arg1))
8307         return NULL_TREE;
8308
8309       /* (-A) / (-B) -> A / B  */
8310       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
8311         return fold_build2 (RDIV_EXPR, type,
8312                             TREE_OPERAND (arg0, 0),
8313                             negate_expr (arg1));
8314       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
8315         return fold_build2 (RDIV_EXPR, type,
8316                             negate_expr (arg0),
8317                             TREE_OPERAND (arg1, 0));
8318
8319       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
8320       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
8321           && real_onep (arg1))
8322         return non_lvalue (fold_convert (type, arg0));
8323
8324       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
8325       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
8326           && real_minus_onep (arg1))
8327         return non_lvalue (fold_convert (type, negate_expr (arg0)));
8328
8329       /* If ARG1 is a constant, we can convert this to a multiply by the
8330          reciprocal.  This does not have the same rounding properties,
8331          so only do this if -funsafe-math-optimizations.  We can actually
8332          always safely do it if ARG1 is a power of two, but it's hard to
8333          tell if it is or not in a portable manner.  */
8334       if (TREE_CODE (arg1) == REAL_CST)
8335         {
8336           if (flag_unsafe_math_optimizations
8337               && 0 != (tem = const_binop (code, build_real (type, dconst1),
8338                                           arg1, 0)))
8339             return fold_build2 (MULT_EXPR, type, arg0, tem);
8340           /* Find the reciprocal if optimizing and the result is exact.  */
8341           if (optimize)
8342             {
8343               REAL_VALUE_TYPE r;
8344               r = TREE_REAL_CST (arg1);
8345               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
8346                 {
8347                   tem = build_real (type, r);
8348                   return fold_build2 (MULT_EXPR, type, arg0, tem);
8349                 }
8350             }
8351         }
8352       /* Convert A/B/C to A/(B*C).  */
8353       if (flag_unsafe_math_optimizations
8354           && TREE_CODE (arg0) == RDIV_EXPR)
8355         return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
8356                             fold_build2 (MULT_EXPR, type,
8357                                          TREE_OPERAND (arg0, 1), arg1));
8358
8359       /* Convert A/(B/C) to (A/B)*C.  */
8360       if (flag_unsafe_math_optimizations
8361           && TREE_CODE (arg1) == RDIV_EXPR)
8362         return fold_build2 (MULT_EXPR, type,
8363                             fold_build2 (RDIV_EXPR, type, arg0,
8364                                          TREE_OPERAND (arg1, 0)),
8365                             TREE_OPERAND (arg1, 1));
8366
8367       /* Convert C1/(X*C2) into (C1/C2)/X.  */
8368       if (flag_unsafe_math_optimizations
8369           && TREE_CODE (arg1) == MULT_EXPR
8370           && TREE_CODE (arg0) == REAL_CST
8371           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
8372         {
8373           tree tem = const_binop (RDIV_EXPR, arg0,
8374                                   TREE_OPERAND (arg1, 1), 0);
8375           if (tem)
8376             return fold_build2 (RDIV_EXPR, type, tem,
8377                                 TREE_OPERAND (arg1, 0));
8378         }
8379
8380       if (TREE_CODE (type) == COMPLEX_TYPE)
8381         {
8382           tem = fold_complex_div (type, arg0, arg1, code);
8383           if (tem)
8384             return tem;
8385         }
8386
8387       if (flag_unsafe_math_optimizations)
8388         {
8389           enum built_in_function fcode = builtin_mathfn_code (arg1);
8390           /* Optimize x/expN(y) into x*expN(-y).  */
8391           if (BUILTIN_EXPONENT_P (fcode))
8392             {
8393               tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8394               tree arg = negate_expr (TREE_VALUE (TREE_OPERAND (arg1, 1)));
8395               tree arglist = build_tree_list (NULL_TREE,
8396                                               fold_convert (type, arg));
8397               arg1 = build_function_call_expr (expfn, arglist);
8398               return fold_build2 (MULT_EXPR, type, arg0, arg1);
8399             }
8400
8401           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
8402           if (fcode == BUILT_IN_POW
8403               || fcode == BUILT_IN_POWF
8404               || fcode == BUILT_IN_POWL)
8405             {
8406               tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
8407               tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
8408               tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1, 1)));
8409               tree neg11 = fold_convert (type, negate_expr (arg11));
8410               tree arglist = tree_cons(NULL_TREE, arg10,
8411                                        build_tree_list (NULL_TREE, neg11));
8412               arg1 = build_function_call_expr (powfn, arglist);
8413               return fold_build2 (MULT_EXPR, type, arg0, arg1);
8414             }
8415         }
8416
8417       if (flag_unsafe_math_optimizations)
8418         {
8419           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
8420           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
8421
8422           /* Optimize sin(x)/cos(x) as tan(x).  */
8423           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
8424                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
8425                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
8426               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8427                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8428             {
8429               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
8430
8431               if (tanfn != NULL_TREE)
8432                 return build_function_call_expr (tanfn,
8433                                                  TREE_OPERAND (arg0, 1));
8434             }
8435
8436           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
8437           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
8438                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
8439                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
8440               && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
8441                                   TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
8442             {
8443               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
8444
8445               if (tanfn != NULL_TREE)
8446                 {
8447                   tree tmp = TREE_OPERAND (arg0, 1);
8448                   tmp = build_function_call_expr (tanfn, tmp);
8449                   return fold_build2 (RDIV_EXPR, type,
8450                                       build_real (type, dconst1), tmp);
8451                 }
8452             }
8453
8454           /* Optimize pow(x,c)/x as pow(x,c-1).  */
8455           if (fcode0 == BUILT_IN_POW
8456               || fcode0 == BUILT_IN_POWF
8457               || fcode0 == BUILT_IN_POWL)
8458             {
8459               tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
8460               tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
8461               if (TREE_CODE (arg01) == REAL_CST
8462                   && ! TREE_CONSTANT_OVERFLOW (arg01)
8463                   && operand_equal_p (arg1, arg00, 0))
8464                 {
8465                   tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
8466                   REAL_VALUE_TYPE c;
8467                   tree arg, arglist;
8468
8469                   c = TREE_REAL_CST (arg01);
8470                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
8471                   arg = build_real (type, c);
8472                   arglist = build_tree_list (NULL_TREE, arg);
8473                   arglist = tree_cons (NULL_TREE, arg1, arglist);
8474                   return build_function_call_expr (powfn, arglist);
8475                 }
8476             }
8477         }
8478       goto binary;
8479
8480     case TRUNC_DIV_EXPR:
8481     case ROUND_DIV_EXPR:
8482     case FLOOR_DIV_EXPR:
8483     case CEIL_DIV_EXPR:
8484     case EXACT_DIV_EXPR:
8485       if (integer_onep (arg1))
8486         return non_lvalue (fold_convert (type, arg0));
8487       if (integer_zerop (arg1))
8488         return NULL_TREE;
8489       /* X / -1 is -X.  */
8490       if (!TYPE_UNSIGNED (type)
8491           && TREE_CODE (arg1) == INTEGER_CST
8492           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
8493           && TREE_INT_CST_HIGH (arg1) == -1)
8494         return fold_convert (type, negate_expr (arg0));
8495
8496       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
8497          operation, EXACT_DIV_EXPR.
8498
8499          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
8500          At one time others generated faster code, it's not clear if they do
8501          after the last round to changes to the DIV code in expmed.c.  */
8502       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
8503           && multiple_of_p (type, arg0, arg1))
8504         return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
8505
8506       if (TREE_CODE (arg1) == INTEGER_CST
8507           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE)))
8508         return fold_convert (type, tem);
8509
8510       if (TREE_CODE (type) == COMPLEX_TYPE)
8511         {
8512           tem = fold_complex_div (type, arg0, arg1, code);
8513           if (tem)
8514             return tem;
8515         }
8516       goto binary;
8517
8518     case CEIL_MOD_EXPR:
8519     case FLOOR_MOD_EXPR:
8520     case ROUND_MOD_EXPR:
8521     case TRUNC_MOD_EXPR:
8522       /* X % 1 is always zero, but be sure to preserve any side
8523          effects in X.  */
8524       if (integer_onep (arg1))
8525         return omit_one_operand (type, integer_zero_node, arg0);
8526
8527       /* X % 0, return X % 0 unchanged so that we can get the
8528          proper warnings and errors.  */
8529       if (integer_zerop (arg1))
8530         return NULL_TREE;
8531
8532       /* 0 % X is always zero, but be sure to preserve any side
8533          effects in X.  Place this after checking for X == 0.  */
8534       if (integer_zerop (arg0))
8535         return omit_one_operand (type, integer_zero_node, arg1);
8536
8537       /* X % -1 is zero.  */
8538       if (!TYPE_UNSIGNED (type)
8539           && TREE_CODE (arg1) == INTEGER_CST
8540           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
8541           && TREE_INT_CST_HIGH (arg1) == -1)
8542         return omit_one_operand (type, integer_zero_node, arg0);
8543
8544       /* Optimize unsigned TRUNC_MOD_EXPR by a power of two into a
8545          BIT_AND_EXPR, i.e. "X % C" into "X & C2".  */
8546       if (code == TRUNC_MOD_EXPR
8547           && TYPE_UNSIGNED (type)
8548           && integer_pow2p (arg1))
8549         {
8550           unsigned HOST_WIDE_INT high, low;
8551           tree mask;
8552           int l;
8553
8554           l = tree_log2 (arg1);
8555           if (l >= HOST_BITS_PER_WIDE_INT)
8556             {
8557               high = ((unsigned HOST_WIDE_INT) 1
8558                       << (l - HOST_BITS_PER_WIDE_INT)) - 1;
8559               low = -1;
8560             }
8561           else
8562             {
8563               high = 0;
8564               low = ((unsigned HOST_WIDE_INT) 1 << l) - 1;
8565             }
8566
8567           mask = build_int_cst_wide (type, low, high);
8568           return fold_build2 (BIT_AND_EXPR, type,
8569                               fold_convert (type, arg0), mask);
8570         }
8571
8572       /* X % -C is the same as X % C.  */
8573       if (code == TRUNC_MOD_EXPR
8574           && !TYPE_UNSIGNED (type)
8575           && TREE_CODE (arg1) == INTEGER_CST
8576           && !TREE_CONSTANT_OVERFLOW (arg1)
8577           && TREE_INT_CST_HIGH (arg1) < 0
8578           && !flag_trapv
8579           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
8580           && !sign_bit_p (arg1, arg1))
8581         return fold_build2 (code, type, fold_convert (type, arg0),
8582                             fold_convert (type, negate_expr (arg1)));
8583
8584       /* X % -Y is the same as X % Y.  */
8585       if (code == TRUNC_MOD_EXPR
8586           && !TYPE_UNSIGNED (type)
8587           && TREE_CODE (arg1) == NEGATE_EXPR
8588           && !flag_trapv)
8589         return fold_build2 (code, type, fold_convert (type, arg0),
8590                             fold_convert (type, TREE_OPERAND (arg1, 0)));
8591
8592       if (TREE_CODE (arg1) == INTEGER_CST
8593           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE)))
8594         return fold_convert (type, tem);
8595
8596       goto binary;
8597
8598     case LROTATE_EXPR:
8599     case RROTATE_EXPR:
8600       if (integer_all_onesp (arg0))
8601         return omit_one_operand (type, arg0, arg1);
8602       goto shift;
8603
8604     case RSHIFT_EXPR:
8605       /* Optimize -1 >> x for arithmetic right shifts.  */
8606       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
8607         return omit_one_operand (type, arg0, arg1);
8608       /* ... fall through ...  */
8609
8610     case LSHIFT_EXPR:
8611     shift:
8612       if (integer_zerop (arg1))
8613         return non_lvalue (fold_convert (type, arg0));
8614       if (integer_zerop (arg0))
8615         return omit_one_operand (type, arg0, arg1);
8616
8617       /* Since negative shift count is not well-defined,
8618          don't try to compute it in the compiler.  */
8619       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
8620         return NULL_TREE;
8621       /* Rewrite an LROTATE_EXPR by a constant into an
8622          RROTATE_EXPR by a new constant.  */
8623       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
8624         {
8625           tree tem = build_int_cst (NULL_TREE,
8626                                     GET_MODE_BITSIZE (TYPE_MODE (type)));
8627           tem = fold_convert (TREE_TYPE (arg1), tem);
8628           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
8629           return fold_build2 (RROTATE_EXPR, type, arg0, tem);
8630         }
8631
8632       /* If we have a rotate of a bit operation with the rotate count and
8633          the second operand of the bit operation both constant,
8634          permute the two operations.  */
8635       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
8636           && (TREE_CODE (arg0) == BIT_AND_EXPR
8637               || TREE_CODE (arg0) == BIT_IOR_EXPR
8638               || TREE_CODE (arg0) == BIT_XOR_EXPR)
8639           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8640         return fold_build2 (TREE_CODE (arg0), type,
8641                             fold_build2 (code, type,
8642                                          TREE_OPERAND (arg0, 0), arg1),
8643                             fold_build2 (code, type,
8644                                          TREE_OPERAND (arg0, 1), arg1));
8645
8646       /* Two consecutive rotates adding up to the width of the mode can
8647          be ignored.  */
8648       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
8649           && TREE_CODE (arg0) == RROTATE_EXPR
8650           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8651           && TREE_INT_CST_HIGH (arg1) == 0
8652           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
8653           && ((TREE_INT_CST_LOW (arg1)
8654                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
8655               == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
8656         return TREE_OPERAND (arg0, 0);
8657
8658       goto binary;
8659
8660     case MIN_EXPR:
8661       if (operand_equal_p (arg0, arg1, 0))
8662         return omit_one_operand (type, arg0, arg1);
8663       if (INTEGRAL_TYPE_P (type)
8664           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
8665         return omit_one_operand (type, arg1, arg0);
8666       goto associate;
8667
8668     case MAX_EXPR:
8669       if (operand_equal_p (arg0, arg1, 0))
8670         return omit_one_operand (type, arg0, arg1);
8671       if (INTEGRAL_TYPE_P (type)
8672           && TYPE_MAX_VALUE (type)
8673           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
8674         return omit_one_operand (type, arg1, arg0);
8675       goto associate;
8676
8677     case TRUTH_ANDIF_EXPR:
8678       /* Note that the operands of this must be ints
8679          and their values must be 0 or 1.
8680          ("true" is a fixed value perhaps depending on the language.)  */
8681       /* If first arg is constant zero, return it.  */
8682       if (integer_zerop (arg0))
8683         return fold_convert (type, arg0);
8684     case TRUTH_AND_EXPR:
8685       /* If either arg is constant true, drop it.  */
8686       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8687         return non_lvalue (fold_convert (type, arg1));
8688       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
8689           /* Preserve sequence points.  */
8690           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
8691         return non_lvalue (fold_convert (type, arg0));
8692       /* If second arg is constant zero, result is zero, but first arg
8693          must be evaluated.  */
8694       if (integer_zerop (arg1))
8695         return omit_one_operand (type, arg1, arg0);
8696       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
8697          case will be handled here.  */
8698       if (integer_zerop (arg0))
8699         return omit_one_operand (type, arg0, arg1);
8700
8701       /* !X && X is always false.  */
8702       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8703           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8704         return omit_one_operand (type, integer_zero_node, arg1);
8705       /* X && !X is always false.  */
8706       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8707           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8708         return omit_one_operand (type, integer_zero_node, arg0);
8709
8710       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
8711          means A >= Y && A != MAX, but in this case we know that
8712          A < X <= MAX.  */
8713
8714       if (!TREE_SIDE_EFFECTS (arg0)
8715           && !TREE_SIDE_EFFECTS (arg1))
8716         {
8717           tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
8718           if (tem)
8719             return fold_build2 (code, type, tem, arg1);
8720
8721           tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
8722           if (tem)
8723             return fold_build2 (code, type, arg0, tem);
8724         }
8725
8726     truth_andor:
8727       /* We only do these simplifications if we are optimizing.  */
8728       if (!optimize)
8729         return NULL_TREE;
8730
8731       /* Check for things like (A || B) && (A || C).  We can convert this
8732          to A || (B && C).  Note that either operator can be any of the four
8733          truth and/or operations and the transformation will still be
8734          valid.   Also note that we only care about order for the
8735          ANDIF and ORIF operators.  If B contains side effects, this
8736          might change the truth-value of A.  */
8737       if (TREE_CODE (arg0) == TREE_CODE (arg1)
8738           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8739               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8740               || TREE_CODE (arg0) == TRUTH_AND_EXPR
8741               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8742           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
8743         {
8744           tree a00 = TREE_OPERAND (arg0, 0);
8745           tree a01 = TREE_OPERAND (arg0, 1);
8746           tree a10 = TREE_OPERAND (arg1, 0);
8747           tree a11 = TREE_OPERAND (arg1, 1);
8748           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8749                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8750                              && (code == TRUTH_AND_EXPR
8751                                  || code == TRUTH_OR_EXPR));
8752
8753           if (operand_equal_p (a00, a10, 0))
8754             return fold_build2 (TREE_CODE (arg0), type, a00,
8755                                 fold_build2 (code, type, a01, a11));
8756           else if (commutative && operand_equal_p (a00, a11, 0))
8757             return fold_build2 (TREE_CODE (arg0), type, a00,
8758                                 fold_build2 (code, type, a01, a10));
8759           else if (commutative && operand_equal_p (a01, a10, 0))
8760             return fold_build2 (TREE_CODE (arg0), type, a01,
8761                                 fold_build2 (code, type, a00, a11));
8762
8763           /* This case if tricky because we must either have commutative
8764              operators or else A10 must not have side-effects.  */
8765
8766           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8767                    && operand_equal_p (a01, a11, 0))
8768             return fold_build2 (TREE_CODE (arg0), type,
8769                                 fold_build2 (code, type, a00, a10),
8770                                 a01);
8771         }
8772
8773       /* See if we can build a range comparison.  */
8774       if (0 != (tem = fold_range_test (code, type, op0, op1)))
8775         return tem;
8776
8777       /* Check for the possibility of merging component references.  If our
8778          lhs is another similar operation, try to merge its rhs with our
8779          rhs.  Then try to merge our lhs and rhs.  */
8780       if (TREE_CODE (arg0) == code
8781           && 0 != (tem = fold_truthop (code, type,
8782                                        TREE_OPERAND (arg0, 1), arg1)))
8783         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8784
8785       if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
8786         return tem;
8787
8788       return NULL_TREE;
8789
8790     case TRUTH_ORIF_EXPR:
8791       /* Note that the operands of this must be ints
8792          and their values must be 0 or true.
8793          ("true" is a fixed value perhaps depending on the language.)  */
8794       /* If first arg is constant true, return it.  */
8795       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8796         return fold_convert (type, arg0);
8797     case TRUTH_OR_EXPR:
8798       /* If either arg is constant zero, drop it.  */
8799       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
8800         return non_lvalue (fold_convert (type, arg1));
8801       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
8802           /* Preserve sequence points.  */
8803           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
8804         return non_lvalue (fold_convert (type, arg0));
8805       /* If second arg is constant true, result is true, but we must
8806          evaluate first arg.  */
8807       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
8808         return omit_one_operand (type, arg1, arg0);
8809       /* Likewise for first arg, but note this only occurs here for
8810          TRUTH_OR_EXPR.  */
8811       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8812         return omit_one_operand (type, arg0, arg1);
8813
8814       /* !X || X is always true.  */
8815       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8816           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8817         return omit_one_operand (type, integer_one_node, arg1);
8818       /* X || !X is always true.  */
8819       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8820           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8821         return omit_one_operand (type, integer_one_node, arg0);
8822
8823       goto truth_andor;
8824
8825     case TRUTH_XOR_EXPR:
8826       /* If the second arg is constant zero, drop it.  */
8827       if (integer_zerop (arg1))
8828         return non_lvalue (fold_convert (type, arg0));
8829       /* If the second arg is constant true, this is a logical inversion.  */
8830       if (integer_onep (arg1))
8831         {
8832           /* Only call invert_truthvalue if operand is a truth value.  */
8833           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8834             tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
8835           else
8836             tem = invert_truthvalue (arg0);
8837           return non_lvalue (fold_convert (type, tem));
8838         }
8839       /* Identical arguments cancel to zero.  */
8840       if (operand_equal_p (arg0, arg1, 0))
8841         return omit_one_operand (type, integer_zero_node, arg0);
8842
8843       /* !X ^ X is always true.  */
8844       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8845           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8846         return omit_one_operand (type, integer_one_node, arg1);
8847
8848       /* X ^ !X is always true.  */
8849       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8850           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8851         return omit_one_operand (type, integer_one_node, arg0);
8852
8853       return NULL_TREE;
8854
8855     case EQ_EXPR:
8856     case NE_EXPR:
8857     case LT_EXPR:
8858     case GT_EXPR:
8859     case LE_EXPR:
8860     case GE_EXPR:       
8861       /* If one arg is a real or integer constant, put it last.  */
8862       if (tree_swap_operands_p (arg0, arg1, true))
8863         return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8864         
8865       /* bool_var != 0 becomes bool_var. */
8866       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
8867           && code == NE_EXPR)
8868         return non_lvalue (fold_convert (type, arg0));
8869         
8870       /* bool_var == 1 becomes bool_var. */
8871       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
8872           && code == EQ_EXPR)
8873         return non_lvalue (fold_convert (type, arg0));
8874
8875       /* If this is an equality comparison of the address of a non-weak
8876          object against zero, then we know the result.  */
8877       if ((code == EQ_EXPR || code == NE_EXPR)
8878           && TREE_CODE (arg0) == ADDR_EXPR
8879           && DECL_P (TREE_OPERAND (arg0, 0))
8880           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8881           && integer_zerop (arg1))
8882         return constant_boolean_node (code != EQ_EXPR, type);
8883
8884       /* If this is an equality comparison of the address of two non-weak,
8885          unaliased symbols neither of which are extern (since we do not
8886          have access to attributes for externs), then we know the result.  */
8887       if ((code == EQ_EXPR || code == NE_EXPR)
8888           && TREE_CODE (arg0) == ADDR_EXPR
8889           && DECL_P (TREE_OPERAND (arg0, 0))
8890           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8891           && ! lookup_attribute ("alias",
8892                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
8893           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
8894           && TREE_CODE (arg1) == ADDR_EXPR
8895           && DECL_P (TREE_OPERAND (arg1, 0))
8896           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
8897           && ! lookup_attribute ("alias",
8898                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
8899           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
8900         return constant_boolean_node (operand_equal_p (arg0, arg1, 0)
8901                                       ? code == EQ_EXPR : code != EQ_EXPR,
8902                                       type);
8903
8904       /* If this is a comparison of two exprs that look like an
8905          ARRAY_REF of the same object, then we can fold this to a
8906          comparison of the two offsets.  */
8907       if (TREE_CODE_CLASS (code) == tcc_comparison)
8908         {
8909           tree base0, offset0, base1, offset1;
8910
8911           if (extract_array_ref (arg0, &base0, &offset0)
8912               && extract_array_ref (arg1, &base1, &offset1)
8913               && operand_equal_p (base0, base1, 0))
8914             {
8915               if (offset0 == NULL_TREE
8916                   && offset1 == NULL_TREE)
8917                 {
8918                   offset0 = integer_zero_node;
8919                   offset1 = integer_zero_node;
8920                 }
8921               else if (offset0 == NULL_TREE)
8922                 offset0 = build_int_cst (TREE_TYPE (offset1), 0);
8923               else if (offset1 == NULL_TREE)
8924                 offset1 = build_int_cst (TREE_TYPE (offset0), 0);
8925
8926               if (TREE_TYPE (offset0) == TREE_TYPE (offset1))
8927                 return fold_build2 (code, type, offset0, offset1);
8928             }
8929         }
8930
8931       /* Transform comparisons of the form X +- C CMP X.  */
8932       if ((code != EQ_EXPR && code != NE_EXPR)
8933           && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8934           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
8935           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8936                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
8937               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8938                   && !TYPE_UNSIGNED (TREE_TYPE (arg1))
8939                   && !(flag_wrapv || flag_trapv))))
8940         {
8941           tree arg01 = TREE_OPERAND (arg0, 1);
8942           enum tree_code code0 = TREE_CODE (arg0);
8943           int is_positive;
8944
8945           if (TREE_CODE (arg01) == REAL_CST)
8946             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
8947           else
8948             is_positive = tree_int_cst_sgn (arg01);
8949
8950           /* (X - c) > X becomes false.  */
8951           if (code == GT_EXPR
8952               && ((code0 == MINUS_EXPR && is_positive >= 0)
8953                   || (code0 == PLUS_EXPR && is_positive <= 0)))
8954             return constant_boolean_node (0, type);
8955
8956           /* Likewise (X + c) < X becomes false.  */
8957           if (code == LT_EXPR
8958               && ((code0 == PLUS_EXPR && is_positive >= 0)
8959                   || (code0 == MINUS_EXPR && is_positive <= 0)))
8960             return constant_boolean_node (0, type);
8961
8962           /* Convert (X - c) <= X to true.  */
8963           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
8964               && code == LE_EXPR
8965               && ((code0 == MINUS_EXPR && is_positive >= 0)
8966                   || (code0 == PLUS_EXPR && is_positive <= 0)))
8967             return constant_boolean_node (1, type);
8968
8969           /* Convert (X + c) >= X to true.  */
8970           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
8971               && code == GE_EXPR
8972               && ((code0 == PLUS_EXPR && is_positive >= 0)
8973                   || (code0 == MINUS_EXPR && is_positive <= 0)))
8974             return constant_boolean_node (1, type);
8975
8976           if (TREE_CODE (arg01) == INTEGER_CST)
8977             {
8978               /* Convert X + c > X and X - c < X to true for integers.  */
8979               if (code == GT_EXPR
8980                   && ((code0 == PLUS_EXPR && is_positive > 0)
8981                       || (code0 == MINUS_EXPR && is_positive < 0)))
8982                 return constant_boolean_node (1, type);
8983
8984               if (code == LT_EXPR
8985                   && ((code0 == MINUS_EXPR && is_positive > 0)
8986                       || (code0 == PLUS_EXPR && is_positive < 0)))
8987                 return constant_boolean_node (1, type);
8988
8989               /* Convert X + c <= X and X - c >= X to false for integers.  */
8990               if (code == LE_EXPR
8991                   && ((code0 == PLUS_EXPR && is_positive > 0)
8992                       || (code0 == MINUS_EXPR && is_positive < 0)))
8993                 return constant_boolean_node (0, type);
8994
8995               if (code == GE_EXPR
8996                   && ((code0 == MINUS_EXPR && is_positive > 0)
8997                       || (code0 == PLUS_EXPR && is_positive < 0)))
8998                 return constant_boolean_node (0, type);
8999             }
9000         }
9001
9002       if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9003         {
9004           tree targ0 = strip_float_extensions (arg0);
9005           tree targ1 = strip_float_extensions (arg1);
9006           tree newtype = TREE_TYPE (targ0);
9007
9008           if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9009             newtype = TREE_TYPE (targ1);
9010
9011           /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9012           if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9013             return fold_build2 (code, type, fold_convert (newtype, targ0),
9014                                 fold_convert (newtype, targ1));
9015
9016           /* (-a) CMP (-b) -> b CMP a  */
9017           if (TREE_CODE (arg0) == NEGATE_EXPR
9018               && TREE_CODE (arg1) == NEGATE_EXPR)
9019             return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
9020                                 TREE_OPERAND (arg0, 0));
9021
9022           if (TREE_CODE (arg1) == REAL_CST)
9023           {
9024             REAL_VALUE_TYPE cst;
9025             cst = TREE_REAL_CST (arg1);
9026
9027             /* (-a) CMP CST -> a swap(CMP) (-CST)  */
9028             if (TREE_CODE (arg0) == NEGATE_EXPR)
9029               return
9030                 fold_build2 (swap_tree_comparison (code), type,
9031                              TREE_OPERAND (arg0, 0),
9032                              build_real (TREE_TYPE (arg1),
9033                                          REAL_VALUE_NEGATE (cst)));
9034
9035             /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9036             /* a CMP (-0) -> a CMP 0  */
9037             if (REAL_VALUE_MINUS_ZERO (cst))
9038               return fold_build2 (code, type, arg0,
9039                                   build_real (TREE_TYPE (arg1), dconst0));
9040
9041             /* x != NaN is always true, other ops are always false.  */
9042             if (REAL_VALUE_ISNAN (cst)
9043                 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
9044               {
9045                 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9046                 return omit_one_operand (type, tem, arg0);
9047               }
9048
9049             /* Fold comparisons against infinity.  */
9050             if (REAL_VALUE_ISINF (cst))
9051               {
9052                 tem = fold_inf_compare (code, type, arg0, arg1);
9053                 if (tem != NULL_TREE)
9054                   return tem;
9055               }
9056           }
9057
9058           /* If this is a comparison of a real constant with a PLUS_EXPR
9059              or a MINUS_EXPR of a real constant, we can convert it into a
9060              comparison with a revised real constant as long as no overflow
9061              occurs when unsafe_math_optimizations are enabled.  */
9062           if (flag_unsafe_math_optimizations
9063               && TREE_CODE (arg1) == REAL_CST
9064               && (TREE_CODE (arg0) == PLUS_EXPR
9065                   || TREE_CODE (arg0) == MINUS_EXPR)
9066               && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9067               && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9068                                           ? MINUS_EXPR : PLUS_EXPR,
9069                                           arg1, TREE_OPERAND (arg0, 1), 0))
9070               && ! TREE_CONSTANT_OVERFLOW (tem))
9071             return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9072
9073           /* Likewise, we can simplify a comparison of a real constant with
9074              a MINUS_EXPR whose first operand is also a real constant, i.e.
9075              (c1 - x) < c2 becomes x > c1-c2.  */
9076           if (flag_unsafe_math_optimizations
9077               && TREE_CODE (arg1) == REAL_CST
9078               && TREE_CODE (arg0) == MINUS_EXPR
9079               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9080               && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9081                                           arg1, 0))
9082               && ! TREE_CONSTANT_OVERFLOW (tem))
9083             return fold_build2 (swap_tree_comparison (code), type,
9084                                 TREE_OPERAND (arg0, 1), tem);
9085
9086           /* Fold comparisons against built-in math functions.  */
9087           if (TREE_CODE (arg1) == REAL_CST
9088               && flag_unsafe_math_optimizations
9089               && ! flag_errno_math)
9090             {
9091               enum built_in_function fcode = builtin_mathfn_code (arg0);
9092
9093               if (fcode != END_BUILTINS)
9094                 {
9095                   tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
9096                   if (tem != NULL_TREE)
9097                     return tem;
9098                 }
9099             }
9100         }
9101
9102       /* Convert foo++ == CONST into ++foo == CONST + INCR.  */
9103       if (TREE_CONSTANT (arg1)
9104           && (TREE_CODE (arg0) == POSTINCREMENT_EXPR
9105               || TREE_CODE (arg0) == POSTDECREMENT_EXPR)
9106           /* This optimization is invalid for ordered comparisons
9107              if CONST+INCR overflows or if foo+incr might overflow.
9108              This optimization is invalid for floating point due to rounding.
9109              For pointer types we assume overflow doesn't happen.  */
9110           && (POINTER_TYPE_P (TREE_TYPE (arg0))
9111               || (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
9112                   && (code == EQ_EXPR || code == NE_EXPR))))
9113         {
9114           tree varop, newconst;
9115
9116           if (TREE_CODE (arg0) == POSTINCREMENT_EXPR)
9117             {
9118               newconst = fold_build2 (PLUS_EXPR, TREE_TYPE (arg0),
9119                                       arg1, TREE_OPERAND (arg0, 1));
9120               varop = build2 (PREINCREMENT_EXPR, TREE_TYPE (arg0),
9121                               TREE_OPERAND (arg0, 0),
9122                               TREE_OPERAND (arg0, 1));
9123             }
9124           else
9125             {
9126               newconst = fold_build2 (MINUS_EXPR, TREE_TYPE (arg0),
9127                                       arg1, TREE_OPERAND (arg0, 1));
9128               varop = build2 (PREDECREMENT_EXPR, TREE_TYPE (arg0),
9129                               TREE_OPERAND (arg0, 0),
9130                               TREE_OPERAND (arg0, 1));
9131             }
9132
9133
9134           /* If VAROP is a reference to a bitfield, we must mask
9135              the constant by the width of the field.  */
9136           if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
9137               && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))
9138               && host_integerp (DECL_SIZE (TREE_OPERAND
9139                                            (TREE_OPERAND (varop, 0), 1)), 1))
9140             {
9141               tree fielddecl = TREE_OPERAND (TREE_OPERAND (varop, 0), 1);
9142               HOST_WIDE_INT size = tree_low_cst (DECL_SIZE (fielddecl), 1);
9143               tree folded_compare, shift;
9144
9145               /* First check whether the comparison would come out
9146                  always the same.  If we don't do that we would
9147                  change the meaning with the masking.  */
9148               folded_compare = fold_build2 (code, type,
9149                                             TREE_OPERAND (varop, 0), arg1);
9150               if (integer_zerop (folded_compare)
9151                   || integer_onep (folded_compare))
9152                 return omit_one_operand (type, folded_compare, varop);
9153
9154               shift = build_int_cst (NULL_TREE,
9155                                      TYPE_PRECISION (TREE_TYPE (varop)) - size);
9156               shift = fold_convert (TREE_TYPE (varop), shift);
9157               newconst = fold_build2 (LSHIFT_EXPR, TREE_TYPE (varop),
9158                                       newconst, shift);
9159               newconst = fold_build2 (RSHIFT_EXPR, TREE_TYPE (varop),
9160                                       newconst, shift);
9161             }
9162
9163           return fold_build2 (code, type, varop, newconst);
9164         }
9165
9166       /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
9167          This transformation affects the cases which are handled in later
9168          optimizations involving comparisons with non-negative constants.  */
9169       if (TREE_CODE (arg1) == INTEGER_CST
9170           && TREE_CODE (arg0) != INTEGER_CST
9171           && tree_int_cst_sgn (arg1) > 0)
9172         {
9173           switch (code)
9174             {
9175             case GE_EXPR:
9176               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9177               return fold_build2 (GT_EXPR, type, arg0, arg1);
9178
9179             case LT_EXPR:
9180               arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9181               return fold_build2 (LE_EXPR, type, arg0, arg1);
9182
9183             default:
9184               break;
9185             }
9186         }
9187
9188       /* Comparisons with the highest or lowest possible integer of
9189          the specified size will have known values.  */
9190       {
9191         int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg1)));
9192
9193         if (TREE_CODE (arg1) == INTEGER_CST
9194             && ! TREE_CONSTANT_OVERFLOW (arg1)
9195             && width <= 2 * HOST_BITS_PER_WIDE_INT
9196             && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9197                 || POINTER_TYPE_P (TREE_TYPE (arg1))))
9198           {
9199             HOST_WIDE_INT signed_max_hi;
9200             unsigned HOST_WIDE_INT signed_max_lo;
9201             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
9202
9203             if (width <= HOST_BITS_PER_WIDE_INT)
9204               {
9205                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
9206                                 - 1;
9207                 signed_max_hi = 0;
9208                 max_hi = 0;
9209
9210                 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
9211                   {
9212                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
9213                     min_lo = 0;
9214                     min_hi = 0;
9215                   }
9216                 else
9217                   {
9218                     max_lo = signed_max_lo;
9219                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
9220                     min_hi = -1;
9221                   }
9222               }
9223             else
9224               {
9225                 width -= HOST_BITS_PER_WIDE_INT;
9226                 signed_max_lo = -1;
9227                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
9228                                 - 1;
9229                 max_lo = -1;
9230                 min_lo = 0;
9231
9232                 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
9233                   {
9234                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
9235                     min_hi = 0;
9236                   }
9237                 else
9238                   {
9239                     max_hi = signed_max_hi;
9240                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
9241                   }
9242               }
9243
9244             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
9245                 && TREE_INT_CST_LOW (arg1) == max_lo)
9246               switch (code)
9247                 {
9248                 case GT_EXPR:
9249                   return omit_one_operand (type, integer_zero_node, arg0);
9250
9251                 case GE_EXPR:
9252                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9253
9254                 case LE_EXPR:
9255                   return omit_one_operand (type, integer_one_node, arg0);
9256
9257                 case LT_EXPR:
9258                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9259
9260                 /* The GE_EXPR and LT_EXPR cases above are not normally
9261                    reached because of previous transformations.  */
9262
9263                 default:
9264                   break;
9265                 }
9266             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9267                      == max_hi
9268                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
9269               switch (code)
9270                 {
9271                 case GT_EXPR:
9272                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
9273                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9274                 case LE_EXPR:
9275                   arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
9276                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9277                 default:
9278                   break;
9279                 }
9280             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9281                      == min_hi
9282                      && TREE_INT_CST_LOW (arg1) == min_lo)
9283               switch (code)
9284                 {
9285                 case LT_EXPR:
9286                   return omit_one_operand (type, integer_zero_node, arg0);
9287
9288                 case LE_EXPR:
9289                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9290
9291                 case GE_EXPR:
9292                   return omit_one_operand (type, integer_one_node, arg0);
9293
9294                 case GT_EXPR:
9295                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9296
9297                 default:
9298                   break;
9299                 }
9300             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
9301                      == min_hi
9302                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
9303               switch (code)
9304                 {
9305                 case GE_EXPR:
9306                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9307                   return fold_build2 (NE_EXPR, type, arg0, arg1);
9308                 case LT_EXPR:
9309                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
9310                   return fold_build2 (EQ_EXPR, type, arg0, arg1);
9311                 default:
9312                   break;
9313                 }
9314
9315             else if (!in_gimple_form
9316                      && TREE_INT_CST_HIGH (arg1) == signed_max_hi
9317                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
9318                      && TYPE_UNSIGNED (TREE_TYPE (arg1))
9319                      /* signed_type does not work on pointer types.  */
9320                      && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9321               {
9322                 /* The following case also applies to X < signed_max+1
9323                    and X >= signed_max+1 because previous transformations.  */
9324                 if (code == LE_EXPR || code == GT_EXPR)
9325                   {
9326                     tree st0, st1;
9327                     st0 = lang_hooks.types.signed_type (TREE_TYPE (arg0));
9328                     st1 = lang_hooks.types.signed_type (TREE_TYPE (arg1));
9329                     return fold
9330                       (build2 (code == LE_EXPR ? GE_EXPR: LT_EXPR,
9331                                type, fold_convert (st0, arg0),
9332                                fold_convert (st1, integer_zero_node)));
9333                   }
9334               }
9335           }
9336       }
9337
9338       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
9339          a MINUS_EXPR of a constant, we can convert it into a comparison with
9340          a revised constant as long as no overflow occurs.  */
9341       if ((code == EQ_EXPR || code == NE_EXPR)
9342           && TREE_CODE (arg1) == INTEGER_CST
9343           && (TREE_CODE (arg0) == PLUS_EXPR
9344               || TREE_CODE (arg0) == MINUS_EXPR)
9345           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9346           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9347                                       ? MINUS_EXPR : PLUS_EXPR,
9348                                       arg1, TREE_OPERAND (arg0, 1), 0))
9349           && ! TREE_CONSTANT_OVERFLOW (tem))
9350         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9351
9352       /* Similarly for a NEGATE_EXPR.  */
9353       else if ((code == EQ_EXPR || code == NE_EXPR)
9354                && TREE_CODE (arg0) == NEGATE_EXPR
9355                && TREE_CODE (arg1) == INTEGER_CST
9356                && 0 != (tem = negate_expr (arg1))
9357                && TREE_CODE (tem) == INTEGER_CST
9358                && ! TREE_CONSTANT_OVERFLOW (tem))
9359         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
9360
9361       /* If we have X - Y == 0, we can convert that to X == Y and similarly
9362          for !=.  Don't do this for ordered comparisons due to overflow.  */
9363       else if ((code == NE_EXPR || code == EQ_EXPR)
9364                && integer_zerop (arg1) && TREE_CODE (arg0) == MINUS_EXPR)
9365         return fold_build2 (code, type,
9366                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
9367
9368       else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9369                && (TREE_CODE (arg0) == NOP_EXPR
9370                    || TREE_CODE (arg0) == CONVERT_EXPR))
9371         {
9372           /* If we are widening one operand of an integer comparison,
9373              see if the other operand is similarly being widened.  Perhaps we
9374              can do the comparison in the narrower type.  */
9375           tem = fold_widened_comparison (code, type, arg0, arg1);
9376           if (tem)
9377             return tem;
9378
9379           /* Or if we are changing signedness.  */
9380           tem = fold_sign_changed_comparison (code, type, arg0, arg1);
9381           if (tem)
9382             return tem;
9383         }
9384
9385       /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9386          constant, we can simplify it.  */
9387       else if (TREE_CODE (arg1) == INTEGER_CST
9388                && (TREE_CODE (arg0) == MIN_EXPR
9389                    || TREE_CODE (arg0) == MAX_EXPR)
9390                && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9391         {
9392           tem = optimize_minmax_comparison (code, type, op0, op1);
9393           if (tem)
9394             return tem;
9395
9396           return NULL_TREE;
9397         }
9398
9399       /* If we are comparing an ABS_EXPR with a constant, we can
9400          convert all the cases into explicit comparisons, but they may
9401          well not be faster than doing the ABS and one comparison.
9402          But ABS (X) <= C is a range comparison, which becomes a subtraction
9403          and a comparison, and is probably faster.  */
9404       else if (code == LE_EXPR && TREE_CODE (arg1) == INTEGER_CST
9405                && TREE_CODE (arg0) == ABS_EXPR
9406                && ! TREE_SIDE_EFFECTS (arg0)
9407                && (0 != (tem = negate_expr (arg1)))
9408                && TREE_CODE (tem) == INTEGER_CST
9409                && ! TREE_CONSTANT_OVERFLOW (tem))
9410         return fold_build2 (TRUTH_ANDIF_EXPR, type,
9411                             build2 (GE_EXPR, type,
9412                                     TREE_OPERAND (arg0, 0), tem),
9413                             build2 (LE_EXPR, type,
9414                                     TREE_OPERAND (arg0, 0), arg1));
9415
9416       /* Convert ABS_EXPR<x> >= 0 to true.  */
9417       else if (code == GE_EXPR
9418                && tree_expr_nonnegative_p (arg0)
9419                && (integer_zerop (arg1)
9420                    || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9421                        && real_zerop (arg1))))
9422         return omit_one_operand (type, integer_one_node, arg0);
9423
9424       /* Convert ABS_EXPR<x> < 0 to false.  */
9425       else if (code == LT_EXPR
9426                && tree_expr_nonnegative_p (arg0)
9427                && (integer_zerop (arg1) || real_zerop (arg1)))
9428         return omit_one_operand (type, integer_zero_node, arg0);
9429
9430       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
9431       else if ((code == EQ_EXPR || code == NE_EXPR)
9432                && TREE_CODE (arg0) == ABS_EXPR
9433                && (integer_zerop (arg1) || real_zerop (arg1)))
9434         return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
9435
9436       /* If this is an EQ or NE comparison with zero and ARG0 is
9437          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
9438          two operations, but the latter can be done in one less insn
9439          on machines that have only two-operand insns or on which a
9440          constant cannot be the first operand.  */
9441       if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
9442           && TREE_CODE (arg0) == BIT_AND_EXPR)
9443         {
9444           tree arg00 = TREE_OPERAND (arg0, 0);
9445           tree arg01 = TREE_OPERAND (arg0, 1);
9446           if (TREE_CODE (arg00) == LSHIFT_EXPR
9447               && integer_onep (TREE_OPERAND (arg00, 0)))
9448             return
9449               fold_build2 (code, type,
9450                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9451                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
9452                                            arg01, TREE_OPERAND (arg00, 1)),
9453                                    fold_convert (TREE_TYPE (arg0),
9454                                                  integer_one_node)),
9455                            arg1);
9456           else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
9457                    && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
9458             return
9459               fold_build2 (code, type,
9460                            build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9461                                    build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
9462                                            arg00, TREE_OPERAND (arg01, 1)),
9463                                    fold_convert (TREE_TYPE (arg0),
9464                                                  integer_one_node)),
9465                            arg1);
9466         }
9467
9468       /* If this is an NE or EQ comparison of zero against the result of a
9469          signed MOD operation whose second operand is a power of 2, make
9470          the MOD operation unsigned since it is simpler and equivalent.  */
9471       if ((code == NE_EXPR || code == EQ_EXPR)
9472           && integer_zerop (arg1)
9473           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
9474           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
9475               || TREE_CODE (arg0) == CEIL_MOD_EXPR
9476               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
9477               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
9478           && integer_pow2p (TREE_OPERAND (arg0, 1)))
9479         {
9480           tree newtype = lang_hooks.types.unsigned_type (TREE_TYPE (arg0));
9481           tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
9482                                      fold_convert (newtype,
9483                                                    TREE_OPERAND (arg0, 0)),
9484                                      fold_convert (newtype,
9485                                                    TREE_OPERAND (arg0, 1)));
9486
9487           return fold_build2 (code, type, newmod,
9488                               fold_convert (newtype, arg1));
9489         }
9490
9491       /* If this is an NE comparison of zero with an AND of one, remove the
9492          comparison since the AND will give the correct value.  */
9493       if (code == NE_EXPR && integer_zerop (arg1)
9494           && TREE_CODE (arg0) == BIT_AND_EXPR
9495           && integer_onep (TREE_OPERAND (arg0, 1)))
9496         return fold_convert (type, arg0);
9497
9498       /* If we have (A & C) == C where C is a power of 2, convert this into
9499          (A & C) != 0.  Similarly for NE_EXPR.  */
9500       if ((code == EQ_EXPR || code == NE_EXPR)
9501           && TREE_CODE (arg0) == BIT_AND_EXPR
9502           && integer_pow2p (TREE_OPERAND (arg0, 1))
9503           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9504         return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
9505                             arg0, fold_convert (TREE_TYPE (arg0),
9506                                                 integer_zero_node));
9507
9508       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
9509          bit, then fold the expression into A < 0 or A >= 0.  */
9510       tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
9511       if (tem)
9512         return tem;
9513
9514       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
9515          Similarly for NE_EXPR.  */
9516       if ((code == EQ_EXPR || code == NE_EXPR)
9517           && TREE_CODE (arg0) == BIT_AND_EXPR
9518           && TREE_CODE (arg1) == INTEGER_CST
9519           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9520         {
9521           tree notc = fold_build1 (BIT_NOT_EXPR,
9522                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
9523                                    TREE_OPERAND (arg0, 1));
9524           tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9525                                        arg1, notc);
9526           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
9527           if (integer_nonzerop (dandnotc))
9528             return omit_one_operand (type, rslt, arg0);
9529         }
9530
9531       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
9532          Similarly for NE_EXPR.  */
9533       if ((code == EQ_EXPR || code == NE_EXPR)
9534           && TREE_CODE (arg0) == BIT_IOR_EXPR
9535           && TREE_CODE (arg1) == INTEGER_CST
9536           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9537         {
9538           tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
9539           tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
9540                                        TREE_OPERAND (arg0, 1), notd);
9541           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
9542           if (integer_nonzerop (candnotd))
9543             return omit_one_operand (type, rslt, arg0);
9544         }
9545
9546       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
9547          and similarly for >= into !=.  */
9548       if ((code == LT_EXPR || code == GE_EXPR)
9549           && TYPE_UNSIGNED (TREE_TYPE (arg0))
9550           && TREE_CODE (arg1) == LSHIFT_EXPR
9551           && integer_onep (TREE_OPERAND (arg1, 0)))
9552         return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
9553                        build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
9554                                TREE_OPERAND (arg1, 1)),
9555                        fold_convert (TREE_TYPE (arg0), integer_zero_node));
9556
9557       else if ((code == LT_EXPR || code == GE_EXPR)
9558                && TYPE_UNSIGNED (TREE_TYPE (arg0))
9559                && (TREE_CODE (arg1) == NOP_EXPR
9560                    || TREE_CODE (arg1) == CONVERT_EXPR)
9561                && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
9562                && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
9563         return
9564           build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
9565                   fold_convert (TREE_TYPE (arg0),
9566                                 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
9567                                         TREE_OPERAND (TREE_OPERAND (arg1, 0),
9568                                                       1))),
9569                   fold_convert (TREE_TYPE (arg0), integer_zero_node));
9570
9571       /* Simplify comparison of something with itself.  (For IEEE
9572          floating-point, we can only do some of these simplifications.)  */
9573       if (operand_equal_p (arg0, arg1, 0))
9574         {
9575           switch (code)
9576             {
9577             case EQ_EXPR:
9578               if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9579                   || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9580                 return constant_boolean_node (1, type);
9581               break;
9582
9583             case GE_EXPR:
9584             case LE_EXPR:
9585               if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9586                   || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9587                 return constant_boolean_node (1, type);
9588               return fold_build2 (EQ_EXPR, type, arg0, arg1);
9589
9590             case NE_EXPR:
9591               /* For NE, we can only do this simplification if integer
9592                  or we don't honor IEEE floating point NaNs.  */
9593               if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9594                   && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9595                 break;
9596               /* ... fall through ...  */
9597             case GT_EXPR:
9598             case LT_EXPR:
9599               return constant_boolean_node (0, type);
9600             default:
9601               gcc_unreachable ();
9602             }
9603         }
9604
9605       /* If we are comparing an expression that just has comparisons
9606          of two integer values, arithmetic expressions of those comparisons,
9607          and constants, we can simplify it.  There are only three cases
9608          to check: the two values can either be equal, the first can be
9609          greater, or the second can be greater.  Fold the expression for
9610          those three values.  Since each value must be 0 or 1, we have
9611          eight possibilities, each of which corresponds to the constant 0
9612          or 1 or one of the six possible comparisons.
9613
9614          This handles common cases like (a > b) == 0 but also handles
9615          expressions like  ((x > y) - (y > x)) > 0, which supposedly
9616          occur in macroized code.  */
9617
9618       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9619         {
9620           tree cval1 = 0, cval2 = 0;
9621           int save_p = 0;
9622
9623           if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9624               /* Don't handle degenerate cases here; they should already
9625                  have been handled anyway.  */
9626               && cval1 != 0 && cval2 != 0
9627               && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9628               && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9629               && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9630               && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9631               && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9632               && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9633                                     TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9634             {
9635               tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9636               tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9637
9638               /* We can't just pass T to eval_subst in case cval1 or cval2
9639                  was the same as ARG1.  */
9640
9641               tree high_result
9642                 = fold_build2 (code, type,
9643                                eval_subst (arg0, cval1, maxval,
9644                                            cval2, minval),
9645                                arg1);
9646               tree equal_result
9647                 = fold_build2 (code, type,
9648                                eval_subst (arg0, cval1, maxval,
9649                                            cval2, maxval),
9650                                arg1);
9651               tree low_result
9652                 = fold_build2 (code, type,
9653                                eval_subst (arg0, cval1, minval,
9654                                            cval2, maxval),
9655                                arg1);
9656
9657               /* All three of these results should be 0 or 1.  Confirm they
9658                  are.  Then use those values to select the proper code
9659                  to use.  */
9660
9661               if ((integer_zerop (high_result)
9662                    || integer_onep (high_result))
9663                   && (integer_zerop (equal_result)
9664                       || integer_onep (equal_result))
9665                   && (integer_zerop (low_result)
9666                       || integer_onep (low_result)))
9667                 {
9668                   /* Make a 3-bit mask with the high-order bit being the
9669                      value for `>', the next for '=', and the low for '<'.  */
9670                   switch ((integer_onep (high_result) * 4)
9671                           + (integer_onep (equal_result) * 2)
9672                           + integer_onep (low_result))
9673                     {
9674                     case 0:
9675                       /* Always false.  */
9676                       return omit_one_operand (type, integer_zero_node, arg0);
9677                     case 1:
9678                       code = LT_EXPR;
9679                       break;
9680                     case 2:
9681                       code = EQ_EXPR;
9682                       break;
9683                     case 3:
9684                       code = LE_EXPR;
9685                       break;
9686                     case 4:
9687                       code = GT_EXPR;
9688                       break;
9689                     case 5:
9690                       code = NE_EXPR;
9691                       break;
9692                     case 6:
9693                       code = GE_EXPR;
9694                       break;
9695                     case 7:
9696                       /* Always true.  */
9697                       return omit_one_operand (type, integer_one_node, arg0);
9698                     }
9699
9700                   if (save_p)
9701                     return save_expr (build2 (code, type, cval1, cval2));
9702                   else
9703                     return fold_build2 (code, type, cval1, cval2);
9704                 }
9705             }
9706         }
9707
9708       /* If this is a comparison of a field, we may be able to simplify it.  */
9709       if (((TREE_CODE (arg0) == COMPONENT_REF
9710             && lang_hooks.can_use_bit_fields_p ())
9711            || TREE_CODE (arg0) == BIT_FIELD_REF)
9712           && (code == EQ_EXPR || code == NE_EXPR)
9713           /* Handle the constant case even without -O
9714              to make sure the warnings are given.  */
9715           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
9716         {
9717           t1 = optimize_bit_field_compare (code, type, arg0, arg1);
9718           if (t1)
9719             return t1;
9720         }
9721
9722       /* Fold a comparison of the address of COMPONENT_REFs with the same
9723          type and component to a comparison of the address of the base
9724          object.  In short, &x->a OP &y->a to x OP y and
9725          &x->a OP &y.a to x OP &y  */
9726       if (TREE_CODE (arg0) == ADDR_EXPR
9727           && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
9728           && TREE_CODE (arg1) == ADDR_EXPR
9729           && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
9730         {
9731           tree cref0 = TREE_OPERAND (arg0, 0);
9732           tree cref1 = TREE_OPERAND (arg1, 0);
9733           if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
9734             {
9735               tree op0 = TREE_OPERAND (cref0, 0);
9736               tree op1 = TREE_OPERAND (cref1, 0);
9737               return fold_build2 (code, type,
9738                                   build_fold_addr_expr (op0),
9739                                   build_fold_addr_expr (op1));
9740             }
9741         }
9742
9743       /* If this is a comparison of complex values and either or both sides
9744          are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
9745          comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
9746          This may prevent needless evaluations.  */
9747       if ((code == EQ_EXPR || code == NE_EXPR)
9748           && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
9749           && (TREE_CODE (arg0) == COMPLEX_EXPR
9750               || TREE_CODE (arg1) == COMPLEX_EXPR
9751               || TREE_CODE (arg0) == COMPLEX_CST
9752               || TREE_CODE (arg1) == COMPLEX_CST))
9753         {
9754           tree subtype = TREE_TYPE (TREE_TYPE (arg0));
9755           tree real0, imag0, real1, imag1;
9756
9757           arg0 = save_expr (arg0);
9758           arg1 = save_expr (arg1);
9759           real0 = fold_build1 (REALPART_EXPR, subtype, arg0);
9760           imag0 = fold_build1 (IMAGPART_EXPR, subtype, arg0);
9761           real1 = fold_build1 (REALPART_EXPR, subtype, arg1);
9762           imag1 = fold_build1 (IMAGPART_EXPR, subtype, arg1);
9763
9764           return fold_build2 ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
9765                                : TRUTH_ORIF_EXPR),
9766                               type,
9767                               fold_build2 (code, type, real0, real1),
9768                               fold_build2 (code, type, imag0, imag1));
9769         }
9770
9771       /* Optimize comparisons of strlen vs zero to a compare of the
9772          first character of the string vs zero.  To wit,
9773                 strlen(ptr) == 0   =>  *ptr == 0
9774                 strlen(ptr) != 0   =>  *ptr != 0
9775          Other cases should reduce to one of these two (or a constant)
9776          due to the return value of strlen being unsigned.  */
9777       if ((code == EQ_EXPR || code == NE_EXPR)
9778           && integer_zerop (arg1)
9779           && TREE_CODE (arg0) == CALL_EXPR)
9780         {
9781           tree fndecl = get_callee_fndecl (arg0);
9782           tree arglist;
9783
9784           if (fndecl
9785               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
9786               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
9787               && (arglist = TREE_OPERAND (arg0, 1))
9788               && TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
9789               && ! TREE_CHAIN (arglist))
9790             return fold_build2 (code, type,
9791                                 build1 (INDIRECT_REF, char_type_node,
9792                                         TREE_VALUE (arglist)),
9793                                 fold_convert (char_type_node,
9794                                               integer_zero_node));
9795         }
9796
9797       /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9798          into a single range test.  */
9799       if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9800            || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9801           && TREE_CODE (arg1) == INTEGER_CST
9802           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9803           && !integer_zerop (TREE_OPERAND (arg0, 1))
9804           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9805           && !TREE_OVERFLOW (arg1))
9806         {
9807           t1 = fold_div_compare (code, type, arg0, arg1);
9808           if (t1 != NULL_TREE)
9809             return t1;
9810         }
9811
9812       if ((code == EQ_EXPR || code == NE_EXPR)
9813           && !TREE_SIDE_EFFECTS (arg0)
9814           && integer_zerop (arg1)
9815           && tree_expr_nonzero_p (arg0))
9816         return constant_boolean_node (code==NE_EXPR, type);
9817
9818       t1 = fold_relational_const (code, type, arg0, arg1);
9819       return t1 == NULL_TREE ? NULL_TREE : t1;
9820
9821     case UNORDERED_EXPR:
9822     case ORDERED_EXPR:
9823     case UNLT_EXPR:
9824     case UNLE_EXPR:
9825     case UNGT_EXPR:
9826     case UNGE_EXPR:
9827     case UNEQ_EXPR:
9828     case LTGT_EXPR:
9829       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9830         {
9831           t1 = fold_relational_const (code, type, arg0, arg1);
9832           if (t1 != NULL_TREE)
9833             return t1;
9834         }
9835
9836       /* If the first operand is NaN, the result is constant.  */
9837       if (TREE_CODE (arg0) == REAL_CST
9838           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
9839           && (code != LTGT_EXPR || ! flag_trapping_math))
9840         {
9841           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
9842                ? integer_zero_node
9843                : integer_one_node;
9844           return omit_one_operand (type, t1, arg1);
9845         }
9846
9847       /* If the second operand is NaN, the result is constant.  */
9848       if (TREE_CODE (arg1) == REAL_CST
9849           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
9850           && (code != LTGT_EXPR || ! flag_trapping_math))
9851         {
9852           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
9853                ? integer_zero_node
9854                : integer_one_node;
9855           return omit_one_operand (type, t1, arg0);
9856         }
9857
9858       /* Simplify unordered comparison of something with itself.  */
9859       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
9860           && operand_equal_p (arg0, arg1, 0))
9861         return constant_boolean_node (1, type);
9862
9863       if (code == LTGT_EXPR
9864           && !flag_trapping_math
9865           && operand_equal_p (arg0, arg1, 0))
9866         return constant_boolean_node (0, type);
9867
9868       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9869       {
9870         tree targ0 = strip_float_extensions (arg0);
9871         tree targ1 = strip_float_extensions (arg1);
9872         tree newtype = TREE_TYPE (targ0);
9873
9874         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9875           newtype = TREE_TYPE (targ1);
9876
9877         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9878           return fold_build2 (code, type, fold_convert (newtype, targ0),
9879                               fold_convert (newtype, targ1));
9880       }
9881
9882       return NULL_TREE;
9883
9884     case COMPOUND_EXPR:
9885       /* When pedantic, a compound expression can be neither an lvalue
9886          nor an integer constant expression.  */
9887       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
9888         return NULL_TREE;
9889       /* Don't let (0, 0) be null pointer constant.  */
9890       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
9891                                  : fold_convert (type, arg1);
9892       return pedantic_non_lvalue (tem);
9893
9894     case COMPLEX_EXPR:
9895       if (wins)
9896         return build_complex (type, arg0, arg1);
9897       return NULL_TREE;
9898
9899     case ASSERT_EXPR:
9900       /* An ASSERT_EXPR should never be passed to fold_binary.  */
9901       gcc_unreachable ();
9902
9903     default:
9904       return NULL_TREE;
9905     } /* switch (code) */
9906 }
9907
9908 /* Fold a ternary expression of code CODE and type TYPE with operands
9909    OP0, OP1, and OP2.  Return the folded expression if folding is
9910    successful.  Otherwise, return NULL_TREE.  */
9911
9912 tree
9913 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
9914 {
9915   tree tem;
9916   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
9917   enum tree_code_class kind = TREE_CODE_CLASS (code);
9918
9919   gcc_assert (IS_EXPR_CODE_CLASS (kind)
9920               && TREE_CODE_LENGTH (code) == 3);
9921
9922   /* Strip any conversions that don't change the mode.  This is safe
9923      for every expression, except for a comparison expression because
9924      its signedness is derived from its operands.  So, in the latter
9925      case, only strip conversions that don't change the signedness.
9926
9927      Note that this is done as an internal manipulation within the
9928      constant folder, in order to find the simplest representation of
9929      the arguments so that their form can be studied.  In any cases,
9930      the appropriate type conversions should be put back in the tree
9931      that will get out of the constant folder.  */
9932   if (op0)
9933     {
9934       arg0 = op0;
9935       STRIP_NOPS (arg0);
9936     }
9937
9938   if (op1)
9939     {
9940       arg1 = op1;
9941       STRIP_NOPS (arg1);
9942     }
9943
9944   switch (code)
9945     {
9946     case COMPONENT_REF:
9947       if (TREE_CODE (arg0) == CONSTRUCTOR
9948           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
9949         {
9950           tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
9951           if (m)
9952             return TREE_VALUE (m);
9953         }
9954       return NULL_TREE;
9955
9956     case COND_EXPR:
9957       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
9958          so all simple results must be passed through pedantic_non_lvalue.  */
9959       if (TREE_CODE (arg0) == INTEGER_CST)
9960         {
9961           tem = integer_zerop (arg0) ? op2 : op1;
9962           /* Only optimize constant conditions when the selected branch
9963              has the same type as the COND_EXPR.  This avoids optimizing
9964              away "c ? x : throw", where the throw has a void type.  */
9965           if (! VOID_TYPE_P (TREE_TYPE (tem))
9966               || VOID_TYPE_P (type))
9967             return pedantic_non_lvalue (tem);
9968           return NULL_TREE;
9969         }
9970       if (operand_equal_p (arg1, op2, 0))
9971         return pedantic_omit_one_operand (type, arg1, arg0);
9972
9973       /* If we have A op B ? A : C, we may be able to convert this to a
9974          simpler expression, depending on the operation and the values
9975          of B and C.  Signed zeros prevent all of these transformations,
9976          for reasons given above each one.
9977
9978          Also try swapping the arguments and inverting the conditional.  */
9979       if (COMPARISON_CLASS_P (arg0)
9980           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
9981                                              arg1, TREE_OPERAND (arg0, 1))
9982           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
9983         {
9984           tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
9985           if (tem)
9986             return tem;
9987         }
9988
9989       if (COMPARISON_CLASS_P (arg0)
9990           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
9991                                              op2,
9992                                              TREE_OPERAND (arg0, 1))
9993           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
9994         {
9995           tem = invert_truthvalue (arg0);
9996           if (COMPARISON_CLASS_P (tem))
9997             {
9998               tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
9999               if (tem)
10000                 return tem;
10001             }
10002         }
10003
10004       /* If the second operand is simpler than the third, swap them
10005          since that produces better jump optimization results.  */
10006       if (tree_swap_operands_p (op1, op2, false))
10007         {
10008           /* See if this can be inverted.  If it can't, possibly because
10009              it was a floating-point inequality comparison, don't do
10010              anything.  */
10011           tem = invert_truthvalue (arg0);
10012
10013           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
10014             return fold_build3 (code, type, tem, op2, op1);
10015         }
10016
10017       /* Convert A ? 1 : 0 to simply A.  */
10018       if (integer_onep (op1)
10019           && integer_zerop (op2)
10020           /* If we try to convert OP0 to our type, the
10021              call to fold will try to move the conversion inside
10022              a COND, which will recurse.  In that case, the COND_EXPR
10023              is probably the best choice, so leave it alone.  */
10024           && type == TREE_TYPE (arg0))
10025         return pedantic_non_lvalue (arg0);
10026
10027       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
10028          over COND_EXPR in cases such as floating point comparisons.  */
10029       if (integer_zerop (op1)
10030           && integer_onep (op2)
10031           && truth_value_p (TREE_CODE (arg0)))
10032         return pedantic_non_lvalue (fold_convert (type,
10033                                                   invert_truthvalue (arg0)));
10034
10035       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
10036       if (TREE_CODE (arg0) == LT_EXPR
10037           && integer_zerop (TREE_OPERAND (arg0, 1))
10038           && integer_zerop (op2)
10039           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
10040         return fold_convert (type, fold_build2 (BIT_AND_EXPR,
10041                                                 TREE_TYPE (tem), tem, arg1));
10042
10043       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
10044          already handled above.  */
10045       if (TREE_CODE (arg0) == BIT_AND_EXPR
10046           && integer_onep (TREE_OPERAND (arg0, 1))
10047           && integer_zerop (op2)
10048           && integer_pow2p (arg1))
10049         {
10050           tree tem = TREE_OPERAND (arg0, 0);
10051           STRIP_NOPS (tem);
10052           if (TREE_CODE (tem) == RSHIFT_EXPR
10053               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
10054               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
10055                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
10056             return fold_build2 (BIT_AND_EXPR, type,
10057                                 TREE_OPERAND (tem, 0), arg1);
10058         }
10059
10060       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
10061          is probably obsolete because the first operand should be a
10062          truth value (that's why we have the two cases above), but let's
10063          leave it in until we can confirm this for all front-ends.  */
10064       if (integer_zerop (op2)
10065           && TREE_CODE (arg0) == NE_EXPR
10066           && integer_zerop (TREE_OPERAND (arg0, 1))
10067           && integer_pow2p (arg1)
10068           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
10069           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
10070                               arg1, OEP_ONLY_CONST))
10071         return pedantic_non_lvalue (fold_convert (type,
10072                                                   TREE_OPERAND (arg0, 0)));
10073
10074       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
10075       if (integer_zerop (op2)
10076           && truth_value_p (TREE_CODE (arg0))
10077           && truth_value_p (TREE_CODE (arg1)))
10078         return fold_build2 (TRUTH_ANDIF_EXPR, type, arg0, arg1);
10079
10080       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
10081       if (integer_onep (op2)
10082           && truth_value_p (TREE_CODE (arg0))
10083           && truth_value_p (TREE_CODE (arg1)))
10084         {
10085           /* Only perform transformation if ARG0 is easily inverted.  */
10086           tem = invert_truthvalue (arg0);
10087           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
10088             return fold_build2 (TRUTH_ORIF_EXPR, type, tem, arg1);
10089         }
10090
10091       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
10092       if (integer_zerop (arg1)
10093           && truth_value_p (TREE_CODE (arg0))
10094           && truth_value_p (TREE_CODE (op2)))
10095         {
10096           /* Only perform transformation if ARG0 is easily inverted.  */
10097           tem = invert_truthvalue (arg0);
10098           if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
10099             return fold_build2 (TRUTH_ANDIF_EXPR, type, tem, op2);
10100         }
10101
10102       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
10103       if (integer_onep (arg1)
10104           && truth_value_p (TREE_CODE (arg0))
10105           && truth_value_p (TREE_CODE (op2)))
10106         return fold_build2 (TRUTH_ORIF_EXPR, type, arg0, op2);
10107
10108       return NULL_TREE;
10109
10110     case CALL_EXPR:
10111       /* Check for a built-in function.  */
10112       if (TREE_CODE (op0) == ADDR_EXPR
10113           && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
10114           && DECL_BUILT_IN (TREE_OPERAND (op0, 0)))
10115         {
10116           tree fndecl = TREE_OPERAND (op0, 0);
10117           tree arglist = op1;
10118           tree tmp = fold_builtin (fndecl, arglist, false);
10119           if (tmp)
10120             return tmp;
10121         }
10122       return NULL_TREE;
10123
10124     default:
10125       return NULL_TREE;
10126     } /* switch (code) */
10127 }
10128
10129 /* Perform constant folding and related simplification of EXPR.
10130    The related simplifications include x*1 => x, x*0 => 0, etc.,
10131    and application of the associative law.
10132    NOP_EXPR conversions may be removed freely (as long as we
10133    are careful not to change the type of the overall expression).
10134    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
10135    but we can constant-fold them if they have constant operands.  */
10136
10137 #ifdef ENABLE_FOLD_CHECKING
10138 # define fold(x) fold_1 (x)
10139 static tree fold_1 (tree);
10140 static
10141 #endif
10142 tree
10143 fold (tree expr)
10144 {
10145   const tree t = expr;
10146   enum tree_code code = TREE_CODE (t);
10147   enum tree_code_class kind = TREE_CODE_CLASS (code);
10148   tree tem;
10149
10150   /* Return right away if a constant.  */
10151   if (kind == tcc_constant)
10152     return t;
10153
10154   if (IS_EXPR_CODE_CLASS (kind))
10155     {
10156       tree type = TREE_TYPE (t);
10157       tree op0, op1, op2;
10158
10159       switch (TREE_CODE_LENGTH (code))
10160         {
10161         case 1:
10162           op0 = TREE_OPERAND (t, 0);
10163           tem = fold_unary (code, type, op0);
10164           return tem ? tem : expr;
10165         case 2:
10166           op0 = TREE_OPERAND (t, 0);
10167           op1 = TREE_OPERAND (t, 1);
10168           tem = fold_binary (code, type, op0, op1);
10169           return tem ? tem : expr;
10170         case 3:
10171           op0 = TREE_OPERAND (t, 0);
10172           op1 = TREE_OPERAND (t, 1);
10173           op2 = TREE_OPERAND (t, 2);
10174           tem = fold_ternary (code, type, op0, op1, op2);
10175           return tem ? tem : expr;
10176         default:
10177           break;
10178         }
10179     }
10180
10181   switch (code)
10182     {
10183     case CONST_DECL:
10184       return fold (DECL_INITIAL (t));
10185
10186     default:
10187       return t;
10188     } /* switch (code) */
10189 }
10190
10191 #ifdef ENABLE_FOLD_CHECKING
10192 #undef fold
10193
10194 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
10195 static void fold_check_failed (tree, tree);
10196 void print_fold_checksum (tree);
10197
10198 /* When --enable-checking=fold, compute a digest of expr before
10199    and after actual fold call to see if fold did not accidentally
10200    change original expr.  */
10201
10202 tree
10203 fold (tree expr)
10204 {
10205   tree ret;
10206   struct md5_ctx ctx;
10207   unsigned char checksum_before[16], checksum_after[16];
10208   htab_t ht;
10209
10210   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
10211   md5_init_ctx (&ctx);
10212   fold_checksum_tree (expr, &ctx, ht);
10213   md5_finish_ctx (&ctx, checksum_before);
10214   htab_empty (ht);
10215
10216   ret = fold_1 (expr);
10217
10218   md5_init_ctx (&ctx);
10219   fold_checksum_tree (expr, &ctx, ht);
10220   md5_finish_ctx (&ctx, checksum_after);
10221   htab_delete (ht);
10222
10223   if (memcmp (checksum_before, checksum_after, 16))
10224     fold_check_failed (expr, ret);
10225
10226   return ret;
10227 }
10228
10229 void
10230 print_fold_checksum (tree expr)
10231 {
10232   struct md5_ctx ctx;
10233   unsigned char checksum[16], cnt;
10234   htab_t ht;
10235
10236   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
10237   md5_init_ctx (&ctx);
10238   fold_checksum_tree (expr, &ctx, ht);
10239   md5_finish_ctx (&ctx, checksum);
10240   htab_delete (ht);
10241   for (cnt = 0; cnt < 16; ++cnt)
10242     fprintf (stderr, "%02x", checksum[cnt]);
10243   putc ('\n', stderr);
10244 }
10245
10246 static void
10247 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
10248 {
10249   internal_error ("fold check: original tree changed by fold");
10250 }
10251
10252 static void
10253 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
10254 {
10255   void **slot;
10256   enum tree_code code;
10257   char buf[sizeof (struct tree_decl)];
10258   int i, len;
10259
10260   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
10261                <= sizeof (struct tree_decl))
10262               && sizeof (struct tree_type) <= sizeof (struct tree_decl));
10263   if (expr == NULL)
10264     return;
10265   slot = htab_find_slot (ht, expr, INSERT);
10266   if (*slot != NULL)
10267     return;
10268   *slot = expr;
10269   code = TREE_CODE (expr);
10270   if (TREE_CODE_CLASS (code) == tcc_declaration
10271       && DECL_ASSEMBLER_NAME_SET_P (expr))
10272     {
10273       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
10274       memcpy (buf, expr, tree_size (expr));
10275       expr = (tree) buf;
10276       SET_DECL_ASSEMBLER_NAME (expr, NULL);
10277     }
10278   else if (TREE_CODE_CLASS (code) == tcc_type
10279            && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
10280                || TYPE_CACHED_VALUES_P (expr)))
10281     {
10282       /* Allow these fields to be modified.  */
10283       memcpy (buf, expr, tree_size (expr));
10284       expr = (tree) buf;
10285       TYPE_POINTER_TO (expr) = NULL;
10286       TYPE_REFERENCE_TO (expr) = NULL;
10287       if (TYPE_CACHED_VALUES_P (expr))
10288         {
10289           TYPE_CACHED_VALUES_P (expr) = 0;
10290           TYPE_CACHED_VALUES (expr) = NULL;
10291         }
10292     }
10293   md5_process_bytes (expr, tree_size (expr), ctx);
10294   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
10295   if (TREE_CODE_CLASS (code) != tcc_type
10296       && TREE_CODE_CLASS (code) != tcc_declaration)
10297     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
10298   switch (TREE_CODE_CLASS (code))
10299     {
10300     case tcc_constant:
10301       switch (code)
10302         {
10303         case STRING_CST:
10304           md5_process_bytes (TREE_STRING_POINTER (expr),
10305                              TREE_STRING_LENGTH (expr), ctx);
10306           break;
10307         case COMPLEX_CST:
10308           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
10309           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
10310           break;
10311         case VECTOR_CST:
10312           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
10313           break;
10314         default:
10315           break;
10316         }
10317       break;
10318     case tcc_exceptional:
10319       switch (code)
10320         {
10321         case TREE_LIST:
10322           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
10323           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
10324           break;
10325         case TREE_VEC:
10326           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
10327             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
10328           break;
10329         default:
10330           break;
10331         }
10332       break;
10333     case tcc_expression:
10334     case tcc_reference:
10335     case tcc_comparison:
10336     case tcc_unary:
10337     case tcc_binary:
10338     case tcc_statement:
10339       len = TREE_CODE_LENGTH (code);
10340       for (i = 0; i < len; ++i)
10341         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
10342       break;
10343     case tcc_declaration:
10344       fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
10345       fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
10346       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
10347       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
10348       fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
10349       fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
10350       fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
10351       fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
10352       fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
10353       fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
10354       fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
10355       break;
10356     case tcc_type:
10357       if (TREE_CODE (expr) == ENUMERAL_TYPE)
10358         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
10359       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
10360       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
10361       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
10362       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
10363       if (INTEGRAL_TYPE_P (expr)
10364           || SCALAR_FLOAT_TYPE_P (expr))
10365         {
10366           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
10367           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
10368         }
10369       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
10370       if (TREE_CODE (expr) == RECORD_TYPE
10371           || TREE_CODE (expr) == UNION_TYPE
10372           || TREE_CODE (expr) == QUAL_UNION_TYPE)
10373         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
10374       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
10375       break;
10376     default:
10377       break;
10378     }
10379 }
10380
10381 #endif
10382
10383 /* Fold a unary tree expression with code CODE of type TYPE with an
10384    operand OP0.  Return a folded expression if successful.  Otherwise,
10385    return a tree expression with code CODE of type TYPE with an
10386    operand OP0.  */
10387
10388 tree
10389 fold_build1 (enum tree_code code, tree type, tree op0)
10390 {
10391   tree tem = fold_unary (code, type, op0);
10392   if (tem)
10393     return tem;
10394
10395   return build1 (code, type, op0);
10396 }
10397
10398 /* Fold a binary tree expression with code CODE of type TYPE with
10399    operands OP0 and OP1.  Return a folded expression if successful.
10400    Otherwise, return a tree expression with code CODE of type TYPE
10401    with operands OP0 and OP1.  */
10402
10403 tree
10404 fold_build2 (enum tree_code code, tree type, tree op0, tree op1)
10405 {
10406   tree tem = fold_binary (code, type, op0, op1);
10407   if (tem)
10408     return tem;
10409
10410   return build2 (code, type, op0, op1);
10411 }
10412
10413 /* Fold a ternary tree expression with code CODE of type TYPE with
10414    operands OP0, OP1, and OP2.  Return a folded expression if
10415    successful.  Otherwise, return a tree expression with code CODE of
10416    type TYPE with operands OP0, OP1, and OP2.  */
10417
10418 tree
10419 fold_build3 (enum tree_code code, tree type, tree op0, tree op1, tree op2)
10420 {
10421   tree tem = fold_ternary (code, type, op0, op1, op2);
10422   if (tem)
10423     return tem;
10424
10425   return build3 (code, type, op0, op1, op2);
10426 }
10427
10428 /* Perform constant folding and related simplification of initializer
10429    expression EXPR.  This behaves identically to "fold" but ignores
10430    potential run-time traps and exceptions that fold must preserve.  */
10431
10432 tree
10433 fold_initializer (tree expr)
10434 {
10435   int saved_signaling_nans = flag_signaling_nans;
10436   int saved_trapping_math = flag_trapping_math;
10437   int saved_rounding_math = flag_rounding_math;
10438   int saved_trapv = flag_trapv;
10439   tree result;
10440
10441   flag_signaling_nans = 0;
10442   flag_trapping_math = 0;
10443   flag_rounding_math = 0;
10444   flag_trapv = 0;
10445
10446   result = fold (expr);
10447
10448   flag_signaling_nans = saved_signaling_nans;
10449   flag_trapping_math = saved_trapping_math;
10450   flag_rounding_math = saved_rounding_math;
10451   flag_trapv = saved_trapv;
10452
10453   return result;
10454 }
10455
10456 /* Determine if first argument is a multiple of second argument.  Return 0 if
10457    it is not, or we cannot easily determined it to be.
10458
10459    An example of the sort of thing we care about (at this point; this routine
10460    could surely be made more general, and expanded to do what the *_DIV_EXPR's
10461    fold cases do now) is discovering that
10462
10463      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
10464
10465    is a multiple of
10466
10467      SAVE_EXPR (J * 8)
10468
10469    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
10470
10471    This code also handles discovering that
10472
10473      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
10474
10475    is a multiple of 8 so we don't have to worry about dealing with a
10476    possible remainder.
10477
10478    Note that we *look* inside a SAVE_EXPR only to determine how it was
10479    calculated; it is not safe for fold to do much of anything else with the
10480    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
10481    at run time.  For example, the latter example above *cannot* be implemented
10482    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
10483    evaluation time of the original SAVE_EXPR is not necessarily the same at
10484    the time the new expression is evaluated.  The only optimization of this
10485    sort that would be valid is changing
10486
10487      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
10488
10489    divided by 8 to
10490
10491      SAVE_EXPR (I) * SAVE_EXPR (J)
10492
10493    (where the same SAVE_EXPR (J) is used in the original and the
10494    transformed version).  */
10495
10496 static int
10497 multiple_of_p (tree type, tree top, tree bottom)
10498 {
10499   if (operand_equal_p (top, bottom, 0))
10500     return 1;
10501
10502   if (TREE_CODE (type) != INTEGER_TYPE)
10503     return 0;
10504
10505   switch (TREE_CODE (top))
10506     {
10507     case BIT_AND_EXPR:
10508       /* Bitwise and provides a power of two multiple.  If the mask is
10509          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
10510       if (!integer_pow2p (bottom))
10511         return 0;
10512       /* FALLTHRU */
10513
10514     case MULT_EXPR:
10515       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
10516               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
10517
10518     case PLUS_EXPR:
10519     case MINUS_EXPR:
10520       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
10521               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
10522
10523     case LSHIFT_EXPR:
10524       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
10525         {
10526           tree op1, t1;
10527
10528           op1 = TREE_OPERAND (top, 1);
10529           /* const_binop may not detect overflow correctly,
10530              so check for it explicitly here.  */
10531           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
10532               > TREE_INT_CST_LOW (op1)
10533               && TREE_INT_CST_HIGH (op1) == 0
10534               && 0 != (t1 = fold_convert (type,
10535                                           const_binop (LSHIFT_EXPR,
10536                                                        size_one_node,
10537                                                        op1, 0)))
10538               && ! TREE_OVERFLOW (t1))
10539             return multiple_of_p (type, t1, bottom);
10540         }
10541       return 0;
10542
10543     case NOP_EXPR:
10544       /* Can't handle conversions from non-integral or wider integral type.  */
10545       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
10546           || (TYPE_PRECISION (type)
10547               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
10548         return 0;
10549
10550       /* .. fall through ...  */
10551
10552     case SAVE_EXPR:
10553       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
10554
10555     case INTEGER_CST:
10556       if (TREE_CODE (bottom) != INTEGER_CST
10557           || (TYPE_UNSIGNED (type)
10558               && (tree_int_cst_sgn (top) < 0
10559                   || tree_int_cst_sgn (bottom) < 0)))
10560         return 0;
10561       return integer_zerop (const_binop (TRUNC_MOD_EXPR,
10562                                          top, bottom, 0));
10563
10564     default:
10565       return 0;
10566     }
10567 }
10568
10569 /* Return true if `t' is known to be non-negative.  */
10570
10571 int
10572 tree_expr_nonnegative_p (tree t)
10573 {
10574   switch (TREE_CODE (t))
10575     {
10576     case ABS_EXPR:
10577       return 1;
10578
10579     case INTEGER_CST:
10580       return tree_int_cst_sgn (t) >= 0;
10581
10582     case REAL_CST:
10583       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
10584
10585     case PLUS_EXPR:
10586       if (FLOAT_TYPE_P (TREE_TYPE (t)))
10587         return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10588                && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10589
10590       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
10591          both unsigned and at least 2 bits shorter than the result.  */
10592       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
10593           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
10594           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
10595         {
10596           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
10597           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
10598           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
10599               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
10600             {
10601               unsigned int prec = MAX (TYPE_PRECISION (inner1),
10602                                        TYPE_PRECISION (inner2)) + 1;
10603               return prec < TYPE_PRECISION (TREE_TYPE (t));
10604             }
10605         }
10606       break;
10607
10608     case MULT_EXPR:
10609       if (FLOAT_TYPE_P (TREE_TYPE (t)))
10610         {
10611           /* x * x for floating point x is always non-negative.  */
10612           if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
10613             return 1;
10614           return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10615                  && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10616         }
10617
10618       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
10619          both unsigned and their total bits is shorter than the result.  */
10620       if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
10621           && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
10622           && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
10623         {
10624           tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
10625           tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
10626           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
10627               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
10628             return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
10629                    < TYPE_PRECISION (TREE_TYPE (t));
10630         }
10631       return 0;
10632
10633     case TRUNC_DIV_EXPR:
10634     case CEIL_DIV_EXPR:
10635     case FLOOR_DIV_EXPR:
10636     case ROUND_DIV_EXPR:
10637       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10638              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10639
10640     case TRUNC_MOD_EXPR:
10641     case CEIL_MOD_EXPR:
10642     case FLOOR_MOD_EXPR:
10643     case ROUND_MOD_EXPR:
10644       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10645
10646     case RDIV_EXPR:
10647       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10648              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10649
10650     case BIT_AND_EXPR:
10651       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
10652              || tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10653     case BIT_IOR_EXPR:
10654     case BIT_XOR_EXPR:
10655       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10656              && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10657
10658     case NOP_EXPR:
10659       {
10660         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
10661         tree outer_type = TREE_TYPE (t);
10662
10663         if (TREE_CODE (outer_type) == REAL_TYPE)
10664           {
10665             if (TREE_CODE (inner_type) == REAL_TYPE)
10666               return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10667             if (TREE_CODE (inner_type) == INTEGER_TYPE)
10668               {
10669                 if (TYPE_UNSIGNED (inner_type))
10670                   return 1;
10671                 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10672               }
10673           }
10674         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
10675           {
10676             if (TREE_CODE (inner_type) == REAL_TYPE)
10677               return tree_expr_nonnegative_p (TREE_OPERAND (t,0));
10678             if (TREE_CODE (inner_type) == INTEGER_TYPE)
10679               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
10680                       && TYPE_UNSIGNED (inner_type);
10681           }
10682       }
10683       break;
10684
10685     case COND_EXPR:
10686       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
10687         && tree_expr_nonnegative_p (TREE_OPERAND (t, 2));
10688     case COMPOUND_EXPR:
10689       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10690     case MIN_EXPR:
10691       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10692         && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10693     case MAX_EXPR:
10694       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10695         || tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10696     case MODIFY_EXPR:
10697       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10698     case BIND_EXPR:
10699       return tree_expr_nonnegative_p (expr_last (TREE_OPERAND (t, 1)));
10700     case SAVE_EXPR:
10701       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10702     case NON_LVALUE_EXPR:
10703       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10704     case FLOAT_EXPR:
10705       return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10706
10707     case TARGET_EXPR:
10708       {
10709         tree temp = TARGET_EXPR_SLOT (t);
10710         t = TARGET_EXPR_INITIAL (t);
10711
10712         /* If the initializer is non-void, then it's a normal expression
10713            that will be assigned to the slot.  */
10714         if (!VOID_TYPE_P (t))
10715           return tree_expr_nonnegative_p (t);
10716
10717         /* Otherwise, the initializer sets the slot in some way.  One common
10718            way is an assignment statement at the end of the initializer.  */
10719         while (1)
10720           {
10721             if (TREE_CODE (t) == BIND_EXPR)
10722               t = expr_last (BIND_EXPR_BODY (t));
10723             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
10724                      || TREE_CODE (t) == TRY_CATCH_EXPR)
10725               t = expr_last (TREE_OPERAND (t, 0));
10726             else if (TREE_CODE (t) == STATEMENT_LIST)
10727               t = expr_last (t);
10728             else
10729               break;
10730           }
10731         if (TREE_CODE (t) == MODIFY_EXPR
10732             && TREE_OPERAND (t, 0) == temp)
10733           return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
10734
10735         return 0;
10736       }
10737
10738     case CALL_EXPR:
10739       {
10740         tree fndecl = get_callee_fndecl (t);
10741         tree arglist = TREE_OPERAND (t, 1);
10742         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
10743           switch (DECL_FUNCTION_CODE (fndecl))
10744             {
10745 #define CASE_BUILTIN_F(BUILT_IN_FN) \
10746   case BUILT_IN_FN: case BUILT_IN_FN##F: case BUILT_IN_FN##L:
10747 #define CASE_BUILTIN_I(BUILT_IN_FN) \
10748   case BUILT_IN_FN: case BUILT_IN_FN##L: case BUILT_IN_FN##LL:
10749
10750             CASE_BUILTIN_F (BUILT_IN_ACOS)
10751             CASE_BUILTIN_F (BUILT_IN_ACOSH)
10752             CASE_BUILTIN_F (BUILT_IN_CABS)
10753             CASE_BUILTIN_F (BUILT_IN_COSH)
10754             CASE_BUILTIN_F (BUILT_IN_ERFC)
10755             CASE_BUILTIN_F (BUILT_IN_EXP)
10756             CASE_BUILTIN_F (BUILT_IN_EXP10)
10757             CASE_BUILTIN_F (BUILT_IN_EXP2)
10758             CASE_BUILTIN_F (BUILT_IN_FABS)
10759             CASE_BUILTIN_F (BUILT_IN_FDIM)
10760             CASE_BUILTIN_F (BUILT_IN_FREXP)
10761             CASE_BUILTIN_F (BUILT_IN_HYPOT)
10762             CASE_BUILTIN_F (BUILT_IN_POW10)
10763             CASE_BUILTIN_I (BUILT_IN_FFS)
10764             CASE_BUILTIN_I (BUILT_IN_PARITY)
10765             CASE_BUILTIN_I (BUILT_IN_POPCOUNT)
10766               /* Always true.  */
10767               return 1;
10768
10769             CASE_BUILTIN_F (BUILT_IN_SQRT)
10770               /* sqrt(-0.0) is -0.0.  */
10771               if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
10772                 return 1;
10773               return tree_expr_nonnegative_p (TREE_VALUE (arglist));
10774
10775             CASE_BUILTIN_F (BUILT_IN_ASINH)
10776             CASE_BUILTIN_F (BUILT_IN_ATAN)
10777             CASE_BUILTIN_F (BUILT_IN_ATANH)
10778             CASE_BUILTIN_F (BUILT_IN_CBRT)
10779             CASE_BUILTIN_F (BUILT_IN_CEIL)
10780             CASE_BUILTIN_F (BUILT_IN_ERF)
10781             CASE_BUILTIN_F (BUILT_IN_EXPM1)
10782             CASE_BUILTIN_F (BUILT_IN_FLOOR)
10783             CASE_BUILTIN_F (BUILT_IN_FMOD)
10784             CASE_BUILTIN_F (BUILT_IN_LCEIL)
10785             CASE_BUILTIN_F (BUILT_IN_LDEXP)
10786             CASE_BUILTIN_F (BUILT_IN_LFLOOR)
10787             CASE_BUILTIN_F (BUILT_IN_LLCEIL)
10788             CASE_BUILTIN_F (BUILT_IN_LLFLOOR)
10789             CASE_BUILTIN_F (BUILT_IN_LLRINT)
10790             CASE_BUILTIN_F (BUILT_IN_LLROUND)
10791             CASE_BUILTIN_F (BUILT_IN_LRINT)
10792             CASE_BUILTIN_F (BUILT_IN_LROUND)
10793             CASE_BUILTIN_F (BUILT_IN_MODF)
10794             CASE_BUILTIN_F (BUILT_IN_NEARBYINT)
10795             CASE_BUILTIN_F (BUILT_IN_POW)
10796             CASE_BUILTIN_F (BUILT_IN_RINT)
10797             CASE_BUILTIN_F (BUILT_IN_ROUND)
10798             CASE_BUILTIN_F (BUILT_IN_SIGNBIT)
10799             CASE_BUILTIN_F (BUILT_IN_SINH)
10800             CASE_BUILTIN_F (BUILT_IN_TANH)
10801             CASE_BUILTIN_F (BUILT_IN_TRUNC)
10802               /* True if the 1st argument is nonnegative.  */
10803               return tree_expr_nonnegative_p (TREE_VALUE (arglist));
10804
10805             CASE_BUILTIN_F (BUILT_IN_FMAX)
10806               /* True if the 1st OR 2nd arguments are nonnegative.  */
10807               return tree_expr_nonnegative_p (TREE_VALUE (arglist))
10808                 || tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10809
10810             CASE_BUILTIN_F (BUILT_IN_FMIN)
10811               /* True if the 1st AND 2nd arguments are nonnegative.  */
10812               return tree_expr_nonnegative_p (TREE_VALUE (arglist))
10813                 && tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10814
10815             CASE_BUILTIN_F (BUILT_IN_COPYSIGN)
10816               /* True if the 2nd argument is nonnegative.  */
10817               return tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
10818
10819             default:
10820               break;
10821 #undef CASE_BUILTIN_F
10822 #undef CASE_BUILTIN_I
10823             }
10824       }
10825
10826       /* ... fall through ...  */
10827
10828     default:
10829       if (truth_value_p (TREE_CODE (t)))
10830         /* Truth values evaluate to 0 or 1, which is nonnegative.  */
10831         return 1;
10832     }
10833
10834   /* We don't know sign of `t', so be conservative and return false.  */
10835   return 0;
10836 }
10837
10838 /* Return true when T is an address and is known to be nonzero.
10839    For floating point we further ensure that T is not denormal.
10840    Similar logic is present in nonzero_address in rtlanal.h.  */
10841
10842 static bool
10843 tree_expr_nonzero_p (tree t)
10844 {
10845   tree type = TREE_TYPE (t);
10846
10847   /* Doing something useful for floating point would need more work.  */
10848   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
10849     return false;
10850
10851   switch (TREE_CODE (t))
10852     {
10853     case ABS_EXPR:
10854       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10855         return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10856
10857     case INTEGER_CST:
10858       /* We used to test for !integer_zerop here.  This does not work correctly
10859          if TREE_CONSTANT_OVERFLOW (t).  */
10860       return (TREE_INT_CST_LOW (t) != 0
10861               || TREE_INT_CST_HIGH (t) != 0);
10862
10863     case PLUS_EXPR:
10864       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10865         {
10866           /* With the presence of negative values it is hard
10867              to say something.  */
10868           if (!tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
10869               || !tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
10870             return false;
10871           /* One of operands must be positive and the other non-negative.  */
10872           return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10873                   || tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10874         }
10875       break;
10876
10877     case MULT_EXPR:
10878       if (!TYPE_UNSIGNED (type) && !flag_wrapv)
10879         {
10880           return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10881                   && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10882         }
10883       break;
10884
10885     case NOP_EXPR:
10886       {
10887         tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
10888         tree outer_type = TREE_TYPE (t);
10889
10890         return (TYPE_PRECISION (inner_type) >= TYPE_PRECISION (outer_type)
10891                 && tree_expr_nonzero_p (TREE_OPERAND (t, 0)));
10892       }
10893       break;
10894
10895    case ADDR_EXPR:
10896       {
10897         tree base = get_base_address (TREE_OPERAND (t, 0));
10898
10899         if (!base)
10900           return false;
10901
10902         /* Weak declarations may link to NULL.  */
10903         if (DECL_P (base))
10904           return !DECL_WEAK (base);
10905
10906         /* Constants are never weak.  */
10907         if (CONSTANT_CLASS_P (base))
10908           return true;
10909
10910         return false;
10911       }
10912
10913     case COND_EXPR:
10914       return (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10915               && tree_expr_nonzero_p (TREE_OPERAND (t, 2)));
10916
10917     case MIN_EXPR:
10918       return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
10919               && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
10920
10921     case MAX_EXPR:
10922       if (tree_expr_nonzero_p (TREE_OPERAND (t, 0)))
10923         {
10924           /* When both operands are nonzero, then MAX must be too.  */
10925           if (tree_expr_nonzero_p (TREE_OPERAND (t, 1)))
10926             return true;
10927
10928           /* MAX where operand 0 is positive is positive.  */
10929           return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
10930         }
10931       /* MAX where operand 1 is positive is positive.  */
10932       else if (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10933                && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
10934         return true;
10935       break;
10936
10937     case COMPOUND_EXPR:
10938     case MODIFY_EXPR:
10939     case BIND_EXPR:
10940       return tree_expr_nonzero_p (TREE_OPERAND (t, 1));
10941
10942     case SAVE_EXPR:
10943     case NON_LVALUE_EXPR:
10944       return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10945
10946     case BIT_IOR_EXPR:
10947       return tree_expr_nonzero_p (TREE_OPERAND (t, 1))
10948              || tree_expr_nonzero_p (TREE_OPERAND (t, 0));
10949
10950     default:
10951       break;
10952     }
10953   return false;
10954 }
10955
10956 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
10957    attempt to fold the expression to a constant without modifying TYPE,
10958    OP0 or OP1.
10959
10960    If the expression could be simplified to a constant, then return
10961    the constant.  If the expression would not be simplified to a
10962    constant, then return NULL_TREE.  */
10963
10964 tree
10965 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
10966 {
10967   tree tem = fold_binary (code, type, op0, op1);
10968   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
10969 }
10970
10971 /* Given the components of a unary expression CODE, TYPE and OP0,
10972    attempt to fold the expression to a constant without modifying
10973    TYPE or OP0.
10974
10975    If the expression could be simplified to a constant, then return
10976    the constant.  If the expression would not be simplified to a
10977    constant, then return NULL_TREE.  */
10978
10979 tree
10980 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
10981 {
10982   tree tem = fold_unary (code, type, op0);
10983   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
10984 }
10985
10986 /* If EXP represents referencing an element in a constant string
10987    (either via pointer arithmetic or array indexing), return the
10988    tree representing the value accessed, otherwise return NULL.  */
10989
10990 tree
10991 fold_read_from_constant_string (tree exp)
10992 {
10993   if (TREE_CODE (exp) == INDIRECT_REF || TREE_CODE (exp) == ARRAY_REF)
10994     {
10995       tree exp1 = TREE_OPERAND (exp, 0);
10996       tree index;
10997       tree string;
10998
10999       if (TREE_CODE (exp) == INDIRECT_REF)
11000         string = string_constant (exp1, &index);
11001       else
11002         {
11003           tree low_bound = array_ref_low_bound (exp);
11004           index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
11005
11006           /* Optimize the special-case of a zero lower bound.
11007
11008              We convert the low_bound to sizetype to avoid some problems
11009              with constant folding.  (E.g. suppose the lower bound is 1,
11010              and its mode is QI.  Without the conversion,l (ARRAY
11011              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
11012              +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
11013           if (! integer_zerop (low_bound))
11014             index = size_diffop (index, fold_convert (sizetype, low_bound));
11015
11016           string = exp1;
11017         }
11018
11019       if (string
11020           && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (string))
11021           && TREE_CODE (string) == STRING_CST
11022           && TREE_CODE (index) == INTEGER_CST
11023           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
11024           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
11025               == MODE_INT)
11026           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
11027         return fold_convert (TREE_TYPE (exp),
11028                              build_int_cst (NULL_TREE,
11029                                             (TREE_STRING_POINTER (string)
11030                                              [TREE_INT_CST_LOW (index)])));
11031     }
11032   return NULL;
11033 }
11034
11035 /* Return the tree for neg (ARG0) when ARG0 is known to be either
11036    an integer constant or real constant.
11037
11038    TYPE is the type of the result.  */
11039
11040 static tree
11041 fold_negate_const (tree arg0, tree type)
11042 {
11043   tree t = NULL_TREE;
11044
11045   switch (TREE_CODE (arg0))
11046     {
11047     case INTEGER_CST:
11048       {
11049         unsigned HOST_WIDE_INT low;
11050         HOST_WIDE_INT high;
11051         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
11052                                    TREE_INT_CST_HIGH (arg0),
11053                                    &low, &high);
11054         t = build_int_cst_wide (type, low, high);
11055         t = force_fit_type (t, 1,
11056                             (overflow | TREE_OVERFLOW (arg0))
11057                             && !TYPE_UNSIGNED (type),
11058                             TREE_CONSTANT_OVERFLOW (arg0));
11059         break;
11060       }
11061
11062     case REAL_CST:
11063       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
11064       break;
11065
11066     default:
11067       gcc_unreachable ();
11068     }
11069
11070   return t;
11071 }
11072
11073 /* Return the tree for abs (ARG0) when ARG0 is known to be either
11074    an integer constant or real constant.
11075
11076    TYPE is the type of the result.  */
11077
11078 tree
11079 fold_abs_const (tree arg0, tree type)
11080 {
11081   tree t = NULL_TREE;
11082
11083   switch (TREE_CODE (arg0))
11084     {
11085     case INTEGER_CST:
11086       /* If the value is unsigned, then the absolute value is
11087          the same as the ordinary value.  */
11088       if (TYPE_UNSIGNED (type))
11089         t = arg0;
11090       /* Similarly, if the value is non-negative.  */
11091       else if (INT_CST_LT (integer_minus_one_node, arg0))
11092         t = arg0;
11093       /* If the value is negative, then the absolute value is
11094          its negation.  */
11095       else
11096         {
11097           unsigned HOST_WIDE_INT low;
11098           HOST_WIDE_INT high;
11099           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
11100                                      TREE_INT_CST_HIGH (arg0),
11101                                      &low, &high);
11102           t = build_int_cst_wide (type, low, high);
11103           t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg0),
11104                               TREE_CONSTANT_OVERFLOW (arg0));
11105         }
11106       break;
11107
11108     case REAL_CST:
11109       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
11110         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
11111       else
11112         t =  arg0;
11113       break;
11114
11115     default:
11116       gcc_unreachable ();
11117     }
11118
11119   return t;
11120 }
11121
11122 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
11123    constant.  TYPE is the type of the result.  */
11124
11125 static tree
11126 fold_not_const (tree arg0, tree type)
11127 {
11128   tree t = NULL_TREE;
11129
11130   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
11131
11132   t = build_int_cst_wide (type,
11133                           ~ TREE_INT_CST_LOW (arg0),
11134                           ~ TREE_INT_CST_HIGH (arg0));
11135   t = force_fit_type (t, 0, TREE_OVERFLOW (arg0),
11136                       TREE_CONSTANT_OVERFLOW (arg0));
11137
11138   return t;
11139 }
11140
11141 /* Given CODE, a relational operator, the target type, TYPE and two
11142    constant operands OP0 and OP1, return the result of the
11143    relational operation.  If the result is not a compile time
11144    constant, then return NULL_TREE.  */
11145
11146 static tree
11147 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
11148 {
11149   int result, invert;
11150
11151   /* From here on, the only cases we handle are when the result is
11152      known to be a constant.  */
11153
11154   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
11155     {
11156       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
11157       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
11158
11159       /* Handle the cases where either operand is a NaN.  */
11160       if (real_isnan (c0) || real_isnan (c1))
11161         {
11162           switch (code)
11163             {
11164             case EQ_EXPR:
11165             case ORDERED_EXPR:
11166               result = 0;
11167               break;
11168
11169             case NE_EXPR:
11170             case UNORDERED_EXPR:
11171             case UNLT_EXPR:
11172             case UNLE_EXPR:
11173             case UNGT_EXPR:
11174             case UNGE_EXPR:
11175             case UNEQ_EXPR:
11176               result = 1;
11177               break;
11178
11179             case LT_EXPR:
11180             case LE_EXPR:
11181             case GT_EXPR:
11182             case GE_EXPR:
11183             case LTGT_EXPR:
11184               if (flag_trapping_math)
11185                 return NULL_TREE;
11186               result = 0;
11187               break;
11188
11189             default:
11190               gcc_unreachable ();
11191             }
11192
11193           return constant_boolean_node (result, type);
11194         }
11195
11196       return constant_boolean_node (real_compare (code, c0, c1), type);
11197     }
11198
11199   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
11200
11201      To compute GT, swap the arguments and do LT.
11202      To compute GE, do LT and invert the result.
11203      To compute LE, swap the arguments, do LT and invert the result.
11204      To compute NE, do EQ and invert the result.
11205
11206      Therefore, the code below must handle only EQ and LT.  */
11207
11208   if (code == LE_EXPR || code == GT_EXPR)
11209     {
11210       tree tem = op0;
11211       op0 = op1;
11212       op1 = tem;
11213       code = swap_tree_comparison (code);
11214     }
11215
11216   /* Note that it is safe to invert for real values here because we
11217      have already handled the one case that it matters.  */
11218
11219   invert = 0;
11220   if (code == NE_EXPR || code == GE_EXPR)
11221     {
11222       invert = 1;
11223       code = invert_tree_comparison (code, false);
11224     }
11225
11226   /* Compute a result for LT or EQ if args permit;
11227      Otherwise return T.  */
11228   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
11229     {
11230       if (code == EQ_EXPR)
11231         result = tree_int_cst_equal (op0, op1);
11232       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
11233         result = INT_CST_LT_UNSIGNED (op0, op1);
11234       else
11235         result = INT_CST_LT (op0, op1);
11236     }
11237   else
11238     return NULL_TREE;
11239
11240   if (invert)
11241     result ^= 1;
11242   return constant_boolean_node (result, type);
11243 }
11244
11245 /* Build an expression for the a clean point containing EXPR with type TYPE.
11246    Don't build a cleanup point expression for EXPR which don't have side
11247    effects.  */
11248
11249 tree
11250 fold_build_cleanup_point_expr (tree type, tree expr)
11251 {
11252   /* If the expression does not have side effects then we don't have to wrap
11253      it with a cleanup point expression.  */
11254   if (!TREE_SIDE_EFFECTS (expr))
11255     return expr;
11256
11257   /* If the expression is a return, check to see if the expression inside the
11258      return has no side effects or the right hand side of the modify expression
11259      inside the return. If either don't have side effects set we don't need to
11260      wrap the expression in a cleanup point expression.  Note we don't check the
11261      left hand side of the modify because it should always be a return decl.  */
11262   if (TREE_CODE (expr) == RETURN_EXPR)
11263     {
11264       tree op = TREE_OPERAND (expr, 0);
11265       if (!op || !TREE_SIDE_EFFECTS (op))
11266         return expr;
11267       op = TREE_OPERAND (op, 1);
11268       if (!TREE_SIDE_EFFECTS (op))
11269         return expr;
11270     }
11271   
11272   return build1 (CLEANUP_POINT_EXPR, type, expr);
11273 }
11274
11275 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
11276    avoid confusing the gimplify process.  */
11277
11278 tree
11279 build_fold_addr_expr_with_type (tree t, tree ptrtype)
11280 {
11281   /* The size of the object is not relevant when talking about its address.  */
11282   if (TREE_CODE (t) == WITH_SIZE_EXPR)
11283     t = TREE_OPERAND (t, 0);
11284
11285   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
11286   if (TREE_CODE (t) == INDIRECT_REF
11287       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
11288     {
11289       t = TREE_OPERAND (t, 0);
11290       if (TREE_TYPE (t) != ptrtype)
11291         t = build1 (NOP_EXPR, ptrtype, t);
11292     }
11293   else
11294     {
11295       tree base = t;
11296
11297       while (handled_component_p (base))
11298         base = TREE_OPERAND (base, 0);
11299       if (DECL_P (base))
11300         TREE_ADDRESSABLE (base) = 1;
11301
11302       t = build1 (ADDR_EXPR, ptrtype, t);
11303     }
11304
11305   return t;
11306 }
11307
11308 tree
11309 build_fold_addr_expr (tree t)
11310 {
11311   return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
11312 }
11313
11314 /* Given a pointer value T, return a simplified version of an indirection
11315    through T, or NULL_TREE if no simplification is possible.  */
11316
11317 static tree
11318 fold_indirect_ref_1 (tree t)
11319 {
11320   tree type = TREE_TYPE (TREE_TYPE (t));
11321   tree sub = t;
11322   tree subtype;
11323
11324   STRIP_NOPS (sub);
11325   subtype = TREE_TYPE (sub);
11326   if (!POINTER_TYPE_P (subtype))
11327     return NULL_TREE;
11328
11329   if (TREE_CODE (sub) == ADDR_EXPR)
11330     {
11331       tree op = TREE_OPERAND (sub, 0);
11332       tree optype = TREE_TYPE (op);
11333       /* *&p => p */
11334       if (lang_hooks.types_compatible_p (type, optype))
11335         return op;
11336       /* *(foo *)&fooarray => fooarray[0] */
11337       else if (TREE_CODE (optype) == ARRAY_TYPE
11338                && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
11339         {
11340           tree type_domain = TYPE_DOMAIN (optype);
11341           tree min_val = size_zero_node;
11342           if (type_domain && TYPE_MIN_VALUE (type_domain))
11343             min_val = TYPE_MIN_VALUE (type_domain);
11344           return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
11345         }
11346     }
11347
11348   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
11349   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
11350       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
11351     {
11352       tree type_domain;
11353       tree min_val = size_zero_node;
11354       sub = build_fold_indirect_ref (sub);
11355       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
11356       if (type_domain && TYPE_MIN_VALUE (type_domain))
11357         min_val = TYPE_MIN_VALUE (type_domain);
11358       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
11359     }
11360
11361   return NULL_TREE;
11362 }
11363
11364 /* Builds an expression for an indirection through T, simplifying some
11365    cases.  */
11366
11367 tree
11368 build_fold_indirect_ref (tree t)
11369 {
11370   tree sub = fold_indirect_ref_1 (t);
11371
11372   if (sub)
11373     return sub;
11374   else
11375     return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
11376 }
11377
11378 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
11379
11380 tree
11381 fold_indirect_ref (tree t)
11382 {
11383   tree sub = fold_indirect_ref_1 (TREE_OPERAND (t, 0));
11384
11385   if (sub)
11386     return sub;
11387   else
11388     return t;
11389 }
11390
11391 /* Strip non-trapping, non-side-effecting tree nodes from an expression
11392    whose result is ignored.  The type of the returned tree need not be
11393    the same as the original expression.  */
11394
11395 tree
11396 fold_ignored_result (tree t)
11397 {
11398   if (!TREE_SIDE_EFFECTS (t))
11399     return integer_zero_node;
11400
11401   for (;;)
11402     switch (TREE_CODE_CLASS (TREE_CODE (t)))
11403       {
11404       case tcc_unary:
11405         t = TREE_OPERAND (t, 0);
11406         break;
11407
11408       case tcc_binary:
11409       case tcc_comparison:
11410         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
11411           t = TREE_OPERAND (t, 0);
11412         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
11413           t = TREE_OPERAND (t, 1);
11414         else
11415           return t;
11416         break;
11417
11418       case tcc_expression:
11419         switch (TREE_CODE (t))
11420           {
11421           case COMPOUND_EXPR:
11422             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
11423               return t;
11424             t = TREE_OPERAND (t, 0);
11425             break;
11426
11427           case COND_EXPR:
11428             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
11429                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
11430               return t;
11431             t = TREE_OPERAND (t, 0);
11432             break;
11433
11434           default:
11435             return t;
11436           }
11437         break;
11438
11439       default:
11440         return t;
11441       }
11442 }
11443
11444 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
11445    This can only be applied to objects of a sizetype.  */
11446
11447 tree
11448 round_up (tree value, int divisor)
11449 {
11450   tree div = NULL_TREE;
11451
11452   gcc_assert (divisor > 0);
11453   if (divisor == 1)
11454     return value;
11455
11456   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
11457      have to do anything.  Only do this when we are not given a const,
11458      because in that case, this check is more expensive than just
11459      doing it.  */
11460   if (TREE_CODE (value) != INTEGER_CST)
11461     {
11462       div = build_int_cst (TREE_TYPE (value), divisor);
11463
11464       if (multiple_of_p (TREE_TYPE (value), value, div))
11465         return value;
11466     }
11467
11468   /* If divisor is a power of two, simplify this to bit manipulation.  */
11469   if (divisor == (divisor & -divisor))
11470     {
11471       tree t;
11472
11473       t = build_int_cst (TREE_TYPE (value), divisor - 1);
11474       value = size_binop (PLUS_EXPR, value, t);
11475       t = build_int_cst (TREE_TYPE (value), -divisor);
11476       value = size_binop (BIT_AND_EXPR, value, t);
11477     }
11478   else
11479     {
11480       if (!div)
11481         div = build_int_cst (TREE_TYPE (value), divisor);
11482       value = size_binop (CEIL_DIV_EXPR, value, div);
11483       value = size_binop (MULT_EXPR, value, div);
11484     }
11485
11486   return value;
11487 }
11488
11489 /* Likewise, but round down.  */
11490
11491 tree
11492 round_down (tree value, int divisor)
11493 {
11494   tree div = NULL_TREE;
11495
11496   gcc_assert (divisor > 0);
11497   if (divisor == 1)
11498     return value;
11499
11500   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
11501      have to do anything.  Only do this when we are not given a const,
11502      because in that case, this check is more expensive than just
11503      doing it.  */
11504   if (TREE_CODE (value) != INTEGER_CST)
11505     {
11506       div = build_int_cst (TREE_TYPE (value), divisor);
11507
11508       if (multiple_of_p (TREE_TYPE (value), value, div))
11509         return value;
11510     }
11511
11512   /* If divisor is a power of two, simplify this to bit manipulation.  */
11513   if (divisor == (divisor & -divisor))
11514     {
11515       tree t;
11516
11517       t = build_int_cst (TREE_TYPE (value), -divisor);
11518       value = size_binop (BIT_AND_EXPR, value, t);
11519     }
11520   else
11521     {
11522       if (!div)
11523         div = build_int_cst (TREE_TYPE (value), divisor);
11524       value = size_binop (FLOOR_DIV_EXPR, value, div);
11525       value = size_binop (MULT_EXPR, value, div);
11526     }
11527
11528   return value;
11529 }
11530
11531 /* Returns the pointer to the base of the object addressed by EXP and
11532    extracts the information about the offset of the access, storing it
11533    to PBITPOS and POFFSET.  */
11534
11535 static tree
11536 split_address_to_core_and_offset (tree exp,
11537                                   HOST_WIDE_INT *pbitpos, tree *poffset)
11538 {
11539   tree core;
11540   enum machine_mode mode;
11541   int unsignedp, volatilep;
11542   HOST_WIDE_INT bitsize;
11543
11544   if (TREE_CODE (exp) == ADDR_EXPR)
11545     {
11546       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
11547                                   poffset, &mode, &unsignedp, &volatilep,
11548                                   false);
11549
11550       if (TREE_CODE (core) == INDIRECT_REF)
11551         core = TREE_OPERAND (core, 0);
11552     }
11553   else
11554     {
11555       core = exp;
11556       *pbitpos = 0;
11557       *poffset = NULL_TREE;
11558     }
11559
11560   return core;
11561 }
11562
11563 /* Returns true if addresses of E1 and E2 differ by a constant, false
11564    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
11565
11566 bool
11567 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
11568 {
11569   tree core1, core2;
11570   HOST_WIDE_INT bitpos1, bitpos2;
11571   tree toffset1, toffset2, tdiff, type;
11572
11573   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
11574   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
11575
11576   if (bitpos1 % BITS_PER_UNIT != 0
11577       || bitpos2 % BITS_PER_UNIT != 0
11578       || !operand_equal_p (core1, core2, 0))
11579     return false;
11580
11581   if (toffset1 && toffset2)
11582     {
11583       type = TREE_TYPE (toffset1);
11584       if (type != TREE_TYPE (toffset2))
11585         toffset2 = fold_convert (type, toffset2);
11586
11587       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
11588       if (!host_integerp (tdiff, 0))
11589         return false;
11590
11591       *diff = tree_low_cst (tdiff, 0);
11592     }
11593   else if (toffset1 || toffset2)
11594     {
11595       /* If only one of the offsets is non-constant, the difference cannot
11596          be a constant.  */
11597       return false;
11598     }
11599   else
11600     *diff = 0;
11601
11602   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
11603   return true;
11604 }
11605
11606 /* Simplify the floating point expression EXP when the sign of the
11607    result is not significant.  Return NULL_TREE if no simplification
11608    is possible.  */
11609
11610 tree
11611 fold_strip_sign_ops (tree exp)
11612 {
11613   tree arg0, arg1;
11614
11615   switch (TREE_CODE (exp))
11616     {
11617     case ABS_EXPR:
11618     case NEGATE_EXPR:
11619       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
11620       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
11621
11622     case MULT_EXPR:
11623     case RDIV_EXPR:
11624       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
11625         return NULL_TREE;
11626       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
11627       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
11628       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
11629         return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
11630                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
11631                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
11632       break;
11633
11634     default:
11635       break;
11636     }
11637   return NULL_TREE;
11638 }
11639